SQL插入记录方式汇总,真题练习

news/2024/7/24 11:34:41

大家好,我是RecordLiu!

今天给大家分享的是SQL插入记录的不同方式,我会用几道真题来给大家讲解。

题目直达链接:牛客网SQL编程练习

切换到SQL篇就能看到了。

我这里先列下知识点:

  1. 如何往表里面插入多行数据?
  2. 如何把一张表里面的数据备份到另一表?
  3. 如何替换表中已存在的行记录?

接下来,我们详细看看。

题目1:插入多行数据

描述

牛客网的用户答题记录保存在exam_record表中。现在有两个用户的答题记录需要插入到答题记录表中。主要信息如下:

  1. 用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001,并在50分钟后提交,得了90分。
  2. 用户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方法,不同点在于:

  1. replace into在插入前会先判断记录是否存在(根据表里面的主键id或者唯一索引),如果已存在会删除记录再重新进行插入。
  2. 不存在则直接插入。

需要注意的是使用replace into表里面必须要设置主键或者唯一索引,否则,replace into会直接插入数据,导致表中出现重复数据。

replace into实现参考如下:

REPLACE INTO examination_info VALUES(NULL,9003,'SQL','hard',90,'2021-01-01 00:00:00');

好了,今天的文章就分享到这里了,如果觉得我的文章对你有帮助,欢迎多分享给你身边的朋友。

我们下期再见!


http://www.niftyadmin.cn/n/208836.html

相关文章

CMake入门教程【基础篇】4.target_include_directories包含指定文件夹头文件

target_include_directories包含指定文件夹头文件 文章目录 知识点实例代码目录代码实现编译知识点 target_include_directories() 指定目标包含的头文件路径 实例 代码目录 |-📁prj3   |-- 🎴CMakeLists.txt   |-📁include    |-- 📄Hello.h   |-📁src…

【进程和线程】学习笔记(一)----进程和线程初识以及一些API整理

进程和线程 文章目录进程和线程线程创建线程终止线程线程的挂起与恢复运行线程间同步原子锁临界区等待线程函数&#xff1a;WaitForSingleObject()WaitForMultipleObject()内核对象互斥变量信号量事件对象线程死锁线程间通信进程进程的创建进程间通信创建缓冲区创建映射关闭缓冲…

老式电脑怎样重装系统win10 老电脑如何重装win10系统

在如今科技飞速发展的时代&#xff0c;电脑的更新换代速度也越来越快。然而&#xff0c;随着时间的推移&#xff0c;老式电脑的性能逐渐下降&#xff0c;甚至出现系统卡顿、应用崩溃等问题。此时&#xff0c;许多人就会考虑重装系统来解决这些问题。但对于老式电脑来说&#xf…

leetcode 468 验证IP地址

验证IP地址 高刷题 class Solution { public:bool cheakIP4(vector<string> &tmpIP4){if(tmpIP4.size() ! 4) return false;int tmp 0;for(int i0 ; i<tmpIP4.size() ; i){if(tmpIP4[i].size() > 1 && tmpIP4[i][0] 0) return false;if(tmpIP4[i].s…

【Google真题】 Who is unique? 100%AC python

【Google真题】 Who is unique? 100%AC python In a class, V students are standing in a row (consider 1-basedindexing). Every student is wearing some colored t-shirt. A studentis unique if they wear a t-shirt whose color is different fromeveryone else’s. Y…

Java并发编程(7) —— 锁的分类概述

一、乐观锁与悲观锁 乐观锁和悲观锁是在数据库中引入的名词&#xff0c;但是在并发包锁里面也引入了类似的思想。 1. 悲观锁 悲观锁总是假设最坏的情况&#xff0c;认为共享资源每次被访问的时候就会出现问题&#xff08;如共享数据被修改&#xff09;&#xff0c;所以每次在…

得到Class类的几种方式

package com.kuang.reflection; //测试Class类的创建方式有哪些 public class test03 {public static void main(String[] args) throws ClassNotFoundException {Person person new Student();System.out.println("这个人是:"person.name);//方式一&#xff1a;通过…

电池性能测试知识大全

二次电池性能主要包括哪些方面? 主要包括电压、内阻、容量、内压、自放电率、循环寿命、密封性能、安全性能、储存性 能、外观等&#xff0c;其它还有过充、过放、可焊性、耐腐蚀性等。 手机电池块有哪些电性能指标怎么测量? 电池块的主要电性能指标:)容量 该指标反映电池块…