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
- 如果发现表中已经有此行数据则先删除此行数据,然后插入新的数据;
- 否则,直接插入新数据
更新记录
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;