1. 程式人生 > >2018.8.9SQL資料庫學習筆記

2018.8.9SQL資料庫學習筆記

今天將leetcode上19道資料庫的題刷完了 明天做什麼暫時還沒有明確計劃

 

對於搜尋最大並不困難,只需要max(項)即可,對於搜尋第二大項,就需要搜尋max(項) 以及 該項小於max(項)

select max(項) from where 項 < max(項)(176.第二高的薪水)

 

改變思路,從複雜的更換名字變為更換ID。判斷id是奇數還是偶數,除此以外奇數時判斷id是否為最大id,使用case when when else語句即可作好更換,隨後利用count計數再用order by重新排序即可(626.換座位)

 

語法上面有點新奇,需要先用一個count(distinct)語句來消除分數的並列,隨後使用score與單個score對比進行排名,最後使用order by語句重新排序(178.分數排名)

 

由於連續出現三次因此採用表例項化,例項化為三個一樣的表,後兩個表ID平移一位和兩位,最後三個表同一位ID數字進行對比,如果一樣則複合,除此以外還需要使用distinct語句來消去重複出現的數字(180.連續出現的數字)

 

比較有趣的函式編寫題目 order by語句後的擴充套件(177.第N高的薪水)

 

這道題有點神奇,使用datediff語句比較難消去一些錯誤的例子,於是選擇使用date_add語句會遇到測試案例報錯,報錯的地點是5月底和6月初的跨度,按道理時間函式是不會有這個錯誤的,隨後看到題目的下方寫著

Note:
每天只有一行記錄,日期隨著 id 的增加而增加。

於是把利用date作判斷改為使用id作判斷,簡單非常多(601.體育館的人流量)

 

這道題有幾個新的知識點,包括使用round函式來保留小數,還有inner join實現篩選表中符合條件項的需求,最後還用了between and篩選日期區間

關於inner join與前面left join等好幾個的差異可以看這個連結,採用了文氏圖的畫法使得結果非常直觀

圖解SQL的inner join、left join、right join、full outer join、union、union all的區別(262.行程和使用者)

 

select d.name as department,e.name as employee,e.salary
from department d,employee e
where e.departmentid = d.id and e.salary = (select max(salary) from employee where departmentid=d.id)

where裡面的幾個篩選語句要考慮好(184.部門工資最高的員工)

 

這道題跟262其實挺像的,在184的基礎上where語句稍作修改即可

(select count(distinct salary) from employee where departmentid=d.id and salary>e.salary)<3

(185.部門工資前三高的員工)