这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程。
具体题目可参考牛客网的SQL实战模块:
https://www.nowcoder.com/ta/sql?page=0
一、牛客网数据库SQL实战详细剖析(1-10)
二、牛客网数据库SQL实战详细剖析(11-20)
三、牛客网数据库SQL实战详细剖析(21-30)
第三十一题:获取select * from employees对应的执行计划
explain select * from employees;
explain模拟优化器执行SQL语句,在5.6以及以后的版本中,除过select,其他比如insert,update和delete均可以使用explain查看执行计划,从而知道mysql是如何处理sql语句,分析查询语句或者表结构的性能瓶颈。
作用:https://blog.csdn.net/UFO___/article/details/80951869
第三十二题:将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
select CONCAT(last_name,' ',first_name) as Name
from employees;
解题思路:①不同字符串连接方法不一样,在Mysql中,可以利用CONCAT()函数将多个字符串连接起来,中间用逗号隔开。②空格用' '表示。
第三十三题:创建一个actor表,包含如下列信息
列表 |
类型 |
是否为NULL |
含义 |
actor_id |
smallint(5) |
not null |
主键id |
first_name |
varchar(45) |
not null |
名字 |
last_name |
varchar(45) |
not null |
姓氏 |
last_update |
timestamp |
not null |
最后更新时间,默认是系统的当前时间 |
create table actor(
actor_id smallint(5) not null,
first_name varchar(45) not null,
last_name varchar(45) not null,
last_update timestamp not null default current_timestamp,
primary key(actor_id));
解题思路:最关键的两点是创建主键和默认系统当前时间的设置。
第三十四题:对于表actor批量插入如下数据
actor_id |
first_name |
last_name |
last_update |
1 |
PENELOPE |
GUINESS |
2006-02-15 12:34:33 |
2 |
NICK |
WAHLBERG |
2006-02-15 12:34:33 |
insert into actor values(1,'PENELOPE','GUINESS','2006-02-15 12:34:33'),
(2,'NICK','WAHLBERG','2006-02-15 12:34:33');
解题思路:插入数据语法:insert into <表名> values (<数据1>,<数据2>....);
第三十五题:对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
actor_id |
first_name |
last_name |
last_update |
'3' |
'ED' |
'CHASE' |
'2006-02-15 12:34:33' |
insert ignore into actor values(3,'ED','CHASE','2006-02-15 12:34:33');
解题思路:如果数据存在则忽略,在insert into之间加个ignore就可以。
第三十六题:对于如下表actor,其对应的数据为:
actor_id |
first_name |
last_name |
last_update |
1 |
PENELOPE |
GUINESS |
2006-02-15 12:34:33 |
2 |
NICK |
WAHLBERG |
2006-02-15 12:34:33 |
创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。actor_name表结构如下:
列表 |
类型 |
是否为NULL |
含义 |
first_name |
varchar(45) |
not null |
名字 |
last_name |
varchar(45) |
not null |
姓氏 |
create table actor_name
select first_name,last_name from actor;
解题思路:不同数据库语法不同,在Mysql中,可以加as,也可以不加as。
第三十七题:针对表actor结构创建索引,对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索引idx_lastname
CREATE UNIQUE INDEX uniq_idx_firstname ON actor(first_name);
CREATE INDEX idx_lastname ON actor(last_name)
解题思路:创建唯一索引:CREATE UNIQUE INDEX <唯一索引名> ON <表名> (<列名>);
创建一个简单的索引:CREATE INDEX <普通索引名> ON <表名> (<列名>);
第三十八题:针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v
CREATE VIEW actor_name_view(first_name_v,last_name_v)
AS
select first_name,last_name
from actor;
解题思路:创建视图语句:
CREATE VIEW <视图名称> (<视图列名1>,<视图列名2>…)
AS
第三十九题:针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引
create index idx_emp_no on salaries(emp_no);
select * from salaries FORCE INDEX (idx_emp_no) where emp_no = 10005;
解题思路:先创建索引,再创建强制索引查询,索引名一定要加括号,否则错误。
强制索引:FORCE INDEX(<索引名>);
SELECT * FROM <表名> FORCE INDEX (<索引名>)
参考:http://www.jb51.net/article/49807.htm
第四十题:在表actor中,在last_update后面新增加一列名字为create_date, 类型为datetime, NOT NULL,默认值为'0000-00-00 00:00:00'
alter table actor
add column create_date datetime NOT NULL default '0000-00-00 00:00:00';
解题思路:添加列是使用变更表定义的ALTER TABLE语句,ALTER TABLE <表名> ADD COLUM
N <列名> <列的定义>;
--end--
推荐阅读:
秋招失利,如何把握春招?(大四、研三)
计算机学生如何规划好大学四年的学习?
扫描下方二维码
添加好友,备注【交流群】
拉你到学习路线和资源丰富的交流群