第10章 分组数据
创建分组
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
GROUP BY子句可以包含任意数目的列
GROUP BY子句中列出的每一列都必须是检索列或有效的表达式
大多数SQL实现不允许GROUP BY列带有长度可变的数据类型
除了聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出
如果分组列中包含具有NULL值的列,则NULL将作为一个分组返回,有多个NULL,它们将分为一组
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
过滤分组
所有类型的WHERE子句都可以用HAVING来替代
不同的是:WHERE过滤行,HAVING过滤分组。
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤
使用HAVING时应该结合GROUP BY子句,而WHERE子句用语行级过滤
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*)>=2; #基于分组聚集值进行过滤,而不是特定行的值
#列出具有两个以上产品且其价格大于等于4的供应商
SELECT vend_id,COUNT(*) AS num_prods
FROM Products
WHERE prod_price>=4
ORDER BY vend_id
HAVING COUNT(*)>=2;
分组和排序
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >=3
ORDER BY items, order_num
SELECT子句顺序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
第11章 使用子查询
利用子查询进行过滤
# 列出订购物品RGAN01的所有顾客
SELECT cust_name,cust_contact
FROM Customers
WHERE cust_id IN(SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id='RGAN01'));
作为子查询的SELECT语句只能查询单个列
作为计算字段使用子查询
# 显示Customers表中每个顾客的订单总数
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id=Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;
SELECT语句中操作多个表,就应使用完全限定列名来避免歧义。
网友评论