第二高的薪水

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

+——+————+
| Id | Salary |
+——+————+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+——+————+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

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

• 要想获取第二高,需要排序,使用 order by(默认是升序 asc,即从小到大),若想降序则使用关键字 desc
• 去重,如果有多个相同的数据,使用关键字 distinct 去重
• 判断临界输出,如果不存在第二高的薪水,查询应返回 null,使用 ifNull(查询,null)方法
• 起别名,使用关键字 as …
• 因为去了重,又按顺序排序,使用 limit()方法,查询第二大的数据,即第二高的薪水,即 limit(1,1) (因为默认从0开始,所以第一个1是查询第二大的数,第二个1是表示往后显示多少条数据,这里只需要一条)

第n 高薪水

select ifnull((select distinct Salary from Employee order by Salary desc limit 1,1),null) as SecondHighestSalary

编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。

+——+————+
| Id | Salary |
+——+————+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+——+————+
例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询应返回 null。

+————————————+
| getNthHighestSalary(2) |
+————————————+
| 200 |
+————————————+

  1. CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
  2. BEGIN
  3. RETURN (
  4. # Write your MySQL query statement below.
  5. select ifnull((select distinct Salary from Employee order by Salary desc limit N,1),null) as getNthHighestSalary
  6. );
  7. END

编写一个 SQL 查询来实现分数排名

如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

+——+———-+
| Id | Score |
+——+———-+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+——+———-+
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

+———-+———+
| Score | Rank |
+———-+———+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+———-+———+

  1. select s1.Score,count(distinct(s2.score)) Rank
  2. from
  3. Scores s1,Scores s2
  4. where
  5. s1.score<=s2.score
  6. group by s1.Id
  7. order by Rank

找出连续出现三次的数字

+——————-+————-+
| Column Name | Type |
+——————-+————-+
| id | int |
| num | varchar |
+——————-+————-+
id 是这个表的主键。

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

返回的结果表中的数据可以按 任意顺序 排列。

查询结果格式如下面的例子所示:

Logs 表:
+——+——-+
| Id | Num |
+——+——-+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+——+——-+

Result 表:
+————————-+
| ConsecutiveNums |
+————————-+
| 1 |
+————————-+
1 是唯一连续出现至少三次的数字。

查找 Person 表中所有重复的电子邮箱

示例:

+——+————-+
| Id | Email |
+——+————-+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+——+————-+
根据以上输入,你的查询应返回以下结果:

+————-+
| Email |
+————-+
| a@b.com |
+————-+
说明:所有电子邮箱都是小写字母。

  1. select * from Person group by Email having count(id)>=2

所有从不订购任何东西的客户

某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。

Customers 表:

+——+———-+
| Id | Name |
+——+———-+
| 1 | Joe |
| 2 | Henry |
| 3 | Sam |
| 4 | Max |
+——+———-+
Orders 表:

+——+——————+
| Id | CustomerId |
+——+——————+
| 1 | 3 |
| 2 | 1 |
+——+——————+

select a.Name Customers from Customers a leftjoin Orders b on a.Id=b.CustomerId where b.CustomerId isnull

实践篇 - 图1