LeetCode MySQL 刷题条记 (二)

91 阅读4分钟

「4月日新计划更文活动」

题目:1873. 计算特殊奖金

+-------------+---------+
| 列名        | 类型     |
+-------------+---------+
| employee_id | int     |
| name        | varchar |
| salary      | int     |
+-------------+---------+
employee_id 是这个表的主键。
此表的每一行给出了雇员id ,名字和薪水。

需求

写出一个SQL 查询语句,计算每个雇员的奖金。如果一个雇员的id是奇数并且他的名字不是以'M'开头,那么他的奖金是他工资的100%,否则奖金为0。 Return the result table ordered by employee_id. 返回的结果集请按照employee_id排序

解析

# Write your MySQL query statement below

select employee_id,(salary * 1) as bonus  from Employees  where employee_id  in 
(select employee_id   from Employees where mod(employee_id,2)!=0 and name not like 'M%' ) union

select employee_id,(salary * 0) as bonus   from Employees  where employee_id  in 
(select employee_id   from Employees where mod(employee_id,2)=0 or name  like 'M%' ) order by employee_id
select employee_id ,
(case  when mod(employee_id ,2)!=0 and name not like 'M%' THEN  salary when MOD(employee_id,2)=0 or name like 'M%' THEN  0 end)  as bonus 
from Employees 
order by employee_id 

题目:627. 变更性别

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| id          | int      |
| name        | varchar  |
| sex         | ENUM     |
| salary      | int      |
+-------------+----------+
id 是这个表的主键。
sex 这一列的值是 ENUM 类型,只能从 ('m', 'f') 中取。
本表包含公司雇员的信息。

需求

请你编写一个 SQL 查询来交换所有的 'f' 和 'm' (即,将所有 'f' 变为 'm' ,反之亦然),仅使用 单个 update 语句 ,且不产生中间临时表。

注意,你必须仅使用一条 update 语句,且 不能 使用 select 语句。

解析

# Write your MySQL query statement below

update  Salary  set   sex = (case sex  when 'm' then 'f' else 'm' end)
# Write your MySQL query statement below

update salary set sex = if(sex='m','f','m'); 

题目:196. 删除重复的电子邮箱

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+
id是该表的主键列。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。


需求

编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。 以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)

解析

# Please write a DELETE statement and DO NOT write a SELECT statement.
# Write your MySQL query statement below

delete p1  from  person p1 , person p2 where  p1.email = p2.email and p1.id > p2.id

知识点

CASE WHEN THEN END函数
  • case ... when ... then ... when ... then ... END
    • 定义:当需要在查询中根据不同的条件对不同的字段进行计算或者返回不同的值时,可以使用CASE WHEN END函数。
    • 解释:CASE是一个关键字,用于定义CASE语句。WHEN是一个子句,可以根据满足的条件执行相应的操作。ELSE是可选的子句,用于在所有其他条件都不满足时返回一个默认值。END是用于结束CASE语句的关键字
  • 栗子627🌰:(case sex when 'm' then 'f' else 'm' end)
  • 解释:具体来说,这个SQL语句的作用是将所有性别为'm'的行替换为'f',将所有性别为'f'的行替换为'm'。在这个SQL语句中,当性别为'm'时,CASE函数返回'f',否则返回'm'。这样就实现了性别的替换。
IF 函数
  • 栗子627🌰:if(sex='m','f','m');
  • 在该语句中,IF函数是一种条件函数,它接受三个参数:第一个参数是要测试的条件,第二个参数是条件为真时返回的值,第三个参数是条件为假时返回的值。
  • 解释:在这个例子中,IF函数的第一个参数是“sex='m'”,也就是要测试性别是否为男性。如果性别为男性,则将其替换为女性,即第二个参数为“'f'”;否则将其替换为男性,即第三个参数为“'m'”。
  • 总结栗子是一个🌰,函数却不是一个函数,SQL语句相同,只是使用了不同的条件函数来实现。
DISTINCT关键词
  • 定义:用于去除查询结果中重复记录的关键字
  • select 语句格式SELECT DISTINCT column1, column2, ...FROM table_name;
  • delete 语句格式DELETE DISTINCT FROM table_name WHERE conditions;
  • 注意⚠️: 删除的数据是不可逆的,防止删除有误,建议在进行删除操作前做好备份。
  • 特别点:DELETE FROM语句中可以使用表的别名,一般正常delete 的语句格式都是放在from之后,当然也可以像栗子196🌰一样,在DELETE FROM语句中使用了p1作为表person 的别名 。
    • egdelete p1 from person p1