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 Show Profile
Apr 05 MySQL
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
mysql优化之query_cache_limit参数说明
Jul 01 MySQL
MySQL系列之三 基础篇
Jul 02 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
教你如何让spark sql写mysql的时候支持update操作
Feb 15 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 MySQL
Mysql 一主多从的部署
May 20 MySQL
MySQL 语句执行顺序举例解析
Jun 05 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
PHP 编程安全性小结
2010/01/08 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
js实现分割上传大文件
2016/03/09 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
详解jquery和vue对比
2019/04/16 jQuery
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
详解详解Python中writelines()方法的使用
2015/05/25 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
python读取Excel实例详解
2018/08/17 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
pandas.cut具体使用总结
2019/06/24 Python
Python3 使用pillow库生成随机验证码
2019/08/26 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
实习自荐信
2013/10/13 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
2014年妇联工作总结
2014/11/21 职场文书
催款通知书范文
2015/04/17 职场文书
小学生读书笔记范文
2015/06/30 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers