前天在工做中遇到一條很是有用的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
distinct關鍵字也可以用於聚合函數裏面,意爲在聚合以前將全部的重複行先排除,因此返回的結果會更少:數學
select count(distinct person_name)
關於這個東西,特別寫了篇文章,地址以下: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