「牛客网SQL实战」| Day7

☺☺☺

文章目录

      • 六道题
        • 考查知识点
        • 一、 针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v:
        • 二、 针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引。
          • 【重要】知识点:强制索引的查询
        • 三、在last_update后面新增加一列名字为create_date
          • 【重要】知识点:修改数据表,比如向表中添加一列数据ALTER TABLE <表名> ADD
        • 四、构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中
          • 【重要】知识点:触发器的构造CREATE TRIGGER
        • 五、删除emp_no重复的记录,只保留最小的id对应的记录
          • 【重要】知识点:用SLQ命令删除数据DELETE
        • 六、将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01
          • 【重要】知识点:修改数据表中的数据UPDATE

六道题

考查知识点
题号 知识点
1 考察用已知表的数据来创建新表:CREATE TABLE <表名> SELECT...
2 考察强制索引的查询: sqlite中,在SELECT之后增加条件INDEXED BY <索引名>;MySQL中,在SELECT之后增加条件FORCE INDEX(<索引名>)
3 考察数据表中增加数据:ALTER TABLE <表名> ADD <要增加列的定义及约束>
4 考察触发器的构造:CREATE TRIGGER <触发器名> BEFPORE/AFTER ON <表名> BEGIN --触发器内容--; END;
5 考察数据的删除:DELETE FROM <表名> WHERE <一系列条件>
6 考察数据的修改:UPDATE <表名> SET <列名1>=<表达式1(或者具体要赋的值)>, <列名2>=<表达式2> WHERE <一系列条件>
一、 针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v:
  • 题目描述:

针对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 TABLE <表名> (列1名及定义,列2名及定义...),换成CREATE TABLE <表名> SECECT ...
  • 代码:
CREATE TABLE actor_name_view AS
SELECT first_name AS first_name_v, last_name AS last_name_v
FROM actor
二、 针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引。
  • 题目描述:

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

  • 分析:考察强制索引查询。
    SELECT之后增加条件INDEXED BY <索引名>

  • 代码:

SELECT * FROM salaries
INDEXED BY idx_emp_no
WHERE emp_no = 10005
【重要】知识点:强制索引的查询
  1. MySQL中强制索引查询为:FORCE INDEX(索引名);
  2. sqlite中强制索引查询为:INDEXED BY 索引名;
三、在last_update后面新增加一列名字为create_date
  • 题目描述:

存在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:00:00’

  • 分析:考察修改数据表。
    修改数据表,这里具体的修改是增加一列,用ALTER TABLE <表名> ADD <要增加列的定义等>。

  • 代码:

ALTER TABLE actor
ADD
create_date datetime NOT NULL DEFAULT ('0000-00-00 00:00:00')
【重要】知识点:修改数据表,比如向表中添加一列数据ALTER TABLE <表名> ADD

其语法格式为

ALTER TABLE <表名> 
ADD
<新的列定义>
四、构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中
  • 题目描述:

构造一个触发器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
);

  • 分析:考察触发器的构造。
    本题就是构造一个触发器,实现在触发相关操作(向employees_test表中插入数据时)之后,让(这个)数据也插入到表audit中。语法:
CREATE TRIGGER <触发器名> BEFORE/AFTER <DELETE/INSERT/UPDATE> ON <表名>
BEGIN
----具体的触发器的内容---(注意加分号;)
END
  • 代码:
CREATE TRIGGER audit_log AFTER INSERT ON employees_test
BEGIN
    INSERT INTO audit VALUES (NEW.ID, NEW.NAME);
END;
【重要】知识点:触发器的构造CREATE TRIGGER

触发器(Trigger)是数据库的回调函数,它会在指定的数据事件(DELETE/INSERT/UPDATE)发生时自动执行/调用。基本语法如下:

CREATE TRIGGER <触发器名> BEFORE/AFTER <sql相关操作语句> ON <表名>
BEGIN
---触发器逻辑---;
END;

以下是在 UPDATE 操作上在表的一个或多个指定列上创建触发器(Trigger)的语法:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
 --- 触发器逻辑---;
END;

需要注意以下几点:

  1. 构造触发器用CREATE TRIGGER 语句;
  2. BEFORE或AFTER来指定是在执行后边的SQL语句之前或之后来触发TRIGGER;
  3. 触发器的执行内容写在BEGIN与END之间;
  4. NEW关键字表示更新后的表的字段,OLD表示更新前的表的字段。
五、删除emp_no重复的记录,只保留最小的id对应的记录
  • 题目描述:

删除emp_no重复的记录,只保留最小的id对应的记录。
CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

  • 分析:考察数据库中的删除数据。
    本体的解决方法是:
    先用子查询SELECT ..GROUP BY找到数据中重复的id,并用MIN()找出数据中重复id中的最小值;
    然后用DELETE FROM <表名> WHERE id NOT IN 之前找出的数据,删除重复的id。

  • 代码:

DELETE
FROM titles_test
WHERE id NOT IN
(
SELECT min(id)
FROM titles_test
GROUP BY emp_no
)
【重要】知识点:用SLQ命令删除数据DELETE

SQL中的DELETE可以删除表中的一行或多行数据,其语法格式为:

DELETE
FROM <表名>
[WHERE <条件>]

(1)删除一行记录

DELETE
FROM <表名>
WHERE <条件>

(2)删除多行记录(删除了这个表的所有记录)

DELETE 
FROM <表名>

(3)删除指定条件的记录

DELETE
FROM <表名>
WHERE (一系列条件,比如子查询SELECT)
六、将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01
  • 题目描述:

将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01。
CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

  • 分析:考察数据表中的修改数据
  • 代码:
    注意:日期要加单引号!
UPDATE titles_test
SET to_date = NULL, from_date = '2001-01-01'
WHERE to_date = '9999-01-01';
【重要】知识点:修改数据表中的数据UPDATE

可以使用SQL中的UODATE语句对表中的一行或多行记录的某些列值进行修改,语法格式为:

UPDATE <表名>
SET <列名1>=<表达式1(可以为具体要赋值)>, <列名1>=<表达式1>...
[WHERE <条件>]

(1)修改一行数据:比如将张三老师转到计算机系

UPDATE teacher
SET dept = '计算机系'
WHERE th = '张三'

(2)修改多行数据:比如让所有学生年龄+1

UODATE student
SET age = age+1

(3)用子查询选择要修改的行:比如将教数学的老师薪资增加500元。

UPDATE teacher
SET money = money+500
WHERE
(
teacher_no IN (SELECT teacher_no FROM a, b WHERE a.teacher_no = b.teacher_no AND kemu='数学')
)
#子查询的作用是得到教师的教师号

你可能感兴趣的:(数据库,笔试题,数据库)