跳到主要内容

子查询和表联结的实践整理

· 阅读需 3 分钟

子查询

子查询是指嵌套在其他查询里的查询。主要有两个使用位置,一个是利用子查询进行过滤,另一个是作为计算字段使用子查询。

利用子查询进行过滤

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

顺序是先执行子查询,由内向外。实际上,这种用法的查询效率低,尽量用联结查询代替。

作为计算字段使用子查询

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

-- 用left join优化
select a.cust_name, a.cust_state, b.count
from Customers a left join (select cust_id, count(cust_id) from Orders group by cust_id) b on a.cust_id=b.cust_id
order by cust_name

上述语句的执行顺序是,先在外层找到符合条件的数据,然后子查询对检索出的每条数据执行一次。

最后还有一种在from后面使用的子查询,作为主查询的数据源:

SELECT column1, column2
FROM (SELECT column3 FROM table1 WHERE condition) AS subquery;

这种情况下,用视图来替代应该是更聪明的选择,因为可以降低sql语句的复杂性。

扩展资料:


SQL子查询优化,看这一篇就够了 https://developer.aliyun.com/article/711481



SQL优化:慎用标量子查询,改用left join提升查询效率 https://www.cnblogs.com/goloving/p/15193637.html


表联结

想起来有一次回答full join是什么时,以为就是笛卡尔积的尴尬场景。

首先要了解联结的本质:多张表根据条件列出匹配的行,如果没有条件,就会返回笛卡尔积(也就是返回M*N行)。内联结(inner join)就是只返回表之间符合条件的行。而外连接还包括了没有关联行的行。