力扣上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;