子查询
子查询将 前一步查询出来结果作为 下一个查询的条件,或者也可以作为下一个查询的临时表;
作为临时表
现在有一张学生表
查询学生表中数据 按照id 升序排序,取最后5行内容。
经过分析发现:
最后5行数据
要取这5行数据,用到语法时limit
思路
先找到最后5行数据, order by id desc limit 5;
select * from students order by id desc limit 5;
找到最后5行数据,但是显示的方式的方式不对。期望时升序显示;将上面的结果 作为 一张临时表。 使用 as 关键字 起一个别名, 名称随意。
基本使用语法如下:
select * from () as tmp
- as tmp 作为临时表
- () 要放入具体的有结果的数据
select * from (select * from students order by id desc limit 5) as tmp
对临时表在进行升序排序;
select * from (select * from students order by id desc limit 5) as tmp
order by id;
作为查询条件
查询 heros 表中 2015年度上架时间最晚的英雄信息。
分析问题
使用 where 条件过滤出所有的2015年的英雄;
select * from heros where birthdate like "2015%";
使用排序 针对 birthdate 倒序 找到最晚的时间;
select birthdate from heros where birthdate like "2015%" order by birthdate desc limit 1;
时间已经确定,只需要根据时间找当天上架的英雄即可;
select * from heros where
birthdate = (select birthdate from heros where birthdate like "2015%" order by birthdate desc limit 1);
将查询出来的结果作为查询条件来处理;
-- 查询heros 中 hp_max 值最大的英雄信息;
-- 1. 找到最大 hp_max
SELECT hp_max from heros ORDER BY hp_max desc limit 1;
-- 2. 根据 hp_max 找人
select * from heros WHERE hp_max = (SELECT hp_max from heros ORDER BY hp_max desc limit 1);
— 查询heros 中 hp_max 值最小的英雄信息;
-- 1. 找到hp_max 的最小值
select hp_max from heros order by hp_max limit 1;
-- 2. 根据值去找英雄
select * from heros where hp_max = (select hp_max from heros order by hp_max limit 1);