疑難雜症 - SQL語句整理


一、關聯子查詢-查日期最新列

  前天在工作中遇到一條非常有用的SQL語句,想了好久愣是沒搞出來。今天將這個問題模擬出來:先看表

  

  需求是,對於每個人,僅顯示時間最新的那一條記錄。

  答案如下:

select * from record as a 
where not exists (select null from record as b where a.Name = b.Name and a.CreateTime < b.CreateTime)

  結果如下:

  

  這個問題的關鍵難點在於,既要去除重復,又要顯示多個列。這樣一來distinct就無效了,groupby又無效了。

  寫成上面的樣子,可能比較難看,但是寫成下面這個樣子應該就看得懂了:

select * from record as a 
where not exists 
(select * from record as b where a.Name = b.Name and b.CreateTime > a.CreateTime)

  整條SQL語句的意思可以描述為,查詢表a的數據,當名字相同且存在時間更加新的,則不要這條(一直排除到時間是最新的)。exists運算符,只關注子SQL有沒有結果集返回,因此在exists里select * 與 select null意義一樣,也就是說,如果名字相等,且有創建時間比較新的,則不要這條,直到最新的。

  sql查詢語句以select關鍵字開始,由各種字句組成。select語句的完整語法較復雜,常見的sql查詢語句的語法結構如下。

  關聯子查詢只是此問題的其中一個解法,更多的解決方案在這個地址有:http://www.cnblogs.com/kissdodog/p/3365789.html

二、distinct關鍵字用於聚合函數中

  distinct關鍵字也能夠用於聚合函數里面,意為在聚合之前將所有的重復行先排除,所以返回的結果會更少:

  select count(distinct person_name)

三、CASE...WHEN基於列的邏輯表達式

  關於這個東西,特別寫了篇文章,地址如下:http://www.cnblogs.com/kissdodog/p/3154371.html

  現在來寫個實例:先給出一張表:

    

    要求查出以下信息:

    

     SQL語句如下:

select Team,Rq, sum(case when winlose='' then 1 else 0 end) as 勝,sum(case when winlose='' then 1 else 0 end) asfrom test
group by Rq,Team
having Team = '曼聯'

     再來一個,一張表只有Id,Sex兩個字段,要求用一條SQL語句將Sex字段的'男'變'女','女'變'男'。

     

update table_1 
set sex = (case when sex='' then '' when sex='' then '' end)

    執行完SQL語句后,結果如下:

    

    再來一個有一張表,里面有3個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。

    SQL語句如下:

select Id,
    (case 
            when chinese >= 80 then '優秀' 
            when chinese >= 60 then '及格' 
            else  '不及格' 
    end) as 語文,
    (case 
            when math >= 80 then '優秀' 
            when math >= 60 then '及格' 
            else '不及格' 
    end) as 數學,
        (case 
            when english >= 80 then '優秀' 
            when english >= 60 then '及格' 
            else '不及格' 
    end) as 英語
from fenshu


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM