標籤:

MYSQL——Leetcode 刷題(免費版)

MYSQL——Leetcode 刷題(免費版)

來自專欄 數據實踐筆記

在上一篇的文章中我們接觸了 SQL 一些常用的技能,包括他的語法、關鍵詞、函數等,沒有看的可以點擊鏈接進入——SQL入個門,修行在個人。學會了技能之後就要去打怪升級,LeetCode 就是一個不錯的選擇,而且現在有了 LeetCode 中文版 (www.leetcode-cn.com),入門更簡單了。LeetCode 上面的題目分為付費版和免費版,在難度等級上面有簡單、中等和困難三種,可以先去刷免費版的簡單、中等、困難,如果刷完感覺意猶未盡可以去英文版裡面刷付費的(中文版裡面暫時還沒有付費題目)。今天這篇文章提供免費版簡單和中等難度題的答案和思路。

EASY

一、組合兩個表

答案:

關鍵點:

PersonId 是 Person 表的主鍵,但不是 Address 表的主鍵,同時要滿足無論 person 是否有地址信息,都要返回 person 的四個信息,所以這裡用 left join 表關聯。

二、第二高薪水

答案:

關鍵點:

1、只輸出一個數字結果,要用 Distinct 去重。

2、查詢第二高的 Salary,order by 要降序,同時結合 limit 函數就可以獲得結果,這裡也可以加上 offset 得到結果。

3、沒有結果則返回 FULL,IFNULL 的用法。

三、超過經理收入的員工

答案:

關鍵點:

同一張表裡的信息做關聯,需要把一張表二次使用做關聯再比較。

四、尋找重複的電子郵箱

答案:

關鍵點:

先對每個郵箱出現的次數計數,然後用 having 函數過濾掉不符合條件的 Email 作為一張新的表,再選取 Email 即可。

五、從不訂購的用戶

答案:

關鍵點:

NOT IN 的用法。

六、刪除重複的郵件

答案:

關鍵點:

這裡提供了兩種方法,一種是先篩選出 id 較大的郵箱然後刪除,另一種方法是直接選取 id 較小的 Email。

七、上升的溫度

答案:

關鍵點:

1、同一個表裡的數據做對比,需要將一張表關聯使用兩次。

2、計算兩個時間之間的天數,需要用到函數 Datediff。

八、大的國家

答案:

關鍵點:

OR 的運用。

九、超過 5 名學生的課

答案:

關鍵點:

分組計數然後過濾篩選。

十、有趣的電影

答案:

關鍵點:

mod 函數的運用,!= 運算符的使用,排序。

十一、交換工資

答案:

關鍵點:

使用更新查詢(update)和 case 語句

MEDIUM

一、第 N 高的薪水

答案:

關鍵點:

這題和之前的第 2 高薪水類似,只需要把 2 變成一個變數即可,創建函數的方式完成。limit 中直接寫 N-1 會報錯,所以用 SET 對 N 重新定義。

二、分數排名

答案:

關鍵點:

主要思路是對於每一個分數,找出表中有多少個大於或者等於該分數的不同分數,然後降序排列即可。比如 3.65,表裡大於等於 3.65 的數字分別是 4、3.85 和 3.65,所以它的排名是 3。

三、連續出現的數字

答案:

關鍵點:

連續出現至少三次,所以需要比較 Num 的 Id 是三個連續的,然後 Num 相等即可。

四、部門最高工資

答案:

關鍵點:

先關聯兩張表得到部門和該部門的最高工資,然後最為新表去關聯 Employee 就可得到數據。

五、換座位

答案:

關鍵點:

開始的時候我的想法是保持 id 不變,然後把一張表 left join 他本身,一個 id 不變,一個 id-1,但是發現這樣操作不是很方便,然後採取 student 保持不變,去改變 id,用 case 語句就可以實現。第一個 when 表示偶數的 id-1,第二個 when 表示最大的數如果是計數則不變,最後的 else 表示 id+1,即非最大奇數的 id+1。

這裡把難度為 EASY 和 MEDIUM 的 16 道免費題全部搞定了,小夥伴要是有更好的解決思路歡迎指導。還有三題難度為 HARD,如果小夥伴有興趣的話可以自己去試一下。


推薦閱讀:

大家設計資料庫時使用外鍵嗎?
MySQL鎖之源碼探索
mysql: 事務的隔離級別
分散式系統架構實戰--簡易版支付系統怎麼部署?
黃河之水天上來,數據之源資料庫——SQL

TAG:MySQL | SQL | LeetCode |