(12).分组查询:
分组查询是对数据按照某个或多个字段进行分组.MVSQL中使用GROUP BY关键字对数据进行分
组,基本语法形式为:
[GROUP BY 字段] [HAVING <条件表达式>]
字段值为进行分组时所依据的列名称:HAVING<条件表达式>指定满足表达式限定条件的结果将
被显示;
1).创建分组
GROUP BY关键字通常和集合函数一起使用,比如MAX(),MIN(),COUNT(),SUM(),AVG().
例如,要返回每个水果供应商提供的水果种类,这时就要在分组过程中用到COUNT()函数,把数据分
为多个逻辑组,并对每个组进行集合计算.
//根据sid对fruits表中的数据进行分组,SQL语句如下
SELECT s_id,COUNT(*)AS Total FROM fruits GROUP BY s_id;
如果要查看每个供应商提供的水果的种类名称,该怎么办呢?在MySQL中,可以在GROUP BY字句中使用GROUP CONCAT0)函数,将每个分组中各个字段的值显示出来:
//根据s_id对fruits表中的数据进行分组,将每个供应商的水果名称显示出来:
SELECT s_id,GROUP_CONCAT(f_name) AS Names FROM fruits GROUP BY s_id;
由结果可以看到,GROUP CONCAT()函数将每个分组中的名称显示出来了,其名称的个数与
COUNT()函数计算出来的相同.
2)使用HAVING过滤分组
GROUP BY可以和HAVING一起限定显示记录所满足的条件,只有满足条件的分组才会被显示
//根据s id对fruits表中的数据进行分组,并显示水果种类大于1的分组信息
SELECT s_id,GROUP_CONCAT(f_name)As Names
FROM fruits
GROUP BYS id HAVING COUNT(f_name)>1;
注意,不能使用where,因为GROUP BY 在where的后面使用;
HAVING关键字与WHERE关键字都是用来过滤数据的,两者有什么区别呢?其中重要的一点
是,HAVING在数据分组之后进行过滤来选择分组,而WHERE在分组之前来选择记录.另
外,WHERE排序的记录不再包括在分组中.
3)在GROUP BY字句中使用WITH ROLLUP
使用WITH ROLLUP关键字之后,在所有査询出的分组记录之后增加一条记录,该记录计算查询出的
所有记录的总和,即统计记录数量
//根据s_id对fruits表中的数据进行分组,并显示记录数量,SQL语句如下
SELECT s_id,COUNT(*) AS Total
FROM fruits
GROUP BY s_id WITH ROLLUP;
4)GROUP BY和ORDER BY一起使用
某些情况下需要对分组进行排序,在前面的介绍中,ORDER BY用来对查询的记录排序,如果和
GROUP BY一起使用可以完成对分组的排序
//查询订单价格大于100的订单号和总订单价格;
SELECT o_num,SUM(quantity * item price) As orderTotal
FROM orderitems
GROUP BY o_num
HAVING SUM(quantity*item_price)>=100;
可以看到,返回的结果中orderTotal列的总订单价格并没有按照一定顺序显示,接下来使用ORDER
BY关键字按总订单价格排序显示结果;
SELECT o_num,SUM(quantity * item price) AS orderTotal
FROM orderitems
GROUP BY o_num
HAVING SUM(quantity * item price)>=100
ORDER BY orderTotal;
由结果可以看到,GROUP BY子句按订单号对数据进行分组,SUM()函数便可以返回总的订单价
格,HAVING字句对分组数据进行过滤,使得只返回总价格大于100的订单,最后使用ORDER BY子句
排序输出.
注意:当使用ROLLUP时,不能同时使用ORDER BY字句进行结果排序,即ROLLUP 和ORDER BY
是互相排斥的.
(13)使用LIMIT限制查询结果的数量
SELECT 返回所有匹配的行,有可能是表中所有的行,若仅仅需要返回第一行或者前几行,可使用
LIMIT关键字,基本语法格式如下:
LIMIT [位置偏移量,] 行数
第一个"位置偏移量"参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定"位置偏移
量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以
此类推);第二个参数"行数"指示返回的记录条数;
//显示fruits表查询结果的前4行
SELECT *From
fruitS LIMIT 4;
//在fruits表中,使用LIMIT字句,返回从第5个记录开始的行数长度为3的记录
SELECT *FROM fruitS LIMIT 4,3;
所以,带一个参数的LIMIT指定从查询结果的首行开始,唯一的参数表示返回的行数,即"LIMIT
n"与"LIMIT 0,n"等价.带两个参数的LIMIT可以返回从任何一个位置开始的指定的行数
返回第一行时,位置偏移量是0.因此,"LIMIT 1,1"将返回第二行,而不是第一行
注意:MySQL8.0中可以使用"LIMIT 4 OFFSET 3",意思是获取从第4条记录开始后面的3条记
录,和“LIMIT 3,4“返回的结果相同.