2014-02-14 24 views
1

我想弄清楚如何正確使用FROM。所以,讓我們舉個例子我有一個表像這樣:SQL正確使用AND和FROM

STUDENT(*snum: integer,sname: string,deptid:integer,slevel:string,age:integer)  
ENROLLED(*snum:integer, *cname: string)  

我試圖計算了在一類是21歲以下的在校生人數任何人都可以解釋爲什麼它返回0 ?我想我正在做的是看一個註冊,然後比較類名和我正在尋找的類。然後我檢查是否有一個學生正在參加該課程,如果有的話我會檢查年齡是否低於21歲。任何人都可以解釋我做錯了什麼嗎?

SELECT COUNT(*) 
FROM 
    ENROLLED e, 
    STUDENT s 
WHERE 
    e.cname='ENG101' 
    AND e.snum=s.snum 
    AND s.age < 21; 

示例數據: 插入到登記的值(1234, 'ENG400'); 插入STUDENT值(1234,'T.Banks',3,'SR',18);

+3

也許沒有21歲以下的學生參加ENG101課程。 –

+0

查詢看起來沒問題。你可以發佈每個表格的數據樣本來證明問題嗎?如果可以,請在http://sqlfiddle.com上設置它 –

+0

如果沒有看到數據,這是無法回答的。查詢看起來相對較好(儘管這種連接方式在實踐中幾乎從未使用過),但根據這些標準,數據中可能沒有學生。 – syrion

回答

1

我將採取不同的編寫查詢:

SELECT 
    COUNT(*) EnrolledStudents 
FROM 
    ENROLLED e 
    INNER JOIN 
    STUDENT s 
    ON 
     e.snum = s.snum 
WHERE 
    e.cname = 'ENG101' 
    AND 
    s.age < 21; 

也許試試這個,看看是否在您的語句之一是造成問題:

SELECT 
    e.cname, 
    s.age, 
    COUNT(*) EnrolledStudents 
FROM 
    ENROLLED e 
    INNER JOIN 
    STUDENT s 
    ON 
     e.snum = s.snum 
GROUP BY 
    e.cname, 
    s.age; 

我的賭注是,雖然無論是'ENG101'不正確或ENG101 <中沒有學生年齡段21.

0

我認爲您必須首先使用「INNER JOIN」,如上面的註釋。事實上,SQL將首先處理JOIN,並使用where條件作爲過濾器在連接表中選擇適當的行。所以「A.id = B.id條件下的A連接B」與「where條件和A.id = B.id」有很大不同,第一個條件在哪裏失敗並且不需要做別人。

+0

我認爲你錯了。在內部連接中,這些是相同的。在外部聯接中,是的,它有所不同。 –

+0

@ElectricLlama謝謝您的好意提醒,我的城市已經很晚了,我明天會檢查一下。 – linpingta