欢迎光临散文网 会员登陆 & 注册

力扣习题练习一

2023-02-17 22:31 作者:泡椒芝士plus  | 我要投稿

1.第二高的薪水

方法一:使用子查询和 LIMIT 子句

算法

将不同的薪资按降序排序,然后使用 LIMIT 子句获得第二高的薪资。

MySQL

SELECT DISTINCT    Salary AS SecondHighestSalaryFROM    EmployeeORDER BY Salary DESCLIMIT 1 OFFSET 1然而,如果没有这样的第二最高工资,这个解决方案将被判断为 “错误答案”,因为本表可能只有一项记录。为了克服这个问题,我们可以将其作为临时表。

MySQL

SELECT    (SELECT DISTINCT            Salary        FROM            Employee        ORDER BY Salary DESC        LIMIT 1 OFFSET 1) AS SecondHighestSalary;

方法二:使用 IFNULL 和 LIMIT 子句

解决 “NULL” 问题的另一种方法是使用 “IFNULL” 函数,如下所示。

MySQL

SELECT    IFNULL(      (SELECT DISTINCT Salary       FROM Employee       ORDER BY Salary DESC        LIMIT 1 OFFSET 1),    NULL) AS SecondHighestSalary

2.组合两个表

表1: Person

+-------------+---------+| 列名         | 类型     |+-------------+---------+| PersonId    | int     || FirstName   | varchar || LastName    | varchar |+-------------+---------+PersonId 是上表主键表2: Address

+-------------+---------+| 列名         | 类型    |+-------------+---------+| AddressId   | int     || PersonId    | int     || City        | varchar || State       | varchar |+-------------+---------+AddressId 是上表主键

方法:使用 outer join

算法

因为表 Address 中的 personId 是表 Person 的外关键字,所以我们可以连接这两个表来获取一个人的地址信息。

考虑到可能不是每个人都有地址信息,我们应该使用 outer join 而不是默认的 inner join。

MySQL

select FirstName, LastName, City, Statefrom Person left join Addresson Person.PersonId = Address.PersonId;注意:如果没有某个人的地址信息,使用 where 子句过滤记录将失败,因为它不会显示姓名信息。

3.分数排名


如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

+----+-------+| Id | Score |+----+-------+| 1  | 3.50  || 2  | 3.65  || 3  | 4.00  || 4  | 3.85  || 5  | 4.00  || 6  | 3.65  |+----+-------+例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

+-------+------+| Score | Rank |+-------+------+| 4.00  | 1    || 4.00  | 1    || 3.85  | 2    || 3.65  | 3    || 3.65  | 3    || 3.50  | 4    |+-------+------+重要提示:对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 Rank

4.删除重复电子邮箱


方法:使用 DELETE 和 WHERE 子句算法

我们可以使用以下代码,将此表与它自身在电子邮箱列中连接起来。

MySQL

SELECT p1.*FROM Person p1,    Person p2WHERE    p1.Email = p2.Email # (自连接);然后我们需要找到其他记录中具有相同电子邮件地址的更大 ID。所以我们可以像这样给 WHERE 子句添加一个新的条件。

MySQL

SELECT p1.*FROM Person p1,    Person p2WHERE    p1.Email = p2.Email AND p1.Id > p2.Id;因为我们已经得到了要删除的记录,所以我们最终可以将该语句更改为 DELETE。

MySQL

DELETE p1 FROM Person p1,    Person p2WHERE    p1.Email = p2.Email AND p1.Id > p2.Id

5.上升的温度

1.select p1.id

from Weather p1,Weather p2

where datediff(p1.recordDate,p2.recordDate)=1 and p1.Temperature>p2.Temperature


2.

SELECT

#   weather.id AS 'Id'

# FROM

#   weather

#     JOIN

#   weather w ON DATEDIFF(weather.recordDate, w.recordDate) = 1

#     AND weather.Temperature > w.Temperature


6.查询结果的质量和占比

解法一:SELECT

 query_name,

 ROUND(AVG(rating/position), 2) quality,

 ROUND(100*avg(rating<3), 2) poor_query_percentage

FROM Queries

GROUP BY query_name

要点:round(精度,标度),与函数混合使用放在前面,如,round(avg/max(),标度)


力扣习题练习一的评论 (共 条)

分享到微博请遵守国家法律