数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,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 14 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
MySQL CHAR和VARCHAR该如何选择
May 31 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
浅谈MySQL函数
Oct 05 MySQL
MySQL实战记录之如何快速定位慢SQL
Mar 23 MySQL
pt-archiver 主键自增
Apr 26 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 MySQL
MySQL 数据表操作
May 04 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 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
Session的工作方式
2006/10/09 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
Yii入门教程之Yii安装及hello world
2014/11/25 PHP
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
Python实现全局变量的两个解决方法
2014/07/03 Python
简单理解Python中基于生成器的状态机
2015/04/13 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
Python算法中的时间复杂度问题
2019/11/19 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
Linux上比较文件的命令都有哪些
2013/09/28 面试题
承认错误的检讨书
2014/01/30 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
元宵节寄语大全
2015/02/27 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
重阳节座谈会主持词
2015/07/03 职场文书
DIY胆机必读:各国电子管评价
2022/04/06 无线电
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL