Mysql入门(七)之子查询

来源:互联网 发布:媒体播放器软件下载 编辑:程序博客网 时间:2024/05/12 10:46

子查询

子查询:sub query,查询是在某个查询结果之上进行的(一条select语句内部包含了另一条select语句)


子查询分类

子查询有两种分类方式:按位置分类;按结果分类

按位置分类:子查询(select语句)在外部查询(select语句)中出现的位置
            From子查询:子查询跟在from之后
            Where子查询:子查询跟在where条件中
            Exists子查询:子查询跟在exists里面

按结果分类:根据子查询得到的数据结果进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)
                  标量子查询:子查询得到的结果是一行一列
                  列子查询:子查询得到的结果是多行一列
                  行子查询:子查询得到的结果是一行多列(多行多列)
                              上面几个出现的位置都是在where之后
                  表子查询:子查询得到的结果是多行多列(出现的位置是在from之后)


标量子查询

需求:知道班级名字为php0710,想获取该班的所有学生

1.   确定数据源:获取所有的学生
Select*from my_student where c_id=?;
2.   获取班级id:可以通过班级名字确定
Select id from my_class where c_name='PHP0710';------id一定只有一个值(一行一列)



列子查询

需求:查询所有在读班级的学生(班级表中存在的班级)

1.   确定数据源:学生
Select*from my_student where c_id in(?);
2.   确定有效班级的id:所有班级id
Select id from my_class;


列子查询


列子查询返回的结果会比较:一列多行,需要使用in作为匹配条件匹配;其中mysql还有几个类似的条件:all,some,any
   肯定结果

   否定结果


行子查询

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

需求:要求查询整个学生中,年龄最大且身高是最高的学生。

1.  确定数据源
Select*from my_student where age=?and height=?;
2.确定最大年龄和最高的身高;
Select max(age),max(height)from my_student;

行子查询:需要构造行元素:行元素由多个字段构成


表子查询

表子查询:子查询返回的结果是多行多列的二维表;子查询返回的结果是当做二维表来使用

需求:找出每一个班最高的一个学生

1.   确定数据源:先将学生按照身高进行降序排序
Select*from my_student order by height dec;
2.   从每个班选出第一个学生
Select*from my_student group by c_id;---每个班选出第一个学生


表子查询:from子查询:得到的结果作为from的数据源


Exists子查询

exists:是否存在的意思,exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后:exists返回的结果只有0和1

需求:查询所有的学生:前提条件是班级存在
1.   确定数据源
Select*from my_student where ?;
2.   确定条件是否满足
Exists(Select*from my_class);----是否成立


0 0