MySQL的子查询
建表
create table player( id int not null auto_increment primary key, name varchar(20) not null, age int not null, height int not null ); insert into player values (default,"保罗",32,183), (default,"詹姆斯",34,206), (default,"库里",30,198), (default,"哈登",30,192), (default,"威少",32,194), (default,"利拉德",28,183);
需求:查询出年龄最大,身高最高的运动员
1)挑选出最大的年龄
方案一:
select age from player order by age desc limit 0,1;
方案二:
select max(age) from player
2)同理选出最高的身高
和上面一致
3)挑出同时满足这两个条件的数据
select * from player where age=(select age from player order by age desc limit 0,1) and height=(select height from player order by height desc limit 0,1);
结果
建表
create table score( id int not null auto_increment primary key, name varchar(20) not null, major varchar(20) not null, score int not null ); insert into score values (default,"张三","语文",84), (default,"李四","语文",65), (default,"王五","语文",77), (default,"小刘","语文",54); insert into score values (default,"张三","数学",26), (default,"李四","数学",74), (default,"王五","数学",44), (default,"小刘","数学",30); insert into score values (default,"张三","英语",65), (default,"李四","英语",74), (default,"王五","英语",54), (default,"小刘","英语",70);
需求一:查询出"语文"和"数学"都不及格的学生
1)首先查出分数小于60并且科目为"数学"的学生
select name from score WHERE score<60 and major = "数学";
2)查分数小于60并且科目为"语文"的学生,姓名是在数学那组中的用关键字in
select name from score WHERE score<60 and major = "语文" and name in(select name from score WHERE score<60 and major = "数学");
需求二:找出每个人的最好成绩
1)按照姓名和分数来分组,并按照分数来排序
注意:这里如果姓名和分数都一样的话,就会省略掉,选择一行
select * from score group by name,score ORDER BY score desc;
结果
2)把查出来的信息看作是一个新的表,再按照姓名来分组就会变成只取一行,也就是最高分的哪一行
注意:这里查出来的这个表必须取个别名,否则会出错(原因不详)
select * from(select * from score group by name,score ORDER BY score desc) as a group by name;
结果
小结
行子查询:指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。
列子查询:指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回。
表子查询:指子查询返回的结果集是 N 行 N 列的一个表数据。
都是通常情况下,可能也会有重复(比如:年龄一样都最大,身高都最高的两个运动员),我们不去研究,只学习这三种。