这是一个系列文章,总共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 Namefrom 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_nameselect 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)ASselect first_name,last_namefrom actor;
解题思路:创建视图语句:CREATE VIEW <视图名称> (<视图列名1>,<视图列名2>…)AS<select 语句>;
第三十九题:针对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 actoradd column create_date datetime NOT NULL default '0000-00-00 00:00:00';
解题思路:添加列是使用变更表定义的ALTER TABLE语句,ALTER TABLE <表名> ADD COLUMN <列名> <列的定义>;
--end--