MySQL七种Join理论

1、join理论简述

在这里插入图片描述
核心:7种join理论最终都回到了大学课本离散数学、概率论中的知识,这才是join理论的核心;这些维恩图都有固定的数学表达式,但是已经推不出来化简式只能写个大概的表达式。

  • 内连接:多张表之间平等关系,凡是能匹配上的记录都查询出来;

  • 内连接分类:等值连接、非等值连接、自连接。

  • 外连接:多张表之间存在主副之分,主要查询主表中的数据,其余表中的数据捎带着查询,当副表的没有存在于主表的数据匹配时附表中自动填充NULL值。

  • 外连接分类:左外连接、右外连接、特殊的左外连接、特殊的右外连接…



2、数据表

在这里插入图片描述

create table `dept` (
  `DEPTNO` int(2) not null,
  `DNAME` varchar(14) default null,
  `LOC` varchar(13) default null,
  primary key (`DEPTNO`)
) engine=innodb default charset=utf8;


insert  into `dept`(`DEPTNO`,`DNAME`,`LOC`) values 
(10,'ACCOUNTING','NEW YORK'),
(20,'RESEARCH','DALLAS'),
(30,'SALES','CHICAGO'),
(40,'OPERATIONS','BOSTON');


create table `emp` (
  `EMPNO` int(4) not null,
  `ENAME` varchar(10) default null,
  `JOB` varchar(9) default null,
  `MGR` int(4) default null,
  `HIREDATE` date default null,
  `SAL` double(7,2) default null,
  `COMM` double(7,2) default null,
  `DEPTNO` int(2) default null,
  primary key (`EMPNO`)
) engine=innodb default charset=utf8;


insert  into `emp`(`EMPNO`,`ENAME`,`JOB`,`MGR`,`HIREDATE`,`SAL`,`COMM`,`DEPTNO`) values 
(7369,'SMITH','CLERK',7902,'1980-12-17',800.00,null,20),
(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600.00,300.00,30),
(7521,'WARD','SALESMAN',7698,'1981-02-22',1250.00,500.00,30),
(7566,'JONES','MANAGER',7839,'1981-04-02',2975.00,null,20),
(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250.00,1400.00,30),
(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850.00,null,30),
(7782,'CLARK','MANAGER',7839,'1981-06-09',2450.00,null,10),
(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000.00,null,20),
(7839,'KING','PRESIDENT',null,'1981-11-17',5000.00,null,10),
(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500.00,0.00,30),
(7876,'ADAMS','CLERK',7788,'1987-05-23',1100.00,null,20),
(7900,'JAMES','CLERK',7698,'1981-12-03',950.00,null,30),
(7902,'FORD','ANALYST',7566,'1981-12-03',3000.00,null,20),
(7934,'MILLER','CLERK',7782,'1982-01-23',1300.00,null,10);


create table `salgrade` (
  `GRADE` int(11) default null,
  `LOSAL` int(11) default null,
  `HISAL` int(11) default null
) engine=innodb default charset=utf8;


insert  into `salgrade`(`GRADE`,`LOSAL`,`HISAL`) values 
(1,700,1200),(2,1201,1400),(3,1401,2000),
(4,2001,3000),(5,3001,9999);


3、等值连接

  • 等值连接:是内连接的一种,特点是连接的条件是等量关系。

  • SQL92:92中的等值连接是在where条件中加入两表的等量关系;缺点就是会产生笛卡尔积,大量数据查询时速率可能较慢。

  • SQL99:99中等值连接采用inner join关键词;清晰明了、查询效率高、将连接关系从where中分离出来。

  • 数学表达式:A ∩ B

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

-- SQL92版本
select e.ename, d.dname from emp e, dept d where e.`DEPTNO` = d.`DEPTNO`

-- SQL99版本
select e.ename, d.dname from emp e inner join dept d on e.`DEPTNO` = d.`DEPTNO`

在这里插入图片描述
inner可以不写,但是为了可读性建议加上。



4、非等值连接

  • 非等值连接:是内连接的一种,特点是连接的条件是非等量关系。

  • 关键词:inner join on

  • 数学表达式:A ∩ B

案例: 找出每个员工的工资等级、要求显示员工名字、工资、工资等级

select e.`ENAME`, e.`SAL`, s.`grade` from emp e inner join 
salgrade s on e.`SAL` between s.losal and s.hisal

-- 这种写法也可以
select e.`ENAME`, e.`SAL`, s.`grade` from emp e, salgrade s 
where e.`SAL` between s.losal and s.hisal

在这里插入图片描述



5、自连接

  • 自连接:内连接的一种,特点就是自己和自己连接

  • 核心:一张表拆成两张表,用两张相同的表进行查询

  • 关键词:inner join on

  • 数学表达式:A ∩ B

案例:找出每个员工的上级领导,要求显示员工名字、上级领导名字。

select e1.ename '员工', e2.ename '上司' from 
emp e1 inner join emp e2 on e1.mgr = e2.empno

在这里插入图片描述

注意

  • 注意员工应该是e1中的ename字段、上级是e2中的ename字段。

  • 问题:结果中少了king的结果,这也就是内连接的特点;表之间没有主副之分且只显示能匹配的字段



6、左连接

  • 左连接:以左表为主表所有数据全部展示,右表(副表)中无匹配的数据时字段值自动补NULL。

  • 核心:右表无法成功匹配的数据字段自动填充NULL

  • 关键词:left outer join on,其中outer可以省略。

  • 数学表达式:A(主表)

案例:找出每个员工的上级领导,要求显示员工名字、上级领导名字。

select e1.ename, e2.ename from emp e1 
left join emp e2 on e1.mgr = e2.empno

在这里插入图片描述

对比自连接可以看到多出一个king数据、虽然没有上司但是会自动填充NULL值



7、特殊的左连接

  • 特殊的左连接:以左表为主表同时去除掉与右表(副表)的成功匹配的部分,即inner join等值连接的部分。

  • 核心:只留下的就是主表中特有的数据,也就是左连接中右表需要填充NULL的数据

  • 关键字:left join on … where 右表.xxx字段 is null。

  • 数学表达式:A - B

案例:查询哪个员工的没有上级,显示员工名称,上级名称。

相对左连接来说就是只找到并输出king

select e1.ename as '员工', e2.ename as '上级' from emp e1 
left join emp e2 on e1.mgr = e2.empno where e2.ename is null

在这里插入图片描述



8、右连接

  • 右连接:以右表为主表,所有数据全部无条件展示;左表(副表)中无匹配的数据时字段值自动补NULL。

  • 核心:左表无法成功匹配时,查询的字段值自动填充NULL。

  • 关键词:right outer join on,其中outer可以省略。

  • 数学表达式:B(主表)

案例:查询各个部门有哪些员工,显示员工的名称,部门编号,部门名称。

select e.`EMPNO`, d.deptno, d.`DNAME` from emp e right join 
dept d on e.`DEPTNO` = d.`DEPTNO` 

在这里插入图片描述



9、特殊的右连接

  • 特殊的右连接:以右表为主表,去除掉所有与左表(副表)成功匹配的数据行。

  • 核心:只保留右表(主表)独有的数据

  • 关键词:right join on … where 左表.xxx字段 is null

  • 数学表达式:B - A

案例:查询哪个部门没有员工,输出员工名称、部门编号、部门名。

select e.`ENAME`, d.deptno, d.`DNAME` from emp e right join 
dept d on e.`DEPTNO` = d.`DEPTNO` where e.`ENAME` is null 

在这里插入图片描述



总结

  1. 内连接的 inner 关键词可以不写,但是为了可读性一定要写上。

  2. 外连接的 outer 关键词也可以不写,由于存在left、right关键词可以不写outer。

  3. 根据分析区分内外连接的关键并不是是否使用inner、outer关键词,而是是否存在left、right关键词。

  4. 特殊的左连接与右连接,实际上就是左连接与右连接增加了一个where判断条件。

  5. 因为可能存在少数据的情况,大多数情况下内连接很少使用;更多的是使用外连接。

  6. 左连接和右连接可以相互转化,先转化的方式就是将两表顺序对换,再将left与right关键词互改即可。

  7. 全连接以及特殊的全连接很少使用,MySQL好像并不支持全连接?



如有错误欢迎各位大佬指正;共同学习,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值