SQL必知必会:高级数据过滤 WHERE AND OR IN NOT
SQL必知必会:汇总数据 AVG() COUNT() MAX() MIN() SUM()
SQL必知必会:创建和操纵表 CREATE ALTER DROP RENAME
1. 数据分组
-- 只能返回1001提供的产品数目
SELECT
COUNT( * ) AS num_prods
FROM
Products
WHERE
vend_id = '1001';
如果要返回每个供应商提供的产品数目,该怎么办?
2. 创建分组
-- 以vend_id分组
SELECT
vend_id,
COUNT( * ) AS num_prods
FROM
Products
GROUP BY
vend_id;
3. 过滤分组
WHERE过滤行,而HAVING 过滤分组。
说明:HAVING 和WHERE 的差别
这里有另一种理解方法,WHERE 在数据分组前进行过滤,HAVING 在数据分组后进行过滤。这是一个重要的区别,WHERE 排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING 子句中基于这些值过滤掉的分组。
-- 列出具有两个以上产品且其价格大于等于4 的供应商:
SELECT
vend_id,
COUNT( * ) AS num_prods
FROM
Products
WHERE
prod_price >= 4
GROUP BY
vend_id
HAVING
COUNT( * ) >= 2;
-- 去掉where
SELECT
vend_id,
COUNT( * ) AS num_prods
FROM
Products
GROUP BY
vend_id
HAVING
COUNT( * ) >= 2;
说明:使用HAVING 和WHERE
HAVING 与WHERE 非常类似,如果不指定GROUP BY,则大多数DBMS
会同等对待它们。不过,你自己要能区分这一点。使用HAVING 时应
该结合GROUP BY 子句,而WHERE 子句用于标准的行级过滤。
4.分组和排序
-- 按订购物品的数目排序输出
SELECT
order_num,
COUNT( * ) AS items
FROM
OrderItems
GROUP BY
order_num
HAVING
COUNT( * ) >= 3;