MySQL单表查询详细解析(2)

select * from 表名 group by 字段 
对sql_mode进行设置为ONLY_FULL_GROUP_BY,此时就会报错,只能查看该字段的内容,但如果没有设定,也只会显示每组的第一组数据

单独使用GROUP BY关键字分组
    SELECT post FROM employee GROUP BY post;
    注意:我们按照post字段分组,那么select查询的字段只能是post,想要获取组内的其他相关信息,需要借助函数
GROUP BY关键字和GROUP_CONCAT()函数一起使用,比如说我想按部门分组,每个组有哪些员工,都显示出来,怎么搞
    SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;#按照岗位分组,并查看组内所有成员名,通过逗号拼接在一起
    SELECT post,GROUP_CONCAT(name,':',salary) as emp_members FROM employee GROUP BY post;
GROUP BY一般都会与聚合函数一起使用,聚合是什么意思:聚合就是将分组的数据聚集到一起,合并起来搞事情,拿到一个最后的结果
    select post,count(id) as count from employee group by post;#按照岗位分组,并查看每个组有多少人,每个人都有唯一的id号,我count是计算一下分组之后每组有多少的id记录,通过这个id记录我就知道每个组有多少人了
关于集合函数,mysql提供了以下几种聚合函数:count、max、min、avg、sum等,上面的group_concat也算是一个聚合函数了,做字符串拼接的操作

五、过滤having

执行优先级:where,group by,having
where发生在group之前,因而where可以用任意字段,但绝不能用聚合函数
having发生在group by之后,因而可以用分组的字段,无法直接用到其他字段,having是可以用聚合函数的
select post,avg(salary) from t1 where age > 30 group by post having avg(salary) >10000;
这是得到各部门年龄大于30的员工的平均工资,最后保留平均工资大于10000的部门

六、查询排序order by

select * from t1 order by salary  #默认升序排列
select * from t1 order by salary asc;  #升序排列
select * from t1 order by salary desc;  #降序排列
select * from t1 order by age asc,salary desc;    #先以年龄升序排列,若年龄相同的就以工资降序排列

七、限制查询的记录数limit

select * from t1 order by salary limit 3;  #默认起始位为0,即从第一条数据开始,总共显示3条数据
select * from t1 order by salary desc limit 0,5;  #起始位为0,即从第一条开始,总共显示5条数据
select * from t1 order by salary asc limit 2,6;    #起始位为2,即从第三条开始,总共显示6条数据

八、使用正则表达式查询

之前用的like是模糊匹配,只有%和_,具有局限性,查询的时候其实可以用我们之前学正则
select * from t1 where name regexp '^ale';    #匹配以ale开头的
select * from t1 where name regexp 'ss$';    #匹配以ss结尾的
select * from t1 where name regexp 'm{2}'      #匹配含有2个m的

对字符串匹配的方式:
where name = 'ee'  #查找name是‘ee’的数据
where name like 'yu%'  #查找以yu开头的数据
where name regexp 'euu$'  #查找以euu结尾的数据

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/34f0549a99587d68ae96b99577fef50b.html