表: Person
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
+-------------+---------+
personId 是该表的主键列。 该表包含一些人的 ID 和他们的姓和名的信息。
表: Address
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
+-------------+---------+
addressId 是该表的主键列。
该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。
编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空 null 。
以 任意顺序 返回结果表。
查询结果格式如下所示。
示例 1:
输入:
Person表:
+----------+----------+-----------+
|personId | lastName | firstName |
+------- ---+----------+-----------+
| 1 | Wang | Allen |
| 2 | Alice | Bob |
+----------+----------+-----------+
Address表:
+-----------+----------+---------------+------------+
| addressId | personId | city | state |
+-----------+----------+---------------+------------+
| 1 | 2 | New York City | New York |
| 2 | 3 | Leetcode | California |
+-----------+----------+---------------+------------+
输出:
+-----------+----------+---------------+----------+
| firstName | lastName | city | state |
+-----------+----------+---------------+----------+
| Allen | Wang | Null | Null |
| Bob | Alice | New York City | New York |
+-----------+----------+---------------+----------+
解释:
地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。
addressId = 1 包含了 personId = 2 的地址信息。
很简单的链表查询
# Write your MySQL query statement below
select p.FirstName,p.LastName,
a.City,a.State
from Person p LEFT JOIN Address a on p.personId=a.personId
Employee
表:
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | salary | int | +-------------+------+ id 是这个表的主键。 表的每一行包含员工的工资信息。编写一个 SQL 查询,获取并返回Employee
表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回null
查询结果如下例所示。
示例 1:
输入: Employee 表: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 输出: +---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
示例 2:
输入: Employee 表: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | +----+--------+ 输出: +---------------------+ | SecondHighestSalary | +---------------------+ | null | +---------------------+
分析:
-
要想获取第二高,需要排序,使用 order by(默认是升序 asc,即从小到大),若想降序则使用关键字 desc
-
得考虑到去重,如果有多个相同的数据,使用关键字 distinct 去重
-
判断临界输出,如果不存在第二高的薪水,查询应返回 null,使用 ifNull(查询,null)方法
-
起别名,使用关键字 as ...
-
因为去了重,又按顺序排序,使用 limit()方法,查询第二大的数据,即第二高的薪水,即 limit(1,1) (因为默认从0开始,所以第一个1是查询第二大的数,第二个1是表示往后显示多少条数据,这里只需要一条)
select ifNull((
select distinct Salary
from Employee
order by Salary desc limit 1,1),null) as SecondHighestSalary
我自己写的是是子查询 这样他要是查询不到会返回null
select (select distinct salary from Employee order by salary desc limit 1,1) as SecondHighestSalary
表: Employee
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | salary | int | +-------------+------+ Id是该表的主键列。 该表的每一行都包含有关员工工资的信息。
编写一个SQL查询来报告 Employee
表中第 n
高的工资。如果没有第 n
个最高工资,查询应该报告为 null
。
查询结果格式如下所示。
示例 1:
输入: Employee table: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ n = 2 输出: +------------------------+ | getNthHighestSalary(2) | +------------------------+ | 200 | +------------------------+
示例 2:
输入: Employee 表: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | +----+--------+ n = 2 输出: +------------------------+ | getNthHighestSalary(2) | +------------------------+ | null | +------------------------+
这个是前面那一题的进阶版,把第二高变成了第N高,
- 题目是 176.第二高的薪水 的变形,将查询第二名变成查询 第N名
- 别名中不能带参数,一开始看到测试用例表,使用的别名是getNthHighestSalary(2),就用了getNthHighestSalary(N)做别名,一开始报错还不知道是哪,后面删去变量即可
- limit()方法中不能参与运算,因为索引从0开始,所以要 - 1,最好在外面就设定好 set N = N - 1
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N=N-1;
RETURN (
# Write your MySQL query statement below.
select (select distinct salary from Employee order by salary desc limit N,1) as SecondHighestSalary
);
END
表: Scores
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | score | decimal | +-------------+---------+ Id是该表的主键。 该表的每一行都包含了一场比赛的分数。Score是一个有两位小数点的浮点值。
编写 SQL 查询对分数进行排序。排名按以下规则计算:
- 分数应按从高到低排列。
- 如果两个分数相等,那么两个分数的排名应该相同。
- 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score
降序返回结果表。
查询结果格式如下所示。
示例 1:
输入: Scores 表: +----+-------+ | id | score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+ 输出: +-------+------+ | score | rank | +-------+------+ | 4.00 | 1 | | 4.00 | 1 | | 3.85 | 2 | | 3.65 | 3 | | 3.65 | 3 | | 3.50 | 4 | +-------+------+
我们在学习一些MySQL自动排序的函数 rank() 、dense_rank()、row_number()
- rank():是并列排序,会跳过重复序号
- dense_rank():是并列排序,不会跳过重复序号
- row_number():是顺序排序,不跳过任何一个序号,就是行号
sql语句怎么写:
select
id,
name,
rank() over(order by score desc) `rank`,
row_number() over(order by score desc) `row_number`,
dense_rank() over(order by score desc) `dense_rank`
from Scores;
--------------------------------- 结果 ------------------------------------
+----+----------+-------+------+------------+------------+
| id | name | score | rank | row_number | dense_rank |
+----+----------+-------+------+------------+------------+
| 1 | zss | 100 | 1 | 1 | 1 |
| 3 | dl | 100 | 1 | 2 | 1 |
| 2 | li | 99 | 3 | 3 | 2 |
| 5 | pdf | 99 | 3 | 4 | 2 |
| 6 | caj | 98 | 5 | 5 | 3 |
| 4 | lx | 94 | 6 | 6 | 4 |
+----+----------+-------+------+------------+------------+
由此可以选择dense_rank这个函数来进行编写
# Write your MySQL query statement below
select score ,dense_rank() over(order by score desc) 'rank' from Scores
链接:https://leetcode.cn/problems/combine-two-tables