SQL必知必会(第四版)-11. 使用子查询

目录

11.1 子查询

11.2 利用子查询进行过滤

用子查询

11.3 作为计算字段使用子查询

完全限定列名

11.4 小结


11.1 子查询

查询(query):任何SQL语句都是查询。但此术语一般指SELECT语句。

子查询(subquery):嵌套在其他查询中的查询。

11.2 利用子查询进行过滤

先来看一下三张表的结构,

1. Orders,含有订单号、订单日期和客户ID

2. OrderItems,含有订单号、物品号、产品ID、数量和物品价格

3. Customers,含有客户ID,客户名,客户地址,客户的城市,客户所在州,客户zip,客户所在国家,客户的联系人,客户email等客户信息。

现在,假如需要列出订购物品RGAN01的所有顾客,应该怎样检索?

从上面三张表的结构可以看出,在OrderItems表中,产品ID对应订单号;在Orders表中,订单号对应客户ID;在Customers表中,客户ID对应客户名。

输入:

SELECT order_num FROM `OrderItems` WHERE prod_id = 'RGAN01';

输出:

输入:

SELECT cust_id FROM `Orders` WHERE order_num IN (20007, 20008);

输出:

输入:

SELECT cust_name, cust_contact FROM `Customers` WHERE cust_id IN (1000000004, 1000000005);

输出:

用子查询

输入:

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'));

输出:

  • 作为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。
  • 子查询并不总是执行这类数据检索的最有效方法。更多的论述,请参阅第12课,其中将再次给出这个例子。

11.3 作为计算字段使用子查询

假如需要显示Customers表中每个顾客的订单总数。

输入:

SELECT cust_name, cust_city, 
       (SELECT COUNT(order_num) FROM `Orders` 
       WHERE Orders.cust_id = Customers.cust_id) 
       AS orders
       FROM `Customers`; 

输出:

orders是一个计算字段,它是由圆括号中的子查询建立的。该子查询对检索出的每个顾客执行一次。在此例中,该子查询执行了5次,因为检索出了5个顾客。

完全限定列名

子查询中的WHERE子句与前面使用的WHERE子句稍有不同,因为它使用了完全限定列名,而不只是列名(cust_id)。它指定表名和列名(Orders.cust_id和Customers.cust_id)。

11.4 小结

  • 子查询常用于WHERE子句的IN操作符中
  • 以及用来填充计算列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值