数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)


Posted in MySQL onApril 05, 2021

一:外连接引入:

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

如下:

● t_emp在左侧,称为左表;t_dept在右侧,称为右表;;;

● LEFT JOIN是,在左表和右表连接的时候,保留左表的记录;

● 如果右表有符合连接条件的记录,就正常连接;如果右表没有符合连接条件的记录,右表就出null值去跟左表连接;

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

如:案例如下

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)


二:左外连接,右外连接

外连接包括:左外连接和右外连接。

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

如下面两种结果是一样的: 

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)


三:外连接案例

案例1:查询每个部门的名称和部门的人数、

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

我的做法:

SELECT COUNT(*),d.deptno
FROM t_emp e RIGHT JOIN t_dept d ON e.deptno=d.deptno
GROUP BY d.deptno;

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

标准做法:

SELECT d.dname,COUNT(e.deptno),d.deptno
FROM t_dept d LEFT JOIN t_emp e ON d.deptno=e.deptno
GROUP BY d.deptno;

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)


案例2:查询每个部门的名称和部门的人数,如果没有部门的员工,部门名称用NULL代替:UNION关键字

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

我的做法:

SELECT COUNT(e.deptno),d.dname
FROM t_emp e RIGHT JOIN t_dept d
ON e.deptno=d.deptno
GROUP BY d.dname;

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

改进后的我的做法:

SELECT d.dname,d.deptno,COUNT(*)
FROM (SELECT deptno noo,COUNT(*) FROM t_emp GROUP BY deptno) e LEFT JOIN t_dept d ON e.noo=d.deptno
GROUP BY d.dname;

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

标准做法:使用UNION关键字:UNION关键字把多个查询语句的结果集进行合并(当然会排出重复部分的内容)!!!!!!!!!!!

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

UNION合并不同的查询语句的结果集,这些不同的结果集需要字段的名称相同,字段的数量也需要相同;只有这样才能合并。

因为,员工表中的陈浩没有部门,部门表中的OPERATIONS没有员工,为了两个都能保留下来,需要分别左右连接,,

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

然后,使用UINON关键字,将左右连接的结果集进行合并。

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)


案例3:查询每名员工的编号,姓名,部门,月薪,工资等级,上司编号,上司姓名,上司部门(这个例子有一个非常重要的点)

我的解决方案:核心就是各种表连接,(心里想着先笛卡尔积然后筛选的过程);缺点:一连到底,有点乱,模块性不强。。。

SELECT e1.empno,e1.ename,d1.dname,(e1.sal+IFNULL(e1.comm,0)),s1.grade,FLOOR(DATEDIFF(NOW(),e1.hiredate)/365),e1.mgr,e2.ename,d2.dname
FROM t_emp e1 LEFT JOIN t_dept d1 ON e1.deptno=d1.deptno 
JOIN t_salgrade s1 ON (e1.sal+IFNULL(e1.comm,0)) BETWEEN s1.losal AND s1.hisal 
LEFT JOIN t_emp e2 ON e1.mgr=e2.empno 
LEFT JOIN t_dept d2 ON e2.deptno=d2.deptno;

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

标准做法:“模块化”处理了,更清晰

SELECT e.empno,e.ename,d.dname,e.sal+IFNULL(e.comm,0),s.grade,FLOOR(DATEDIFF(NOW(),e.hiredate)/365),t.empno,t.ename,t.dname
FROM t_emp e LEFT JOIN t_dept d ON e.deptno=d.deptno LEFT JOIN t_salgrade s ON e.sal BETWEEN s.losal AND s.hisal
LEFT JOIN
(SELECT e1.empno,e1.ename,d1.dname FROM t_emp e1 JOIN t_dept d1 ON e1.deptno=d1.deptno) t 
ON e.mgr=t.empno;

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

标准做法中需要注意的地方:十分重要的一个点,,,知道可以这样做以后,以后在做表连接的时候可以更加灵活和模块化了,,能懂,OK!!!!!!!!!

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)


四:外连接注意事项:条件写在ON子句中,写在WHERE子句中的不同

1.内连接只保留符合条件的记录,所以查询条件写在ON子句中,还是写在WHERE子句中,效果是一样的;

2.但在外连接中,查询条件写在ON子句中,还是写在WHERE子句中,效果就不一样了;

在外连接中,条件写在WHERE子句中,不符合条件的记录是会被过滤掉的;;;(还好,可以勉强理解,毕竟ON子句是依附在LEFT JOIN或者RIGHT JOIN或者JOIN子句上的,其本身就是JOIN子句的附属品;;;;但是WHERE子句是独立的。)

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)

MySQL 相关文章推荐
MySql新手入门的基本操作汇总
May 13 MySQL
新手必备之MySQL msi版本下载安装图文详细教程
May 21 MySQL
MySQL系列之七 MySQL存储引擎
Jul 02 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
mysql自增长id用完了该怎么办
Feb 12 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 MySQL
mysql 排序失效
May 20 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
mysql幻读详解实例以及解决办法
Jun 16 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
mysql字符串截取函数小结
MySQL索引篇之千万级数据实战测试
MySQL表的增删改查(基础)
Apr 05 #MySQL
MySQL入门命令之函数-单行函数-流程控制函数
Apr 05 #MySQL
浅析InnoDB索引结构
Apr 05 #MySQL
mysql知识点整理
Apr 05 #MySQL
MySQL令人咋舌的隐式转换
Apr 05 #MySQL
You might like
PHPMailer 中文使用说明小结
2010/01/22 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
关于JS中的闭包浅谈
2013/08/23 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
2019/07/05 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
构建Python包的五个简单准则简介
2015/06/15 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python中http请求方法库汇总
2016/01/06 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
python3对接mysql数据库实例详解
2019/04/30 Python
解决yum对python依赖版本问题
2019/07/05 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
自学python用什么系统好
2020/06/23 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
使用tkinter实现三子棋游戏
2021/02/25 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
中文系学生自荐信范文
2013/11/13 职场文书
营销人才自我鉴定范文
2013/12/25 职场文书
新文化运动的口号
2014/06/21 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
同学会邀请函模板
2015/01/30 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
拿破仑传读书笔记
2015/07/01 职场文书