第一次玩簡書拇颅,格式還不太會設(shè)置荧恍,大家見諒镰烧,排版好的文章在公眾號“八哥的成長心路札記”上有拢军,微信號是bager1912。
以下題目均來自力扣(LeetCode)官網(wǎng)和其他網(wǎng)站怔鳖,僅用作數(shù)據(jù)庫愛好者學(xué)習(xí)交流茉唉,嚴(yán)禁進(jìn)行商業(yè)及任何非法用途。
剛剛知曉英國首相梅姨辭職了,世界局勢復(fù)雜度陆,別說大環(huán)境不好艾凯,世界環(huán)境都不好,在位的實(shí)權(quán)派女領(lǐng)導(dǎo)人也就只剩默克爾了懂傀,人家快65歲了趾诗,還在拼,我們更應(yīng)該沉下心來蹬蚁,踏實(shí)沉淀自己恃泪,一起努力!
175. 組合兩個(gè)表
表1:Person
+-------------+---------+
| 列名? ? ? ? | 類型? ? |
+-------------+---------+
| PersonId? ? | int? ? |
| FirstName? | varchar |
| LastName? ? | varchar |
+-------------+---------+
PersonId 是上表主鍵
表2:Address
+-------------+---------+
| 列名? ? ? ? | 類型? ? |
+-------------+---------+
| AddressId? | int? ? |
| PersonId? ? | int? ? |
| City? ? ? ? | varchar |
| State? ? ? | varchar |
+-------------+---------+
AddressId 是上表主鍵
編寫一個(gè) SQL 查詢犀斋,滿足條件:無論 person 是否有地址信息贝乎,都需要基于上述兩表提供?person 的以下信息:
FirstName, LastName, City, State
selectFirstName,LastName,City,State
fromPerson?aleftjoinAddress?b
ona.PersonId=b.PersonId;
176. 第二高的薪水
編寫一個(gè) SQL 查詢,獲取Employee表中第二高的薪水(Salary)?叽粹。
+----+--------+
| Id | Salary |
+----+--------+
| 1? | 100? ? |
| 2? | 200? ? |
| 3? | 300? ? |
+----+--------+
例如上述Employee表览效,SQL查詢應(yīng)該返回200作為第二高的薪水。如果不存在第二高的薪水球榆,那么查詢應(yīng)返回null朽肥。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200? ? ? ? ? ? ? ? |
+---------------------+
selectmin(salary)"SecondHighestSalary"
from(selectsalary,dense_rank()over(orderbysalarydesc)?rn
fromEmployee
)
wherern=2;
這個(gè)地方我覺得min沒有好像也行禁筏,不影響輸出空值持钉,但是去掉后,leetcode判定是錯誤的篱昔,有點(diǎn)奇怪每强。
177. 第N高的薪水
編寫一個(gè) SQL 查詢,獲取Employee表中第n?高的薪水(Salary)州刽。
+----+--------+
| Id | Salary |
+----+--------+
| 1? | 100? ? |
| 2? | 200? ? |
| 3? | 300? ? |
+----+--------+
例如上述Employee表空执,n = 2?時(shí),應(yīng)返回第二高的薪水200穗椅。如果不存在第n?高的薪水辨绊,那么查詢應(yīng)返回null。
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200? ? ? ? ? ? ? ? ? ? |
+------------------------+
CREATEFUNCTIONgetNthHighestSalary(NINNUMBER)RETURNNUMBERIS
resultNUMBER;
BEGIN
/*?Write?your?PL/SQL?query?statement?below?*/
selectSalaryintoresult
from(selectSalary,rownumasrn
from(selectDISTINCTSalary
fromEmployee
orderbySalarydesc))
wherern?=?N;
RETURN?result;
END;
這個(gè)嵌套了三層select
178. 分?jǐn)?shù)排名
編寫一個(gè) SQL 查詢來實(shí)現(xiàn)分?jǐn)?shù)排名匹表。如果兩個(gè)分?jǐn)?shù)相同门坷,則兩個(gè)分?jǐn)?shù)排名(Rank)相同。請注意袍镀,平分后的下一個(gè)名次應(yīng)該是下一個(gè)連續(xù)的整數(shù)值默蚌。換句話說,名次之間不應(yīng)該有“間隔”苇羡。
+----+-------+
| Id | Score |
+----+-------+
| 1? | 3.50? |
| 2? | 3.65? |
| 3? | 4.00? |
| 4? | 3.85? |
| 5? | 4.00? |
| 6? | 3.65? |
+----+-------+
例如绸吸,根據(jù)上述給定的Scores表,你的查詢應(yīng)該返回(按分?jǐn)?shù)從高到低排列):
+-------+------+
| Score | Rank |
+-------+------+
| 4.00? | 1? ? |
| 4.00? | 1? ? |
| 3.85? | 2? ? |
|?3.65? | 3? ? |
| 3.65? | 3? ? |
| 3.50? | 4? ? |
+-------+------+
selectscore"Score",dense_rank()over(orderbyscoredesc)"Rank"
fromScores;
180. 連續(xù)出現(xiàn)的數(shù)字
編寫一個(gè) SQL 查詢,查找所有至少連續(xù)出現(xiàn)三次的數(shù)字锦茁。
+----+-----+
| Id | Num |
+----+-----+
| 1? |? 1? |
| 2? |? 1? |
| 3? |? 1? |
| 4? |? 2? |
| 5? |? 1? |
| 6? |? 2? |
| 7? |? 2? |
+----+-----+
例如攘轩,給定上面的Logs表,1是唯一連續(xù)出現(xiàn)至少三次的數(shù)字码俩。
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1? ? ? ? ? ? ? |
+-----------------+
selectdistincta.Num"ConsecutiveNums"
fromLogsa,Logsb,Logsc
wherea.Id=b.Id-1anda.Id=c.Id-2anda.Num=b.Numanda.Num=c.Num;
181. 超過經(jīng)理收入的員工
Employee表包含所有員工撑刺,他們的經(jīng)理也屬于員工。每個(gè)員工都有一個(gè) Id握玛,此外還有一列對應(yīng)員工的經(jīng)理的 Id够傍。
+----+-------+--------+-----------+
| Id | Name? | Salary | ManagerId |
+----+-------+--------+-----------+
| 1? | Joe? | 70000? | 3? ? ? ? |
| 2? | Henry | 80000? | 4? ? ? ? |
| 3? | Sam? | 60000? | NULL? ? ? |
| 4? | Max? | 90000? | NULL? ? ? |
+----+-------+--------+-----------+
給定Employee表,編寫一個(gè) SQL 查詢挠铲,該查詢可以獲取收入超過他們經(jīng)理的員工的姓名冕屯。在上面的表格中,Joe 是唯一一個(gè)收入超過他的經(jīng)理的員工拂苹。
+----------+
| Employee |
+----------+
| Joe? ? ? |
+----------+
selecta.Name"Employee"
fromEmployee?a,Employee?b
wherea.ManagerId?=?b.Idanda.Salary?>?b.Salary;
182. 查找重復(fù)的電子郵箱
編寫一個(gè) SQL 查詢安聘,查找Person表中所有重復(fù)的電子郵箱。
示例:
+----+---------+
| Id | Email? |
+----+---------+
| 1? | a@b.com |
| 2? | c@d.com |
| 3? | a@b.com |
+----+---------+
根據(jù)以上輸入瓢棒,你的查詢應(yīng)返回以下結(jié)果:
+---------+
| Email? |
+---------+
| a@b.com |
+---------+
說明:所有電子郵箱都是小寫字母浴韭。
selectEmail"Email"
fromPerson
groupbyEmail
havingcount(Email)?>1;
183. 從不訂購的客戶
某網(wǎng)站包含兩個(gè)表,Customers表和Orders表脯宿。編寫一個(gè) SQL 查詢念颈,找出所有從不訂購任何東西的客戶。
Customers表:
+----+-------+
| Id | Name? |
+----+-------+
| 1? | Joe? |
| 2? | Henry |
| 3? | Sam? |
| 4? | Max? |
+----+-------+
Orders表:
+----+------------+
| Id | CustomerId |
+----+------------+
| 1? | 3? ? ? ? ? |
| 2? | 1? ? ? ? ? |
+----+------------+
例如給定上述表格连霉,你的查詢應(yīng)返回:
+-----------+
| Customers |
+-----------+
| Henry? ? |
| Max? ? ? |
+-----------+
selectName"Customers"
fromCustomers
whereIdnotin
(selectCustomerId
fromOrders)
orderbyName;
184. 部門工資最高的員工
Employee表包含所有員工信息榴芳,每個(gè)員工有其對應(yīng)的?Id, salary 和 department Id。
+----+-------+--------+--------------+
| Id | Name? | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1? | Joe? | 70000? | 1? ? ? ? ? ? |
| 2? | Henry | 80000? | 2? ? ? ? ? ? |
| 3? | Sam? | 60000? | 2? ? ? ? ? ? |
| 4? | Max? | 90000? | 1? ? ? ? ? ? |
+----+-------+--------+--------------+
Department表包含公司所有部門的信息跺撼。
+----+----------+
| Id | Name? ? |
+----+----------+
| 1? | IT? ? ? |
| 2? | Sales? ? |
+----+----------+
編寫一個(gè) SQL 查詢窟感,找出每個(gè)部門工資最高的員工。例如歉井,根據(jù)上述給定的表格柿祈,Max 在 IT 部門有最高工資,Henry 在 Sales 部門有最高工資哩至。
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT? ? ? ? | Max? ? ? | 90000? |
| Sales? ? ? | Henry? ? | 80000? |
+------------+----------+--------+
selectb.Name"Department",a.Name"Employee",Salary"Salary"
fromEmployee?a,Department?b
whereDepartmentId?=?b.Idand(Salary,DepartmentId)in(selectmax(Salary),DepartmentId
fromEmployee
groupbyDepartmentId);
先在員工信息表里按部門分組找出最高工資的員工躏嚎,再連接部門表,顯示要輸出的信息憨募。
185. 部門工資前三高的員工
Employee表包含所有員工信息紧索,每個(gè)員工有其對應(yīng)的?Id, salary 和 department Id 。
+----+-------+--------+--------------+
| Id | Name? | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1? | Joe? | 70000? | 1? ? ? ? ? ? |
| 2? | Henry | 80000? | 2? ? ? ? ? ? |
| 3? | Sam? | 60000? | 2? ? ? ? ? ? |
| 4? | Max? | 90000? | 1? ? ? ? ? ? |
| 5? | Janet | 69000? | 1? ? ? ? ? ? |
| 6? | Randy | 85000? | 1? ? ? ? ? ? |
+----+-------+--------+--------------+
Department表包含公司所有部門的信息菜谣。
+----+----------+
| Id | Name? ? |
+----+----------+
| 1? | IT? ? ? |
| 2? | Sales? ? |
+----+----------+
編寫一個(gè)?SQL 查詢珠漂,找出每個(gè)部門工資前三高的員工晚缩。例如,根據(jù)上述給定的表格媳危,查詢結(jié)果應(yīng)返回:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT? ? ? ? | Max? ? ? | 90000? |
| IT? ? ? ? | Randy? ? | 85000? |
| IT? ? ? ? | Joe? ? ? | 70000? |
| Sales? ? ? | Henry? ? | 80000? |
| Sales? ? ? | Sam? ? ? | 60000? |
+------------+----------+--------+
selectd.name"Department",s.name"Employee",s.salary"Salary"
from(selectdepartmentid,name,salary
from(selectdepartmentid,name,salary,dense_rank()over(partitionbydepartmentidorderbysalarydesc)?rn
fromemployee)
wherern?<4)?s,department?d
wheres.departmentid?=?d.id;
196. 刪除重復(fù)的電子郵箱
編寫一個(gè) SQL 查詢荞彼,來刪除Person表中所有重復(fù)的電子郵箱,重復(fù)的郵箱里只保留Id?最小?的那個(gè)待笑。
+----+------------------+
| Id | Email? ? ? ? ? ? |
+----+------------------+
| 1? | john@example.com |
| 2? | bob@example.com? |
| 3? | john@example.com |
+----+------------------+
Id 是這個(gè)表的主鍵鸣皂。
例如,在運(yùn)行你的查詢語句之后暮蹂,上面的Person表應(yīng)返回以下幾行:
+----+------------------+
| Id | Email? ? ? ? ? ? |
+----+------------------+
| 1? | john@example.com |
| 2? | bob@example.com? |
+----+------------------+
deleted1
fromPerson?d1,Person?d2
whered1.Email?=?d2.Emailandd1.Id?>?d2.Id;
把d1的記錄刪除
197. 上升的溫度
給定一個(gè)Weather表寞缝,編寫一個(gè) SQL 查詢,來查找與之前(昨天的)日期相比溫度更高的所有日期的 Id仰泻。
+---------+------------------+------------------+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+---------+------------------+------------------+
|? ? ? 1 |? ? ? 2015-01-01 |? ? ? ? ? ? ? 10 |
|? ? ? 2 |? ? ? 2015-01-02 |? ? ? ? ? ? ? 25 |
|? ? ? 3 |? ? ? 2015-01-03 |? ? ? ? ? ? ? 20 |
|? ? ? 4 |? ? ? 2015-01-04 |? ? ? ? ? ? ? 30 |
+---------+------------------+------------------+
例如荆陆,根據(jù)上述給定的Weather表格,返回如下 Id:
+----+
| Id |
+----+
|? 2 |
|? 4 |
+----+
selectw1.Id"Id"
fromWeather?w1,Weather?w2
wherew1.RecordDate?=?w2.RecordDate?+1andw1.Temperature?>?w2.Temperature;
262. 行程和用戶
Trips表中存所有出租車的行程信息集侯。每段行程有唯一鍵 Id被啼,Client_Id 和?Driver_Id 是Users表中 Users_Id 的外鍵。Status 是枚舉類型棠枉,枚舉成員為 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)浓体。
+----+-----------+-----------+---------+--------------------+----------+
| Id | Client_Id | Driver_Id | City_Id |? ? ? ? Status? ? ? |Request_at|
+----+-----------+-----------+---------+--------------------+----------+
| 1? |? ? 1? ? |? ? 10? ? |? ? 1? ? |? ? completed? ? ? |2013-10-01|
| 2? |? ? 2? ? |? ? 11? ? |? ? 1? ? | cancelled_by_driver|2013-10-01|
| 3? |? ? 3? ? |? ? 12? ? |? ? 6? ? |? ? completed? ? ? |2013-10-01|
| 4? |? ? 4? ? |? ? 13? ? |? ? 6? ? | cancelled_by_client|2013-10-01|
| 5? |? ? 1? ? |? ? 10? ? |? ? 1? ? |? ? completed? ? ? |2013-10-02|
| 6? |? ? 2? ? |? ? 11? ? |? ? 6? ? |? ? completed? ? ? |2013-10-02|
| 7? |? ? 3? ? |? ? 12? ? |? ? 6? ? |? ? completed? ? ? |2013-10-02|
| 8? |? ? 2? ? |? ? 12? ? |? ? 12? |? ? completed? ? ? |2013-10-03|
| 9? |? ? 3? ? |? ? 10? ? |? ? 12? |? ? completed? ? ? |2013-10-03|
| 10 |? ? 4? ? |? ? 13? ? |? ? 12? | cancelled_by_driver|2013-10-03|
+----+-----------+-----------+---------+--------------------+----------+
Users表存所有用戶。每個(gè)用戶有唯一鍵 Users_Id辈讶。Banned 表示這個(gè)用戶是否被禁止命浴,Role 則是一個(gè)表示(‘client’, ‘driver’, ‘partner’)的枚舉類型。
+----------+--------+--------+
| Users_Id | Banned |? Role? |
+----------+--------+--------+
|? ? 1? ? |? No? | client |
|? ? 2? ? |? Yes? | client |
|? ? 3? ? |? No? | client |
|? ? 4? ? |? No? | client |
|? ? 10? ? |? No? | driver |
|? ? 11? ? |? No? | driver |
|? ? 12? ? |? No? | driver |
|? ? 13? ? |? No? | driver |
+----------+--------+--------+
寫一段 SQL 語句查出2013年10月1日?至2013年10月3日?期間非禁止用戶的取消率荞估】却伲基于上表,你的 SQL 語句應(yīng)返回如下結(jié)果勘伺,取消率(Cancellation Rate)保留兩位小數(shù)。
+------------+-------------------+
|? ? Day? ? | Cancellation Rate |
+------------+-------------------+
| 2013-10-01 |? ? ? 0.33? ? ? ? |
| 2013-10-02 |? ? ? 0.00? ? ? ? |
| 2013-10-03 |? ? ? 0.50? ? ? ? |
+------------+-------------------+
selectb.Request_at"Day",round(NVL(a.cancel,0)/b.total,2)"Cancellation?Rate"
from(selectRequest_at,count(Status)cancel
fromTrips?t1
whereStatus!='completed'and(selectBanned
fromUsers
whereUsers_Id?=?t1.Client_Id)?='No'and(selectBanned
fromUsers
whereUsers_id?=?t1.Driver_Id)='No'
groupbyRequest_at)?a--a有一行是空的
fulljoin
(selectRequest_at,count(Status)?total
fromTrips?t1
where(selectBanned
fromUsers
whereUsers_Id?=?t1.Client_Id)?='No'and(selectBanned
fromUsers
whereUsers_id?=?t1.Driver_Id)='No'
groupbyRequest_at)?b
ona.Request_at?=?b.Request_at
whereb.Request_atbetween'2013-10-01'and'2013-10-03'
orderbyb.Request_at;
這道題得好好揣摩下褂删,非禁止的用戶有可能是乘客有可能是車主飞醉,力扣上有些只考慮乘客的也判定為對的,但感覺不夠全面屯阀,于是結(jié)合評論中的代碼理解缅帘,本來是想查詢a.Request_at的,但其實(shí)a查詢中有一行是空的难衰,會導(dǎo)致最終結(jié)果不顯示0取消率的那一行钦无。所以只能查詢b.Request_at。
569. 員工薪水中位數(shù)
Employee表包含所有員工盖袭。Employee表有三列:員工Id失暂,公司名和薪水彼宠。
+-----+------------+--------+
|Id? | Company? ? | Salary |
+-----+------------+--------+
|1? ? | A? ? ? ? ? | 2341? |
|2? ? | A? ? ? ? ? | 341? ? |
|3? ? | A? ? ? ? ? | 15? ? |
|4? ? | A? ? ? ? ? | 15314? |
|5? ? | A? ? ? ? ? | 451? ? |
|6? ? | A? ? ? ? ? | 513? ? |
|7? ? | B? ? ? ? ? | 15? ? |
|8? ? | B? ? ? ? ? | 13? ? |
|9? ? | B? ? ? ? ? | 1154? |
|10? | B? ? ? ? ? | 1345? |
|11? | B? ? ? ? ? | 1221? |
|12? | B? ? ? ? ? | 234? ? |
|13? | C? ? ? ? ? | 2345? |
|14? | C? ? ? ? ? | 2645? |
|15? | C? ? ? ? ? | 2645? |
|16? | C? ? ? ? ? | 2652? |
|17? | C? ? ? ? ? | 65? ? |
+-----+------------+--------+
請編寫SQL查詢來查找每個(gè)公司的薪水中位數(shù)。挑戰(zhàn)點(diǎn):你是否可以在不使用任何內(nèi)置的SQL函數(shù)的情況下解決此問題弟塞。
+-----+------------+--------+
|Id? | Company? ? | Salary |
+-----+------------+--------+
|5? ? | A? ? ? ? ? | 451? ? |
|6? ? | A? ? ? ? ? | 513? ? |
|12? | B? ? ? ? ? | 234? ? |
|9? ? | B? ? ? ? ? | 1154? |
|14? | C? ? ? ? ? | 2645? |
+-----+------------+--------+
selectid,company,salary
from(selectid,company,salary,row_number()over(partitionbycompanyorderbysalary)?rn,count(*)over(partitionbycompany)?co
fromemployee
)
wherernin(ceil(co/2),co/2+1);
不用內(nèi)置函數(shù)目前還沒想到凭峡,會的朋友分享下,多謝决记!
未完待續(xù)摧冀。。系宫。