牛客网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_idsmallint(5)not null主键id
first_namevarchar(45)not null名字
last_namevarchar(45)not null姓氏
last_updatetimestampnot 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_idfirst_namelast_namelast_update
1PENELOPEGUINESS2006-02-15 12:34:33
2NICKWAHLBERG2006-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_idfirst_namelast_namelast_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_idfirst_namelast_namelast_update
1PENELOPEGUINESS2006-02-15 12:34:33
2NICKWAHLBERG2006-02-15 12:34:33

创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。 actor_name表结构如下:

列表类型是否为NULL含义
first_namevarchar(45)not null名字
last_namevarchar(45)not null姓氏
  • 代码
CREATE TABLE actor_name AS
SELECT first_name, last_name FROM actor

?CREATE TABLE 表名 AS SELECT 语句
在这里插入图片描述

由上面的使用 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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部