解决主键冲突
- insert into 表名[(字段列表:包含主键)] values(值列表) on
duplicate
key update 字段 = 新值;
insert into t_user values(1,'lisi') on duplicate key update u_name = 'lisi';
- replace into 表名 [(字段列表:包含主键)] values(值列表);
insert into values (1,'zhangsan');
也可以直接替换,replace 在没有冲突的时候相当于insert,冲突的时候会替换。
复制表
- 复制表结构
create table 表名 like 数据库.表名;
create table t_user_copy like t_user;
- 插入数据
insert into 表名[(字段列表)] select 字段列表 from 数据表名;insert into t_user_copy select * from t_user;
###查询语句
select` [select选项] `字段列表``[AS 字段别名] | * `from `数据源 `[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基础教程 》日:MICK书上在介绍group by语句的时候曾经提到有三个误区。
group by 查询时的字段不能包含分组字段以外的字段,但是用聚合函数,因为分组查询时,其它字段的元素个数和分组的字段很可能不是一对一,而是多对一的关系
,比如将学生表的学生按照班级分组,每组对应的学生显然不是一个,这样如果在分组查询时如果出现了stu_name无法确定显示哪一个学生的姓名,但是自己用mysql测试发现显示的时分组,在组内排序的第一个,也许是mysql或者后来sql语句的优化吧。
-
回溯统计with rollup
如图在分组语句后加上WITH ROLLUP,任何一个分组后都会有一个小组, 最后都需要向上级分组进行汇报统计,** 不用在每个分组查询结束后为了查询总是再次进行查数据库获得总数。** 根据当前分组的字段. 这就是回溯统计: 回溯统计的时候会将分组字段置空。
SELECT c_id,sex,COUNT(*),GROUP_CONCAT(s_name)
FROM t_student GROUP BY c_id,sex WITH ROLLUP;
多个字段分组分别统计组内总数
- union联合查询
select 语句1 union [all |distinct ] select语句2...
联合查询只要求字段数量一样, 跟数据类型无关
作用:
- 查询同一张表,但是需求不同: 如查询学生信息, 男生身高升序, 女生身高降序.
- 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.