SQL实用语句总结

解决主键冲突

  1. insert into 表名[(字段列表:包含主键)] values(值列表) on duplicate key update 字段 = 新值;
insert into t_user values(1,'lisi') on duplicate key update u_name = 'lisi';
  1. replace into 表名 [(字段列表:包含主键)] values(值列表);
 insert into values (1,'zhangsan');

也可以直接替换,replace 在没有冲突的时候相当于insert,冲突的时候会替换。

复制表

  1. 复制表结构
    create table 表名 like 数据库.表名;
create table  t_user_copy like t_user;
  1. 插入数据
    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语句的优化吧。

  1. 回溯统计with rollup
    如图在分组语句后加上WITH ROLLUP,任何一个分组后都会有一个小组, 最后都需要向上级分组进行汇报统计,** 不用在每个分组查询结束后为了查询总是再次进行查数据库获得总数。** 根据当前分组的字段. 这就是回溯统计: 回溯统计的时候会将分组字段置空。


    SQL实用语句总结_第1张图片
    单个字段回溯统计.png
SELECT c_id,sex,COUNT(*),GROUP_CONCAT(s_name) 
FROM t_student GROUP BY c_id,sex WITH ROLLUP;

多个字段分组分别统计组内总数


SQL实用语句总结_第2张图片
多路回溯.png
  1. union联合查询
    select 语句1 union [all |distinct ] select语句2...
    联合查询只要求字段数量一样, 跟数据类型无关

作用:

  • 查询同一张表,但是需求不同: 如查询学生信息, 男生身高升序, 女生身高降序.
  • 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

你可能感兴趣的:(SQL实用语句总结)