子查询和表联结的实践整理
· 阅读需 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)就是只返回表之间符合条件的行。而外连接还包括了没有关联行的行。