【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)

创建数据库.

创建数据库有两种典型的方法:

  1. 通过Management Studio创建;
  2. 通过SQL语句创建。

我们主要介绍第二种,也就是创建数据库的SQL命令的语法格式。

CREATE DATABASE NAME_OF_DATABASE

这就是一条最简单的创建数据库的语句,关键就是在于CREATE DATABASE,这样的一条创建语句会使得DBMS按照默认的逻辑名称、文件组、初始大小、自动增长以及路径等属性来创建数据库。如果我们想自己定义这些数据,就需要在CREATE后面继续追加限制语句。完整的创建数据库语法格式如下所示:
【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第1张图片
以一个实际的例子来展示实际的数据库创建语句,如下:
【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第2张图片

CREATE DATABASE Teach
ON
(NAME=Teach_Data,
FILENAME='E:\TeachData.mdf',
SIZE=10,
MAXSIZE=500,
FILEGROWTH=10)
LOG ON
(NAME=Teach_Log,
FILENAME='E:\TeachData.ldf',
SIZE=5,
MAXSIZE=500,
FILEGROWTH=5)

修改数据库.

在创建了数据库之后,还可以对数据库的名称、大小和属性等进行修改。用于修改数据库的命令是:

ALTER DATABASE NAME_OF_DATABASE
......

注意,只有DBA或者具有CREATE DATABASE权限的人员才有权执行此命令。我们通过几个例子来对修改数据库的SQL命令有一个直观的认识:
【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第3张图片

ALTER DATABASE Teach
MODIFY FILE
(NAME = Teach_Data,
FILEGROWTH = 20)

【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第4张图片

ALTER DATABASE Teach
ADD FILE(
NAME=Teach_Datanew,
FILENAME='E:\Teach_Datanew.ndf',
SIZE=100,
MAXSIZE=200,
FILEGROWTH=10)

在这里插入图片描述

ALTER DATABASE Teach
REMOVE FILE Teach_Datanew

删除数据库.

DROP DATABASE NAME_OF_DATABASE

创建数据表.

建立好了数据库之后,我们就进入到创建数据表的过程中了,也就是我们平时所能见到的,类似下面这样的数据表:
在这里插入图片描述
数据表中的每一列(也就是每一个字段Field)都是来自于同一个域的,是必须要属于同一种数据类型的,所以我们在创建数据表的时候,需要为表中的每一个属性设置合适的数据类型。举例说年龄就只能是正整数,而姓名就是字符串类型的属性,一些常见的数据类型如下表所示:
【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第5张图片
【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第6张图片
数据表是由行和列的过程,行就是一个个的元组,也就是我们所要保存的数据。而我们创建数据库的过程,就是定义数据表列的过程,也是定义数据表结构的过程,我们重点着眼于使用SQL命令来创建数据表。首先我们通过例子来给出一个实际的建表SQL命令:

  • 建立一个学生表S,该数据表中需要有SNo、SN、Sex、Age以及Dept5个字段,它们的数据类型以及字段长度分别规定为VARCHAR(6)、NVARCHAR(8)、NCHAR(2)、INT以及NVARCHAR(20)。其中,Sex字段的默认值设定为男。
CREATE TABLE S
( 	SNo CHAR(6),
	SN VARCHAR(10),
	Sex NCHAR(1) DEFAULT '男',
	Age INT,
	Dept NVARCHAR(20))

完整的创建数据表的语法格式为:
【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第7张图片
当中出现了一个概念:约束。这是SQL Server提供的一种数据完整性机制,数据的完整性是指保护数据库中数据的正确性、有效性和相容性,防止错误的数据进入数据库造成无效操作。SQL Server提供的完整性机制除了约束Constraint以外,还包括:

  • 默认Default
  • 规则Rule
  • 触发器Trigger
  • 存储过程Stored-Procedure

约束是SQL Server自动强制数据库完整性的方式,约束定义了列中允许的取值。SQL Server中的约束分为列约束和表约束,其中列约束是对某一个特定列的约束,包含在列的定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名;表约束与列约束相互独立,不包括在列定义之中,通常对于多个列一起进行约束,与列定义用逗号分隔,并且必须要指定被约束列的名称。完整性约束的基本语法格式为:

CONSTRAINT NAME_OF_CONSTRAINT TYPE_OF_CONSTRAINT

如果我们没有给一个约束指定名称,也就是在上面这条语句中略去NAME_OF_CONSTRAINT,系统会为这个约束给定一个名称;并且我们在定义一个约束时,必须要指定该约束的类型TYPE_OF_CONSTRAINT,在SQL Server中,可以定义5种类型的完整性约束:

  • NULL/NOT NULL约束
  • UNIQUE约束
  • PRIMARY KEY约束
  • FOREIGN KEY约束
  • CHECK约束

NULL/NOT NULL.

NULL是表示"未知"、"不确定"或者"没有数据"的意思,当某一个字段一定要输入了值才有意义时,可以为该字段设置一个NOT NULL约束。例如我们前面曾经说过的主体完整性约束规定了主码列中不允许出现空值,否则就失去了唯一标识一条记录的作用,下面是一个实际的NULL/NOT NULL约束的例子:

【例】 建立一个S表,对SNo字段进行NOT NULL约束。

CREATE TABLE S
( SNo VARCHAR(6) CONSTRAINT S_CONS NOT NULL,
//NAME_OF_CONSTRAINT can be ignored.
//SNo VARCHAR(6) CONSTRAINT NOT NULL
SN NVARCHAR(10),
Sex NCHAR(1),
Age INT,
Dept NVARCHAR(20))

UNIQUE.

UNIQUE约束用于指明基本表在某一列或者多个列的组合上的取值必须唯一。定义了UNIQUE约束的那些列称为唯一键,系统会自动为唯一列建立唯一索引,从而保证了唯一键的唯一性。唯一键是允许为空的,但由于需要保证其唯一性,所以最多只有一个NULL值。一个数据表中可以有多个UNIQUE约束,UNIQUE约束也可以作用在多个字段上。用于列约束时,其语法格式如下:

CONSTRAINT NAME_OF_CONSTRAINT UNIQUE

用于表约束时,其语法格式如下:

CONSTRAINT NAME_OF_CONSTRAINT UNIQUE(Col_1,Col_2,...,Col_n)
//Col_i stands for the name of column.

下面给出几个例子来体会UNIQUE约束:

【例】建立一个S表,定义SN为唯一键。

CREATE TABLE S
( SNo VARCHAR(6),
SN NVARCHAR(10) CONSTRAINT SN_UNIQ UNIQUE,
Sex NCHAR(1),
Age INT,
Dept NVARCHAR(20))

【例】建立一个S表,定义SN+Sex为唯一键,此约束为
表约束。

CREATE TABLE S 
( SNo VARCHAR(6),
SN NVARCHAR(10) UNIQUE,
Sex NCHAR(1),
Age INT,
Dept NVARCHAR(20),
CONSTRAINT S_UNIQ UNIQUE(SN, Sex))

PRIMARY KEY.

PRIMARY KEY约束用于定义基本表的主码,前面我们在关系中介绍过主码,也说过数据库要求的主体完整性,所以主码既不能重复,也不能为NULL,籍此来保证完整性。PRIMARY KEY约束就像是NOT NULL约束和UNIQUE约束的结合体,但我们需要明确以下几点:

  • 一个数据表中只有一个主码,所以PRIMARY KEY约束只能存在一个,但UNIQUE约束可以存在多个;
  • 不能为同一个列或者几个列的组合,既定义了UNIQUE约束,又定义了PRIMARY KEY约束。

PRIMARY KEY约束用于列约束时,说明该数据表的主码只有单独的这一个列,用于表约束时,就是将某几个列的组合定义为主码。下面给出几个例子来对PRIMARY KEY约束有一个直观的体会:

【例】建立一个S表,定义SNo为S的主键,建立另外一个数据表C,
定义CNo为C的主键。

//Table-S
CREATE TABLE S 
( SNo VARCHAR(6) CONSTRAINT S_Prim PRIMARY KEY,
SN NVARCHAR(10) UNIQUE,
Sex NCHAR(1),
Age INT,
Dept NVARCHAR(20))

//Table-C
CREATE TABLE C
( CNo VARCHAR(6) CONSTRAINT C_Prim PRIMARY KEY,
CN NVARCHAR(20),
CT INT)

【例】建立一个SC表,定义SNo+CNo为SC的主键。

CREATE TABLE SC
( SNo VARCHAR(6) NOT NULL,
CNo VARCHAR(6) NOT NULL,
Score NUMERIC(4,1),
CONSTRAINT SC_Prim PRIMARY KEY(SNo,CNo))

注意上述代码中SNoCNo列中的NOT NULL约束可以略去,但绝对不可以加上NULL约束,会和后续的PRIMARY KEY约束产生冲突。
【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第8张图片
【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第9张图片

FOREIGN KEY.

FOREIGN KEY约束用于指定某些列的组合(包括单独的一列)作为外码,其中包含外码的表称为从表,包含外码所引用的主码或唯一键的表称为主表,系统会保证从表中外码的取值是主表中主码的某一个值(或是唯一键值),或者可以取为NULL值,以满足数据库要求的参照完整性。
【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(二)_第10张图片
PRIMARY KEY类似地,FOREIGN KEY既可以用于列约束,也可以用于表约束,其语法格式为:

CONSTRAINT NAME_OF_CONSTRAINT FOREIGN KEY REFERENCES 
	NAME_OF_PRIMARY_TABLE(Col_1,Col_2,...,Col_n)

下面给出一个例子来对FOREIGN KEY约束有一个直观的认识:

【例】建立一个SC表,定义SNo,CNo为SC的外部键。

CREATE TABLE SC
( SNo VARCHAR(6) NOT NULL CONSTRAINT S_Fore
FOREIGN KEY REFERENCES S(SNo),
CNo VARCHAR(6) NOT NULL CONSTRAINT C_Fore
FOREIGN KEY REFERENCES C(CNo),
Score NUMERIC(4,1),
CONSTRAINT S_C_Prim PRIMARY KEY (SNo,CNo))

注意到在表SC(学生选课表)中,SNo+CNo是其主码,也就是说同时知道学生学号和课程号才能确定下一条记录,而SNoCNo单独的每一个都不是主码。另外,SNo作为学生关系S的主码,CNo作为课程关系C的主码,都可以被SC关系参照,来作为SC关系的外码被定义。

CHECK.

CHECK约束用于检查字段值所允许的范围,例如字段年龄只能输入正整数,而且是限制在0~150之间的整数。在定义CHECK约束时,需要考虑以下几个因素:

  • 一个表中可以定义多个CHECK约束;
  • 但每一个字段只能拥有一个CHECK约束;
  • 在多个字段上定义的CHECK约束必须是表约束;
  • 执行INSERTUPDATE等修改数据表的操作时,CHECK约束会验证新的数据。

CHECK约束的语法格式如下所示:

CONSTRAINT NAME_OF_CONSTRAINT CHECK(CONDITION)

下面给出几个例子来对CHECK约束以及SQL Serer支持的各种约束进行展示:

【例】建立一个SC表,定义Score的取值范围为0~100之间。

CREATE TABLE SC
( SNo VARCHAR(6),
CNo VARCHAR(6),
Score NUMERIC(4,1) CONSTRAINT Score_Check
CHECK(Score>=0 AND Score <=100))

【例】建立包含完整性定义的学生表S。

CREATE TABLE S
(
SNo VARCHAR(6) CONSTRAINT S_Prim PRIMARY KEY,
SN NVARCHAR(10) CONSTRAINT SN_Cons NOT NULL,
Sex NCHAR(1) CONSTRAINT Sex_Cons NOT NULL DEFAULT '男',
Age INT CONSTRAINT Age_Cons NOT NULL
	CONSTRAINT Age_Check CHECK(Age BETWEEN 12 AND 50),
Dept NVARCHAR(20) CONSTRAINT Dept_Cons NOT NULL
)

修改数据表.

由于应用环境和应用需求的修改,可能要修改表的基本结构,例如增加新的字段列、完整性约束,或者修改原有的字段列的定义、完整性约束的定义等。SQL使用下述的命令来完成修改数据表的功能:

ALTER DATABASE 

ADD.

ADD修改方式用于添加新的字段列或完整性约束,我们先给出几个例子,再描述其完整的语法格式:

【例】在S表中增加一个班号列Class_NO和住址列Address

ALTER TABLE S 
ADD
Class_No VARCHAR(6),
Address NVARCHAR(20)

注意!使用此方式增加的新列自动填充NULL值,所以不能为增加的新列指定NOT NULL约束。但可以在后续的操作中,完善新列的完整性定义。

【例】在SC表中增加完整性约束定义,使Score在0~100之间。

ALTER TABLE SC 
ADD 
CONSTRAINT Score_Chk CHECK(Score BETWEEN 0 AND 100)

ADD方式的完整语法格式如下,对照上面的例子进行体会:

ALTER TABLE NAME_OF_TABLE ADD
	DEFINITION_OF_COLUMN|DEFINITION_OF_CONSTRAINT

ALTER.

ALTER方式用于修改某些列,使用该方式有着下面的一些限制:

  • 不能改变列名;
  • 不能将含有空值的列的定义修改为NOT NULL约束;
  • 若列中已有数据,则不能减少该列的宽度,也不能改变其数据类型;
  • 只能修改NULL/NOT NULL约束,其他类型的约束在修改之前必须先将约束删除,然后再重新添加修改过的约束定义。

类似地,我们先给出例子,再描述其完整的语法格式:

【例】把S表中的SN列加宽到12个字符。

ALTER TABLE S
ALTER COLUMN SN NVARCHAR(12)

ALTER方式的完整语法格式如下所示,可以对照上面的例子体会用法:

//COLUMN
ALTER TABLE NAME_OF_TABLE
ALTER COLUMN NAME_OF_COLUMN TYPE_OF_DATA NULL|NOT NULL

DROP.

上面的ALTER方式中我们说了:只能修改NULL/NOT NULL约束,其他类型的约束在修改之前必须先将约束删除,然后再重新添加修改过的约束定义。
DROP方式就是用于删除某些完整性定义的,其语法格式很简洁:

ALTER TABLE NAME_OF_TABLE
DROP CONSTRAINT NAME_OF_CONSTRAINT

【例】 删除S表中的主键。

ALTER TABLE S
DROP CONSTRAINT S_Prim

删除基本表.

当某一个基本表不再使用时,可以将其删除。删除之后该表的数据以及建立在这之上的索引都会被删除。但视图的定义会继续保留,只是无法使用,如果后续恢复了该表,这些视图可以重新使用。删除数据表的语法很简单:

DROP TABLE NAME_OF_TABLE

但我们需要注意,只能删除自己建立的数据表,不能删除其他用户所建立的数据表。

你可能感兴趣的:(数据库原理,数据库)