学习SQL Server这一篇就够了

2022-09-18 11:57:04 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

目录

  • 第一章 数据库概述
    • 1.1、数据库的好处
    • 1.2、数据库的常见概念
    • 1.3、数据库的存储特点
    • 1.4、数据库的常见分类
    • 1.5、SQL语言的分类
  • 第二章 SQL Server概述
    • 2.1、SQL Server的概述
    • 2.2、SQL Server的下载
    • 2.3、SQL Server的安装
    • 2.4、SQL Server的第一种连接
    • 2.5、SQL Server的第二种连接
    • 2.6、SQL Server的连接说明
  • 第三章 SQL Server数据
    • 3.1、创建数据库
      • 3.1.1、界面方式
      • 3.1.2、命令方式
    • 3.2、修改数据库
      • 3.2.1、界面方式
      • 3.2.2、命令方式
    • 3.3、删除数据库
      • 3.3.1、界面方式
      • 3.3.2、命令方式
  • 第四章 SQL Server数据的类型
    • 4.1、整数型
    • 4.2、精确数值型
    • 4.3、浮点型
    • 4.4、货币型
    • 4.5、位型
    • 4.6、字符型
    • 4.7、Unicode字符型
    • 4.8、文本型
    • 4.9、二进制型
    • 4.10、日期时间类型
    • 4.11、时间戳类型
    • 4.12、图像型
  • 第五章 SQL Server数据表管理
    • 5.1、新建数据表
    • 5.2、修改数据表
    • 5.3、删除数据表
  • 第六章 SQL Server表数据管理
    • 6.1、插入记录
    • 6.2、修改记录
    • 6.3、删除记录
  • 第七章 SQL Server表数据查询
    • 7.1、简单查询
    • 7.2、别名查询
    • 7.3、去重查询
    • 7.4、条件查询
    • 7.5、分组查询
    • 7.6、过滤查询
    • 7.7、排序查询
    • 7.8、多表查询
    • 7.9、子查询
    • 7.10、限制查询
  • 第八章 SQL Server高级语法
    • 8.1、索引
      • 8.1.1、索引概念
      • 8.1.2、索引语法
      • 8.1.3、索引练习
    • 8.2、视图
      • 8.2.1、视图概念
      • 8.2.2、视图语法
      • 8.2.3、视图练习
    • 8.3、T-SQL语言
      • 8.3.1、概念
      • 8.3.2、常量
      • 8.3.3、变量
      • 8.3.4、数据类型
      • 8.3.5、运算符与表达式
        • 8.3.5.1、运算符
        • 8.3.5.2、表达式
      • 8.3.6、流程控制语句
        • 8.3.6.1、语句块
        • 8.3.6.2、条件语句
        • 8.3.6.3、分支语句
        • 8.3.6.4、无条件转移语句
        • 8.3.6.5、循环语句
        • 8.3.6.6、continue语句
        • 8.3.6.7、break语句
        • 8.3.6.8、return语句
      • 8.3.7、系统内置函数
        • 8.3.7.1、数学函数
        • 8.3.7.2、字符串转换函数
        • 8.3.7.3、字符串处理函数
        • 8.3.7.4、数据类型转换函数
        • 8.3.7.5、日期时间函数
        • 8.3.7.6、元数据函数
      • 8.3.8、用户定义函数
        • 8.3.8.1、函数语法
        • 8.3.8.2、函数练习
    • 8.4、触发器
      • 8.4.1、触发器概念
      • 8.4.2、触发器语法
      • 8.4.3、触发器练习
    • 8.5、存储过程
      • 8.5.1、存储过程概念
      • 8.5.2、存储过程语法
      • 8.5.3、存储过程练习
  • 第九章 SQL Server备份与
    • 9.1、数据备份
    • 9.2、数据恢复


配套资料,免费下载 链接:https://pan.baidu.com/s/1Ffpvm45VRcuqQ1W2cqDN2A 提取码:xyqf 复制这段内容后打开百度网盘手机App,操作更方便哦

第一章 数据库概述

1.1、数据库的好处

  1. 将数据持久化到本地
  2. 提供结构化查询功能

1.2、数据库的常见概念

  1. DB:数据库,存储数据的仓库
  2. DBMS:数据库管理系统,又称为数据库软件或者数据库产品,用于创建和管理数据库,常见的有MySQL、Oracle、SQL Server
  3. DBS:数据库系统,数据库系统是一个通称,包括数据库、数据库管理系统、数据库管理人员等,是最大的范畴
  4. SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言

1.3、数据库的存储特点

  1. 数据存放到表中,然后表再放到库中
  2. 一个库中可以有多张表,每张表具有唯一的表名用来标识自己
  3. 表中有一个或多个列,列又称为“字段”,相当于Java中“属性”
  4. 表中的每一行数据,相当于Java中“对象”

1.4、数据库的常见分类

  1. 关系型数据库:MySQL、Oracle、DB2、SQL Server
  2. 非关系型数据库:
    • 键值存储数据库:Redis、Memcached、MemcacheDB
    • 列存储数据库:HBase、Cassandra
    • 面向文档的数据库:MongDB、CouchDB
    • 图形数据库:Neo4J

1.5、SQL语言的分类

  1. DQL:数据查询语言:select、from、where
  2. DCL:数据控制语言:grant、revoke
  3. DDL:数据定义语言:create、alter、drop、truncate
  4. DML:数据操作语言:insert、update、delete
  5. TCL:事务控制语言:commit、rollback

第二章 SQL Server概述

2.1、SQL Server的概述

SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的小型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。

Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。

SQL Server 是一个关系数据库管理系统。它最初是由Microsoft、Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2版本。在Windows NT 推出后,Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了,Microsoft 将SQL Server移植到Windows NT系统上,专注于开发推广SQL Server 的Windows NT 版本。Sybase 则较专注于SQL Server在UNⅨ操作系统上的应用。

2.2、SQL Server的下载

操作系统:Windows 10 专业版 64位(版本号,19041.508) 安装版本:sql server 2008 r2 enterprise

迅雷下载:

代码语言:javascript复制
ed2k://|file|cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso|4662884352|1DB025218B01B48C6B76D6D88630F541|/

右键解压:

2.3、SQL Server的安装

2.4、SQL Server的第一种连接

打开“开始菜单”,找到”SQL Server Management Studio”,点击启动。

2.5、SQL Server的第二种连接

注意:Navicat Premium配套资料有,全部默认下一步安装即可,如何激活也有说明。

2.6、SQL Server的连接说明

虽然我们提供了两种连接数据库的方式,但是我们这里推荐并采用第一种连接方式。

第三章 SQL Server数据库管理

3.1、创建数据库

3.1.1、界面方式

在”数据库“项,右键”新建数据库“,然后在弹出窗口中输入数据库名称”TEST0“,然后点击确定即可。

3.1.2、命令方式

使用命令行的方式创建一个名字为”TEST1“的数据库,同时需要明确指定TEST1的数据文件和日志文件所存储的路径和大小等信息。

代码语言:javascript复制
CREATE DATABASE TEST1
ON
(
	NAME='TEST1_DATA',
	FILENAME='C:UsersTEST1_DATA.MDF',
	SIZE=5MB,
	MAXSIZE=UNLIMITED,
	FILEGROWTH=10%
)
LOG ON
(
	NAME='TEST1_LOG',
	FILENAME='C:UsersTEST1_LOG.LDF',
	SIZE=5MB,
	MAXSIZE=50MB,
	FILEGROWTH=1MB	
)
GO

3.2、修改数据库

3.2.1、界面方式

在”TEST0“数据库右键找到”属性“项,在弹出窗口中选择”文件“项,就可以对数据库进行修改。

3.2.2、命令方式

使用“ALTER DATABASE”命令对数据库可进行以下修改:

  • 改变数据文件的大小和增长方式
  • 改变日志文件的大小和增长方式
  • 增加或删除数据文件
  • 增加或删除日志文件
  • 增加或删除文件组

语法格式:

代码语言:javascript复制
ALTER DATABASE database_name
{	ADD FILE <filespec>[,…n][ TO FILEGROUP filegroup_name ]	/*在文件组中增加数据文件*/
	| ADD LOG FILE <filespec>[,…n]           				/*增加日志文件*/
	| REMOVE FILE logical_file_name           				/*删除数据文件*/
	| ADD FILEGROUP filegroup_name          				/*增加文件组*/
	| REMOVE FILEGROUP filegroup_name      					/*删除文件组*/
	| MODIFY FILE <filespec>                 				/*更改文件属性*/
	| MODIFY NAME = new_dbname           					/*数据库更名*/
	| MODIFY FILEGROUP filegroup_name {filegroup_property | NAME = new_filegroup_name }
	| SET <optionspec> [ ,...n ] [ WITH <termination> ]   	/*设置数据库属性*/
	| COLLATE < collation_name > 							/*指定数据库排序规则*/
}
GO

演示前提:

假设已经创建了数据库TEST1,它只有一个主数据文件,其逻辑文件名为TEST1_DATA,大小为5MB,最大为50MB,增长方式为按10%增长。

案例演示1:

修改数据库TEST1现有数据文件的属性,将主数据文件的最大大小改为100MB,增长方式改为按每次5MB增长。

代码语言:javascript复制
ALTER DATABASE TEST1
	MODIFY FILE 
	(	
		NAME = TEST1_DATA,  --这里是逻辑名
		MAXSIZE = 100MB,	--将主数据文件的最大大小改为100MB
		FILEGROWTH = 5MB	--将主数据文件的增长方式改为按5MB增长 
	)
GO

案例演示2:

为数据库TEST1添加文件组FGROUP,并为此文件组添加两个大小均为10MB的数据文件。

代码语言:javascript复制
ALTER DATABASE TEST1
	ADD FILEGROUP FGROUP  --新增文件组的名字
GO

ALTER DATABASE TEST1
	ADD FILE
	(
		NAME = 'TEST1_DATA2',
		FILENAME = 'C:UsersTEST1_DATA2.ndf',
		SIZE = 10MB,
		MAXSIZE = 30MB,
		FILEGROWTH = 5MB
	),
	(	
		NAME = 'TEST1_DATA3',
		FILENAME = 'C:UsersTEST1_DATA3.ndf',
		SIZE = 10MB,
		MAXSIZE = 30MB,
		FILEGROWTH = 5MB
	)
	TO FILEGROUP FGROUP  --添加到指定文件组
GO

案例演示3:

从数据库中删除文件组,将案例2中添加到TEST1数据库中的文件组FGROUP删除。

代码语言:javascript复制
--先删除文件组中的文件
ALTER DATABASE TEST1
	REMOVE FILE TEST1_DATA2
GO
ALTER DATABASE TEST1
	REMOVE FILE TEST1_DATA3
GO

--再删除文件组
ALTER DATABASE TEST1
	REMOVE FILEGROUP FGROUP
GO

案例演示4:

为数据库TEST1添加一个日志文件。

代码语言:javascript复制
ALTER DATABASE TEST1
	ADD LOG FILE
	(	
		NAME = 'TEST1_LOG2',
		FILENAME = 'C:UsersTEST1_LOG2.ldf',
		SIZE = 5MB,
		MAXSIZE = 10MB,
		FILEGROWTH = 1MB
   )
GO

案例演示5:

从数据库TEST1中删除一个日志文件,将日志文件TEST1_LOG2删除。

代码语言:javascript复制
ALTER DATABASE TEST1
	REMOVE FILE TEST1_LOG2
GO

案例演示6:

将数据库TEST1的名改为JUST_TEST,进行此操作时必须保证该数据库不被其他任何用户使用。

代码语言:javascript复制
ALTER DATABASE TEST1
	MODIFY NAME = JUST_TEST
GO

3.3、删除数据库

3.3.1、界面方式

在要删除数据库上右键选择“删除”,在弹出窗口中选择确定即可删除当前数据库

3.3.2、命令方式

删除数据库使用“DROP DATABASE”命令。

语法格式:

代码语言:javascript复制
DROP DATABASE database_name[,…n][;]
GO

案例演示:

删除JUST_TEST数据库。

代码语言:javascript复制
DROP DATABASE JUST_TEST
GO

第四章 SQL Server数据的类型

4.1、整数型

整数包括bigint、int、smallint和tinyint,从标识符的含义就可以看出,它们所表示的数范围逐渐缩小。

  • bigint:大整数,数范围为-263(-9223372036854775808)~263-1(9223372036854775807),长度为8字节。
  • int:整数,数范围为-231(-2147483648)~231-1(2147483647),长度为4字节。
  • smallint:短整数,数范围为-215(-32768)~215-1(32767),长度为2字节。
  • tinyint:微短整数,数范围为 0~255,长度为1字节。

4.2、精确数值型

精确数值型包括decimal和numeric,他们可存储从-1038 1到1038-1的数字数据。

它们的存储长度随精度(位数)变化而变化,最少为5字节,最多为17字节:

  • 精度为1~9时,存储字节长度为5。
  • 精度为10~19时,存储字节长度为9。
  • 精度为20~28时,存储字节长度为13。
  • 精度为29~38时,存储字节长度为17。

例如,若有声明numeric(8,3),则存储该类型数据需5字节;而若有声明numeric(22,5),则存储该类型数据需13字节。

4.3、浮点型

浮点型包括real和float[(n)] 。两者通常都使用科学计数法表示数据,即形为:尾数E阶数,如5.6432E20、-2.98E10、1.287659E-9等。

  • real:使用4字节存储数据,表数范围为-3.40E 38~3.40E 38,数据精度为7位有效数字。
  • float[(n)] :表数范围为-1.79E 308~1.79E 308。定义中的n取值范围是1~53,用于指示其精度和存储大小。

n在1~24之间时,实际上是定义了一个real型数据,存储长度为4字节,精度为7位有效数字。当n在25~53之间时,存储长度为8字节,精度为15位有效数字。当缺省n时,代表n在25~53之间。

4.4、货币型

专门用于处理货币的数据类型:money和smallmoney,它们用十进制数表示货币值。

  • money:数据的数范围为-263(-922337203685477.5808)~263-1(922337203685477.5807),精度为19,小数位数为4,长度为8字节。
  • smallmoney:数据的数范围为-231(-214748.3648)~231-1(214748.3647),精度为10,小数位数为4,长度为4字节。

4.5、位型

位型只存储0和1,长度为一个字节。但要注意,SQL Server对表中bit类型列的存储做了优化:如果一个表中有不多于8个的bit列,这些列将作为一个字节存储;如果表中有9到16个bit列,这些列将作为两个字节存储;更多列的情况依次类推。

字符串值TRUE和FALSE可以转换为以下bit 值:TRUE转换为1,FALSE转换为0。

4.6、字符型

字符型用于存储字符串,在输入字符串时,需将串中的符号用单引号括起来,如‘abc’。

字符型包括两类:char是固定长度的数据类型,varchar是可变长度的数据类型,二者均使用ASCII字符集。

  • char[(n)]:定长字符数据类型,其中n在1到8000之间,缺省为1。当实际存储的串长度不足n时,则在串的尾部添加空格。
  • varchar[(n)]:变长字符数据类型,这里n表示的是字符串可达到的最大长度。

4.7、Unicode字符型

Unicode是“统一字符编码标准”,用于支持国际上非英语语种的字符数据的存储和处理,包括nchar[(n)]和nvarchar[(n)] 。

Unicode字符型包括两类:nchar是固定长度的数据类型,nvarchar是可变长度的数据类型,二者均使用UNICODE UCS-2字符集。

  • nchar[(n)]:n的值在1与4000之间,缺省为1,长度2n字节。若输入的字符串长度不足n,将以空白字符补足。
  • nvarchar[(n)]:nvarchar[(n)]为最多包含n个字符的可变长度Unicode字符型数据,n的值在1与4000之间,缺省为1。长度是所输入字符个数的两倍。

实际上,nchar、nvarchar与char、varchar的使用非常相似,只是字符集不同(前者使用Unicode字符集,后者使用ASCII字符集)。

4.8、文本型

文本型包括text和ntext两类,分别对应ASCII字符和Unicode字符。

  • text类型可以表示最大长度为 231-1(2147483647)个字符,其数据的存储长度为实际字符数个字节。
  • ntext类型可表示最大长度为 230-1(1073741823)个Unicode字符,其数据的存储长度是实际字符个数的两倍(以字节为单位)。

4.9、二进制型

二进制数据类型表示的是位数据流,包括binary(固定长度)和varbinary(可变长度)两种。

  • binary [(n)]:固定长度的n个字节二进制数据。n取值范围为1到8000,缺省为1。
  • varbinary [(n)]:n个字节变长二进制数据。n取值范围为1到8000,缺省为1。

4.10、日期时间类型

日期时间类型包括datetime和smalldatetime两类。

  • datetime:可表示的日期范围从1753 年1月1日到9999年12月31日的日期和时间数据。
    • 日期部分常用的表示格式如下:
    • 时间部分常用的表示格式如下:
  • smalldatetime:可表示从1900年1月1日到2079年6月6日的日期和时间,数据精确到分钟。

4.11、时间戳类型

每当对该表加入新行或修改已有行时,都由系统自动修改该列的值,将原来的时间戳值加上一个增量,最后增加或修改的列该值最大。

timestamp 列可反映系统对该记录修改的相对顺序。一个表只能有一个timestamp 列。timestamp类型数据的长度为8字节。

4.12、图像型

图像型是image,它用于存储图片、照片等。实际存储的是可变长度二进制数据,介于0与231-1(2147483647)字节之间。

在SQL Server 2005中该类型是为了向下兼容而保留的数据类型,微软推荐用户使用varbinary(MAX)数据类型来替代image类型。

第五章 SQL Server数据表管理

首先先创建一个数据库,名字叫”学生信息数据库“,以下操作均在该数据库中进行。

5.1、新建数据表

XSB(学生表)的表结构:

列 名

数 据 类 型

长度

可空

默认值

说 明

学号

定长字符型(char)

6

×

主键,2位年级,2位班号,2位序号

姓名

定长字符型(char)

8

×

性别

位型(bit)

1

1

1:男;0:女

出生时间

日期型(datetime)

系统默认

专业

定长字符型(char)

12

总学分

整数型(int)

4

0

0≤总学分<160

备注

变长字符型(varchar)

500

代码语言:javascript复制
CREATE TABLE XSB (
    学号 char(6) NOT NULL ,
    姓名 char(8) NOT NULL ,
    性别 bit NULL DEFAULT (1) ,
    出生时间 datetime NULL ,
    专业 char(12) NULL ,
    总学分 int NULL DEFAULT (0) CHECK (总学分>=0 AND 总学分<160) ,
    备注 varchar(500) NULL ,
    PRIMARY KEY (学号)
)
GO

KCB(课程表)的表结构:

列 名

数 据 类 型

长 度

可 空

默 认 值

说 明

课程号

定长字符型(char)

3

×

主键

课程名

定长字符型(char)

16

×

开课学期

整数型(tinyint)

1

1

只能为1~8

学时

整数型(tinyint)

1

0

学分

整数型(tinyint)

1

×

0

代码语言:javascript复制
CREATE TABLE KCB (
    课程号 char(3) NOT NULL ,
    课程名 char(16) NULL ,
    开课学期 tinyint NULL DEFAULT (1) CHECK (开课学期>=1 AND 开课学期<=8) ,
    学时 tinyint NULL DEFAULT (0) ,
    学分 tinyint NULL DEFAULT (0) ,
    PRIMARY KEY (课程号)
)
GO

CJB(成绩表)的表结构:

列 名

数 据 类 型

长 度

可 空

默 认 值

说 明

学号

定长字符型(char)

6

×

主键

课程号

定长字符型(char)

3

×

主键

成绩

整数型(int)

默认值

0

代码语言:javascript复制
CREATE TABLE CJB (
    学号 char(6) NOT NULL ,
    课程号 char(3) NOT NULL ,
    成绩 int NULL DEFAULT (0) ,
    PRIMARY KEY (学号, 课程号)
)
GO

5.2、修改数据表

添加一列:在XSB表中增加1个新列—奖学金等级,类型为tinyint,允许为null

代码语言:javascript复制
alter table XSB
	add 奖学金等级 tinyint NULL
GO

修改一列:修改XSB表中奖学金等级列的类型,类型为int,不允许为null

代码语言:javascript复制
alter table XSB
	alter column 奖学金等级 int NOT NULL
GO

删除一列:删除XSB表中奖学金等级这一个列

代码语言:javascript复制
alter table XSB
	drop column 奖学金等级
GO

5.3、删除数据表

删除XSB表:

代码语言:javascript复制
drop table XSB
GO

删除KSB表:

代码语言:javascript复制
drop table KCB
GO

删除CJB表:

代码语言:javascript复制
drop table CJB
GO

第六章 SQL Server表数据管理

首先先创建一个数据表,名字叫”XSB“,以下操作均在该数据表中进行。

6.1、插入记录

语法格式:

代码语言:javascript复制
insert into 表名(字段名,...) values(值,...);

需求描述:插入一条你自己的信息

代码语言:javascript复制
insert into XSB(学号,姓名,性别,出生时间,专业) values('180135','曹晨磊',1,'1997-12-05','计算机网络');

6.2、修改记录

语法格式:

代码语言:javascript复制
update 表名 set 列 = 值,... where 查询条件;

需求描述:修改你自己的信息的专业为”计算机软件“。

代码语言:javascript复制
update XSB set 专业='计算机软件' where 学号 = '180135';

6.3、删除记录

语法格式:

代码语言:javascript复制
delete from 表名 【where 筛选条件】;

需求描述:根据学号删除你自己的信息。

代码语言:javascript复制
delete from XSB where 学号 = '180135';

第七章 SQL Server表数据查询

首先先创建一个数据库,名字叫”学生信息数据库“,以下操作均在该数据库中进行,如果存在该数据库,请直接导入以下数据。

本章节需要导入测试数据:

代码语言:javascript复制
IF OBJECT_ID ('dbo.XSB') IS NOT NULL 
    DROP TABLE dbo.XSB; 
GO
CREATE TABLE XSB (
    学号 char(6) NOT NULL ,
    姓名 char(8) NOT NULL ,
    性别 bit NULL DEFAULT (1) ,
    出生时间 datetime NULL ,
    专业 char(12) NULL ,
    总学分 int NULL DEFAULT (0) CHECK (总学分>=0 AND 总学分<160) ,
    备注 varchar(500) NULL ,
    PRIMARY KEY (学号)
)
GO

IF OBJECT_ID ('dbo.KCB') IS NOT NULL 
    DROP TABLE dbo.KCB; 
GO
CREATE TABLE KCB (
    课程号 char(3) NOT NULL ,
    课程名 char(16) NOT NULL ,
    开课学期 tinyint NULL DEFAULT (1) CHECK (开课学期>=1 AND 开课学期<=8) ,
    学时 tinyint NULL DEFAULT (0) ,
    学分 tinyint NULL DEFAULT (0) ,
    PRIMARY KEY (课程号)
)
GO

IF OBJECT_ID ('dbo.CJB') IS NOT NULL 
    DROP TABLE dbo.CJB; 
GO
CREATE TABLE CJB (
    学号 char(6) NOT NULL ,
    课程号 char(3) NOT NULL ,
    成绩 int NULL DEFAULT (0) ,
    PRIMARY KEY (学号, 课程号)
)
GO

insert XSB values('081101','王林',1,'1990-2-10','计算机',50,null);
insert XSB values('081102','程明'  ,1,'1991-2-1'  ,'计算机',50,null);
insert XSB values('081103','王燕'  ,0,'1989-10-6' ,'计算机',50,null);	
insert XSB values('081104','韦严平',1,'1990-8-26' ,'计算机',50,null);	
insert XSB values('081106','李方方',1,'1990-11-20','计算机',50,null);
insert XSB values('081107','李明'  ,1,'1990-5-1'  ,'计算机',54,null);
insert XSB values('081108','林一帆',1,'1989-8-5'  ,'计算机',52,'提前休完,获得学分');
insert XSB values('081109','张强民',1,'1989-8-11' ,'计算机',50,'提前休完,获得学分');
insert XSB values('081110','张蔚'  ,0,'1991-7-22' ,'计算机',50,null);
insert XSB values('081111','赵琳'  ,0,'1990-3-18' ,'计算机',50,null);
insert XSB values('081113','严红'  ,0,'1989-8-11' ,'计算机',48,null);
insert XSB values('081201','王敏'  ,1,'1989-6-10' ,'通信工程',42,null);
insert XSB values('081202','王林'  ,1,'1989-1-29' ,'通信工程',40,null);
insert XSB values('081203','王玉民',1,'1990-3-26' ,'通信工程',42,null);
insert XSB values('081204','马琳琳',0,'1989-2-10' ,'通信工程',42,null);
insert XSB values('081206','李计'  ,1,'1989-9-20' ,'通信工程',42,'提前休完,获得学分');
insert XSB values('081210','李红庆',1,'1989-5-1'  ,'通信工程',44,'提前休完,获得学分');
insert XSB values('081216','孙祥欣',1,'1989-3-19' ,'通信工程',42,null);
insert XSB values('081218','孙研'  ,1,'1990-10-9' ,'通信工程',42,null);
insert XSB values('081220','吴薇华',0,'1990-3-18' ,'通信工程',42,null);
insert XSB values('081221','刘燕敏',0,'1989-11-12','通信工程',42,null);
insert XSB values('081241','罗林琳',0,'1990-1-30' ,'通信工程',50,null);

insert KCB values('101','计算机基础',1,80,5);
insert KCB values('102','程序设计与语言',2,68,4);
insert KCB values('206','离散数学',4,68,4);
insert KCB values('208','数据结构',5,68,4);
insert KCB values('210','计算机原理',5,85,5);
insert KCB values('209','操作系统',6,68,4);
insert KCB values('212','数据库原理',7,68,4);
insert KCB values('301','计算机网络',7,51,3);
insert KCB values('302','软件工程',7,51,3);

insert CJB values('081101','101',80);
insert CJB values('081101','102',78);
insert CJB values('081101','206',76);
insert CJB values('081103','101',62);
insert CJB values('081103','102',70);
insert CJB values('081103','206',81);
insert CJB values('081104','101',90);
insert CJB values('081104','102',84);
insert CJB values('081104','206',65);
insert CJB values('081102','102',78);
insert CJB values('081102','206',78);
insert CJB values('081106','101',65);
insert CJB values('081106','102',71);
insert CJB values('081106','206',80);
insert CJB values('081107','101',78);
insert CJB values('081107','102',80);
insert CJB values('081107','206',68);
insert CJB values('081108','101',85);
insert CJB values('081108','102',64);
insert CJB values('081108','206',87);
insert CJB values('081109','101',66);
insert CJB values('081109','102',83);
insert CJB values('081109','206',70);
insert CJB values('081110','101',95);
insert CJB values('081110','102',90);
insert CJB values('081110','206',89);
insert CJB values('081111','101',91);
insert CJB values('081111','102',70);
insert CJB values('081111','206',76);
insert CJB values('081113','101',63);
insert CJB values('081113','102',79);
insert CJB values('081113','206',60);
insert CJB values('081201','101',80);
insert CJB values('081202','101',65);
insert CJB values('081203','101',87);
insert CJB values('081204','101',91);
insert CJB values('081210','101',76);
insert CJB values('081216','101',81);
insert CJB values('081218','101',70);
insert CJB values('081220','101',82);
insert CJB values('081221','101',76);
insert CJB values('081241','101',90);

7.1、简单查询

语法格式:

代码语言:javascript复制
select 【*/字段名,...】 from 【表名/查询结果集】;

案例演示1:查询学生表所有学生信息

代码语言:javascript复制
select * from XSB;

案例演示2:查询学生表所有学生的学号和姓名

代码语言:javascript复制
select 学号,姓名 from XSB;

7.2、别名查询

语法格式:

代码语言:javascript复制
【格式一】:
select 字段名 as 别名 from 【表名/查询结果集】;

【格式二】:
select 字段名 别名 from 【表名/查询结果集】;

【格式三】:
select 别名=字段名 from 【表名/查询结果集】;

案例演示1:查询学生表所有学生的学号和姓名,要求姓名列显示为学生姓名

代码语言:javascript复制
select 学号,姓名 as 学生姓名 from XSB;

案例演示2:查询学生表所有学生的学号和姓名,要求姓名列显示为学生姓名

代码语言:javascript复制
select 学号,姓名 学生姓名 from XSB;

案例演示3:查询学生表所有学生的学号和姓名,要求姓名列显示为学生姓名

代码语言:javascript复制
select 学号,学生姓名=姓名 from XSB;

7.3、去重查询

语法格式:

代码语言:javascript复制
select distinct 字段名 from 【表名/查询结果集】;

案例演示1:查询XSB表中所有学生的专业,要求去重

代码语言:javascript复制
select distinct 专业  from XSB;

7.4、条件查询

语法格式:

代码语言:javascript复制
select 【*/字段名,...】 from 【表名/查询结果集】
where 查询条件;

常见运算符:

  • 条件运算符:>、>=、<、<=、=、<>(不等于)、!=(不等于)、!<(不小于)、!>(不大于)
  • 逻辑运算符:and、or、not
  • 模糊运算符:
    • like:%任意多个字符、_任意单个字符,如果有特殊字符,需要使用escape转义
    • between and
    • not between and
    • in
    • not in
    • is null
    • is not null

案例演示1;查询学号为“081103”的学生的信息

代码语言:javascript复制
select * from XSB where 学号 = '081103';

案例演示2:查询以“王”开头的学生的信息

代码语言:javascript复制
select * from XSB where 姓名 like '王%';

案例演示3:查询姓名的第三个字母是“民”的学生信息

代码语言:javascript复制
select * from XSB where 姓名 like '__民';

案例演示4;查询姓名的第三个字母是“民”或者“琳”的学生信息

代码语言:javascript复制
select * from XSB where 姓名 like '__民' or 姓名 like '__琳';

案例演示5:查询学生总学分小于45分的学生信息

代码语言:javascript复制
select * from XSB where 总学分 < 45;

案例演示6:查询学生总学分小于45分并且大于42分的学生信息

代码语言:javascript复制
select * from XSB where 总学分 > 42 and 总学分 < 45;

案例演示7:查询计算机专业学生总学分小于50分的学生信息

代码语言:javascript复制
select * from XSB where 专业 = '计算机' and 总学分 < 50;

案例演示8:查询“出生时间”在“1989-06-01”到“1990-01-01”之间的学生信息

代码语言:javascript复制
select * from XSB where 出生时间 between '1989-06-01' and '1990-01-01';

案例演示9:查询所有备注信息不为空的学生信息

代码语言:javascript复制
select * from XSB where 备注 is not null;

案例演示10:查询所有备注信息为空的学生信息

代码语言:javascript复制
select * from XSB where 备注 is null;

案例演示11:查询学号为“081101”、“081102”、“081103”这三位同学的信息,要求使用in

代码语言:javascript复制
select * from XSB where 学号 in ('081101','081102','081103');

案例演示12:查询学号不为“081101”、“081102”、“081103”这三位同学的信息,要求使用in

代码语言:javascript复制
select * from XSB where 学号 not in ('081101','081102','081103');

案例演示13:查询CJB表信息并使用CASE表达式对成绩按以下规则进行替换:若成绩大于等于90分,则替换为“优秀”;若成绩低于90分且大于等于70分,则替换为“良好”;若成绩低于70分且大于等于60分,则替换为“及格”;若成绩低于60分,则替换为“不及格”。列标题更改为“成绩等级”。

代码语言:javascript复制
select 学号,成绩等级=
case
	when 成绩 >= 90 then '优秀'
	when 成绩 >= 70 then '良好'
	when 成绩 >= 60 then '及格'
	else '不及格'
end
from CJB;

7.5、分组查询

语法格式:

代码语言:javascript复制
select 【*/字段名,...】 from 【表名/查询结果集】
【where 查询条件】
group by 分组条件;

案例演示1:按照学生专业对学生进行分组,查询分组后每个专业的名称

代码语言:javascript复制
select 专业 from XSB group by 专业;

案例演示2:按照学生专业对学生进行分组,查询分组后每个专业的名称以及所对应的学生人数

代码语言:javascript复制
select 专业,COUNT(*) as 学生人数 from XSB group by 专业;

案例演示3:按照课程号对课程进行分组,查询当前课程下所对应的学生人数

代码语言:javascript复制
select 课程号,COUNT(*) from CJB group by 课程号;

案例演示4:按照课程号对课程进行分组,查询当前课程下所对应的最高成绩

代码语言:javascript复制
select 课程号,MAX(成绩) from CJB group by 课程号;

案例演示5:按照课程号对课程进行分组,查询当前课程下所对应的最低成绩

代码语言:javascript复制
select 课程号,MIN(成绩) from CJB group by 课程号;

案例演示6:按照课程号对课程进行分组,查询当前课程下所对应的平均成绩

代码语言:javascript复制
select 课程号,AVG(成绩) from CJB group by 课程号;

7.6、过滤查询

语法格式:

代码语言:javascript复制
select 【*/字段名,...】 from 【表名/查询结果集】
【where 查询条件】
group by 分组条件
having 过滤条件;

案例演示1:按照课程号对课程进行分组,查询当前课程下所对应的平均成绩大于75分的课程号信息

代码语言:javascript复制
select 课程号,AVG(成绩) from CJB group by 课程号 having AVG(成绩) > 75;

7.7、排序查询

语法格式:

代码语言:javascript复制
select 【*/字段名,...】 from 【表名/查询结果集】
【where 查询条件】
【group by 分组条件】
【having 过滤条件】
order by 排序字段 asc|desc;

案例演示1:对课程号为“101”的课程所对应的学生成绩进行降序排序

代码语言:javascript复制
select * from CJB where 课程号 = '101' order by 成绩 desc;

7.8、多表查询

语法格式:

代码语言:javascript复制
select t1.*,t2.*,... from 表1 t1, 表2 t2, ...
where 连接条件
【and 查询条件】
【group by 分组条件】
【having 过滤条件】
【order by 排序字段 asc|desc】;

案例演示1:查询每一位学生选修课程的名称以及成绩,要求输出学生学号、姓名、课程名、成绩

代码语言:javascript复制
select x.学号,x.姓名,k.课程名,c.成绩 from XSB x,CJB c,KCB k
where x.学号 = c.学号 and c.课程号 = k.课程号;

案例演示2:查询学号为“081101”学生选修课程的名称以及成绩,要求输出学生学号、姓名、课程名、成绩

代码语言:javascript复制
select x.学号,x.姓名,k.课程名,c.成绩 from XSB x,CJB c,KCB k
where x.学号 = c.学号 and c.课程号 = k.课程号
and x.学号 = '081101';

案例演示3:查询学号为“081101”学生选修课程的名称以及成绩,要求输出学生学号、姓名、课程名、成绩,并且对成绩进行升序排序

代码语言:javascript复制
select x.学号,x.姓名,k.课程名,c.成绩 from XSB x,CJB c,KCB k
where x.学号 = c.学号 and c.课程号 = k.课程号
and x.学号 = '081101'
order by c.成绩 asc;

7.9、子查询

语法格式:

代码语言:javascript复制
select 【*/字段名,...】 from 【表名/查询结果集】
where 查询条件包含select子句

案例演示1:查找选修了离散数学的学生学号

代码语言:javascript复制
select 学号 from CJB
where 课程号 = (select 课程号 from KCB where 课程名 = '离散数学');

案例演示2:查找比所有计算机系的学生年龄都小的学生

代码语言:javascript复制
select * from XSB
where 出生时间 > (select MAX(出生时间) from XSB where 专业 = '计算机');

案例演示3:查找课程号206的成绩不低于课程号101的最低成绩的学生的学号

代码语言:javascript复制
select 学号 from CJB
where 课程号 = '206' and 成绩 !< (select MIN(成绩) from CJB where 课程号 = '101');

案例演示4:查找选修206号课程的学生姓名

代码语言:javascript复制
select 姓名 from XSB
where 学号 in (select 学号 from CJB where 课程号 = '206');

7.10、限制查询

语法格式:

代码语言:javascript复制
select top 获取前几条 【*/字段名,...】 from 【表名/查询结果集】
【where 查询条件】
【group by 分组条件】
【having 过滤条件】
【order by 排序字段 asc|desc】;

案例演示1:查询XSB表中前10条记录,输出所有列

代码语言:javascript复制
select top 10 * from XSB;

案例演示2:查询XSB表中第11-20条记录,输出所有列

代码语言:javascript复制
select top 10 * from XSB
where 学号 not in (select top 10 学号 from XSB);

第八章 SQL Server高级语法

8.1、索引

8.1.1、索引概念

索引是帮助SQL Server高效获取数据的一种有序的数据结。它有以下两种分类:

  • 聚簇索引 :聚簇索引的顺序就是数据的物理存储顺序。每个表只有一个聚簇索引,SQL Server 2005是按B树(BTREE)方式组织聚簇索引的,聚簇索引的叶节点就是数据节点,由于数据记录按聚簇索引键的次序存储,因此查找效率高。除非在创建主键时特别指定,否则创建主键时会自动创建聚簇索引。
  • 非聚簇索引 :非聚簇索引的索引顺序与数据物理顺序无关 。非聚簇索引也是按B树方式组织的,但非聚簇索引B树的叶节点不存放数据页信息,而是存放非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。一个表中可有多个非聚集索引,创建索引时,可指定是按升序还是降序。
8.1.2、索引语法

创建索引:

代码语言:javascript复制
create 【unique】 index 索引名称 on 表名(要创建索引的字段1,要创建索引的字段2,...);

重建索引:

代码语言:javascript复制
alter index 索引名称 on 表名 rebuild;

删除索引:

代码语言:javascript复制
drop index 表名.索引名称;
8.1.3、索引练习

创建索引:为KCB表的课程名列创建索引。

代码语言:javascript复制
create index I_KCM on KCB(课程名);

重建索引:

代码语言:javascript复制
alter index I_KCM on KCB rebuild;

删除索引:

代码语言:javascript复制
drop index KCB.I_KCM;

8.2、视图

8.2.1、视图概念

视图是一个虚拟表,其内容由查询定义。但视图并不存储数据,视图数据来自由定义视图的查询所引用的表。

使用视图有下列优点:

  • 简单性:如可屏蔽表连接等复杂操作。
  • 安全性:简化用户权限的管理,将用户限制在数据的不同子集上。
  • 逻辑数据独立性:基本表的改变只需改变视图,而无需修改应用程序。
8.2.2、视图语法

创建视图:

代码语言:javascript复制
create view 视图名称 as 查询语句;

调用视图:

代码语言:javascript复制
select * from 视图名称;

删除视图:

代码语言:javascript复制
drop view 视图名称;

修改视图:

代码语言:javascript复制
先删除、在创建
8.2.3、视图练习

创建视图:创建视图V_CJ,包括学生的学号、姓名、选修的课程名及成绩

代码语言:javascript复制
create view V_CJ AS
select x.学号,x.姓名,k.课程名,c.成绩 from XSB x,CJB c,KCB k
where x.学号 = c.学号 and c.课程号 = k.课程号;

调用视图:

代码语言:javascript复制
select * from V_CJ;

删除视图:

代码语言:javascript复制
drop view V_CJ;

8.3、T-SQL语言

8.3.1、概念

SQL语言的全名是结构化查询语言(Structured Query Language),1986年10月,美国ANSI对 SQL进行规范后,以此作为关系数据库管理系统的标准语言。不同的数据库管理系统对SQL规范做了某些编改和扩充。例如,微软公司的SQL Server支持的是T-SQL,而甲骨文公司的Oracle数据库所使用的SQL语言则是PL-SQL。T-SQL是SQL语言的一种版本,只能用于微软SQL Server以及Sybase Adaptive Server系列数据库。T-SQL除了提供标准的SQL命令之外,还提供了变量说明、流程控制、功能函数等。在SQL Server数据库中,T-SQL语言由DQL、DCL、DDL、 DML 及流控制语句组成。

8.3.2、常量

按类型分为:字符串常量、整型常量、实型常量、日期时间常量、货币常量、唯一标识常量等。

8.3.3、变量

SQL Server中变量可分为两类:全局变量,局部变量。

  • 全局变量 :全局变量由系统提供且预先声明,以“@@”开头。T-SQL全局变量作为函数引用。例如,@@ERROR返回执行的上一个T-SQL语句的错误号;@@CONNECTIONS返回自上次启动SQL Server以来连接或试图连接的次数。
  • 局部变量 :局部变量以@开头。例如,保存运算的中间结果,作为循环变量等。

局部变量的定义:

代码语言:javascript复制
declare { @变量名 数据类型 }[,...n]

局部变量的赋值:

代码语言:javascript复制
set语法格式:一个set语句只能给一个变量赋值
set @变量名=表达式
    
select语法格式:一个select语句可以给多个变量赋值
select { @变量名=表达式 }[,...n]

局部变量的演示1:创建局部变量@var1、@var2并赋值,然后输出变量的值。

代码语言:javascript复制
declare @var1 varchar(10) ,@var2 varchar(30);
set @var1='中国';
set @var2=@var1 '是一个伟大的国家';
select @var1, @var2;
代码语言:javascript复制
declare @var1 varchar(10) ,@var2 varchar(30);
select @var1='中国',@var2=@var1 '是一个伟大的国家';
select @var1, @var2;

局部变量的演示2:局部变量用于查询条件中。

代码语言:javascript复制
declare @sex bit;
set @sex=0;
select 学号,姓名 from XSB where 性别=@sex;
代码语言:javascript复制
declare @sex bit;
select @sex=0;
select 学号,姓名 from XSB where 性别=@sex;

局部变量的演示3:使用查询给局部变量赋值。

代码语言:javascript复制
declare @student char(8);
set @student=(select 姓名 from XSB where 学号= '081102');
select @student;
代码语言:javascript复制
declare @student char(8);
select @student=姓名 from XSB where 学号= '081102';
select @student;
8.3.4、数据类型

数据类型包括 系统数据类型用户自定义数据类型

  • 系统数据类型 :系统数据类型又称为基本数据类型,在第四章已介绍。
  • 用户自定义数据类型 :基于基本数据类型,可由其他表字段引用,在这里不重点介绍,了解即可。
8.3.5、运算符与表达式
8.3.5.1、运算符

算术运算符 : (加)、-(减)、*(乘)、/(除)、%(求模)。

位运算符 :执行位操作,两个表达式的类型可为整型或与整型兼容的数据类型(例如字符型等,但不能为image类型)。

比较运算符 :比较运算符又称关系运算符,其运算结果为逻辑值,可以为三种之一:TRUE、FALSE 及 UNKNOWN。

逻辑运算符 :逻辑运算符在SELECT语句的WHERE子句部分讲过,在此了解即可。

字符串联接运算符 :通过运算符“ ”实现两个字符串的联接运算。

代码语言:javascript复制
select (学号  ','   姓名) as 学号及姓名 from XSB where 学号= '081102';

一元运算符 : (正)、-(负)和~(按位取反)。

赋值运算符 :指SET和SELECT语句中使用的“=”。

8.3.5.2、表达式

表达式就是常量、变量、列名、运算符和函数的组合,一个表达式通常可以得到一个值。

8.3.6、流程控制语句

流程控制语句可以改变计算机的执行顺序。

SQL Server流程控制语句如下图:

8.3.6.1、语句块

语法格式:BEGIN…END可以嵌套使用。

代码语言:javascript复制
begin
	...
end

案例演示:查询XSB和KCB的信息。

代码语言:javascript复制
begin
	select * from XSB;
	select * from KCB;
end
8.3.6.2、条件语句

语法格式:用于条件判断。

代码语言:javascript复制
if 条件表达式
	一条SQL语句或者语句块
[else 
	一条SQL语句或者语句块]	

案例演示:如果1=1,则查询学生表,否则查询KCB。

代码语言:javascript复制
if 1=1
	select * from XSB;
else
	select * from KCB;
8.3.6.3、分支语句

语法格式:用于分支选择。

代码语言:javascript复制
#格式一:
case 表达式 
   when 表达式值 then 结果表达式1 
   [ ...n ] 
   [ else 结果表达式n 1 ] 
end 

#格式二:
case
   when 布尔表达式 then 结果表达式1 
   [ ...n ] 
   [ else 结果表达式n 1 ] 
end

案例演示:判断变量的数值来选择输出“男”还是“女”。

代码语言:javascript复制
#格式一:
declare @性别 bit =1;
select 性别=
case @性别
   when 1 then '男'
   when 0 then '女'
end;

#格式二:
declare @性别 bit =0;
select 性别=
case 
   when @性别=1 then '男'
   when @性别=0 then '女'
end;
8.3.6.4、无条件转移语句

语法格式:label是指向的语句标号,标号必须符合标识符规则。

代码语言:javascript复制
goto 标签名;

案例演示:跳过查询XSB直接查询KCB。

代码语言:javascript复制
goto KCBYJ;
select * from XSB;
KCBYJ: select * from KCB;
8.3.6.5、循环语句

语法格式:用于重复执行某个程序段。

代码语言:javascript复制
while 条件表达式
	一条SQL语句或者语句块

案例演示:将学号为”081102″的学生的总学分使用循环修改到大于等于60,每次只加2并判断循环了多少次。

代码语言:javascript复制
declare @num int =0;
while (select 总学分 from XSB where 学号 = '081102')<60
begin
	update XSB set 总学分=总学分 2 where 学号= '081102'
	set @num=@num 1
end;
select @num as 循环次数;
8.3.6.6、continue语句

语法格式:一般用在循环语句中,用于结束本次循环,重新转到下一次循环条件的判断。

代码语言:javascript复制
continue;
8.3.6.7、break语句

语法格式:一般用在循环语句中,用于退出本层循环。当程序中有多层循环嵌套时,使用break语句只能退出其所在的这一层循环。

代码语言:javascript复制
break;
8.3.6.8、return语句

语法格式:用于返回使用,可以返回一个表达式的值。

代码语言:javascript复制
return [表达式];
8.3.7、系统内置函数
8.3.7.1、数学函数

abs():求绝对值函数

代码语言:javascript复制
select ABS(-1);

pi():获取pi的值。

代码语言:javascript复制
select PI();

floor():向下取整。

代码语言:javascript复制
select FLOOR(3.14);

ceiling():向上取整。

代码语言:javascript复制
select CEILING(3.14);

round():按小数位数规定的精度四舍五入。

代码语言:javascript复制
select ROUND(3.1415,2);

rand():产生一个随机数,产生范围是0-1之间的一个小数。

代码语言:javascript复制
select RAND();

sqrt():开平方根。

代码语言:javascript复制
select sqrt(4);
8.3.7.2、字符串转换函数

lower():将字符串全部转为小写。

代码语言:javascript复制
select LOWER('Hello World');

upper():将字符串全部转为大写。

代码语言:javascript复制
select UPPER('Hello World');

str():把数值型数据转换为字符型数据。

代码语言:javascript复制
select STR(100);

char():将ASCII码转换为字符。输入0 ~ 255之间的ASCII 码值,否则返回NULL 。

代码语言:javascript复制
select CHAR(97);

ascii():返回字符表达式最左端字符的ASCII码值。

代码语言:javascript复制
select ASCII('a');
8.3.7.3、字符串处理函数

ltrim():去掉字符串左部空格。

代码语言:javascript复制
select LTRIM(' Hello ');

rtrim():去掉字符串右部空格。

代码语言:javascript复制
select RTRIM(' Hello ');

left():返回字符串左起的第n个字符。

代码语言:javascript复制
select LEFT('helloworld',3);

right():返回字符串右起的第n个字符。

代码语言:javascript复制
select RIGHT('helloworld',3);

substring():返回从字符串左边第i个字符起的n个字符的部分。

代码语言:javascript复制
select SUBSTRING('helloworld',2,3);
8.3.7.4、数据类型转换函数

常用的类型转换有:日期型→字符型、字符型→日期型、数值型→字符型、字符型→数值型等。

代码语言:javascript复制
CAST (表达式 AS 新类型)
CONVERT (新类型 ,表达式)

日期型→字符型:

代码语言:javascript复制
select CAST('1997-12-05' as varchar(30));
代码语言:javascript复制
select CONVERT(varchar(30),'1997-12-05');

字符型→日期型:

代码语言:javascript复制
select CAST('1997-12-05' as datetime);
代码语言:javascript复制
select CONVERT(datetime,'1997-12-05');

数值型→字符型:

代码语言:javascript复制
select CAST(1997 as varchar(30));
代码语言:javascript复制
select CONVERT(varchar(30),1997);

字符型→数值型:

代码语言:javascript复制
select CAST('1997' as int);
代码语言:javascript复制
select CONVERT(int,'1997');
8.3.7.5、日期时间函数

getdate():返回当前系统日期和时间,返回值类型为datetime。

代码语言:javascript复制
select GETDATE();

year():返回指定日期的年部分,返回值为整数。

代码语言:javascript复制
select YEAR(GETDATE());

month():返回指定日期的月部分,返回值为整数。

代码语言:javascript复制
select MONTH(GETDATE());

day():返回指定日期的天部分,返回值为整数。

代码语言:javascript复制
select DAY(GETDATE());

dateiff():返回两个指定日期在datepart(年、月、日)方面date2超过date1的差距值,其结果值是一个带有正负号的整数值。

代码语言:javascript复制
select DATEDIFF(DAY,'2020-01-01','2020-01-10');
select DATEDIFF(MONTH,'2019-01-01','2020-01-01');
select DATEDIFF(YEAR,'2019-01-01','2020-01-01');
8.3.7.6、元数据函数

db_id():根据数据库名,返回数据库标识(ID)号。

代码语言:javascript复制
select DB_ID('学生信息数据库');

db_name():根据数据库ID,返回数据库名。

代码语言:javascript复制
select DB_NAME(DB_ID('学生信息数据库'));

object_id():返回数据库中对象的ID号 ,返回值类型为smallint。

代码语言:javascript复制
select OBJECT_ID('XSB');
8.3.8、用户定义函数
8.3.8.1、函数语法

创建函数:

代码语言:javascript复制
create function 函数名称 ( [@参数名 参数类型 [=默认值]],... )
returns 返回值类型
as
begin
	函数体
	return 表达式;
end;

调用函数:

代码语言:javascript复制
select dbo.函数名(实参1,实参2,...,实参n);

删除函数:

代码语言:javascript复制
drop function 函数名称;

修改函数:

代码语言:javascript复制
先删除、在创建
8.3.8.2、函数练习

创建函数:给定学生学号,求该学生所选课程的平均成绩。

代码语言:javascript复制
create function F_GET_AVG (@学号 char(6)) returns int
as
begin
	declare @avg int;
	select @avg=(select AVG(成绩) from CJB where 学号=@学号);
	return @avg;
end;

调用函数:

代码语言:javascript复制
select dbo.F_GET_AVG('081102');

删除函数:

代码语言:javascript复制
drop function F_GET_AVG;

8.4、触发器

8.4.1、触发器概念

SQL Server触发器分为DML触发器和DDL触发器这两种。

  • DML触发器,执行INSERT、 DELETE 、UPDATE语句时触发。DML触发器可以实现数据的完整性、多个表间数据的一致性等。比如,实现外键的功能,当向CJB中插入记录时,保证学号是XSB表中已存在的;再如,可通过对XSB表定义DELETE触发器,实现在XSB表中删除一个学生时,同时删除CJB表中所有该学生的记录。
  • DDL触发器,只由T-SQL语句触发。是SQL Server 2005新增的功能,也是由相应的事件触发,但DDL触发器在执行CREATE、ALTER、DROP等语句时触发。

在触发器中可以使用两个特殊的虚拟表inserted和deleted:

  • inserted表存放新增的记录
  • deleted表存放被删除的记录

Update操作时:新的记录存入inserted表,旧的记录存入deleted表。

8.4.2、触发器语法

创建触发器:

代码语言:javascript复制
##创建DML触发器(掌握)
create trigger 触发器名 on 表名/视图名
{ for | after | instead of }
{ insert [,] | update [,] | delete }
as
begin
	触发器需要执行的逻辑
end;

##创建DDL触发器(了解)
create trigger 触发器名 on 数据库作用域/服务器作用域
{ for | after }
{ 事件类型 }
as
begin
	触发器需要执行的逻辑
end;
事件类型:CREATE_对象类型、DROP_对象类型、ALTER_对象类型 
对象类型:DATABASE、TABLE、VIEW等

删除触发器:

代码语言:javascript复制
##删除DML触发器
drop trigger 触发器名称;

##删除DDL触发器
drop trigger 触发器名称 on 数据库作用域/服务器作用域;

修改触发器:

代码语言:javascript复制
先删除、在创建
8.4.3、触发器练习

创建DML触发器:当删除XSB表中的一条学生记录时将CJB表中该学生的相应记录也删除

代码语言:javascript复制
create trigger T_XSB_DELETE on XSB 
after 
delete
as 
begin
	delete from CJB where 学号 in (select 学号 from deleted)
end;

触发DML触发器:

代码语言:javascript复制
delete from XSB where 学号 = '081101';

select * from XSB where 学号 = '081101';
select * from CJB where 学号 = '081101';

删除DML触发器:

代码语言:javascript复制
drop trigger T_XSB_DELETE;

8.5、存储过程

8.5.1、存储过程概念

存储过程(Stored Procedure)是一组完成特定功能的SQL语句集,经编译后存储在数据库中。

使用存储过程的优点如下:

  1. 在数据库服务器中只有首次对存储过程中的命令进行编译,以后直接调用无需编译,加快执行速度。
  2. 存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量sql语句的代码流量。
  3. 维护性高,更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。
  4. 自动完成需要预先执行的任务(存储过程可以在SQL Server启动时自动执行)。

常见存储过程的主要分类:

  1. 系统存储过程。系统预定义的存储过程,可以在任何一个数据库中作为命令执行,系统存储过程定义在系统数据库master中,其前缀是“sp_”。例如,sp_help —-显示系统对象信息。
  2. 扩展存储过程。是指在SQL Server环境之外,使用编程语言(例如C 语言)创建的外部例程形成的动态链接库(DLL)。例如,EXEC xp_cmdshell ‘dir c:’ —-显示目录信息。
  3. 用户存储过程。可以使用T-SQL语言编写,也可以使用CLR方式编写。本教程中常说的存储过程一般是指用T-SQL语言编写的存储过程,而使用CLR方式编写的存储过程称为CLR存储过程。CLR存储过程就是使用Microsoft Visual Studio 2005环境下的语言作为脚本编写的、可以对Microsoft .NET Framework公共语言运行时(CLR)方法进行引用的存储过程。
8.5.2、存储过程语法

创建存储过程:

代码语言:javascript复制
create procedure 存储过程名称 [ { @参数名 数据类型 [varying][=default][ouput] },... ]
as
begin
	存储过程需要执行的逻辑
end;

参数解读:
=default:表示为该参数设定的默认值,定义默认值后,不必指定该参数的值即可执行过程。
ouput:表示该参数是输出值。
varying ouput:表示该参数是游标参数。

注意:存储过程中不能包含一些特殊语句,如:创建及修改视图、创建及修改函数、创建及修改触发器、创建及修改存储过程、创建DEFAULT、创建SCHEMA、USE 数据库等。

调用存储过程:

代码语言:javascript复制
execute 存储过程名称 { [@参数=]{常量|@变量 [output]|[default]},... };

删除存储过程:

代码语言:javascript复制
drop procedure 存储过程名称;

修改存储过程:

代码语言:javascript复制
先删除、在创建
8.5.3、存储过程练习

创建存储过程:计算指定学号的学生所选课程的平均成绩,要求输入参数为学号,输出参数为平均成绩

代码语言:javascript复制
create procedure P_GET_AVG @num char(6), @avgScore float OUTPUT
AS
begin
	select avg(成绩) from CJB group by 学号 having 学号=@num
end;

调用存储过程:

代码语言:javascript复制
declare @avg float;
execute P_GET_AVG @num='081102',@avgScore=@avg OUTPUT;

或者

declare @avg float;
execute P_GET_AVG '081102',@avg;

删除存储过程:

代码语言:javascript复制
drop procedure P_GET_AVG;

第九章 SQL Server备份与恢复

9.1、数据备份

语法格式:

代码语言:javascript复制
USE master
GO
EXEC sp_addumpdevice 'disk',				   --磁盘
     '逻辑名称',								--逻辑名
     '备份地址'									--物理名
backup database 数据库名称 to 逻辑名称  		     --备份

案例演示:

代码语言:javascript复制
USE master
GO
EXEC sp_addumpdevice 'disk',				  --磁盘
     'mybackupfile',						  --逻辑名
     'D:mybackupfile.bak'					  --物理名
backup database 学生信息数据库 to mybackupfile  --备份

9.2、数据恢复

语法格式:

代码语言:javascript复制
restore database 数据库名称 from 逻辑名称 with file=1, REPLACE

案例演示:

注意:只有数据库被删除后并且在删除前进行了完全备份,才能使用下边这条命令恢复。

代码语言:javascript复制
restore database 学生信息数据库 from mybackupfile with file=1, REPLACE

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/164634.html原文链接:https://javaforall.cn

0 人点赞