文章目录
一、笛卡尔积
笛卡尔积-------> 如果查询两张表,将两张表所有的数据查询出来,这就是笛卡尔积,要想消除笛卡尔积,可以加条件。或者可以通过第三张表来消除笛卡尔积。(并不是通过第三张表消除笛卡尔积,而是第三张表是为了满足业务需要,实现多对多,真正消除笛卡尔积是通过条件来消除的。)
二、子查询
子查询和主查询,一般先执行子查询,在执行主查询。但是相关子查询例外。
怎么优化子查询?
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