(13)where 、from、exists型子查询

一、where型的子查询:把内层查询的结果作为外层查询的比较条件
子句是个单值或者单值的集合,作为外层的查询条件
(子查询内层不能用order by,order by只能对最终结果排序)

//查询最大的id 

select max(goods_id)from goods;

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

//用where型子查询,查出每个栏目下的最新商品
select max(goods_id) from goods group by cata;(得到的是种类和最大goods_id的值集合)

select goods_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cata);(再通过id查询相应的商品名称)


//查询每个栏目下最贵的商品

select max(shop_price)from goods group by cata;(根据组找到最贵商品列表值)


select cata,goods_id,goods_name,shop_price from goods where shop_price in(select max(shop_price)from goods group by cata);

二、from 型子查询:把内存的查询结果当成临时表(必须写别名),供外层sql再次查询

若group by 时,选出时,没有写聚合函数,则只取每组的第一个元素


//查询每个栏目下最贵的商品

select max(shop_price)from goods group by cata;(根据组找到最贵商品列表值)


select cata,goods_id,goods_name,shop_price from goods where shop_price in(select max(shop_price)from goods group by cata);

select * from (select goods_id,cata,goods_name from goods order by cata asc,goods_id desc)as tmp group by cata;


//查询不及格数目>=2的同学的平均分,用子查询,先获取所有学生不及格数目总和,以stu_name为组,所以可以有stu_name字段,然后聚合函数随意
select * from (select stu_name,sum(grade<60)as failnum,avg(grade)as avgGrade from student group by stu_name)as tmp where failnum>=2;
表在12A的最后

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

//假定还有一个种类表,用于存放种类的cata_id和cat_name,有些种类是没有相对应的商品的,它就是具体的某种商品,
有些有种类有很多商品
种类是goods表的外键,

//查询所有包含子商品的所有种类
select cat_id,cat_name from catagory where exists (select * from goods where goods.cat_id=catagory.cat_id);
它的执行过程是,先查看第一行元素,并且取出,将cat_id放入内层,找到该种类对应的商品,但是exists并不返回查询的任何数据,
只返回是不是有种类对应的商品,false或者true,若true(有商品),则返回外层catalog对应的记录,若false,说明不包含
对应的商品,所以不会输出

select cat_id,cat_name from catagory where exists(select * from goods);
//因为内层的select * from goods永远成立,所以能够查询到所有记录
posted @ 2017-08-12 23:20  测试开发分享站  阅读(189)  评论(0编辑  收藏  举报