数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,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 root密码的重置方法
Apr 21 MySQL
MySQL 慢查询日志深入理解
Apr 22 MySQL
MySQL 视图(View)原理解析
May 19 MySQL
MySQL中的布尔值,怎么存储false或true
Jun 04 MySQL
新手入门Mysql--概念
Jun 18 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
MySQL中存储时间的最佳实践指南
Jul 01 MySQL
MySQL 用 limit 为什么会影响性能
Sep 15 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 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
php根据年月获取季度的方法
2014/03/31 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
thinkPHP查询方式小结
2016/01/09 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
利用python批量检查网站的可用性
2016/09/09 Python
Python实现一个简单的验证码程序
2017/11/03 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
python实现二维插值的三维显示
2018/12/17 Python
python list转置和前后反转的例子
2019/08/26 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
Python sys模块常用方法解析
2020/02/20 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
匡威英国官网:Converse英国
2018/12/02 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
医学专业毕业生个人的求职信
2013/12/04 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
爱护公物主题班会
2015/08/17 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang
Python Matplotlib库实现画局部图
2021/11/17 Python