MySQL中连接查询和子查询的问题


Posted in MySQL onSeptember 04, 2021

多表连接的基本语法

多表连接,就是将几张表拼接为一张表,然后进行查询

select 字段1, 字段2, ...
from 表1 {inner|lift|right} join 表2
on 连接条件;

有如下两张表:部门表和员工表

MySQL中连接查询和子查询的问题

MySQL中连接查询和子查询的问题

交叉连接和笛卡尔积现象

交叉连接

交叉连接,又名无条件内连接/笛卡尔连接

第一张表种的每一项会和另一张表的每一项依次组合

select * from employee,department;

MySQL中连接查询和子查询的问题

上述结果肯定不是我们想晓得的,左表中每一个人都有4个部门,仔细观察这4条记录,正好是左表每一条记录和右表一一匹配后的结果。

笛卡尔积现象

MySQL中连接查询和子查询的问题

笛卡尔积现象产生的原因:两张表没有有效的连接条件。既然你没有连接条件,本表中的第一行肯定是能和另外表中的所有行进行一一匹配,同理,本表中的第二行肯定是能和另外表中的所有行进行一一匹配,以此类推,本表中的最后一行m也可以和另外表中的所有行进行一一匹配。若另外一张表有n行,那么最后显示的行数,肯定就是m*n行了。

如果不想产生笛卡尔积现象,就需要添加有效的表连接条件。拿上述例子来说,左表dep_id只有和右表id相等时,才代表他们的部门。

内连接

内连接(INNER JOIN)是找几张表的交集,即根据条件筛选出来正确的结果。

select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp INNER JOIN department as dep
on emp.dep_id=dep.id;

MySQL中连接查询和子查询的问题

由于部门表中没有id=5的部门,所以员工表dep_id=5的这条记录没有返回;而由于行政部没有员工,所以这条记录也没返回。

外连接

左外连接

左连接(left join)是以左表为准,如果右表中没有合适的记录,用NULL补全;其本质是在内连接的基础上增加左表有结果而右表没有的记录(内连接时,这种情况的记录会忽略)。

select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp left join department as dep
on emp.dep_id=dep.id;

MySQL中连接查询和子查询的问题

右外连接

跟左连接正好相反,右连接(right join)是以右表为准,如果左表中某些字段没有合适的结果,用NULL补全;其本质是在内连接的基础上增加右表有结果而左表没有的记录(内连接时,这种情况的记录会忽略)。

select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp right join department as dep
on emp.dep_id=dep.id;

MySQL中连接查询和子查询的问题

全外连接

全外连接,在内连接的基础上,展示左右表的所有的记录,而左右表中缺省记录以NULL补全。

MySQL中并没有全外连接的FULL JOIN语法,而是借助UNION/UNION ALL语句实现。

UNIONUNION ALL的区别,UNION具有去重功能。

select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp left join department as dep
on emp.dep_id=dep.id
union
select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp right join department as dep
on emp.dep_id=dep.id;

MySQL中连接查询和子查询的问题

子查询

  • 子查询是将一个查询语句嵌套再另一个查询语句中的查询方式:
  • 子查询的内层查询结果,可以作为外层查询语句提供查询条件。
  • 子查询中可以包含INNOT INANDALLEXISTSNOT EXISTS等关键字。

子查询中还可以包含比较运算符,如=!=><等。

-- 查询平均年龄在20以上的部门名称
select name
from department
where id in (
select dep_id
from employee
group by dep_id
having avg(age) > 20);

-- 查询财务部员工姓名
select name 
from employee
where dep_id in (
select id 
from department 
where name='财务部');


-- 查询所有大于平均年龄的员工的年龄和姓名
select name,age 
from employee 
where age > (
select avg(age) from employee);

MySQL中连接查询和子查询的问题

到此这篇关于MySQL中连接查询和子查询的问题的文章就介绍到这了,更多相关MySQL连接查询和子查询内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
Mysql MVCC机制原理详解
Apr 20 MySQL
教你解决往mysql数据库中存入汉字报错的方法
May 06 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
MySQL 1130异常,无法远程登录解决方案详解
Aug 23 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
mysql配置SSL证书登录的实现
MySQL约束超详解
Sep 04 #MySQL
MySQL中的隐藏列的具体查看
Sep 04 #MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 #MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 #MySQL
MySQL8.0的WITH查询详情
Aug 30 #MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 #MySQL
You might like
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
vue项目接口域名动态获取操作
2020/08/13 Javascript
用python读写excel的方法
2014/11/18 Python
Python循环语句中else的用法总结
2016/09/11 Python
Python正则表达式使用范例分享
2016/12/04 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
python动态视频下载器的实现方法
2019/09/16 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
销售经理工作职责范文
2013/12/03 职场文书
幼儿园教师节活动方案
2014/02/02 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
新郎婚礼致辞
2015/07/27 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
PHP新手指南
2021/04/01 PHP
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript