mysql之高级查询

联合

一般用于将多张结构相同或相似的表进行联合查询。

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条件的转为某个数值便于统计

posted @ 2020-10-10 05:10  黑白猫123  阅读(70)  评论(0编辑  收藏  举报