您的位置:首页 > 数据库 > MySQL

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

2019-01-20 23:12 1576 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33322074/article/details/86563579

一、什么是子查询

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

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

 我们的查询步骤是:

  1. 先找出代课天数最多的天数,
  2. 然后将这个天数保作为一个变量保存起来,
  3. 再来一个查询老师信息的语句,并将保存起来的天数作为查询条件。

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

mysql的子查询

二、子查询分类

子查询可以分为两大类:

  1. 按子查询的位置分类
  2. 按子查询的返回形式分类

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

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

子查询的返回类型

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

1、标量子查询

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

2、列子查询

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

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

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

  1. in :表示在集合中。
  2. not in :表示不在集合中。且等同于!=all.(不属于集合中的任何内容)。
  3. some 等同于in
  4. any :集合中的任何一个。
  5. != any :表示只要与集合中的任何一个不相等即可。
  6. all :集合中的所有元素。
  7. !=all:  表示不属于集合中的任何内容。

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

 3、行子查询

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

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

即:

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

4、表子查询

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

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

5、exists子查询

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

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

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: