SQL语言全称是结构化查询语言,它是一种在关系型数据库中定义和操纵数据的标准语言。它实际上包含数据定义、数据查询、数据操作和数据控制等与数据库有关的全部功能。
4.1SQL语言概述
4.1.1SQL语言的发展过程
最早的SQL原型是IBM的研究人员在20世纪70年代开发的,该原型被命名为SEQUEL。
从20世纪80年代以来,SQL就一直是关系数据库管理系统(RDBMS)的标准语言。最早的SQL标准是1986年10月由美国ANSI颁布的。
4.1.2SQL语言的特点
SQL之所以能够被用户和业界所接受并成为国际标准,是因为它是一个综合的、功能强大且又比较简捷易学的语言。SQL语言集数据定义、数据查询、数据操作和数据控制功能于一身,其主要特点如下。
(1)一体化。SQL语言风格统一,可以完成数据库活动中的全部工作,包括创建数据库、定义模式、更改和查询数据已经安全控制和维护数据库等。
(2)高度非过程化。
(3)面向集合的操作方式。SQL语言采用集合操作方式,不仅查询结果是记录的集合,而且插入、删除和更新操作的对象也是记录的集合。
(4)提供多种方式使用。SQL语言既是自含式语言,又是嵌入式语言。
(5)语言简洁。
4.1.3SQL语言的功能
数据定义(DDL):CREATE、DROP、ALTER
数据查询(DQL):SELECT
数据操纵(DML):INSERT、UPDATE、DELETE
数据控制(DCL):GRANT、REVOKE、DENY
4.2SQL支持的数据类型
4.2.1数值型
1.精确数字:整型数、定点小数
int 4字节
2.近似数字:浮点型数据
float 4或8字节
4.2.2日期时间型
datetime 8字节
date 3字节
time 3~5字节
4.2.3字符串型
1.普通字符编码串
char n字节
2.统一字符编码串
nchar n字节
3.二进制串
4.3数据定义功能
SQL Server 2012中数据定义功能由CREATE、DROP和ALTER3个动词组成,它们分别完成对数据库对象的创建、删除和修改。这些数据对象包括:数据库、架构、表、视图以及索引等。
4.3.1数据库的定义
1.数据库创建
数据库创建使用CREATE DATABASE 语句,其语法格式如下:
CREATE DATABASE<数据库名>
[ON [PRIMARY]<文件>[,……n]]
[,<文件组>[,……n]]
[LOG ON<文件>[,……n]]
[COLLATE<校验方式名>]
[WITH <选项>[,……n]][;]
2.数据库修改
数据库修改使用ALTER DATABASE语句,其语法格式如下:
ALTER DATABASE<数据库名>
3.数据库删除
数据库删除使用DROP DATABASE 语句,其语法格式如下:
DROP DATABASE<数据库名>[,……n][;]
4.3.2架构的定义
架构(也称模式)是数据库下的一个逻辑命名空间,可以存放表、试图等数据库对象,它是一个数据库对象的容器。
1.架构创建
数据库创建使用CREATE SCHEMA语句,其语法格式如下:
CREATE SCHEMA{
|AUTHORIZATION<所有者名>
|<架构名>AUTHORIZATION<所有者名>
}
2.架构修改
架构修改使用ALTER SCHEMA语句,可用于在同一数据库中的架构之间移动安全对象。其语法格式如下:
ALTER SCHEMA<架构名>
TRANSFER<对象名>[;]
3.架构删除
架构删除使用DROP SCHEMA语句,其语法格式如下:
DROPS CHEMA<架构名>[;]
4.3.3表的定义
1.表的创建
表的创建使用CREATE TABLE 语句,其语法格式如下:
CREATE TABLE[<架构名.>]<表名>
({<列名><数据类型>[列级完整性约束定义[……n]]}
[表级完整性约束][,……n]
)
注意:默认时SQL语言不区分大小写。
<表名>是所要定义的基本表的名字。
<列名>是表中所包含的属性列的名字。
在定义表的同时还可以定义与表有关的完整性约束条件,这些完整性约束条件都会存储在系统的数据字典中。如果完整性约束只涉及表中的一个列,则这些约束条件可以在“列级完整性约束定义”处定义,也可以在“表级完整性约束定义”处定义;但某些涉及表中多个属性列的约束,必须在“表级完整性约束定义”处定义。
在列级完整性约束定义处可以定义如下约束:
NOT NULL:非空约束,限制列取值非空。
PRIMARY KEY:主键约束,指定本列为主键。
FOREIGN KEY:外键约束,定义本列为引用其他表的外键。
UNIQUE:唯一值约束,限制列取值不能重复。
DEFAULT:默认值约束,指定列约束,指定列的默认值。
CHECK:列取值范围约束,限制列的取值范围。
在上述约束中,除NOT NULL和DEFAULT只能定义在“列级完整性约束定义”处,其他约束均可在“列级完整性约束定义”和“表级完整性约束定义”处定义。
(1)主键约束。定义主键的语法格式为:
PRIMARY KEY[(<列名>[,……n])]
如果在列级完整性约束处定义单列的主键,则可省略方括号中的内容。
(2)外键约束。外键大多数情况下都是单列的,它可以定义在列完整性约束处,也可以定义在表级完整性约束处。定义外键的语法格式为:
[FOREIGN KEY(<列名>)]REFERENCES<外表名>(<外表列名>)
(3)唯一值约束。唯一值约束用于限制一个列的取值不重复,或者是多个列的组合取值不重复。这个约束用在事实上具有唯一性的属性列上,比如每个人的身份证号码、驾驶证号码等均不能有重复值。定义UNIQUE约束时注意如下事项:
有UNIQUE约束的列允许有一个空值。
在一个表中可以定义多个UNIQUE约束。
可以在一个列或多个列上定义UNIQUE约束。
在一个已有主键的表中使用UNIQUE约束定义非主键列取值不重复是很有用的,比如学生的身份证号码,“身份证号”列不是主键,但它的取值也不能重复,这种情况就必须使用UNIQUE约束。
定义唯一值约束的语法格式为:
UNIQUE[(<列名>[,……n])]
如果在列级完整性约束处定义单列的唯一值约束,则可省略方括号中的内容。
(4)默认值约束。默认值约束用DEFAULT约束来实现,它用于提供列的默认值,即当在表中插入数据时,如果没有为DEFAULT约束的列提供值,则系统自动使用DEFAULT约束定义的默认值。
一个默认值约束只能为一个列提供默认值,且默认值约束必须是列级约束。
默认值约束的定义有两种形式:一种是在定义表是指定默认值约束;另一种是在修改表结构时添加默认值约束。
①在创建表时定义DEFAULT约束:
DEFAULT常量表达式
②为已创建好的表添加DEFAULT约束:
DEFAULT常量表达式 FOR 列名
(5)列取值范围约束。限制列取值范围用CHECK约束实现,该约束用于限制列的取值在指定范围内,即约束列的取值符合应用语义。例如,人的性别只能是“男”或“女”,工资必须大于2000(假设最低工资为2000)。需要注意的是,CHECK所限制的列必须在同一个表中。
定义CHECK约束的语法格式为:
CHECK (逻辑表达式)
注意,如果CHECK约束是定义多列之间的取值约束,则只能在“表级完整性约束定义”处定义。
2.表的修改
在定义基本表之后,如果需求有变化,需要更改表的结构,可以使用ALTER TABLE语句实现。ALTER TABLE语句可以对表添加列、删除列、修改列的定义,也可以添加和删除约束。
ALTER TABLE语句的语法如下:
ALTER TABLE [<架构名>.]<表名>
{
ALTER COLUMN<列名><新数据类型>——修改列定义
|ADD <列名><数据类型>[约束]——添加新列
|DROP COLUMN<列名>——删除列
|ADD [constraint<约束名>]约束定义——添加约束
|DROP<约束名>——删除约束
}
3.表的删除
可以使用DROP TALBE语句删除表,其语法语句格式为:
DROP TABLE<表名>{,<表名>}
注意:删除表是必须先删除外键所在表,然后再删除被参数的主键所在表。创建表时必须先建立被参照的主键所在表,然后建立外键所在表。
4.4数据查询功能
查询功能是SQL语言的核心功能,是数据库中使用最多的操作,查询语句也是SQL语句中比较复杂的一个语句。
4.4.1学生数据库基本结构
学生数据库由3个表组成:Student、Course、SC,它们分别表示学生表、课程表和选课表。
4.4.2单表查询
查询语句(SELECT)是数据库操作中最基本和最重要的语句之一,其功能是从数据库中检索满足条件的数据。查询的数据源可以来自一张表,也可以来自多张甚至来自视图,查询的结果是由0行(没有满足条件的数据)或多行记录组成的一个记录集合,并允许选择一个或多个字段作为输出字段。SELECT语句还可以对查询的结果进行排序、汇总等。
查询语句的基本结构可描述为:
SELECT<目标列名序列>——需要哪些列
FROM<表名>[JOIN<表名>ON<连接条件>]——来自哪些表
[WHERE<行选择条件>]——根据什么条件
[GROUP BY<分组依据列>]
[HAVING<组选择条件>]
[ORDER BY<排序依据列>]
其中:
SELECT子句用于指定输出的字段。
FROM子句用于指定数据的来源。
WHERE子句用于指定数据的行选择条件。
GROUP BY 子句用于对检索到的记录进行分组。
HAVING子句用于只当对分组后结果的选择条件。
ORDER BY子句用于对查询的结果进行排序。
再这些子句中,SELECT子句和FROM子句是必须的,其他子句都是可选的。
1.选择表中若干列
选择表中若干列的操作类型于关系代数中的投影运算。
(1)查询指定的列。再很多情况下,用户可能只对表中的一部分属性列感兴趣,这是可通过SELECT子句的<目标列名序列>中指定要查询的列来实现。
(2)查询全部列。如果要查询表中的全部列,可以使用两种方法:一种是在<目标列名序列>中列出所有的列名;另一种是如果列的显示顺序与其在表中的定义的顺序相同,则可以简单地在<目标列名序列>中写星号“*”。
(3)查询表中没有的列。SELECT子句中的<目标列名序列>可以是表中存在的属性列,也可以是表达式、常量或者函数。
2.选择表中若干行
查询中除了可通过投影运算来选择若干列以外,也可通过选择运算来把用户感兴趣的行找出来,这时就需要在查询语句中添加WHERE子句。
(1)查询满足条件的元组。查询满足条件的元组的操作类似于关系代数中的选择运算,在SQL语句中是通过WHRERE子句实现的。
比较(比较运算符):=、>、>=、<、<=、<>、!=
确定范围:BETWEEN……AND、NOT BETWEEN……AND
确定集合:IN、NOT IN
字符匹配:LIKE、NOT LIKE
空值:IS NULL、IS NOT NULL
多重条件(逻辑谓词):AND、OR
①比较大小。比较大小的运算符有:=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、<>(不等于)、!=(不等于)
②确定范围。BETWEEN……AND和NOT BETWEEN……AND运算符可用于查找属性值在(或不在)指定范围内的元组,其中BETWEEN后边指定范围的下限,AND后边指定范围的上限。
BETWEEN……AND的语法格式为:
列名|表达式[NOT]BETWEEN 下限值AND上限值
BETWEEN……AND中列名或表达式的数据类型要于下限值或上限值的数据类型相同。
"BETWEEN下限值AND上限值"的含义是:如果列或表达式的值在下限值和上限值范围内(包括边界值),则结果为True,表明此记录符合查询条件。
“NOT BETWEEN下限值AND上限值”的含义是:如果列或表达式的值不在下限值和上限值范围内(不包括边界值),则结果为Ture,表明此记录符合查询条件。
③确定集合。IN运算符可用于查找属性值在指定集合范围内的元组。IN的语法格式为:
列名[NOT]IN(常量1,常量2,……,常量n)
IN运算符的含义为:当列中的值与集合中的某个常量值相等时,则结果为Ture,表明此记录为符合查询条件的记录。
NOT IN运算符的含义正好相反:当列中的值与集合中的某个常量值相等时,结果为False,表明此记录为不符合查询条件的记录。
④字符串匹配。LIKE运算符用于查找指定列中与匹配串常量匹配的元组。匹配串是一种特殊的字符串,其特殊之处在于它不仅可以包含普通字符,还可以包含通配符。通配符用于表示任意的字符或字符串。在实际应用中,如果需要从数据库中检索数据,但又不能给出准确的字符查询条件时,就可以使用LIKE运算符和通配符来实现模糊查询。在LIKE运算符前边也可以使用NOT,表示对结果取反。
LIKE运算符的一般语法格式为:
列名 [NOT]LIKE<匹配串>
匹配串中可以包含如下4种通配符:
-(下划线):匹配任意一个字符。
%(百分号):匹配0到多个字符。
[]:匹配[]中任意一个字符。如[acdg]表示匹配a、c、d和g中任何一个。若要比较的字符是连续的,则可以用连字符“-”表达,例如,若要匹配b、c、d、e中的任何一个字符,则可以表示为:[b-e]。
[^]:不匹配[]中的任意一个字符。如[^acdg]表示不匹配a、c、d和g。同样,若要比较的字符是连续的,也可以用连字符“-”表示,例如,若不匹配b、c、d、e中的全部字符,则可以表示为:[^b-e]。
如果要查找的字符串正好含有通配符,比如下划线或百分号,就需要使用一个特殊子句来告诉数据库管理系统这里的下划线或百分号是一个普通的字符,而不是一个通配符,这个特殊的子句就是ESCAPE。
ESCAPE的语法格式为:
ESCAPE转义字符
其中“转义字符”是任何一个有效的字符,在匹配串中也包含这个字符,表明位于该字符后面的那个字符将被视为普通字符,而不是通配符。
⑤涉及空值的查询。空值(NULL)在数据库中又特殊的含义,它表示当前不确定或未知的值。例如,学生选完课程之后,在没有考试之前,这些学生只有选课记录,而没有考试成绩,因此考试成绩就为空值。
由于空值是不确定的值,因此判断某个值是否为NULL,不能使用比较运算符,只能使用专门的判断NULL值的子句来完成。而且,NULL不能与确定的值进行比较。例如,下述查询条件:
WHRERE Grade<60
不会返回没有考试成绩(考试成绩为空值)的数据。
判断列取值是否为空的表达式:列名IS [NOT]NULL
⑥多重条件查询。当需要多个查询条件时,可以在WHERE子句中使用逻辑运算符AND和OR来组成多条件查询。
注意:OR运算符的优先级小于AND,要改变运算的顺序可以通过加括号的方式实现。
(2)消除取值相同的行。本来在数据库的关系表中并不存在取值全部相同的元组,但在进行了队列的选择后,就有可能在查询结果中出现取值完全相同的行。取值相同的行在结果中是没有意义的,因此应删除这些行。
3.对查询结果进行排序
有时,我们希望查询的结果能按一定的顺序显示出来,比如考试成绩从高到低排列学生考试情况。ORDER BY子句具有按用户指定的列对查询结果排序的功能,而且查询结果可以按一个列排序,也可以按多个列进行排序,排序可以是从小到大(升序),也可以是从大到小(降序)。排序子句的语法格式为:
ORDER BY<列名>[ASC|DESC][,……n]
其中<列名>为排序的依据列,可以是列名或列的别名。ASC表示按列值进行升序排序,DESC表示按列值进行降序排序。如果没有指定排序方式,默认的排序方式为ASC。
如果在ORDER BY子句中使用多个列进行排序,则这些列在盖兹矩中出现的顺序决定了对结果集进行排序的方式。当指定多个排序依据列时,系统首先安装排在第一位的列值进行排序,如果排序后存在两个或两个以上列值相同的记录,则对值相同的记录再依据排再二位的列值进行排序,以此类推。
4.使用聚合函数进行统计
(1)COUNT(*)
(2)COUNT([]DISTINCT<列名>)
(3)SUM(<列名>)
(4)AVG(<列名>)
(5)MAX(l<列名>)
(6)MIN(<列名>)
5.对数据进行分组
GROUP BY
HAVING
(1)使用GROUP BY子句
(2)使用WHERE子句
(3)使用HAVING子句
4.4.3多表连接查询
1.内连接
2.自连接
3.外连接
左外连接
右外连接
4.TOP的使用
4.4.4CASE表达式
1.CASE简述:CASE表达式是一种多分支的表达式。
4.4.5将查询结果保存到表中
4.4.6子查询
1.使用子查询进行基于集合的测试
2.使用子查询进行比较测试
3.带有ANY或ALL的子查询
4.带EXISTS谓词的子查询
4.4.7查询的集合运算:并、交、差
4.5视图
4.5.1视图的概述:基于SQL语句的姐u共集可视化的表。
4.5.2视图的定义及使用
(1)SELECT语句中通常不包含ORDER BY和DISTINCT子句。
4.5.3视图的修改与删除
1.修改视图
ALTER VIEW
2.删除视图
DROP VIEW
4.6数据更改功能
4.6.1数据插入
1.单行插入
2.多行插入
4.6.2数据更新
1.无条件更新
2.有条件更新
4.6.3数据删除
1.无条件删除
2.有条件删除
4.7数据控制功能
4.7.1授权
4.7.2回收授权
4.7.3拒收