牛客网sql题详解31-40

31.将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));
牛客网sql题详解31-40_第1张图片

/*MySQL、SQL Server、Oracle等数据库支持CONCAT方法,
而本题所用的SQLite数据库只支持用连接符号"||"来连接字符串
 
CONCAT方法:
select CONCAT(CONCAT(last_name," "),first_name) as name  from employees
或者
select CONCAT(last_name," ",first_name) as name  from employees
 
本题中使用:*/
select last_name||" "||first_name as name  from employees

32.创建一个actor表,包含如下列信息
牛客网sql题详解31-40_第2张图片

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

33.对于表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’)))
在这里插入图片描述

insert into actor values
(1,'PENELOPE','GUINESS','2006-02-15 12:34:33'),
(2,'NICK','WAHLBERG','2006-02-15 12:34:33')

34.对于表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’)))
在这里插入图片描述

/*因为题目判定系统使用的是sqlite3,所以必须按sqlite3的写法来做,*/
insert or ignore into actor
values(3,'ED','CHASE','2006-02-15 12:34:33');

/*如果是mysql,那么把or去掉,像下面这样:*/
insert ignore into actor
values(3,'ED','CHASE','2006-02-15 12:34:33');

35.对于如下表actor,其对应的数据为:
在这里插入图片描述
创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。actor_name表结构如下:
在这里插入图片描述

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;

36.针对如下表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);

37.针对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 (first_name_v,last_name_v) as
select first_name,last_name from actor

38.针对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));
create index idx_emp_no on salaries(emp_no);

/*SQLite中,使用 INDEXED BY 语句进行强制索引查询:*/
SELECT * FROM salaries INDEXED BY idx_emp_no 
WHERE emp_no = 10005

/*MySQL中,使用 FORCE INDEX 语句进行强制索引查询:*/
SELECT * FROM salaries FORCE INDEX idx_emp_no 
WHERE emp_no = 10005

39.存在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’

/*用 ALTER TABLE ... ADD ... 语句可以向已存在的表插入新字段,并且能够
与创建表时一样,在字段名和数据类型后加入NOT NULL、DEFAULT等限定(题目
给的时间格式是错误的):*/

ALTER TABLE actor ADD COLUMN create_date datetime NOT NULL
DEFAULT '0000-00-00 00:00:00';

40.构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中。
CREATE TABLE employees_test(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE audit(
EMP_no INT NOT NULL,
NAME TEXT NOT NULL
);

/*构造触发器时注意以下几点:
1、用 CREATE TRIGGER 语句构造触发器,用 BEFORE或AFTER 来指定在执行后面的SQL语句之前或之后来触发TRIGGER
2、触发器执行的内容写出 BEGIN与END 之间
3、可以使用 NEW与OLD 关键字访问触发后或触发前的employees_test表单记录*/

CREATE TRIGGER audit_log AFTER INSERT ON employees_test
BEGIN
    INSERT INTO audit VALUES (NEW.ID, NEW.NAME);
END;

你可能感兴趣的:(牛客网sql题详解31-40)