SQL刷题记录(二)

发布于:2022-12-06 ⋅ 阅读:(318) ⋅ 点赞:(0)

SQL刷题记录(二)

答主刚开始自学SQL,本专栏记录的是答主在牛客上刷题的过程。疑惑和部分思路都会写在习题下方。
题目来源:牛客网刷题网址

自学网站:SQL教程

本文内容:T226-T250

T226.

select
  concat(last_name, ' ', first_name)
from
  employees

concat()是支持MySQL的字符串连接函数

T227.

create table if not exists actor(
  actor_id smallint(5) not null comment '主键id',
  first_name varchar(45) not null comment '名字',
  last_name varchar(45) not null comment '姓氏',
  last_update date not null comment '日期'
)

create table 表名() 建表语言

T228.

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

mysql中常用的三种插入数据的语句:
insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;

T229.

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

见上

T230.

create table if not exists actor_name(
  first_name varchar(45) not null comment '名字',
  last_name varchar(45) not null comment '姓氏'
)
select
  first_name,
  last_name
from
  actor

本题主要考察sql创建表的方式: 1、create table if not exists table_name(); (直接创建)
2、create table table_name like table_name1;(复制表结构)
3、create teble if not exists table_name() select * from table table_name1;(数据复制)

T231.

alter table actor add unique uniq_idx_firstname(first_name);
alter table actor add index idx_lastname(last_name);

添加主键
ALTER TABLE tbl_name ADD PRIMARY KEY (col_list);
// 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
添加唯一索引
ALTER TABLE tbl_name ADD UNIQUE index_name (col_list);
// 这条语句创建索引的值必须是唯一的。
添加普通索引
ALTER TABLE tbl_name ADD INDEX index_name (col_list);
// 添加普通索引,索引值可出现多次。
添加全文索引
ALTER TABLE tbl_name ADD FULLTEXT index_name (col_list);
// 该语句指定了索引为 FULLTEXT ,用于全文索引。
删除索引的语法:
DROP INDEX index_name ON tbl_name;
// 或者
ALTER TABLE tbl_name DROP INDEX index_name;
ALTER TABLE tbl_name DROP PRIMARY KEY;

T232.

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

视图相关知识:创建视图:
create view name(column1,column2…)
AS
select …
from …

T233.

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

FORCE INDEX()强制索引,优先执行该索引,大概是可以增加查询效率

T234.

alter table
  actor
add
  column create_date
  datetime
  not null
  default '2020-10-01 00:00:00'

最后一列增加列:alter table 表名 add column ……
指定位置增加列:alter table 表名 add column ……after列名
在第一列增加列:alter table 表名 add column ……first

T235.

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

触发器还没看到

T236.

delete from
  titles_test
where
  id not in (
    select
      *
    from
      (
        select
          min(id)
        from
          titles_test
        group by
          emp_no
      ) t1
  )

MySQL中不允许在子查询的同时删除表数据(不能一边查一边把查的表删了)所以要多写一步,将select得到的结果,再通过中间表select一遍,这样就规避了错误,这个问题只出现于mysql,mssql和oracle不会出现此问题。

T237.

update
  titles_test
set
  to_date = null
where
  to_date = '9999-01-01';

update
  titles_test
set
  from_date = '2001-01-01'

这里我用了两条update语句,因为一个有筛选条件另一个没有筛选条件。
如果是我自己理解错题意了那只需要写一条就可以,更简单

T238.

update
  titles_test
set
  emp_no = replace(emp_no, 10001, 10005)
where
  id = 5
  and emp_no = 10001

当我们需要将字段中的特定字符串批量修改为其他字符串时,可已使用以下操作:UPDATE table_name SET field=REPLACE(field, ‘old-string’, ‘new-string’)
[WHERE Clause]

T239.

ALTER table
  titles_test rename to titles_2017

alter函数的用法

T240.

ALTER TABLE audit
ADD CONSTRAINT FOREIGN KEY (emp_no)
REFERENCES employees_test(id);

创建外键语句结构:
ALTER TABLE <表名>
ADD CONSTRAINT FOREIGN KEY (<列名>)
REFERENCES <关联表>(关联列)

T242.

update
  salaries
set
  salary = salary * 1.1
where
  to_date = '9999-01-01'
  and emp_no in (
    select
      emp_no
    from
      emp_bonus
  )

是一个常规的修改表中内容的语句,注意员工必须在上边那个表里,不然是没加薪的

T244.

select
  concat(last_name, "'", first_name)
from
  employees

mysql的concat()函数拼接字符串

T245.(巧妙)

select
  id,
  char_length(string) - char_length(replace(string, ",", "")) as cnt
from
  strings
group by
  id

巧用字符串计数函数char_length(),把",“换成”“,然后两者相减就是”,"的个数了

T246.

select
  first_name
from
  employees
order by
  right(first_name, 2)

注意字符串的相关函数

T247.(新函数)

select
  dept_no,
  group_concat(
    distinct emp_no
    order by
      emp_no separator ','
  ) as employees
from
  dept_emp
group by
  dept_no

知识点总结:group_concat()函数将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

T248.

select
  avg(salary)
from
  salaries
where
  to_date = '9999-01-01'
  and salary not in (
    select
      max(salary)
    from
      salaries
    where
      to_date = '9999-01-01'
  )
  and salary not in (
    select
      min(salary)
    from
      salaries
    where
      to_date = '9999-01-01'
  )

第一点,如果子查询作为筛选条件而不作为表连接的话,只可以返回一个字段的一堆值,这就是为什么我写了两个salary not in子查询

第二点,子查询和外层的筛选条件都需要选择to_date = ‘9999-01-01’,都需要把不在职的排除掉

T249.

select
  *
from
  employees
limit
  5 offset 5

巧妙地利用limit offeset 进行页数的选取

本文含有隐藏内容,请 开通VIP 后查看