今天闲来无事,在Leetcode上写了几道Mysql的练习题,发现自己编写Sql的能力几乎为0
- 175组合两个表
这个题目练习的就是left join、inner join、right join
left join:左连接的结果就是左表中的所有记录,右表中没有的字段全部是NULL
right join:右连接的结果就是右表中的所有记录,左表中没有的字段全部用NULL填充
inner join:内连接的结果是两张表中都要有的
teacher表和address表如上所示
left join的结果
select FirstName,LastName,city,state
from teacher left join address
on teacher.personid = address.personid;
right join的结果
select FirstName,LastName,city,state
from teacher right join address
on teacher.personid = address.personid
inner join的结果
select FirstName,LastName,city,state
from teacher
inner join address on teacher.personid = address.personid
- 176第二高的薪水
这个题目在理解上会存在歧义(第二高的薪水不是排名第二的薪水),例如,第一名的薪水是100,第二名的薪水也是100,那这个表里面就不存在第二高的薪水!
根据题意,我们使用一个ifNull的函数,如果不存在那我们就返回null
Employee表
对应的结果
select
ifNull(
(select distinct salary
from Employee
order by salary desc
limit 1,1),NULL)
AS SecondHighestSalary
limit关键字
- limit x,y——从索引为x的记录开始取y条数据(数据库的索引是从0开始的)
- limit x offset y——从索引为y的记录开始取x条数据
- limit x——从索引0开始取x条数据
- 177.第N高的薪水
这个和第176很像,这里我们换一种写法
group by可以起到去重的作用
order by按照薪水降序排序
limit N,1 从索引为N的记录开始取一条就是取索引为N的数据
set N := N-1;第一高的薪水就是索引0,第二高的薪水就是索引1…
输入
结果
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N := N-1;
RETURN (
# Write your MySQL query statement below.
select salary
from employee
group by salary
order by salary desc
limit N,1
);
END
- 178.分数排名
这个题目是用到了mysql中的窗口函数 RANK()函数
RANK()——存在相同的位次会跳过 1,1,1,4这种
DENSE_RANK()——存在相同的位次不会跳过之后的位次 1,1,1,2,2,3这样的
ROW_NUMBER()——给予唯一的连续位次,1,2,3,4这种
select id,money,dense_rank() over (order by money) as 'rank' from student;
select id,money,rank() over (order by money) as 'rank' from student;
select id,money,row_number() over (order by money) as 'rank' from student;
数据库的练习还是要抓一抓的!