萤火小屋

优律的知识库

  • 首页
  • 归档
  • 分类
  • 标签
  • 留言
  • 关于

  • 搜索
消息队列 RabbitMQ Redis 双指针 力扣 动态代理 Git YAML SpringBoot SpringMVC 回溯算法 分治算法 归并排序 快排 手撕 事务 MySQL索引 MySQL 小技巧 Spring Framework Spring 动态规划 Linux Android 贪心算法 操作系统 进程调度模拟 IPv6 数据库 计算机组成原理 计算机基础 栈 Java 静态路由 路由器 交换机 数字通信 网络工程 计算机网络 Web http 大学学习技巧 程序设计 算法

MySQL所有的关联查询

发表于 2021-03-12 | 分类于 MySQL | 0 | 阅读次数 292

1 连接查询

在查询数据时,需要多张表的数据一起显示,这就用到连接查询

1.1 内联查询

可以连接多个表进行查询,按照指定条件将从左表查询出的数据和右表查询出的数据一一对比,相同则保留,即取交集。
关键字:inner join和on,on后边编写条件。

SELECT user.username, organization.orgname
FROM user
inner join organization
on user.organization = organization.orgid;

学生表:user
image.png

学校表:organization
image.png

内联查询结果
image.png

1.2 外联查询

以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行对比: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留;不能匹配,该表的字段都置空NULL。

1.2.1 左查询

以左表为主,取出里面的所有记录, 然后每条与右表进行对比: 不管能不能匹配上条件,右表最终都会保留: 能匹配,正确保留;不能匹配,该表的字段都置空NULL。
关键字:left join和on

SELECT user.username, organization.orgname
FROM user
left join organization
on user.organization = organization.orgid;

左联查询结果

image.png

1.2.2 右查询

以右表为主,取出里面的所有记录, 然后每条与左表进行对比: 不管能不能匹配上条件,左表最终都会保留: 能匹配,正确保留;不能匹配,该表的字段都置空NULL。
关键字:right join和on

SELECT user.username, organization.orgname
FROM user
right join organization
on user.organization = organization.orgid;

右联查询结果

image.png

2 联合查询

联合查询结果是将多个select语句的查询结果合并到一起
关键字:
union distinct 去重
union all 不去重,全部显示
union 去重的简写
注意:两张表字段需要相同,并且order by关键字不允许出现两次,如果想多次使用order by它只有在子句的子句中出现在有效。

SELECT user.username FROM user
union all
SELECT user.username FROM user

联合查询结果

image.png

可以看出user表被打印了两次

3 子查询

子查询也叫嵌套查询,子查询可以使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重使用!

3.1 使用in关键字的子查询

使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较
如果某行的特定列的值存在,则在select语句的查询结果中就包含这一行。

查询用户组为2的所有用户:

SELECT userid, username, usergroup, lastlogin
FROM user
WHERE usergroup in
(SELECT user.usergroup
FROM user
WHERE user.usergroup = 2);

查询结果

image.png

3.2 使用比较运算符的子查询

如果可以确定子查询返回的结果只包含一个单值,那么可以直接使用比较运算符连接子查询。
经常使用的比较运算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。

用户细节表:userdetail

image.png

查询年龄小于userid为2的用户的年龄的用户:

SELECT * FROM userdetail
WHERE age <
(SELECT age
FROM userdetail
WHERE userid = 2);

查询结果

image.png

3.3 使用exists关键字的子查询

exists子查询是用来判断某些条件是否满足的(跨表),exists是接在where之后的,并且它的返回的结果只有0和1。

SELECT user.username, userdetail.age, userdetail.sex
FROM user
inner join userdetail
on user.userid = userdetail.userid
where EXISTS
(SELECT * FROM userdetail where age > 22);

当userdetail表中有年龄大于22的数据时,打印内联的全表

查询结果:

image.png

3.4 使用any关键字的子查询

any关键字表示满足其中的任意一个条件。使用any关键字时,只要满足内层查询语句结果的的任意一个数据,就可以通过该条件来执行外层查询语句。

SELECT user.username, userdetail.age, userdetail.sex
FROM user
inner join userdetail
on user.userid = userdetail.userid
where userdetail.age > any
(SELECT userdetail.age FROM userdetail where age < 19);

内层查询:查询所有年龄小于19的数据。
外层查询:如果外层查询大于任意一个内层查询结果则将其输出。

查询结果:

image.png

3.5 使用all关键字的子查询

all和any是相反的,all关键字表示必须满足所有结果。使用all关键字,要满足内层查询语句数据的所有结果才可以通过该条件来执行外层查询语句。

我们把上一个sql语句中的any换成all看看会有什么结果

SELECT user.username, userdetail.age, userdetail.sex
FROM user
inner join userdetail
on user.userid = userdetail.userid
where userdetail.age > all
(SELECT userdetail.age FROM userdetail where age < 19);

查询结果:

image.png

可以发现最小年龄是19岁,和上一个查询结果相比少了个18岁的结果。



  • 本文章撰写参考自这里
# 数据库 # MySQL
牛客NC7题-买卖股票的最好时机(一次交易)题解分析
MySQL数据库的索引
  • 文章目录
  • 站点概览
优律

优律

优律的知识库

83 日志
20 分类
44 标签
E-mail Twitter Instagram
Links
  • CZLisyx - 浮生志
  • Vedfolnir
0%
© 2019 — 2023 萤火小屋——优律的博客网站
网站已勉强运行 
Halo博客系统技术支持