子查询

子查询将 前一步查询出来结果作为 下一个查询的条件,或者也可以作为下一个查询的临时表;

作为临时表

现在有一张学生表
image.png
查询学生表中数据 按照id 升序排序,取最后5行内容。
经过分析发现:
最后5行数据
image.png
要取这5行数据,用到语法时limit

思路

  1. 先找到最后5行数据, order by id desc limit 5;

    1. select * from students order by id desc limit 5;

    image.png
    找到最后5行数据,但是显示的方式的方式不对。期望时升序显示;

  2. 将上面的结果 作为 一张临时表。 使用 as 关键字 起一个别名, 名称随意。

基本使用语法如下:

  1. select * from () as tmp
  • as tmp 作为临时表
  • () 要放入具体的有结果的数据
  1. select * from (select * from students order by id desc limit 5) as tmp

对临时表在进行升序排序;

  1. select * from (select * from students order by id desc limit 5) as tmp
  2. order by id;

image.png

作为查询条件

image.png
查询 heros 表中 2015年度上架时间最晚的英雄信息。

分析问题

  1. 使用 where 条件过滤出所有的2015年的英雄;

    1. select * from heros where birthdate like "2015%";
  2. 使用排序 针对 birthdate 倒序 找到最晚的时间;

    1. select birthdate from heros where birthdate like "2015%" order by birthdate desc limit 1;

    image.png

  3. 时间已经确定,只需要根据时间找当天上架的英雄即可;

    1. select * from heros where
    2. birthdate = (select birthdate from heros where birthdate like "2015%" order by birthdate desc limit 1);

    image.png
    将查询出来的结果作为查询条件来处理;


  1. -- 查询heros hp_max 值最大的英雄信息;
  2. -- 1. 找到最大 hp_max
  3. SELECT hp_max from heros ORDER BY hp_max desc limit 1;
  4. -- 2. 根据 hp_max 找人
  5. select * from heros WHERE hp_max = (SELECT hp_max from heros ORDER BY hp_max desc limit 1);

— 查询heros 中 hp_max 值最小的英雄信息;

  1. -- 1. 找到hp_max 的最小值
  2. select hp_max from heros order by hp_max limit 1;
  3. -- 2. 根据值去找英雄
  4. select * from heros where hp_max = (select hp_max from heros order by hp_max limit 1);