疑難雜症 - SQL語句整理

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

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

  

  需求是,對於每一個人,僅顯示時間最新的那一條記錄。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)

  結果以下:spa

  

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

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

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意義同樣,也就是說,若是名字相等,且有建立時間比較新的,則不要這條,直到最新的。htm

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

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

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

  distinct關鍵字也可以用於聚合函數裏面,意爲在聚合以前將全部的重複行先排除,因此返回的結果會更少:數學

  select count(distinct person_name)

3、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) as 負
from 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
複製代碼
相關文章
相關標籤/搜索