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);

结果

MySQL的子查询


建表

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 = "数学");

MySQL的子查询

需求二:找出每个人的最好成绩

1)按照姓名和分数来分组,并按照分数来排序

注意:这里如果姓名和分数都一样的话,就会省略掉,选择一行

select * 
from score
group by name,score
ORDER BY score desc;

结果

MySQL的子查询

2)把查出来的信息看作是一个新的表,再按照姓名来分组就会变成只取一行,也就是最高分的哪一行

注意:这里查出来的这个表必须取个别名,否则会出错(原因不详)

select * 
from(select * 
from score
group by name,score
ORDER BY score desc) as a
group by name;

结果

MySQL的子查询

 


 

小结

行子查询:指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。

列子查询:指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回。

表子查询:指子查询返回的结果集是 N 行 N 列的一个表数据。

都是通常情况下,可能也会有重复(比如:年龄一样都最大,身高都最高的两个运动员),我们不去研究,只学习这三种。