个人学习 | MySQL学习(多表查询)

本文介绍了MySQL中的多表查询,包括连接查询的种类如内连接、等值连接、非等值连接、自连接、外连接(左连接、右连接、全连接),并通过实例展示了如何使用这些连接类型查询员工、部门和工资等级信息。

连接查询

连接查询:也可以叫跨表查询,需要关联多个表进行查询。

数据表

员工表(emp)

EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
7369SMITHCLERK79021980-12-17800.00NULL20
7499ALLENSALESMAN76981981-02-201600.00300.0030
7521WARDSALESMAN76981981-02-221250.00500.0030
7566JONESMANAGER78391981-04-022975.00NULL20
7654MARTINSALESMAN76981981-09-281250.001400.0030
7698BLAKEMANAGER78391981-05-012850.00NULL30
7782CLARKMANAGER78391981-06-092450.00NULL10
7788SCOTTANALYST75661987-04-193000.00NULL20
7839KINGPRESIDENTNULL1981-11-175000.00NULL10
7844TURNERSALESMAN76981981-09-081500.000.0030
7876ADAMSCLERK77881987-05-231100.00NULL20
7900JAMESCLERK76981981-12-03950.00NULL30
7902FORDANALYST75661981-12-033000.00NULL20
7934MILLERCLERK77821982-01-231300.00NULL10

部门表(dept)

DEPTNODNAMELOC
10ACCOUNTINGNEW YORK
20RESEARCHDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON

工资表(salgrade)

GRADELOSALHISAL
17001200
212011400
314012000
420013000
530019999

连接查询的分类

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

  • 内连接
    • 等值连接
    • 非等值连接
    • 自连接
  • 外连接
    • 左外连接(左连接)
    • 右外连接(右连接)
  • 全连接

笛卡尔乘积现象

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

通过添加限制条件进行过滤可以避免笛卡尔积现象,但不会减少记录的匹配次数。限制条件只是起到过滤作用。

表的别名有什么好处

  1. 执行效率高
  2. 可读性好

内连接

语法:inner关键字可以省略

	···
	A
inner join
	B
on
	连接条件
where
	···

等值连接

避免笛卡尔积现象的限制条件是等量关系

例子:查询每个员工的部门名称,要求显示员工名和部门名

select
	e.ename, d.dname
from
	emp e
join
	dept d
on
	e.deptno = d.deptno;

非等值连接

避免笛卡尔积现象的限制条件是非等量关系

例子:查询每个员工的工资等级,要求显示员工名、工资、工资等级。

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

自连接

将一张表看作两张表,自己连接自己

例子:查询每个员工的上级领导,要求显示员工名和对应领导名

select 
	a.ename, b.ename 
from 
	emp a 
join 
	emp b
on 
	a.mgr=b.empno;

外连接

语法:outer关键字可以省略

	···
	A
left(right) outer join
	B
on
	连接条件
where
	···

外连接与内连接的区别

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

外连接:假设A表和B表进行连接,使用外连接的话,两张表之中有一张表是主表,另一张是副表,主要查询主表中的数据。当副表中的数据没有和主表中的数据匹配上,副表自动填充NULL与之匹配。

左(右)外连接

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

例子:找出每个员工的上级领导,所有员工必须全部查询出来。

select
	a.ename, b.ename
from
	emp a
left outer join
	emp b
on 
	a.mgr = b.empno;

在上例中,a表是主表,确保所有员工全部查询出来。b表是副表,主要用来查询上级领导。没有上级领导则填充null。

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

例子:查询没有员工的部门

select 
	d.* 
from 
	emp e 
right join 
	dept d 
on 
	e.deptno=d. deptno 
where 
	e.empno is null;

全连接

语法

	···
	A
full join
	B
on
	连接条件
where
	···

A表和B表都是主表,在查询过程中两张表的数据全部都会显示出来。两表连接时,不满足连接条件的数据记录会使用NULL填充缺省部分

三张表的连接查询

例子:找出每一个员工的部门名称和工资等级。

select 
	e.ename,d.dname,s.grade 
from 
	emp e 
join 
	dept d 
on 
	e.deptno = d.deptno 
join 
	salgrade s 
on 
	e.sal between s.losal and s.hisal;

例子:找出每一个员工的部门名称、工资等级、上级领导。

select 
	e.ename,d.dname,s.grade 
from 
	emp e 
join 
	dept d 
on 
	e.deptno = d.deptno 
join 
	salgrade s 
on 
	e.sal between s.losal and s.hisal
left join
	emp e1
on 
	e.mgr=e1.empno;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值