第三章 聚合与排序
-- 第三章:聚合与排序
-- 3-1
SELECT COUNT()
FROM Product;
-- 3-1
SELECT COUNT(purchase_price)
FROM Product;
-- 将包含NULL的列作为参数时,COUNT()和COUNT(<列名>)的结果并不相同 整表()时是具体行数,而单独列的时候是null带来的0
-- 其他聚合函数同理,会把NULL排除在外,但是COUNT()除外,并不会排除NULL
SELECT SUM(sale_price), AVG(sale_price), MAX(regist_date), MIN(regist_date)
FROM Product;
-- PS:MAX/MIN适用于所有数据类型的列,SUM/AVG函数只适用于数值类型的列
-- 使用聚合函数删除重复值DISTINCT
SELECT COUNT(DISTINCT product_type)
FROM Product;
-- 3-2对表进行分组
-- GROUP BY子句,就相当于在第一列对后面所有数据进行了分组,以及注意顺序,group by在where后面/NULL会单独作为一类分类
SELECT purchase_price, COUNT(*)
FROM product
WHERE product_type = '衣服'
GROUP BY purchase_price;
-- 易错情况,把除了聚合列也就是group by的列之外的列也放在,select里面,这样select就不知道改如何选取了,不然就在聚合函数内使用,不然就是常数
-- 易错情况2,也不能使用别名,也就是as在select语句中,在group by的情况下
-- 易错情况3,group BY的结果是随机的,不能排序;在where子句中不能使用聚合函数
-- 只有SELECT//HABING//ORDER BY//能够使用聚合函数
-- 想要删除选择结果中的重复数据时,用DISTINCT//想要计算汇总重复结果的值的时候用group BY
-- 3-3为聚合结果指定条件
-- HAVING必须在group by后面
SELECT product_type, AVG(purchase_price)
FROM Product
GROUP BY product_type
Having AVG(sale_price) > 2500;
-- 聚合键所对应的条件写在where中比having中更好,具有更加明确的限定意义,类似于副词形容聚合键,而后面都是挑选范围,针对后续数据的内容用having
-- 3-4对查询结果进行排序
-- ORDER BY写在最后//ASC表示升序 sql默认升序//DESC表示降序//可以一列升序,剩下的降序//排序的时候 先写的先排//允许使用as的别名,而不是as本身
SELECT product_id, product_name, sale_price, purchase_price
FROM Product
ORDER BY purchase_price, sale_price;
-- 记住select的执行顺序是group by之后,order by之前//可以使用聚合函数//count(*)
-- 可以用列的编号在order by里面使用,如 ORDER BY 3 DESC表示对第三列降序排列,但是不建议使用,因为一次性无法保存,读起来不知所云
-- 练习题
-- 3.1 顺序不对
-- 3.2 ???
SELECT product_type, SUM(sale_price), SUM(purchase_price)
FROM Product
GROUP BY product_type
HAVING SUM(sale_price) >= SUM(purchase_price) * 1.5;
-- 3.3
SELECT *
FROM Product
ORDER BY regist_date DESC, sale_price;