Leetcode-sql刷題


第一題:

表1: Person

因爲表 Address 中的 personId 是表 Person 的外關鍵字,所以我們可以連接這兩個表來獲取一個人的地址信息。

考慮到可能不是每個人都有地址信息,我們應該使用 outer join 而不是默認的 inner join。
注意:如果沒有某個人的地址信息,使用 where 子句過濾記錄將失敗,因爲它不會顯示姓名信息。


第二題:

然而,如果沒有這樣的第二最高工資,這個解決方案將被判斷爲 “錯誤答案”,因爲本表可能只有一項記錄。爲了克服這個問題,我們可以將其作爲臨時表。

爲什麼使用臨時表能解決null值問題

select NULL

返回null值


第三題:

表格裏存有每個僱員經理的信息,我們也許需要從這個表裏獲取兩次信息。


SELECT *
FROM Employee AS a, Employee AS b
;

從兩個表裏使用 Select 語句可能會導致產生 笛卡爾乘積 。在這種情況下,輸出會產生 4*4=16 個記錄。然而我們只對僱員工資高於經理的人感興趣。所以我們應該用 WHERE 語句加 2 個判斷條件。


SELECT
    *
FROM
    Employee AS a,
    Employee AS b
WHERE
    a.ManagerId = b.Id
        AND a.Salary > b.Salary

實際上, JOIN 是一個更常用也更有效的將表連起來的辦法,我們使用 ON 來指明條件。


SELECT
     a.NAME AS Employee
FROM Employee AS a JOIN Employee AS b
     ON a.ManagerId = b.Id
     AND a.Salary > b.Salary
;


第四題:

來刪除 Person 表中所有重複的電子郵箱,重複的郵箱裏只保留 Id 最小 的那個。

delete p1 from person p1,person p2 where p1.email=p2.email and p1.id>p2.id;

又是弄了兩個表


第五題:

給定一個 Weather 表,編寫一個 SQL 查詢,來查找與之前(昨天的)日期相比溫度更高的所有日期的 Id。

SELECT
    weather.id AS 'Id'
FROM
    weather
        JOIN
    weather w ON DATEDIFF(weather.date, w.date) = 1
        AND weather.Temperature > w.Temperature
;

DATEDIFF(a,b) a-b=1


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章