http://www.cnblogs.com/anliven/p/6220990.html
11.1 子查询
查询(query),任何SQL语句都是查询。但此术语一般指SELECT语句。
SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。
作为子查询的SELECT语句只能查询单个列,否则会返回错误。
11.2 利用子查询进行过滤
在SELECT语句中,子查询总是从内向外处理。
列出订购物品‘RGAN01’的顾客id:
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num --先执行此查询,返回含有该物品的订单号
FROM OrderItems
WHERE prod_id = 'RGAN01');
结果:
cust_id
1000000004
1000000005
SELECT cust_name,cust_contact --③返回顾客信息
FROM Customers
WHERE cust_id IN (SELECT cust_id --②返回顾客id列表
FROM Orders
WHERE order_num IN (SELECT order_num --①先执行此查询,返回含有该物品的订单号
FROM OrderItems
WHERE prod_id = 'RGAN01'));
结果:
cust_name | cust_contact
Fun4All | Denise L. Stephens
The Toy Store| Kim Howard
11.3 作为计算字段使用子查询
在这种构造中,必须严格限制有歧义的列。可通过完全限定列名的方法实现。
完全限定列名,就是同时指定表名和列名,并用一个句点分隔。
推荐的方式:如果SELECT语句中操作多个表,使用完全限定列名来避免歧义。
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders--比较Orders表中的cust_id和Custumers表中检索的cust_id
FROM Customers
ORDER BY cust_name;
结果:
cust_name | cust_state | orders |
+---------------+------------+--------+
| Fun4All | IN | 1 |
| Fun4All | AZ | 1 |
| Kids Place | OH | 0 |
| The Toy Store | IL | 1 |
| Village Toys | MI | 2 |