Mysql的三种子查询

create table stu (name varchar(10),class varchar(10),score tinyint);

insert stu
(name,class,score)
values
("zhangsan","shuxue",50),
("zhangsan","dili",40),
("zhangsan","shuxue",90),
("lisi","yuwen",55),
("lisi","zhengzhi",45),
("wangwu","zhengzhi",30);


1.where型子查询:把内层查询的结果当作外层的比较条件

select * from stu where score = (select max(score) from stu);
查询每个学生成绩最高的一门
select * from stu where score in (select max(score) from stu group by name);

2.from型子查询:把内层的查询结果当成临时表,供外层sql再次查询

查询每个学生成绩最高的一门
(1)先把表中的数据按照成绩排序
	select * from stu order by name asc,score desc;
(2)然后把上次的查询结果作为一个临时表,再去查询
	select * from (select * from stu order by name asc,score desc) as tmp group by name;

3.exists型子查询:把外层的查询结果,拿到内层的查询是否成立

查询有商品的栏目
select * from tableA where exists(select * from tableB where tableB.tmp = tableA.tmp);

4.

查询挂科两门及以上同学的平均分
(1)先把挂科两门以上的同学找出来
	select name from (select name,count(*) as gk from stu where score < 60 group by name having gk >=2) as tmp;
(2)在根据查出的同学求平均分
	select name,avg(score) from stu where name in (select name from (select name,count(*) as gk from stu where score < 60 group         by name having gk >=2) as tmp) group by name;





猜你喜欢

转载自blog.csdn.net/hk_jy/article/details/80429474
今日推荐