站长学院
CMS建站教程 SEO优化攻略
来源:齐鲁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);