Leetcode sql刷题记录1: 175、176、181

力扣上Sql的题比较少,筛选出来做一些,并且记录一些容易犯错的点

我用的是mysql语言

175.组合两个表

题目难点:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息

答案:

select p.FirstName, p.LastName, a.City, a.State

#无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息,要保留Address中的null值,所以使用左外联结,来指定包括Person所有行的表

from Person as p left join Address as a

#外联结用on               

on p.personid = a.personid;

176.第二高的薪水

题目难点:如果不存在第二高的薪水,那么查询应返回 null

如果查询结果为空,那么select会返回空,而不是null,所以我们必须给空的结果赋值为null,或者把空结果赋值给secondhighsalary,才会显示null

解法1:

select

#ifnull(expression, alt_value), ifnull函数判断第一个表达式是不是null,如果为null返回第二个表达式的值,在这里我们先使用子查询查第二高的工资是不是null,定义第二个表达式是null,如果第二高的工资是null,那么返回null。

ifnull (

(select distinct salary

from Employee

order by salary DESC

limit 1 offset 1),

null) as secondhighestsalary;

解法2:

#这里就是把结果赋值给secondhighsalary,如果结果为空,secondhighsalary会显示null

select 

(select distinct salary from employee

order by salary desc limit 1 offset 1)

as secondhighsalary

181.超过经理收入的员工

解法1:

#先看结果要的是一个名为Employee的员工名字列表,定义它,因为有employee表格名,怕引起歧义所以用字符串'Employee'表示

select a.name as 'Employee'

#要筛选出结果,我们要找出每个员工对应的经理的收入是多少,然后再进行比较,所以需要定义为两个表

from employee as a, employee as b

#用where语句来筛选,两个表中经理的id等同于他们的员工id

where a. managerid = b.id

#where语句筛选条件,员工的工资高于经理的工资

and a.salary > b.salary;

解法2:

select a.name as 'Employee'

#使用同一个表中的两行信息(id,managerid)进行联结,所以使用自联结

from employee as a join employee as b

#自联结这里要用on

on a. managerid = b.id

and a.salary > b.salary;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值