第11课 使用子查询
11.1 子查询
SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。
11.2 利用子查询进行过滤
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01');
在SELECT语句中,子查询总是从内向外处理。在处理上面的SELECT语句时,DBMS实际上执行了两个操作。
首先,它执行下面的查询:
SELECT order_num FROM orderitems WHERE prod_id='RGAN01'
此查询返回两个订单号:20007和20008。然后,这两个值以IN操作符要求的逗号分隔的格式传递给外部查询的WHERE子句。外部查询变成:
SELECT cust_id FROM orders WHERE order_num IN (20007,20008)
警告:只能是单列
作为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。
11.3 作为计算字段使用子查询
使用子查询的另一方法是创建计算字段。
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;
用一个句点分隔表名和列名,这种语法必须在有可能混淆列名时使用。
警告:完全限定列名
有时候,由于出现冲突列名而导致的歧义性,会引起DBMS抛出错误信息。例如,WHERE或ORDER BY子句指定的某个列名可能会出现在多个表中。好的做法是,如果在SELECT语句中操作多个表,就应使用完全限定列名来避免歧义。
11.4 小结
子查询常用于WHERE子句的IN操作符中,以及用来填充计算列。