回城传送–》《32天SQL筑基》
零、前言
今天是学习 SQL 打卡的第 8 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。
希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。
虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。
今天的学习内容是:SQL进阶-更新记录
一、练习题目
题目链接 难度 更新记录:SQL113 更新记录(一) ★★☆☆☆ 更新记录:SQL114 更新记录(二) ★★★☆☆
二、SQL思路
更新记录:SQL113 更新记录(一)
初始化数据
drop table if EXISTS examination_info;
CREATE TABLE IF NOT EXISTS examination_info (
id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID' ,
exam_id int UNIQUE NOT NULL COMMENT '试卷ID' ,
tag varchar ( 32 ) COMMENT '类别标签' ,
difficulty varchar ( 8 ) COMMENT '难度' ,
duration int NOT NULL COMMENT '时长' ,
release_time datetime COMMENT '发布时间'
) CHARACTER SET utf8 COLLATE utf8_bin;
TRUNCATE examination_info;
INSERT INTO examination_info( exam_id, tag, difficulty, duration, release_time) VALUES
( 9001 , 'SQL' , 'hard' , 60 , '2020-01-01 10:00:00' ) ,
( 9002 , 'python' , 'easy' , 60 , '2020-01-01 10:00:00' ) ,
( 9003 , 'Python' , 'medium' , 80 , '2020-01-01 10:00:00' ) ,
( 9004 , 'PYTHON' , 'hard' , 80 , '2020-01-01 10:00:00' ) ;
解法
要求处理:
请把examination_info表中tag为PYTHON的tag字段全部修改为Python。
分析:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
套用语法
UPDATE examination_info
SET tag = 'Python'
WHERE tag= 'PYTHON'
更新记录:SQL114 更新记录(二)
初始化数据
drop table if EXISTS exam_record;
CREATE TABLE IF NOT EXISTS exam_record (
id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID' ,
uid int NOT NULL COMMENT '用户ID' ,
exam_id int NOT NULL COMMENT '试卷ID' ,
start_time datetime NOT NULL COMMENT '开始时间' ,
submit_time datetime COMMENT '提交时间' ,
score tinyint COMMENT '得分'
) CHARACTER SET utf8 COLLATE utf8_general_ci;
INSERT INTO exam_record( uid, exam_id, start_time, submit_time, score) VALUES
( 1001 , 9001 , '2020-01-02 09:01:01' , '2020-01-02 09:21:01' , 80 ) ,
( 1001 , 9002 , '2021-09-01 09:01:01' , '2021-09-01 09:21:01' , 90 ) ,
( 1002 , 9001 , '2021-08-02 19:01:01' , null , null ) ,
( 1002 , 9002 , '2021-09-05 19:01:01' , '2021-09-05 19:40:01' , 89 ) ,
( 1003 , 9001 , '2021-09-02 12:01:01' , null , null ) ,
( 1003 , 9002 , '2021-09-01 12:01:01' , null , null ) ;
解法
要求处理:
请把exam_record表中2021年9月1日之前开始作答的未完成记录全部改为被动完成,即:将完成时间改为’2099-01-01 00:00:00’,分数改为0。
分析:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
exam_record表中2021年9月1日之前开始作答的未完成记录,就是没有提交时间的记录,意味着submit_time字段的值是为null的 要把完成时间改为’2099-01-01 00:00:00’,分数改为0
套用语法
UPDATE exam_record
SET submit_time= '2099-01-01 00:00:00' ,
score= 0
WHERE start_time< '2021-09-01'
AND submit_time is null
三、扩展
1、更新数据表中的所有记录
更新数据表中的所有记录,只需要将UPDATE语句的WHERE条件省略即可
2、更新表中特定的数据行
MySQL支持更新表中特定的数据行,此时,需要添加WHERE条件对更新的数据记录进行限制。
更新记录:SQL113 更新记录(一)就是这样的
3、更新某个范围内的数据
MySQL支持更新某个范围内的数据,可以通过BETWEEN…AND语句或者“>”“>=”“<”“<=”“<>”“!=”等运算符,或者LIKE、IN、NOT IN等语句实现。
更新记录:SQL114 更新记录(二)就是这样的
4、更新符合正则表达式的数据
MySQL中匹配正则表达式需要使用关键字REGEXP ,在REGEXP 关键字后面跟上正则表达式的规则即可。
例如:examination_info表有如下的数据 要对difficulty字段的值是以sy结尾的记录数据,更新duration值为61
刚好说到SQL的正则表达式,这里简单介绍几句
开始支持的版本:3.22.21 ,所以可放心使用 SQL正则表达式提供了四种函数:
REGEXP_LIKE (匹配) REGEXP_INSTR (包含) REGEXP_REPLACE (替换) REGEXP_SUBSTR (提取)
正则表达式常用字
常用的正则表达式:
匹配由26 个英文字母组成的字符串: ^ [ A- Za- z] + $
匹配由26 个英文字母的大写组成的字符串: ^ [ A- Z] + $
匹配由26 个英文字母的小写组成的字符串: ^ [ a- z] + $
匹配由数字和26 个英文字母组成的字符串: ^ [ A- Za- z0- 9 ] + $
匹配由数字和26 个英文字母或者下划线组成的字符串: ^ \w+ $
匹配整数: ^ - ?[ 1 - 9 ] \d* $
匹配正整数: ^ [ 1 - 9 ] \d* $
匹配负整数: ^ - [ 1 - 9 ] \d* $
匹配非负整数: ^ [ 1 - 9 ] \d* | 0 $
匹配非正整数: ^ - [ 1 - 9 ] \d* | 0 $
电子邮箱: ^ ( [ a- z0- 9 _\. - ] + ) @( [ \da- z\. - ] + ) \. ( [ a- z\. ] {2 , 6 }) $
URL : ^ ( https?:\/ \/ ) ?( [ \da- z\. - ] + ) \. ( [ a- z\. ] {2 , 6 }) ( [ \/ \w \. - ] * ) * \/ ?$
IP地址: ^ ( ?:( ?:25 [ 0 - 5 ] | 2 [ 0 - 4 ] [ 0 - 9 ] | [ 01 ] ?[ 0 - 9 ] [ 0 - 9 ] ?) \. ) {3 }( ?:25 [ 0 - 5 ] | 2 [ 0 - 4 ] [ 0 - 9 ] | [ 01 ] ?[ 0 - 9 ] [ 0 - 9 ] ?) $
HTML标签: ^ < ( [ a- z] + ) ( [ ^ < ] + ) * ( ?:> ( . * ) < \/ \1 > | \s+ \/ > ) $
SQL 语句: ^ ( select | drop | delete | create | update | insert ) . * $
邮政编码: ^ [ 1 - 9 ] \d{5 }( ?! \d) $
Unicode编码中文字符串: ^ [ u4e00- u9fa5] , {0 , }$
空白行: \n[ \s| ] * \r
首尾空格: ( ^ \s* ) | ( \s* $)
双字节字符: [ ^ \x00- \xff]
四、参考
SQL正则表达式:https://blog.csdn.net/hyfstyle/article/details/114640134 mysql 入门技能树-数据修改:https://edu.csdn.net/skill/mysql/mysql-2eb9e9d351e848f580b70cf9e7b93280?category=1087&typeId=81219
我是虚竹哥,我们明天见~