目录

一、连接查询

1、什么是连接查询

2、查询连接的分类

3、笛卡尔积现象(笛卡尔乘积现象)

如何避免笛卡尔积现象?——加条件进行过滤

4、内连接

(1)等值连接

(2)非等值连接

(3)自连接

5、外连接

 什么是外连接,和内连接的区别是什么?

外连接的分类?

外连接最主要的特点是:主表的数据无条件的全部查询出来。

6、三张表的连接查询


上一篇:

MySQL基础(一)-MySQL的概述及数据定义语言DDL的基本操作

(3条消息) MySQL基础(二)-数据的基本操作【增删改查】_five小点心的博客-

一、连接查询

1、什么是连接查询

        在实际开发中,大部门的情况下都不是从单表中查询数据,一般都是多张表联合查询,取出最终的结果。

        在实际开发中,一般一个业务会对应多张表。如:学生和班级。如果将学生和班级信息存储到一张表中数据会存在大量的重复,导致数据的冗余。

2、查询连接的分类

根据语法出现的时间来划分

SQL92:较老的语法

SQL99:比较新的语法

根据表的连接方式来划分,包括:

内连接:

        等值连接

        非等值连接

        自连接

外连接:

        左外连接(左连接)

        右外连接(右连接)

全连接(使用较少)

3、笛卡尔积现象(笛卡尔乘积现象)

案例:找出每一个学生的成绩,要求显示学生姓名和成绩。

student表
+--------+
| sname  |
+--------+
| 赵雷   |
| 钱电   |
| 孙风   |
| 李云   |
| 周梅   |
| 吴兰   |
| 郑竹   |
| 王菊   |
+--------+
8 rows in set (0.00 sec)


sc成绩表
+-------+
| score |
+-------+
| 80    |
| 90    |
| 99    |
| 70    |
| 60    |
| 80    |
| 80    |
| 80    |
| 80    |
| 50    |
| 30    |
| 20    |
| 76    |
| 87    |
| 31    |
| 34    |
| 89    |
| 98    |
+-------+
18 rows in set (0.00 sec)


select sname,score from student,sc;
+--------+-------+
| sname  | score |
+--------+-------+
| 赵雷   | 80    |
| 钱电   | 80    |
| 孙风   | 80    |
| 李云   | 80    |
| 周梅   | 80    |
| 吴兰   | 80    |
| 郑竹   | 80    |
| 王菊   | 80    |
| 赵雷   | 90    |
| 钱电   | 90    |
| 孙风   | 90    |
...................
144 rows in set (0.00 sec)

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。


关于表的别名:

select stu.sname,s.score from student stu ,sc s;

表别名的好处:

        1、执行效率高

        2、可读性好

如何避免笛卡尔积现象?——加条件进行过滤

需要注意的是,加条件进行限制之后,记录的匹配次数不变,仍为144次,只不过显示的是有效记录。

我们将上面的代码进行修改。

select
  stu.sname,s.score 
from
  student stu,sc s 
where
  stu.s=s.s
 ;                    // SQL92语法

4、内连接

(1)等值连接

等值连接最大的特点是:条件是等量关系。

语法(SQL99):

......
    A
join
    B
on
    连接条件
where
    ......
 

mysql的多表关联是从前往后执行_mysql

mysql的多表关联是从前往后执行_mysql_02

 左图为SQL92,右图为SQL99。


SQL92中,表连接和过滤的条件融合在一起,导致where后面的结构不清晰。

SQL99中,把表连接条件和过滤条件进行了分离,结构更清晰。。

(2)非等值连接

非等值连接最大的特点是:连接条件中的关系是非等量关系。

select 
    e.ename,e.sal,s.grade
from
    emp e
(inner) join
    salgrade s
on
    e.sal between s.losal and s.hisal;

(3)自连接

自连接最大的特点是:一张表看做两张表。自己连接自己。


员工的领导编号 = 领导的员工编号
select
    a.ename,b.ename
from
    emp a
inner join
    emp b
on
    a.mgr=b.empno;

5、外连接

 什么是外连接,和内连接的区别是什么?

        内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的

        外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表。主要查询主表中的数据,捎带查询副表。当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与之匹配。

外连接的分类?

        左外连接(左连接):表示左边的这张表是主表。

        右外连接(右连接):表右边的这张表是主表。

select 
    e.ename,e.sal,s.grade
from
    emp e
left (outer) join
    salgrade s
on
    e.sal between s.losal and s.hisal;

外连接最主要的特点是:主表的数据无条件的全部查询出来。

6、三张表的连接查询

案例:找出每一个员工的部门名称以及工资等级

......

        A

join

        B

join

        C

on

        ...... 

表示:A表和B表先进行表连接,连接之后A表继续和C表进行连接。