--创建表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中写法出来的结果一样的。这里有一个疑问希望各位大神帮忙解答一下,按照第一种写法,这样分组的写法有错误吗,错在哪里,麻烦讲解下。
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中写法出来的结果一样的。这里有一个疑问希望各位大神帮忙解答一下,按照第一种写法,这样分组的写法有错误吗,错在哪里,麻烦讲解下。
解决方案 »
- expdp/impdp导出导入时日志文件不全的问题
- 如何将dmp文件导入到sqlserver2005中
- SQL语句写法
- 这个存储过程怎么了??救命啊。
- 请教8i移植到10g查询速度变慢的问题
- 同时更新一张表的两个字段该怎么写?
- 求一简单sql,100分酬谢!:-)
- 下列触发器出现错误“行号= 3 列号= 6 错误文本= PLS-00103: 出现“DROP”需要在下列之一时:。。。。”这样的错误?请问怎样修改?
- 請用pb + oracle 開發的朋友談談臨時表的使用經驗!
- About to_date()
- Plsqldeveloper r 7.1.5.1398连接Oracle 10g问题
- 为什么我的数据库显示的汉子全是问号?
第一个应该 走 HASH JOIN ,第二个走 NESTED LOOP
您说的2种我还不懂。从group by的角度讲,依据1个字段和2个字段分组结果集应该不是一样的。请问第一种做法的思路对吗,有好几个类似的都是这种思路做的,我怕思路错了就麻烦了。
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课的学生信息?
第二个这个没有问题,是很正常的嵌套,问题在于第一个,我的疑问是1group by s.s#,s.sd ,2group by s.s#应该是不同的,为什么结果一样
第二个这个没有问题,是很正常的嵌套,问题在于第一个,我的疑问是1group by s.s#,s.sd ,2group by s.s#应该是不同的,为什么结果一样你先不要 group by ,只关联一下两张表,你观察一下输出结果,看看能不能理解了。