目录
1、175组合俩个表
编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空 null 。以 任意顺序 返回结果表。
输入:
Person表:
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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。