1 数据库基础

1.1 数据库系统简介

1.1.1 定义

数据库系统(Database System)是由数据库和管理软件组成的系统,人们常把除人以外的数据库有关的硬件和软件系统称之为数据库系统。

1.1.2 阶段

数据库技术是应数据管理任务的需求而产生,随着计算机技术的发展,对数据管理技术也随之不断提出更高的要求,其先后经历的人工管理,文件系统,计算机系统3个阶段。

1.1.3 构成

数据库系统是采用数据库技术的计算机系统,是由数据库(数据)、数据库管理系统(软件)、数据库管理员(人员)、硬件平台(硬件)和软件平台(软件)这5部分构成的运算实体。

1.2 数据库的体系结构

1.2.1 结构

数据库领域公认的标准结构是三级模式结构。

1.2.2 定义

数据库系统的三级模式结构是指模式、外模式和内模式。

1.2.3 映射

为了能在内部实现数据库的三个抽象层次的联系和转换,数据库管理系统在三级模式之间提供了两种映射。一种是外模式/模式映射,一种是模式/内模式映射。
一个数据库可以有多个外模式,但只有一个内模式。

1.3 数据模型

1.3.1 定义

数据模型是数据库系统的核心和基础,是关于描述数据与数据之间的联系,数据的语义,数据一致性约束的概念性工具的集合。

1.3.2 组成

数据模型通常是由数据结构、数据操作和完整性约束3部分组成。

1.3.3 分类

1.3.3.1 层次模型

用树形结构来表示体系、类型及实体的数据模型。

1.3.3.2 网状模型

特点是比较复杂,独立性比较差。

1.3.3.3 关系模型

特点是比较简单,是目前主流的数据模型就是关系模型。包括关系、元祖、属性和域。

1.4 常见关系数据库

1.4.1 定义

关系数据库,是建立在关系数据库模型基础的数据库,通常集合代数等概念和方法来处理数据库中的数据库,这里主要介绍Access、SQL Server和Oracle数据库。

1.4.2 分类

Access数据库:其核心是Microsoft Jet数据库引擎。
SQL Server数据库:客户/服务器数据库平台。
Oracle数据库:是目前世界上使用最为广泛的关系型数据库(美国甲骨文提供)。

2 SQL Server 简介及安装

2.1 概貌

1996年微软公司推出了SQL Server 6.5版本,1998年推出了SQL Server 7.0版本,后续相继推出2000、2005、2008、2012、2016以及最新的2019版本。但是不建议使用2019,2020年主流的最新版本是SQL Server2016。

2.2 特性

SQL Server2012开始实现了一个为云做准备的信息平台。

2.3 特点

可信任的、高效的、智能的

3 SQL Server 启动

3.1 路径

开始—>控制面板—>系统和安全—>管理工具—>服务—>选中应用程序,右键启动
或是 开始—>找到应用程序—>配置管理器—>SQL Server服务—>SQL Server(名称)—>选中右键启动

3.2 登录

首次登录用户名固定,为sa(需要新建服务器时,可以定义新的用户名),密码即安装是设置的密码。

4 创建与管理数据库

4.1 认识数据库

4.1.1 定义

数据库(Data Base)是按照数据结构来组织,存储和管理数据的仓库,是存储在一起的相关数据的集合。

4.1.2 优点

  1. 减少数据的冗余度,节约数据的储存空间
  2. 具有较高的数据独立性和易扩展性
  3. 实现数据资源的充分共享

    4.2 SQL Server的命名规则

  4. 标识符的首字母必须是下列字符之一:统一码(Unicode)2.0标准中定义的所有字母、_、@、#

  5. 标识符的后续字符可以是以下几种:统一码(Unicode)2.0标准中定义的所有字母、$、_、@、#
  6. 标识符不允许是Transact-SQL的保留字。
  7. 不允嵌入空格或是其他特殊字符

    4.3 数据库的创建与管理

    4.4 使用T-SQL语句操作数据库

    5 操作数据表

    5.1 数据表基础知识

    5.1.1 数据类型

    基本数据类型按数据的表现方式和存储方式不同可以分为整数数据类型、货币数据类型、浮点数据类型、日期/时间数据类型、字符数据类型、二进制数据类型、图像和文字数据类型、DATA、DATETIME(2)等。

    5.2 数据表的创建与管理

    5.3 数据操作

    5.4 创建、删除和修改约束

    5.5 关系的创建与维护

    表与表之间的存在的关系分三种:一对一关系、一对多关系、多对多关系。

    5.6 使用企业管理器管理数据表

    6 SQL基础

    6.1 T-SQL概述

    6.1.1 定义

    T-SQL(Transact Structured Query Language)是标准的Microsoft SQL Server 的扩展。是标准的SQL程序设计语言的增强版,是用来让程序与SQL Server沟通者的主要语言。

    6.1.2 组成

  8. 数据定义语言:用于对数据库系统中对数据库、视图、表、索引等数据库对象进行创建和管理。

  9. 数据控制语言:用于实现对数据库中数据的完整性、安全性的控制。
  10. 数据操作语言:用于插入、修改、删除和查询数据库中的数据。

    6.1.3 语句结构

    SELECT 子句
    【INTO 子句】
    FROM 子句
    【WHERE 子句】
    【GROUP BY 子句】
    【HAVING 子句】
    【ORDER BY 子句】

    6.2 常量

    6.2.1 定义

    数据在内存中存储始终不变化的量叫常量。常量,也称为文字值或是标量值,是表示一个特定数据值的符号。常量的格式取决于它所表示的值的数据类型。

    6.2.2 分类

    常见的常量有数字常量、字符串常量、日期和时间常量和符号常量。

    6.3 变量

    6.3.1 定义

    数据在内存中存储可以变化的量叫常量。

    6.3.2 分类

    根据储存的数据作用范围不一致可以分为局部变量和全局变量(以@@开头)。局部变量是用户可以自己定义的变量,它的作用范围仅在程序内部。全局变量是SQL Server系统内部事先定义好的变量,任何程序均可随时调用。

    6.4 注释符、运算符与通配符

    6.4.1 定义

    注释语句不是可执行的语句,不参与程序的编译,通常是一些说明细性的文字,对代码的功能或者代码的实现方式给出简要的解释和提示。单行注释—、多行注释/……/
    运算符是一种符号,用来进行常量、变量或者列之间的数学运算和比较的操作,它是T-SQL语言很重要的部分。其类型有:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、连接运算符。
    在涉及模式匹配的字符串比较中使用%、_、【】、【^】等通配符。

    6.4.2 举例

    6.4.2.1 算术运算符

    DECLARE @X INT, @Y INT, @Z INT
    SELECT @X = 2, @Y = 5
    SET @Z = @X%@Y
    PRINT @Z—2

    6.4.2.2 逻辑运算符(优先级:NOT先、AND再、OR后)

    USE test
    SELECT info FROM person
    WHERE sex = ‘女’ AND age = ‘24’;—musician

    6.4.2.3 连接运算符

    DECLARE @name CHAR(20)
    SET @name = ‘冰河世纪’
    PRINT ‘我最爱的电影是 ‘ + @name;—我最爱的电影是 冰河世纪

    6.4.3 优先级

    运算符的优先级由高到低的顺序如下:

  11. +()正 - (负)~(位反)

  12. *(乘)/(除)%(取余)
  13. +(加)+(字符串串联运算符)-(减)
  14. =、<>、>、<、>=、<=(比较运算符)
  15. ^(按位异或)&(按位与)|(按位或)
  16. NOT、AND、OR(逻辑运算符)
  17. ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
  18. = (赋值运算符)

若表达式中含有相同优先级的运算符,则从左向右依次处理。还可以使用括号来提高运算的优先级,在括号中的表达式优先级最高。如果表达式有嵌套的括号,那么首先对嵌套最内层的表达式求值。
匹配指定范围内或者属于方括号所指定的集合中的任意单个字符。可以在涉及模式匹配的字符串比较(例如LIKE和PATINDEX)中使用这些通配符。在SQL中通常用LIKE关键字与通配符结合起来实现模糊查询。

6.5 流程控制

6.5.1 定义

流程控制语句是用来控制程序执行流程的语句。使用流程控制语句可以提供编程语句的处理能力。与程序设计语言(如C语言)一样,T-SQL语言提供的流程控制语句一样。

6.5.2 语句

6.5.2.1 BEGIN……END

DECLARE @X INT, @Y INT, @T INT
SET @X = 1
SET @Y = 2
BEGIN
SET @T = @X
SET @X = @Y
SET @Y = @T
END
PRINT @X
PRINT @Y;—2 1

6.5.2.2 WAITFOR

WAITFOR DELAY ‘00:00:03’
PRINT ‘祝你节日快乐!’;—3秒后显示 祝你节日快乐!
WAITFOR TIME ‘15:00:00’
PRINT ‘《整点会议》开始了!’;—15点整时显示《整点会议》开始了!

6.5.2.3 GOTO

DECLARE @X INT
SELECT @X = 1
LOVING:
PRINT @X
SELECT @X = @X + 1
WHILE @X <= 3 GOTO LOVING;—1 2 3

6.5.2.4 WHILE

—求1-10的和
DECLARE @N INT, @SUM INT
SET @N = 1
SET @SUM = 0
WHILE @N <= 10
BEGIN
SET @SUM = @SUM + @N
SET @N = @N + 1
END
PRINT @SUM;—55

6.5.2.5 IF……ELSE

DECLARE @X INT, @Y INT
SET @X = 8
SET @Y = -3
IF @X > 0
IF @Y > 0
PRINT ‘@X@Y位与第一象限’
ELSE
PRINT ‘@X@Y位与第四象限’
ELSE
IF @Y > 0
PRINT ‘@X@Y位与第二象限’
ELSE
PRINT ‘@X@Y位与第三象限’;—@X@Y位与第四象限

6.5.2.6 BREAK

6.5.2.7 RETURN

DECLARE @X INT
SET @X = 3
IF @X > 0
PRINT ‘遇到RETURN之前’
RETURN
PRINT ‘遇到RETURN之后’;—遇到RETURN之前

6.5.2.8 CONTINUE

—求1-10的偶数和
DECLARE @X INT, @SUM INT
SET @X = 1
SET @SUM = 0
WHILE @X < 10
BEGIN
SET @X = @X + 1
IF @X%2 = 0
SET @SUM = @SUM + @X
ELSE
CONTINUE
END
PRINT @SUM;—30

6.6 常用命令

6.6.1 作用

使用命令可以提高数据库的完整性和安全性。

6.6.2 命令

6.6.2.1 DBCC命令

用于验证数据库完整性,查找错误和分析系统使用情况等。

6.6.2.2 CHECKPOINT命令

用于检查当前工作的数据库中被更改过的数据页或日志页,并将这些数据从数据缓冲器中强制写入硬盘。

6.6.2.3 DECLAER命令

用于声明一个或多个局部变量、游标变量或表变量。

6.6.2.4 PRINT命令

向客户端返回一个用户自定义的信息,即显示一个字符串局部变量或全局变量的内容。

6.6.2.5 RAISERROR命令

用于在SQL Server系统中返回错误信息时同时返回用户指定的信息。

6.6.2.6 READTEXT命令

用户读取text、mtext或image列中的值,从指定的位置开始读取指定的字符数。

6.6.2.7 BACKUP命令

用于将数据库内容或器事务处理日志备份到存储介质上。

6.6.2.8 RESTORE命令

用来将数据库或其事务处理日志备份文件由存储介质还原到SQL Server系统中。

6.6.2.9 SELECT命令

除了有强大的查询功能外,还可用于给变量赋值。

6.6.2.10 SET命令

用于给局部变量赋值和用于执行SQL命令是SQL Server的处理选项设定。

6.6.2.11 SHUTDOWN命令

用于立即停止SQL Server的执行。

6.6.2.12 WRITETEXT命令

允许对数据类型为text、mtext或image的列进行交互式更新。

6.6.2.13 USE命令

用于在前工作区打开或是关闭数据库。

7 SQL函数的使用

7.1 聚合函数

7.1.1 定义

对一组值执行计算并返回单一的值。除 COUNT 以外,聚合函数忽略空值,如果COUNT函数的应用对象是一个确定列名,并且该列存在空值,此时COUNT仍会忽略空值。

7.1.2 类型

7.1.2.1 AVG

返回指定组中的平均值,空值被忽略。

7.1.2.2 COUNT

返回指定组中项目的数量。

7.1.2.3 MAX

返回指定数据的最大值。

7.1.2.4 MIN

返回指定数据的最小值。

7.1.2.5 SUM

返回指定数据的和,只能用于数字列,空值被忽略。

7.2 数学函数

7.2.1 定义

数学函数是对数据类型为整型(integer)、实型(real)、浮点型(float)、货币型(money)和smallmoney的列进行操作。ta3的返回值是6位小数,如果使用出错,则返回NULL值并显示提示信息,通常该函数可以用在SQL语句的表达式中。

7.2.2 类型

7.2.2.1 ABS

返回指定数字表达式的绝对值。

7.2.2.2 COS

返回指定的表达式中指定弧度的三角余弦值。

7.2.2.3 COT

返回指定的表达式中指定弧度的三角余切值。

7.2.2.4 PI

返回值为圆周率。
SELECT PI() AS “圆周率”;—3.14159265358979

7.2.2.5 POWER

将指定的表达式乘指定次方。
SELECT POWER(2,2) AS “2的平方”,POWER(3,3) AS “3的3次幂”;—4,27

7.2.2.6 PAND

返回0~1之间的随即float值。

7.2.2.7 ROUND

将数字表达式四舍五入为指定的长度或精度。
SELECT ROUND(123.9994,3),ROUND(123.9995,3);—123.9990,124.0000

7.2.2.8 SIGN

返回指定表达式的零(0)、正号(+1)或负号(-1)

7.2.2.9 SIN

返回指定的表达式中指定弧度的三角正弦值。

7.2.2.10 SQUARE

返回指定表达式的平方。
SELECT SQUARE(2) AS “2的平方”,SQUARE(3) AS “3的平方”;—4,9

7.2.2.11 SQRT

返回指定表达式中的平方根。

7.2.2.12 TAN

返回指定的表达式中指定弧度的三角正切值。

7.3 字符串函数

7.3.1 定义

字符串函数作用于CHAR、VARCHAR、BINARY和VARBINARY数据类型以及可以隐式转换为CHAR或VARCHAR的数据类型。

7.3.2 类型

7.3.2.1 ASCII

返回字符表达式最左端字符的ASCII代码值。

7.3.2.2 CHARINDEX

返回字符串中指定表达式的起始位置。

7.3.2.3 LEFT

从左边开始,取得字符串左边指定个数的字符。

7.3.2.4 LEN

返回指定字符串的字符(不是字节)的个数。

7.3.2.5 REPLACE

将指定的字符串替换为另一指定的字符串。

7.3.2.6 REVERSE

返回字符表达式的反转。

7.3.2.7 RIGHT

从右边开始,取得字符串右边指定个数的字符。

7.3.2.8 STR

返回有数字数据转换来的字符数据。

7.3.2.9 SUBSTRING

返回指定个数的字符。

7.4 日期和时间函数

7.4.1 定义

日期和时间函数主要用来操作datetime和smalldatetime类型的数据,日期和时间函数执行算术运行与其他函数一样,也可用在SQL语句的SELECT、WHERE子句以及表达式中使用。

7.4.2 类型

7.4.2.1 DATEADD

在向指定日期加上一段时间的基础上,返回新的DATETIME值。
SELECT GETDATE () AS “现在的时间”
SELECT DATEADD (“MONTH”,2,GETDATE () ) AS “一个月后的时间”;
—现在的时间2020-11-17 12:17:21.750 一个月后的时间2021-01-17 12:17:21.750

7.4.2.2 DATEDIFF

返回跨两个指定日期的日期和时间边界数。
SELECT DATEDIFF (YEAR,’2017-05-10’,’2020-11-17’) AS “年时间差”;—3

7.4.2.3 GETDATE

返回当前系统的日期和时间。
SELECT GETDATE() AS “当前时间”;—2020-11-17 12:00:09.567

7.4.2.4 DAY

返回指定日期中的天的整数。
SELECT DAY (GETDATE()) AS “DAY”;—17

7.4.2.5 MONTH

返回指定日期中的月份的整数。
SELECT MONTH (GETDATE()) AS “MONTH”;—11

7.4.2.6 YEAR

返回指定日期中的年份的整数。
SELECT YEAR (GETDATE()) AS “YEAR”;—2020

7.5 转换函数

7.5.1 定义

动遇到类型转换的问题时,可以使用SQL Server所提供的CAST和CONVERT函数。这两种函数不但可以将指定的数据类型转换为另一种数据类型,还可用来获得各种特殊的数据格式。COST和CONVERT函数都可以用于选择列表、WHERE子句和允许使用表达式的任何地方。

7.5.2 类型

7.5.2.1 隐性转换

SQL Server 自动处理某些数据类型的转换。例如,如果比较char和datetime表达式、smallint和int表达式、不同长度的char表达式,SQL Server可将它们自动转换,这种转换称为隐性转换,对这些转换不必使用CAST函数。

7.5.2.2 显示转换

显示转换是指CAST和CONVERT函数,CAST和CONVERT函数将数值从一种数据类型(局部变量、列或其他表达式)转换到另一种数据类型。
SELECT CAST ( ‘MINGRIKEJI’ AS NVARCHAR(6) ) AS “结果”;—MINGRI

7.6 元数据函数

7.6.1 定义

元数据函数描述了数据的结构和意义,主要用于返回数据库中的相应信息。

7.6.2 类型

7.6.2.1 COL_LENGTH

返回列的定义长度(以字节为单位)

7.6.2.2 COL_NAME

返回数据库列名,该列具有相应的表标识号和列标识号。

7.6.2.3 DB_NAME

返回数据库名称。

7.6.2.4 OBJECT_ID

返回数据库对象标识号。

8 SQL数据查询基础

8.1 Select检索数据

8.1.1 定义

查询是SQL语言的中心内容,而用于表示SQL查询的SELECT语句,是SQL语句中功能最强大也最复杂的语句。

8.1.2 子句

【WITH 】—公用表表达式(前一个语句必须以分号结尾)
SELECT select_list
【INTO new_table】
【FROM table_source】
【WHERE search_condition】
【GROUP BY group_by_expression】
【HAVING search_condition】
【ORDER BY order_expression[ASC | DESC]】

8.1.2.1 WITH子句事例

USE test;
WITH AgeReps (Age, AgeCount) AS
(
SELECT Age, COUNT(*)
FROM person
WHERE age IS NOT NULL
GROUP BY age
)
SELECT Age, AgeCount
FROM AgeReps;

8.1.2.2 ORDER BY子句事例

SELECT *
FROM person
ORDER BY sex
COMPUTE AVG (age);

8.2 UNION合并多个查询结果

表的合并操作将两个表的行合并到了一个表中,且不需要对这些行做任何更改。合并操作与联接相似,因为他们都是将两个表合并起来形成另一个表的方法。然而,他们合并方法有本质不同,合并是纵向,联接是横向。

9 SQL数据高级查询

9.1 子查询与嵌套查询

子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其他子查询中的查询。
任何允许使用表达式的地方都可以使用子查询。
嵌套查询是指将一个查询块嵌套在另一个查询块的WHERE子句或是HAVING短语的条件中的查询。
嵌套查询中上层的查询块称为外侧查询或父查询,下层查询块称为内层查询或子查询。

9.2 联接查询

联接查询是有一个笛卡尔积运算再加一个选取运算构成的查询。首先用笛卡尔乘积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只能把分别来自两个数据集合并且具有重叠部分的行合并在一起。联接的全部意义在于水平方向上合并两个数据集合,并产生一个新的结果集合。
联接天剑可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件。WHERE和HAVING子句还可以包含搜索条件,以进一步筛选根据联接条件选择的行。
联接可以分为以下几类:内部联接、外部联接、交叉联接。

9.3 使用CASE函数进行查询

CASE函数用于计算条件列表并返回多个可能结果表达式之一。
CASE 含税具有两种格式:
简单CASE函数将某个表达式与一组简单表达式进行比较以确定结果。
CASE搜索函数计算一组布尔表达式以确定结果。
两种格式都支持可选的ELSE参数。

10 视图的使用

10.1 视图概述

10.1.1 定义

视图是一种常用的数据库对象,它将查询的结果以虚表的形式存储在数据中。视图并不在数据库中已存储数据集的形式存在。视图的结构和内容是建立在对表的查询基础之上的,和表一样包括行和列,这些行和列都来源于其所引用的表,并且是在引用视图过程中动态生成的。
视图中的内容是有查询定义来的,并且视图和查询都是通过SQL语句定义的。

10.1.2 说明

  1. 存储:视图存储为数据库设计的一部分,而查询则不是。视图可以禁止所有用户访问数据库中的表,而要求用户只能通过视图操作数据。这种方法可以保护用户和应用程序不受某些数据库修改的影响,同样也可以保护数据表的安全性。
  2. 排序:可以排序任何查询的结果,但是只有当视图包括TOP子句时才能排序视图。
  3. 加密:可以加密视图,但是不能加密查询。

    10.1.3 分类

  4. 标准视图:保存在数据库中的SELECT查询语句。即通常意义上理解的视图。

  5. 索引视图:创建有索引的视图称为索引视图。它经过计算并存储又自己的数据,可以提高某些类型查询的性能,尤其适用于聚合许多行的查询,但不太适合于经查更新的基本数据集。
  6. 分区视图:是在一台或多台服务器间水平联结一组表中的分区数据,以使数据看上去来源于一个表。

    10.2 视图的操作

    10.2.1 创建视图

    CREATE VIEW VIEW_emp
    AS
    SELECT * FROM emp;

    10.2.2 绑定架构视图

    CREATE VIEW VIEW1
    WITH SCHEMABINDING
    AS
    SELECT empno, ename, job FROM dbo.emp;

    10.2.3 CHECK OPTION视图

    CREATE VIEW VIEW2
    WITH SCHEMABINDING
    AS
    SELECT empno, ename, job FROM dbo.emp
    WITH CHECK OPTION;

    10.2.4 重命名视图

    EXEC sp_rename ‘VIEW1’, ‘VIEW_1’;

    10.2.5 重命名视图列

    EXEC sp_rename ‘VIEW2.[ename]’, ‘姓名’, ‘COLUMN’;

    10.2.6 修改视图

    ALTER VIEW VIEW_1
    AS
    SELECT empno, ename, job, mgr FROM emp;

    10.2.7 删除视图

    DROP VIEW VIEW_1, VIEW2;

    10.3 视图数据操作

    10.3.1 查询:SELECT

    SELECT * FROM VIEW_emp;

    10.3.2 插入:INSERT INTO

    INSERT INTO VIEW_1 VALUES (‘7940’,’MANGO’,’MANAGER’,’7839’);

    10.3.3 修改:UPDATE

    UPDATE VIEW_1
    SET job = ‘MANAGER’, mgr = ‘7839’
    WHERE empno = ‘7654’;

    10.3.4 删除视图行:DELETE

    DELETE FROM VIEW_1 WHERE empno = ‘7654’;
    注意:删除视图行,对应的表行也会删除,所以谨慎操作。

    11 存储过程

    11.1 了解存储过程

    11.1.1 存储过程的概念

    存储过程(Stored Procedure)是预编译SQL语句的集合,这些语句存储在一个名称下并作为一个单元来处理。

    11.1.2 存储过程的说明

    存储过程代替了传统的逐条执行SQL语句的方式。一个存储过程中可包含查询、插入、删除、更新等操作的一系列SQL语句,当这个存储过程被调用执行时,这些操作也会同事执行。
    存储过程与其他编译语言中的过程类似。它可以接受输入参数并以输出参数的格式向调用过程或批处理返回多个值;包含用于在数据库中执行操作(包括调用其他过程)的编程语句;向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。

    11.1.3 存储过程的分类

  7. 系统存储过程:用来管理SQL Server和显示有关数据库和用户的信息的存储过程。

  8. 用户自定义存储过程:用户在SQL Server中通过采用SQL语句创建的存储过程。
  9. 扩展存储过程:通过编程语言(例如C)创建外部例程,并将这个例程在SQL Server中作为存储过程使用。

    11.1.4 存储过程的优点

  10. 存储过程可以嵌套使用,支持代码重用

  11. 存储过程可以接受与使用参数动态执行其中的SQL语句。
  12. 存储过程比一般的SQL语句执行速度快。存储过程在创建时已经被编译,每次执行时不需要重新编译。
  13. 存储过程具有安全特性(例如权限)和所有权链接,以及可以附加到它们的证书。用户可用被授予权限来执行存储过程而不必直接对存储过程中引用的对象具有权限。
  14. 存储过程允许模块化程序设计。存储过程一单创建,以后即可在程序中调用任意多次。这可以改进应用程序的可维护性,并允许应用程序统一访问数据库。
  15. 存储过程可以减少网络通信流量。一个需要数百行SQL语句代码的操作可以通过一条执行过程代码的语句来执行,而不需要在网络中发送数百行代码。
  16. 存储过程可以强制应用程序的安全性。参数化存储过程有助于保护应用程序不受SQL Injection攻击。

    11.2 创建存储过程

    11.2.1 创建存储过程方法

  17. 使用对象资源管理器创建存储过程

  18. 使用Transact-SQL语句创建存储过程

    11.2.2 T-SQL创建语法格式

    CREATE PROC [EDURE] procedure_name [:number]
    [{@parameter data_type}
    [VARYING] [= default] [OUTPUT]
    ] [……n]
    AS sql_statement

    11.2.3 事例:

    —不带参数的存储过程
    CREATE PROCEDURE proc_emp
    AS
    SELECT FROM emp;
    —带参数的存储过程
    CREATE PROCEDURE proc_emp_id
    @emp_id INT
    AS
    SELECT
    FROM emp WHERE empno = @emp_id;

    11.3 管理存储过程

    11.3.1 执行存储过程

    存储过程创建完成后,可以通过EXECUTE执行,可简写为EXEC。
    —执行没有参数的存储过程
    EXEC proc_emp;
    —执行有参数的存储过程
    EXEC proc_emp_id
    @emp_id = ‘7839’;

    11.3.2 查看存储过程

    可以使用sys.sql_modules、OBJECT_DEFINITION、sp_helptext查看存储过程的定义。

    11.3.3 修改存储过程

    使用ALTER PROCEDURE语句修改存储过程。改语句修改存储过程时不会更改权限,也不影响相关的存储过程或触发器。

    11.3.4 重命名存储过程

    使用sp_rename重命名存储过程。
    sp_rename ‘proc_emp’, ‘proc_emp1’;

    11.3.5 删除存储过程

    执行DROP PROCEDURE语句删除存储过程。
    DROP PROC proc_emp;

    12 触发器

    12.1.1 触发器的概念

    触发器是一种特殊类型的存储过程,当指定表中的数据发生变化时触发器自动生效。它与表紧密相连,可以看做事表定义的一部分。触发器不能通过名称被直接调用,更不允许设置参数。
    在SQL Server中一张表可以有多个触发器。用户可以根据INSERT、UPDATE、DELETE语句对触发器进行设置,也可以对一张表上的特定操作设置多个触发器。触发器可以包含复杂的T-SQL语句。不论触发器所进行的操作有多复杂,触发器都只作为一个独立的单元被执行,被看作一个事务。如果在执行触发器的过程中发生了错误,则整个事务将会自动回滚。

    12.1.2 触发器的种类

  19. DML触发器:当数据库中发生数据操作语言(DML)事件时将调用此触发器。

  20. DDL触发器:特殊触发器,在相应数据定义语言(DDL)语句时触发。可以用于在数据库中执行管理任务。
  21. 登录触发器:为相应LOGON事件而激发的储存过程。

    12.2 创建触发器

    12.3 管理触发器

    13 游标的使用

    13.1 游标的概述

    13.1.1 定义

    游标是提供这种机制的对结果集的一种扩展。

    13.1.2 顺序

  22. 声明游标。

  23. 打开游标。
  24. 从一个游标中查找信息。
  25. 关闭游标。
  26. 释放游标。

    13.1.3 类型

  27. 静态游标:总是按照游标打开时的原样显示结果集。在滚动期间很少或根本检测不到变化。虽然它在tempdb中存储了整个游标,但消耗的资源很少。

  28. 动态游标:与静态游标相对。当滚动游标时,反应结果集中所做的所有更改。结果集中的行数据值、顺序和成员在每次提取时都会改变。所有用户做的全部UPDATE、INSERT和DELETE语句均通过游标可见。
  29. 只进游标:不支持滚动,只支持游标从头到尾顺序提取。只在从数据库中提取出来后才能行检索。对所有由当前用户发出或其他用户提交、并影响结果集中的行的INSERT、UPDATE、DELETE语句,其效果在这些行从游标中提取时是可见的。
  30. 键集驱动的游标:打开游标时,键集驱动游标中的成员和行顺序是固定的。其由一套呗称为键集的唯一标识符(键)控制。键由以唯一方式在结果集中标识行的列构成。键集是游标打开时来自所有适合SELECT语句的行中的一系列键值。键集驱动游标的键集在游标打开时建立在tempdb中。对非键集列中的数据值所做的更改(有游标所有者或其他用户提交)在用户滚动游标时是可见的。在游标外对数据库所做的插入在游标内是不可见的,除非关闭并重新打开游标。

    13.2 游标的基本操作

    13.2.1 声明游标DECLARE

    USE scott
    DECLARE cursor_emp CURSOR FOR
    SELECT * FROM emp
    FOR READ ONLY —只读游标
    GO

    13.2.2 更新游标UPDATE

    USE scott
    DECLARE cursou_emp_1 CURSOR FOR
    SELECT empno, ename, job, sal FROM emp
    FOR UPDATE —更新游标
    GO

    13.2.3 打开游标OPEN

    DECLARE cursor_emp_2 CURSOR FOR —声明游标
    SELECT * FROM emp
    WHERE empno = ‘7839’
    OPEN cursor_emp_2 —打开游标
    GO

    13.2.4 读取游标中的数据FETCH

    DECLARE cursor_emp CURSOR FOR —声明游标
    SELECT * FROM emp
    OPEN cursor_emp —打开游标
    FETCH NEXT FROM cursor_emp —读取数据
    WHILE @@FETCH_STATUS = 0 —检查@@FETCH_STATUS,以确定是否可以继续取数
    BEGIN
    FETCH NEXT FROM cursor_emp
    END

    13.2.5 关闭游标CLOSE

    DECLARE CloseCursor CURSOR FOR —声明游标
    SELECT * FROM emp
    FOR READ ONLY
    OPEN CloseCursor —打开游标
    CLOSE CloseCursor —关闭游标

    13.2.6 释放游标DEALLOCATE

    DECLARE FreeCursor CURSOR FOR —声明游标
    SELECT * FROM emp
    OPEN FreeCursor —打开游标
    CLOSE FreeCursor —关闭游标
    DEALLOCATE FreeCursor —释放游标

    14 索引与数据完整性

    14.1 索引的概念

    同书中的索引一样,数据库中的索引可以快速找到表或索引视图中的特定信息。所以包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针。通过创建涉及良好的索引以支持查询,可以显著提高数据库查询和应用程序的性能。所以可以减少为返回查询结果集二必须读取的数据量。所以还可以强制表中的行具有唯一性,从而确保数据的完整性。

    14.2 索引的优缺点

    14.2.1 优点

  31. 创建唯一性索引,保证数据库表中的每一行数据的唯一性。

  32. 大大加快数据的检索速度,这也是创建索引的最主要原因。
  33. 加速表与表之间的连接,特别是在实现数据的参考完整性放吗特别有意义。
  34. 在使用分组和排序子句进行数据检索时,同样可以减少查询中分组和排序的时间。
  35. 通过使用索引,可以在查询的过程中使用优化隐蔽器,提高系统的性能。

    14.2.2 缺点

  36. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

  37. 索引需要占物理空间,处理数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引,那么需要的空间就会更大。
  38. 当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,降低了数据的维护速度。

    14.3 索引的分类

    14.3.1 按存储结构分类

  39. 聚集索引:根据数据行的键值在表或视图中排序和存储这些数据。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。

  40. 非聚集索引:具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含键值的数据行的指针。

    14.3.2 其他分类

    唯一性索引、包含性列索引、索引视图、全文索引、空间索引、筛选索引、XML索引。

    14.4 索引的操作

    14.4.1 索引的创建CREATE INDEX

    —创建不唯一的、非聚集索引
    USE test
    CREATE INDEX IX_dept_mum
    ON dept (dept_num);
    —创建维一的、聚集索引
    USE test
    CREATE UNIQUE CLUSTERED INDEX IX_fruits_id
    ON fruits (f_id);
    —创建组合索引
    USE test
    CREATE INDEX IX_person_id2
    ON person (id, name DESC);

    14.4.2 索引的查看

    —查询索引信息sp_helpindex
    USE test
    EXEC sp_helpindex fruits;
    —查询索引ID信息SYSINDEXES
    USE test
    SELECT ID, NAME FROM SYSINDEXES
    WHERE ID = (
    SELECT ID
    FROM SYSOBJECTS
    WHERE NAME = ‘fruits’
    );

    14.4.3 索引的修改

    USE test
    EXEC sp_rename ‘person.IX_person_id2’,’IX_person_id3’;
    说明:不要轻易修改索引名称,建议删除重新建索引。

    14.4.4 索引的删除

    USE test
    DROP INDEX person.IX_person_id3, fruits.IX_fruits_id;

    14.4.5 设置索引的选项

    USE test
    CREATE INDEX IX_emp1_name
    ON emp1 (name)
    WITH FILLFACTOR = 80
    GO

    14.5 索引的分析与维护

    14.5.1 使用SHOWPLAN语句

    显示查询语句的执行信息,包含查询过程中连接表时所采取的每个步骤以及选择哪个索引。语句如下:
    SET SHOWPLAN_ALL { ON | OFF }
    SET SHOWPLAN_TEXT { ON | OFF}

    14.5.2 使用STATISTICS IO语句

    STATISTICS IO语句表示使SQL Server显示有关由Transact-SQL语句生成的磁盘活动量的信息。语法如下:
    SET STATISTICS IO { ON | OFF }

    14.5.3 索引的维护

  41. 使用DBCC SHOWCONTIG语句,显示指定表的数据和索引的碎片信息。当对表进行大量的修改或添加数据后应该执行此语句来查看有无碎片。

  42. 使用DBCC DBREINDEX语句对指定数据库中的表重新生成一个或多个索引。
  43. 使用DBCC INDEXDEFRAG语句,指定表或视图的所有碎片整理。

    14.6 全文索引

    全文索引是一种特殊类型的基于标记的功能性索引,它是有Microsoft SQLServer全文引擎生成和维护的。生成全文索引的过程不同于生成其他类型的索引。全文引擎并非基于特定行中存储的值来构造B树结构,而是基于要编制索引的文本中的各个标记来生成刀片、堆积且压缩的所有结构。

    14.7 数据完整性

    14.7.1 定义

    数据完整性是SQL Server用于保证数据库中数据一致性的一种机制,防止非法数据存入数据库。

    14.7.2 体现

  44. 数据类型准确无误。

  45. 数据取值符合规定的范围。
  46. 多个数据表之间的数据不存在冲突。

    14.7.3 机制

  47. 域完整性:域是指数据表中的列(字段),域完整性是指列的完整性。它要求数据表中指定列的数据具有正确的数据类型、格式和有效的数据范围。

  48. 实体完整性:是指所有的记录都应该有一个唯一的标识,以确保数据表中数据的唯一性。
  49. 引用完整性:引用完整性又称参照完整性,是用来维护相关数据表中数据一致的手段。
  50. 用户定义完整性:用户定义完整性可以定义不属于其他任何完整性类别的特定业务规则。

    15 SQL中的事务

    15.1 事务的简介

    15.1.1 定义

    事务是由一系列语句构成的逻辑工作单元。
    事务和存储过程等批量处理又一定程度上的相识之处,通常都是为了完成一定业务逻辑而将一条或者多条语句“封装”起来,使他们与其他语句之间出现一个逻辑上的边界,并形成相对独立的一个工作单元。

    15.1.2 属性

    事务包含4种重要的属性:原子性(Atomic)、一致性(ConDemoltent)、隔离性(Isolated)、持久性(Durability)

    15.2 显式事务与隐式事务

    显示事务是用户自定义或用户指定的事务。可以通过BEGIN TRANSACTION、COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION 或ROLLBACK WORK事务处理语句定义显示事务。
    隐式事务需要使用SET IMPLICIT_TRANSACTIONS ON语句将隐式事务模式设置为打开。在打开了隐式事务的设置开关时,执行下一条语句时自动启动一个新事务,并且每关闭一个事务时,执行下一条语句又会启动一个新事务,知道关闭了隐式事务的设置开关。

    15.3 使用事务

    15.3.1 开始事务

    当一个数据库连接启动事务时,在该连接上执行的所有T-SQL语句都是事务的一部分,知道事务结束。开始事务使用BEGIN TRANSACTION语句。

    15.3.1 结束事务

    当一个事务执行完成之后,要将其结束,以便释放所占用的内存资源,结束事务使用COMMIT语句。

    15.3.1 回滚事务

    使用ROLLBACK TRANSACTION语句可以将显示 事务内的事务或隐式事务回滚到事务的起点或某个保存点。

    15.4 锁

    15.4.1 定义

    锁是一种机制,用于防止一个过程在对象上进行操作时,同某些已经在该对象上完成的事情发生冲突。
    锁可以防止事务的并发问题,如丢失更新、脏读(dirty read)、不可重复读和幻影(phantom)等问题。

    15.4.2 查看锁的信息

    SELECT * FROM sys.dm_tran_locks;

    15.5 分布式事务处理

    在事务处理中,涉及到一个以上数据库的事务被称为分布式事务。分布式事务跨越两个或多个称为资源管理器的服务器。如果分布式事务由Microsoft分布事务处理协调器(MS DTC)这类事务管理器或其他支持X/Open XA分布事务处理范围的事务管理器进行协调,则SQL Server可以作为资源管理器运行。

    16 维护SQL Server 2012

    16.1 脱机与联机数据库

    如果想暂时关闭某个数据库的服务,用户可以通过选择脱机的方式来实现。脱机后,在需要的时候可以对暂时关闭的数据库通过联机操作的方式重新启动服务。
    路径:选中要操作的数据库,右键—>任务—>脱机/联机

    16.2 分离和附加数据库

    分离和附加数据库,可以实现对数据库的复制。对于SQL Server数据库来说,分离和附加的数据库,在执行速度和实现数据库的复制功能上更加方便、快捷。
    分离数据库不是删除数据库,只是将数据库从服务器中分离出去。
    附加数据库它可以将分离的数据库重新附加到数据库中,也可以附加其他服务器组中分离的数据库。
    路径:选中要操作的数据库,右键—>任务—>分离/附加

    16.3 导入导出数据

    SQL Server 2008提供了强大的数据导入导出功能,它可以在多种常用数据格式(数据库、电子表格和文本文件)之间导入和导出数据,为不同数据源间的数据转换提供了方便。导入数据是从Microslft WQL Server的外部数据源中检索数据,然后将数据插入到SQL Server表的过程。
    导出数据是将SQL Server实例中的数据所取为某些用户指定格式的过程,如将SQL Server表的内容复制到Excel表格中。
    路径:选中要操作的数据库,右键—>任务—>导入数据/导出数据

    16.4 备份和恢复数据库

    备份和恢复数据库对于数据库管理员来说是保证数据库安全性的一项重要工作。SQL Server 2008提供了高性能的备份和恢复功能,它可以实现多种方式的数据库备份和恢复操作,避免了犹豫各种故障造成的损坏而丢失数据。
    使用备份可以在发生故障后还原数据。
    执行数据库备份的目的是便于进行数据恢复。如果发生机器错误、用户操作错误等,用户就可以对备份过的数据进行恢复。
    路径:选中要操作的数据库,右键—>任务—>备份/还原

    16.5 收缩数据库和文件

    由于SQL Server对数据库空间分配采用的是“先分配、后使用”的机制,所以数据库在使用过程中就可能会存在多余的空间,在一定程度上造成了存储空间的浪费。为此,SQL Server 2008提供了收缩数据库的功能,允许对数据库中的每个文件进行收缩,直至收缩到美元剩余的可用空间为止。
    路径:选中要操作的数据库,右键—>属性—>选项—>自动—>自动收缩(False/True)

    16.6 生成与执行SQL脚本

    脚本是存储在文件中的一系列SQL语句,是可再用的模块化代码。用户通过SQL Server Managerment Studio可用对指定文件中的脚本进行修改、分析和执行。
    生成脚本路径:选中要操作的数据库或表,右键—>编写数据库脚本为(S)—>CREATE(C)到—>文件—>定义名字
    执行SQL脚本路径:菜单栏文件—>打开—>文件—>选择打开的文件—>修改确定SQL代码—>分析—>执行

    17 数据库的安全机制

    17.1 数据库的安全概述

    SQL Server 2012提供了内置的安全性和数据保护,它可以根据用户的权限不同,来决定用户是否可以登录到当前的SQL Server数据库,以及可以对数据库实现哪些操作,在一定程度上避免了数据因使用不当或非法访问而造成泄漏和破坏。

    17.2 数据库的登录管理

    17.2.1 选择验证模式

    验证模式指数据库服务器如何处理用户名和密码。SQL Server 2008、2012的验证方式包括Windows验证模式与混合验证模式。用户可根据需要,选择验证模式。
    Windows验证模式:SQL Server 2008、2012使用Windows操作系统中的信息验证账户名和密码。这是默认的身份验证模式,比混合模式安全。Windows验证使用Kerberos安全协议,通过强密码的复杂性验证提供密码策略强制,提供账户锁定与密码过期功能。
    混合模式:允许用户使用Windows身份验证或SQL Server身份验证进行连接。通过Windows用户账户连接的用户可以使用Windows验证的受信任连接。

    17.2.2 管理登录账户

    在SQL: Server 2012中有两个登录账户:一类是登录服务器的登录名;另一类是使用数据库的用户账户。登录名是指能登录到SQL Server的账号,它属于服务器的层面,本身并不能让用户访问服务器中的数据库,而登录者要使用服务器中的数据库时,必须要有用户账号才能存取数据库。

    17.2.3 更改登录验证方式

17.2.4 设置密码

SQL Server 中的密码最多可包含128个字符,其中包括字母、符号和数字。由于Transact-SQL语句(以下简称SQL语句)中经查使用登录名、用户名、角色和密码,所以必须用英文双引号(”)或方括号([])分隔某些符号,例如,SQL Server登录名、用户、角色或密码中含有空格、以空格开头、以$或@字符开头等,都需要再Transact-SQL语句中使用分隔符。
SQL Server 2012 运行在Windows Server 2003或更高的操作环境时,可以使用Windows的密码机制。Windows Server 2008密码中使用的复杂性策略和过期策略可以应用于SQL Server内部。

  1. 密码复杂性策略

密码复杂性策略通过增加可用的密码数量来阻止强力攻击,实施该策略时,密码必须符合以下原则:

  1. 密码不得包含或“部分”用户登录名。部分账户名是指3个或3个以上两端用“空白”(空格、制表符、回车符等)或“-”、“_”、“#”等字符分隔的连接字母数字字符。
  2. 密码长度至少为6个字符。
  3. 密码包含英文大写字母(A-Z)、英文小写字母(a-z)、10个基本数字(0-9)、非字母数字(例如:!、$、#或是%)等4类字符中的3类。
    1. 密码过期策略

密码过期策略用于管理密码的使用期限。如果选中了密码过期策略,则系统将提醒用户更改旧密码和账户,并禁用过期的密码。

17.3 用户及权限管理

17.3.1 创建与删除数据库用户

登录名创建之后,用户只能通过该登录名访问整个SQL Server,而不是SQL Server中的某个数据库。若要是用户能够访问SQL Server当中的某个数据库,还需要给这个用户授予访问某个数据库的权限,也就是在所要访问的数据库中为该用户创建一个数据库用户账户。

17.3.2 设置服务器角色权限

bulkadmin 该角色可以运行BULK INSERT语句。该语句可将文本文件内的数据导入到Server 2012的数据库中
dbcreator 该角色可以创建、更改、删除和还原任何数据库
diskadmin 该角色可以管理磁盘文件
processadmin 该角色可以终止在数据库引擎事例中运行的进程
securityadmin 该角色可以管理登录名及其属性,还重置SQL Server登录名的密码
serveradmin 该角色可以更改服务器范围的配置选项和关闭服务器
setupadmin 该角色可以添加和删除链接服务器,并可以执行某些系统存储过程
sysadmin 该角色可以在数据库引擎中执行任何活动
public 公用角色,一般用户都会赋予的角色

18 “Visual C++” + ” SQL Server”实现图书管理系统

18.1 系统分析

18.1.1 需求分析

18.1.2 可行性分析

18.1.3 编写项目计划书

18.2 系统设计

18.2.1 系统目标

18.2.2 系统功能结构

18.2.3 业务流程图

18.3 数据库设计

18.3.1 数据库分析

18.3.2 创建数据库

18.3.3 创建数据表

18.4 创建工程

18.5 公共类设计

18.5.1 自绘菜单类CMyCoolMenu

18.5.2 自定义编辑框类CKeyEdit

18.5.3 自定义列表视图类CCustomGrid

18.6 启动界面的设计

18.7 登录对话框设计

18.8 主窗体设计

18.9 “基本信息管理”模块设计

18.10 “库存信息管理”模块设计

18.11 “查询管理”模块设计

18.12 图书管理系统