当前课程知识点:数据库概论 > 第三章 结构化查询语言SQL > 3.2 数据定义DDL > 数据定义DDL
各位同学大家好
我是来自云南大学软件学院的张璇
下面
我们介绍如何使用SQL的数据定义语言DDL
来定义数据库和数据库中的数据表
在开始定义一个数据库之前
我们先了解一下SQL语言的语法格式约定
大写字母代表了保留的关键字标识符
小写字母表示数据库对象标识符和表达式
大括号中的内容为必选参数
其中的多个选项我们用竖线分隔开
竖线表示参数之间的或关系
方括号表示列出的选项是可选的
用户可以不选择
省略号自然表示重复前面语法单元
而注释中
单行注释用两个破折号表示
块注释用斜杠星号来表示
好
基于这个约定
我们下面看看定义数据库的SQL语言
这个定义中的绿色大写标识符是定义数据库的动词
CREATE DATABASE就是创建数据库
后面的database_name
可根据实际情况定义数据库的标识符
也就是数据库的名称
ON后面显式定义用来
存储数据库数据的磁盘文件
即数据文件
其中
LOG ON后面显式定义
用来存储数据库日志的磁盘文件
如果没有指定这个选项
系统会自动创建一个日志文件
PRIMARY定义主文件组
在指定关联的数据文件
定义一个主文件
需要注意
一个数据库只能有一个主文件
如果没有指定PRIMARY
那么 CREATE DATABASE 语句中
列出的第一个文件
将被自动定义为主文件
主文件包含在数据文件组
FILEGROWTH指定了数据文件
定义的文件的增长增量
其增量设置不能超过
最大存储MAXSIZE的设置
FILEGROUP即是用户定义的文件组
下面我们举一个示例
来创建一个学生数据库
Create DataBase Student_DB
创建一个名为Student_DB的学生数据库
ON Primary后面定义主数据文件
这里是定义主数据文件的逻辑名称
在Name这里
定义为Student_DB_dat
然后
我们用FileName
定义具体的物理文件位置和文件名
也就是用这一句命令来表示
在FileName等于d盘
data文件夹下的Student_DB.mdf
这里mdf是主数据文件的后缀
Size等于10MB
这里定义了主数据文件初始规模为10M
MaxSize等于50MB
定义主数据文件最大规模为50M
FileGrowth等于15%
定义为文件增长的增量每次为15%
后面的数据文件组FileGroup
和日志文件Log ON的定义相似
我们就不细说了
请大家自己学习
现在
我们定义了一个学生数据库
如果需要修改
可以使用ALTER DATABASE动词
下面是它的语法格式
这个命令对database_name指定的数据库进行修改
用ALTER DATABASE的命令
其中ADD FILE用于增加数据文件
REMOVE FILE用于删除已存储的数据文件
MODIFY FILE用于修改已存储的数据文件
最后MODIFY NAME用于修改数据库的标识符
其他修改操作类似
同样我们不细说
下面我们来举一个具体的例子
这里Alter DataBase Student_DB
是对我们刚刚创建好的
Student_DB数据库进行修改
首先我们用Modify File
修改数据文件的初始规模
把Size重新设定为20M
然后
用Add File增加一个新的数据文件定义
定义方式与前面创建数据库时
使用的定义方式一致
那如果我们要删除已创建好的数据库
就直接使用DROP DATABASE
加上数据库标识符就可以了
当然
特别要注意
如果删除数据库一定要谨慎使用
因为数据将会全部被删除掉
在定义数据库后
我们可以在里面
继续定义装数据的数据表
定义数据表的动词
与定义数据库的动词非常相似
同样是Create
Alter和DROP
只是后面跟TABLE和数据表的标识符
首先看一下定义数据表
定义数据表本质上是定义表的结构
在CREATE TABLE定义数据表的名称后面
定义构成表的各个列的列名
规定列存储的数据类型
和必要的完整性约束条件
这里表的列也称为数据表的属性
不过
我们下面统一用列进行描述
定义完列之后
可以在最后
定义整个数据表的完整性约束条件
这里说的完整性约束包括
用UNIQUE定义输入的数据唯一
不能重复
用DEFAULT定义默认值
用Primary Key是定义主键约束
用Foreign key是定义外键约束
CHECK是用来定义输入数据格式
或内容的一个约束
我们之前定义了学生数据库
下面我们在这个数据库里面
定义三张数据表
它们分别是学生表
课程表和成绩表
其中
学生表我们定义学号S#
学生姓名定义Sname
入学年龄定义Age
性别定义Gender
和所学习系的系定义Dept
课程表C定义课程号C#
课程名Cname和课程类型Ctype
成绩表SC定义学生S#
在课程C#所获得的成绩Grade
下面我们以学生表为例
来看看如何定义数据表
首先
使用Create Table动词定义学生表S
在定义表结构中的各个列时
首先定义列标识符
然后定义对应的数据类型
和完整性约束条件
例如
学号标识符我们定义为S#
后面数据类型我们定义为
10字符长度的定长字符类型char(10)
完整性约束条件是
学号不能空
定义为NOT NULL
且必须唯一定义为UNIQUE
按照同样的方式定义完所有其他列之后
可以在最后定义数据表的完整性约束条件
例如
我们定义学号S#为主键
就在最后用Primary Key(S#)进行约束
当然
这里如果定义了学号S#为主键
针对S#的前面
我们定义了列完整性约束非空
NOT NULL和唯一UNIQUE
就可以不定义了
因为主键定义
就是约束其非空和唯一条件
课程表和成绩表的定义类似
我们只看看区别
课程表主键定义为课程号C#
由于是单个列定义为主键
所以
我们可以把主键约束Primary key
直接定义为C#的列完整性约束条件
再来看成绩表
由于成绩表的两个列
学生学号S#和课程号C#
共同构成成绩表的主键
因此
必须定义为表级的完整性约束
注意
我们不能在这两个列后面
同时增加Primary key的约束
语法是通不过的
另外
学生学号S#和课程号C#
分别是对应学生表和课程表的外键
因此我们用foreign key进行外键定义
并用refreneces指向外键对应的数据表
和具体的属性列
最后一行
我们使用check约束限制
成绩要么为空
grade is null
要么其数值在0到100之间
grade Between 0 and 100
在定义了数据表之后
如果我们需求修改
可以使用ALTER Table进行修改
其中
使用ADD可以增加一个新的列
使用DROP可以删除一个已经定义的列
使用ALTER可以修改已经定义的一个列
需要注意
新增加的列
不能增加非空NOT NULL的完整性约束条件
原因很简单
在修改数据表之前
数据表中很可能已经有数据了
增加新的列
下面的数据自然是空的
所以不能定义为NOT NULL
对于修改数据表
我们举一个非常简单的示例
我们修改数据表S就Alter Table S
增加一个属性列就Add Address
定义数据类型就varchar(30)
就是在学生表中
增加一个保存学生家庭住址的列
数据类型用变长字符型
长度为30字符
当然
一个数据表中的列
有可能被其他数据库对象引用
比如说视图
因此
在删除列的时候
通常要指明是CASCADE方式
还是RESTRICT方式
CASCADE表示删除列时
所引用到的数据库对象中的
对应列也要一起级联删除
而RESTRICT表示
当没有数据库对象引用时
可以删除
否则拒绝删除操作
最后需要注意的是
在修改一个
已经定义了列的数据类型时
新数据类型必须和原数据类型要匹配
并且一般新增数据类型的长度
要能够存储表中已经有的数据
和删除数据库类似
删除数据表使用DROP动词
不同的是
后面增加上Table
和要删除的数据表标识符即可
同样需要注意
数据表一旦删除
表中的数据
在这个数据表上建立的数据库对象
比如说索引和视图
都会被自动删除掉
所以一定要谨慎执行删除操作
好了
上面我们介绍使用SQL中的
数据定义语言DDL
来完成数据库和数据表的定义
包括
创建
修改和删除
它们都用了共同的Create
Alter和Drop动词
数据库定义主要定义数据文件
日志文件和文件组
而数据表则主要定义属性列
数据类型和完整性约束
下面我们要介绍如何操作
我们定义的数据库和数据表
谢谢大家
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video