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中,表已建好,其结构如下,请用一条语句将这两条记录插入表中

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年之前的已完成了的试题作答纪录导入到该表

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试卷是否存在,都要插入成功,请尝试插入它

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

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

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分)的记录

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条记录

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表中所有记录,并重置自增主键

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

02 表与索引操作

表的创建、修改与删除

SQL118 创建一张新表

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

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

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

FiledTypeNullKeyDefaultExtraComment
idint(11)NOPRIauto_increment自增ID
uidint(11)NOUNI用户ID
nick_namevarchar(64)YES昵称
achievementint(11)YES0成就值
levelint(11)YES用户等级
jobvarchar(32)YES职业方向
register_timedatetimeYESCURRENT_TIMESTAMP注册时间
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

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

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年)备份表都删掉(如果存在的话)

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

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

DROP INDEX uniq_idx_exam_id ON examination_info;
DROP INDEX full_idx_tag ON examination_info;
ALTER TABLE examination_info DROP INDEX uniq_idx_exam_id;
ALTER TABLE examination_info DROP INDEX full_idx_tag;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值