SQL 子查询

本章将学习如何将查询嵌入到另一个查询中。

什么是子查询?

子查询,也称为嵌套查询或子选取,是嵌入在另一个查询的WHEREHAVING子句中的SELECT查询。子查询返回的数据,由外部语句使用时,使用方式与普通值相同。

子查询提供了一种简单而有效的方法,从一个查询结果集中再进行查询。子查询与普通查询基本相同,有一些要注意的地方:

  • 子查询必须始终出现在括号内。
  • 子查询通常只返回一个字段。这意味着不能在子查询中使用SELECT *,除非表只有一列。如果目的是行比较,子查询可以返回多个字段。
  • 使用像INNOT IN这样的多值操作符时,子查询必须返回多行。
  • 子查询中不能使用UNION,只允许有一个SELECT语句。

子查询最常与SELECT语句一起使用,但是也可以在INSERTUPDATEDELETE语句中使用。

SELECT语句使用子查询

下面的语句,要从订单表中,返回订单值超过5000美元的客户详细信息。子查询中使用了DISTINCT关键字,消除查询结果中重复的cust_id值。

SELECT * FROM customers
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders 
                      WHERE order_value > 5000);

外部SELECTINSERTUPDATEDELETE语句的WHEREHAVING子句中可以嵌入子查询,一个子查询中也可以嵌入子查询。

INSERT语句使用子查询

子查询也可以与INSERT语句一起使用。请看例子:

INSERT INTO premium_customers 
SELECT * FROM customers 
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders 
                      WHERE order_value > 5000);

上面的语句使用子查询返回的数据,将高级客户的记录插入到premium_customers表中。这里的高级客户是订购价值超过5000美元的客户。

INSERT ... SELECT语句可参考SQL 复制表

UPDATE语句使用子查询

子查询可以与UPDATE语句一起使用,如下所示:

UPDATE orders
SET order_value = order_value + 10
WHERE cust_id IN (SELECT cust_id FROM customers 
                      WHERE postal_code = 75016);

上述语句,对于邮政编码为75016的客户,将他们的订单值增加10美元。

DELETE语句中使用子查询

同样,可以在DELETE语句中使用子查询,如下:

DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_details 
                   WHERE product_id = 5);

上面语句,对于product_id为5的产品订单,将其从orders表中删除。



浙ICP备17015664号-1 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载