牛客网SQL实战二刷 | Day6
「牛客网SQL实战二刷」是个系列学习笔记博文,每天解析6道SQL题目~ 今天是第31-36题~ 题库已经过半啦。
每篇笔记的格式大致为,三大板块:
- 大纲
- 题目(题目描述、思路、代码、相关参考资料/答疑)
- 回顾
「往期回顾」❤️
《牛客网SQL实战二刷 | 完整解析 – 目录索引》
进入今天的正题吧。
一、大纲
| 题号 | 知识点 |
|---|---|
| 31 | 分析执行计划 EXPLAIN |
| 32 | 字符串的连接(|| , CONCAT, CONCAT_WS) |
| 33 | 创建表 CREATE TABLE, PRIMARY KEY, DATETIME() |
| 34 | 批量插入数据 INSERT INTO TABLE VALUES () |
| 35 | 批量插入,忽略已存在数据 INSERT IGNORE INTO |
| 36 | 创建表,从另一张表复制内容 CREATE TABLE 表名 AS SELECT 语句 |
二、题目
31. 获取select * from employees对应的执行计划
- 题目描述
获取select * from employees对应的执行计划
?EXPLAIN分析执行计划
在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。
来源:https://www.cnblogs.com/songwenjie/p/9409852.html
- 代码
EXPLAIN SELECT * FROM employees
- 参考资料
《MySQL——通过EXPLAIN分析SQL的执行计划》https://www.cnblogs.com/songwenjie/p/9409852.html
32. 将employees表的所有员工的last_name和first_name拼接起来作为Name
- 题目描述
将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
CREATE TABLEemployees(emp_noint(11) NOT NULL,
birth_datedate NOT NULL,
first_namevarchar(14) NOT NULL,
last_namevarchar(16) NOT NULL,
genderchar(1) NOT NULL,
hire_datedate NOT NULL,
PRIMARY KEY (emp_no));
- 输出描述
| Name |
|---|
| Facello Georgi |
| Simmel Bezalel |
| Bamford Parto |
| Koblick Chirstian |
| Maliniak Kyoichi |
| Preusig Anneke |
| Zielinski Tzvetan |
| Kalloufi Saniya |
| Peac Sumant |
| Piveteau Duangkaew |
| Sluis Mary |
- 代码
SELECT (last_name || " " || first_name) AS Name FROM employees
?字符串的连接
不同数据库连接字符串的方法不完全相同,MySQL、SQL Server、Oracle等数据库支持CONCAT方法,
SELECT CONCAT_WS(space(1),last_name,first_name) AS Name FROM employees;而本题所用的SQLite数据库只支持用连接符号"||"来连接字符串。
作者:wasrehpic
来源:https://www.nowcoder.com/questionTerminal/6744b90bbdde40209f8ecaac0b0516fe
- 参考资料
《concat、concat_ws、group_concat函数用法》https://www.cnblogs.com/xbblogs/p/6066386.html
33. 创建一个actor表,包含如下列信息
- 题目描述
创建一个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 | 最后更新时间,默认是系统的当前时间 |
- 民间解析
根据题意,本题关键点是actor_id的主键设置与last_update的默认获取系统时间:
1、在actor_id字段末尾加上PRIMARY KEY是将该字段设置为主键,或者在表的最后一行加上PRIMARY KEY(actor_id)
2、在last_update末尾加上DEFAULT是为该字段设置默认值,且默认值为(datetime(‘now’,‘localtime’)),即获得系统时间,注意最外层的括号不可省略
- 作者:wasrehpic
来源:https://www.nowcoder.com/questionTerminal/ac233de508ef4849b0eeb4f38dcf09cf
- 代码
CREATE TABLE actor
(
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime'))
)
不过个人有点奇怪的是,在创建表时候,把数据类型由小写改为大写,就不能通过了。不知道是不是bug。
34. 批量插入数据
- 题目描述
对于表actor批量插入如下数据
CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5) NOT NULL PRIMARY KEY,first_name varchar(45) NOT NULL,last_name varchar(45) NOT NULL,last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))
| 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 |
- 民间解析
本题的批量插入数据要求在一条语句内完成,以下有两种方法供参考:
- 方法一:利用VALUES(value1, value2, …), (value1, value2, …), …(value1, value2, …),
INSERT INTO actor VALUES (1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'), (2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33')
- 方法二:利用 UNION SELECT 批量插入
INSERT INTO actor SELECT 1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33' UNION SELECT 2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33'作者:wasrehpic
来源:https://www.nowcoder.com/questionTerminal/51c12cea6a97468da149c04b7ecf362e
- 代码
INSERT INTO actor
VALUES (1,'PENELOPE','GUINESS','2006-02-15 12:34:33'), (2,'NICK','WAHLBERG','2006-02-15 12:34:33')
35. 批量插入数据,不使用replace操作
- 题目描述
对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
CREATE TABLE IF NOT EXISTS actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))
| actor_id | first_name | last_name | last_update |
|---|---|---|---|
| ‘3’ | ‘ED’ | ‘CHASE’ | ‘2006-02-15 12:34:33’ |
- 代码
INSERT OR IGNORE INTO actor
VALUES ('3','ED','CHASE','2006-02-15 12:34:33')
?INSERT IGNORE INTO ? INSERT ? REPLACE
| 指令 | 已存在 | 不存在 | 举例 |
|---|---|---|---|
| insert | 报错 | 插入 | insert into names(name, age) values(“小明”, 23); |
| insert ignore | 忽略 | 插入 | insert ignore into names(name, age) values(“小明”, 24); |
| replace | 替换 | 插入 | replace into names(name, age) values(“小明”, 25); |
作者:彭世瑜
来源:https://blog.csdn.net/mouday/article/details/81281946
- 答疑
在牛客网的OJ系统里,会发现 INSERT OR IGNORE INTO ☑️,INSERT IGNORE INTO 就不通过了❌。这是因为sql系统的原因。
- 因为题目判定系统使用的是sqlite3,所以必须按sqlite3的写法来做,用
insert or ignore into actor- 如果是mysql,那么把or去掉,像这样
insert IGNORE into actor- 两种数据库还是有区别的。
作者:华科平凡
来源:https://www.nowcoder.com/questionTerminal/153c8a8e7805400ba8e384e03acc6b3e
- 强烈参考
《mysql:insert ignore、insert和replace区别》https://blog.csdn.net/mouday/article/details/81281946
36. 创建一个actor_name表
- 题目描述
对于如下表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 AS
SELECT first_name, last_name FROM actor
?CREATE TABLE 表名 AS SELECT 语句

由上面的使用 CREATE TABLE 表名 AS SELECT 语句可以看出:
- 只会复制表数据和表结构,不会有任何约束。
- 当 where 条件不成立时,只复制表结构,没有任务数据。
来源:https://www.cnblogs.com/guoziyi/p/8335641.html
- 参考资料
《CREATE TABLE 表名 AS SELECT 语句》https://www.cnblogs.com/guoziyi/p/8335641.html
三、回顾
今天的代码,都很短。和前5DAY的查询类型的sql练习风格很不一样~
| 知识点 | 题号 |
|---|---|
| 分析执行计划 | 31 |
| 字符串的连接 | 32 |
| 创建表 | 33,36 |
| 批量插入数据 | 34,35 |
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

