牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0
牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010666669/article/details/104763370
牛客网数据库SQL实战解析(11-20题): https://blog.csdn.net/u010666669/article/details/104863298
牛客网数据库SQL实战解析(21-30题): https://blog.csdn.net/u010666669/article/details/104871373
牛客网数据库SQL实战解析(31-40题): https://blog.csdn.net/u010666669/article/details/104977904
牛客网数据库SQL实战解析(41-50题): https://blog.csdn.net/u010666669/article/details/104979427
牛客网数据库SQL实战解析(51-61题): https://blog.csdn.net/u010666669/article/details/104980372
31. 获取select * from employees对应的执行计划
EXPLAIN SELECT * FROM employees ;
解析:explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句,分析查询语句或者表结构的性能瓶颈。
32. 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
SELECT last_name || ' ' || first_name AS Name
FROM employees
;
解析:这里的编译环境是SQL3.7.9,试过别的方法,只有这个有效。其实在mysql里面,可以用concat或者concat_ws做字符串拼接。
33. 创建一个actor表
CREATE TABLE IF NOT EXISTS 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 (datetime('now','localtime')) ,
PRIMARY KEY(actor_id)
)
;
解析:按照题目要求即可,我习惯在建表前先判断是否存在,避免报错。
34. 对于表actor批量插入如下数据
INSERT INTO ACTOR VALUES
(1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'),
(2,'NICK', 'WAHLBERG', '2006-02-15 12:34:33')
;
题解二:
INSERT INTO actor
SELECT 1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'
UNION SELECT 2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33'
;
解析:除了数字外,其他的值需要用单引号''引用,否则报错。题解二也可以实现数据插入,可以了解一下。
35. 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
INSERT OR IGNORE INTO actor
VALUES(3,'ED','CHASE','2006-02-15 12:34:33')
;
解析:这道题考察ignore。
36. 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。 actor_name表结构如下
CREATE TABLE IF NOT EXISTS actor_name AS
SELECT first_name, last_name
from actor
;
解析:常规操作,很简单。
37. 针对如下表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) ;
解析:唯一索引 UNIQU INDEX,普通索引 INDEX。
38. 针对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 actor_name_view AS
SELECT first_name AS first_name_v, last_name as last_name_v
FROM actor
;
解析:创建视图可以用 CREATE VIEW.
39. 针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引。
SELECT *
FROM salaries
INDEXED BY idx_emp_no
WHERE emp_no = 10005
;
解析:SQLite中,使用 INDEXED BY 语句进行强制索引查询
40. 现在在last_update后面新增加一列名字为create_date, 类型为datetime, NOT NULL,默认值为'0000-00-00 00:00:00'
ALTER TABLE actor
ADD `create_date` datetime not null default '0000-00-00 00:00:00'
;
解析:添加字段的语法。