• LeetCode SQL专项练习 排序 & 修改(2)


    1873. 计算特殊奖金

    表: Employees

    +-------------+---------+
    | 列名        | 类型     |
    +-------------+---------+
    | employee_id | int     |
    | name        | varchar |
    | salary      | int     |
    +-------------+---------+
    employee_id 是这个表的主键。
    此表的每一行给出了雇员id ,名字和薪水。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    写出一个SQL 查询语句,计算每个雇员的奖金。如果一个雇员的id是奇数并且他的名字不是以’M’开头,那么他的奖金是他工资的100%,否则奖金为0。

    Return the result table ordered by employee_id.

    返回的结果集请按照employee_id排序。

    查询结果格式如下面的例子所示。

    输入:
    Employees 表:
    +-------------+---------+--------+
    | employee_id | name    | salary |
    +-------------+---------+--------+
    | 2           | Meir    | 3000   |
    | 3           | Michael | 3800   |
    | 7           | Addilyn | 7400   |
    | 8           | Juan    | 6100   |
    | 9           | Kannon  | 7700   |
    +-------------+---------+--------+
    输出:
    +-------------+-------+
    | employee_id | bonus |
    +-------------+-------+
    | 2           | 0     |
    | 3           | 0     |
    | 7           | 7400  |
    | 8           | 0     |
    | 9           | 7700  |
    +-------------+-------+
    解释:
    因为雇员id是偶数,所以雇员id 是28的两个雇员得到的奖金是0。
    雇员id为3的因为他的名字以'M'开头,所以,奖金是0。
    其他的雇员得到了百分之百的奖金。
    
    来源:力扣(LeetCode)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    题解

    select employee_id,case 
            when name not like "M%" and employee_id % 2= 1 then salary
            else 0
            end bonus
    from Employees
    order by employee_id;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    627. 变更性别

    +-------------+----------+
    | Column Name | Type     |
    +-------------+----------+
    | id          | int      |
    | name        | varchar  |
    | sex         | ENUM     |
    | salary      | int      |
    +-------------+----------+
    id 是这个表的主键。
    sex 这一列的值是 ENUM 类型,只能从 ('m', 'f') 中取。
    本表包含公司雇员的信息。
    
    来源:力扣(LeetCode)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

    查询结果如下例所示。

    输入:
    Salary 表:
    +----+------+-----+--------+
    | id | name | sex | salary |
    +----+------+-----+--------+
    | 1  | A    | m   | 2500   |
    | 2  | B    | f   | 1500   |
    | 3  | C    | m   | 5500   |
    | 4  | D    | f   | 500    |
    +----+------+-----+--------+
    输出:
    +----+------+-----+--------+
    | id | name | sex | salary |
    +----+------+-----+--------+
    | 1  | A    | f   | 2500   |
    | 2  | B    | m   | 1500   |
    | 3  | C    | f   | 5500   |
    | 4  | D    | m   | 500    |
    +----+------+-----+--------+
    解释:
    (1, A)(3, C)'m' 变为 'f'(2, B)(4, D)'f' 变为 'm' 。
    
    来源:力扣(LeetCode)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    题解1

    update salary
    set sex = if(sex='m','f','m');
    # IF(expr1,expr2,expr3)  expr1为真返回expr2 为假返回expr3
    
    • 1
    • 2
    • 3

    题解二

    UPDATE salary
    SET
        sex = CASE sex
            WHEN 'm' THEN 'f'
            ELSE 'm'
        END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    196. 删除重复的电子邮箱

    表: Person

    +-------------+---------+
    | Column Name | Type    |
    +-------------+---------+
    | id          | int     |
    | email       | varchar |
    +-------------+---------+
    id是该表的主键列。
    该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。

    以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)

    查询结果格式如下所示。

    来源:力扣(LeetCode)

    输入: 
    Person 表:
    +----+------------------+
    | id | email            |
    +----+------------------+
    | 1  | john@example.com |
    | 2  | bob@example.com  |
    | 3  | john@example.com |
    +----+------------------+
    输出: 
    +----+------------------+
    | id | email            |
    +----+------------------+
    | 1  | john@example.com |
    | 2  | bob@example.com  |
    +----+------------------+
    解释: john@example.com重复两次。我们保留最小的Id = 1。
    
    来源:力扣(LeetCode)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    题解1
    先按邮箱分组,然后取出来id最小的值,

    DELETE from Person
    WHERE id not in (SELECT id from(SELECT min(id) id
    FROM Person
    group by email) t1);
    
    • 1
    • 2
    • 3
    • 4

    必须使用中间表,因为mysql不支持在一个表同时实现查找和删除、
    报错内容
    You can‘t specify target table ‘Person‘ for update in FROM clause

    题解2(官方题解)
    自联结,推荐使用

    DELETE p1 FROM Person p1,Person p2
    WHERE p1.Email = p2.Email AND p1.Id > p2.Id
    # p1.Id > p2.Id保证连接到的都是id比自己大的,满足这个条件就会被删除
    
    • 1
    • 2
    • 3

    题解3
    使用窗口函数

    DELETE from Person
    WHERE id not in (
        select id 
        from (select id,RANK () over(partition by email order by id) top from Person) t
        WHERE top = 1)
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    [附源码]计算机毕业设计学生疫情防控信息填报系统Springboot程序
    系统的安全性需求
    2022牛客多校联赛加赛 题解
    【华为OD机试真题 JS】叠积木
    软考系列(系统架构师)- 2009年系统架构师软考案例分析考点
    OpenHarmony IPC通讯详解
    大厂真题:【贪心】大疆2023秋招-矩形田地
    100ms的SQL把服务器搞崩溃了
    手把手教你实现一个JavaWeb项目:创建一个自己的网页博客系统(前端+后端)(一)
    理解树状数组这一篇文章就够啦
  • 原文地址:https://blog.csdn.net/qq_52007481/article/details/126119275