leetcode sql做題筆記二 中級篇

中等難度一共14題

1.574.?Winning Candidate

join問題 找出出現頻率最高的闲孤,然后連接表找出對應的值; 如果不用subquery的In的話可以直接join select好的另一個表

select Name from Candidate join (select CandidateId from Vote group by CandidateId order by count(*) desc limit 1) as winner on Candidate.id=winner.CandidateId

如果想寫的更簡單一點,連join都不用:SELECT Name FROM Candidate WHERE Id = (SELECT CandidateId FROM Vote GROUP BY CandidateId ORDER BY COUNT(id) DESC LIMIT 1) 直接用=號

2.180. Consecutive Numbers 連續(xù)出現問題

select l1.Num as 'ConsecutiveNums' from Logs as l1, Logs as l2, Logs as l3 where l1.Id=l2.Id-1 and l2.Id=l3.Id-1 and l1.Num=l2.Num and l2.Num=l3.Num

這題的trick在于光這樣寫是不夠的烤礁,還要加上distinct讼积, 因為重復出現三次的三張表中也肯能重復出現比如如果都是1,那∩2次會出現多個1脚仔,所以一定要記得加上distinct

即?select distinct l1.Num as 'ConsecutiveNums'……

3.Nth Highest Salary第幾高問題勤众,記得我們在初級題里做過第二高的問題,當時有用orderby然后limit做,同理

解法1:CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT

BEGIN

declare m int;

set m=N-1;

? RETURN (

? ? ? select distinct salary as 'getNthHighestSalary(N)' from Employee order by Salary desc limit m,1

);

END

解法2:

CREATE FUNCTION getNthHighestSalary(@N INT) RETURNS INT AS?

BEGIN SET@N = @N-1;

?RETURN(

ISNULL((SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC OFFSET @NROWS FETCH NEXT 1 ROWS ONLY),NULL) );

END

這里我們學習一下sql中如何寫函數鲤脏,以及過程中的變量怎么設:

{首先们颜,mysql變量的種類:

用戶變量:以"@"開始,形式為"@變量名"猎醇。用戶變量跟mysql客戶端是綁定的窥突,設置的變量,只對當前用戶使用的客戶端生效

全局變量:定義時硫嘶,以如下兩種形式出現阻问,set GLOBAL 變量名? 或者? set @@global.變量名,對所有客戶端生效沦疾。只有具有super權限才可以設置全局變量

會話變量:只對連接的客戶端有效则拷。

局部變量:作用范圍在begin到end語句塊之間。在該語句塊里設置的變量曹鸠。declare語句專門用于定義局部變量。set語句是設置不同類型的變量斥铺,包括會話變量和全局變量彻桃。

局部變量與用戶變量的區(qū)分在于兩點:1.用戶變量是以"@"開頭的。局部變量沒有這個符號晾蜘。2.定義變量不同邻眷。用戶變量使用set語句眠屎,局部變量使用declare語句定義 3.作用范圍。局部變量只在begin-end語句塊之間有效肆饶。在begin-end語句塊運行完之后改衩,局部變量就消失了。

所以驯镊,最后它們之間的層次關系是:變量包括局部變量和用戶變量葫督。用戶變量包括會話變量和全局變量。}

怎么用sql寫函數呢板惑?標準模式:

Create function 函數名(參數)

Returns 返回值數據類型

[with {Encryption | Schemabinding }]

[as]

begin

SQL語句(必須有return 變量或值)

End

http://www.cnblogs.com/lideng/archive/2013/04/15/3022418.html 這個博客說sql函數的建立和調用說的挺好的

4.178.?Rank Scores 排序并添加序號問題: 思路是 先去重 排序橄镜, 再和原表join

https://blog.csdn.net/pashine/article/details/78919055 這篇文章講的很清晰

select Scores.Score, s1.Rank from Scores left join (select Score, (@i:=@i+1)as rank from (select distinct Score from Scores) as s, (select @i:=0)as xh order by Score desc) as s1 on s1.Score=Scores.Score order by Score desc

5.184.?Department Highest Salary分組求每組最大值問題 用group by 和In 而且先排序再group的話會自動取到第一條(只用group的話只會取到第一條)

select d.Name as Department, e.name as Employee, max(Salary) as Salary from Employee as e join Department as d on e.DepartmentId=d.Id group by Department

或者

SELECT

? ? Department.name AS 'Department',

? ? Employee.name AS 'Employee',

? ? Salary

FROM

? ? Employee

? ? ? ? JOIN

? ? Department ON Employee.DepartmentId = Department.Id

WHERE

? ? (Employee.DepartmentId , Salary) IN

? ? (? SELECT

? ? ? ? ? ? DepartmentId, MAX(Salary)

? ? ? ? FROM

? ? ? ? ? ? Employee

? ? ? ? GROUP BY DepartmentId

? ? )

;記得用兩個變量in的時候要加括號!冯乘!

6.614.?Second Degree Follower 求二度聯系人 自join的問題

可以這么做 用in

select followee as follower, count(*) as num from follow where followee in (select follower from follow where follower in (select followee from follow)) group by followee

或者 自join

select second_followee as 'follower', count(*) from (select f1.follower as second_followee, f2.follower as second_follower from follow f1, follow f2 where f1.follower=f2.followee) as f group by follower

7.578.?Get Highest Answer Rate Question 善用order by 將query寫的簡潔一些

注意null是不計算在count以內的 善用if 函數 if(條件洽胶,條件為真值,條件不為真值)

簡潔版:SELECT

? ? question_id AS 'survey_log'

FROM

? ? survey_log

GROUP BY question_id

ORDER BY COUNT(answer_id) / COUNT(IF(action = 'show', 1, 0)) DESC

LIMIT 1;

累贅版:select question_id as survey_log from (select question_id, 2*sum(answer_var)/count(*) as answer_rate from (select question_id, case when answer_id is not null then 1

? ? else 0

? ? end as answer_var from survey_log) as s group by question_id order by answer_rate desc limit 1) as s1

8.580.?Count Student Number in Departments 又是一個分組計數+join

一個是注意join的時候用left join裆馒, 一個是注意不要把null count 進去所以不能用count(*),而是count 某一列,還有注意不要忘了order

select dept_name, count(student_name)as student_number from (select dept_name, student_name from department as d left join student as s on s.dept_id=d.dept_id)as ds group by dept_name order by student_number desc, dept_name

9.585.?Investments in 2016

10.602.?Friend Requests II: Who Has the Most Friends 這題用union

11.

12.

13.

14.

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末姊氓,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子喷好,更是在濱河造成了極大的恐慌翔横,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绒窑,死亡現場離奇詭異棕孙,居然都是意外死亡,警方通過查閱死者的電腦和手機些膨,發(fā)現死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門蟀俊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人订雾,你說我怎么就攤上這事肢预。” “怎么了洼哎?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵烫映,是天一觀的道長。 經常有香客問我噩峦,道長锭沟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任识补,我火速辦了婚禮族淮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己祝辣,他們只是感情好贴妻,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝙斜,像睡著了一般名惩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孕荠,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天娩鹉,我揣著相機與錄音,去河邊找鬼岛琼。 笑死底循,一個胖子當著我的面吹牛,可吹牛的內容都是我干的槐瑞。 我是一名探鬼主播熙涤,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼困檩!你這毒婦竟也來了祠挫?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤悼沿,失蹤者是張志新(化名)和其女友劉穎等舔,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體糟趾,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡慌植,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了义郑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝶柿。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖非驮,靈堂內的尸體忽然破棺而出交汤,到底是詐尸還是另有隱情,我是刑警寧澤劫笙,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布芙扎,位于F島的核電站,受9級特大地震影響填大,放射性物質發(fā)生泄漏戒洼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一允华、第九天 我趴在偏房一處隱蔽的房頂上張望施逾。 院中可真熱鬧敷矫,春花似錦、人聲如沸汉额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠕搜。三九已至,卻和暖如春收壕,著一層夾襖步出監(jiān)牢的瞬間妓灌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工蜜宪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虫埂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓圃验,卻偏偏與公主長得像掉伏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子澳窑,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容