使用数据库
use sss --使用数据库sss
模式
--定义模式,定义模式实际上是定义了一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象,例如基本表,视图,索引等.
create schema "S-T" authorization ss --给用户ss创建模式S-T
--删除模式
drop schema "S-T" cascade-- 或者 restrict
表
创建与删除
--创建学生表
create TABLE student
(
sno int,
sname varchar(20),
ssex varchar(10),
sage int,
sdept varchar(10),
)
--创建课程表
create TABLE course
(
cno int,
cname varchar(20),
cpno int,
ccredit int,
)
--创建选课表
create table sc
(
sno int,
cno int,
grade int
)
--删除基本表
drop table student
修改基本表和数据更新
- 插入数据
--插入数据
insert
into student(sno,sname,ssex,sage,sdept)
values (200912001,'李明','男',20,'计科'),
(200912002,'李红','女',20,'计科'),
(200912003,'张强强','男',20,'软工'),
(200912004,'陈小小','女',19,'计科'),
(200912001,'宋茜','女',20,'软工')
--为选课表添加数据
insert
into sc(sno,cno,grade)
values (200912001,1,92),
(200912002,2,92),
(200912003,3,92),
(200912004,2,92),
(200912005,3,92)
--为课程表中添加数据
insert
into course(cno,cname,cpno,ccredit)
values (1,'数据库',5,4),
(2,'数学',NULL,2),
(3,'信息系统',1,4),
(4,'操作系统',6,3),
(5,'数据结构',7,4),
(6,'数据处理',NULL,2),
(7,'pascal语言',6,4)
-- 查看学生表
select *
from student
--查看课程表
select *
from course
--查询选课表
select *
from sc
- 添加数据
--增加列,向student表中添加入学时间列
alter table student add s_entrance date
--修改列的数据类型,将年龄的数据类型改为整数型
alter table student alter column sage int
--添加约束条件,增加课程名称必须取唯一值
alter table course add unique (cname)
- 修改数据
–修改数据
--修改一个元组的值
update student
set sno=200912001
where sname='李明'
--修改多个元组的值
update student
set sage=sage+1
- 删除数据
--删除数据
--删除一个元组的值
delete
from student
where sno=200912005
--删除多个元组的值
delete
from student --清空学生表
索引的建立与删除
--索引的建立与删除
--当表的数据量较大时,查询操作会比较耗时,建立索引是为了加快查询速度的有效手段,索引类似于图书的目录
--索引的建立 unique表示唯一索引 clusiter表示聚簇索引
--为student表按学号升序建立索引
create unique index stusno on student(sno)
--sc表按照学号升序和课程号降序建立唯一索引
create unique index scno on sc(sno asc,cno desc)
--修改索引
--将sc表的scno索引改为scsno
alter index scno on scsno
查寻
- 查询表中的若干列
--查询
--单表查询
--查询表中的所有的数据
select *
from student
--查询表中指定列中的数据
select sno,sname,sdept
from student
--查询经过计算的数据
select sage=sage-1
from student
--查询结果中加入一列,和定义别名
select sname,'age:' age,sage '年龄'
from student
--查询结果去掉重复行,使用(distinct)
select distinct sage
from student
- 带条件的查询
--查询满足条件的元组,例:条件为sno=200912001
select sname
from student
where sno=200912001
--条件为比较运算符,年龄大于等于20的学生的名字和年龄
select sname,sage
from student
where sage>=20
--条件为逻辑运算符
select sname,sage
from student
where sage=20 and sdept='计科'
--确定范围
select sname,sage
from student
where sage not between 20 and 19
--确定集合
select sname,sdept
from student
where sdept in('计科')
--字符匹配
--使用谓词like
-- %代表任意长度的字符串,如a%b代表以a为开头b为结尾的字符串
--_(下划线)代表任意单个字符
--\为换码字符,紧跟在‘\’后面的字符不在具有通配符的含义
--查询张姓学生的姓名
select sname
from student
where sname like'张%'
- 聚类函数
--聚类函数
--count(统计总数),max(最大值),min(最小值),avg(平均数),sum(求和),
--例,查询李姓学生的个数
select count(sname)
from student
where sname like'李%'
- group by语句
group by 子句将查询的结果安照某一列或多列的值分组,值相等的为一组
--求各个课程号及相应的选课人数
select cno,count(sno) --count聚集函数
from sc
group by cno
-连接查询
--连接查询
--等值连接与非等值连接
--等值连接
select student.sno,sname,ssex,sage,sdept,cno,grade
-- sname,ssex,sage,sdept,cno,grade属性列在表中是唯一的,可以不加前缀,而sno在两个表中都出现了,因此需要加前缀
from student,sc
where student.sno=sc.sno
--自身连接
--例,为couse表取两个别名 first,second
select first.cno,second.cpno
from course first,course second
where first.cpno=second.cno
--多表连接
--例,查询每个学生的学号,姓名,选修课名,及成绩
select student.sno,sname,cname,grade
from student,course,sc
where student.sno=sc.sno and sc.cno=course.cno
- 嵌套查询
--查询课程号为2的学生的姓名
--由sc表中确定课程号为2的学生的学号,再在student表中由学号确定姓名
select sname
from student
where sno in
(select sno
from sc
where cno='2')
视图
- 是什么:视图是一个或几个基本表(或视图)导出的表。
- 视图的作用
- 简化用户的操作
- 使用户能多角度看待同一种数据
- 对重构数据库提供了一定程度的逻辑独立性
- 能够对机密数据提供安全保护
- 适当利用视图可以更加清晰的表达查询
--建立视图
-- create view语句只是吧视图的定义存入数据字典,并不执行其中的select语句,只有对视图进行查询时,才按照视图的定义从基本表中将数据查出。
create view is_student
as
select sno,sname,sage
from student
where sdept='计科'
--查询视图
select *
from is_student
--删除视图
drop view is_student
数据库的完整性
- 数据库的完整性是指数据的正确性和相容性。
- 数据的正确性是指符合现实世界语义,反应当前实际状况的。
- 数据的形容性是指数据库同一对象在不同关系表中的数据是符合逻辑的
实体完整性
- 关系模型中的实体完整性:create table中用 primary key定义
- 对于单属性构成的码有两种说明方法
--定义列级约束条件
create table student1 --在列级定义主码
(
sno char(9)primary key,
sname varchar(20)not null,
ssex varchar(10),
sage int,
sdept varchar(10)
)
create TABLE course1
(
cno int primary key,
cname varchar(20)not null,
cpno int,
ccredit int,
)
--定义表级约束条件
create table student2 --在表级定义主码
(
sno char(9),
sname varchar(20)not null,
ssex varchar(10),
sage int,
sdept varchar(10),
primary key(sno)
)
- 对于多属性构成的码只有一种说明方法
--定义为表级约束条件
create table sc1--将sc表中的sno,cno属性组定义为码
(
sno char(9)not null,
cno char(4)not null,
grade smallint,
primary key(sno,cno)
)
- 实体完整性检查和违约处理
- 在插入或对主码进行更新操作时,rdms安照实体完整性规则自动进行检查,包括
1.检查主码是否唯一(全表扫描),
2.检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
参照完整性
- 在create table中用foreign key短语定义那些列为外码
- 用references短语指明这些外码参照了那些表的主码
- 参照完整性的定义
--例:定义sc2的参照完整性
create table sc2
(
sno char(9) not null,
cno int not null,
grade smallint,
primary key(sno,cno),--主码
foreign key(sno) references student1(sno),--sno参照student1表的主码
foreign key(cno) references course1(cno),--cno参照course2表的主码
)
用户定义完整性
- 是针对某一具体应用的数据必须满足的语义的要求
- create table 时定义 列值非空 (not null) 列值唯一(unique) 检查列值是否满足一个布尔表达式(check)
- 不允许取空值
- 例:在sc3表时,说明sno cno grade 属性不允许取空值
create table sc3
(
sno char(9)not null,
cno char(4)not null,
grade smallint not null,
primary key(sno,cno)
)
- 列值唯一
--例:建立部门表dept,dname值唯一,部门编号deptno为主码
create table dept
(
deptno numeric(2),
dname char(9) unique,
location char(10),
primary key(deptno)
)
- chack
--例student4表中只允许取男或女
create table student4
(
sno char(9) primary key,
sname char(8) not null,
ssex char(2) check(ssex in('男','女')),
sage smallint,
sdept char(20)
)
- 用户完整性的违约处理
满足,则执行,否则拒绝执行
insert
into student4(ssex)
values('无')
完整性约束命名子句
- 语法
CONSTRAINT 约束
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]
-- 例:建立学生登记表Student5,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
CREATE TABLE Student5
(Sno NUMERIC(6)
CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
Sname CHAR(20)
CONSTRAINT C2 NOT NULL,
Sage NUMERIC(3)
CONSTRAINT C3 CHECK (Sage < 30),
Ssex CHAR(2)
CONSTRAINT C4 CHECK (Ssex IN ( '男','女')),
CONSTRAINT StudentKey PRIMARY KEY(Sno)
)
修改完整性
--修改完整性
--例 修改表Student5中的约束条件,要求学号改为在900000~999999之间
alter table student5
--先删除表中的约束
drop constraint c1;
--在添加新的约束
alter table student5--在添加新的约束
add constraint c1 check(sno between 900000 and 999999)
触发器
- 内容 :–触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程
- 由服务器自动激活
- 可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力 - 语法:
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]
<触发动作体>
--例定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”
create trigger insert_or_update_sal
before insert or update on teacher
for each row --行级触发
as begin
if(new.job='教授')and(new.sal<4000)then
new.sal:=4000;
end if;
end