数据库基础07——分组、子查询

数据库基础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三个字段。

猜你喜欢

转载自blog.csdn.net/u011138190/article/details/84969915