数据库SQL实战|SQL答案集合及解析(31-40)

牛客数据库SQL实战题(31-40题)

31、获取select * from employees对应的执行计划

牛客这个用的是SQLite,在SQLite数据库中,可以用 "EXPLAIN" 关键字或 "EXPLAIN QUERY PLAN" 短语,用于描述表的细节。
参考:牛客讨论区

explain select * from employees;

32、将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));

答案

不同数据库连接字符串的方法不完全相同,MySQL、SQL Server、Oracle等数据库支持CONCAT方法,而本题所用的SQLite数据库只支持用连接符号"||"来连接字符串。
参考:牛客讨论区

select last_name||" "||first_name as Name
from employees

33、创建一个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 最后更新时间,默认是系统的当前时间

答案

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')));

primary key也可以写在后面,写primary key(actor_id)。在last_update末尾加上DEFAULT设置默认值,默认值为(datetime('now','localtime')),即获得系统时间。

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:

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';

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'

答案

在SQLite中,insert or ignore表示如果不存在则插入,如果存在则忽略;insert or replace表示如果不存在则插入,如果存在则替换。

insert or ignore into actor
values(3, 'ED', 'CHASE', '2006-02-15 12:34:33')
insert or replace into actor
values(3, 'ED', 'CHASE', '2006-02-15 12:34:33')

在MySQL中则是使用insert ingnore和insert replace。

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 actor_name(
first_name varchar(45) not null,
last_name varchar(45) not null
);
insert into actor_name
select first_name, last_name from actor;

37、对first_name创建唯一索引uniq_idx_firstname

针对如下表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')))

对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);

38、针对actor表创建视图actor_name_view

只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v:

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')))

答案

create view actor_name_view as
select first_name as first_name_v, last_name as last_name_v
from actor;
create view actor_name_view (first_name_v, last_name_v) as
select first_name, last_name
from actor;

create view ... as ...创建视图。

39、针对上面的salaries表emp_no字段创建索引idx_emp_no

针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引。

CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

答案

select * from salaries indexed by idx_emp_no where emp_no=10005

参考:索引
数据库的索引问题就是查找问题。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库中表的数据。索引的实现通常使用B树和变种的B+树(mysql常用的索引就是B+树)。
除了数据之外,数据库系统还维护为满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这种数据结构就是索引。
在MySQL中为force index:

select * from salaries force index (idx_emp_no) where emp_no = 10005

40、在last_update后面新增加一列名字为create_date

存在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')));

现在在last_update后面新增加一列名字为create_date, 类型为datetime, NOT NULL,默认值为'0000 00:00:00'。(这里的默认值写的有问题,默认值为'0000-00-00 00:00;00'才能通过)

答案

alter table actor 
add column create_date datetime not null default '0000-00-00 00:00:00'

其中的column可以省略,not null 和default可以交换位置,default值可以加括号。

结尾

如果您发现我的文章有任何错误,或对我的文章有什么好的建议,请联系我!如果您喜欢我的文章,请点喜欢~*我是蓝白绛,感谢你的阅读!

你可能感兴趣的:(数据库SQL实战|SQL答案集合及解析(31-40))