☺☺☺
题号 | 知识点 |
---|---|
1 | 考察用已知表的数据来创建新表:CREATE TABLE <表名> SELECT... |
2 | 考察强制索引的查询: sqlite中,在SELECT之后增加条件INDEXED BY <索引名> ;MySQL中,在SELECT之后增加条件FORCE INDEX(<索引名>) |
3 | 考察数据表中增加数据:ALTER TABLE <表名> ADD <要增加列的定义及约束> |
4 | 考察触发器的构造:CREATE TRIGGER <触发器名> BEFPORE/AFTER |
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:
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, 使用强制索引。
CREATE TABLEsalaries
(
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
FORCE INDEX(索引名);
INDEXED BY 索引名;
存在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
<新的列定义>
构造一个触发器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 <触发器名> 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;
触发器(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;
需要注意以下几点:
CREATE TRIGGER
语句;BEFORE或AFTER
来指定是在执行后边的SQL语句之前或之后来触发TRIGGER;BEGIN与END
之间;NEW
关键字表示更新后的表的字段,OLD
表示更新前的表的字段。删除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
)
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。
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';
可以使用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='数学')
)
#子查询的作用是得到教师的教师号