牛客数据库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值可以加括号。
结尾
如果您发现我的文章有任何错误,或对我的文章有什么好的建议,请联系我!如果您喜欢我的文章,请点喜欢~*我是蓝白绛,感谢你的阅读!