MySQL LeetCode刷题1

目录

1、175组合俩个表

2、176第二高薪水

3、177第N高薪水

4、178分数排名

方法一

方法二

扩展

1、175组合俩个表

编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空  null 。以 任意顺序 返回结果表。

输入: 
Person表:

扫描二维码关注公众号,回复: 15257494 查看本文章


Address表:

输出: 

解释: 
地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。
addressId = 1 包含了 personId = 2 的地址信息。

一个较为简单的链表查询,如果 personId 的地址不在 Address 表中,则报告为空  null ,用left join 左连接查询。左连接,把左边的全部查出来,右边有的则匹配,没有则为null。

SELECT firstName,lastName,city,state 
FROM Person 
LEFT JOIN Address 
ON Person.personid=Address.personid

2、176第二高薪水

编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。

Create table If Not Exists Employee (id int, salary int);
Truncate table Employee;
insert into Employee (id, salary) values ('1', '100');
insert into Employee (id, salary) values ('2', '200');
insert into Employee (id, salary) values ('3', '300');

输入:
Employee 表:

输出:

IFNULL(expr1,expr2),如果expr1的值为null,则返回expr2的值,如果expr1的值不为null,则返回expr1的值。剔除第一高薪水,再选择剔除后的第一高薪水,即第二高薪水。如果只有一条消息,即第一高薪水剔除后,没有其他数据,返回IFNULL的expr2的值NULL。

SELECT IFNULL(MAX(salary),NULL) AS SecondHighestSalary 
FROM Employee 
WHERE salary!=(SELECT MAX(salary) FROM Employee)

 3、177第N高薪水

在第二题数据库下,编写一个SQL查询来报告 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询应该报告为 null 。

用笛卡尔积方法:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(0,a),(1,a),(2,a),(b,0),(b,1),(b,2)}。

SELECT e1.salary,e2.salary FROM employee e1,employee e2

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN(
	SELECT e1.salary FROM employee e1,employee e2 
    WHERE e1.salary<=e2.salary 
    GROUP BY e1.salary 
    HAVING COUNT(DISTINCT e2.salary)=N
);
END

查询N=2d的薪水:

4、178分数排名

编写 SQL 查询对分数进行排序。排名按以下规则计算:

1、分数应按从高到低排列。
2、如果两个分数相等,那么两个分数的排名应该相同。
3、在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
4、按 score 降序返回结果表。

Create table If Not Exists Scores (id int, score DECIMAL(3,2));
Truncate table Scores;
insert into Scores (id, score) values ('1', '3.5');
insert into Scores (id, score) values ('2', '3.65');
insert into Scores (id, score) values ('3', '4.0');
insert into Scores (id, score) values ('4', '3.85');
insert into Scores (id, score) values ('5', '4.0');
insert into Scores (id, score) values ('6', '3.65');
SELECT * FROM scores;

方法一

同上,用笛卡尔积方法:

SELECT a.score,COUNT(DISTINCT b.score) AS 'rank' 
FROM Scores a,Scores b 
WHERE a.score<=b.score 
GROUP BY a.id 
ORDER BY a.score DESC

查询结果如下所示:

方法二

Dense_rank()函数,每一行分配排名,而排名值没有间隙。

SELECT score,dense_rank() over(ORDER BY score DESC) AS 'rank' FROM Scores

扩展

DENSE_RANK()进行排名会得到:1,1,2,3,4;可同名次,而且排名没有间隙。

RANK()进行排名会得到:1,1,3,4,5;可同名次,但排名有间隙。

ROW_NUMBER()进行排名会得到:1,2,3,4,5;不可同名次。

题目来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/combine-two-tables
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/m0_72084056/article/details/126094384
今日推荐