mysql学习之三大子查询(where,from,exist)

     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就能找到数据了。


还需要好好努力啊!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值