SQL语句多表复杂查询练习总结

本文总结了SQL查询中的笛卡尔积消除、子查询的分类与优化、EXISTS用法、DISTINCT的使用及注意事项,探讨了数据库主码、外码的概念,并讨论了MySQL子查询优化策略。内容包括子查询的执行顺序、非相关子查询与相关子查询的效率比较,以及如何通过合并子查询和子查询展开来提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

一、笛卡尔积

笛卡尔积-------> 如果查询两张表,将两张表所有的数据查询出来,这就是笛卡尔积,要想消除笛卡尔积,可以加条件。或者可以通过第三张表来消除笛卡尔积。(并不是通过第三张表消除笛卡尔积,而是第三张表是为了满足业务需要,实现多对多,真正消除笛卡尔积是通过条件来消除的。)

二、子查询

子查询和主查询,一般先执行子查询,在执行主查询。但是相关子查询例外。

怎么优化子查询?

2.1、子查询分类

2.1.1、相关子查询
2.1.1.1、概念:依赖外部查询的数据
2.1.1.2、执行次数:外部查询执行一次,相关子查询执行一次
2.1.2、非相关子查询
2.1.2.1、概念:不依赖外部查询的数据,是独立的查询。
2.1.2.2、执行次数:只执行一次,执行完毕后将值传递给外部查询。
2.1.3、总结:故非相关子查询比相关子查询效率高。

参考资料:1、SQL相关子查询与非相关子查询

2.2、子查询出现的位置

2.2.1、子查询出现在目标列位置
CREATE TABLE t1 (k1 INT PRIMARY KEY, c1 INT); #创建表t1
CREATE TABLE t2 (k2 INT PRIMARY KEY, c2 INT); #创建表t2
INSERT INTO t2 VALUES (1, 10), (2, 2), (3,30); # t2中添加数据


#第一次查询
SELECT t1.c1, (SELECT t2.c2 FROM t2) FROM t1, t2;  #t2中有数据,t1中没有数据,查询结果为empty


INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3);  #t1中添加数据
#第二次查询
SELECT t1.c1, (SELECT t2.c2 FROM t2) FROM t1, t2;   #错误代码: 1242  Subquery RETURNS more THAN 1 ROW

 
DELETE FROM t2; #删除表t2数据
#DROP TABLE t2;
#第三次查询
SELECT t1.c1, (SELECT t2.c2 FROM t2) FROM t1, t2;   #t2中没有数据,t1中有数据,查询结果为empty
 

INSERT INTO t2 VALUES (1, 10), (2, 2), (3,30);  #再插入t2中的数据
 #第四次查询
 # SELECT t1.c1, (SELECT t2.c2 FROM t2) FROM t1, t2;
 SELECT t1.c1, (SELECT t2.c2 FROM t2 WHERE k2=1) FROM t1, t2; #查询结果:有
 
 
#第五次查询
SELECT t1.c1, (SELECT t2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值