联合
一般用于将多张结构相同或相似的表进行联合查询。
select field1,field2 from table_name1 union [all|distinct] select field1,field2 from table_name2;
- 前后两张表要查询的字段数应该一致,对应字段的数据类型不要求一致
- 可以在union后加关键字判断是否去除重复记录,all表示不去重,distinct表示去重。默认的是不去重
- 判断重复仅仅是判断字面量是否一致,而不关心数据类型,比如int类型的123和字符类型的123重复
排序
select * from table_name order by field1 asc,field2 desc;
- 排序用关键字order by,其后跟排序依赖的字段,可以有多个
- 默认的是升序排列,但可以在每个字段后加关键字 asc或者desc分别声明升序或降序排列
- gbk编码的字符直接就是拼音排序,而如果是utf8编码字符默认是按unicode排序,如果也要进行拼音排序需要借助函数转码
order by convert(name using gbk);
分组
select count(*) as 个数 group by age having count(*)>10;
1、聚合函数
- count(*):用于统计分组内的个数,其括号内可以是*,也可以是某个字段
- sum(字段):用于统计分组内某字段的累加值
- avg(字段):用于统计分组内某字段的平均值
- max(字段):用于统计分组内某字段的最大值
- min(字段):用于统计分组内某字段的最小值
聚合函数一般与分组搭配使用,但是其也可以单独使用,表示将整个查询结果看作一个分组。
2、分组
- 分组的意思是按照分组字段,表中各个行拥有相同的分组字段值的分为一组
- 分组字段可以是多个
3、分组筛选
- having用于对分组后的聚合函数条件匹配
连接
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
select a.name,b.address from tb_user a inner join tb_info b on a.id=b.user_id;
子查询
select * from tb_user where id in (select id from tb_info where age>18);
- 子查询会得到一个集合,如果匹配字段存在某个值在该集合中则会筛选出来
case when
(1)简单case函数:比如0和1对男和女的结果转换
(2)case搜索函数:将符合case条件的转为某个数值便于统计