数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,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 用户权限管理
Apr 20 MySQL
教你解决往mysql数据库中存入汉字报错的方法
May 06 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
MySQL 聚合函数排序
Jul 16 MySQL
mysql脏页是什么
Jul 26 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
MYSQL 运算符总结
Nov 11 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
MySQL优化之慢日志查询
Jun 10 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
PHP5 安装方法
2007/01/15 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
jquery延迟对象解析
2016/10/26 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
大学毕业感言100字
2014/02/03 职场文书
入股协议书
2014/04/14 职场文书
房产分割协议书范文
2014/11/21 职场文书
保险公司增员口号
2015/12/25 职场文书
辞职信怎么写?
2019/05/21 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript