SQL Server 0基础入门&操作手册

  • SQL SERVER 进阶: T-SQL 零基础入门指南

一. SQL 简介

1.1 主要特性

  • 高性能设计,可充分利用WindowsNT的优势
  • 系统管理先进,支持Windows图形化管理工具,支持本地和远程的系统管理和配置
  • 强壮的事务处理功能,采用各种方法保证数据的完整性
  • 支持对称多处理结构、存储过程、ODBC,并具有自主的SQL语言。SQL SERVER以其内置的数据复制功能、强大的管理工具、与Internet的紧密集成和开放的系统结构为广大的用户、开发人员和系统集成商提供了一个出众的数据库平台。

1.2 发展来源

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

1.3 语言运用

  • SQL 语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle,Sysbase,Microsoft SQL Server,Access都采用了SQL语言标准。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select,Insert,Update,Delete,Create,以及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。

1.4 版本介绍

  • SQL Server 2000
  • SQL Server 2005
  • SQL Server 2008
  • SQL Server 2012
  • SQL Server 2014

涉及到了内存技术的改进(性能得到了提升,官方说提升了30倍的计算能力)和云整合(与其他的进行整合)

1.5 SQL Server 的安装

  • 具体的SQL Server可以参考一些安装教程;
  1. 安装图示:
  2. sql server 2019 创建实例 sqlserver如何新建实例_sql server

  3. 点击全新 SQL Server 独立安装或向现有安装添加功能
  4. 一直点击下一步,在安装类型中选择执行SQL Server 的全新安装
  5. 产品密钥中选择合适的类型:
  6. sql server 2019 创建实例 sqlserver如何新建实例_SQL_02

  7. 许可条款选择同意,然后一直下一步
  8. 在设置角色中选择具有默认值的所有功能,然后一直下一步:
  9. sql server 2019 创建实例 sqlserver如何新建实例_SQL_03

  10. 配置实例信息,可以使用默认的,然后点击下一步;
  11. 服务器配置可以使用默认的,不做更改,然后下一步
  12. 数据库引擎配置:
  1. 如果是Windows身份认证的话,可以直接用windows信息进入
  2. 如果选择混合模式的话则需要输入账号密码,在教程中我们选择这种方案,如图所示:
  1. Reporting Services 数据和报表,我们选择安装和配置然后点击下一步即可。
  2. 最后点击安装即可安装成功
  • 登录:
  • 连接本地,使用计算机别名,然后选择数据库引擎,然后使用Windows身份验证,如图所示:
  • 如果是连接别的服务器的数据库,则需要选择身份验证,输入账号密码,当然服务器地址也要换成别的服务器的。

二. SQL Server 对数据库的操作

2.1 数据库创建

  • 使用菜单进行创建:
  • 在"对象资源管理器"中,连接到SQL Server数据库引擎的实例,然后展开该实例。
  • 右键单击“数据库”,然后单击“新建数据库”
  • 在“新建数据库”中,输入数据库名称
  • 若要通过接受所有默认值创建数据库,请单击“确定”;否则,请继续后面的可选步骤。
  • 如图所示:
  • 使用sql语句进行创建:
  • 范式如下:
  • 实战如图所示:

2.2 数据库的修改操作

  • 图形界面操作方法:
  1. 展开“数据库”,右键单击要修改的数据库,再单击“属性”。
  2. 更改数据库属性。
  3. 确认选择了正确的数据库,然后单击“确定”。
  • SQL语句进行修改:
  • sql server 2019 创建实例 sqlserver如何新建实例_数据库_04

2.3 数据库的删除操作

  • 图形界面操作方法:
  1. 在“对象资源管理器”中,连接到SQL Server 数据库引擎的实例,然后展开该实例。
  2. 展开“数据库”,右键单击要删除的数据库,再单击“删除”。
  3. 确认选择了正确数据库,然后单击“确定”。
  • SQL 的删除方法:
  • 删除一张表:
DROP DATABASE 表名
  • 删除多张表:
DROP DATABASE 表名1,表名2...

以逗号隔开,列举要删除的多个表名

删除数据库的时候,我们需要先右键任务分离以达到脱机状态,然后就可以进行删除操作了。

2.4 数据库备份与还原

  • 概述:
  • SQL Server 备份和还原组件为保护存储在SQL Server数据库中的关键数据提供了基本安全保障。为了最大限度地降低灾难性数据丢失的风险,您需要定期备份数据库以保留对数据所做的修改。规划良好的备份和还原策略有助于防止数据库因各种故障而造成数据丢失。通过还原一组备份,然后恢复数据库来测试您的策略,以便为由效地应对灾难做好准备。
  • 备份类别:
  • 差异备份(differential backup)
  • 完整备份(full backup)

差异备份是备份上一次到这次之间未备份的数据。还有log日志备份,这个就不细说了。

  • 备份操作步骤:
  1. 展开“数据库”,然后根据数据库的不同,选择用户数据库,或展开“系统数据库”,再选择系统数据库。
  2. 右键单击数据库,指向“任务”,再单击“备份”。将出现“备份数据库”对话框。
  3. 在“数据库”列表框中,验证数据库名称。您也可以从列表中选择其他数据库。
  4. 可以对任意恢复模式(FULL、BULK_LOGGED或SIMPLE)执行数据库备份。
  5. 在“备份类型”列表框中,选择“完整”。
  • 还原操作步骤:
  1. 展开“数据库”。根据具体的数据库,选择一个用户数据库,或展开“系统数据库”并选择一个系统数据库。
  2. 右键单击该数据库,指向“任务”,再指向“还原”,然后单击“数据库”,这将打开“还原数据库”对话框。
  3. 在“常规”页上,使用“源”部分指定要还原的备份集的源和位置。
  4. 单击“确定”。

三. 对数据库表的操作 - 基础

3.1 数据类型

  • 概述:在SQL Server中,每个列、局部变量、表达式和参数都具有一个相关的数据类型。数据类型是一种属性,用于指定对象可保存的数据的类型:整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等。
  • 类型详情:
  • 数字类型:
  • 时间类型:

1234567表示它的精度是小数点后7位

  • 字符串类型:

varchar是最常用的数据类型。 nchar和nvarchar都是双字节,存储空间要少一半。

还有一些其他的类型,比如货币等,暂时不细说了。

3.2 创建表

  • 概述:
  1. 若要创建表,您必须提供该表的名称以及该表中每个列的名称和数据类型。指出每个列中是否允许空值,也是一种很好的做法。
  2. 大多数表有一个主键,主键由表的一列或多列组成。主键始终是唯一的。数据库引擎将强制实施以下限制:表中的任何主键值都不能重复。
  • 操作方式:
  • 图形界面操作:
  1. 在“对象资源管理器”中,连接到SQL Server 数据库引擎的实例,然后展开该实例。
  2. 右键单击“表”,然后单击“新建”。
  3. 在弹出“新建表”的窗体中,录入表结构。
  4. 点击保存,在弹出对话框中输入表名称。
  • SQL 操作:
  • 图示:
  • 实战如图:

3.3 修改表结构

  • 概述:SQL表结构是SQL 数据库中非常重要的部分,其修改的方法的重要性自然不言而喻,下面就将对修改SQL表结构的方法进行详细的说明。
  • 操作:
  • 修改字段类型长度、字段类型:
  • 添加not null约束、设置主键:
  • 更改字段名、添加字段名:
  • 删除表
DROP TABLE table_name[,...n]

写法跟删除数据库一样,支持删除一个或多个。

  • 实战测试部分代码如图所示:

3.4 定义表主键、外键

  • 主关键字(primark key):
  • 主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。
  • 一个表只有一个主关键字。主关键字又可以称为主键。主键可以由一个字段,也可以由多个字段组成,分别称为单字段主键或多字段主键。
  • 又称主码。并且它可以唯一确定表中的一行数据,或者可以唯一确定一个实体。
  • 外键(Foreign Key):
  • 外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
  • 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。
  • 操作:
  • 增加、删除主键:
  • 增加外键、删除外键:
  • 实战操作:
  1. 添加外键:
  2. sql添加:

3.5 数据的新增

  1. 直接新增:
  2. 从其他表copy数据
  3. 实战操作:

3.6 表记录的查询

  • 查询的具体操作:
  • 最简单的查询:
SELECT 查询字段的名称 FROM 数据库表名

查询字段的名称可以指定部分字段,用逗号隔开,如果查询全部可以用 * 来表示,在生产环境中不建议使用*

  • 去重:
SELECT distinct 查询字段的名称 FROM 数据库表名
  • 查询前几条
SELECT Top 行数 查询的字段名称 FROM 数据库表名

行数这里,可以加个括号

  • 实战操作:

3.7 表记录的修改

  • 修改的具体操作:
UPDATE TABLE_NAME SET 字段 = 值
  • 实战操作:
update [dbo].[PayType] set PayTypeName ="我是测试" where sysno =1

其中[dbo].[PayType]是表名,PayTypeName是要赋值的字段。sysno是条件字段

3.8 删除表记录

  • 删除的具体操作:
DELETE FROM TABLE_NAME

TABLE_NAME是指具体要删除的表名

  • 实战删除:

四. 对数据库表的操作 - 高级查询

4.1 条件限制Where

  • 条件:
  • 精确限制条件:
  • Where 字段 = 值
  • 模糊限制条件:
  • Where 字段 like ‘%值%’
  • 实战操作:

4.2 BETWEEN语法

  • 范围查询,如图所示:
  • 语法:
  • 实战案例:

与MySQL 的BETWEEN很像

4.3 IN语法

  • 用于限制条件表达式,指定表达式范围值
  • 语法:
  • 实战案例:

4.4 EXISTS语法

  • 抛砖引玉:

表示说EXISTS会检测括号内的值是否返回条数大于0条,如果大于的话,则返回true,外部的查询继续执行。如果返回false,则不满足的数据不显示。外部的查询能够有多条记录,每条记录会对exsits内的值进行判断,只有为true时外部的记录才会被返回,否则不生效。

  • 写法实战:

4.5 返回记录排序

  • 返回记录排序:
  • 排序语法:
  • 实战操作:

跟mysql一样。

4.6 关联查询

  • 关联类型:
  1. inner join(交叉关联):只返回两个表中联结字段相等的行。(SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号 = 表2.字段号)
  2. left join(左关联),返回包括左表中的所有记录和右表中联结字段相等的记录;(SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.字段号 = 表2.字段号)
  3. right join (右关联)返回包括右表中的所有记录和左表中联结字段相等的记录;(SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.字段号 = 表2.字段号)
  • 实战操作:

跟MySQL类似

4.7 聚合函数

  • AVG():
  • 概述:返回组中各值的平均值。其中忽略Null值。
  • 计算字段类型必须为数字型(整数、小数)
  • 语法:
SELECT AVG(Score) FROM DBO.SCORE
  • SUM():
  • 概述:返回表达式中所有值的和。其中忽略Null值。
  • SUM只能用于数字列
  • 语法:
SELECT SUM(Score) FROM DBO.SCORE
  • 实战操作演示:

4.8 Min()、MAX()

  • Min():
  • 返回表达式的最小值
  • MIN忽略任何NULL值
  • 计算字段类型可为数字型或字符型(如果是字符就会按照国际字符排序区分)
  • SELECT MIN(Score) FROM DBO.SCORE
  • MAX():
  • 比较多个对象并返回较大的徐娘
  • 其中忽略NUll值
  • 计算字段类型可为数字型或字符型
  • SELECT MAX(Score) FROM DBO.SCORE
  • 实战图示:

4.9 COUNT()和SUM()

  • SUM():
  • 返回表达式中所有值的和。其中忽略NULL值
  • SUM只能用于数字列
  • SELECT SUM(Score) FROM DBO.SCORE
  • COUNT():
  • 返回组中的项数
  • 其中忽略NULL值
  • 计算字段返回类型为整型
  • SELECT COUNT(Score) FROM DBO.SCORE
  • 实战演示:

COUNT_BIG是指返回的行数在大于2的23次方-1(表示数据量非常大的时候),可以用这个COUNT_BIG,否则用COUNT即可。它们效果一样,只是后者避免数据过大导致报错。

4.10 LEN()函数

  • LEN()函数:
  • 返回指定字符串表达式的字符数
  • 其中不包含尾随空格
  • 若要返回用于表示表达式的字节数,请使用DATALENGTH()函数;
  • SELECT LEN(Grade) FROM DBO.CLASSES
  • 实战演示:

LEN是计算该行的指定字段占用的字符数,而datalength是计算的字节数。 中文“一年级”它的字符是3个,它的字节是6个。

4.11 随机数的产生RAND()

  • 概述:
  • floor是向下取整、ceiling是向上取整;然后N可以为任意数。
  • 实战演示:
  • 获取随机小数:
select rand()
  • 获取随机整数: 0~9范围内
select FLOOR(rand()*10);
  • 获取随机整数: 1~10范围内:
select CEILING(rand()*10)

4.12 当前时间的获取: GATEDATE(); GETUTCDATE()

  • 概述:
  • 返回当前数据库系统时间值,返回值的类型为datetime: select getdate();
  • 返回当前国际标准时间值,返回值的类型为datatime: select getutcdate();
  • 实战演示:
  • 当前时间:
  • 国际时间:

只是时区不同,所以时间不同。国际化多用于一些国际化的项目,而国内的项目一般用GETDATE()即可。

4.13 CONVENT函数

  • 概述:
  • CONVERT()函数是把日期转换为忻数据类型的通用函数
  • CONVERT()函数可以用不同的格式显示日期/时间数据
  • CONVERT(data_type(length),data_to_be_converted,style)
  • 图示:

styleID表示显示不同的样式,配合CONVENT函数使用。

  • 实战演示:
  • 按照110格式返回时间:

其中varchar(10)是估计时间的大小为10位左右;

  • 按照120格式返回时间:

可以记住常用的,也可以收藏本博客,随时翻阅哦;

4.14 DATEDIFF函数: 对时间的计算

  • 概述:
  • DATEDIFF() 函数返回两个日期之间的天数。
  • DATEDIFF(datepart,startdate,enddate)
  • startdate和enddate参数是合法的日期表达式
  • DATEADD()函数在日期中添加或减去指定的时间间隔。
  • DATEADD(datepart,number,date)
  • 实战操作:
  • 返回相差天数:

第一张图右边比左边天数相差2天;第二张图是右边日期小于左边日期,所以返回的是负数;

  • 返回相差月份:

这里将DAY换成了MONTH;所以比较的是月份;

  • 返回相差分钟数:
  • 2015年10月1日的基础上增加5天:
  • 在上面的计算基础上,我们想去掉后面的一大串0,可以使用CONVERT函数进行日期格式化:
  • 当然也可以减五个月,并且格式化,如图所示:
  • 还可以用HOUR小时,比如减去5个小时:

4.15 DATEPART() 返回日期/时间的单独部分

  • 概述:
  • DATEPART()函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
  • 返回类型是一个INT整型
  • DATENAME()这个函数同样是用于返回日期/时间的单独部分。
  • 返回数据类型是一个VARCHAR型
  • day()、month()、year()
  • 实战演示:
  • 返回当前日期的当前年:
select DATEPART(YEAR,getdate());
select DATEPART(yyyy,getdate());

getdate()可以替换为指定的日期,然后YEAR和yyyy的含义一样,都表示求取指定日期的年。 YEAR还可以替换为MONTH(月)、dd(天)等。

  • 使用DATENAME可以和DATEPART一样的进行截取,但是他们返回的类型不同。DATEPART返回的结果时数字,可以继续计算;而DATENAME是一个字符串:
  • 还有一些简洁的写法:select year(getdate()); 等等,如图所示:

4.16 CHARINDEX()函数 和PATINDEX()函数

  • 概述:
  • CHARINDEX()

expression1 是要查找的字符串是什么,而2 是被查找的字符串,3是一个可选参数,表示从何处开始查。

  • PATINDEX():

PATINDEX()支持通配符查找,可以在前后加通配符这种语法,当然它的查询效率要低于CHARINDEX();

  • 实战演示:
  • charindex:

返回的是第一个匹配的起始位置;

  • patindex:

只有前后加通配符,它的查询结果才是和charindex是一致的,否则就会前后值进行比较,只有两个字符串值完全一样才能匹配上;

4.17 STUFF()

  • 概述:
  • STUFF()函数用于删除指定长度的字符,并可以在指定的器处插入另一组字符。
  • 返回类型是一个字符串型
  • stuff(列名,开始位置,长度,替代字符串)
  • 实战演示:
  1. 截取中间的字段:
  2. 替代:

将空字符串换成了ee,就变成了替换ee了。

4.18 SUBSTRING()

  • 概述:
  • SUBSTRING()函数用于截取指定长度的字符串
  • SUBSTRING(expression,start,length)

它与上面一章节的区别是,上一节的是删除或者替换,这里的substring是截取,要注意区别;

  • 实战演示:

4.19 LEFT()和RIGHT()

  • 概述:
  • 实战演示:

他们的截取更像是一个简洁语法。一个是从最左边开始截取,一个是从最右边截取

4.20 LTRIM()、RTRIM()

  • 概述:
  • LTRIM()删除起始空格后返回字符表达式
  • LTRIM(character_expression)
  • RTRIM()截断所有尾随空格后返回一个字符串
  • RTRIM(character_expression)

就是删除左右边的空格,一个是从左边开始,一个是从右边开始;

  • 实战演示:
  • 删除空格:
  • 同时使用RTRIM、LTRIM可以去掉两边的所有空格:

4.21 UPPER()、LOWER():字符串的大小写转换

  • 概述:
  • UPPER()返回小写字符数据转换为大写的字符表达式
  • UPPER(character_expression)
  • LOWER()返回大写字符数据转换为小写的字符表达式
  • LOWER(character_expression)
  • 实战演示:
  • 单独用:
  • 实际数据:

对中文无效

4.22 REPLACE()

  • 概述:
  • 用另一个字符串值替换出现的所有指定字符串值
  • REPLACE(string_expression,string_pattern,string_replacement)
  • 实战演示:
  • 替换:

它会把符合条件的所有都替换成指定的

  • 注意:替换长度是可以不相等的,被替换的原值和新值不一定长度相等,如图所示:

4.23 REPLICATE()和SPACE()函数

  • 概述:
  • REPLICATE以指定的次数重复字符表达式
  • REPLICATE(string_expression,integer_expression)
  • SPACE返回指定个数的空格表达式
  • SPACE(integer_expression)
  • 实战演示:
  • 使用REPLICATE重复输出指定次数:
  • 使用SPACE()增加空格:
  • 组装年级和班级,中间增加空格:

4.24 REVERSE()函数

  • 概述:
  • REVERSE用于倒置字符串中的各个字符的位置
  • REVERSE(string_expression)
  • 实战演示:
  • 直接使用:
  • 将指定内容反转:

4.25 CAST函数()

  • 概述:
  • CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型
  • CAST(string_expression as data_type)
  • 实战演示:
  • int类型转为varchar:
  • 还可以用来组装结果:
  • 字符串和数字直接组装会报错:
  • 将数字转为字符串,然后就可以进行合并了:
  • 浮点数转为整数:
  • 一位小数转为保留两位小数:
  • 字符串转为时间类型:

4.26 CASE()函数

  • 概述:
  • 实战演示:
  • CASE搜索函数:
  • CASE搜索函数,还可以使用IN来筛选:
  • 简单CASE函数: