1. SQL概述 2。DDL 3。DML DCL(第四部分安全性讲) 4。嵌入式使用 5。PL/SQL
1、SQL概述 1)SQL的发展历程 2)SQL数据库中的术语 3)SQL数据库的三级体系结构 4)SQL的组成
1)、SQL的发展历程 1972:IBM开始研究System R系统,配置了数据库语言SQUARE SQUARE ( Specifying Queries As Relational Expressions) 使用了大量的数学符号 1974:Boyce和Chamberlin将SQUARE修改为SEQUEL SEQUEL (Structured English QUEry Language ) 去掉了数学符号,以英语单词和结构式语法代替查询 后简称为SQL (Structured Query Language)
1)、SQL的发展历程 1970s末起:主流的数据库厂商纷纷在其产品中支持SQL 1986.10:ANSI颁布了美国标准的SQL Oracle、DB2、Sybase 1986.10:ANSI颁布了美国标准的SQL 1987.4:ISO采纳美国标准为国际标准,后称“SQL86” 1989.4:SQL89,增强了完整性特征 1992:SQL92(“SQL2”) 1999:SQL3
2)、SQL数据库中的术语 (基本)表——关系 记录——元组 字段(列)——属性 字段值——属性值 字段类型(列类型)——域 码——键 主码——主键 外码——外键
3)、SQL数据库的三级体系结构 SQL数据库:支持SQL语言的关系数据库 SQL用户 外模式 关系子模式 视图(View) 概念模式 关系模式 基本表 内模式 存储模式 文件 ANSI/SPARC 关系数据库 SQL数据库
3)、SQL数据库的三级体系结构 一个SQL数据库的总体逻辑结构是基本表(Table)的集合,对应于ANSI/SPARC的概念模式 用户所见的数据结构以视图(View),对应外模式 用户可以通过SQL对基本表和视图进行操作
4)、SQL的组成 Create Table/Alter Table/Drop Table:定义基本表 DDL Create View/Drop View:视图操作 Create Index/Drop Index:索引操作 Insert Delete Select Update DML 记录操作 SQL Grant Revoke DCL 权限管理 嵌入式SQL的使用规定
2、SQL的数据定义——DDL 基本表的组成 创建基本表:Create Table 修改基本表:Alter Table 删除基本表:Drop Table
1)、基本表的组成 列 完整性约束
(1)列 列名 列类型 字母开头,可含字母、数字、#、$、_ <=30字符 Char(n)【定长字符串类型】 Varchar2(n)【可变长字符串类型】 Number【数值型】 Date【日期时间型】 ……
(1)列 Oracle数据类型与ANSI有一定的差别 若使用ANSI类型,Oracle自动转换为Oracle类型 ANSI/ISO 字符型 Char(n) Character(n) Character Varying(n) Varchar2(n) Char Varying(n) 数值型 Numeric Number Decimal Integer Int Float Double Real 日期型 Date Time Oracle数据类型与ANSI有一定的差别 若使用ANSI类型,Oracle自动转换为Oracle类型
这些约束既可以定义在列上,也可以定义在基本表之上 表约束:在全部列定义后定义,可定义多个列上的约束 (2)完整性约束 主键约束(Primary Key) 实体完整性 唯一键约束(Unique) 外键约束(Foreign Key) 参照完整性 检查约束(Check) 用户自定义完整性 这些约束既可以定义在列上,也可以定义在基本表之上 列约束:在每列后定义,只对当前列有效 表约束:在全部列定义后定义,可定义多个列上的约束
在SQL数据库中,不一定必须定义主键,这与关系模型有差别 2)、创建基本表 基本表构成:表名,列和约束 Create Table <基本表名>( 列名1 列类型1 [列约束1], 列名2 列类型2 [列约束2], …… [表约束] ) 在SQL数据库中,不一定必须定义主键,这与关系模型有差别 Create Table Student( S# Varchar2(10) Constraint PK Primary Key, Sname Varchar2(20), Age Number(3), Sex Char(1) )
NOT NULL表示不允许空值,实际上是Check约束的简化 (1)定义列 完整格式 <列名> <列类型> [ DEFAULT <默认值>] [[NOT] NULL] [<列约束>] Create Table Student( S# Varchar2(10) Constraint PK Primary Key, Sname Varchar2(20) NOT NULL, Age Number(3), Sex Char(1) DEFAULT ‘F’ ) NOT NULL表示不允许空值,实际上是Check约束的简化
A)默认值 当往表中插入一条新记录时,如果某列上有默认值,并且新记录中未指定该列的值,则自动以默认值填充 S# Sname Age Sex Insert Into Student(s#,sname,age) Values(‘001’,’John’,20) 自动以默认值填充 S# Sname Age Sex 001 John 20 F
B)列约束 必须更在每个列定义后定义 只对当前列有效 可以使用四种类型的约束 格式 例 [Constraint <约束名>] <约束类型> 例 S# char(n) Constraint PK_Student Primary Key S# char(n) Primary Key
Where we are? 创建基本表 定义列 定义约束
(2)定义约束 列约束:在每个列后定义,可以有多个约束子句 表约束:在全部列定义完成后定义,可以有多个约束子句 不能定义多个列上的约束 表约束:在全部列定义完成后定义,可以有多个约束子句 多个列上的约束必须使用表约束 单列上的约束可以用列约束,也可用表约束 四种约束都可以作为列约束或表约束
A)列约束和表约束举例 Create Table Student( S# Varchar2(10) Constraint PK_S Primary Key, Sname Varchar2(20), Age Number(3) Constraint CK_S Check (age>14 and age<100), Sex Char(1), Constraint UQ_S Unique(Sname), Constraint CK_SS Check (Sex IN (‘M’,’F’)) )
B)Primary Key约束 定义主键:不许有空值,也不可重复 Create Table Student( S# Varchar2(10) Constraint PK_S Primary Key, Sname Varchar2(20), Age Number(3) , Sex Char(1)) 一个表只能有一个主键!!! Create Table SC( --选课表 S# Varchar2(10) C# Varchar2(20), Score Number(3) , Constraint PK_SC Primary Key(S#,C#))
C)Unique约束 唯一性约束:值不可重复,但可以为空 多个列上的约束只能用表约束来实现 Create Table Student( S# Varchar2(10) Constraint PK_S Primary Key, Sname Varchar2(20) Constraint UQ_S Unique, Age Number(3) , Sex Char(1), Constraint UQ_SS Unique(Sname) ) Create Table Department( NO Varchar2(10), NAME Varchar2(20), SCHOOL Char(20), Constraint UQ_D Unique(NAME,SCHOOL) ) 多个列上的约束只能用表约束来实现 Create Table Student( S# Varchar2(10) Constraint PK_S Primary Key, Sname Varchar2(20) Constraint UQ_S Unique, Age Number(3) , Sex Char(1) )
若约束列中有一列不为空,就实施约束;若约束列都为空,则不实施约束 D)Unqiue约束对空值的处理 若约束列中有一列不为空,就实施约束;若约束列都为空,则不实施约束 NO NAME SCHOOL 1 管理系 商学院 2 管理学院 OK 值唯一 3 Error! 值重复 4 5 6 实施约束 7 约束列都空,不实施约束 8
E)Foreign Key约束 外键约束:表中某列值引用其它表的主键列或Unique列,参照完整性含义 Create Table Student( S# Varchar2(10) Constraint PK_S Primary Key, Sname Varchar2(20), Age Number(3)) Create Table SC( --选课表 S# Varchar2(10) Constraint FK_SC References Student(S#), C# Varchar2(20), Score Number(3) , ) Constraint FK_SC Foreign Key(S#) References Student(S#))
F)Foreign Key约束示例 被参照表(主表):Student表 参照表(子表):SC表 S# SNAME AGE 001 John 20 002 Rose 21 S# C# Score 001 c001 90 Insert Into SC values(‘003’,’c001’,85); --Error occurs!! Delete From Student where S#=‘001’; - - Error occurs!! 在子表中(如SC)插入记录时,若主表中对应的列值不存在,则插入出错; 删除主表中的记录时,若有子表中的相应记录存在,也出错。--若设置了级联删除则不会出错
G)Foreign Key约束的选项 级联删除:删除主表中的记录时,同时删除子表中相关联的记录: On Delete Cascade 级联设空:删除主表中的记录时,同时将子表中相应记录的外键列值设为空: On Delete Set NULL Create Table SC( --选课表 S# Varchar2(10) , C# Varchar2(20), Score Number(3) , Constraint FK_SC Foreign Key(S#) References Student(S#) On Delete Cascade )
H)Check约束 检查约束:自定义某些列上的约束 Constraint CK_S1 Check (age>15) Constraint CK_S2 Check (Sex In (‘M’,’F’)) Constraint CK_SC Check (Score>=0 and Score<=100) Constraint CK_S3 Check (Sname Is Not NULL) = NOT NULL
2)、修改基本表 Alter Table <表名> [Add <列定义>] | [Modify <列定义>] | [Drop Column <列名>] | [Add <表约束>] | [Drop Constraint <约束名>]
(1)增加列 Alter Table <表名> Add <列定义> <列定义>与Create Table中相同 Alter Table Student( Add Class Varchar2(10) ) Alter Table Student( Add Dept Varchar2(10) Constraint UQ_S3 UNIQUE )
(2)删除列 Alter Table <表名> Drop Column <列名> Alter Table Student( Drop Column age )
(3)修改列 Alter Table <表名> Modify <列定义> <列定义>与Create Table中相同 但列名不能修改 Alter Table Student( Modify age Integer NOT NULL )
(4)增加约束 Alter Table <表名> Add <表约束> 只能增加表约束 表约束格式与创建表时相同 Alter Table Student( Add Constraint PK_Student Primary Key(S#) )
(5)删除约束 Alter Table <表名> Drop Constraint <约束名> Create Table SC( --选课表 S# Varchar2(10) , C# Varchar2(20), Score Number(3) , Constraint FK_SC Foreign Key(S#) References Student(S#) On Delete Cascade ) Alter Table SC( Drop Constraint FK_SC )
3)、删除基本表 Drop Table <表名> [Cascade Constraints] Drop Table Student Drop Table Student Cascade Constraints