4.1 SQL语言概述
不同数据库厂商的数据库管理系统提供的SQL语言略有差别,本书主要以Microsoft SQL Server 使用的SQL语言(称为Transact-SQL,简称T-SQL)为主介绍SQL语言的功能。
4.1.1 SQL语言特点
SQL之所以能够被用户和业界所接受并成为国际标准,是因为它是一个综合的、功能强大且又比较简单易学的语言。SQL语言集数据定义、数据查询、数据操作和数据控制功能于一身,主要包括如下特点。
1. 一体化
2. 非过程化
3. 语言简洁
4. 提供多种方式使用
4.1.2 SQL语言功能概述
SQL按其功能可分为四大部分:数据定义、数据控制、数据查询和数据操作。如表4-1列出了实现这四部分功能的动词。

数据定义功能用于定义、删除和修改数据库中的对象;数据查询功能用于实现查询数据的功能,查询数据是数据库中使用最多的操作;数据操作功能用于增加、删除和修改数据;数据控制功能用于控制用户对数据库的操作权限。
4.2 SQL Server 的主要数据类型
SQL Server 提供了多种数据类型,这些数据类型可分为数值类型、字符串类型、日期和时间类型、二进制类型等。下面介绍其中主要的数据类型。
4.2.1 数值类型
数值类型分为准确数值类型和近似数值类型两种。
4.2.2 字符串类型
字符串类型用于存储字符数据,字符可以是各种字母、数字符号、汉字以及各种符号。目前字符的编码方式有两种:一种是普通字符编码,另一种是统一字符编码(unicode)。普通字符编码是指不同国家或地区的编码长度不一样,例如,英文字母的编码是1个字节(8位),中文汉字的编码是2个字节(16位)。统一字符编码是指对所有语言中的字符均采用双字节(16位)编码。
在SQL Server中使用字符数据时,需要将字符数据用英文的单引号括起来,如'Me'。在计算机中,字符编码以数字的形式展示并最终将数字转化为二进制编码。
二进制编码主要用于存储图形、图像数据。二进制编码的字符串数据一般用十六进制表示,若使用十六进制格式,可在字符前加“0x”前缀。
4.2.3 日期和时间类型
如表4-7列出了SQL Server 支持的主要日期和时间类型包括date类型,time[(n)],datetime,smalldatetime类型。
4.3 创建与维护关系表
表是数据库中非常重要的对象,用于存储数据库数据。创建表就是定义表所包含的列的结构,其中,包括列的名称、数据类型、约束等。列的名称是人们为列所取的名字,一般为了便于记忆,最好取有意义的名字,如学号或Sno,而不要取无意义的名字,如a1;列的数据类型说明了列的可取值范围;列的约束更进一步限制了列的取值范围,这些约束包括:列取值是否允许为空、主键约束、外键约束、列取值范围约束等。
4.3.1 创建关系表
定义关系表使用SQL语言数据定义功能中的CREATE TABLE语句实现,其一般格式为:
CREATE TABLE [<架构名>.]<表名>(
{ <列名> <数据类型> [ 列级完整性约束定义 [ … n ] ] }
[ 表级完整性约束定义 ] [ ,… n ]
)
注意:默认时SQL语言不区分大小写。
其中:
● <表名>是所要定义的基本表的名字,同样,这个名字最好能表达表的应用语义,如“学生”或“Student”。
● <列名>是表中所包含的属性列的名字,<数据类型>指明列的数据类型。
在创建表的同时可以定义与表有关的完整性约束条件,大部分完整性约束既可以在“列级完整性约束定义”处定义,也可以在“表级完整性约束定义”处定义。
可定义的完整性约束包括:
● NOT NULL:限制列取值非空。
● DEFAULT:指定列的默认值。
● UNIQUE:定义列取值不能重复。
● CHECK:定义列的取值范围。
● PRIMARY KEY:定义主键约束。
● FOREIGN KEY:定义外键约束。
上述约束中, NOT NULL和DEFAULT约束只能在“列级完整性约束定义”处定义,多列之间的CHECK约束只能在“表级完整性约束定义”处定义,其他约束均可在“列级完整性约束定义”或“表级完整性约束定义”处定义。
1. 主键约束
定义主键的语法格式为:
PRIMARY KEY [(<列名> [, … n])]
如果是在列级完整性约束处定义单列的主键,可省略方括号部分。
2. 外键约束
外键既可以定义在列级完整性约束处,也可以定义在表级完整性约束处。定义外键的语法格式为:
[FOREIGN KEY (列名[,… n])] REFERENCES <外表名>(<外表列名>[,… n])
如果是在列级完整性约束处定义单列的外键,可省略方括号部分。
3. 唯一值约束
UNIQUE约束用于限制列的取值不重复。这个约束通常用在事实上具有唯一性的属性列上,如每个人的身份证号、银行的银行卡号均不能有重复值。
在一个已有主键的表中使用UNIQUE约束定义非主键列取值不重复是很有用的,如学生(学号,姓名,身份证号),如果主键选“学号”,则“身份证号”列不是主键,但它的取值也不能重复,这种情况就需要使用UNIQUE约束限定。
定义唯一值约束的语法格式为:
UNIQUE [(<列名> [, … n] )]
如果在列级完整性约束处定义单列的唯一值约束,则可省略方括号中的内容。
4. 默认值约束
默认值约束用DEFAULT约束实现,它用于提供列的默认值,即当在表中插入数据时,如果没有为有DEFAULT约束的列提供值,则系统将自动使用DEFAULT约束定义的默认值。
一个默认值约束只能为一个列提供默认值,且默认值约束必须是列级完整性约束。
默认值约束的定义有两种形式,一种是在定义表时指定默认值约束,另一种是在修改表结构时添加默认值约束。
(1)在创建表时定义DEFAULT约束。
DEFAULT 常量表达式
(2)为已创建好的表添加DEFAULT约束。
DEFAULT 常量表达式 FOR 列名
5. 列取值范围约束
限制列取值范围用CHECK约束实现,例如,考试成绩的取值是0~100分,工资不能小于3000元(假设最低工资为3000元)等。需要注意的是,CHECK约束限制的列必须在同一个表中。
可以通过任何基于逻辑运算符返回TRUE或FALSE的逻辑(布尔)表达式创建CHECK约束。定义CHECK约束的语法格式为:
CHECK(逻辑表达式)
可以将CHECK约束应用于单个列,还可以通过在表级创建CHECK约束,限定多个列之间的相互取值约束,如“毕业日期”晚于“入学日期”。
例1.用SQL语句创建三张表:学生(Student)表、课程(Course)表和学生修课(SC)表,这三张表的结构和约束如表4-9~表4-11所示。
说明:为了简化,描述学生年龄信息时,选用了整型类型的年龄(整型类型)。在实际应用中一般选择出生日期(日期类型)来描述学生年龄,因为学生的年龄是变化的数据,而出生日期是不变的。这里选用整型类型的年龄,只是为了简化一些操作。



创建满足约束条件的上述三张表的SQL语句如下:
CREATE TABLE Student (
Sno CHAR(9) PRIMARY KEY,
Sname NCHAR(5) NOT NULL,
SID CHAR(18) UNIQUE,
Ssex NCHAR(1) DEFAULT'男',
Sage TINYINT CHECK(Sage>=15 AND Sage<=45),
Sdept NVARCHAR(20) )
CREATE TABLE Course (
Cno CHAR(6) PRIMARY KEY,
Cname NVARCHAR(20) NOT NULL,
Credit NUMERIC(3,1) CHECK(Credit>0),
Semester TINYINT )
CREATE TABLE SC (
Sno CHAR(9) NOT NULL,
Cno CHAR(6) NOT NULL,
Grade TINYINT CHECK(Grade BETWEEN 0 AND 100),
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno) )
4.3.2 修改表结构
在创建好表之后,如果表结构有变化,如增加新列、删除列或修改列数据类型及约束等,则可以使用ALTER TABLE语句对表结构进行修改。不同DBMS的ALTER TABLE语句的格式略有不同,我们这里给出T-SQL支持的ALTER TABLE语句的部分格式。对其他的数据库管理系统,可参考它们的语言参考手册。
ALTER TABLE [<架构名>.]<表名>
{
ALTER COLUMN <列名> <新数据类型> — 修改列定义
| ADD {<列名> <数据类型> [完整性约束定义]} [,…n] — 添加新列
| ADD [CONSTRAINT <约束名>] 约束定义 — 添加约束
| DROP COLUMN <列名> [,…n ] — 删除列
| DROP [CONSTRAINT]<约束名> [,…n ] — 删除约束
}
例2.为SC表添加“修课类别”列,此列的定义为:Type NCHAR(1),允许空。
ALTER TABLE SC ADD Type NCHAR(1)
例3.将新添加的Type列的数据类型改为NCHAR(2)。
ALTER TABLE SC ALTER COLUMN Type NCHAR(2)
例4.为Type列添加限定取值范围为{必修,重修,选修}的约束。
ALTER TABLE SC
ADD CHECK(Type IN ('必修', '重修', '选修') )
例5.删除SC表的“Type”列。
ALTER TABLE SC DROP COLUMN Type
例6.为T表添加主键约束,主键列为:C1。
ALTER TABLE T
ADD CONSTRAINT PK_C1 PRIMARY KEY(C1)
例7.删除T表的主键约束。
ALTER TABLE T
DROP CONSTRAINT PK_C1
4.3.3 删除表
当不再需要某个表时,可以将其删除。删除表的语句格式为:
DROP TABLE <表名> { [, <表名> ] … }
例8.删除test表。
DROP TABLE test
注意:如果被删除的表中有其他表对它的外键引用约束,则必须先删除外键所在的表,然后删除被引用键所在的表。

如若转载,请注明出处:https://www.dasum.com/108980.html