where子查询(内层的查询结果作为外层的比较条件)
假设一个商品表中有多种商品(catalog_id),每种商品上架都有时间先后。要查询每种商品下最新的商品名字和id。
先把问题简单化,我们只查询整个商品表中最新上架的那个商品的id和名字。可用:select goods_id,goods_name from goods order by goods_id desc limit 0,1;
把good_id降序排列,再用limit取一位。
上面的sql语句虽然可以实现,但是不推荐,原因是用到了order by排序。排序是非常耗费资源的行为,而且如果数据量非常大,速度会变慢。
那么,不使用order by该如何完成上面的查询呢?
我们选择where子查询。
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);
select max(goods_id) from goods子句返回的就是商品中最新的id。
这样我们再看一开始的问题就变得非常简单。
select goods_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cat_id);
因为子句查询的goods_id有多个,所以这里用in。
from子查询
from子查询相对简单,就是将子句看做一张表。
例如:select goods_id,cat_id,goods_name from (select * from goods where 1 order by cat_id asc,goods_id desc) as temp group by cat_id;(as temp就是将查到的 数据作为临时temp表)
exist子查询
要查询栏目下有商品的所有栏目的信息。
select * from category where exists(select * from goods where goods.cat_id=category.cat_id);
先判断子句是否成立,即商品表里的cat_id和栏目表里的cat_id是否相等,相等就代表这个栏目下有商品。如果有,就代表存在。用exists就能找到数据了。
还需要好好努力啊!