概念:出现在其他语句内部的SELECT语句称为子查询。
所有的表在:http://wwwww.forta.com/book/o672327120/上能找到。
假设现在要列出订购物品TNT2的所有客户,第一步:
SELECT order_num FROM orderitems WHERE prod_id=’TNT2’;
image.png
第二步需要以order_num联系这两张表:
SELECT cust_id FROM orders WHERE order_num IN(20005,20007);
image.png
其实上面两句SELECT语句可以结合为一条:
SELECT cust_id FROM orders WHERE order_num IN(SELECT order_num FROM orderitems WHERE prod_id=’TNT2’);
image.png
子查询语句总是从内往外执行,上例中先从orderitems中检索产品名称是TNT2的订单编号(order_num),再通过这个订单编号检索出客户id(cust_id)。现在得到了客户的id,接下来通过客户的id来检索客户的信息:
SELECT cust_name,cust_contact FROM customers WHERE cust_id IN(10001,10004);
image.png
显而易见,cust_id其实是由上一个子查询语句得到的,所以我们可以在这基础上再嵌套一层:
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=’TNT2’));
image.png

注意:在实际使用过程中,由于性能限制,不能嵌套过多的子查询语句。 虽然子查询语句经常和IN操作符一起使用,但也可以用于测试等于(=)和不等于(<>)。

作为计算字段子查询

假设需要从customers表中统计客户的订单总数,客户的id和对应订单存储在orders表中。
要实现这个功能,第一步需要在customers表中检索出客户id列表,第二步需要根据客户id来统计其订单数。
统计我们可以使用前面学习过的SELECT COUNT()组函数语句来实现,现在试着统计cust_id=10001的order数量:
SELECT COUNT(
) AS orders FROM orders WHERE cust_id=10001;
image.png
更进一步的是需要对所有客户都实现这个功能,
SELECT cust_name,cust_state,(SELECT COUNT(*) FROM orders WHERE customers.cust_id=orders.cust_id) AS orders FROM customers ORDER BY cust_name;
image.png

相关子查询

概念:涉及外部查询的子查询。
从上面可以看到对订单数量进行统计时的限制条件是customers.cust_id=orders.cust_id。
而不是cust_id=cust_id。使用完全限定列名可以表明cust_id在两个表中的联系关系。