牛客網SQL刷題31-40

嚯嚯嚯嚯什麼都不會要死了發表於2020-12-17

31、將employees表的所有員工的last_name和first_name拼接起來作為Name,中間以一個空格區分

(注:sqllite,字串拼接為 || 符號,不支援concat函式,mysql支援concat函式)
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`));

答案:select concat_ws(" ",last_name,first_name)as name from  employees;

32、建立一個actor表,包含如下列資訊

列表	型別	是否為NULL	含義
actor_id	smallint(5)	not null	主鍵id
first_name	varchar(45)	not null	名字
last_name	varchar(45)	not null	姓氏
last_update	date	not null	日期

create table if not exists `actor`(
actor_id smallint(5) primary key not null comment '主鍵id',
first_name varchar(45) not null comment '名字',
last_name varchar(45) not null comment '姓氏',
last_update date not null comment '日期'
)engine=innodb default charset=utf8;

33、題目已經先執行了如下語句:

drop table if exists actor;
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  DATETIME NOT NULL)
請你對於表actor批量插入如下資料(不能有2條insert語句哦!)
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

答案:
insert into actor (
actor_id,first_name,last_name,last_update)
values
(1,'PENELOPE','GUINESS','2006-02-15 12:34:33'),
(2,'NICK','WAHLBERG','2006-02-15 12:34:33');

34、題目已經先執行了如下語句:對於表actor插入如下資料,如果資料已經存在,請忽略(不支援使用replace操作)

actor_id first_name last_name last_update
‘3’ ‘ED’ ‘CHASE’ ‘2006-02-15 12:34:33’

drop table if exists actor;
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 DATETIME NOT NULL);
insert into actor values (‘3’, ‘WD’, ‘GUINESS’, ‘2006-02-15 12:34:33’);

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

35、題目描述

對於如下表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 if not exists  actor_name(
first_name varchar(45)not null comment'名字',
    last_name varchar(45)not null comment'姓氏');
insert into actor_name select  first_name,last_name from actor;

補充:
MYSQL建立資料表的三種方法
本題目考察MYSQL建立資料表的三種方法:

  • 常規建立
    create table if not exists 目標表
  • 複製表格
    create 目標表 like 來源表
  • 將table1的部分拿來建立table2
    create table if not exists actor_name
    (
    first_name varchar(45) not null,
    last_name varchar(45) not null
    )
    select first_name,last_name
    from actor

36、針對如下表actor結構建立索引:(注:在 SQLite 中,除了重新命名錶和在已有的表中新增列,ALTER TABLE 命令不支援其他操作,mysql支援ALTER TABLE建立索引)

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  datetime NOT NULL);
對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  actor  (
   actor_id  smallint(5)  NOT NULL PRIMARY KEY,
   first_name  varchar(45) NOT NULL,
   last_name  varchar(45) NOT NULL,
   last_update datetime NOT NULL);

create VIEW actor_name_view as select first_name as first_name_v
,last_name as last_name_v
from actor;

建立檢視語法:create view view_name as select語句

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

答案:
create index idx_emp_no on salaries(emp_no);
select * from salaries FORCE INDEX (idx_emp_no) where emp_no = 10005;

MYSQL中強制索引查詢使用:FORCE INDEX(indexname);
SQLite中強制索引查詢使用:INDEXED BY indexname;

39、存在actor表,包含如下列資訊:

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 datetime NOT NULL);
現在在last_update後面新增加一列名字為create_date, 型別為datetime, NOT NULL,預設值為’2020-10-01 00:00:00’

答案:

alter table actor add create_date datetime not null default'2020-10-01 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
);

答案:
create trigger audit_log after insert on employees_test
for each row begin insert into
audit values(new.id,new.name);end

注意:
1.create trigger :建立觸發器
2.觸發器要說明是在after 還是before事務發生時觸發
3.要指明是insert 、delete、update操作
4. on 表名
5.begin和end之間寫觸發的動作
6. new 關鍵字表示更新後的表的欄位 ,old表示更新前的表的欄位

在MySQL中,建立觸發器語法如下:
CREATE TRIGGER trigger_name
trigger_time trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt

其中:
trigger_name:標識觸發器名稱,使用者自行指定;
trigger_time:標識觸發時機,取值為 BEFORE 或 AFTER;
trigger_event:標識觸發事件,取值為 INSERT、UPDATE 或 DELETE;
tbl_name:標識建立觸發器的表名,即在哪張表上建立觸發器;
trigger_stmt:觸發器程式體,可以是一句SQL語句,或者用 BEGIN 和 END 包含的多條語句,每條語句結束要分號結尾。

相關文章