第11课 使用子查询

第11课 使用子查询

11.1 子查询

SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。

11.2 利用子查询进行过滤

SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
                    FROM OrderItems
                    WHERE prod_id = 'RGAN01');

在SELECT语句中,子查询总是从内向外处理。在处理上面的SELECT语句时,DBMS实际上执行了两个操作。

首先,它执行下面的查询:

SELECT order_num FROM orderitems WHERE prod_id='RGAN01'

此查询返回两个订单号:20007和20008。然后,这两个值以IN操作符要求的逗号分隔的格式传递给外部查询的WHERE子句。外部查询变成:

SELECT cust_id FROM orders WHERE order_num IN (20007,20008)

警告:只能是单列
作为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。

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

使用子查询的另一方法是创建计算字段。

SELECT cust_name, 
       cust_state,
       (SELECT COUNT(*) 
        FROM Orders 
        WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers 
ORDER BY cust_name; 

用一个句点分隔表名和列名,这种语法必须在有可能混淆列名时使用。

警告:完全限定列名
有时候,由于出现冲突列名而导致的歧义性,会引起DBMS抛出错误信息。例如,WHERE或ORDER BY子句指定的某个列名可能会出现在多个表中。好的做法是,如果在SELECT语句中操作多个表,就应使用完全限定列名来避免歧义。

11.4 小结

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

上一篇:ORACLE使用透明数据库加密_FOR_VPD


下一篇:Mybatis实现插入数据的时候将主键赋值给对象的两种方法