之前所说的查询都是单个表的查询。那么如果要查询的信息在两个表或者多个表之中,就可以使用子查询。
顾名思义,子查询是相对父查询来说的,虽然没有父查询这一说,但是可以这么理解。子查询就是在一个查询之中嵌套的另一个查询,就像爸爸的儿子一样。
那么子查询有两个常用作用:作为过滤条件;作为计算字段。
分别演示如下:
1、作为过滤条件
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'));
这段代码的含义是:查找购买RGAN01
这个产品的用户。
我们理解一下这段代码:
(1)首先在customers
表中查询cust_name
和cust_contact
,这是我最终要输出的信息。
要找的cust_name
是有条件的,他需要买RGAN01
这个产品。但是没有一个表是同时包含用户信息和产品信息的。所以需要找表进行过渡。
我们发现,orders
表中有用户ID和订单号,而通过订单号又可以找到产品。所以我们这里的条件是对用户ID(cust_id)进行筛选。
(2)筛选出来的cust_id
是需要在orders表中进行查询的,而并不是orders表中所有的cust_id
我们都要,我们需要找有RGAN01
这个产品的订单对应的cust_id
。所以这一层的筛选条件是对order_num
进行筛选。
(3)筛选出的order_num
是需要在orderitems
表中查找,而这时对order_num
的筛选就是选择含有RGAN01
这个产品的订单,也就是这个表中prod_id = 'RGAN01’的订单号。
2、作为计算字段
SELECT cust_name, (SELECT COUNT(*)
FROM orders
WHERE customers.cust_id = orders.cust_id) AS orders
FROM customers
ORDER BY cust_name;
这段代码的含义是:显示顾客及其订单数量。
(1)顾客名当然是在customers
表中的cust_name
字段。
(2)订单数量需要我们用聚集函数count计算一下,这个时候可以在SELECT
后的字段位置通过子查询计算出这个字段。
订单数量可以从orders
表中获取,过滤条件WHERE customers.cust_id = orders.cust_id
表示:比较customers
表中的cust_id
和orders
表中的cust_id
,这样就计算出了每个cust_id
对应的订单总数。