数据库(学习笔记三)--------子查询(where、from、exists)

良好的理解:
where 表达式  , 把表达式放在行中看是否成立
列 理解成变量,可以进行运算
取出结果可以理解成一张临时表



---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


子查询
where
查询最贵商品;where构造的是条件
from
查询每个栏目下最新和最贵商品;from构造的是表
exists
查询所有商品的栏目;



----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
where型:

        where子查询:把内层查询的结果,作为外层查询的比较条件。



#查询出最新的商品,id最大为最新
select goods_id , goods_name from goods order by goods_id desc limit 1;
结果为goods_id为33的行

#如果不使用order by 可以使用:
select goods_id, goods_name from goods where goods_id = 33;
//结果是正确的,但是因为把id写死了,所以在数据扩展方面不对。因此可以进行合并,先取id再去整个行
select max<goods_id> from goods;
select goods_id, goods_name from goods where goods_id = <select max<goods_id> from goods;>;



#查出每个栏目下最贵的商品
select goods_id ,goods_name ,cat_id,shop_price from goods where shop_price in < select max<shop_price> from goods group by cat_id>;
#查询每个栏目下最新的产品,id号最大为最新
select goods_id , goods_name,cat_id from where cat_id in <select max<goods_id> from goods group by cat_id>;


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
From型

        From子查询:把内层的查询结果当做外层的临时表,供外层sql再次查询


#用from查出每个栏目下最新的商品
select * from <select goods_id ,goods_name,cat_id from goods order by cat_id asc,goods_price desc> as tmp group by cat_id;
 
#用where和from子查询得到了挂科两门或者两门以上平均的同学。
select name, avg(mark) from test where name in (select name from (select name,count(*) as hk from test where mark<=60 group by name having hk>=2 ) as tmp) group by name;
//最内层select,得到挂科在2门以及两门以上的同学的名字和hk列(hk为挂科总数)
//往外一层的select,是得到最内层查询的表的那列name列
//最外层select是根据两次select筛选出了符合条件的name,通过这个名字输出相应的平均分。


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


exists查询:


exists:把外层的查询结果拿到内层,看内层查询是否成立

#查询有商品的栏目:
#我们有两个表格,一个为category是cat_id,cat_name,cat_name;一个为goods表,包含goods_name,goods_id,cat_id,shop_price列
#当我们要查询在category表中,那些个cat_id在goods中也存在。
select cat_id ,cat_name from category where exists<select * from goods.cat_id = category.cat_id>;
//相当于把category表中的每个行取出,去goods表中找是否了两个cat_id一样的,一样该category中的行就要,否则就不要


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


总结:














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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值