子查询(查询模型)
查询模型
列就是变量,在每一行上,列的值都在变化
where条件是表达式,在哪一行上表达式为真,哪一行就取出来,比如 下面的条件,shop_price 在不同的行
有不同的值,在哪一行时,shop_price>500 如果为真,则这一行就取出来
查询结果集在结构上可以当成表看
where的子查询
查询最新的商品
mysql> select goods_name,goods_id from goods where goods_id=(select max(goods_i )from goods); +------------+----------+ | goods_name | goods_id | +------------+----------+ | 诺基亚N85 | 32 | +------------+----------+
取出每个栏目下最大的goods_id 的商品
首先取到最大的goods_id
mysql> select max(goods_id),cat_id from goods -> group by cat_id; +---------------+--------+ | max(goods_id) | cat_id | +---------------+--------+ | 16 | 2 | | 32 | 3 | | 18 | 4 | | 23 | 5 | | 7 | 8 | | 6 | 11 | | 26 | 13 | | 30 | 14 | | 28 | 15 | +---------------+--------+
然后只要把 goods_id =16,32,33……28 这样的几条商品取出来
select goods_id,goods_name from goods where goods_id in(select max(goods_id) from goods group by cat_id);
where 型子查询注意点
如果where 列=(内层 sql),则内层sql返回的必是单行单列,单个值
如果where 列 in(内层 sql),则内层sql只能返回单列可以是多个行,但一定是单列
from 型子查询
即 内层sql查询的结果,当成一张临时表,供外层sql再次查询
典型题目
每个栏目下最新最贵的商品
select goods_id,cat_id,goods_name from goods order by cat_id asc,goods_id desc;
然后把上面的语句结果当做成一张表
select * from (select goods_id,cat_id,goods_name from goods order by cat_id asc,goods_id desc) as tmp group by cat_id;
其中 tmp为临时表名
exists 型 子查询
指把外层sql结果,拿到内层sql去测试,如果内层sql成立,则该行取出
例子:查出有商品的栏目