SQL練習(xí):輕輕松松,1(中等)+2(較難)
↑↑↑關(guān)注后"星標(biāo)"簡說Python
人人都可以簡單入門Python、爬蟲、數(shù)據(jù)分析 簡說Python推薦 題目來源:??途W(wǎng)
解答:老表
大家好,我是老表,sql刷題繼續(xù)更新啦,后面每次遇到
大家好,我是老表,sql刷題繼續(xù)更新啦,后面每次遇到困難題后就更新。
今天更新3道題,1(中等)+2(較難)。
SQL22 統(tǒng)計(jì)各個部門的工資記錄數(shù)(中等) SQL23 對所有員工的薪水按照salary降序進(jìn)行1-N的排名(較難) SQL24 獲取所有非manager員工當(dāng)前的薪水情況(較難)
SQL22 統(tǒng)計(jì)各個部門的工資記錄數(shù)


我的思路: 需求搞清楚,就蠻簡單了,先將部門員工表和薪水表連接,然后通過部門編號分組,計(jì)算數(shù)據(jù)條數(shù),可以得出每個部門對應(yīng)的薪水記錄數(shù),然后和部門表連起來,即可獲取對應(yīng)的部門名稱了。
我的題解:
select a1.dept_no, b1.dept_name, a1.sum
from (
select a.dept_no, count(a.emp_no) as sum
from dept_emp as a
join salaries as b
on a.emp_no = b.emp_no
group by a.dept_no) as a1, departments as b1
where a1.dept_no = b1.dept_no
;
涉及知識點(diǎn):
完整sql執(zhí)行順序(每天看一遍,不信記不?。?/section>
from -> where -> group by -> having -> select -> order by -> limit
窗口函數(shù)count計(jì)算分組內(nèi)數(shù)據(jù)條數(shù) group by 分組
提交結(jié)果:
SQL23 對所有員工的薪水按照salary降序進(jìn)行1-N的排名

我的思路: 這里正好用到之前講的窗口函數(shù)dense_rank。按題目示例我們知道,需要輸出的是按薪水降序排序,生成新的一列排序序號,相同薪水排序序號相同,且按照emp_no升序排列。
因?yàn)樽鲞@題前一天才看了窗口函數(shù)相關(guān)內(nèi)容,所以馬上想到dense_rank,可以計(jì)算排序,相同位次一樣,如:
數(shù)值:23 23 24 25
排序:1 1 2 3
我的題解:
select emp_no, salary, dense_rank() over(order by salary desc) as t_rank
from salaries
order by t_rank,emp_no;
涉及知識點(diǎn):
完整sql執(zhí)行順序(每天看一遍,不信記不?。?/section>
from -> where -> group by -> having -> select -> order by -> limit
窗口函數(shù) dense_rank() over(order by salary desc) 順便提一下:rank() 會跳位,比如還是上面的例子,排序會變成:1 1 3 4 順便提一下:row_number() 直接為位置序號,比如還是上面的例子,排序會變成:1 2 3 4
提交結(jié)果:
其他題解:
有點(diǎn)算法的意思了,下回給大家分析下,也歡迎大家評論區(qū)說說自己的看法。
SQL24 獲取所有非manager員工當(dāng)前的薪水情況



我的思路: 和之前的題目很相像,越往后會發(fā)現(xiàn),給的表越來越多,信息還是一樣,需求也一樣,這樣也更符合數(shù)據(jù)庫范式。這里我直接從dept_emp和salaries中取出所需數(shù)據(jù),去除部門經(jīng)理即可,類似把現(xiàn)在的散表合并成之前的寬表,這里沒有用到employees表,根據(jù)需求確實(shí)不需要。
我的題解:
-- employees 員工信息表
-- dept_emp 部門員工關(guān)系表
-- dept_manager 部門經(jīng)理信息表
-- salaries 員工薪水表
select a.dept_no, a.emp_no, b.salary
from dept_emp as a,salaries as b
where a.emp_no not in (select emp_no from dept_manager)
and a.to_date = '9999-01-01'
and a.emp_no = b.emp_no
;
涉及知識點(diǎn):
完整sql執(zhí)行順序(每天看一遍,不信記不?。?/section>
from -> where -> group by -> having -> select -> order by -> limit
not in 判斷元素是否在集合內(nèi)
提交結(jié)果:
題目地址:https://www.nowcoder.com/ta/sql
--END--
掃碼即可加我微信
觀看朋友圈,獲取最新學(xué)習(xí)資源
學(xué)習(xí)更多: 整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了 優(yōu)秀的讀者都知道,“點(diǎn)贊”傳統(tǒng)美德不能丟

