力扣習題練習一
1.第二高的薪水
方法一:使用子查詢和 LIMIT 子句
算法
將不同的薪資按降序排序,然后使用 LIMIT 子句獲得第二高的薪資。
MySQL
SELECT DISTINCT ? ?Salary AS SecondHighestSalaryFROM ? ?EmployeeORDER BY Salary DESCLIMIT 1 OFFSET 1然而,如果沒有這樣的第二最高工資,這個解決方案將被判斷為 “錯誤答案”,因為本表可能只有一項記錄。為了克服這個問題,我們可以將其作為臨時表。
MySQL
SELECT ? ?(SELECT DISTINCT ? ? ? ? ? ?Salary ? ? ? ?FROM ? ? ? ? ? ?Employee ? ? ? ?ORDER BY Salary DESC ? ? ? ?LIMIT 1 OFFSET 1) AS SecondHighestSalary;
方法二:使用 IFNULL 和 LIMIT 子句
解決 “NULL” 問題的另一種方法是使用 “IFNULL” 函數(shù),如下所示。
MySQL
SELECT ? ?IFNULL( ? ? ?(SELECT DISTINCT Salary ? ? ? FROM Employee ? ? ? ORDER BY Salary DESC ? ? ? ?LIMIT 1 OFFSET 1), ? ?NULL) AS SecondHighestSalary
2.組合兩個表
表1: Person
+-------------+---------+| 列名 ? ? ? ? | 類型 ? ? |+-------------+---------+| PersonId ? ?| int ? ? || FirstName ? | varchar || LastName ? ?| varchar |+-------------+---------+PersonId 是上表主鍵表2: Address
+-------------+---------+| 列名 ? ? ? ? | 類型 ? ?|+-------------+---------+| AddressId ? | int ? ? || PersonId ? ?| int ? ? || City ? ? ? ?| varchar || State ? ? ? | varchar |+-------------+---------+AddressId 是上表主鍵
方法:使用 outer join
算法
因為表 Address 中的 personId 是表 Person 的外關鍵字,所以我們可以連接這兩個表來獲取一個人的地址信息。
考慮到可能不是每個人都有地址信息,我們應該使用 outer join 而不是默認的 inner join。
MySQL
select FirstName, LastName, City, Statefrom Person left join Addresson Person.PersonId = Address.PersonId;注意:如果沒有某個人的地址信息,使用 where 子句過濾記錄將失敗,因為它不會顯示姓名信息。
3.分數(shù)排名
如果兩個分數(shù)相同,則兩個分數(shù)排名(Rank)相同。請注意,平分后的下一個名次應該是下一個連續(xù)的整數(shù)值。換句話說,名次之間不應該有“間隔”。
+----+-------+| Id | Score |+----+-------+| 1 ?| 3.50 ?|| 2 ?| 3.65 ?|| 3 ?| 4.00 ?|| 4 ?| 3.85 ?|| 5 ?| 4.00 ?|| 6 ?| 3.65 ?|+----+-------+例如,根據(jù)上述給定的 Scores 表,你的查詢應該返回(按分數(shù)從高到低排列):
+-------+------+| Score | Rank |+-------+------+| 4.00 ?| 1 ? ?|| 4.00 ?| 1 ? ?|| 3.85 ?| 2 ? ?|| 3.65 ?| 3 ? ?|| 3.65 ?| 3 ? ?|| 3.50 ?| 4 ? ?|+-------+------+重要提示:對于 MySQL 解決方案,如果要轉義用作列名的保留字,可以在關鍵字之前和之后使用撇號。例如 Rank
4.刪除重復電子郵箱
方法:使用 DELETE 和 WHERE 子句算法
我們可以使用以下代碼,將此表與它自身在電子郵箱列中連接起來。
MySQL
SELECT p1.*FROM Person p1, ? ?Person p2WHERE ? ?p1.Email = p2.Email # (自連接);然后我們需要找到其他記錄中具有相同電子郵件地址的更大 ID。所以我們可以像這樣給 WHERE 子句添加一個新的條件。
MySQL
SELECT p1.*FROM Person p1, ? ?Person p2WHERE ? ?p1.Email = p2.Email AND p1.Id > p2.Id;因為我們已經(jīng)得到了要刪除的記錄,所以我們最終可以將該語句更改為 DELETE。
MySQL
DELETE p1 FROM Person p1, ? ?Person p2WHERE ? ?p1.Email = p2.Email AND p1.Id > p2.Id
5.上升的溫度
1.select p1.id
from Weather p1,Weather p2
where datediff(p1.recordDate,p2.recordDate)=1 and p1.Temperature>p2.Temperature
2.
SELECT
# ? weather.id AS 'Id'
# FROM
# ? weather
# ? ? JOIN
# ? weather w ON DATEDIFF(weather.recordDate, w.recordDate) = 1
# ? ? AND weather.Temperature > w.Temperature
6.查詢結果的質(zhì)量和占比
解法一:SELECT
?query_name,
?ROUND(AVG(rating/position), 2) quality,
?ROUND(100*avg(rating<3), 2) poor_query_percentage
FROM Queries
GROUP BY query_name
要點:round(精度,標度),與函數(shù)混合使用放在前面,如,round(avg/max(),標度)