牛客网sql练习题解(34-42)

简介

往期文章:
牛客网sql练习题解 (1-11)
牛客网sql练习题解(12-21)
牛客网sql练习题解(22-32)
牛客网sql练习题解(34-42)

他来了他来了,他带着sql走来了。

这次的知识点涵盖

  • insert批量插入
  • 索引
  • 触发器
  • 视图
  • alter关键字
  • 删除

下面我们直接上题目。

NO.34

在这里插入图片描述
考察insert的批量插入,有两种方法,
第一种(简单粗暴)

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

在这里插入图片描述

第二种(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';

在这里插入图片描述

NO.35

在这里插入图片描述
这里考察一个insert的变形用法,如果是mysql就是insert ignore,牛客是sqlite环境所以应该写为insert or ignore

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

注:insert ignore 插入或者忽略与表内unique字段都相同的记录
insert replace表示插入或者更新替代与表内UNIQUE字段都相同的记录

在这里插入图片描述

NO.36

在这里插入图片描述

这题如果可以多条sql的话简直就太简单了:

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;

竟然真的能过,好吧。
在这里插入图片描述
但是我想可不可以一条sql,研究发现:

create table actor_name as
select first_name, last_name from actor;

这里注意一下as如果在MySQL环境下的时候就不需要了
在这里插入图片描述

NO.37

在这里插入图片描述

这题简单,学会用法就可以了

create unique index uniq_idx_firstname on actor(first_name);
create index idx_lastname on actor(last_name);

在这里插入图片描述

NO.38

在这里插入图片描述

这里有两种写法,大家都可以借鉴:
第一种:

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

在这里插入图片描述

第二种

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

在这里插入图片描述

NO.39

在这里插入图片描述

select *
from salaries
indexed by idx_emp_no
where emp_no = 10005;

在这里插入图片描述

这里还是要吐槽一下,为什么牛客 没有MySQL环境,如果是MySQL环境,强制索引就是不一样的写法

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

NO.40

在这里插入图片描述

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

在这里插入图片描述

NO.41

在这里插入图片描述

看到题目异常兴奋,终于来到了sql的进阶部分了,触发器。
这题并不难,但是有很多需要注意的点:

create trigger audit_log after insert on employees_test
begin
    insert into audit values(new.ID, new.NAME);
end;
  • 明确创建触发器的格式
  • 注意after(before)表示触发器触发的时间是在监听动作之后(之前)
  • begin和end包裹着触发器逻辑
  • begin和end中间的语句加“;”
  • new表示触发后的employees_test表单记录
  • old表示触发前的employees_test记录

在这里插入图片描述

NO.42

在这里插入图片描述

delete from titles_test
where emp_no not in (
    select min(id)
    from titles_test t
    group by t.emp_no
);

考察delete,但是我觉得这个思路更重要。
感觉上这是一种曲线救国的解题思路:

我们希望只保留id最小的emp_no重复的记录,
那么我们就要删掉id不是最小的emp_no重复的记录,
所以就使用not in ,如果emp_no重复,同时id not in 最小id临时表中的话就要删掉。

于是我们就利用not in和子查询解决这个问题。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40742298/article/details/106956521