一、认识SQLServer数据表
SQL Server中的数据库由表的集合组成,这些表用于存储一组特定的结构化数据,表中包含行(也称为记录或元组)和列(也称为属性)的集合。表中的每一列都用于存储某种类型的信息,例如:姓名、性别、出生日期等。
1、了解SQL Server数据类型
在SQL Server中使用的数据类型有两大类:一是系统数据类型,即由系统定义,提供给用户使用的数据类型;二是用户自定义类型,即用户根据需要自定义的数据类型。
1)系统数据类型
在SQL Server中,为列选择合适的数据类型尤为重要,因为它影响着系统的空间利用、性能、可靠性和是否易于管理等特性。因此,在开发一个数据库系统之前,最好能够真正理解各种数据类型的存储特征。在表中创建列或声明一个局部变量时,都必须为它选择一种数据类型,选择数据类型后,就确定了如下特性。
SQL Server 2019支持的主要系统数据类型。




2) 自定义数据类型
在SQL Server中,除了使用系统数据类型外,还允许用户根据需要自己定义数据类型,并且可以用自定义数据类型来声明变量或字段。但自定义数据类型只允许用户通过已有的数据类型来派生,而不是定义一个具有新的存储及检索特性的类型。例如在一个数据库中,有许多数据表都需要用到vchar(100)的数据类型,那么用户就可以自己定义一个数据类型,比如vc100来代表vchar(100),之后,在所有数据表里需要用到vchar(100)的列时,都可以将其设为vc100。
2、理解列的属性
在创建数据表时,不仅要确定表的名称、表中每个列的名称和数据类型,还要确定每个列的属性,包括是否允许空属性、默认值属性、标识属性等。
1)允许空属性
允许空属性用来声明该列是不是必填的列。其值为NULL,表示该列可以为空;其值为NOT NULL,表示该列不能为空,必须填入内容。注意:NULL表示数值未知,没有内容,它既不是零长度的字符串,也不是数字0,只意味着没有输入。它与空字符串不一样,空字符串是一个字符串,只是里面内容是空的。在SQL Server 2019中,列的默认情况为"允许空值"。
"不允许空属性"的提示框

如果某列不允许空值,用户在向表中插入数据时,必须在该列中输入一个值,否则该记录不能被数据库接收,会弹出类似如图所示的错误提示框。
2)设置默认值属性
在SQL Server 2019中,可以给列设置默认值。如果某列已设置了默认值,当用户在数据表中插入记录时,没有给该列输入数据,那么系统会自动将默认值填入该列。
3)设置标识属性
在SQL Server 2019中,可以将列设置为标识属性。如果某列已设置为标识属性,那么系统会自动地为该列生成一系列数字。这些数字在该表中能唯一地标识一行记录。设置了标识属性的列称为标识列。列的标识属性由两部分组成:一个是初始值,另一个是增量。初始值用于数据表标识列的第一行数据,以后每行的值依次为初始值加上增量。

3、认识表约束
为减少输入错误、防止出现非法数据,可以在数据表的列字段上设置约束。例如:在XSB表的"学号"列上设置了主键约束,这样就可以保证该列中不会出现空值和重复的数据。表约束是为了保证数据库中数据的一致性和完整性而实现的一套标准机制。
1)表约束的类型
在SQL Server中,表约束包括四种:主键约束、唯一性约束、外键约束和检查约束。
主键约束。
主键是能够唯一标识数据表中每一行的列或列的组合。所以,定义为主键的列或列的组合既不能为空值,也不能为重复的值。应该注意的是当主键是由多个列组成时,某一列上的数据可以重复,但其组合仍是唯一的。
在一个数据表上只能定义一个主键,且系统会自动为主键列创建索引,在默认情况下创建为聚集索引(clustered)。
唯一性约束。
唯一性约束用于保证列中不会出现重复的数据。在一个数据表上可以定义多个唯一性约束,定义了唯一性约束的列可以取空值。唯一性约束实现了实体完整性规则。
如果数据表的某列定义了唯一性约束,则系统会自动为该列创建索引,在默认情况下创建为非聚集索引(nonclustered)。
唯一性约束与主键约束的区别有两点:一是在一个表中可以定义多个唯一约束,但只能定义一个主键。二是定义了唯一约束的列可以输入空值(NULL),而定义了主键约束的列则不能。
外键约束。
外键约束用于建立和强制两个表之间关联的一个列或多个列。即将数据表中的某列或列的组合定义为外键,且指定该外键要关联到哪一个表的主键字段上,主要作用是确保数据的完整性。
定义为主键的表称为主表,定义为外键的表称为从表(也称为相关表或明细表)。设置了外键约束后,如查也设置了级联规则,当主表中的数据更新时,从表中的数据也会自动更新。
检查约束。
检查约束通过限制列上可以输入的数据值来实现域完整性规则。检查约束的实质就是在列上设置逻辑表达式,以此来判断输入数据的合法性。
2 ) 创建表约束的方法
创建表约束的方法主要有三种:一是在新建表时,在单个列定义之后,紧接着定义约束;二是在新建表时,在所有列定义完之后,再定义约束;三是在已经创建好的表上定义约束,通过修改该表的方式添加约束。
二、 创建数据表和表约束
创建数据表一般分两个步骤进行:一是设计和定义表的结构;二是向表中添加数据。本项目中的任务是进行表结构的设计、定义和创建表。
1、 设计和定义表的结构
在XSCJ数据库中,分别设计学生情况表XSB、课程表KCB、学生成绩表CJB三张表。根据需求分析,设计它们的表结构、各列的属性和表约束如表所示。
学生情况表XSB的结构描述

课程表KCB的结构描述

成绩表CJB的结构

- 使用对象资源管理器创建数据表
【例】 创建XSB数据表。
1)在"对象资源管理器"窗口中展开要创建的"XSCJ"数据库,定位到"表"节点。
2)右击"表"节点,在弹出的快捷菜单中选择"新建表"→"表"命令,出现如图所示的窗口。"表设计器"窗口主要分为上、下两部分。上部分用来定义数据表的列,包括列名、数据类型、长度、允许空属性。下部分用来设置列的其他属性,如默认值、标识列等属性。
表设计器窗口

3)用户可用鼠标或〈Tab〉键或方向键在各单元格间移动和选择,完成"列名""数据类型""长度""允许Null值"栏中相关数据的输入。
4)设置主键约束。选中"学号"列,单击工具栏上的"设置主键/取消主键"按钮,可将该列设置为主键。

5)设置标识列。在"表设计器"窗口选中"序号"列,然后在"列属性"对话框里展开"标识规范"项,将"(是标识)"设为"是","标识增量"设为1,"标识种子"也设为1,如图所示

6)设置默认值约束。在"表设计器"窗口选中"性别"列,然后在"列属性"对话框里展开"常规"项,在"默认值或绑定"文本框里输入1,如图

7)选择"文件"→"保存"菜单命令,或直接单击"保存"快捷按钮,在出现的"选择名称"对话框中输入要保存的数据表名称"XSB"。
8)单击"确定"按钮即可完成数据表创建

使用对象资源管理器添加表约束
在对象资源管理器中创建约束可以采取两种方法:一是可以在创建数据表时添加约束,例如:在创建表时添加的主键约束;二是可以在建好数据表后添加约束。
1)承接上一任务。在"对象资源管理器"窗口中依次展开"XSCJ"数据库的"XSB"表,定位到"约束"节点。
2)右击"约束"节点,在弹出的快捷菜单中选择"新建约束"命令,出现如图所示的对话框,同时会打开"表设计器"窗口。

3)单击"表达式"右边的
按钮,出现如图所示的对话框,在该对话框中输入"总学分>=0 AND总学分<=200",单击"确定"按钮,返回到图所示的界面(注意每两个字段添加空格)。

4)单击"说明"右边的按钮,出现如图所示的对话框,在该对话框中可以输入对该检查约束的说明信息,单击"确定"按钮,返回如图所示的对话框。

5)将检查约束的标识名称修改为"CK_XSB_ZXF"后,单击"关闭"按钮,返回到"表设计器"窗口,点击保存。
3、认识CREATE TABLE语句
CREATE TABLE命令的完整语法很复杂,下面来认识其基本的语法。

其中,<列定义>的语法如下。

<列约束>的语法如下。

命令选项说明如下:
1)ON:指定在哪个文件组上创建表,默认在PRIMARY文件组中创建表。
2)DEFAULT:在<列定义>中使用,指定所定义的列的默认值,该值由常量表达式确定。
3)IDENTITY:指定所定义的列为标识列,每张表中只能有一个标识列。当初值和增量都为1时,它们可以省略不写。
4)AS:指定所定义的列为计算列,其值由计算列表达式确定。
5)CONSTRAINT:为列约束指定名称,省略时由系统命名。
6)NULL|NOT NULL:指定所定义的列的值可否为空,默认为NULL。
7)PRIMARY KEY|UNIQUE:指定所定义的列为主关键字或具有唯一性。
8)CLUSTERED|NONCLUSTERED:指定所定义的列为簇索引或非簇索引。
9)FOREIGN KEY REFERENCES:指定所定义的列为外关键字,且与该列相对应的参照列是参照表的主关键字或具有唯一性约束。
10)CHECK:为所定义的列指定检查约束,规则由逻辑表达式指定。
4、 创建有标识列的表
【例】在XSCJ数据库中,创建数据表KCB1,该表中的"序号"列为标识列。
1)在SSMS的查询窗口中,输入以下语句并执行。

|--------------------------------------------------------------------------------------------------------------------------------------|
| CREATE TABLE XSCJ.DBO.KCB1 ( 序号 INT IDENTITY, 课程号 CHAR(4), 课程名 VARCHAR(20), 授课教师 VARCHAR(10), 开课学期 TINYINT, 学时 TINYINT, 学分 TINYINT ) |
2)单击工具栏上的按钮(或按〈F5〉键)。

5、 创建有列约束的表
【例】 在XSCJ数据库中,创建数据表KCB,并使用三种方法添加表约束。
方法1:在新建表时,在单个列定义之后,紧接着定义约束。
1)可在SSMS的查询窗口中,输入以下语句。

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| USE XSCJ CREATE TABLE KCB ( 课程号 CHAR(4) NOT NULL CONSTRAINT PK_KCB_KCBH PRIMARY KEY, 课程名 VARCHAR(40) NOT NULL, 授课教师 VARCHAR(10), 开课学期 TINYINT NOT NULL CONSTRAINT DF_KCB_XQ DEFAULT 1 CONSTRAINT CK_KCB_XQ CHECK (开课学期 >=1 AND 开课学期 <=6), 学时 TINYINT NOT NULL, 学分 TINYINT ) |
2)单击工具栏上的执行按钮(或按〈F5〉键)。
方法2:在新建表时,在所有列定义完成后,再定义约束。
可在SSMS的查询窗口中,输入以下语句。

方法3:在已经创建好的表上定义约束,通过修改该表的方式添加约束。
在SSMS的查询窗口中,输入以下语句并执行。


6、创建有外键约束的表
在XSCJ数据库中,创建一个数据表CJB。
在SSMS的查询窗口中,输入以下语句并执行。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| USE XSCJ CREATE TABLE CJB ( 学号 CHAR(10) NOT NULL REFERENCES XSB(学号), 课程号 CHAR (4) NOT NULL, 成绩 TINYINT, 学分 TINYINT CONSTRAINT PK_CJB PRIMARY KEY (学号,课程号), CHECK (学分 <= 10 ), FOREIGN KEY(课程号) REFERENCES KCB(课程号) ) |
三、修改数据表和表约束
1、使用对象资源管理器修改数据表和表约束
【例】 对XSCJ数据库中的XSB表进行修改:
1)删除"序号"字段;
2)将"籍贯"字段移到"出生日期"字段之前;
3)在"总学分"字段前面增加"EMAIL"字段,varchar(30),允许为空,限制该字段值中必须包含"@"字符,约束名为"CK_XSB_EMAIL";
4)修改"总学分"字段上的检查约束,限制总学分的取值在"0~300"之间。
操作步骤如下:
1)在"对象资源管理器"中展开要修改的"XSCJ"数据库,定位到"XSB"表上。
2)右击"XSB"表,在弹出的快捷菜单中选择"设计"命令,出现"表设计器"窗口。
3)删除"序号"字段。右击"序号"列的字段名称,在弹出的快捷菜单里单击"删除列"命令即可删除该列。
4)移动"籍贯"字段。先选中该列,然后拖动该列到"出生日期"字段前松开鼠标左键即可。注意在拖动列时,出现的那条黑线就代表拖放的位置。
5)增加"EMAIL"字段。右击"总学分"字段,在弹出的快捷菜单里单击"插入列"命令,会在"总学分"字段前面增加一个空行,;然后在该行中输入要增加的字段名称、类型等属性。
6)修改"总学分"列上的约束。单击工具栏上的"管理CHECK约束"按钮,显示"检查约束"对话框,该对话框中显示了已有检查约束的属性。在"表达式"文本框中将约束改为"([总学分]>=(0) AND [总学分]<=(300))",

7)在"EMAIL"列上增加约束。单击中的"添加"按钮,在"选定的CHECK约束"列表框里,自动添加了一个名为"CK_XSB"的检查约束,在"表达式"文本框中输入"email like '%@%'",在"(名称)"文本框中将约束名修改为"CK_XSB_EMAIL"。

8)单击"关闭"和"保存"按钮后,关闭"表设计器"窗口。
注意:在保存时可能会弹出如下对话框,需要进行配置:

解决步骤:
打开 SQL Server Management Studio 并登录,登陆后在菜单栏中按照「工具->选项->设计器->表设计器和数据库设计器」次序点击鼠标,直至出现下图:

将【阻止保存要求得新创建表的更改】内容取消打勾,点击确定,再次进行保存尝试。
2、认识ALTER TABLE语句
使用ALTER TABLE命令可以修改表的结构:增加、删除列,也能修改列的属性,还能增加、删除、启用和暂停约束。但在修改表时,不能破坏表原有的数据完整性,例如不能向有主键的表添加主键列,不能向已有数据的表添加NOT NULL属性的列等。
ALTER TABLE命令的基本语法如下。

其中,<列定义>的语法如下。

<列约束>的语法如下。

1)增加列
【例】 在XSB表中,增加两列:"联系电话"字段,char(11),默认值为"13600000000";"邮箱"字段,varchar(20)。

|------------------------------------------------------------------------------------------------------|
| USE XSCJ ALTER TABLE XSB ADD 联系电话 CHAR(11) CONSTRAINT DF_XSB_DH DEFAULT '1360000000', 邮箱 VARCHAR(20) |
2)修改列
【例】 将成绩表XSCJ中成绩列的数据类型修改为numeric(4,1)。
在SSMS的查询窗口中,输入以下语句并执行。
|-------------------------------------------------------|
| USE XSCJ ALTER TABLE CJB ALTER COLUMN 成绩 NUMERIC(4,1) |

2) 添加约束
在数据表已经存在的情况下,可通过修改表的方式来添加约束。用户在添加约束时,如果表中原有数据与新添加的约束发生冲突,将会导致异常,并终止命令执行。如果想忽略对原有数据的约束检查,可在命令中使用WITH NOCHECK选项,使新增加的约束只对以后更新或插入的数据起作用。系统默认自动使用WITH CHECK选项,即对原有数据进行约束检查。注意,不能将WITH CHECK或WITH NOCHECK作用于主关键字约束和唯一性约束。
【例】在XSB表的"姓名"列上增加唯一性约束,约束名为UK_XSB_XM,并忽略对原有数据的约束检查。
说明:如果 XSB 表中已经存在重复姓名,不做校验,不会影响已有数据,只会在后续插入或更新数据时生效。
在SSMS的查询窗口中,输入以下语句并执行。

|------------------------------------------------------------------|
| ALTER TABLE XSB WITH NOCHECK ADD CONSTRAINT UK_XSB_XM UNIQUE(姓名) |
1.检查约束(Check Constraint) - 图标显示为一个带复选标记的框框(例如 CK_XSB_ZXF)。这种约束用于确保列中的值符合指定条件。
- 默认约束(Default Constraint) - 图标显示为一个带"DF"标记的小框框(例如 DF_XSB_DH 和 DF_XSB_性别)。这种约束用于设置列的默认值。
3) 删除约束
在SSMS的查询窗口中,输入以下语句并执行。

|-------------------------------------------|
| ALTER TABLE XSB DROP CONSTRAINT UK_XSB_XM |
4)删除列
【例】 将XSB表中的"联系电话""邮箱"列删除。
在SSMS的查询窗口中,输入以下语句并执行。

|-------------------------------------------------------------------------------|
| ALTER TABLE XSB DROP CONSTRAINT DF_XSB_DH ALTER TABLE XSB DROP COLUMN 联系电话,邮箱 |
四、 管理表中的数据
使用对象资源管理器管理表中的数据
【例】 分别向XSCJ库中的XSB表、KCB表、CJB表中添加如表所示的数据,根据需要修改或删除数据。其中,XSB表的性别列中的"0"代表"女","1"代表"男"。
XSB表中的学生情况信息(样本表)

(续)

KCB表中的课程信息(样本表)

CJB表中的学生成绩信息(样本表)

操作步骤:
- 在"对象资源管理器"中展开要修改的"XSCJ"数据库,定位到"XSB"表上。
- 输入各记录的字段值后,只要将光标定位到其他记录上,或关闭"结果窗格"窗口,新记录就会自动保存。
使用相同的方法向KCB表和CJB表中添加记录。
1、认识INSERT语句
使用INSERT语句即可以一次插入一行数据,也可以从其他表中选择符合条件的多行数据一次插入表中。无论使用哪一种方式,输入的数据都必须符合相应列的数据类型,且符合相应的约束,以保证表中数据的完整性。
1)插入一行数据
INSERT命令的语法如下。

在插入数据时,必须给出相应的列名,次序可任意,如果是对表中所有列插入数据,则可以省略列名。插入的列值由表达式指定,对于具有默认值的列可使用DEFAULT插入默认值,对于允许为空的列可使用NULL插入空值。对于没有在INSERT命令中给出的表中其他列,如果可自动取值,则系统在执行INSERT命令时,会自动给其赋值,否则执行INSERT命令时会报错。
2)插入多行数据
SELECT子句的INSERT命令的语法如下

该命令先从多个数据源表中选取符合逻辑表达式的所有数据,从中选择所需要的列,将其数据插入到目的表中。当选取源表中的所有数据记录时,WHERE子句可省略;当插入到目的表中的所有列时,列名可省略。
2、 使用INSERT语句向表中添加记录
【例】向XSB表插入两行数据。
在SSMS的查询窗口中,输入以下语句并执行。
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #################错误####################### INSERT INTO XSB VALUES('1903051101', '王成', 1, '汉族', '2002-5-21', '数字媒体学院', '北京','环境艺术设计', 30, '学习委员') ############################################# INSERT XSB (学号, 姓名, 性别, 出生日期, 所属院系, 专业名称) VALUES ('1903070405', '田芳', 0, '1995-7-15', '建筑材料学院', '工程造价') |

3、 使用SELECT子句向表中添加多行数据
【例】将CJB表中成绩不及格的记录插入NOPASS表中。说明:该例中用到的NOPASS表必须是已经存在的,且该表的结构与CJB一致。如果还没有NOPASS表,则用户应该先定义该表。
创建NOPASS表
|-----------------------------------------------------------------------------------------------------------------------------|
| CREATE TABLE XSCJ.DBO.NOPASS ( 学号 char(10) not null, 课程号 char(4) not null, 成绩 numeric(4, 1) not null, 学分 tinyint not null ) |
在SSMS的查询窗口中,输入以下语句并执行。

|----------------------------------------------------------------------------------------|
| USE XSCJ INSERT INTO NOPASS SELECT * FROM CJB WHERE 成绩 < 60 GO SELECT * FROM NOPASS |
4、 更新表中的记录
UPDATE命令用于更新表中的记录,其语法如下。

当省略WHERE子句时,表示对所有行的指定列都进行修改,否则只对满足逻辑表达式的数据行的指定列进行修改。修改的列值由表达式指定,对于具有默认值的列可使用DEFAULT修改为默认值,对于允许为空的列可使用NULL修改为空值。
【例】 将CJB表中课程号为"1001"的不及格的学生成绩加5分。
在SSMS的查询窗口中,输入以下语句并执行。

|---------------------------------------------------------|
| UPDATE CJB SET 成绩=成绩+5 WHERE (课程号='1006' AND 成绩 < 60 ) |
5、 删除表中的记录
DELETE命令用于删除表中的记录,其语法如下。

当省略WHERE子句时,表示删除表中所有数据,否则只删除满足逻辑表达式的数据行。要删除CJB表中所有不及格的记录,可使用"DELETE CJB WHERE (成绩<60)"命令。
6、删除表
使用DROP TABLE语句删除数据表
DROP TABLE命令的语法如下。

五、查看表信息
1、查看表的定义
创建好数据表后,可以查看表的定义信息。可以在"对象资源管理器"中查看表信息,也可以通过编写T-SQL语句查看表的定义信息。
使用系统存储过程SP_HELP查看表的定义信息,其语法代码如下。

【例】 使用系统存储过程查看服务器上所有数据表或查看CJB数据表的信息。
在SSMS的查询窗口中,输入以下语句并执行

go:将前面的 SQL 语句作为一个批次提交
第1条语句执行后,显示如图(1)所示的结果,第2条语句执行后,显示如图(2)所示的结果。

(1)
(2)
2、创建数据库关系图
在关系数据库中,数据库关系图是实现良好的数据库设计的重要工具。特别是对于一个较大的数据库来说,关系图显得非常重要,因为通过数据库关系图可以快速可视化和了解表与表之间的关系。在SQL Server 2019中,提供了一个简单易用的数据库关系图工具,使用它可以快速构建数据库关系图。
【例】 在对象资源管理器中为XSCJ数据库创建一个名为"Dia_xscj"的关系图。
- 在"对象资源管理器"中,依次展开"数据库"节点下的"XSCJ"数据库节点,定位到"数据库关系图"。
- 右击该节点,在弹出的快捷菜单中选择"新建数据库关系图"命令,将出现如图所示的"添加表"对话框。

3)在该对话框中,选择要添加到关系图中的XSB、KCB、CJB表,单击"添加"按钮,然后单击"关闭"按钮,显示如图所示的"XSCJ"数据库关系图。

4)在对话框中输入关系图的名称"Dia_xscj"后,单击"确定"按钮即可
提示:如果是第一次创建数据库关系图,会弹出如图4-19所示的警告对话框,这时只有单击"是"按钮后,才可以创建数据库关系图。

六、查询
1、 使用简单查询
认识SELECT语句
SELECT语句的基本语法格式如下。

SELECT语句最简单的格式如下。

其中,字段列表指定了查询结果集中要包含的列的名称。有多个字段名时用逗号分隔。在字段列表中,还可以包含以下这些参数。
1)字段名:指定在查询结果集中要包含的字段名。在字段名前还可以加上ALL和DISTINCT参数。
All:指定在查询结果集中包含所有行,此参数为默认值。
DISTINCT:指定在查询结果集中只能包含不重复的数据行。
2)*:返回指定表中的所有列。
3)TOP表达式:限制查询结果集中返回的数据行的数目。
4)常量表达式:使用常量表达式在查询结果集中增加说明列。
5)列表达式:使用列表达式在查询结果集中增加计算列。
6)字段名AS别名:在查询结果集中为列重新指定名称。
7)使用聚合函数:在查询结果集中返回数据的统计信息。
2、 使用SELECT子句选择列
1)查询表中所有列
|--------------------|
| SELECT * FROM XSB |
2)查询表中的某几列
|----------------------------|
| SELECT 学号,姓名,专业名称 FROM XSB |
3)查看最前记录
|--------------------------|
| SELECT TOP 3 * FROM XSB |
4)为查询增加计算列
【例】 查看CJB表中的信息,并查询折算成绩,其折算成绩为原成绩的70%。
|-----------------------------------|
| SELECT 学号,课程号,成绩,成绩*0.7 FROM CJB |

5)改变查询结果中的列名
在默认情况下,数据查询结果中所显示的列名就是在创建表时使用的列名,但对于新增列,如上图中所示的计算列,系统并不会指定列名,而是以"无列名"来标识。如果用户想改变查询结果中所显示的列名,可以用以下3种方法来实现。
第1种方法:在列表达式前冠以一个后接等号(=)的字符串来为列表达式指定列名,其中字符串可以用单引号括起来,也可以不括。
第2种方法:在列表达式后用关键字AS接一个字符串的方式来为列表达式指定列名,其中字符串可以用单引号括起来,也可以不括。关键字AS也可以省略。
第3种方法:在列表达式后留一个空格,再接一个字符串来为列表达式指定列名,其中字符串可以用单引号括起来,也可以不括。
|-----------------------------------------------------------|
| SELECT 学号,课程号,成绩 AS 原成绩,调整成绩1=成绩*0.7,成绩+5 调整成绩2 FROM CJB |

3、查看不重复记录
查看CJB表中学生选修的课程号。


3、 增加说明列
有时,直接阅读SELECT语句的查询结果比较困难,因为显示出来的数据,有时只是一些不连贯的信息。为了增加查询结果的可读性,可以在SELECT子句中增加一些说明列。增加的说明文字串使用单引号括起来。
【例】 在查询结果集的"备注"列前增加一个说明列。
因为增加的说明文字串要用单引号括起来,如果说明文字串本身又含有单引号,则用两个单引号表示。


4、 使用WHERE子句选择行
在前面的示例中,查询的都是数据表中所有的记录,但在实际情况中,用户通常只要求查询部分数据记录,即找出满足某些条件的数据记录。此时用户可以在SELECT语句中使用WHERE子句来指定查询条件,过滤不符合条件的记录行。
其基本的语法形式如下。

在WHERE子句中,可以使用的查询条件包括比较条件、逻辑条件、范围条件、模糊匹配条件、列表条件及空值判断条件。
1)使用比较条件查询
比较条件适合简单的条件查询。在SQL Server中比较运算符如表所示

【例】 查询CJB表中成绩不及格的学生记录
|----------------------------------------|
| SELECT 学号,课程号,成绩 FROM CJB WHERE 成绩<60 |

【例】 查询XSB表中2002年及其后出生的学生信息。
|---------------------------------------------|
| SELECT * FROM XSB WHERE 出生日期>'2001-12-31' |

4、使用逻辑条件查询
如果查询的条件比较多,可以使用逻辑条件进行查询。逻辑运算符号有三种。
AND:组合两个条件,当两个条件都为真时其取值为真。
OR:组合两个条件,当两个条件中有一个为真时其取值为真。
NOT:对指定的条件取反。
【例】 查询XSB表中财务管理专业的男生信息。
|----------------------------------------------------------|
| SELECT 学号,姓名,性别,专业名称 FROM XSB WHERE 性别=1 AND 专业名称='财务管理' |

5、使用范围条件查询
在查询某个取值范围内的数据时,除了使用逻辑条件查询(AND)外,还有另一种指定列值取值范围的方法,就是使用"BETWEEN...AND"来指定查询的范围。其语法形式如下。

【例】查询2001年2月份出生的学生信息,
|-----------------------------------------------------------------------------|
| SELECT 学号,姓名,出生日期 FROM XSB WHERE 出生日期 BETWEEN '2001-02-01' AND '2001-02-28' |

6、 使用模糊匹配条件查询
通常,查询中的条件都是确定的,如"成绩>=60"或"专业名='计算机网络'"等,但有时也可能这个条件是不确定的,或用户不想进行精确查询,例如用户想找一本关于SQL Server 2019的书,但用户并不知道书的全名,此时可以使用模糊匹配的方法查找书名中含有字符串"SQL Server 2019"的书,然后再挑选;又如用户想查找班中所有陈姓学生的记录等。
为了进行模糊匹配查询,T-SQL语言提供了LIKE关键字用以查询与特定字符串匹配的数据。其语法形式如下。
在"匹配字符串"中可以使用如表所示的四种通配符。

【例】 查询XSB表中的所有陈姓学生的信息

|-------------------------------------------|
| SELECT 学号,姓名 FROM CJB WHERE 姓名 LIKE '陈%'; |
【例】 查询XSB表中学号尾数为3的学生信息

|----------------------------------------|
| SELECT * FROM CJB WHERE 学号 LIKE '%3'; |
【例】 查询XSB表中学号尾数不为1、2、3、4的学生信息

7、 使用列表条件查询
如果列值的取值范围不是一个连续的区间,而是该区间范围内的某些值,此时就不能使用BETWEEN...AND关键字,SQL Server提供了另外一个关键字IN,其语法形式如下。

8、使用空值查询
如果要查询字段中的空值NULL,可以使用"IS"运算符设置条件进行判断。其语法形式如下。

【例】 查询XSB表中的学生获奖情况

9、 使用ORDER BY子句排序查询结果
ORDER BY子句的作用是设置排序顺序,使用它可以使查询结果按照用户的要求对一个列,或是多个列排序,其语法形式如下。


其中的参数含义如下。
列号:表示该列在SELECT子句指定的列表中的相对顺序号。
ASC:表示按升序排列,为默认值,可省略。
DESC:表示按降序排列。
【例】 分别以姓名降序排列、以出生日期升序排列查询XSB表的记录。

|---------------------------------------------------------------------------|
| SELECT * FROM XSB ORDER BY 姓名 DESC SELECT 学号,姓名,出生日期 FROM XSB ORDER BY 3 |

10、 按多个字段排序
当ORDER BY子句指定了多个列时,系统先按照ORDER BY子句中第一列的顺序排列,当该列出现相同值时,再按照第二列的顺序排列,依次类推。
查询CJB表的记录,并先按课程号升序排列,当课程号相同时再按成绩降序排列。查询结果如图

11、使用INTO子句保存查询结果
可使用INTO子句将查询结果生成一个新表,这种方法常用于创建表的副本或创建临时表。
新表的列为SELECT子句指定的列,且不改变原表中列的数据类型和允许空属性,但忽略其他所有信息,如默认值、约束等信息。其语法形式如下。


|--------------------------------------------------------------|
| SELECT 学号, 课程号, 成绩 INTO TEMP_KCB FROM CJB ORDER BY 2, 3 DESC |
七、汇总查询
在简单查询中,只涉及对一张数据表中的原始数据进行查询,而在实际应用中,用户的查询需求远远不止这些。例如,用户想在XSCJ库中查询平均成绩、最高成绩、最低成绩、男女生人数、各专业人数等,而这些数据又不是XSCJ库中的原始数据,那么该如何实现这些查询呢?
实际上,Server SQL给用户提供了数据汇总查询方法,即可以对查询结果集进行求总和、平均值、最大值、最小值及计数等。下面介绍汇总查询的两种使用形式,即使用聚合函数和GROUP BY子句进行汇总查询。
1、 认识聚合函数
聚合函数可以将多个值合并为一个值,其作用是对一组值进行计算,并在查询结果集中返回一个单值。其语法格式如下。

其中,各参数的含义如下。
ALL:计算该列中值非空的记录的个数,为默认值。
DISTINCT:计算该列中值非空且不同的记录的个数(不计算重复行)。
*:计算所有记录的个数,包括空值,该参数只能用于COUNT函数中。
常用的聚合函数有SUM、AVG、MAX、MIN和COUNT等,其作用如下。
- SUM函数:返回指定列中所有值的和或仅非重复值的和。该函数只能用于数值型数据。
- AVG函数:返回指定列的算术平均值,该函数只能用于数值型数据。
- MAX函数:返回指定列的最大值。
- MIN函数:返回指定列的最小值。
- COUNT函数:返回指定列的数据记录行数,不包含全部为NULL值的记录行。它可以指定某个列作为参数,此时返回该列数据记录的行数;也可使用通配符星号(*)作为参数,此时返回表中所有数据记录的行数。
2、使用聚合函数汇总查询
【例】计算CJB表中成绩列的总和、算术平均值、最大值、最小值,并分别将这些列指定别名为总分、平均分、最高分、最低分。
|----------------------------------------------------------------------------------------------------------------------------------------------------|
| SELECT SUM(成绩) AS 总分,AVG(成绩)AS 平均分,MAX(成绩)AS 最高分,MIN(成绩) AS 最低分 FROM CJB
|
【例】计算CJB表中成绩不及格的记录条数,并将该列指定别名为"不及格的人次数"。
|----------------------------------------------------|
| SELECT COUNT(*) AS '不及格的人数' FROM CJB WHERE 成绩<60 |

分析:
1)用COUNT函数计算XSB表中有多少条学生记录时,可以用学号列作为COUNT函数的参数,因为学号列是XSB表的主关键字,能唯一标识每一条学生记录;也可以使用星号(*)作为COUNT函数的参数。
2)用WHERE子句进行条件筛选,则COUNT函数返回表中符合条件的数据记录的行数。
3、认识GROUP BY子句
聚合函数只返回单个的汇总数据。在前面介绍的实例中,汇总数据都是针对整个表或由WHERE子句确定子表中的指定列进行的,所以返回的汇总数据只有一行。
在实际应用中,用户经常需要得到不同类别的汇总数据,那么可以使用Server SQL中提供的GROUP BY子句来实现分类汇总。该子句根据指定的列将数据分成多个组(即列值相同的记录组成一组),然后对每一组进行汇总,并对生成的汇总记录按指定列的升序显示。通常用于在每个组上执行一个或多个聚合。另外,还可以使用HAVING子句来筛选结果集内的组,使用ORDER BY子句可以对结果集进行排序。其语法形式如下。

注意:SELECT子句中出现的列名必须是GROUP BY子句中指定的列名,或者和聚合函数一起使用。
使用GROUP BY子句分类汇总
【例】 在CJB表中,统计每门课程的平均分。
分析:先将CJB表中的数据记录按课程号分组,然后统计每一组课程的平均成绩。
|-------------------------------------------------|
| SELECT 课程号,AVG(成绩) AS 平均分 FROM CJB GROUP BY 课程号 |

【例】 在XSB表中,统计各院系男女生人数.
|-------------------------------------------------------------------------|
| SELECT 所属院系,性别, COUNT(性别) AS 人数 FROM XSB GROUP BY 所属院系,性别 ORDER BY 所属院系 |

4、 对分组汇总结果进行筛选
HAVING子句用于设定组或聚合的查询条件,通常与GROUP BY子句配合使用。如果不使用GROUP BY子句,则HAVING的效果与WHERE子句一样。
注意:当GROUP BY子句、HAVING子句和WHERE子句同时存在时,其执行顺序为先WHERE,后GROUP BY,再HAVING,即先用WHERE子句过滤不符合条件的数据记录,接着用GROUP BY子句对余下的数据记录按指定列分组,最后再用HAVING子句排除一些组。HAVING子句与WHERE子句的区别是:HAVING子句中可以使用聚合函数,而WHERE子句则不能。
【例】 在XSB表中,统计各院系男女生的人数超过1 人的信息
|-------------------------------------------------------------------------------|
| SELECT 所属院系,性别,COUNT(性别) AS 人数 FROM XSB GROUP BY 所属院系,性别 HAVING COUNT(性别)>=1 |
