0%

MYSQL-LeetcodePractice-DAY02-排序与修改

静下心来好好做自己,走稳脚下每一步,就是最好的路,强者都是孤独的。

MYSQL-LeetcodePractice-DAY02-排序与修改

1873. 计算特殊奖金

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

考点

1.CASE WHEN 条件判断

👉枚举这个字段所有可能的值,遍历条件并在满足某个条件时返回一个值

语法

1
2
3
4
5
6
 CASE
     WHEN condition1 THEN result1
     WHEN condition2 THEN result2
     WHEN conditionN THEN resultN
     ELSE result
 END;

实例

1
2
3
4
5
6
7
 SELECT OrderID, Quantity,
 CASE
     WHEN Quantity > 30 THEN "The quantity is greater than 30"
     WHEN Quantity = 30 THEN "The quantity is 30"
     ELSE "The quantity is under 30"
 END
 FROM OrderDetails;

2.ORDER BY排序

👉我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。

如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

✍ORDER BY 关键字默认按升序对记录进行排序。 要按降序对记录进行排序,请使用 DESC关键字。

实例

1
2
 👉SELECT * from runoob_tbl ORDER BY submission_date ASC;👆
 👉SELECT * from runoob_tbl ORDER BY submission_date DESC;👇

3.rlike与like

👉用于确定字符串是否匹配正则表达式,主要用于搜索匹配字段中的指定内容。

like语法👇

1
[NOT] LIKE '字符串'

MySQL提供两个通配符,用于与 LIKE运算符一起使用,它们分别是:%_

  • %:允许匹配任何字符串的零个或多个字符。

    1
    2
    3
    4
    5
    6
    7
    ##举例:假设要搜索名字以字符a开头的员工信息,可以在模式末尾使用百分比通配符(%)
    select
    employeeNumber , lastName , firstName
    from
    employees
    where
    firstName like 'a%' ;

    如果知道要搜索包含指定字符串,则可以在模式的开头和结尾使用百分比 %

    1
    2
    3
    4
    5
    6
    select
    employeeNumber , lastName , firstName
    from
    employees
    where
    lastName like '%on%' ;
  • _:允许匹配任何单个字符。

    要查找名字以T开头的员工,以m结尾,并且包含例如Tom,Tim之间的任何单个字符,可以使用下划线通配符来构建模式

    1
    2
    3
    4
    5
    6
    select
    employeeNumber , lastName , firstName
    from
    employees
    where
    lastName like 'T_m' ;
  • 注意👋默认使用LIKE不区分大小写,若需要,加入👉BINARY关键字。

    1
    2
    3
    select name from stu_info where name like 't%'

    select name from stu_info where name like binary 't%'

rlike语法👇

1
expr RLIKE pat

expr是输入字符串,pat是测试字符串的正则表达式。

rlike是不完全匹配

1
2
3
4
5
6
7
8
9
10
11
12
##常用通配符
. : 匹配任意单个字符

* : 匹配0个或多个前一个得到的字符

[] : 匹配任意一个[]内的字符,[ab]*可匹配空串、a、b、或者由任意个a和b组成的字符串。

^ : 匹配开头,如^s匹配以s或者S开头的字符串。

$ : 匹配结尾,如s$匹配以s结尾的字符串。

{n} : 匹配前一个字符反复n次。

4.使用通配符注意事项

①大小写👋MySQL 默认是不区分大小写。

②尾部空格👋尾部空格会干扰通配符的匹配。例如,“T% ”就不能匹配到“Tom”。

③NULL👋%不能匹配到 NULL

代码

1
2
3
4
5
6
7
8
SELECT
employee_id,
CASE WHEN
MOD(employee_id, 2) = 1 AND name not rlike '^M' THEN salary ELSE 0 END AS bonus
FROM
Employees
ORDER BY
employee_id;

627.变更性别

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

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

考点

1.update语句

🔨修改、更新一个或多个表的数据。

①修改表中数据

1
update courses set course_grade = 4;

②根据条件修改表中数据

1
update courses set course_grade = 4 where course_id = 114514;

2.if语句

🔨表达式

1
if(expr1,expr2,expr3)

expr1是TRUE,👉expr2,否则👉expr3

实例

1
2
测试两个字符串是否相同,如果相同则返回 "YES" ,否则返回 "NO":
if(strcmp("hello","bye")=0,"YES","NO")

🔨流程控制语句

1
IFNULL(expr1,expr2)

接受两个参数,如果不是 NULL,则返回第一个参数。 否则,IFNULL函数返回第二个参数。

实例

1
2
3
SELECT IFNULL(1,0); -- returns 1
SELECT IFNULL('',1); -- returns ''
SELECT IFNULL(NULL,'IFNULL function'); -- returns IFNULL function

注意👋:’ ‘不是NULL

3.中间临时表

当遇到一些复杂查询的时候,经常无法一步到位,或者是一步到位会导致查询语句太过复杂,开发和维护的成本过高。这个时候,就可以使用临时表。

临时表是一种特殊的表,用来存储查询的中间结果,并且会随着当前连接的结束而自动删除。

临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。

MYSQL有2种临时表:

①内部临时表:系统自动产生,我们无法看到

②外部临时表:SQL语句创建,我们可以使用

由于采用的存储方式不同,临时表也可分为:内存临时表磁盘临时表

类型 优点 缺点
内存临时表 查询速度快 一旦断电,全部丢失,数据无法找回
磁盘临时表 数据不易丢失 速度相对较慢

代码

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

196.删除重复的电子邮箱

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

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

考点

1.delete语句

🔨删除表中的行。

语法:

1
delete from table_name where some_column = some_value ;

🔨删除表中所有行并保持表结构、属性、索引不变。

1
delete from table_name

官方题解中,DELETE p1就表示从p1表中删除满足 WHERE条件的记录。

2.自连接self join

被用来联接表本身以作为两个表,实际生产中,面对千万上亿级别的数据,连接的效率往往最高,因为用到索引的概率较高。

自连接说白了其实就是两张表结构和数据内容完全一样的表,在做数据处理的时候,我们通常会给它们分别重命名来加以区分,然后进行关联。

用途✍:

①同一张表内进行比较

举例:查找收入超过各自经理的员工的姓名

1
2
3
4
5
6
7
8
9
10
11
 Id | Name  | Salary | ManagerId 
----+-------+--------+-----------
1 | Joe | 70000 | 3
2 | Henry | 80000 | 4
3 | Sam | 60000 | NULL
4 | Max | 90000 | NULL

SELECT e1.Name AS employee_name
FROM Employee AS e1, Employee AS e2
WHERE e1.ManagerId=e2.Id
AND e1.Salary>e2.Salary

②找出列的组合

举例:查找共用同一车站的所有公交路线

1
2
SELECT * FROM route R1, route R2
WHERE R1.stop=R2.stop;

③查找部分内容重复的记录(本题)

3.连接过程👇

①从驱动表(左表)取出N条记录

②拿着这N条记录,依次到被驱动表(右表)查找满足WHERE条件的记录

③N条记录遍历完,删除K条记录,这个DELETE过程就结束了

代码

1
2
delete p1 from Person p1 , Person p2
where p1.email = p2.email AND p1.id > p2.id;
-------------本文结束感谢您的阅读-------------
请作者喝一杯蜜雪冰城吧!