【轉】一個SQL查詢出每門課程的成績都大於80的學生姓名

name   kecheng    fenshu
張三     語文     81
張三     數學     75
李四     語文     76
李四     數學     90
王五     語文     81
王五     數學     100
王五     英語     90this

方法一:spa

  思路:若是能得到一張表,由學生姓名,語文成績,數學成績,英語成績的表,剩下的就是在WHERE條件中篩選及能夠得到想要的結果。code

  具體辦法:經過自鏈接的辦法,以「姓名」爲鏈接條件,自鏈接三次,即可以得到包含又姓名和三門課程成績的數據行。雖然能夠獲得想要的數據列。但會有不少冗餘重複列!blog

  點評:此方法是根據題目,依題解題,中規中矩! 不過多張錶鏈接很是耗費時間。並且SQL語句也比較複雜,須要注意事項不少。數學

  

複製代碼
SELECT  D.name  FROM ( SELECT S.name,S.score AS ITEM1,S1.score AS ITEM2,S2.score AS ITEM3 FROM Student S inner join Student S1 on S.name = S1.name and S.course <> S1.course inner join Student S2 on S.name = S2.name and S.course <> S2.course WHERE S.score>=80 and S1.score>=80 and S2.score>=80 ) D GROUP BY D.name 
複製代碼

  易錯點:內表的 score字段必需要取別名,不然會報錯 。it


 

  方法二:class

  思路:採用逆向思惟想一想。。。。。。求三門成績都大於80的人,也能夠是使先查出有成績小於80 的人,再除去這些人不就是三門成績都大於80的人了麼?  之前學過的數學邏輯逆向思惟還真是有用的阿!!cli

  具體辦法:先掃描表,查出有成績小於80的人的姓名,而後再次掃描表,用not in 或not exists 方法。方法

  點評:此方法採用逆向思惟,能快速寫出高效且簡單的 SQL語句。im

複製代碼
//not in SELECT DISTINCT A.name FROM Student A WHERE A.name not in( SELECT Distinct S.name FROM Student S WHERE S.score <80) //not exists SELECT DISTINCT A.name From Student A where not exists (SELECT 1 From Student S Where S.score <80 AND S.name =A.name) /*exists 詳解 取出 外表第一條數據 ,而後與內表 根據鏈接條件 , 造成一條或多條數據,判斷這些生成的數據中是否存在 或者是不存在符合where條件的 。結果爲ture的那條外表 記錄舊被查詢出來! 實例過程: 取出外表的第一條記錄, 和內表經過姓名條件鏈接,這時候產生2兩記錄, 根據 not exists是判斷不存在。 條件是 score<80 . 而這兩條記錄存在一條記錄小於80,因此於not exists 不符合, 該條記錄不被查出。 */
複製代碼

 


 

  方法三:

SELECT S.name FROM Student S GROUP BY S.name Having MIN(S.score)>=80
相關文章
相關標籤/搜索