目录
11.1 子查询
查询(query):任何SQL语句都是查询。但此术语一般指SELECT语句。
子查询(subquery):嵌套在其他查询中的查询。
11.2 利用子查询进行过滤
先来看一下三张表的结构,
1. Orders,含有订单号、订单日期和客户ID
2. OrderItems,含有订单号、物品号、产品ID、数量和物品价格
3. Customers,含有客户ID,客户名,客户地址,客户的城市,客户所在州,客户zip,客户所在国家,客户的联系人,客户email等客户信息。
现在,假如需要列出订购物品RGAN01的所有顾客,应该怎样检索?
从上面三张表的结构可以看出,在OrderItems表中,产品ID对应订单号;在Orders表中,订单号对应客户ID;在Customers表中,客户ID对应客户名。
输入:
SELECT order_num FROM `OrderItems` WHERE prod_id = 'RGAN01';
输出:
输入:
SELECT cust_id FROM `Orders` WHERE order_num IN (20007, 20008);
输出:
输入:
SELECT cust_name, cust_contact FROM `Customers` WHERE cust_id IN (1000000004, 1000000005);
输出:
用子查询
输入:
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语句只能查询单个列。企图检索多个列将返回错误。
- 子查询并不总是执行这类数据检索的最有效方法。更多的论述,请参阅第12课,其中将再次给出这个例子。
11.3 作为计算字段使用子查询
假如需要显示Customers表中每个顾客的订单总数。
输入:
SELECT cust_name, cust_city,
(SELECT COUNT(order_num) FROM `Orders`
WHERE Orders.cust_id = Customers.cust_id)
AS orders
FROM `Customers`;
输出:
orders是一个计算字段,它是由圆括号中的子查询建立的。该子查询对检索出的每个顾客执行一次。在此例中,该子查询执行了5次,因为检索出了5个顾客。
完全限定列名
子查询中的WHERE子句与前面使用的WHERE子句稍有不同,因为它使用了完全限定列名,而不只是列名(cust_id)。它指定表名和列名(Orders.cust_id和Customers.cust_id)。
11.4 小结
- 子查询常用于WHERE子句的IN操作符中
- 以及用来填充计算列。