第一題:
表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