「牛客网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对应的执行计划
?EXPLAIN分析执行计划
在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。
来源:https://www.cnblogs.com/songwenjie/p/9409852.html
EXPLAIN SELECT * FROM employees
32. 将employees表的所有员工的last_name和first_name拼接起来作为Name
将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
CREATE TABLEemployees
(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
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
- 因为题目判定系统使用的是sqlite3,所以必须按sqlite3的写法来做,用
insert or ignore into actor
- 如果是mysql,那么把or去掉,像这样
insert IGNORE into actor
- 两种数据库还是有区别的。
作者:华科平凡
来源:https://www.nowcoder.com/questionTerminal/153c8a8e7805400ba8e384e03acc6b3e
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 语句可以看出:
- 只会复制表数据和表结构,不会有任何约束。
- 当 where 条件不成立时,只复制表结构,没有任务数据。
来源:https://www.cnblogs.com/guoziyi/p/8335641.html
今天的代码,都很短。和前5DAY的查询类型的sql练习风格很不一样~
知识点 | 题号 |
---|---|
分析执行计划 | 31 |
字符串的连接 | 32 |
创建表 | 33,36 |
批量插入数据 | 34,35 |