--创建表s,c,sc,s#是 学号, sn 名字,sd 单位,sa 年龄 ;c#是课程编号,cn 课程名;g 分数
create table s(
s# integer primary key,
sn varchar2(10),
sd varchar2(10),
sa integer
);create table c(
c# integer primary key,
cn varchar2(10)
);create table sc(
s# integer,
c# integer,
g number(3,1),
primary key (s#,c#)
);
insert into s values(23,'zhangsan','腾讯',26);
insert into s values(24,'lisi','阿里',26);
insert into s values(25,'wangwu','腾讯',28);
insert into s values(26,'Bob',null,29);
insert into c values(1,'会计学');
insert into c values(2,'税收基础');
insert into c values(3,'统计学');
insert into sc values(23,1,85.5);
insert into sc values(23,2,90);
insert into sc values(23,3,78);
insert into sc values(24,1,80);
insert into sc values(24,3,95);
insert into sc values(25,1,90);
insert into sc values(25,2,84);
insert into sc values(26,2,70);
insert into sc values(26,3,87);--找出选修课程超过2的学生学号和单位
--1
select s.s#,s.sd from sc inner join s on sc.s#=s.s# 
group by s.s#,s.sd having count(sc.c#)>2;
--2
select s.s#,s.sd from s where s.s# in (select sc.s# from sc group by sc.s# having count(sc.c#)> 2);虽然2中写法出来的结果一样的。这里有一个疑问希望各位大神帮忙解答一下,按照第一种写法,这样分组的写法有错误吗,错在哪里,麻烦讲解下。

解决方案 »

  1.   

    个人的想法,你在数据量小的时候1的执行效率比2要好,但是要数据量多的时候2却好与1吧1是两表组一表,然后进行分组,2是先从一张表里取数,再与另一张组合。当数据量小的时候内存与CPU是足够的,所以快
      

  2.   

    两种写法都是对的。第二种理解起来更为自然。 从执行计划上来讲 
    第一个应该 走 HASH JOIN ,第二个走 NESTED LOOP
      

  3.   


    您说的2种我还不懂。从group by的角度讲,依据1个字段和2个字段分组结果集应该不是一样的。请问第一种做法的思路对吗,有好几个类似的都是这种思路做的,我怕思路错了就麻烦了。
      

  4.   

    select s.s#,s.sd from s where s.s# in (select sc.s# from sc group by sc.s# having count(sc.c#)> 2);1、先执行
    select sc.s# from sc group by sc.s# having count(sc.c#)> 2
    2、找到选课多于2科的学号
    3、select s.s#,s.sd from s where s.s# in (第一步的集合)
    4、筛选出选课大于2课的学生信息?
      

  5.   

    1和2的结果不一样吗?1group by s.s#,s.sd ,2group by s.s#  是不是原因出在这
      

  6.   


    第二个这个没有问题,是很正常的嵌套,问题在于第一个,我的疑问是1group by s.s#,s.sd ,2group by s.s#应该是不同的,为什么结果一样
      

  7.   


    第二个这个没有问题,是很正常的嵌套,问题在于第一个,我的疑问是1group by s.s#,s.sd ,2group by s.s#应该是不同的,为什么结果一样你先不要 group by ,只关联一下两张表,你观察一下输出结果,看看能不能理解了。