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