SQL支持在查询语句中编写查询,或者嵌套其他查询。最外层查询的结果集会返回给调用者,称为外部查询。内部查询的结果是供外部查询使用的,也称为子查询。子查询分为独立子查询和相关子查询两类。独立子查询不依赖他所属的外部查询,较为简单,而相关子查询则须依赖于他所属的外部查询,较难理解。
相关子查询是指引用了外部查询中出现的列的子查询,这就意味着子查询要依赖外部查询,不能独立的调用他。子查询会为每个外部行单独计算一次。以下举例说明:
现有订单表Orders(order_id, order_date, customer_id),查询每个客户所有订单中订单ID最大的那个订单。有SQL如下:
select customer_id, order_id, order_date from Orders as t1
where order_id = (select max(t2.order_id) from Orders as t2 where
t2.customer_id = t1.customer_id)
根据一条SQL语句的执行顺序,我们知道where是在from后面执行的,经过from阶段的到的结果集是表Orders的全部内容,然后执行where语句,此时子查询会为from阶段的结果集中的每一行都计算一次,计算结果满足order_id = result.order_id则通过,否则被过滤掉。