MySQL燕十八老师课程笔记:第十一课:子查询

# 查出本网站最新的(goods_id)最大的一条商品
# 思路:按goods_id desc排序,再取第一行
select goods_id,goods_name from goods
order by goods_id desc limit 0,1;
# 查出本网站最新的(goods_id)最大的一条商品
# 要求:不允许用排序!!

select goods_id,goods_name from goods 
where goods_id = 33;
#(这个做法中的33是用子查询的结果当条件)不具备通用性。
# 增加或删除了一条商品,则最大的goods_id就不是33了。
# 查出最大的goods_id
select max(goods_id) from goods;
# 因此这个题的完整解法为:
$max_id = select max(goods_id) from goods;
select goods_id,goods_name from goods
where goods_id = $max_id;

# 或者不用临时变量:
select goods_id,goods_name from goods
where goods_id = (select max(goods_id)from goods);

where 型子查询:把内层查询出的结果作为外层查询的比较条件。
典型题:查询最大商品、最贵商品等。

# 用where型子查询,查询“每个栏目下,goods_id最大的商品”

# 第一步:查出每个栏目下,最大的goods_id
select max(goods_id),cat_id from goods group by cat_id;

# 第二步:只需再把上面取出的相应goods_id对应的商品取出即可。
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条件就是表达式,在哪一行上表达式为真,哪一行就取出来。
比如下面的条件:

shop_price > 5000;

shop_price在不同的行,有不同的值。在哪一行时,shop_price>5000如果为真,则这行取出来
查询结果集——在结构上,可以看作一张表!

from 型子查询:即内层sql的查询结果,当成一张临时表,共外层sql继续查询。

# from型子查询,查询每个栏目下,goods_id最大的商品

select goods_id,cat_id,goods_name from goods
order by cat_id asc,goods_id desc;
# 这个语句的查询结果,刚好是每个cat_id下的goods_id由大到小排列,
# 因此只需将结果再group by 一下:
select goods_id,cat_id,goods_name from 
 (select goods_id,cat_id,goods_name from goods
 order by cat_id asc, goods_id desc) as tmp 
 group by cat_id limit 9999;

exists型子查询:是指把外层sql的结果,拿到内层sql去测试,如果内层sql成立,则该行取出。

# 要求:查出有商品的栏目
# 先重新创建一张表:
create table category(
cat_id auto_increment primary key,
cat_name varchar(20) not null default''
)engine myisam charset utf8;

在这里插入图片描述

# 观察商品表与栏目的关系
select count(*),cat_id from goods group by cat_id;

在这里插入图片描述
说明第1、6、12号栏目下,有栏目,但没有商品。

# 别把14个栏目都取出来,只把下面有商品的栏目取出来
# 取 栏目表,且只取下面有商品的栏目。
# 思考:什么样的表,叫做下面有商品?
# 答: 设某栏目cat_id 为N,则select * from goods where cat_id = N;
#      这句话能取出数据,则说明该栏目有商品,否则没有商品
select cat_id,cat_name from category 
where exists (select * from goods where goods.cat_id=category.cat_id);

理解exists那句话:先在category里,cat_id=1,带入goods表里:
select * from goods where cat_id = 1; 结果为empty,因此不存在,1栏目下没有商品,就不取。
往后同理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值