分组数据GROUP BY
说明:简单来说,分组数据GROUP BY的用法是根据表中的数据对某一个列相同的数据进行划分为一组。此链接为创建表和插入数据代码
举个简单的例子:
将商品编号相同的数据进行划分。
select order_id as 商品编号 ,COUNT(*) as 数量
from order_list
GROUP BY order_id--对商品编号进行分组
使用规定
- GROUP BY子句中可以包含任意数目的列。
- 如果GROUP BY子句中嵌套了分组,数据将在最后规定的分组中进行汇总。指定的列将在一起计算,不能从个别的列中取回数据。
- GROUP BY 子句中的列出的每个数据都必须是检索列或有效地表达式,不能是聚集函数。
- 在GROUP BY子句中不能使用别名。
- 如果分组列中具有NULL值,则NULL将作为一个分组返回。若有多个NULL值,它们将归为一组返回。
- GROUP BY子句必须出现-----WHERE之后,ORDER BY子句之前。
- select 语句中的每个列都必须在GROUP BY子句中给出。
过滤分组HAVING
说明:当GROUP BY-----分组后,使用HAVING的条件对分组后的数据进行筛选。作用于WHERE相似,区别在于WHERE在数据进行-----分组前进行过滤,HAVING在数据-----分组后对数据进行过滤;HAVING支持所有WHERE的操作符;WHERE对分组后的数据不起作用。
例子:
select order_id as 商品编号 ,SUM(order_price * order_count) as 总价
from order_list
WHERE order_id=3333
GROUP BY order_id
--HAVING order_id=3333--作用于where一样,但必须位于group by 之后
HAVING SUM(order_price * order_count)>20
--where SUM(order_price * order_count)>20错误写法
排序检索 ORDER BY
说明:数据库中的数据一般都是随机的,使用ORDER BY 可以让数据按照一定的格式进行排序。
排序方式:
1.默认情况下数字从小到大,数字从a—z。
select order_name as 名字 from order_list
order by order_name
2.默认情况下排序为升序(ASC),DESC为降序。
select order_id as 商品编号,order_price as 价格 from order_list
order by order_price desc--默认情况下为降序
3.当有多列排序,先对第一个列进行排序,若第一个列排序后有相同的值,第二列只会对相同的数据进行二次排序。若降序单独附加,只对附加的列起作用,另一个仍然是升序。
select order_name as 名字,order_price as价格 from order_list
order by order_name,order_price desc --先对编号进行排序,然后在对名字相同的数据进行二次排序。desc只对价格起作用
4.使用非检索列也是可以的。
select order_price as价格 from order_list--检索列中不包括order_count
order by order_count desc
分组和排序GROUP BY和ORDER BY
说明:一般使用GROUP BY子句时,应该给出ORDER BY子句,ORDER BY位于GROUP BY和HAVING之后。
GROUP BY | ORDER BY |
---|---|
排序产生的输出 | 分组行。输出顺序不是排序的顺序 |
任意列都可以 | 只可能使用选择列或表达式,而且必须使用每个选择列的表达式。 |
不一定需要 | 如果与聚集函数一起使用列(表达式),则必须使用。 |
例子
select order_id as 商品编号 ,SUM(order_price * order_count) as 总价,order_date as 日期
from order_list
GROUP BY order_id,order_date
HAVING SUM(order_price * order_count)>10
ORDER BY order_date--按照日期进行排序