查询复杂度
A表中n条数据,B表中m条数据
表的连接查询 select * from A left B on,复杂度为n+m
表的子查询 select * from A in (select * from B),复杂度为n*m
where和left join的区别
数据库在通过连接两张或多张表返回记录时,都会生成一张中间临时表,然后再返回这张临时表给用户
区别
- on条件是在生成临时表时的条件,无论on的条件是否为真,都会返回左表中的记录
- where条件是在生成临时表后,再对临时表进行过滤的条件
说明
有一种情况:比如A表查询的数量是1条,B表查询的数量是10条,on的条件是A表中的一条数据对应B表中的10条数据,当使用left join查询时,会出现10条数据。
举例如下
select * from A where id = 123;
假如这条查询语句查到的数据为1条
id | name | age |
---|---|---|
123 | 张三 | 18 |
select * from B where a_id = 123;
假如这条查询语句查到的数据为10条
id | a_id | score |
---|---|---|
1 | 123 | 98 |
2 | 123 | 100 |
3 | 123 | 98 |
4 | 123 | 95 |
5 | 123 | 83 |
6 | 123 | 90 |
7 | 123 | 100 |
8 | 123 | 89 |
9 | 123 | 96 |
10 | 123 | 92 |
当使用如下查询语句时:
select * from A left join B on A.id = B.a_id where a_id = 123;
这时的查询语句为10条,如下
id | name | age | id | a_id | score |
---|---|---|---|---|---|
123 | 张三 | 18 | 1 | 123 | 98 |
123 | 张三 | 18 | 2 | 123 | 100 |
123 | 张三 | 18 | 3 | 123 | 98 |
123 | 张三 | 18 | 4 | 123 | 95 |
123 | 张三 | 18 | 5 | 123 | 83 |
123 | 张三 | 18 | 6 | 123 | 90 |
123 | 张三 | 18 | 7 | 123 | 100 |
123 | 张三 | 18 | 8 | 123 | 89 |
123 | 张三 | 18 | 9 | 123 | 96 |
123 | 张三 | 18 | 10 | 123 | 92 |
left join, right join, inner join
left join:左连接,把左边表中的数据全部查出来,右边表中的数据有则匹配,没有则为null。
right join:右连接,返回包括右表中的所有记录,和左表中的字段匹配,原理同left join类似。
inner join:等值连接,只返回两个表中连接字段想等的表。
可以查看相关链接,写的很清楚
https://blog.csdn.net/weixin_48052161/article/details/116072167