创建一个副教授职称的教师视图 T_Sub
(工号、姓名、性别和职称)。
teacher(教师表):
tno(工号) | tname(姓名) | sex(性别) | title(职称) | birthday(出生日期) |
---|---|---|---|---|
0014 | 李欣 | 男 | 教授 | 1969-07-25 |
0078 | 张云 | 女 | 副教授 | 1975-11-25 |
0118 | 王立 | 男 | 高级工程师 | 1985-04-28 |
0193 | 赵玲 | 女 | 讲师 | 1992-09-26 |
0213 | 杨梅 | 女 | 副教授 | 1986-06-07 |
0030 | 覃刚 | 男 | 副教授 | 1980-02-15 |
course(课程表):
cno(课程号) | cname(课程名) | credit(学分) | hours(学时) | examination(考核方式) |
---|---|---|---|---|
G001 | 线性代数 | 3 | 48 | 考试 |
R003 | 数据结构 | 3 | 48 | 考试 |
R009 | 离散数学 | 3 | 48 | 考试 |
S023 | 嵌入式系统与编程实验 | 1 | 32 | 考察 |
G012 | 大学物理 | 4 | 64 | 考试 |
class(班级表):
gno(班级号) | gname(班级名) | grade(年级) | dept(学院) | gnum(班级人数) |
---|---|---|---|---|
0211801 | 软件18级1班 | 18级 | 软件 | 37 |
0211903 | 软件19级3班 | 19级 | 软件 | 35 |
0131901 | 机械19级1班 | 19级 | 机械 | 37 |
teaching(教师授课表):
cno(课程号) | tno(工号) | gno(班级号) | term(开课学期) | classroom(教室) |
---|---|---|---|---|
G001 | 0078 | 0211903 | 1 | A101 |
G001 | 0078 | 0131901 | 1 | A101 |
R003 | 0118 | 0211801 | 2 | S001 |
R009 | 0213 | 0211903 | 2 | S002 |
S023 | 0193 | 0211801 | 1 | S001 |
G012 | 0030 | 0131901 | 2 | B003 |
视图:
在 SQL
中,视图是基于 SQL
语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL
函数、WHERE
以及 JOIN
语句,我们也可以提交数据,就像这些来自于某个单一的表。
注意:数据库的设计和结构不会受到视图中的函数、WHERE
或 JOIN
语句的影响。
SQL CREATE VIEW 语法
:
CREATE VIEW <视图名>
AS SELECT <字段名1>, <字段名2>...
FROM <表名>
WHERE <条件>;
---------- BEGIN ----------
create view T_Sub
as
select tno,tname,sex,title
from teacher
where title='副教授'
---------- END ----------
创建软件学院班级上课情况视图 C_S
(班级名、课程名、教师号)。
teacher(教师表):
tno(工号) | tname(姓名) | sex(性别) | title(职称) | birthday(出生日期) |
---|---|---|---|---|
0014 | 李欣 | 男 | 教授 | 1969-07-25 |
0078 | 张云 | 女 | 副教授 | 1975-11-25 |
0118 | 王立 | 男 | 高级工程师 | 1985-04-28 |
0193 | 赵玲 | 女 | 讲师 | 1992-09-26 |
0213 | 杨梅 | 女 | 副教授 | 1986-06-07 |
0030 | 覃刚 | 男 | 副教授 | 1980-02-15 |
course(课程表):
cno(课程号) | cname(课程名) | credit(学分) | hours(学时) | examination(考核方式) |
---|---|---|---|---|
G001 | 线性代数 | 3 | 48 | 考试 |
R003 | 数据结构 | 3 | 48 | 考试 |
R009 | 离散数学 | 3 | 48 | 考试 |
S023 | 嵌入式系统与编程实验 | 1 | 32 | 考察 |
G012 | 大学物理 | 4 | 64 | 考试 |
class(班级表):
gno(班级号) | gname(班级名) | grade(年级) | dept(学院) | gnum(班级人数) |
---|---|---|---|---|
0211801 | 软件18级1班 | 18级 | 软件 | 37 |
0211903 | 软件19级3班 | 19级 | 软件 | 35 |
0131901 | 机械19级1班 | 19级 | 机械 | 37 |
teaching(教师授课表):
cno(课程号) | tno(工号) | gno(班级号) | term(开课学期) | classroom(教室) |
---|---|---|---|---|
G001 | 0078 | 0211903 | 1 | A101 |
G001 | 0078 | 0131901 | 1 | A101 |
R003 | 0118 | 0211801 | 2 | S001 |
R009 | 0213 | 0211903 | 2 | S002 |
S023 | 0193 | 0211801 | 1 | S001 |
G012 | 0030 | 0131901 | 2 | B003 |
视图:
在 SQL
中,视图是基于 SQL
语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL
函数、WHERE
以及 JOIN
语句,我们也可以提交数据,就像这些来自于某个单一的表。
注意:数据库的设计和结构不会受到视图中的函数、WHERE
或 JOIN
语句的影响。
SQL CREATE VIEW 语法
:
CREATE VIEW <视图名>
AS SELECT <字段名1>, <字段名2>...
FROM <表名1>, <表名2>...
WHERE <条件1> AND <条件2> AND...;
---------- BEGIN ----------
create view C_S
as select gname,cname,teacher.tno
from class,course,teacher,teaching
where class.dept='软件' and teacher.tno=teaching.tno and teaching.cno=course.cno and class.gno=teaching.gno
---------- END ----------
查询视图C_S中的班级名和课程名。
teacher(教师表):
tno(工号) | tname(姓名) | sex(性别) | title(职称) | birthday(出生日期) |
---|---|---|---|---|
0014 | 李欣 | 男 | 教授 | 1969-07-25 |
0078 | 张云 | 女 | 副教授 | 1975-11-25 |
0118 | 王立 | 男 | 高级工程师 | 1985-04-28 |
0193 | 赵玲 | 女 | 讲师 | 1992-09-26 |
0213 | 杨梅 | 女 | 副教授 | 1986-06-07 |
0030 | 覃刚 | 男 | 副教授 | 1980-02-15 |
course(课程表):
cno(课程号) | cname(课程名) | credit(学分) | hours(学时) | examination(考核方式) |
---|---|---|---|---|
G001 | 线性代数 | 3 | 48 | 考试 |
R003 | 数据结构 | 3 | 48 | 考试 |
R009 | 离散数学 | 3 | 48 | 考试 |
S023 | 嵌入式系统与编程实验 | 1 | 32 | 考察 |
G012 | 大学物理 | 4 | 64 | 考试 |
class(班级表):
gno(班级号) | gname(班级名) | grade(年级) | dept(学院) | gnum(班级人数) |
---|---|---|---|---|
0211801 | 软件18级1班 | 18级 | 软件 | 37 |
0211903 | 软件19级3班 | 19级 | 软件 | 35 |
0131901 | 机械19级1班 | 19级 | 机械 | 37 |
teaching(教师授课表):
cno(课程号) | tno(工号) | gno(班级号) | term(开课学期) | classroom(教室) |
---|---|---|---|---|
G001 | 0078 | 0211903 | 1 | A101 |
G001 | 0078 | 0131901 | 1 | A101 |
R003 | 0118 | 0211801 | 2 | S001 |
R009 | 0213 | 0211903 | 2 | S002 |
S023 | 0193 | 0211801 | 1 | S001 |
G012 | 0030 | 0131901 | 2 | B003 |
使用简单的查询语句就可以对视图进行查询操作:
SELECT <字段名1>, <字段名2>...
FROM <视图名>;
---------- BEGIN ----------
select gname,cname
from C_S
---------- END ----------
删除班级上课情况视图C_S。
SQL
撤销视图
您可以通过 DROP VIEW
命令来删除视图。 SQL DROP VIEW
语法:
DROP VIEW <视图名>;
---------- BEGIN ----------
drop view C_S
---------- END ----------
向 T_Sub 的教师视图中添加一条记录,其中工号为 0296
,姓名为 赵梦
,性别为 女
,职称为 副教授
。
teacher(教师表):
tno(工号) | tname(姓名) | sex(性别) | title(职称) | birthday(出生日期) |
---|---|---|---|---|
0014 | 李欣 | 男 | 教授 | 1969-07-25 |
0078 | 张云 | 女 | 副教授 | 1975-11-25 |
0118 | 王立 | 男 | 高级工程师 | 1985-04-28 |
0193 | 赵玲 | 女 | 讲师 | 1992-09-26 |
0213 | 杨梅 | 女 | 副教授 | 1986-06-07 |
0030 | 覃刚 | 男 | 副教授 | 1980-02-15 |
course(课程表):
cno(课程号) | cname(课程名) | credit(学分) | hours(学时) | examination(考核方式) |
---|---|---|---|---|
G001 | 线性代数 | 3 | 48 | 考试 |
R003 | 数据结构 | 3 | 48 | 考试 |
R009 | 离散数学 | 3 | 48 | 考试 |
S023 | 嵌入式系统与编程实验 | 1 | 32 | 考察 |
G012 | 大学物理 | 4 | 64 | 考试 |
class(班级表):
gno(班级号) | gname(班级名) | grade(年级) | dept(学院) | gnum(班级人数) |
---|---|---|---|---|
0211801 | 软件18级1班 | 18级 | 软件 | 37 |
0211903 | 软件19级3班 | 19级 | 软件 | 35 |
0131901 | 机械19级1班 | 19级 | 机械 | 37 |
teaching(教师授课表):
cno(课程号) | tno(工号) | gno(班级号) | term(开课学期) | classroom(教室) |
---|---|---|---|---|
G001 | 0078 | 0211903 | 1 | A101 |
G001 | 0078 | 0131901 | 1 | A101 |
R003 | 0118 | 0211801 | 2 | S001 |
R009 | 0213 | 0211903 | 2 | S002 |
S023 | 0193 | 0211801 | 1 | S001 |
G012 | 0030 | 0131901 | 2 | B003 |
INSERT INTO
语句
INSERT INTO
语句用于向视图中插入新记录,与向表中插入数据相似。
INSERT INTO <视图名> (<字段名1>, <字段名2>...)
VALUES (<值1>, <值2>, <值3>,...);
---------- BEGIN ----------
insert into T_Sub
values('0296','赵梦','女','副教授')
---------- END ----------
将 T_Sub
的教师视图中 赵梦
的职称改为“教授
”。
teacher(教师表):
tno(工号) | tname(姓名) | sex(性别) | title(职称) | birthday(出生日期) |
---|---|---|---|---|
0014 | 李欣 | 男 | 教授 | 1969-07-25 |
0078 | 张云 | 女 | 副教授 | 1975-11-25 |
0118 | 王立 | 男 | 高级工程师 | 1985-04-28 |
0193 | 赵玲 | 女 | 讲师 | 1992-09-26 |
0213 | 杨梅 | 女 | 副教授 | 1986-06-07 |
0030 | 覃刚 | 男 | 副教授 | 1980-02-15 |
course(课程表):
cno(课程号) | cname(课程名) | credit(学分) | hours(学时) | examination(考核方式) |
---|---|---|---|---|
G001 | 线性代数 | 3 | 48 | 考试 |
R003 | 数据结构 | 3 | 48 | 考试 |
R009 | 离散数学 | 3 | 48 | 考试 |
S023 | 嵌入式系统与编程实验 | 1 | 32 | 考察 |
G012 | 大学物理 | 4 | 64 | 考试 |
class(班级表):
gno(班级号) | gname(班级名) | grade(年级) | dept(学院) | gnum(班级人数) |
---|---|---|---|---|
0211801 | 软件18级1班 | 18级 | 软件 | 37 |
0211903 | 软件19级3班 | 19级 | 软件 | 35 |
0131901 | 机械19级1班 | 19级 | 机械 | 37 |
teaching(教师授课表):
cno(课程号) | tno(工号) | gno(班级号) | term(开课学期) | classroom(教室) |
---|---|---|---|---|
G001 | 0078 | 0211903 | 1 | A101 |
G001 | 0078 | 0131901 | 1 | A101 |
R003 | 0118 | 0211801 | 2 | S001 |
R009 | 0213 | 0211903 | 2 | S002 |
S023 | 0193 | 0211801 | 1 | S001 |
G012 | 0030 | 0131901 | 2 | B003 |
UPDATE
语句
可以使用 UPDATE
语句来修改、更新一个或多个视图的数据。 使用 UPDATE
语句修改视图与修改表类似,语法格式为:
UPDATE <视图名>
SET <列名>=<表达式> [,<列名>=<表达式>]…
[WHERE (<条件>)];
语法说明如下:
SET
子句:用于指定视图中要修改的列名及其列值。其中,每个指定的列值可以是表达式,也可以是该列对应的默认值。如果指定的是默认值,可用关键字 DEFAULT
表示列值。WHERE
子句:可选项。用于限定视图中要修改的行。若不指定,则修改表中所有的行。---------- BEGIN ----------
update T_Sub
set title='教授'
where tname='赵梦'
---------- END ----------
删除 T_Sub 的教师视图中教师 覃刚
的记录。
teacher(教师表):
tno(工号) | tname(姓名) | sex(性别) | title(职称) | birthday(出生日期) |
---|---|---|---|---|
0014 | 李欣 | 男 | 教授 | 1969-07-25 |
0078 | 张云 | 女 | 副教授 | 1975-11-25 |
0118 | 王立 | 男 | 高级工程师 | 1985-04-28 |
0193 | 赵玲 | 女 | 讲师 | 1992-09-26 |
0213 | 杨梅 | 女 | 副教授 | 1986-06-07 |
0030 | 覃刚 | 男 | 副教授 | 1980-02-15 |
course(课程表):
cno(课程号) | cname(课程名) | credit(学分) | hours(学时) | examination(考核方式) |
---|---|---|---|---|
G001 | 线性代数 | 3 | 48 | 考试 |
R003 | 数据结构 | 3 | 48 | 考试 |
R009 | 离散数学 | 3 | 48 | 考试 |
S023 | 嵌入式系统与编程实验 | 1 | 32 | 考察 |
G012 | 大学物理 | 4 | 64 | 考试 |
class(班级表):
gno(班级号) | gname(班级名) | grade(年级) | dept(学院) | gnum(班级人数) |
---|---|---|---|---|
0211801 | 软件18级1班 | 18级 | 软件 | 37 |
0211903 | 软件19级3班 | 19级 | 软件 | 35 |
0131901 | 机械19级1班 | 19级 | 机械 | 37 |
teaching(教师授课表):
cno(课程号) | tno(工号) | gno(班级号) | term(开课学期) | classroom(教室) |
---|---|---|---|---|
G001 | 0078 | 0211903 | 1 | A101 |
G001 | 0078 | 0131901 | 1 | A101 |
R003 | 0118 | 0211801 | 2 | S001 |
R009 | 0213 | 0211903 | 2 | S002 |
S023 | 0193 | 0211801 | 1 | S001 |
G012 | 0030 | 0131901 | 2 | B003 |
注:这道题由于参照完整性的原因是无法成功删除的,希望同学们能够理解到这个知识点。
DELETE语句
可以使用 DELETE
语句可以删除视图中的一行或多行记录,其语法格式为:
DELETE FROM <视图名>
[WHERE <条件>];
WHERE
子句:指定待删除的记录应当满足的条件,WHERE
子句省略时,则删除视图中所有记录。---------- BEGIN ----------
delete from T_Sub
where tname='覃刚'
---------- END ----------
为教师表在姓名列上建立B-Tree索引TI。
teacher(教师表):
tno(工号) | tname(姓名) | sex(性别) | title(职称) | birthday(出生日期) |
---|---|---|---|---|
0014 | 李欣 | 男 | 教授 | 1969-07-25 |
0078 | 张云 | 女 | 副教授 | 1975-11-25 |
0118 | 王立 | 男 | 高级工程师 | 1985-04-28 |
0193 | 赵玲 | 女 | 讲师 | 1992-09-26 |
0213 | 杨梅 | 女 | 副教授 | 1986-06-07 |
0030 | 覃刚 | 男 | 副教授 | 1980-02-15 |
course(课程表):
cno(课程号) | cname(课程名) | credit(学分) | hours(学时) | examination(考核方式) |
---|---|---|---|---|
G001 | 线性代数 | 3 | 48 | 考试 |
R003 | 数据结构 | 3 | 48 | 考试 |
R009 | 离散数学 | 3 | 48 | 考试 |
S023 | 嵌入式系统与编程实验 | 1 | 32 | 考察 |
G012 | 大学物理 | 4 | 64 | 考试 |
class(班级表):
gno(班级号) | gname(班级名) | grade(年级) | dept(学院) | gnum(班级人数) |
---|---|---|---|---|
0211801 | 软件18级1班 | 18级 | 软件 | 37 |
0211903 | 软件19级3班 | 19级 | 软件 | 35 |
0131901 | 机械19级1班 | 19级 | 机械 | 37 |
teaching(教师授课表):
cno(课程号) | tno(工号) | gno(班级号) | term(开课学期) | classroom(教室) |
---|---|---|---|---|
G001 | 0078 | 0211903 | 1 | A101 |
G001 | 0078 | 0131901 | 1 | A101 |
R003 | 0118 | 0211801 | 2 | S001 |
R009 | 0213 | 0211903 | 2 | S002 |
S023 | 0193 | 0211801 | 1 | S001 |
G012 | 0030 | 0131901 | 2 | B003 |
使用 CREATE INDEX
语句
可以使用专门用于创建索引的 CREATE INDEX 语句在一个已有的表上创建索引,但该语句不能创建主键。
语法格式:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX <索引名>
ON <表名> (<列名> [DESC|ASC]] [,...]);
语法说明如下:
UNIQUE
:表示唯一索引。 CLUSTERED
:表示创建聚集性索引。 NONCLUSTERED
:表示创建非聚集性索引。 <表名>:指定要创建索引的表名。 <列名>:指定要创建索引的列名。通常可以考虑将查询语句中在 JOIN 子句和 WHERE 子句里经常出现的列作为索引列。 ASC|DESC
:可选项。 ASC
指定索引按照升序来排列, DESC
指定索引按照降序来排列,默认为 ASC
。
---------- BEGIN ----------
create unique index TI on teacher(tname)
---------- END ----------
查看基本表索引信息的语句格式: SELECT * FROM user_indexes WHERE table_name= 表名 ;
查看教师表的索引信息。
teacher(教师表):
tno(工号) | tname(姓名) | sex(性别) | title(职称) | birthday(出生日期) |
---|---|---|---|---|
0014 | 李欣 | 男 | 教授 | 1969-07-25 |
0078 | 张云 | 女 | 副教授 | 1975-11-25 |
0118 | 王立 | 男 | 高级工程师 | 1985-04-28 |
0193 | 赵玲 | 女 | 讲师 | 1992-09-26 |
0213 | 杨梅 | 女 | 副教授 | 1986-06-07 |
0030 | 覃刚 | 男 | 副教授 | 1980-02-15 |
course(课程表):
cno(课程号) | cname(课程名) | credit(学分) | hours(学时) | examination(考核方式) |
---|---|---|---|---|
G001 | 线性代数 | 3 | 48 | 考试 |
R003 | 数据结构 | 3 | 48 | 考试 |
R009 | 离散数学 | 3 | 48 | 考试 |
S023 | 嵌入式系统与编程实验 | 1 | 32 | 考察 |
G012 | 大学物理 | 4 | 64 | 考试 |
class(班级表):
gno(班级号) | gname(班级名) | grade(年级) | dept(学院) | gnum(班级人数) |
---|---|---|---|---|
0211801 | 软件18级1班 | 18级 | 软件 | 37 |
0211903 | 软件19级3班 | 19级 | 软件 | 35 |
0131901 | 机械19级1班 | 19级 | 机械 | 37 |
teaching(教师授课表):
cno(课程号) | tno(工号) | gno(班级号) | term(开课学期) | classroom(教室) |
---|---|---|---|---|
G001 | 0078 | 0211903 | 1 | A101 |
G001 | 0078 | 0131901 | 1 | A101 |
R003 | 0118 | 0211801 | 2 | S001 |
R009 | 0213 | 0211903 | 2 | S002 |
S023 | 0193 | 0211801 | 1 | S001 |
G012 | 0030 | 0131901 | 2 | B003 |
使用简单的查询语句就可以对视图进行查询操作:
SELECT *
FROM user_indexes
WHERE table_name = <表名>;
---------- BEGIN ----------
SELECT * FROM user_indexes WHERE table_name=upper('teacher') ;
---------- END ----------
将索引 TI
重命名为 TTI
。
使用 ALTER
修改索引名称
修改索引和修改表的语句相似:
ALTER INDEX [IF EXISTS] <旧索引名> RENAME TO <新索引名>;
IF EXISTS
:判断所要修改的索引名是否存在。
---------- BEGIN ----------
alter index TI
rename to TTI
---------- END ----------
删除索引 TTI
。
删除索引
删除索引的语法格式如下:
DROP INDEX <索引名>;
---------- BEGIN ----------
drop index TTI
---------- END ----------