2012-05-01 38 views
0

我有以下表和數據:Screenshot of the data hereNOT IN邏輯運算符如何生成此輸出?

course: 
course#  ctitle    units 
--------- ------------------- ----- 
ACCT 201 Financial Account  3 
CHEM 356 Organic Chemistry  4 
HIST 101 US History    5 
MINS 235 Database Design  4 
MINS 301 Intro to Business IS 3 
MINS 350 Systems Analysis  4 
PHED 434 Advanced Gym   2 

class: 
class# course#  sec# semyr 
------ ---------- ----- ----- 
203  ACCT 201  03 F11 
204  ACCT 201  04 F11 
307  MINS 301  07 F11 
418  MINS 235  04 F11 
438  MINS 350  01 F11 
624  PHED 434  02 F11 

student: 
sid sname  major 
--- ---------- ---------- 
1 Bob  MINS 
2 Mary  POMG 
3 Joe  MGMT 
4 Sue  MKTG 
5 Jim  ACCT 

class_student: 
class sid grade 
----- ---- ----- 
203  2  B 
203  5  D 
204  1  C 
204  4  C 
307  1  B 
307  2  B 
307  4  A 
418  1  A 
418  2  B 
418  5  C 
438  1  B 
438  4  C 
634  5  F 

grade: 
grade grade_pts 
----- --------- 
    A  4 
    B  3 
    C  2 
    D  1 
    F  0 

當我運行以下查詢:

SELECT  * 
FROM  STUDENT 
WHERE  SID NOT IN 
      ( SELECT SID 
       FROM CLASS_STUDENT 
       WHERE GRADE IN ('A' , 'B') 
      ) 
ORDER BY SID; 

我認爲甲骨文會產生這樣的輸出。

sid sname major 
--- ----- ----- 
1 bob mins 
4 sue mktg 
5 jim acct 
5 jim acct 
5 jim acct 

我想了解NOT IN邏輯運算符是如何工作的。 NOT IN運算符如何在上述查詢中生成輸出?

+0

是這個家庭作業?如果是這樣,那麼它應該被標記爲 – Taryn

+0

Sql是有效的,並且如果要求所有那些因爲他們的專業獲得了C或更低的學生,那麼它是正確的。不要因爲它而生氣,IN不是很棒,IN不是更糟。 –

回答

1
SELECT SID FROM CLASS_STUDENT WHERE GRADE IN ('A' , 'B') 

將選擇具有A,B等級的學生的sid。 將導致SID

SID 
2 
1 
2 
4 
1 
2 
1 

的名單,然後

SELECT * FROM STUDENT 
WHERE SID NOT IN ... 

將導致:

SID  sname  Major 
3  joe   mgmt 
5  jim   acct 
3

它返回的成績比B差。

NOT IN過濾出您在此之後定義的內容。

在口頭上:

選擇所有學生,但並不是說有成績AB

+0

太棒了!感謝您的幫助,相同的行也會被選中?或者甲骨文將這些問題排除在外? –

+0

@ user1368186:否。它會選擇與您的'student'表中不匹配子選擇的所有條目。由於你的學生表沒有任何重複,因此沒有選擇。 –

1

子查詢(SELECT SID FROM CLASS_STUDENT WHERE GRADE IN ('A' , 'B'))將選擇在有A或B級全體學生的SID的那些至少一個班級。當與IN運算符一起使用時,該列表將被隱式重複數據刪除。在您的數據中出現的情況是,學生1,2,4在至少一個班級中都有A或B,因此將包含在此子查詢的結果集中。

然後,完整查詢只需選擇STUDENT中未包含在子查詢返回的列表中的所有行。所以我認爲你會得到兩排,SID爲3和5.

你的「預期結果」沒什麼意義。當您的查詢選擇所有學生然後篩選出某些內容時,沒有理由期望同一個學生有多行。

您的查詢所做的是顯示至少有一個班級沒有A或B成績的學生。我懷疑你想要顯示每個班級比B更差的學生班級組合(這與你的預期結果相符)。爲此,我建議將查詢從CLASS_STUDENT表中刪除,並加入STUDENT以獲取學生信息(並且如果需要,也許可以通過CLASSCOURSE獲取課程的名稱)。

+0

謝謝,我很難理解這個概念。所以,在這種情況下,預期的結果將是sid 5 jim和acct。 –