NIUKE SQL:进阶挑战 (上)

01 增删改操作

插入记录

SQL110 插入记录(一)

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

用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001,并在50分钟后提交,得了90分

用户1002在2021年9月4日上午7点1分2秒开始作答试卷9002,并在10分钟后退出了平台

试卷作答记录表exam_record中,表已建好,其结构如下,请用一条语句将这两条记录插入表中

sql 复制代码
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);
INSERT

INSERT INTO 表名(列名 1,列名 2, ...) VALUES(值 1,值 2,...)

INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male')

INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan')

INSERT INTO 表名 VALUES(值 1,值 2,...)

因为没有指定要插入的列,表示按创建表时列的顺序插入所有列的值

INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female')

SQL111 插入记录(二)

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

sql 复制代码
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
插入记录的方式汇总

普通插入(全字段):INSERT INTO table_name VALUES (value1, value2, ...)

普通插入(限定字段):INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...)

多条一次性插入:INSERT INTO table_name (column1, column2, ...) VALUES (value1_1, value1_2, ...), (value2_1, value2_2, ...), ...

从另一个表导入:INSERT INTO table_name SELECT * FROM table_name2 [WHERE key=value]

SQL112 插入记录(三)

现在有一套ID为9003的高难度SQL试卷,时长为一个半小时,请你将 2021-01-01 00:00:00 作为发布时间插入到试题信息表examination_info(其表结构如下图),不管该ID试卷是否存在,都要插入成功,请尝试插入它

sql 复制代码
REPLACE INTO examination_info
VALUES
(NULL,9003,'SQL','hard',90,'2021-01-01 00:00:00')
REPLACE
  1. 如果发现表中已经有此行数据则先删除此行数据,然后插入新的数据;
  2. 否则,直接插入新数据

更新记录

SQL113 更新记录(一)

现有一张试卷信息表examination_info

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

sql 复制代码
UPDATE examination_info SET tag='Python' WHERE tag='PYTHON'
UPDATE...SET

UPDATE 表名 SET 列1=值1, ... 列n=值n [WHERE 条件];

SQL114 更新记录(二)

现有一张试卷作答记录表exam_record

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

sql 复制代码
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

删除记录

SQL115 删除记录(一)

现有一张试卷作答记录表exam_record

请删除exam_record表中作答时间小于5分钟整且分数不及格(及格线为60分)的记录

sql 复制代码
DELETE FROM exam_record 
WHERE TIMESTAMPDIFF(MINUTE, start_time, submit_time) <5 
AND score<60
TIMESTAMPDIFF (interval, time_start, time_end)

计算时间差,单位以指定的interval为准

  • SECOND 秒
  • MINUTE 分钟(返回秒数差除以60的整数部分)
  • HOUR 小时(返回秒数差除以3600的整数部分)
  • DAY 天数(返回秒数差除以3600*24的整数部分)
  • MONTH 月数
  • YEAR 年数
DELETE

DELETE FROM 表名 [WHERE 条件]

TURNCATE

TRUNCATE TABLE 表名

|----------|------|------|---------------|-------------------|
| | 回滚 | 作用于 | | |
| DELETE | 可回滚 | 表、视图 | | 不会减少表或索引所占用的空间 |
| DROP | 不可回滚 | 表、试图 | 删除表的结构及其约束、索引 | 将表所占用的空间全释放掉 |
| TRUNCATE | 不可回滚 | 表 | 表结构及其约束、索引等不变 | 表和索引所占用的空间恢复到初始大小 |

SQL116 删除记录(二)

现有一张试卷作答记录表exam_record

删除exam_record表中未完成作答或作答时间小于5分钟整的记录中,开始作答时间最早的3条记录

sql 复制代码
DELETE FROM exam_record 
WHERE TIMESTAMPDIFF(MINUTE, start_time, submit_time) <5 
OR submit_time IS NULL
ORDER BY start_time
LIMIT 3

SQL117 删除记录(三)

现有一张试卷作答记录表exam_record:

请删除exam_record表中所有记录,并重置自增主键

sql 复制代码
TRUNCATE TABLE exam_record
删除记录的方式汇总
  • 根据条件删除:DELETE FROM tb_name [WHERE options] [ [ ORDER BY fields ] LIMIT n ]
  • 全部删除(表清空,包含自增计数器重置):TRUNCATE TABLE tb_name

02 表与索引操作

表的创建、修改与删除

SQL118 创建一张新表

现有一张用户信息表,其中包含多年来在平台注册过的用户信息,随着牛客平台的不断壮大,用户量飞速增长,为了高效地为高活跃用户提供服务,现需要将部分用户拆分出一张新表

请创建一张优质用户信息表user_info_vip,表结构和用户信息表一致

请写出建表语句将表格中所有限制和说明记录到表里

|---------------|-------------|------|-----|-------------------|----------------|---------|
| Filed | Type | Null | Key | Default | Extra | Comment |
| id | int(11) | NO | PRI | | auto_increment | 自增ID |
| uid | int(11) | NO | UNI | | | 用户ID |
| nick_name | varchar(64) | YES | | | | 昵称 |
| achievement | int(11) | YES | | 0 | | 成就值 |
| level | int(11) | YES | | | | 用户等级 |
| job | varchar(32) | YES | | | | 职业方向 |
| register_time | datetime | YES | | CURRENT_TIMESTAMP | | 注册时间 |

sql 复制代码
CREATE TABLE IF NOT EXISTS user_info_vip (
    id int NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid int UNIQUE NOT NULL COMMENT '用户ID',
    nick_name varchar(64) COMMENT '昵称',
    achievement int DEFAULT 0 COMMENT '成就值',
    `level` int COMMENT '用户等级',
    job varchar(32) COMMENT '职业方向',
    register_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
) 
CHARACTER SET utf8 COLLATE utf8_general_ci
创建表CREATE
sql 复制代码
CREATE TABLE [IF NOT EXISTS] tb_name  #不存在才创建,存在就跳过
(column_name1 data_type1  #列名和类型必选
  [ PRIMARY KEY #可选的约束,主键
   | FOREIGN KEY #外键,引用其他表的键值
   | AUTO_INCREMENT #自增ID
   | COMMENT comment #列注释(评论)
   | DEFAULT default_value #默认值
   | UNIQUE #唯一性约束,不允许两条记录该列值相同
   | NOT NULL #该列非空
  ], ...
) 
[CHARACTER SET charset] #字符集编码
[COLLATE collate_value] #列排序和比较时的规则(是否区分大小写等)

SQL119 修改表

现有一张用户信息表user_info,其中包含多年来在平台注册过的用户信息

请在用户信息表,字段level的后面增加一列最多可保存15个汉字的字段school;并将表中job列名改为profession,同时varchar字段长度变为10;achievement的默认值设置为0

sql 复制代码
ALTER TABLE user_info ADD school varchar(15) after level;
ALTER TABLE user_info CHANGE job profession varchar(10);
ALTER TABLE user_info MODIFY achievement int(11) DEFAULT 0;
添加列

给 stu 表添加 classname 列

ALTER TABLE stu ADD (classname varchar(100));

修改列的数据类型

修改 stu 表的 gender 列类型为 CHAR(2)

ALTER TABLE stu MODIFY gender CHAR(2);

修改列名

修改 stu 表的 gender 列名为 sex

ALTER TABLE stu CHANGE gender sex CHAR(2);

删除列

删除 stu 表的 classname 列

ALTER TABLE stu DROP classname;

修改表名称

修改 stu 表名称为 student

ALTER TABLE stu RENAME TO student;

SQL120 删除表

现有一张试卷作答记录表exam_record,其中包含多年来的用户作答试卷记录。一般每年都会为exam_record表建立一张备份表exam_record_{YEAR},{YEAR}为对应年份

现在随着数据越来越多,存储告急,请你把很久前的(2011到2014年)备份表都删掉(如果存在的话)

sql 复制代码
DROP TABLE IF EXISTS exam_record_2011, exam_record_2012, exam_record_2013, exam_record_2014;

索引的创建、删除

SQL121 创建索引

现有一张试卷信息表examination_info,需要在examination_info表创建以下索引,规则如下:

在duration列创建普通索引idx_duration、在exam_id列创建唯一性索引uniq_idx_exam_id、在tag列创建全文索引full_idx_tag

sql 复制代码
CREATE INDEX idx_duration ON examination_info(duration);
CREATE UNIQUE INDEX uniq_idx_exam_id ON examination_info(exam_id);
CREATE FULLTEXT INDEX full_idx_tag ON examination_info(tag);
索引创建、删除
create创建索引

|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 | CREATE ``[UNIQUE #唯一索引 ``| FULLTEXT #全文索引 ``] INDEX index_name ON table_name #不指定唯一或全文时默认普通索引 (column1[(length) [DESC|ASC]] [,column2,...]) #可以对多列建立组合索引 |

alter方式创建索引

ALTER TABLE tb_name ADD [UNIQUE | FULLTEXT] [INDEX] index_content(content)

drop方式删除索引

DROP INDEX <索引名> ON <表名>

alter方式删除索引

ALTER TABLE <表名> DROP INDEX <索引名>

SQL122 删除索引

请删除examination_info表上的唯一索引uniq_idx_exam_id和全文索引full_idx_tag

sql 复制代码
DROP INDEX uniq_idx_exam_id ON examination_info;
DROP INDEX full_idx_tag ON examination_info;
sql 复制代码
ALTER TABLE examination_info DROP INDEX uniq_idx_exam_id;
ALTER TABLE examination_info DROP INDEX full_idx_tag;
相关推荐
亮子AI3 分钟前
【Node.js】为什么数据库连接总是中断?
数据库·node.js
DBA小马哥3 分钟前
时序数据库在物联网中的应用
数据库·物联网·时序数据库
maray4 分钟前
体验 Neon 产品
数据库·学习
亮子AI5 分钟前
【MySQL】node.js 如何批量更新数据?
数据库·mysql·node.js
xj7573065338 分钟前
精通django 第二章 视图和URL
数据库·django·sqlite
摇滚侠11 分钟前
两句话理解 ElasticSearch 搜索引擎数据库的作用
数据库·mysql·搜索引擎
BinaryBoss12 分钟前
Python mongodb批量修改数据库某个字段
数据库·python·mongodb
Yu_iChan17 分钟前
苍穹外卖Day09 地址簿模块
java·数据库·mybatis
戴西软件20 分钟前
戴西发布 DLM许可证加密防护软件V4.2让工业软件授权迈入并发调度与精细治理时代
运维·服务器·网络·数据库·人工智能·安全·云计算
NineData22 分钟前
NineData云原生智能数据管理平台新功能发布|2025年12月版
数据库·云原生·数据库管理工具·ninedata·数据库迁移·数据库迁移工具·智能数据管理平台