解決主鍵沖突
- insert into 表名[(字段列表:包含主鍵)] values(值列表) on
duplicatekey update 字段 = 新值;
insert into t_user values(1,'lisi') on duplicate key update u_name = 'lisi';
- replace into 表名 [(字段列表:包含主鍵)] values(值列表);
insert into values (1,'zhangsan');
也可以直接替換,replace 在沒有沖突的時候相當(dāng)于insert,沖突的時候會替換。
復(fù)制表
- 復(fù)制表結(jié)構(gòu)
create table 表名 like 數(shù)據(jù)庫.表名;
create table t_user_copy like t_user;
- 插入數(shù)據(jù)
insert into 表名[(字段列表)] select 字段列表 from 數(shù)據(jù)表名;insert into t_user_copy select * from t_user;
###查詢語句
select` [select選項(xiàng)] `字段列表``[AS 字段別名] | * `from `數(shù)據(jù)源 `[where條件子句]` [group by子句]` [having子句]` [order by子句]` [limit 子句];
1. 可以在分組查詢的時候,將分組后的某個字段都連接起來
```sql
select c_id,sex,s_name,GROUP_CONCAT(s_name,'-') from t_student group by sex;
在《SQL基礎(chǔ)教程 》日:MICK書上在介紹group by語句的時候曾經(jīng)提到有三個誤區(qū)。
group by 查詢時的字段不能包含分組字段以外的字段,但是用聚合函數(shù),因?yàn)?code>分組查詢時,其它字段的元素個數(shù)和分組的字段很可能不是一對一,而是多對一的關(guān)系,比如將學(xué)生表的學(xué)生按照班級分組,每組對應(yīng)的學(xué)生顯然不是一個,這樣如果在分組查詢時如果出現(xiàn)了stu_name無法確定顯示哪一個學(xué)生的姓名,但是自己用mysql測試發(fā)現(xiàn)顯示的時分組,在組內(nèi)排序的第一個,也許是mysql或者后來sql語句的優(yōu)化吧。
-
回溯統(tǒng)計with rollup
如圖在分組語句后加上WITH ROLLUP,任何一個分組后都會有一個小組, 最后都需要向上級分組進(jìn)行匯報統(tǒng)計,** 不用在每個分組查詢結(jié)束后為了查詢總是再次進(jìn)行查數(shù)據(jù)庫獲得總數(shù)。** 根據(jù)當(dāng)前分組的字段. 這就是回溯統(tǒng)計: 回溯統(tǒng)計的時候會將分組字段置空。
單個字段回溯統(tǒng)計.png
SELECT c_id,sex,COUNT(*),GROUP_CONCAT(s_name)
FROM t_student GROUP BY c_id,sex WITH ROLLUP;
多個字段分組分別統(tǒng)計組內(nèi)總數(shù)

多路回溯.png
- union聯(lián)合查詢
select 語句1 union [all |distinct ] select語句2...
聯(lián)合查詢只要求字段數(shù)量一樣, 跟數(shù)據(jù)類型無關(guān)
作用:
- 查詢同一張表,但是需求不同: 如查詢學(xué)生信息, 男生身高升序, 女生身高降序.
- 多表查詢: 多張表的結(jié)構(gòu)是完全一樣的,保存的數(shù)據(jù)(結(jié)構(gòu))也是一樣的.
