每日几道算法题(1.sql)
今天闲暇时间看了几道sql语句的算法题,在此做一个总结。
一:
表连接
这是leedcode上一道简单基础的sql语句
从表格中可以看出Person表的personId和Address表中的personId是存在外键关系的。所以可以直接写出:
select FirstName,LastName,City,State
from ******
on Person.PersonId = Address.PersonId
然而接下来就是表连接问题。
而表连接粗略分为内连接,左连接,右连接,全连接
- 内连接,就是查找两张表中同时存在的数据,官方说法:内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
- 左外连接:以左表为主表,查询出的结果,如果没有右表中所对应的没有数据,匹配不上,则显示为null。
- 右外连接,与上相反
- 全连接:直接查询结果,左表没匹配过的和右表没匹配过的统统显示出来,全都是主表。(mysql中不支持)
4.1 官方一点的说法:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
题中又出了条件,无论person是否有地址信息,都需要基于上述两表提供person的这些信息。
因此此处person表为主表,所以用左外连接或右外连接
sql语句为:
select FirstName,LastName,City,State
from Person left join Address
(from Address right join Person)
on Person.PersonId = Address.PersonId
二:
排序
这是一道排序题
我第一眼看到后就先写了这样的sql
select distinct salary
from Employee
order by salary desc
因为题中要求返回第二高的薪水,所以用降序排序(如果表中数据较多时,也是第二个数据为第二高)。
然后要第二个数据:
用limit,offset关键字来查询
select distinct salary
from Employee
order by salary desc
limit 1 offset 1
limit 5 指直接记录前五行数据(最多5行),如果数据不够5行,则全部返回
limit 100 一共10行,不够100行,则输出10行
limit 2 offset 5 指从第3行开始,记录5行数据(不包括第三行)
简写:limit 3,4 指的是从第三行开始(不包括第三行),记录4行数据
题干要求:如果没有第二高的数据,查询结果返回null
在这里,上面的式子直接运行就可以满足条件
而官方却给出了这样的解释:
不太懂
第二种做法:使用IFNULL和LIMIT子句
select
IFNULL(
(select distinct Salary
from Employee
order by Salary desc
limit 1,1),null
)as SecondHightestSalary
但是还能有其他的做法:仅限于这道题
select max(salary) SecondHighSalary
from Employee
where Salary < (select max(Salary) from Employee)
这里用的是去掉的最大的一个,把第二大的当作最大的取了出来,但也仅限于2以内,如果数量很大,子查询查询效率较低,就会影响sql性能。
三:
自连接题目
这是一道标准简单的自连接题目,即自己连接自己,常常用到类别管理上,比如这道题。
主管:既是员工,又是一些员工的manager,他可能也有自己的管理者。
即一行的id可能是另外一行的managerId。
所以,需要用到自连接。
sql语句如下:
select e1.name as Employee
from Employee as e1
inner join Employee as e2
自己连接自己,不过都要起别名来区分。inner可省略。
on e1.Id = e2.ManagerId
where e1.Salary>e2.Salary
今日分享到此~