sql復(fù)習(xí)強(qiáng)化每日五題——第一天

 Person
+-------------+---------+
| 列名         | 類型     |
+-------------+---------+
| PersonId    | int     | 主鍵
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+

Address
+-------------+---------+
| 列名         | 類型    |
+-------------+---------+
| AddressId   | int     | 主鍵
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+

編寫一個(gè) SQL 查詢,滿足條件:無(wú)論 person 是否有地址信息,都需要基于上述兩表提供 person 的以下信息:
FirstName, LastName, City, State

答案:
select FirstName,LastName,City,State from 
Person left join Address on Person.PersonId=Address.PersonId;
編寫一個(gè) SQL 查詢,獲取 Employee 表中第二高的薪水(Salary) 。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
例如上述 Employee 表,SQL查詢應(yīng)該返回 200 作為第二高的薪水。如果不存在第二高的薪水,那么查詢應(yīng)返回 null。

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

答案
select FirstName,LastName,City,State from 
Person left join Address on Person.PersonId=Address.PersonId;
編寫一個(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;
  RETURN (
     select ifnull((select distinct Salary from Employee
     order by Salary DESC limit 1 offset N),null) as NthHighestSalary
  );
END
編寫一個(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,dense_rank() over(order by Score DESC) as 'Rank' from Scores;
編寫一個(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               |
+-----------------+

答案
select distinct Num as ConsecutiveNums
from(
    select Num,
    case 
        when @current = Num then @count:=@count+1
        when (@current := Num) then @count := 1
    end c_number
    from Logs,(select @current := 0,@count := 0) as t
    -- where c_number>=3
) as newLogs where newLogs.c_number>=3
此處where條件不能寫在子查詢內(nèi),會(huì)報(bào)出找不到c_number這個(gè)別名的錯(cuò)誤,
嘗試過(guò)Logs.c_number和t.c_number。不知道原因。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容