前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL 进阶挑战(1 - 5)

SQL 进阶挑战(1 - 5)

作者头像
村雨遥
发布2022-06-13 08:10:19
3810
发布2022-06-13 08:10:19
举报
文章被收录于专栏:JavaPark

SQL1 插入记录(一)

描述

牛客后台会记录每个用户的试卷作答记录到 exam_record 表,现在有两个用户的作答记录详情如下:

  • 用户 1001 在 2021 年 9 月 1 日晚上 10 点 11 分 12 秒开始作答试卷 9001,并在 50分钟后提交,得了 90 分;
  • 用户 1002 在2021年9月4日上午7点1分2秒开始作答试卷 9002,并在10分钟后退出了平台。

试卷作答记录表 exam_record 中,表已建好,其结构如下。

Filed

Type

Null

Key

Extra

Default

Comment

id

int(11)

NO

PRI

auto_increment

(NULL)

自增ID

uid

int(11)

NO

(NULL)

用户ID

exam_id

int(11)

NO

(NULL)

试卷ID

start_time

datetime

NO

(NULL)

开始时间

submit_time

datetime

YES

(NULL)

提交时间

score

tinyint(4)

YES

(NULL)

得分

该题最后会通过执行 SELECT uid, exam_id, start_time, submit_time, score FROM exam_record;来对比结果

问题

请用一条语句将这两条记录插入表中。

示例

代码语言:javascript
复制
输入:
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;
TRUNCATE exam_record;
复制
输出:
1001|9001|2021-09-01 22:11:12|2021-09-01 23:01:12|90
1002|9002|2021-09-04 07:01:02|None|None

解答

主要考察的是插入语句,其语法如下:

代码语言:javascript
复制
INSERT INTO [表名] [字段名] VALUES [记录1、记录2];

要注意的是表中的 id 是自增的,所以我们不需要插入该字段,所以此处需要指定插入记录所对应的字段,最终得到的答案如下。

代码语言:javascript
复制
INSERT INTO exam_record (uid, exam_id, start_time, submit_time, score)
VALUES
(1001, 9001, "2021-09-01 22:11:12", "2021-09-01 23:01:12", 90),
(1002, 9002, '2021-09-04 07:01:02', NULL, NULL);

当然,我们也可以不用指定字段,但是此时需要指定 id 字段的值,因为该字段设置的是自增,所以插值时只需要将其设置为 NULL 即可,最终得到的答案如下。

代码语言:javascript
复制
INSERT INTO exam_record
VALUES
(NULL, 1001, 9001, "2021-09-01 22:11:12", "2021-09-01 23:01:12", 90),
(NULL, 1002, 9002, '2021-09-04 07:01:02', NULL, NULL);

SQL2 插入记录(二)

描述

现有一张试卷作答记录表 exam_record,结构如下表,其中包含多年来的用户作答试卷记录,由于数据越来越多,维护难度越来越大,需要对数据表内容做精简,历史数据做备份。

表 exam_record:

Filed

Type

Null

Key

Extra

Default

Comment

id

int(11)

NO

PRI

auto_increment

(NULL)

自增ID

uid

int(11)

NO

(NULL)

用户ID

exam_id

int(11)

NO

(NULL)

试卷ID

start_time

datetime

NO

(NULL)

开始时间

submit_time

datetime

YES

(NULL)

提交时间

score

tinyint(4)

YES

(NULL)

得分

问题

我们已经创建了一张新表 exam_record_before_2021 用来备份 2021 年之前的试题作答记录,结构和 exam_record 表一致,请将2021年之前的已完成了的试题作答纪录导入到该表。

后台会通过执行 “SELECT * FROM exam_record_before_2021;” 语句来对比结果。

示例

代码语言:javascript
复制
输入:
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;
CREATE TABLE IF NOT EXISTS exam_record_before_2021 (
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;
TRUNCATE exam_record;
TRUNCATE exam_record_before_2021;
INSERT INTO exam_record(uid,exam_id,start_time,submit_time,score) VALUES
(1001, 9001, '2020-01-01 09:00:01', null, null),
(1001, 9002, '2020-01-02 09:01:01', '2020-01-02 09:21:01', 70),
(1001, 9002, '2020-09-02 09:00:01', null, null),
(1002, 9001, '2021-05-02 10:01:01', '2021-05-02 10:30:01', 81),
(1002, 9002, '2021-09-02 12:01:01', null, null);
输出:
1|1001|9002|2020-01-02 09:01:01|2020-01-02 09:21:01|70

解答

主要考察从一个表插入到另一个表,其语法如下:

代码语言:javascript
复制
INSERT INTO [新数据表名] SELECT * FROM [旧数据表名] WHERE [条件语句];

然后套用上面的语法,将对应数据表名和字段进行替换即可。

代码语言:javascript
复制
INSERT INTO exam_record_before_2021(uid, exam_id, start_time, submit_time, score)
SELECT uid, exam_id, start_time, submit_time, score
FROM exam_record
WHERE YEAR(submit_time) < '2021';

SQL3 插入记录(三)

描述

现在有一套ID为9003的高难度SQL试卷,时长为一个半小时,请你将 2021-01-01 00:00:00 作为发布时间插入到试题信息表 examination_info(其表结构如下图)。

试题信息表 examination_info:

Filed

Type

Null

Key

Extra

Default

Comment

id

int(11)

NO

PRI

auto_increment

(NULL)

自增ID

exam_id

int(11)

NO

UNI

(NULL)

试卷ID

tag

varchar(32)

YES

(NULL)

类别标签

difficulty

varchar(8)

YES

(NULL)

难度

duration

int(11)

NO

(NULL)

时长(分钟数)

release_time

datetime

YES

(NULL)

发布时间

问题

不管该ID试卷是否存在,都要插入成功,请尝试插入它。

后台会通过执行 SELECT exam_id,tag,difficulty,duration,release_time FROM examination_info 语句来对比结果。

示例

代码语言:javascript
复制
输入:
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, '算法', 'easy', 60, '2020-01-01 10:00:00'),
(9003, 'SQL', 'medium', 60, '2020-01-02 10:00:00'),
(9004, '算法', 'hard', 80, '2020-01-01 10:00:00');
输出:
9001|SQL|hard|60|2020-01-01 10:00:00
9002|算法|easy|60|2020-01-01 10:00:00
9004|算法|hard|80|2020-01-01 10:00:00
9003|SQL|hard|90|2021-01-01 00:00:00

解答

一种是曲线救国的方式,我们假设 examination_info 中有 exam_id9003 的数据,先将其从数据库中删除,然后再将数据插入进去。

代码语言:javascript
复制
DELETE FROM examination_info
WHERE exam_id = 9003;
INSERT INTO examination_info
VALUES (NULL, 9003, "SQL", "hard", "90", "2021-01-01 00:00:00")

而另一种则是利用 REPLACE 语句实现带更新的插入,其语法结构如下:

代码语言:javascript
复制
REPLACE INTO [表名] VALUES (value1, value2……)
代码语言:javascript
复制
REPLACE INTO examination_info VALUES
 (NULL, 9003, "SQL", "hard", 90, "2021-01-01 00:00:00");

SQL4 更新记录(一)

描述

现有一张试卷信息表examination_info,表结构如下图所示:

Filed

Type

Null

Key

Extra

Default

Comment

id

int(11)

NO

PRI

auto_increment

(NULL)

自增ID

exam_id

int(11)

NO

UNI

(NULL)

试卷ID

tag

char(32)

YES

(NULL)

类别标签

difficulty

char(8)

YES

(NULL)

难度

duration

int(11)

NO

(NULL)

时长

release_time

datetime

YES

(NULL)

发布时间

问题

请把 examination_info 表中 tag 为 PYTHON 的 tag 字段全部修改为 Python。

后台会通过执行 'SELECT exam_id,tag,difficulty,duration,release_time FROM examination_info;'语句来对比结果。

示例

代码语言:javascript
复制
输入:
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');
输出:
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

解答

主要考察更新语句。

代码语言:javascript
复制
UPDATE 表名 SET 字段1=‘替换内容1’,字段2=‘替换内容3’ WHERE ....

将标签满足为 PYTHON 的记录的 tag 全部更新为 Python 即可。

代码语言:javascript
复制
UPDATE examination_info
SET tag = "Python"
WHERE tag = "PYTHON";

SQL5 更新记录(二)

描述

现有一张试卷作答记录表exam_record,其中包含多年来的用户作答试卷记录,结构如下表:

作答记录表exam_record:

submit_time为 完成时间

Filed

Type

Null

Key

Extra

Default

Comment

id

int(11)

NO

PRI

auto_increment

(NULL)

自增ID

uid

int(11)

NO

(NULL)

用户ID

exam_id

int(11)

NO

(NULL)

试卷ID

start_time

datetime

NO

(NULL)

开始时间

submit_time

datetime

YES

(NULL)

提交时间

score

tinyint(4)

YES

(NULL)

得分

问题

请把exam_record表中2021年9月1日之前开始作答的未完成记录全部改为被动完成,即:将完成时间改为’2099-01-01 00:00:00’,分数改为0。

示例

代码语言:javascript
复制
输入:
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);
输出:
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|2099-01-01 00:00:00|0
1002|9002|2021-09-05 19:01:01|2021-09-05 19:40:01|89
1003|9001|2021-09-02 12:01:01|None|None
1003|9002|2021-09-01 12:01:01|None|None

解答

同样主要考察更新语句:

代码语言:javascript
复制
UPDATE [表名] SET 字段名="新值" WHERE 条件语句;

根据题意,要将满足条件的记录全部改成被动完成即可。

代码语言:javascript
复制
UPDATE exam_record
SET submit_time='2099-01-01 00:00:00', score = 0
WHERE start_time < '2021-09-01 00:00:00' AND score IS NULL;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SQL1 插入记录(一)
    • 描述
      • 问题
        • 示例
          • 解答
          • SQL2 插入记录(二)
            • 描述
              • 问题
                • 示例
                  • 解答
                  • SQL3 插入记录(三)
                    • 描述
                      • 问题
                        • 示例
                          • 解答
                          • SQL4 更新记录(一)
                            • 描述
                              • 问题
                                • 示例
                                  • 解答
                                  • SQL5 更新记录(二)
                                    • 描述
                                      • 问题
                                        • 示例
                                          • 解答
                                          领券
                                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档