一步一步学MySQL----13 多表数据记录查询之内连接

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013003827/article/details/68497714

前面学的查询都是单表查询,而在实际应用中,经常需要实现在一个查询语句中显示多张表的数据,这就是所谓的多表数据记录查询,简称连接查询。

12.1 关系数据操作

(1)并(UNION)
“并”就是把具有相同字段数目和字段类型的表合并到一起。

(2)笛卡儿积(CARTESIAN PRODUCT)
笛卡儿积就是没有连接条件表关系返回的结果。

(3)内连接(INNER JOIN)
在表关系的笛卡儿积数据记录中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录。

内连接主要有以下三种连接方式:

  • 自然连接:首先根据表关系中相同名称的字段自动进行记录匹配,然后去掉重复的字段。

  • 等值连接:等值连接操作就是表关系的笛卡儿积中,选择所匹配字段值相等的数据记录。等值连接关系数据操作需要在执行过程中的用“符号=”指定匹配条件,在新关系中不会去掉重复字段。

  • 不等连接:笛卡尔积中,选择所匹配字段值不相等(!=)的数据记录。与自然连接相比,不等连接关系数据操作需要在执行过程中用符号!=指定匹配条件,在新关系中不会去掉重复字段。

(4)外连接(OUTER JOIN)

  • 左外连接:就是表关系的笛卡儿积中,除了选择相匹配的数据记录,还包含关联左边表中不匹配的数据记录

  • 右外连接:就是表关系的笛卡儿积中,除了选择相匹配的数据记录,还包含关联右边表中不匹配的数据记录

  • 全外连接:就是表关系的笛卡儿积中,除了选择相匹配的数据记录,还包含关联左右两边表中不匹配的数据记录

下面的实例基于数据库company,有如下两张表:

(1) 部门表:department
这里写图片描述

(2) 员工表:employee
这里写图片描述

12.2 内连接之自然连接

所谓自然连接,就是指表与其自身进行连接。

例如:执行SQL语句“inner join…on”,在数据库company中,查询每个员工的姓名、工种、领导姓名。

【实例分析】

(1) 确定需要查询的表和所查询字段的来源
根据需求,我们需要查询两张表:员工表(employee)和领导表(employee),前者需要查询出员工的姓名和工种,后者需要查询出领导的姓名。

注意:由于表employee综合了员工和领导的信息,所以employee既是员工表也是领导表

(2) 确定关联匹配条件
Employee.mgno(员工表的领导编号)=employee.empno(领导表的领导编号)

【实现步骤】
第一步:查询每一位员工的姓名和工种

mysql> select e.ename employeename,e.job from employee e;

这里写图片描述

第二步:引入领导表,同时添加一条消除笛卡尔积的匹配条件

mysql> select e.ename employeename,e.job job,l.ename loadername from employee e inner join employee l on e.mgno=l.empno;

这里写图片描述

上面的语句也可以改写成select from where的形式,如下:

mysql> select e.ename employeename,e.job job,l.ename loadername from employee e, employee l where e.mgno=l.empno;

这里写图片描述

特别说明:当表的名称特别长时,直接使用表名很不方便,或者在实现表自然连接的时候,直接使用表名没有办法区分表。为了解决这些问题,MySQL提供了一种为表取别名的机制,具体语法如下:

select field1,field2,…fieldn [as] otherfieldn from table_name1 [as] other_table_name1,…,table_namen [as] other_table_namen

注意:在上述语句中table_name为原表名,other_table_name为新表名,其中的[as]可写可不写。

12.3 内连接之等值连接

所谓等值连接,就是在关键字ON后的匹配条件中通过等于关系运算符(=)来实现等值条件。

例如1:执行SQL语句“inner join on”,在数据库company中,查询每个员工的工号、姓名、工种、部门名称、位置。

【实例分析】

(1) 确定需要查询的表和所查询字段的来源
根据要求需要查询两张表:部门表和员工表,前者需要查询出部门的名称和位置,后者需要查询出员工的工号、姓名和工种。

(2) 确定关联匹配条件
department.depno=employee.depno

【实现步骤】

第一步:查询每一位员工的工号、姓名和工种。

mysql> select e.empno,e.ename,e.job from employee e;

这里写图片描述

第二步:为查询中引入部门表,同时添加一条消除笛卡尔积的匹配条件

mysql> select e.empno,e.ename,e.job,d.dname,d.location from employee e inner join department d on d.depno=e.depno;

这里写图片描述

上面的语句也可以改写成select from where的形式,如下:

mysql> select e.empno,e.ename,e.job,d.dname,d.location from employee e,department d where d.depno=e.depno;

这里写图片描述

例如2:执行SQL语句“inner join on”,在数据库company中,查询每个员工的工号、姓名、薪水、工种、领导的姓名、部门名称、位置。

【实例分析】

(1) 确定需要查询的表和所查询字段的来源

根据需求需要查询三张表:部门表(department)、员工表(employee)、领导表(employee),分别查询如下字段:

  • 员工表:员工的工号、姓名、薪水和工种
  • 领导表:领导的姓名
  • 部门表:部门名称和位置

(2) 确定关联匹配条件

领导表连接部门表匹配条件:employee.depno=department.depno
员工表连接领导表匹配条件:employee.mgno=employee.empno

【实现步骤】

第一步:查询每一位员工的工号、姓名、薪水和工种。

mysql> select e.empno,e.ename employeename,e.salary,e.job from employee e;

这里写图片描述

第二步:引入领导表,同时添加一条消除笛卡尔积的匹配条件

mysql> select e.empno,e.ename employeename,e.salary,e.job,l.ename loadername from employee e inner join employee l on e.mgno=l.empno;

这里写图片描述

第三步:引入部门表,同时添加一条消除笛卡尔积的匹配条件

mysql> select e.empno,e.ename employeename,e.salary,e.job,l.ename loadername,d.dname,d.location from employee e inner join employee l on e.mgno=l.empno inner join department d on l.depno=d.depno;

这里写图片描述

上面的语句也可以改写成select from where的形式,如下:

mysql> select e.empno,e.ename employeename,e.salary,e.job,l.ename loadername,d.dname,d.location from employee e, employee l, department d where e.mgno=l.empno and l.depno=d.depno;

这里写图片描述

12.4 内连接之不等连接

所谓不等连接,就是在关键字ON后的匹配条件中通过除了等于关系运算符来实现不等条件外,可以使用的关系运算符包含“>”,“>=”,“<”,“<=”和“!=”。

例如:执行SQL语句“inner join on”,在数据库company中,查询员工工号大于其领导工号的每个员工的姓名、工种、领导姓名。

【实例分析】

(1) 确定需要查询的表和所查询字段的来源

根据要求需要查询两张表:员工表和领导表(都是employee),前者需要查询出员工的姓名和工种,后者需要查询出其领导的姓名。

(2) 确定关联匹配条件

employee.mgno(员工表的领导工号)=employee.empno(领导表的领导工号);
employee.empno(员工表的员工工号)>employee.empno(领导表的领导工号)

【实现步骤】

第一步:查询每一位员工的姓名和工种

mysql> select e.ename employeename,e.job from employee e;

这里写图片描述

第二步:引入领导表,同时添加一条消除笛卡尔积的匹配条件

mysql> select e.ename employeename,e.job,l.ename loadername from employee e inner join employee l on e.mgno=l.empno and e.empno>l.empno;

这里写图片描述

上面的语句也可以改写成select from where的形式,如下:

mysql> select e.ename employeename,e.job,l.ename loadername from employee e, employee l where e.mgno=l.empno and e.empno>l.empno;

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u013003827/article/details/68497714