静下心来好好做自己,走稳脚下每一步,就是最好的路,强者都是孤独的。
MYSQL-LeetcodePractice-DAY02-排序与修改
1873. 计算特殊奖金
写出一个SQL 查询语句,计算每个雇员的奖金。如果一个雇员的id是奇数并且他的名字不是以’M’开头,那么他的奖金是他工资的100%,否则奖金为0。返回的结果集请按照employee_id排序。
考点
1.CASE WHEN 条件判断
👉枚举这个字段所有可能的值,遍历条件并在满足某个条件时返回一个值
语法
1 | CASE |
实例
1 | SELECT OrderID, Quantity, |
2.ORDER BY排序
👉我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。
如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
✍ORDER BY 关键字默认按升序对记录进行排序。 要按降序对记录进行排序,请使用 DESC关键字。
实例
1 | 👉SELECT * from runoob_tbl ORDER BY submission_date ASC;👆 |
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
6select
employeeNumber , lastName , firstName
from
employees
where
lastName like '%on%' ;_
:允许匹配任何单个字符。要查找名字以T开头的员工,以m结尾,并且包含例如Tom,Tim之间的任何单个字符,可以使用下划线通配符来构建模式
1
2
3
4
5
6select
employeeNumber , lastName , firstName
from
employees
where
lastName like 'T_m' ;注意👋默认使用LIKE不区分大小写,若需要,加入👉BINARY关键字。
1
2
3select 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 | ##常用通配符 |
4.使用通配符注意事项
①大小写👋MySQL 默认是不区分大小写。
②尾部空格👋尾部空格会干扰通配符的匹配。例如,“T% ”就不能匹配到“Tom”。
③NULL👋%不能匹配到 NULL
代码
1 | SELECT |
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 | 测试两个字符串是否相同,如果相同则返回 "YES" ,否则返回 "NO": |
🔨流程控制语句
1 | IFNULL(expr1,expr2) |
接受两个参数,如果不是 NULL
,则返回第一个参数。 否则,IFNULL
函数返回第二个参数。
实例
1 | SELECT IFNULL(1,0); -- returns 1 |
注意👋:’ ‘不是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 | Id | Name | Salary | ManagerId |
②找出列的组合
举例:查找共用同一车站的所有公交路线
1 | SELECT * FROM route R1, route R2 |
③查找部分内容重复的记录(本题)
3.连接过程👇
①从驱动表(左表)取出N条记录
②拿着这N条记录,依次到被驱动表(右表)查找满足WHERE条件的记录
③N条记录遍历完,删除K条记录,这个DELETE过程就结束了
代码
1 | delete p1 from Person p1 , Person p2 |