上一篇讲了4类查询的方式,现在接着上一篇继续看还有哪些方式。
顾名思义,分组查询要分组,因为mysql5.7之后默认不支持group by语句,需要改配置文件,我没有去改,如果需要用到group by的可以百度一下如何修改配置文件,再练习下面这个例子。
group by 分组查询: CREATE TABLE order_menu( id INT PRIMARY KEY auto_increment, product_name VARCHAR (20), price FLOAT(6,2), born_date DATE, class VARCHAR (20) ); INSERT INTO order_menu (product_name,price,born_date,class) VALUES ("苹果",20,20170612,"水果"), ("香蕉",80,20170602,"水果"), ("水壶",120,20170612,"电器"), ("被罩",70,20170612,"床上用品"), ("音响",420,20170612,"电器"), ("床单",55,20170612,"床上用品"), ("草莓",34,20170612,"水果"); -- 注意,按分组条件分组后每一组只会显示第一条记录 -- group by字句,其后可以接多个列名,也可以跟having子句,对group by 的结果进行筛选。 -- 按位置字段筛选 select * from order_menu group by 5; -- 练习:对购物表按类名分组后显示每一组商品的价格总和 select class,SUM(price)from order_menu group by class; -- 练习:对购物表按类名分组后显示每一组商品价格总和超过150的商品 select class,SUM(price)from order_menu group by class HAVING SUM(price)>150; /* having 和 where两者都可以对查询结果进行进一步的过滤,差别有: <1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选; <2>使用where语句的地方都可以用having进行替换 <3>having中可以用聚合函数,where中就不行。 */ -- GROUP_CONCAT() 函数 SELECT id,GROUP_CONCAT(name),GROUP_CONCAT(JS) from ExamResult GROUP BY
聚合函数感觉像python的内置函数,先不要管聚合函数要干嘛,先把要求的内容查出来再包上聚合函数即可。(一般和分组查询配合使用),直接开始吧,根据聚合函数功能不同,我们先看 统计表中所有记录的聚合函数:
1.COUNT(列名):统计行的个数
我们可以用来统计学生个数吧:
select count(*) from result;统计一下语文成绩80分以上同学的个数试试:
View Code
注意:count(*)统计所有行; count(字段)不统计null值.比如我统计一下语文成绩的个数:
select count(chinese) from result;2.SUM(列名):统计满足条件的行的内容和
求和函数在各种语言里面用的都还比较多,我们先求一个语文成绩的总分:
select sum(chinese) as 语文总成绩 from result;各科成绩都求个总分吧:
select sum(chinese) as 语文总成绩, -> sum(english) as 英语总成绩, -> sum(math) as 数学总成绩 from result;有了总成绩,是不是可以求所有成绩和平均分啦?
select sum(chinese)/count(*) from result; #包括Lily的 select sum(chinese)/count(chinese) from result; #不包括Lily的3. AVG(列名):
求平均值,这个可以直接求平均值了,就不用sum那样了,试一下:
select AVG(chinese) from result;
这个和sum求的不包括Lily的平均一样,说明AVG会自己去除null。
4.Max、Min
这个也很好理解了,最大值最小值。先看看英语最高分是多少:
select MAX(english) from result;不多说了,直接找到总分最高和最低的,注意两个最低分的区别。
select MAX(english+chinese+math) from result; select MIN(english+chinese+math) from result; select MIN(ifnull(english,0)+ifnull(chinese,0)+ifnull(math,0)) from result;注意:null 和所有的数计算都是null,所以需要用ifnull将null转换为0!ifnull(Chinese,0),其他的聚合函数就不做过多介绍了,用法都很简单。
当数据很多是,我们只想显示部分,就可以用limit来控制,我只显示第一行:
select * from result limit 1;看一下下面一条是什么意思:
select * from result limit 2,5;从结果得到答案,就是跳过前2行,再显示后面5行,用法很简单。
在python中学过正则表达式模块re,在sql中同样存在正则,其实我们上一篇说where的时候,说的就是正则,这里再补充几个例子:
1.找名字以P开头的信息,这个和p%很像:
select * from result where name REGEXP '^p';2.找名字以y结尾的信息:
select * from result where name REGEXP 'y$';3.找名字以p开头且重复至少1次的所有数据,因为重复两次我们没有这样的数据嘛:
select * from result where name REGEXP 'p{1}';sql 的正则和python的用法其实很像的,掌握一种另一种就很容易明白,这里就不多讲了。还有一点需要注意的是where、order by、group by这些运行的先后顺序,Mysql在执行sql语句时的执行顺序:from先于where先于select先于group by先于having先于order by,了解了这个顺序,再看看那些报错就清晰很多了,这个还是需要记住的,很重要。
如果你对编程感兴趣或者想往编程方向发展,可以关注微信公众号【筑梦编程】,大家一起交流讨论!小编也会每天定时更新既有趣又有用的编程知识!