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;
相关推荐
未来之窗软件服务1 分钟前
sql速度优化多条合并为一条语句
数据库
山东布谷科技官方3 分钟前
布谷直播源码部署服务器关于数据库配置的详细说明
运维·服务器·数据库·直播系统源码·直播源码·直播系统搭建·直播软件开发
yanwushu4 分钟前
Xserver v1.4.2发布,支持自动重载 nginx 配置
mysql·nginx·php·个人开发·composer
易云码24 分钟前
信息安全建设方案,网络安全等保测评方案,等保技术解决方案,等保总体实施方案(Word原件)
数据库·物联网·安全·web安全·低代码
newxtc29 分钟前
【客观理性深入讨论国产中间件及数据库-科创基础软件】
数据库·中间件·国产数据库·国产中间件·科创
蓝眸少年CY30 分钟前
MySQL 【流程控制】函数
mysql
水月梦镜花31 分钟前
redis:list列表命令和内部编码
数据库·redis·list
MonkeyKing_sunyuhua1 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
天郁青1 小时前
数据库交互的本地项目:后台管理系统
数据库·交互
马剑威(威哥爱编程)1 小时前
MongoDB面试专题33道解析
数据库·mongodb·面试