04-01-子查询

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

子查询

什么是子查询

子查询概念

子查询:sub query

子查询是一种常用的计算机语言SELECT-SQL语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时,称之为子查询

通俗来讲就是:在一条select语句中,嵌入了另外一条select语句,那么被嵌入的select语句称之为子查询语句。

主查询概念

主要的查询对象,第一条select语句,确定了用户所有获取的数据目标(数据源),已经要具体得到的字段信息

子查询和主查询的关系

  1. 子查询是嵌入到主查询的
  2. 子查询是辅助主查询的:要么作为条件,要么作为数据源
  3. 子查询可以独立存在:是一条完整的select语句

子查询分类

按功能分

  • 标量子查询:子查询返回的结果是一个数据(一行一列)
  • 列子查询:子查询返回的结果是一列(一列多行)
  • 行子查询:子查询返回的结果是一行(一行多列)
  • 表子查询:子查询返回的结果是多行多列
  • exists子查询:子查询返回的结果是0或者1(类似布尔操作)

按位置分

  • where子查询:子查询的位置出现在where条件中
  • from子查询:子查询的位置出现在from数据源中

标量子查询

概念

子查询返回的结果是一个数据(一行一列)

语法

select * from 数据源 where 判断条件 =/<> (select 字段名 from 数据源 where 判断条件); //子查询得到的结果只有一个值

测试案例

需求:知道一个学生的名字 想知道他在哪个班级(班级的名字)

分析:

1.通过学生表获取他所在班级id

2.根据班级id获取班级名字

通过标量子查询实现

select * from my_class where class_id = (select class_id from my_student where stu_name='小猪');

在这里插入图片描述

列子查询

概念

子查询返回的结果是一列(一列多行)

语法

主查询 where 条件 in(列子查询)

测试案例

需求:获取已经有学生在班的所有班级名字

分析:

  1. 找出学生表中所有的班级id
  2. 找出班级表中对应的名字

通过列子查询实现

select name from my_class where class_id in (select distinct class_id from my_student);

在这里插入图片描述

行子查询

概念

子查询返回的结果是一行(一行多列)

行元素

字段元素是指一个字段对应的值,行元素对应的就是多个字段:多个字段合起来作为一个元素参与运算,把这种情况称之为行元素

语法

主查询 where 条件[(构造一个行元素)]=(行子查询);

测试案例

需求:获取班级上年龄最大且身高最高的学生

分析:

  1. 求出班级年龄最大的值
  2. 求出班级身高最高的值
  3. 求出对应的学生

通过行子查询实现

select * from my_student where (stu_age,stu_height)=(select max(stu_age),max(stu_height) from my_student);

在这里插入图片描述

总结

对于标量子查询、列子查询、行子查询都属于where子查询

表子查询

概念

子查询返回的结果是多行多列(一行一列),表子查询和行子查询非常相似,只是行子查询需要产生行元素而表子查询没有。

行子查询用于where子查询,而表子查询用于from子查询

语法

select 字段列表 from (表子查询) as 别名 [where] [group by] [having] [order by] [limit];

exists子查询

概念

子查询返回的结果是0或者1(类似布尔操作)

语法

where exists (子查询)

测试案例

需求:求出有学生在的所有班级

select * from my_class as c where exists (select * from my_student as s where s.class_id=c.class_id);

在这里插入图片描述

子查询特定关键字的使用

in

主查询 where 条件 in(列子查询);

any

任意一个

  1. =any(列子查询):条件在查询结果中有任意一个匹配即可,等价于in

    1 =any(1,2,3)true

在这里插入图片描述

  1. <>any(列子查询):条件在查询结果中不等于任意一个

    1 <>any(1,2,3)true

some

any完全一样:

all

  1. =all(列子查询):等于里面所有

  2. <>all(列子查询):不等于其中所有

猜你喜欢

转载自blog.csdn.net/lucky9322/article/details/85774853
今日推荐