数据库基础07——分组、子查询
一、分组
1、GROUP BY
GROUP BY子句与 SELECT语句配合使用, 把相同的数据划分为组。 在 SELECT语句里, GROUP BY子句在WHERE子句之后, 在ORDER BY子句之前。
SELECT FROM WHERE GROUP BY ORDER BY
--例如
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
--结果
vend_id num_prods
------- ---------
BRS01 3
DLL01 4
FNG01 2
- GROUP BY 子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组。
- 如果在 GROUP BY 子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。
- GROUP BY 子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在 SELECT 中使用表达式,则必须在 GROUP BY子句中指定相同的表达式。不能使用别名。
- 大多数 SQL 实现不允许 GROUP BY 列带有长度可变的数据类型(如文本或备注型字段)。
- 如果分组列中包含具有 NULL 值的行,则 NULL 将作为一个分组返回。如果列中有多行 NULL 值,它们将分为一组。
- GROUP BY 子句必须出现在 WHERE 子句之后, ORDER BY 子句之前。
2、HAVING 语句
WHERE过滤行,而 HAVING 过滤分组。 HAVING 支持所有 WHERE 操作符
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
--过滤数量大于等于2的分组
同时使用 where 和 having
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;
-- 对所有价格>=4的数据进行分组,然后过滤数量>=2的分组。
--具有两个以上产品且价格大于等于4 的供应商。
3、GROUP BY 和 ORDER BY
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;
4、SELECT 子句的顺序
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅从表中选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
二、子查询
where 条件 作为一个子查询语句,,子查询查询必须是单列
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 cust_name,cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id --这里注意指明表名,避免歧义
)
AS orders
FROM Customers
ORDER BY cust_name;
-- 使用子查询 查出的订单数量作为一个计算字段 orders,最终返回了 cust_name,cust_state,orders三个字段。