往期文章:
牛客网sql练习题解 (1-11)
牛客网sql练习题解(12-21)
牛客网sql练习题解(22-32)
牛客网sql练习题解(34-42)
他来了他来了,他带着sql走来了。
这次的知识点涵盖
下面我们直接上题目。
考察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';
这里考察一个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字段都相同的记录
这题如果可以多条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;
这题简单,学会用法就可以了
create unique index uniq_idx_firstname on actor(first_name);
create index idx_lastname on actor(last_name);
这里有两种写法,大家都可以借鉴:
第一种:
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;
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;
alter table actor
add column create_date datetime not null default '0000-00-00 00:00:00';
看到题目异常兴奋,终于来到了sql的进阶部分了,触发器。
这题并不难,但是有很多需要注意的点:
create trigger audit_log after insert on employees_test
begin
insert into audit values(new.ID, new.NAME);
end;
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和子查询解决这个问题。