2017-11-19MySQL三种子查询详解

您现在的位置是: 首页 > MySQL技术 > MySQL三种子查询详解

348次阅读

一、where型子查询


1. 查询最新的商品,以 goods_id 最大为最新

order by goods_id desc limit 1;

2. 不用 order by 如何做?

where goods_id=32;

3. 上条语句有何局限?

4. 查询最新商品的id(始终得到最大的 goods_id)

select max(goods_id) from goods;

5. 合并语句

select goods_id,goods_name from goods where goods_id=(select max(goods_id) from goods);

# where型子查询
# 内层的select 查询结果,放在了外层的查询条件里面;这种查询叫做where型子查询

6. 有了where型子查询,可以查询每个栏目下最新的商品

1)分组查询每个栏目下最大的 goods_id
select cat_id,max(goods_id) from goods group by cat_id;

2)合并
select goods_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cat_id);


二、from型子查询


1. sql的查询出的结果集看作一张表

select goods_id,goods_name,shop_price from goods where goods_id between 20 and 25;

以上sql输出的查询结果,也可以看成一个多行多列的表,针对这个查询出来的结果集,这个表,我们可以继续select

2. 这里可以用from型子查询,查出每个栏目下最新的商品

1)先按cat_id asc,goods_id desc排序
select goods_id,cat_id,goods_name from goods 
order by cat_id asc,goods_id desc;

2)合并
对上面sql语句查出的结果看作一张tmp表,这张表的每个栏目的第一行刚好是该栏目下goods_id 最大的一行
select goods_id,goods_name,cat_id 
from (select goods_id,cat_id,goods_name from goods 
order by cat_id asc,goods_id desc) as tmp group by cat_id

from型子查询:
先select 查询出结果集看作一张表,起一个别名,再在外层select这张临时表中的内容;对于外层是select,5中子句依旧可以使用


三、exists型子查询


题目:  查询所有有商品的栏目

1. 什么叫有商品的栏目 ? 以 cat_id=1 为例

select * from goods where cat_id=1;
以上 sql, 能查出内容 , 是不是就是该栏目下有商品

2. 查询栏目表

select * from category;

3. 合并

查看栏目表 , 看这个栏目表对应的商品是否存在

查询栏目表 , 如果该 cat_id 在 goods 表能查出内容 , 则该栏目下有商品

exists  存在的意思

select * from category where 
exists (select * from goods where category.cat_id=goods.cat_id);

 

MySQL三种子查询详解