mysql 子表是否包含,mysql学习九之子查询包含子查询的分类,标量子查询,列子查询,行子查询,表子查询以及exists子查询...

版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_33322074/article/details/86563579

一、什么是子查询

首先,有很多问题无法通过一次性查询就能将结果查询出来

例如:要查询代课天数最多的老师信息

我们的查询步骤是:

先找出代课天数最多的天数,

然后将这个天数保作为一个变量保存起来,

再来一个查询老师信息的语句,并将保存起来的天数作为查询条件。

这就是子查询存在的意义。也就是说一个查询问题中包含两个查询语句。

c5e0507ea1593705fe1b4fce5bc9660d.jpg

mysql的子查询

二、子查询分类

子查询可以分为两大类:

按子查询的位置分类

按子查询的返回形式分类

首先先看子查询的返回形式:

子查询返回形式有:单一值(标量),一列,多列(行),多行多列(表)。

25f884c7286dc084a7e8c24e6e64ab71

子查询的返回类型

按出现的位置可分为:where型,where后;from型,from后;exists型。

a7d29e16a8247ad4b0afd206e9fc3d45.jpg

1、标量子查询

489ca6107d50e233cce6dfbe36bae2dd.jpg

标量子查询的使用​​​​

2、列子查询

列子查询和标量子查询的步骤几乎相同,不同点是列子查询返回的不是一个值,而是一列(注意,就是一列,即多个行的一列值)也叫做一个集合。然后再从这个集合中查找信息。

这里面牵涉一个问题,既然列子查询返回的不是一个值,而是一个集合,那么就要用到集合的运算符。常用的集合运算符有:

in ,not in ,some ,not some ,any ,all,!=all,

in :表示在集合中。

not in :表示不在集合中。且等同于!=all.(不属于集合中的任何内容)。

some 等同于in

any :集合中的任何一个。

!= any :表示只要与集合中的任何一个不相等即可。

all :集合中的所有元素。

!=all:  表示不属于集合中的任何内容。

总结:any 、some和all与in的区别就是前者可以使用除 =,!=,之外的运算符,而in只有in,和not in 。

f4893f6239f3fb6bdbf3ecd949f30ff0.jpg

3、行子查询

行子查询意思是:返回一行,所谓行,至少有两列组合在一起,并且只有一行,如果超过了两行就是表。因此还需有个关键词限制。即:limit 1;

此外返回了一行,需要接收,需要判断。那么就需要一个括弧,这个括弧包含返回行里的字段。然后用运算符判断。作为条件语句。

即:

57e793cc90f5069e44a286f2ae6ba245.jpg

阴影处的括弧,就是子查询中返回的行。

4、表子查询

表子查询是用在from子句内,from子句内要求使用一个表,而能是一个结果。可以给这个查询结果起名,别名。用as语法。例如:

174fd234986e5b4cec56ec939adc645c.jpg

利用as temp,让子查询得到的表称作temp表。然后外部查询在通过这个新生成的表查询所要的值。注意:外部查询所用的列明是子查询指定的。例如:子查询将t_name改为teacher。外部查询要查询t_name就要不能写这个,而应该写teacher。因为外部查询的对象是子查询得到的新表。

5、exists子查询

Exists(subquery)判断依据:如果子查询可以返回数据,则认为exists表达式返回真。否则,返回假。

8879da2f628286c92a555c60c645cb9f.jpg

由上图可见,Exists子查询可以通过其他查询代替。两种方法的结果相同,但是两者的解决思路是不同的。

5ff479880c700f2b095b32c80f495b15.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值