一、關聯子查詢-查日期最新列
前天在工作中遇到一條非常有用的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) 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