SQL的子查询

一、什么是子查询?

子查询就是将一个查询的语句嵌套在另一个查询语句的条件中。即外层是的查询语句把嵌套在里面 的查询语句当作条件,嵌套在里面的查询语句查询出来的是结果。
例:以下语句显示如何在 SELECT 语句的[WHERE]子句中使用子查询来查找位于纽约( New York )的客户的销售订单

SELECT order_id, order_date, customer_id 
FROM sales.orders 
WHERE customer_id IN ( 
	SELECT customer_id 
	FROM sales.customers 
	WHERE city = 'New York' 
) 
ORDER BY order_date DESC;

注意:WHERE条件查询的后面的 IN 的意思是只要满足在括号里面任何一个结果即可。若是IN是等号(=)的时候子查询返回的结果必须是唯一的,否则会报错的。

二、子查询嵌套子查询

子查询可以嵌套再另一个子查询中。SQL Server最多支持 32 个嵌套级别
例:
1.第一步,SQL Server执行以下子查询以获取品牌名称为 ‘上海永久’ 和 ‘凤凰’ 的品牌标识号列表:

SELECT brand_id 
FROM production.brands 
WHERE brand_name = '上海永久' OR brand_name = '凤凰'

2.第二步,SQL Server计算属于这些品牌的所有产品的平均价格

SELECT AVG (list_price) 
FROM production.products 
WHERE brand_id IN (1,2)	

3.第三步,SQL Server查找价格高于 ‘上海永久’ 和 ‘凤凰’ 品牌的所有产品的平均定价的产品。

SELECT product_name, list_price 
FROM production.products 
WHERE list_price > ( 
	SELECT AVG (list_price) 
	FROM production.products 
		WHERE brand_id IN ( 
		SELECT brand_id 
		FROM production.brands 
		WHERE brand_name = '上海永久' OR brand_name = '凤凰' 
	) 
) 
ORDER BY list_price

三、SQL Server相关子查询

相关子查询是使用外部查询的值的[子查询]。换句话说,它取决于外部查询的值。由于这种依赖 性,相关子查询不能作为简单子查询独立执行。此外,对外部查询评估的每一行重复执行一次相 关子查询。相关子查询也称为重复子查询。
例:

SELECT product_name, list_price, category_id 
FROM production.products p1 
WHERE list_price IN ( 
	SELECT MAX (p2.list_price) 
	FROM production.products p2 
	WHERE p2.category_id = p1.category_id 
	GROUP BY p2.category_id 
) 
ORDER BY category_id, product_name

四、SQL Server Exists运算符

EXISTS 运算符是一个逻辑运算符,用于检查子查询是否返回任何行。 如果子查询返回一行或多行, 则 EXISTS 运算符返回 TRUE 。

SQL Server EXISTS 运算符的语法:EXISTS ( subquery)

在此语法中,子查询仅是 SELECT 语句。子查询返回行后, EXISTS 运算符返回 TRUE 并立即停止处理。请注意,即使子查询返回 NULL 值, EXISTS 运算符也会计算为 TRUE
例:例返回 customers 表中的所有行

SELECT customer_id, first_name, last_name 
FROM sales.customers 
WHERE EXISTS (SELECT NULL) 
ORDER BY first_name, last_name

在此示例中,子查询返回包含 NULL 的结果集,这也导致 EXISTS 运算符计算为 TRUE 。

五、SQL Server Any运算符

ANY 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值集进行比较。

ANY 运算符的语法: scalar_expression comparison_operator ANY (subquery)

在上面语法中,scalar_expression - 是任何有效的表达式。 comparison_operator - 是任何比较运算符,包括等于( = ),不等于( <> ),大于( > ),大于或等于 ( >= ),小于( < ),小于或等于( <= )。 subquery 是一个[SELECT]语句,它返回单个列的结果集,其数据与标量表达式的数据类型相同。
例:

SELECT product_name, list_price
FROM production.products 
WHERE product_id = ANY ( 
	SELECT product_id 
	FROM sales.order_items 
	WHERE quantity >= 2 
) 
ORDER BY product_name

六、SQL Server All运算符

SQL Server ALL 运算符是一个逻辑运算符,它将标量值与子查询返回的单列值列表进行比较。

ALL 运算符语法:scalar_expression comparison_operator ALL ( subquery)

在上面语法中,scalar_expression 是任何有效的表达式。 comparison_operator 是任何有效的比较运算符,包括等于( = ),不等于( <> ),大于( > ),大于或等于( >= ),小于( < ),小于或等于( <= )。
括号内的子查询( subquery )是一个[SELECT]语句,它返回单个列的结果。 此外,返回列的数据类型必须与标量表达式的数据类型相同。
例:

SELECT product_name, list_price 
FROM production.products
WHERE list_price > ALL ( 
	SELECT AVG (list_price) avg_list_price 
	FROM production.products 
	GROUP BY brand_id 
)
ORDER BY list_price
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值