子查询
Where型子查询: 指把内层查询的结果作为外层查询的比较条件.
典型题:查询最大商品,最贵商品
Where型子查询
如果 where 列=(内层sql),则内层sql返回的必是单行单列,单个值
如果 where 列 in (内层sql), 则内层sql只返回单列,可以多行.
From 型子查询: 把内层的查询结果当成临时表,供外层sql再次查询
典型题:查询每个栏目下的最新/最贵商品
Exists子查询 : 把外层的查询结果,拿到内层,看内层的查询是否成立.
典型题: 查询有商品的栏目
题目:查询出 每个栏目下id号最大(最新)的一条商品
错误方法:
方法一:where 子查询
得出每个栏目下最大的ID号 只要在goods 表里面查找 goods_id = 16,32,18,23的商品即可!
注意 :上图只有一个列 即只有一个变量,所以就是返回这个变量的所有值!!
如果select max(goods_id) ,cat_id from goods group by cat_id 选多了一个列的话
就不是单纯返回这个列的所有变量。也就不能直接 where goods_id in (select max()...) 了
所以,可以当上面的结果集作为一个 条件 这就是WHERE 子查询
方法二:FROM 子查询
利用mysql group by 时 如果查了多余的字段 会取第一个出现的值 这个特性 我们可以先把每个栏目里的goods_id 从大到小排列 ,group by 的时候就可以直接取出了
如果存在一张如上表,只要对如上表group一下,即可得到每个栏目goods_id最大的商品
假设存在这张表,表名叫 tmp
只需要对上面的结果集 当作一个表 再进行group by 就可以!
所以:结果集 可以当作一个表来查询!
方法三:左链接
把这个表作为左链接的左表
可以把上面的结果集作为一个临时表 来进行左链接 非常好!
左链接非常好用!!
EXISTS 子查询:
exists 存在,exists子查询
要求:查出有商品的栏目
后面的条件存在 就取出1