# 什么是连接查询

从一张表中单独查询,称为单表查询。
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次。只不过进行了筛除,匹配的次数并没有减少!!!

注意:通过观察笛卡尔积现场得出,表的连接次数越多(连接的表越多)程序执行效率越低,应避免表的连接次数过多。