了解子查询的最好方法就是看例子
现在我们来看看orders表和orderitems表
orders表
orderitems表
现在我想要查找所有订购物品id为TNT2的客户,怎么查?
orderitems里有prod_id
orders表里有cust_id
但这两项在两张表里,怎么查?
我们说,关系表关系表,两张表中肯定有关联的项,一比较,发现都有一个order_num列。下面是检索思路
- 通过orderitems表由prod_id=TNT2检索出匹配的order_num
- 通过orders表由order_num匹配出对应的cust_id
思路有了,下面就是敲代码
SELECT order_num
FROM orderitems
WHERE prod_id = "TNT2";
得到符合条件的两单为20005和20007,现在就是找下这两单的顾客
SELECT cust_id
FROM orders
WHERE order_num IN (20005, 20007);
以上便是直接的实现过程,下面就用子查询的方式来写,其实就是嵌套
SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = "TNT2");
再做一个练习。如果我想得到每个客户的订单总数,该怎么写
客户表(里面有cust_id)
订单表(里面也有cust_id)
要想得出所有顾客的订单数,我们先想想一个顾客的订单数怎么写
SELECT cust_id, COUNT(*) AS cust_order
FROM orders
WHERE cust_id = 10001;
现在推广到所有客户的订单数呢?
SELECT cust_name,
(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers;
好好想一下上面的思路,首先我们最终需要的是一张cust_name和orders的表,cust_name由customers表提供,写在最外面,另外一个列orders表需要用计算字段COUNT()来汇总,而且是对每一个顾客进行订单汇总。这里用WHERE来选择条件。由于orders表和customers表都有cust_id,因此我们用完全限定列名。