大家好,我是RecordLiu!
今天给大家分享的是SQL插入记录的不同方式,我会用几道真题来给大家讲解。
题目直达链接:牛客网SQL编程练习
切换到SQL篇就能看到了。
我这里先列下知识点:
- 如何往表里面插入多行数据?
- 如何把一张表里面的数据备份到另一表?
- 如何替换表中已存在的行记录?
接下来,我们详细看看。
题目1:插入多行数据
描述
牛客网的用户答题记录保存在exam_record表中。现在有两个用户的答题记录需要插入到答题记录表中。主要信息如下:
- 用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001,并在50分钟后提交,得了90分。
- 用户1002在2021年9月4日上午7点1分2秒开始作答试卷9002,并在10分钟后退出了平台。
请用一条语句将这两条记录插入表中exam_record中。该题会通过执行以下语句来验证结果。
SELECT uid, exam_id, start_time, submit_time, score FROM exam_record
表exam_record结构
输出
SQL插入记录知识点
SQL中插入记录使用以下语法规则:
INSERT INTO tableName(column1,column2...) VALUES(value1,vaule2...)
其中,列名和值需要一一对应。
如果需要插入全部字段,也可以使用以下简写形式:
INSERT INTO tableName VALUES(values1,values2...)
对于自增长主键id,在插入时,如果没有要求,可以不进行不设置值。在直接赋值为NULL后,SQL会自动生成一个最新的ID插入到表中。
比如表里面有两条ID为1和2的记录,下次新增的记录ID将从3开始。
对于同时插入多条记录,可以使用多个values,每个values用英文逗号分割。
主要语法如下:
INSERT INTO tableName VALUES(values1,values2...),VALUES(values1,values2...)
题解
在插入记录前,我们需要先了解表结构,主要查看字段定义的数据类型是什么、是否允许为空,主键定义为哪些字段,有哪些索引(普通索引、唯一锁定),还有可能需要看下哪个字段为外键(涉及表连接时)。
一般,对于数据分析师来说,我们了解一个公司的业务,就是从了解数据开始的。
从表exam_record结构中,可以看到id为主键且为自增长id,在插入时,不需要指定值,可以赋值为NULL。
用户ID(uid)、试卷ID(exam_id)、开始时间(start_time)不允许为空,在插入是必须指定值。
提交时间(submit_time)、得分(score)允许为空,在插入时可以为空。
用户1001做完题并且有进行提交,除了id字段赋值为NULL外,其他字段都需要值。
用户1002开始了一道题,但中途退出了平台,所以提交时间和得分字段没有值,需要赋值为NULL,id也可以直接赋值为NULL。
代码参考
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);
题目2:备份数据
描述
牛客网的试卷作答记录表exam_record保存了多年来的用户作答试卷记录,由于数据越来越多,维护难度越来越大,需要对数据表内容做精简,对历史数据做备份。
现在已经创建了另外一张新表exam_record_before_2021用来备份2021年之前的试题作答记录,结构和exam_record表一致,请将2021年之前的已完成了的试题作答纪录导入到该表。
最后会通过以下SQL语句进行对比结果:
SELECT * FROM exam_record_before_2021;
表exam_record结构
题目输入
题目输出
题解
把一张表里面的数据备份到另一张表,可以使用*insert into…select…*语法,具体规则如下:
INSERT INTO tableBackup
SELECT xxx FROM tableOrigin [WHERE xxx]
也就是说,我们可以直接把select的结果插入到另一张表。
本题中限定的是2021年以前而且已经完成了答题的记录插入到新表中,过滤条件可以写为year(submit_time) < 2021 AND submit_time IS NOT NULL
。
此外,插入到新表时需要重新生成ID,SELECT查询对应的ID应为NULL。
题目中并没有明确说明要重新生成过ID,但我们可以从数据的输入输出可以看出:1001用户在2020年答题的这条记录,在旧表中按插入的顺序ID应该为2,在新表查询中,ID为1,因此需要重新生成过ID。
代码参考
INSERT INTO exam_record_before_2021
SELECT NULL,uid,exam_id,start_time,submit_time,score FROM exam_record
WHERE year(submit_time) < 2021 AND submit_time IS NOT NULL;
替换数据
描述
现在有一套ID为9003的高难度SQL试卷,时长为一个半小时,请你将 2021-01-01 00:00:00 作为发布时间插入到试题信息表examination_info,不管该ID试卷是否存在,都要插入成功,请尝试插入它。
题目最终会通过执行以下语句来对比结果:
SELECT exam_id,tag,difficulty,duration,release_time FROM examination_info 语句来对比结果。
试题信息表examination_info
输出
题解
本题我们可以使用两条SQL语句去实现,第一步先删除试卷ID为9003的记录,然后再重新插入记录,SQL代码实现如下:
DELETE FROM examination_info WHERE exam_id=9003;
INSERT INTO examination_info
VALUES(NULL,9003,'SQL','hard',90,'2021-01-01 00:00:00');
那有没有办法通过一条SQL语句代替呢?我们也可以使用replace into来实现。
replace into功能类似于insert into方法,不同点在于:
- replace into在插入前会先判断记录是否存在(根据表里面的主键id或者唯一索引),如果已存在会删除记录再重新进行插入。
- 不存在则直接插入。
需要注意的是使用replace into表里面必须要设置主键或者唯一索引,否则,replace into会直接插入数据,导致表中出现重复数据。
replace into实现参考如下:
REPLACE INTO examination_info VALUES(NULL,9003,'SQL','hard',90,'2021-01-01 00:00:00');
好了,今天的文章就分享到这里了,如果觉得我的文章对你有帮助,欢迎多分享给你身边的朋友。
我们下期再见!