牛客网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 TABLE employees ( emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date 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 语句
牛客网SQL实战二刷 | Day6_第1张图片

由上面的使用 CREATE TABLE 表名 AS SELECT 语句可以看出:

  1. 只会复制表数据和表结构,不会有任何约束。
  2. 当 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

你可能感兴趣的:(#,SQL学习笔记,数据分析岗秋招,面经,总结,学习资料汇总)