# 什么是连接查询
从一张表中单独查询,称为单表查询。
emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字。这种跨表查询,多张表联合起来查询数据,称为连接查询。
# 连接查询分类
根据语法的年代分类:
1. SQL92:1992年出现的语法。
2. SQL99:1999年出现的语法。
根据表连接的方式分类:
1. 内连接
1. 等值连接
2. 非等值连接
3. 自连接
2. 外连接
1. 左外连接(左连接)
2. 右外连接(右连接)
3. 全连接
# 笛卡尔积现象
当两张表进行连接查询,没有任何条件限制的时候,最终的查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象。(一个数学现象)
select up.id uId, qd.id qId from user_profile up, question_detail qd;
+-----+-----+
| uId | qId |
+-----+-----+
| 7 | 1 |
| 6 | 1 |
| 5 | 1 |
| 4 | 1 |
| 3 | 1 |
| 2 | 1 |
| 1 | 1 |
| 7 | 2 |
...
112 rows in set (0.00 sec)
# 避免笛卡尔积现象
增加表连接时的条件。
select up.id uId, qpd.id qId from user_profile up, question_practice_detail qpd where up.device_id = qpd.device_id;
+-----+-----+
| uId | qId |
+-----+-----+
| 1 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 5 |
| 4 | 6 |
| 4 | 7 |
| 2 | 8 |
| 2 | 9 |
| 3 | 10 |
| 4 | 11 |
| 4 | 12 |
| 4 | 13 |
| 2 | 14 |
| 2 | 15 |
| 3 | 16 |
+-----+-----+
16 rows in set (0.00 sec)
重点:最终查询结果是16条,但是在匹配中,匹配的次数没有减少,仍然是112次。只不过进行了筛除,匹配的次数并没有减少!!!
注意:通过观察笛卡尔积现场得出,表的连接次数越多(连接的表越多)程序执行效率越低,应避免表的连接次数过多。