表与索引操作
创建一张新表
描述 :现有一张用户信息表,其中包含多年来在平台注册过的用户信息,随着牛客平台的不断壮大,用户量飞速增长,为了高效地为高活跃用户提供服务,现需要将部分用户拆分出一张新表。
原来的用户信息表:
Filed | Type | Null | Key | Default | Extra | Comment |
---|---|---|---|---|---|---|
id | int(11) | NO | PRI | (NULL) | auto_increment | 自增 ID |
uid | int(11) | NO | UNI | (NULL) | 用户 ID | |
nick_name | varchar(64) | YES | (NULL) | 昵称 | ||
achievement | int(11) | YES | 0 | 成就值 | ||
level | int(11) | YES | (NULL) | 用户等级 | ||
job | varchar(32) | YES | (NULL) | 职业方向 | ||
register_time | datetime | YES | CURRENT_TIMESTAMP | 注册时间 |
作为数据分析师,请 创建一张优质用户信息表 user_info_vip ,表结构和用户信息表一致。
你应该返回的输出如下表格所示,请写出建表语句将表格中所有限制和说明记录到表里。
Filed | Type | Null | Key | Default | Extra | Comment |
---|---|---|---|---|---|---|
id | int(11) | NO | PRI | (NULL) | auto_increment | 自增 ID |
uid | int(11) | NO | UNI | (NULL) | 用户 ID | |
nick_name | varchar(64) | YES | (NULL) | 昵称 | ||
achievement | int(11) | YES | 0 | 成就值 | ||
level | int(11) | YES | (NULL) | 用户等级 | ||
job | varchar(32) | YES | (NULL) | 职业方向 | ||
register_time | datetime | YES | CURRENT_TIMESTAMP | 注册时间 |
思路 :如果这题给出了旧表的名称,可直接 create table 新表 as select * from 旧表;
但是这题并没有给出旧表名称,所以需要自己创建,注意默认值和键的创建即可,比较简单。(注意:如果是在牛客网上面执行,请注意 comment 中要和题目中的 comment 保持一致,包括大小写,否则不通过,还有字符也要设置)
答案:
CREATE TABLE IF NOT EXISTS user_info_vip(
id INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT'自增 ID',
uid INT(11) UNIQUE NOT NULL COMMENT '用户 ID',
nick_name VARCHAR(64) COMMENT'昵称',
achievement INT(11) DEFAULT 0 COMMENT '成就值',
`level` INT(11) COMMENT '用户等级',
job VARCHAR(32) COMMENT '职业方向',
register_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
)CHARACTER SET UTF8
修改表
描述 : 现有一张用户信息表 user_info
,其中包含多年来在平台注册过的用户信息。
用户信息表 user_info
:
Filed | Type | Null | Key | Default | Extra | Comment |
---|---|---|---|---|---|---|
id | int(11) | NO | PRI | (NULL) | auto_increment | 自增 ID |
uid | int(11) | NO | UNI | (NULL) | 用户 ID | |
nick_name | varchar(64) | YES | (NULL) | 昵称 | ||
achievement | int(11) | YES | 0 | 成就值 | ||
level | int(11) | YES | (NULL) | 用户等级 | ||
job | varchar(32) | YES | (NULL) | 职业方向 | ||
register_time | datetime | YES | CURRENT_TIMESTAMP | 注册时间 |
要求: 请在用户信息表,字段 level
的后面增加一列最多可保存 15 个汉字的字段 school
;并将表中 job
列名改为 profession
,同时 varchar
字段长度变为 10; achievement
的默认值设置为 0。
思路 :首先做这题之前,需要了解 ALTER 语句的基本用法:
- 添加一列:
ALTER TABLE 表名 ADD COLUMN 列名 类型 【first | after 字段名】;
(first : 在某列之前添加,after 反之) - 修改列的类型或约束:
ALTER TABLE 表名 MODIFY COLUMN 列名 新类型 【新约束】;
- 修改列名:
ALTER TABLE 表名 change COLUMN 旧列名 新列名 类型;
- 删除列:
ALTER TABLE 表名 drop COLUMN 列名;
- 修改表名:
ALTER TABLE 表名 rename 【to】 新表名;
- 将某一列放到第一列:
ALTER TABLE 表名 MODIFY COLUMN 列名 类型 first;
COLUMN
关键字其实可以省略不写,这里基于规范还是罗列出来了。
在修改时,如果有多个修改项,可以写到一起,但要注意格式
答案 :
ALTER TABLE user_info
ADD school VARCHAR(15) AFTER level,
CHANGE job profession VARCHAR(10),
MODIFY achievement INT(11) DEFAULT 0;
删除表
描述 :现有一张试卷作答记录表 exam_record
,其中包含多年来的用户作答试卷记录。一般每年都会为 exam_record
表建立一张备份表 exam_record_{YEAR},{YEAR}
为对应年份。
现在随着数据越来越多,存储告急,请你把很久前的(2011 到 2014 年)备份表都删掉(如果存在的话)。
思路 :这题很简单,直接删就行,如果嫌麻烦,可以将要删除的表用逗号隔开,写到一行;这里肯定会有小伙伴问:如果要删除很多张表呢?放心,如果要删除很多张表,可以写脚本来进行删除。
答案 :
DROP TABLE IF EXISTS exam_record_2011;
DROP TABLE IF EXISTS exam_record_2012;
DROP TABLE IF EXISTS exam_record_2013;
DROP TABLE IF EXISTS exam_record_2014;
创建索引
描述 :现有一张试卷信息表 examination_info
,其中包含各种类型试卷的信息。为了对表更方便快捷地查询,需要在 examination_info
表创建以下索引,
规则如下:在 duration
列创建普通索引 idx_duration
、在 exam_id
列创建唯一性索引 uniq_idx_exam_id
、在 tag
列创建全文索引 full_idx_tag
。
根据题意,将返回如下结果:
examination_info | 0 | PRIMARY | 1 | id | A | 0 | BTREE | |||
---|---|---|---|---|---|---|---|---|---|---|
examination_info | 0 | uniq_idx_exam_id | 1 | exam_id | A | 0 | YES | BTREE | ||
examination_info | 1 | idx_duration | 1 | duration | A | 0 | BTREE | |||
examination_info | 1 | full_idx_tag | 1 | tag | 0 | YES | FULLTEXT |
备注:后台会通过 SHOW INDEX FROM examination_info
语句来对比输出结果
思路 :做这题首先需要了解常见的索引类型:
- B-Tree 索引:B-Tree(或称为平衡树)索引是最常见和默认的索引类型。它适用于各种查询条件,可以快速定位到符合条件的数据。B-Tree 索引适用于普通的查找操作,支持等值查询、范围查询和排序。
- 唯一索引:唯一索引与普通的 B-Tree 索引类似,不同之处在于它要求被索引的列的值是唯一的。这意味着在插入或更新数据时,MySQL 会验证索引列的唯一性。
- 主键索引:主键索引是一种特殊的唯一索引,它用于唯一标识表中的每一行数据。每个表只能有一个主键索引,它可以帮助提高数据的访问速度和数据完整性。
- 全文索引:全文索引用于在文本数据中进行全文搜索。它支持在文本字段中进行关键字搜索,而不仅仅是简单的等值或范围查找。全文索引适用于需要进行全文搜索的应用场景。
-- 示例:
-- 添加 B-Tree 索引:
CREATE INDEX idx_name(索引名) ON 表名 (字段名); -- idx_name 为索引名,以下都是
-- 创建唯一索引:
CREATE UNIQUE INDEX idx_name ON 表名 (字段名);
-- 创建一个主键索引:
ALTER TABLE 表名 ADD PRIMARY KEY (字段名);
-- 创建一个全文索引
ALTER TABLE 表名 ADD FULLTEXT INDEX idx_name (字段名);
-- 通过以上示例,可以看出 create 和 alter 都可以添加索引
有了以上的基础知识之后,该题答案也就浮出水面了。
答案 :
ALTER TABLE examination_info
ADD INDEX idx_duration(duration),
ADD UNIQUE INDEX uniq_idx_exam_id(exam_id),
ADD FULLTEXT INDEX full_idx_tag(tag);
删除索引
描述 :请删除 examination_info
表上的唯一索引 uniq_idx_exam_id 和全文索引 full_idx_tag。
思路 :该题考察删除索引的基本语法:
-- 使用 DROP INDEX 删除索引
DROP INDEX idx_name ON 表名;
-- 使用 ALTER TABLE 删除索引
ALTER TABLE employees DROP INDEX idx_email;
这里需要注意的是:在 MySQL 中,一次删除多个索引的操作是不支持的。每次删除索引时,只能指定一个索引名称进行删除。
而且 DROP 命令需要慎用!!!
答案 :
DROP INDEX uniq_idx_exam_id ON examination_info;
DROP INDEX full_idx_tag ON examination_info;
较难或者困难的题目可以根据自身实际情况和面试需要来决定是否要跳过。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论