--創建表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中寫法出來的結果一樣的。這里有一個疑問希望各位大神幫忙解答一下,按照第一種寫法,這樣分組的寫法有錯誤嗎,錯在哪里,麻煩講解下。
uj5u.com熱心網友回復:
不好意思,寫錯了,主要是看寫法1,錯誤在哪里
uj5u.com熱心網友回復:
個人的想法,你在資料量小的時候1的執行效率比2要好,但是要資料量多的時候2卻好與1吧1是兩表組一表,然后進行分組,2是先從一張表里取數,再與另一張組合。
當資料量小的時候記憶體與CPU是足夠的,所以快
uj5u.com熱心網友回復:
兩種寫法都是對的。第二種理解起來更為自然。
從執行計劃上來講
第一個應該 走 HASH JOIN ,第二個走 NESTED LOOP
uj5u.com熱心網友回復:
您說的2種我還不懂。從group by的角度講,依據1個欄位和2個欄位分組結果集應該不是一樣的。請問第一種做法的思路對嗎,有好幾個類似的都是這種思路做的,我怕思路錯了就麻煩了。
uj5u.com熱心網友回復:
第二種,就是 先找出課程大于(等于)2的所有學號,再根據這些學號,去學生表中取出姓名和部門
uj5u.com熱心網友回復:
你可把第二個陳述句的子查詢單獨跑一下,看看什么效果;你可以生成一些資料,看著更清楚;
uj5u.com熱心網友回復:
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課的學生資訊?
uj5u.com熱心網友回復:
1和2的結果不一樣嗎?1group by s.s#,s.sd ,2group by s.s# 是不是原因出在這uj5u.com熱心網友回復:
是結果是一樣的,2種不同的分組理論上應該是存在差別的,但是實際結果為什么是一樣的
uj5u.com熱心網友回復:
第二個這個沒有問題,是很正常的嵌套,問題在于第一個,我的疑問是1group by s.s#,s.sd ,2group by s.s#應該是不同的,為什么結果一樣
uj5u.com熱心網友回復:
你先不要 group by ,只關聯一下兩張表,你觀察一下輸出結果,看看能不能理解了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/109194.html
標籤:基礎和管理
上一篇:關于資料庫的一道筆試題
