15621857753

mysql子查询:标量子 列子 行子 表子 Exists子

来源:齐鲁CMS 栏目:Mysql 阅读: 日期:2024-09-28

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

38.子查询:sub query

按功能分:

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

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

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

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

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

按位置分:

Where 子查询:子查词出现的位置在where条件中

From 子查询:子查询出现的位置在from数据源中(做数据源)

1)标量子查询:结果只有一个值

基本语法:

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='小猪';)

2)列子查询:

基本语法:主查询 where 条件 in(列子查询);

案例:

想获取已经有学生在班的所有班级名字

解析:

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

-- >select name from my_class where class_id in (select class_id from my_student);

3)行子查询:

基本语法:

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

案例:

获取班级上年龄最大,且身高最高的学生

解析:

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

-- >select * from my_student where (stu_age,stu_height) = (select max(stu_age),max(stu_height) from my_student); // where后面紧跟的换号是构造行元素,max后面的是子查询得到一个行多字段

4)表子查询

语法:

SELECT 字段表 form (表子查询) AS 别名 [where][GROUP BY][HAVING][ORDER BY][limit];

注意:from后面必须带表名,所以这里要有别名

案例:

获取每个班上最高身高的学生(一个)

解析:

1、每个班最高的学生排在最前面:ORDER BY  2、再针对结果进行GROUP by: 保留每组第一个

-- >SELECT * FROM (SELECT * FROM my_student ORDER BY stu_height DESC) AS temp GROUP BY class_id;

5)Exists 子查询

基本语法:

where exists(查询语句);

exists就是根据查询得到的结果进行判断:如果结果存在,那么返回1,否则返回0

案例:求出,有学生在的所有班级

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