文章目录
数据库的4个基本概念
❖数据(Data):数据库中存储的基本对象
1.定义:描述事物的符号记录
2.种类:数字、文字、图形、图像、音频、视频、学生的档案记录等
3.语义:数据的含义,数据与其语义是不可分的
❖数据库(Database)!!!
1.定义:数据库是长期储存在计算机内、有组织的、可共享的大量数据的集合。
❖数据库管理系统(DBMS)
1.位于用户与操作系统之间的一层数据管理软件
2.是基础软件,是一个大型复杂的软件系统
❖数据库系统(DBS)
1.构成:数据库、数据库管理系统(及其应用开发工具) 、应用程序、数据库管理员
2.结构:
概念模型!!!
1.实体(Entity)
客观存在并可相互区别的事物称为实体。
可以是具体的人、事、物或抽象的概念。
2.属性(Attribute)
实体所具有的某一特性称为属性。
一个实体可以由若干个属性来刻画。
3.码(Key)
唯一标识实体的属性集称为码。
4.实体型(Entity Type)
用实体名及其属性名集合来抽象和刻画同类实体称为实体型
例如:学生(学号,姓名,系别)
5.实体集(Entity Set)
同一类型实体的集合称为实体集
6.联系(Relationship).
现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系。
关系模型!!!
1.关系(Relation)
一个关系对应通常说的一张表
2.元组(Tuple)
表中的一行即为一个元组
3. 属性(Attribute)
表中的一列即为一个属性,给每一个属性起一个名称即属性名
4.码(Key)
也称码键。表中的某个属性组,它可以唯一确定一个元组
5.域(Domain)
是一组具有相同数据类型的值的集合。属性的取值范围来自某个域。
6 分量
元组中的一个属性值。
7.关系模式
对关系的描述:
关系名(属性1,属性2,…,属性n)
学生(学号,姓名,年龄,性别,系名,年级)
注意:关系必须是规范化的
最基本的规范条件:关系的每一个分量必须是一个不可分的,数据项不允许表中还有表
数据库系统的三级模式结构
❖模式(Schema)(也称逻辑模式)
数据库中全体数据的逻辑结构和特征的描述
所有用户的公共数据视图
一个数据库只有一个模式
地位:是数据库系统模式结构的中间层
❖外模式(External Schema)(也称子模式或用户模式)
用户使用的局部数据的逻辑结构和特征的描述
数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
地位:介于模式与应用之间
模式与外模式的关系:一对多
外模式与应用的关系:一对多
❖内模式(Internal Schema)(也称存储模式)
是数据物理结构和存储方式的描述
是数据在数据库内部的表示方式
一个数据库只有一个内模式
SQL 核心功能的9个动词:
新建数据库
create datebase STUDENT;
模式的定义与删除
1.定义
--为用户WANG定义一个学生-课程模式S-T
create schema "S-T" authorization WANG;
首先建立用户WANG
authorization:授权
若不指定模式名S-T,默认为用户名WANG,SQL默认用户名为dbo
2.删除
DROP SCHEMA WANG CASCADE;
删除模式ZHANG,同时该模式中定义的表TAB1也被删除
CASCADE(级联):删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制):如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。仅当该模式中没有任何下属的对象时才能执行。
基本表的定义、删除与修改
1.定义
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ]
…
[,<表级完整性约束条件> ] );
<表名>:所要定义的基本表的名字
<列名>:组成该表的各个属性(列)
<列级完整性约束条件>:涉及相应属性列的完整性约束条件
<表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,
否则既可以定义在列级也可以定义在表级。
定义基本表所属模式
方法一:在表名中明显地给出模式名
Create table"S-T".Student(......); /*模式名为 S-T*/
Create table "S-T".Cource(......);
Create table "S-T".SC(......);
方法二:在创建模式语句中同时创建表
--为用户ZHANG创建了一个模式TEST,并且在其中定义一个表TAB1:
CREATE SCHEMA TEST AUTHORIZATION WANG
CREATE TABLE TAB1 ( COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
--TEST模式建立成功,继续在TEST模式下建立表TAB2:
CREATE TABLE TEST.TAB2
(
COL1 SMALLINT
);
方法三:设置所属的模式 (DBMS中先设置模式,再建表)
2.删除
--向Student表增加“入学时间”列,其数据类型为日期型
alter table Student add S_entrance DATE;
不管基本表中原来是否已有数据,新增加的列一律为空值
3.修改
--删除Student表
DROP TABLE Student CASCADE;
基本表定义被删除,数据被删除
表上建立的索引、视图、触发器等一般也将被删除
索引的建立修改与删除
1.建立
为学生-课程数据库中的SC表建立索引。
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
Sno升序排列
Cno降序排列
在Sno升序的基础上对Cno进行降序排列
2.修改
--将SC表的SCno索引名改为SCSno
alter index SCno rename TO SCSno;
3.删除
--删除Student表的Stusname索引
drop index Stusname;
数据的插入、修改和删除
1.插入
--将一个新学生元组(学号:201215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中
insert
into Student (Sno,Sname,Ssex,Sdept,Sage)
values ('201215128','陈冬','男','IS',18);
2.修改
--将学生201215121的年龄改为22岁
update Student
set Sage=22
where Sno=' 201215121 ';
3.删除
--删除学号为201215128的学生记录。
delete
from Student
where Sno= '201215128';
数据查询
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句)
[AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
HAVING短语:只有满足指定条件的组才予以输出
ORDER BY子句:对查询结果表按指定列值的升序或降序排序
1.单表查询
聚集函数!!!
2.连接查询
等值于非等值连接查询
自身连接
多表连接
3.嵌套查询
带有ANY(SOME)或ALL谓词的子查询!!!
带有EXISTS谓词的子查询!!!
4.集合查询
并操作UNION
交操作INTERSECT
差操作EXCEPT
5.基于派生表的查询
视图的建立查询更新删除
虚表
只存放视图的定义,不存放视图对应的数据
1.建立
建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;
WITH CHECK OPTION 对视图进行更新操作时自动添加子查询中的条件
2.查询
--在信息系学生的视图中找出年龄小于20岁的学生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
3.更新
--将信息系学生视图IS_Student中学号”201215122”的学生姓名改为”刘辰”。
UPDATE IS_Student
SET Sname= '刘辰'
WHERE Sno= ' 201215122 ';
4.删除
--删除视图IS_S1
DROP VIEW IS_S1 CASCADE; --级联删除
授予与回收
1.授予grant
--把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户
GRANT INSERT
ON SC
TO U5
WITH GRANT OPTION;
ALL PRIVILEGES --所有权限
PUBLIC --所有用户
WITH GRANT OPTION --可以继续授权
2.回收revoke
--把用户U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
数据库角色
1.角色的创建
创建一个角色 R1
CREATE ROLE R1;
2.给角色授权
使角色R1拥有Student表的 SELECT、UPDATE、INSERT权限
GRANT SELECT, UPDATE, INSERT
ON TABLE Student
TO R1;
3.将一个角色授予其他的角色或用户
--将这个角色授予王平,张明,赵玲。使他们具有角色R1所包含的全部权限
GRANT R1
TO 王平,张明,赵玲;
4.角色权限的收回
--一次性通过R1来回收王平的这3个权限
REVOKE R1
FROM 王平;
5.角色权限的修改
使角色R1在原来的基础上增加了Student表的DELETE 权限
GRANT DELETE
ON TABLE Student
TO R1;
审计
1.AUDIT语句:设置审计功能
对修改SC表结构或修改SC表数据的操作进行审计
AUDIT ALTER,UPDATE
ON SC;
2.NOAUDIT语句:取消审计功能
取消对SC表的一切审计
NOAUDIT ALTER,UPDATE
ON SC;
数据库完整性
1.实体完整性
将Student表中的Sno属性定义为码
(1)在列级定义主码
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
(2)在表级定义主码
CREATE TABLE Student
( Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);
关系模型的实体完整性:CREATE TABLE中用PRIMARY KEY定义
2.参照完整性
定义关系SC中的参照完整性:关系SC中(Sno,Cno)是主码。Sno,Cno分别参照Student表的主码和Course表的主码
CREATE TABLE SC
( Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), /*在表级定义实体完整性*/
FOREIGN KEY (Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/
);
关系模型的参照完整性定义:
在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
用REFERENCES短语指明这些外码参照哪些表的主码

3.用户定义的完整性
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个条件表达式(CHECK)
--Student表的Ssex只允许取“男”或“女”。
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK (Ssex IN ('男','女')), /*性别属性Ssex只允许取'男'或'女' */
Sage SMALLINT,
Sdept CHAR(20)
);
完整性约束命名子句
--建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
CREATE TABLE Student
( 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)
);
修改表中的完整性限制
--修改表Student中的约束条件,年龄由小于30改为小于40
先删除原来的约束条件,再增加新的约束条件
ALTER TABLE Student --删除约束条件
DROP CONSTRAINT C3;
ALTER TABLE Student -新增的约束条件
ADD CONSTRAINT C3 CHECK(Sage < 40);
断言
1.创建
CREATE ASSERTION<断言名><CHECK 子句>
2.删除
DROP ASSERTION <断言名>;
触发器
1.定义
--定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher /*触发事件是插入或更新操作*/
FOR EACH ROW /*行级触发器*/
BEGIN /*定义触发动作体,是PL/SQL过程块*/
IF (new.Job='教授') AND (new.Sal < 4000)
THEN new.Sal :=4000;
END IF;
END;
AFTER表示在触发事件的操作执行之后激活触发器
BEFORE 表示在触发事件的操作执行之前激活触发器
语句级触发器和行级触发器
2.激活
一个数据表上可能定义了多个触发器
触发器的执行,是由触发事件激活的,并由数据库服务器自动执行!
3.删除
DROP TRIGGER <触发器名> ON <表名>;
存储过程
最近新学的,刚刚写完博客做完课后题,就不再这里重复了
上期博客相关内容
总结
想简单总结一下,结果发现内容好多,又觉得都是重点,感觉好多学过的东西都忘了,不过这次总结算是第二次深入得学习吧,我已经尽力得把内容写到最少了,不过还是很多。
基础篇到次完结,不过还需要进一步得练习