sql简单算法题(表连接,limit关键字,自连接)

每日几道算法题(1.sql)

今天闲暇时间看了几道sql语句的算法题,在此做一个总结。

一:
表连接
这是leedcode上一道简单基础的sql语句

从表格中可以看出Person表的personId和Address表中的personId是存在外键关系的。所以可以直接写出:

select FirstName,LastName,City,State
from ******
on Person.PersonId = Address.PersonId

然而接下来就是表连接问题。
而表连接粗略分为内连接,左连接,右连接,全连接

  1. 内连接,就是查找两张表中同时存在的数据,官方说法:内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
  2. 左外连接:以左表为主表,查询出的结果,如果没有右表中所对应的没有数据,匹配不上,则显示为null。
  3. 右外连接,与上相反
  4. 全连接:直接查询结果,左表没匹配过的和右表没匹配过的统统显示出来,全都是主表。(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

今日分享到此~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值