第一題 組合兩個(gè)表
表1: Person
+-------------+---------+
| 列名 | 類型 |
+-------------+---------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
+-------------+---------+
PersonId 是上表主鍵
表2: Address
+-------------+---------+
| 列名 | 類型 |
+-------------+---------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
+-------------+---------+
AddressId 是上表主鍵
編寫一個(gè) SQL 查詢啥供,滿足條件:無(wú)論 person 是否有地址信息偷厦,都需要基于上述兩表提供 person 的以下信息:
FirstName, LastName, City, State
解答:
數(shù)據(jù)庫(kù)在通過(guò)連接兩張或多張表來(lái)返回記錄時(shí),都會(huì)生成一張中間的臨時(shí)表颂碧,然后再將這張臨時(shí)表返回給用戶塑煎。 在使用left jion時(shí)沫换,on和where條件的區(qū)別如下:
1、on條件是在生成臨時(shí)表時(shí)使用的條件最铁,它不管on中的條件是否為真苗沧,都會(huì)返回左邊表中的記錄。
2炭晒、where條件是在臨時(shí)表生成好后待逞,再對(duì)臨時(shí)表進(jìn)行過(guò)濾的條件。這時(shí)已經(jīng)沒(méi)有l(wèi)eft join的含義(必須返回左邊表的記錄)了网严,條件不為真的就全部過(guò)濾掉识樱。
select p.Firstname,p.LastName,a.City,a.State from Person p left join Address a on p.PersonId = a.PersonId;
第二題 第二高的薪水
編寫一個(gè) SQL 查詢,獲取 Employee 表中第二高的薪水(Salary) 震束。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee 表怜庸,SQL查詢應(yīng)該返回 200 作為第二高的薪水。如果不存在第二高的薪水垢村,那么查詢應(yīng)返回 null割疾。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
解答
select IFNULL((select distinct(Salary)
from Employee
order by Salary desc
limit 1,1),null) as SecondHighestSalary
第三題 第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 |
+------------------------+
解答
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N-1;
IF N < 0 THEN
RETURN NULL;
ELSE
RETURN (
\# Write your MySQL query statement below.
SELECT IFNULL(
(
SELECT
DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT N, 1
), NULL)
AS getNthHighestSalary
);
END IF;
END
第四題 分?jǐn)?shù)排名
編寫一個(gè) SQL 查詢來(lái)實(shí)現(xiàn)分?jǐn)?shù)排名馋辈。
如果兩個(gè)分?jǐn)?shù)相同抚芦,則兩個(gè)分?jǐn)?shù)排名(Rank)相同。請(qǐng)注意迈螟,平分后的下一個(gè)名次應(yīng)該是下一個(gè)連續(xù)的整數(shù)值叉抡。換句話說(shuō),名次之間不應(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 |
+-------+------+
解答
SELECT Score,
(SELECT count(DISTINCT score) FROM Scores WHERE score >= s.score) AS Rank
FROM Scores s
ORDER BY Score DESC;