5 数据查询 5.1 简单 SELECT 语句 5.2 SELECT 语句的统计功能 5.3 SELECT 语句中的多表连接 5.4 子查询 5.5 使用 SQL Server Management Studio 进行数据查询与维护
学习目标 通过本部分的学习, 应该掌握以下内容 数据查询的各种语句 运用 S QL S e rve r M a n a g e m e n t S t u d io 和基本的 S ELECT 语句查询表中的数据 数据维护的基本方法
5.1 简单 SELECT 语句 5.1.1 S ELECT 语句的语法格式 S ELECT 语句的基本语法格式如下 S ELECT 列名的列表 [ IN TO 新表名 ] [ FROM 表名与视图名列表 ]
[ WH ERE 条件表达式 ] [ GROU P B Y 列名的列表 ] [ H AVIN G 条件表达式 ] [ ORD ER B Y 列名 1 [ AS C D ES C], 列名 2 [ AS C D ES C],... 列名 n [ AS C D ES C] ]
5.1.2 基本的 S ELECT 语句 S ELECT 语句的基本形式如下 S ELECT 选取的列 FROM 表的列表 WH ERE 查询条件
5.1.3 使用 IN TO 子句 使用 IN TO 子句允许用户定义一个新表, 并且把 S ELECT 子句的数据插入到新表中, 其语法格式如下 S ELECT 选取的列 IN TO 新表名 FROM 表的列表 WH ERE 查询条件
5.1.4 使用 WH ERE 子句 WH ERE 子句确定了查询的条件, 表 5-1 给出了组成查询条件表达式的运算符
表 5-1 查询条件表达式的运算符 > >= = < <= <>! =!>!< BETWEEN AND BETWEEN AND IN NOT IN NOT!>!< LIKE NOT LIKE IS NULL NOT NULL AND OR NOT
1. 比较运算符 2. 范围运算符 3. 列表运算符 4. 模糊匹配运算符 5. 空值运算符 6. 逻辑运算符
5.1.5 使用 ORD ER B Y 子句 在查询结果集中, 记录的顺序是按它们在表中的顺序进行排列的, 可以使用 ORD ER B Y 子句对查询结果重新进行排序, 可以规定升序 ( 从低到高或从小到大 ) 或降序 ( 从高到低或从大到小 ), 方法是使用关键字 AS C ( 升序 ) 或 D ES C ( 降序 )
如果省略 AS C 或 D ES C, 系统则默认为升序 可以在 ORD ER B Y 子句中指定多个列, 检索结果首先按第 1 列进行排序, 第 1 列值相同的那些数据行, 再按照第 2 列排序, 依次类推 ORD ER B Y 子句要写在 WH ERE 子句的后面
5.2 SELECT 语句的统计功能 S ELECT 语句中的统计功能对查询结果集进行求和 求平均值 求最大最小值等操作 统计的方法是通过集合函数和 GROU P B Y 子句 COM P U TE 子句进行组合来实现的
5.2.1 使用集合函数 集合函数是在查询结果记录的列集上进行各种统计运算, 运算的结果形成一条汇总记录
表 5-2 SQL Server 2005 集合函数及其功能 SUM([ALL DISTINCT] ) MIN([ALL DISTINCT] ) MAX([ALL DISTINCT] ) COUNT({[ALL DISTINCT] } *) CHECKSUM(* n]) [, BINARY_CHECKSUM(* [, n]) AVG([ALL DISTINCT] ) COUNT * DISTINCT
1. 求和函数 S U M 与求平均值函数 AVG S U M 和 AVG 是数值型列值的求和与求平均值函数, 它们只能用于数值型字段, 而且忽略列值为 N U LL 的记录
2. 最大值函数 M AX 与最小值函数 M IN M AX 和 M IN 函数分别用来返回指定列表达式中的最大值和最小值, 忽略列值为 N U LL 的记录, 列表达式中的列可以是任何可排序的类型
3. 计数函数 COU N T COU N T 函数用于统计查询结果集中记录的个数, 语法上, * 用于统计所有记录的个数, ALL 用于统计指定列的列值非空的记录个数, D IS TIN CT 用于统计指定列的列值非空且不重复的记录个数 默认值为 ALL
5.2.2 使用 GROU P B Y 子 句 GROU P B Y 子句就能够实现这种统计, 它按照指定的列, 对查询结果进行分组统计, 该子句写在 WH ERE 子句的后面
注意 : S ELECT 子句中的选择列表中出现的列, 或者包含在集合函数中, 或者包含在 GROU P B Y 子句中, 否则, S QL S e rve r 2 0 0 5 将返回错误信息
语法格式如下 GROU P B Y 列名 [ H AVIN G 条件表达式 ] "H AVIN G 条件表达式 " 选项是对生成的组进行筛选
5.2.3 使用 COM P U TE B Y 子句 使用 COM P U TE B Y 子句时必须使用 ORD ER B Y 对 COM P U TE B Y 中指定的列进行排序 语法格式如下 COM P U TE 集合函数 [ B Y 列名 ]
5.3 SELECT 语句中的多表连 接 在实际应用中, 数据查询往往会涉及多个表, 这就需要将多个表连接起来进行查询 这种连接分为交叉连接 内连接 外连接和自连接 4 种
图 5-7 连接要使用的表和数据
5.3.1 交叉连接 S ELECT 列名列表 FROM 表名 1 CROS S JOIN 表名 2 或者 S ELECT 列名列表 FROM 表名 1, 表名 2 交叉连接的结果是两个表的笛卡儿积 交叉连接在实际应用中一般是没有意义的, 但在数据库的数学模式上有重要的作用
5.3.2 内连接 内连接是只包含满足连接条件的数据行, 是将交叉连接结果集按照连接条件进行过滤的结果, 也称自然连接 连接条件通常采用 主键 = 外键 的形式
内连接有以下两种语法格式 S ELECT 列名列表 FROM 表名 1 [ IN N ER] JOIN 表名 2 ON 表名 1. 列名 = 表名 2. 列名 或 S ELECT 列名列表 FROM 表名 1, 表名 2 WH ERE 表名 1. 列名 = 表名 2. 列名
5.3.3 外连接 外连接根据连接时保留表中记录的侧重不同分为 左外连接 右外连接 和 全外连接
1. 左外连接 将左表中的所有记录分别与右表中的每条记录进行组合, 结果集中除返回内部连接的记录以外, 还在查询结果中返回左表中不符合条件的记录, 并在右表的相应列中填上 N U LL, 由于 b it 类型不允许为 N U LL, 就以 0 值填充
左外连接的语法格式如下 S ELECT 列名列表 FROM 表名 1 AS A LEFT [ OU TER] JOIN 表名 2 AS B ON A. 列名 = B. 列名
2. 右外连接 和左外连接类似, 右外连接是将左表中的所有记录分别与右表中的每条记录进行组合, 结果集中除返回内部连接的记录以外, 还在查询结果中返回右表中不符合条件的记录, 并在左表的相应列中填上 N U LL, 由于 b it 类型不允许为 N U LL, 就以 0 值填充
右外连接的语法格式如下 S ELECT 列名列表 FROM 表名 1 AS A RIGH T [ OU TER] JOIN 表名 2 AS B ON A. 列名 = B. 列名
3. 全外连接 全外连接是将左表中的所有记录分别与右表中的每条记录进行组合, 结果集中除返回内部连接的记录以外, 还在查询结果中返回两个表中不符合条件的记录, 并在左表或右表的相应列中填上 N U LL, b it 类型以 0 值填充
全外连接的语法格式如下 S ELECT 列名列表 FROM 表名 1 AS A FU LL [ OU TER] JOIN 表名 2 AS B ON A. 列名 = B. 列名
5.3.4 自连接 自连接就是一个表的两个副本之间的内连接 表名在 FROM 子句中出现两次, 必须对表指定不同的别名, 在 S ELECT 子句中引用的列名也要使用表的别名进行限定
5.3.5 合并结果集 U N ION 运算符用于将两个或多个检索结果合并成一个结果, 当使用 U N ION 时, 需遵循以下两个规则
( 1 ) 所有查询中的列数和列的顺序必须相同 ( 2 ) 所有查询中按顺序对应列的数据类型必须兼容
5.4 子查询 在 S QL 语言中, 当一个查询语句嵌套在另一个查询的查询条件之中时, 称为子查询 子查询总是写在圆括号中, 可以用在使用表达式的任何地方
5.4.1 比较测试中的子查询 比较测试中的子查询是指父查询与子查询之间用比较运算符进行连接 但是用户必须确切地知道子查询返回的是一个单值, 否则数据库服务器将报错
5.4.2 集合成员测试中的子查 询 集合成员测试中的子查询是指父查询与子查询之间用 IN 或 N OT IN 进行连接, 判断某个属性列值是否在子查询的结果中, 通常子查询的结果是一个集合
5.4.3 存在性测试中的子查询 存在性测试中的子查询只是检查子查询返回的结果集是否为空, 使用的关键字为 EXIS TS 或 N OT EXIS TS, 它产生逻辑真值 TRU E 或假值 FALS E 例如, 如果使用 EXIS TS 进行测试, 并且子查询返回的结果集不空, 则测试的结果为真值 TRU E
5.4.4 批量比较测试中的子查 询 1. 使用 AN Y 关键字的比较 测试 通过比较运算符将一个表达式的值或列值与子查询返回的一列值中的每一个进行比较, 只要有一次比较的结果为 TRU E, 则 AN Y 测试返回 TRU E
2. 使用 ALL 关键字的比较测试 通过比较运算符将一个表达式的值或列值与子查询返回的一列值中的每一个进行比较, 只要有一次比较的结果为 FALS E, 则 ALL 测试返回 FALS E
5.4.5 使用子查询向表中添加多 条记录 使用 IN S ERT S ELECT 语句可以一次向表中添加多条记录, 语法格式如下 IN S ERT 表名 [ ( 字段列表 ) ] S ELECT 字段列表 FROM 表名 WH ERE 条件表达式
5.5 使用 SQL Server Management Studio 进行数据查询与维护 对表中数据的维护操作, 可以在 S QL S e rve r M a n a g e m e n t S t u d io 中的查询设计器下进行, 如图 5-2 1 所示 5.5.1 查询设计器简介 在查询设计器中可以进行表的插入 删除 修改和查询操作
图 5-20 启动查询设计器
图 5-21 查询设计器窗口
5.5.2 查询设计器的应用实例 例 5-3 9 由客户信息表中, 给出深圳和上海的所有客户信息, 显示顺序按照姓名的升序排序
图 5-22 查询设计器界面
图 5-23 使用查询设计器进行查询