第 6章 Transact SQL语言
6,1 SQL简介
6,2 函数
6,3 使用 Select语句
6,4 使用 WHERE字句
6,5 使用 ORDER BY 字句
6,6 汇总数据
6,7 高级查询技巧
6.1 SQL语言简介
SQL( Structured Query Language) 意思为结构化查询语言,SQL语言的主要功能就是同各种数据库建立联系,进行沟通 。 在 SQL Server数据库中,Transact-
SQL语言由以下几部分组成:
( 1) 数据定义语言 ( DDL)
( 2) 数据操纵语言 ( DML)
( 3) 数据控制语言 ( DCL)
( 4) 流程控制语言 ( FCL)
( 5)其它语言要素 ( ADE)
返回目录
6.2 函数
函数的主要作用是用来帮助用户获得系统的有关信息,执行数学计算和统计功能,实现数据类型转换等操作 。 Transact-SQL编程语言提供了三种函数:
( 1) 集合函数:集合函数用于对一组值执行计算,并返回一个单一的值 。
( 2) 行集函数:行集函数可以在 Transact-
SQL语句中当作表引用 。
( 3) 数量函数:数量函数用于对传递给它的一个或者多个参数值进行处理和计算,并返回一个单一的值 。
本节主要介绍集合函数和数量函数。
返回目录
6.2.1 集合函数
集合函数对一个集合值进行操作,返回单个的数值 。
如求一个结果集合的最大值,平均值等 。 常用的集合函数如下:
1.SUM和 AVG
SUM和 AVG函数分别用于求表达式中所有值项的总和与平均值 。 其语法格式为:
SUM/AVG ( [ALL | DISTINCT] <expression>)
其中,expression是列名,可以是常量,列,函数或表达式,其数据类型只能是,int,smallint,tinyint、
bigint,decimal,numeric,float,real,money 和
smallmoney。 All表示对所有值进行运算,DISTINCT表示去除重复值,默认为 ALL。 SUM/AVG忽略 NULL值 。
【 例 6.1】 求样例数据库 pubs中每类书籍的 平均价格和预付款总和 。
返回目录
2,MAX和 MIN
MAX和 MIN分别用于求表达式中所有值项的最大值与最小值 。 其语法格式为:
MAX/MIN( [ALL | DISTINCT] <expression>)
其中,expression是列名,可以是常量,列,函数或表达式,其数据类型可以是数值型,字符型和日期型 。 All表示对所有值进行运算,DISTINCT表示去除重复值,默认为 ALL。 MAX/MIN忽略
NULL值 。
【 例 6.2】 求样例数据库 pubs中年度销售额最高的书 。
3,COUNT
COUNT函数用于统计组中满足条件的行数或总行数 。 其语法格式如下,
COUNT ( [ALL | DISTINCT] <expression>|*)
其中,expression是表达式,其数据类型是除 uniqueidentifier、
text,image或 ntext之外的任何类型 。 All表示对所有值进行运算,
DISTINCT表示去除重复值,默认为 ALL。 选择 *时将统计总行数 。
COUNT忽略 NULL值 。
返回目录
6.2.2 数量函数
常用的数量函数包括数值函数,日期时间函数,字符串函数,文本图像函数和系统函数 。
1,数值函数
数值函数用于对数字表达式进行数学运算并返回运算结果 。
( 1) ABS
ABS函数返回给定数字表达式的绝对值 。 语法格式为:
ABS( numeric_expression)
【 例 6.3】 显示 ABS函数对三个数字 8.0,-5.0和 0.3的不同效果 。
( 2) RAND
RAND函数返回 0-1之间的一个随机值 。 语法格式为:
RAND( [seed])
其中,参数 seed为整型表达式,返回值类型为 float。
返回目录
2,字符串函数
基本字符串函数,UPPER,LOWER,SPACE,REPLACE、
REPLICATE,STUFF,REVERSE,LTRIM,RTRIM。
字符串查找函数,CHARINDEX,PATINDEX。
长度和分析函数,DATALENGTH,SUBSTRING,RIGHT。
转换函数,ASCⅡ,CHAR,STR,SOUNDEX,DIFFERENCE
下面给出几个例子说明字符串函数的使用。
【 例 6.4】 --【 例 6.7】
返回目录
3,日期和时间函数
日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,用于处理 datatime和 smalldatetime类型的数据,并返回一个字符串,数字值或日期和时间值 。
( 1) DAY
DAY函数返回 date_expression 中的日期值,语法格式如下:
DAY (date_expression)
DAY函数使用整数值作参数,系统从 1900 年 1 月 1 日起往后数指定,整数值 +1天,再返回其日期 。
( 2) MONTH
MONTH返回 date_expression中的月份值,函数语法格式如下:
MONTH(date_expression)
与 DAY函数不同的是,MONTH函数的参数为整数时,一律返回整数值 1。 即 SQL Server认为其是 1900年 1月 。
( 3) YEAR
YEAR函数返回 date_expression 中的年份值,语法格式如下:
YEAR(date_expression)
返回目录
6.3使用 Select语句
6.3.1使用 Select 语句的基本介绍
SELECT语句是是查询数据的基本方法 。 SELECT语句可以从数据库中查询行,并允许从一个或多个表中选择一个或多个行或列 。
SELECT语句主要子句格式可归纳如下,
SELECT [DISTINCT][TOP n] 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]]
[COMPUTE expression]
其中,[ ]表示可选项。 返回目录
SELECT语句中各子句的作用如下:
① SELECT字句,指定由查询返回的列 。
② INTO字句,创建新表并将结果行从查询插入新表中 。
③ FROM字句,指定从其中查询行的表 。
④ WHERE字句,指定用于限制返回的行的搜索条件 。
⑤ GROUP BY字句,指定查询结果的分组条件 。
⑥ HAVING字句,指定组或聚合的搜索条件 。
⑦ ORDER BY字句,指定结果集的排序方式 。
⑧ COMPUTE子句,在结果集的末尾生成一个汇总数据行。
返回目录
6.3.2 查询特定列的信息
从表中查询特定列的信息的 SELECT语句主要的用法是:
SELECT [DISTINCT][TOP n] {*|{column_name|expression}[[ AS]
column_alias]}[,...n ]
FROM table_source
其中,[ ]表示可选项,{ }表示必选项,| 表示只能选一项,
[,...n ]表示前面的项可重复 n 次 。
语法选项说明:
① *,表示表中所有的列 。
② column_name,列名
③ expression( 表达式 ),是列名,常量,函数以及由运算符连接的列名,常量和函数的任意组合,者是子查询 。
④ AS column_alias,为列名取一个别名 。 显示查询结果时,别名将代替列名 。
⑤ table_source,指定要查询的 表 ( 包括视图,派生表和联接表 ) 。
⑥ DISTINCT,指定在查询结果集中只能显示唯一行
⑦ TOP n,指定只从查询结果集中输出前 n行 。
【 例 6.8-6.10】 查询特定列 。 返回目录
6.3.3使用算术运算符
在 SELECT语句中,在列出现的位置上,可以使用
expression,expression是列名、常量、函数以及由运算符连接的列名、常量和函数的任意组合。所以,可以使用算术运算符操纵列,对查询结果进行计算。这些算术运算符包括,+(加)、-(减),*(乘),/
(除)和 %(取模)。
【 例 6.11-6.12】 使用算术运算符
返回目录
6,4使用 WHERE字句
使用 SELECT语句查询数据,一般只是从表中筛选出想要的数据,这就要用到 WHERE子句 。 带 WHERE子句的 SELECT语句的主要用法是:
SELECT select_list
FROM table_source
WHERE search_condition
其中,search_condition指定筛选数据行的条件,
search_condition是由表达式以及逻辑运算符等组成的 。
返回目录
search_condition支持的运算符如下表所示 。
返回目录操作符 作用
=,>,〈,〉 =,〈 =,〈 〉,!=,!〈,!〉 比较运算符
BETWEEN,NOT BETWEEN 值是否在范围之内
IN,NOT IN 值是否属于列表值之一
LIKE,NOT LIKE 字符串匹配运算符
IS NULL,IS NOT NULL 值是否为 NULL
6,4使用 WHERE字句
6.4.1 比较运算符
在 WHERE子句中,可以使用 =,>,〈,〉 =,〈 =,〈 〉,!=,!
〈,!〉 等比较运算符对两个表达式进行比较,并以比较结果作为筛选的条件 。 用法是:
SELECT select_list
FROM table_source
WHERE expression OPERATOR expession
其中,OPERATOR为比较运算符 。
【 例 6.13--6.14】
6.4.2 BETWEEN关键字
在 WHERE子句中,可以使用 BETWEEN,NOT BETWEEN两个运算符来确定表达式的取值是否在范围之内,并以此作为筛选的条件 。 用法是:
SELECT select_list
FROM table_source
WHERE expression [NOT] BETWEEN expression AND expression
其中,[ ]表示可选项。
【 例 6.15--6.16】
返回目录
6.4.3 IN关键字
在 WHERE子句中,可以使用 IN,NOT IN两个运算符来确定表达式的取值是否属于列表值之一,并以此作为筛选的条件 。 用法是:
SELECT select_list
FROM table_source
WHERE expression [NOT] IN (value_list)
其中,[ ]表示可选项,value_list表示值列表,若有多个值,值之间用逗号分隔。 【 例 6.17--6.18】
6.4.4 LIKE关键字
在 WHERE子句中,可以使用 LIKE,NOT LIKE两个运算符来把表达式与 字符串进行比较,并以此作为筛选的条件 。 用法是:
SELECT select_list
FROM table_source
WHERE expression [NOT] LIKE 'string'
其中,[ ]表示可选项,string表示用来进行比较的字符串 。
【 例 6.19--6.22】
返回目录
6.5使用 ORDER BY 字句
使用 ORDER BY子句,可以对查询的结果进行排序 。 带
ORDER BY子句的 SELECT语句的主要用法是:
SELECT select_list
FROM table_source
ORDER BY {expression [DESC]}[,...n]
其中,[ ]表示可选项; { }表示必选项; [,...n ]表示前面的项可重复 n次; expression指定要排序的列,可以是列名或列的别名和表达式; DESC表示降序 。
【 例 6.23--6.25】
返回目录
6.6 汇总数据
汇总函数会将某个特定的一组数值进行计算并将结果以单一值来返回 。 除了 count函数之外,其余的汇总函数会忽略所有 Null的值 。 — 般来说,其汇总函数通常会与
SELECT语句中的 GROUP BY一起使用 。 要使用汇总函数之前,
必须要注意总和并不是适用在每一个 TRANSACT-SQL语句中使用,它只能在如下所示的语句或子句中来使用:
(1)SELECT语句的选择列表 (子查询或外部查询 )。
(2)COMPUTE或 COMPUTE BY子句 。
(3)HAVING 子句 。
返回目录
6.6.1合计函数
合计函数在函数执行过程中对某一数据集中的数据进行合计或联合,执行完毕后的输出结果是一个简单的数值。典型的合计函数是 COUNT(),SUM(),AVG
(),MAX()和 MIN()。
返回目录
6.6.2 GROUP BY 和 HAVING子句
1,GROUP BY子句
GROUP BY子句通常用于对某一个数据集的子集或其中的一组数据进行合计运算,GROUP BY子句包含以下组件:
( 1) — 个或多个自由集合的表达式 。 通常是对分组列的引用 。
( 2) ALL关键字 (可选 ),该关键字指定返回由 GROUP BY子句产生的所有组,即使某些组没有符合搜索条件的行 。
( 3) CUBE或 ROLLUP。 在 GROUP BY子句中,必须指定表或视图列的名称,而不是使用 AS子句指派的结果集列的名称 。。
2.HAVING子句
HAVING子句指定组或集合的搜索条件,HAVING通常与 GROUP BY
一起使用 。 如果不使用 GROUP BY子句,HAVING的行为与 WHERE子句一样 。 HAVING子句的语法格式如下:
[HAVING< search_condition> ]
参数 search_condition指定组或集合应满足的搜索条件 。
返回目录
6.6.3 COMPUTE和 COMPUTEBY子句
GROUP BY有一个缺点,就是返回的结果集中只有合计数据,而不是原始的详细记录 。 在 SQL Server中完成这项工作可以使用 COMPUTE BY子句 。 COMPUTE子句的语法格式如下:
[ COMPUTE
{ { AVG | COUNT | MAX | MIN | STDEV | STDEVP
| VAR | VARP | SUM }
( expression ) } [,...n ]
[ BY expression [,...n ] ]
6.6.4 ROLLUP和 CUBE选项
SQL Server 2000中有许多生成合计数据的方法,当这些选择产生相关的结果输出时,却很难解释说明。 ROLLUP关键字对 GROUP BY子句中的列按不同的等级进行分组,然后对这些分组进行合计。 CUBE关键字则创建所有可能的分组,然后对这些组进行合计。我们建议使用这两个函数,以确保数据库设计原型能不断改进,确保在数据库中查询到的信息能按要求生成输出报表。
返回目录
6.7高级查询技巧
6.7.1 联合查询
联合查询就是使用 UNION字句将来自不同查询的结果合并成为一个结果,UNION会自动将重复的数据行删除 。
带 UNION子句的 SELECT语句的主要用法是:
SELECT select_list FROM table_source [WHERE search_condition]
{UNION
SELECT select_list FROM table_source [WHERE search_condition] }
[,...n ]
ORDER BY {order_by_expression [DESC]}[,...n]
其中,[ ]表示可选项; { }表示必选项; [,...n ]表示前面的项可重复 n次
【 例 6.26--6.27】
返回目录
6.7.2连接查询
在进行一个查询时,用户往往需要从多个表中查询相关数据,这就需要用到连接查询 。 连接查询的主要用法是:
SELECT select_list FROM first_table join_type second_table [ON
(join_condition)]
[WHERE search_condition]
[ORDER BY order_expression [DESC]]
其中,join_type指定所执行的连接类型; join_condition指定连接条件 。
连接类型可分为内联接 (INNER JOIN),外联接 (OUTER JOIN)和交叉联接 (CROSS JOIN)三类 。
1 内连接 (INNER JOIN)
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行 。
它所使用比较算符有 =,>,<,> =,< =,! =,< >,! >,! <等 。
【 例 6.28--6.29】
返回目录
2 外连接 (OUTER JOIN)
外部连接中,参与连接的表有主从之分,以主表的每行数据去匹配从表的数据行,符合连接条件的数据将直接返回到查询结果中;如果主表的行在从表中没有相匹配的行,与内连接丢弃不匹配行的做法不同,主表的行不会被丢弃,而是也返回到查询结果中,相对应的从表的行的列位置将被填上 NULL值后再返回到结果集中 。
外连接又可分为左连接 (LEFT OUTER JOIN),右连接 (RIGHT
OUTER JOIN)和完全连接 (FULL OUTER JOIN)。
(1) 左外连接 (LEFT OUTER JOIN)
以连结左边的表作为主表 。
(2) 右外连接 (RIGHT OUTER JOIN)
以连结左边的表作为主表。
(2) 右外连接 (RIGHT OUTER JOIN)
以连结左边的表作为主表。 【 例 6.30--6.31】
3,交叉连接 (CROSS JOIN)
交叉连接产生的查询结果的行数为第一个表的行数乘以第二个表的行数,即笛卡尔积。 【 例 6.33】
返回目录
6.7.3 子查询
子查询是一个包含在另一条 SELECT语句里的 SELECT语句 。 外层的 SELECT语句叫外部查询,内层的 SELECT语句叫内部查询 ( 或子查询 ) 。 通常,任何允许使用表达式的地方都可以使用子查询 。
包括子查询的 SELECT语句主要采用以下格式中的一种:
① WHERE expression [NOT] IN (subquery)
② WHERE expression comparison_operator [ANY | ALL] (subquery)
③ WHERE [NOT] EXISTS (subquery)
1 使用 IN的子查询
使用 IN( 或 NOT IN) 引入的子查询返回的查询结果是一列零值或更多值 。 子查询返回结果之后,外部查询可以使用这些结果 。 其格式为:
WHERE expression [NOT] IN (subquery)
返回目录
2 使用比较运算符的子查询
子查询可由一个比较运算符引入 。 比较运算符可以是 =、
< >,>,> =,<,!>,! < 或 < =等等 。 其格式为:
WHERE expression comparison_operator [ANY | ALL] (subquery)
其中,comparison_operator为比较运算符,ALL表示子查询 subquery返回的查询结果中的每一个值,ANY表示子查询中的任意一个值。
【 例 6.35--6.37】
3,使用 EXISTS 的子查询
使用 EXISTS(或 NOT EXISTS)关键字引入一个子查询时,
就相当于进行一次存在测试 。 外部查询的 WHERE子句测试子查询返回的行是否存在 。 子查询实际上不产生任何数据;它只返回 TRUE 或 FALSE 值 。
其格式:
WHERE [NOT] EXISTS (subquery)
【 例 6.38】
返回目录
6.7.4 基于查询生成新表
有时候可能需要将查询结果保存下来,使用 INTO
子句可以生成一个新表并将查询结果保存在这个新表中 。 其主要用法是:
SELECT select_list
INTO new_table
FROM table_source [WHERE search_condition]
其中,new_table为要新建的表的名称 。
【 例 6.39】
返回目录
6,1 SQL简介
6,2 函数
6,3 使用 Select语句
6,4 使用 WHERE字句
6,5 使用 ORDER BY 字句
6,6 汇总数据
6,7 高级查询技巧
6.1 SQL语言简介
SQL( Structured Query Language) 意思为结构化查询语言,SQL语言的主要功能就是同各种数据库建立联系,进行沟通 。 在 SQL Server数据库中,Transact-
SQL语言由以下几部分组成:
( 1) 数据定义语言 ( DDL)
( 2) 数据操纵语言 ( DML)
( 3) 数据控制语言 ( DCL)
( 4) 流程控制语言 ( FCL)
( 5)其它语言要素 ( ADE)
返回目录
6.2 函数
函数的主要作用是用来帮助用户获得系统的有关信息,执行数学计算和统计功能,实现数据类型转换等操作 。 Transact-SQL编程语言提供了三种函数:
( 1) 集合函数:集合函数用于对一组值执行计算,并返回一个单一的值 。
( 2) 行集函数:行集函数可以在 Transact-
SQL语句中当作表引用 。
( 3) 数量函数:数量函数用于对传递给它的一个或者多个参数值进行处理和计算,并返回一个单一的值 。
本节主要介绍集合函数和数量函数。
返回目录
6.2.1 集合函数
集合函数对一个集合值进行操作,返回单个的数值 。
如求一个结果集合的最大值,平均值等 。 常用的集合函数如下:
1.SUM和 AVG
SUM和 AVG函数分别用于求表达式中所有值项的总和与平均值 。 其语法格式为:
SUM/AVG ( [ALL | DISTINCT] <expression>)
其中,expression是列名,可以是常量,列,函数或表达式,其数据类型只能是,int,smallint,tinyint、
bigint,decimal,numeric,float,real,money 和
smallmoney。 All表示对所有值进行运算,DISTINCT表示去除重复值,默认为 ALL。 SUM/AVG忽略 NULL值 。
【 例 6.1】 求样例数据库 pubs中每类书籍的 平均价格和预付款总和 。
返回目录
2,MAX和 MIN
MAX和 MIN分别用于求表达式中所有值项的最大值与最小值 。 其语法格式为:
MAX/MIN( [ALL | DISTINCT] <expression>)
其中,expression是列名,可以是常量,列,函数或表达式,其数据类型可以是数值型,字符型和日期型 。 All表示对所有值进行运算,DISTINCT表示去除重复值,默认为 ALL。 MAX/MIN忽略
NULL值 。
【 例 6.2】 求样例数据库 pubs中年度销售额最高的书 。
3,COUNT
COUNT函数用于统计组中满足条件的行数或总行数 。 其语法格式如下,
COUNT ( [ALL | DISTINCT] <expression>|*)
其中,expression是表达式,其数据类型是除 uniqueidentifier、
text,image或 ntext之外的任何类型 。 All表示对所有值进行运算,
DISTINCT表示去除重复值,默认为 ALL。 选择 *时将统计总行数 。
COUNT忽略 NULL值 。
返回目录
6.2.2 数量函数
常用的数量函数包括数值函数,日期时间函数,字符串函数,文本图像函数和系统函数 。
1,数值函数
数值函数用于对数字表达式进行数学运算并返回运算结果 。
( 1) ABS
ABS函数返回给定数字表达式的绝对值 。 语法格式为:
ABS( numeric_expression)
【 例 6.3】 显示 ABS函数对三个数字 8.0,-5.0和 0.3的不同效果 。
( 2) RAND
RAND函数返回 0-1之间的一个随机值 。 语法格式为:
RAND( [seed])
其中,参数 seed为整型表达式,返回值类型为 float。
返回目录
2,字符串函数
基本字符串函数,UPPER,LOWER,SPACE,REPLACE、
REPLICATE,STUFF,REVERSE,LTRIM,RTRIM。
字符串查找函数,CHARINDEX,PATINDEX。
长度和分析函数,DATALENGTH,SUBSTRING,RIGHT。
转换函数,ASCⅡ,CHAR,STR,SOUNDEX,DIFFERENCE
下面给出几个例子说明字符串函数的使用。
【 例 6.4】 --【 例 6.7】
返回目录
3,日期和时间函数
日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,用于处理 datatime和 smalldatetime类型的数据,并返回一个字符串,数字值或日期和时间值 。
( 1) DAY
DAY函数返回 date_expression 中的日期值,语法格式如下:
DAY (date_expression)
DAY函数使用整数值作参数,系统从 1900 年 1 月 1 日起往后数指定,整数值 +1天,再返回其日期 。
( 2) MONTH
MONTH返回 date_expression中的月份值,函数语法格式如下:
MONTH(date_expression)
与 DAY函数不同的是,MONTH函数的参数为整数时,一律返回整数值 1。 即 SQL Server认为其是 1900年 1月 。
( 3) YEAR
YEAR函数返回 date_expression 中的年份值,语法格式如下:
YEAR(date_expression)
返回目录
6.3使用 Select语句
6.3.1使用 Select 语句的基本介绍
SELECT语句是是查询数据的基本方法 。 SELECT语句可以从数据库中查询行,并允许从一个或多个表中选择一个或多个行或列 。
SELECT语句主要子句格式可归纳如下,
SELECT [DISTINCT][TOP n] 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]]
[COMPUTE expression]
其中,[ ]表示可选项。 返回目录
SELECT语句中各子句的作用如下:
① SELECT字句,指定由查询返回的列 。
② INTO字句,创建新表并将结果行从查询插入新表中 。
③ FROM字句,指定从其中查询行的表 。
④ WHERE字句,指定用于限制返回的行的搜索条件 。
⑤ GROUP BY字句,指定查询结果的分组条件 。
⑥ HAVING字句,指定组或聚合的搜索条件 。
⑦ ORDER BY字句,指定结果集的排序方式 。
⑧ COMPUTE子句,在结果集的末尾生成一个汇总数据行。
返回目录
6.3.2 查询特定列的信息
从表中查询特定列的信息的 SELECT语句主要的用法是:
SELECT [DISTINCT][TOP n] {*|{column_name|expression}[[ AS]
column_alias]}[,...n ]
FROM table_source
其中,[ ]表示可选项,{ }表示必选项,| 表示只能选一项,
[,...n ]表示前面的项可重复 n 次 。
语法选项说明:
① *,表示表中所有的列 。
② column_name,列名
③ expression( 表达式 ),是列名,常量,函数以及由运算符连接的列名,常量和函数的任意组合,者是子查询 。
④ AS column_alias,为列名取一个别名 。 显示查询结果时,别名将代替列名 。
⑤ table_source,指定要查询的 表 ( 包括视图,派生表和联接表 ) 。
⑥ DISTINCT,指定在查询结果集中只能显示唯一行
⑦ TOP n,指定只从查询结果集中输出前 n行 。
【 例 6.8-6.10】 查询特定列 。 返回目录
6.3.3使用算术运算符
在 SELECT语句中,在列出现的位置上,可以使用
expression,expression是列名、常量、函数以及由运算符连接的列名、常量和函数的任意组合。所以,可以使用算术运算符操纵列,对查询结果进行计算。这些算术运算符包括,+(加)、-(减),*(乘),/
(除)和 %(取模)。
【 例 6.11-6.12】 使用算术运算符
返回目录
6,4使用 WHERE字句
使用 SELECT语句查询数据,一般只是从表中筛选出想要的数据,这就要用到 WHERE子句 。 带 WHERE子句的 SELECT语句的主要用法是:
SELECT select_list
FROM table_source
WHERE search_condition
其中,search_condition指定筛选数据行的条件,
search_condition是由表达式以及逻辑运算符等组成的 。
返回目录
search_condition支持的运算符如下表所示 。
返回目录操作符 作用
=,>,〈,〉 =,〈 =,〈 〉,!=,!〈,!〉 比较运算符
BETWEEN,NOT BETWEEN 值是否在范围之内
IN,NOT IN 值是否属于列表值之一
LIKE,NOT LIKE 字符串匹配运算符
IS NULL,IS NOT NULL 值是否为 NULL
6,4使用 WHERE字句
6.4.1 比较运算符
在 WHERE子句中,可以使用 =,>,〈,〉 =,〈 =,〈 〉,!=,!
〈,!〉 等比较运算符对两个表达式进行比较,并以比较结果作为筛选的条件 。 用法是:
SELECT select_list
FROM table_source
WHERE expression OPERATOR expession
其中,OPERATOR为比较运算符 。
【 例 6.13--6.14】
6.4.2 BETWEEN关键字
在 WHERE子句中,可以使用 BETWEEN,NOT BETWEEN两个运算符来确定表达式的取值是否在范围之内,并以此作为筛选的条件 。 用法是:
SELECT select_list
FROM table_source
WHERE expression [NOT] BETWEEN expression AND expression
其中,[ ]表示可选项。
【 例 6.15--6.16】
返回目录
6.4.3 IN关键字
在 WHERE子句中,可以使用 IN,NOT IN两个运算符来确定表达式的取值是否属于列表值之一,并以此作为筛选的条件 。 用法是:
SELECT select_list
FROM table_source
WHERE expression [NOT] IN (value_list)
其中,[ ]表示可选项,value_list表示值列表,若有多个值,值之间用逗号分隔。 【 例 6.17--6.18】
6.4.4 LIKE关键字
在 WHERE子句中,可以使用 LIKE,NOT LIKE两个运算符来把表达式与 字符串进行比较,并以此作为筛选的条件 。 用法是:
SELECT select_list
FROM table_source
WHERE expression [NOT] LIKE 'string'
其中,[ ]表示可选项,string表示用来进行比较的字符串 。
【 例 6.19--6.22】
返回目录
6.5使用 ORDER BY 字句
使用 ORDER BY子句,可以对查询的结果进行排序 。 带
ORDER BY子句的 SELECT语句的主要用法是:
SELECT select_list
FROM table_source
ORDER BY {expression [DESC]}[,...n]
其中,[ ]表示可选项; { }表示必选项; [,...n ]表示前面的项可重复 n次; expression指定要排序的列,可以是列名或列的别名和表达式; DESC表示降序 。
【 例 6.23--6.25】
返回目录
6.6 汇总数据
汇总函数会将某个特定的一组数值进行计算并将结果以单一值来返回 。 除了 count函数之外,其余的汇总函数会忽略所有 Null的值 。 — 般来说,其汇总函数通常会与
SELECT语句中的 GROUP BY一起使用 。 要使用汇总函数之前,
必须要注意总和并不是适用在每一个 TRANSACT-SQL语句中使用,它只能在如下所示的语句或子句中来使用:
(1)SELECT语句的选择列表 (子查询或外部查询 )。
(2)COMPUTE或 COMPUTE BY子句 。
(3)HAVING 子句 。
返回目录
6.6.1合计函数
合计函数在函数执行过程中对某一数据集中的数据进行合计或联合,执行完毕后的输出结果是一个简单的数值。典型的合计函数是 COUNT(),SUM(),AVG
(),MAX()和 MIN()。
返回目录
6.6.2 GROUP BY 和 HAVING子句
1,GROUP BY子句
GROUP BY子句通常用于对某一个数据集的子集或其中的一组数据进行合计运算,GROUP BY子句包含以下组件:
( 1) — 个或多个自由集合的表达式 。 通常是对分组列的引用 。
( 2) ALL关键字 (可选 ),该关键字指定返回由 GROUP BY子句产生的所有组,即使某些组没有符合搜索条件的行 。
( 3) CUBE或 ROLLUP。 在 GROUP BY子句中,必须指定表或视图列的名称,而不是使用 AS子句指派的结果集列的名称 。。
2.HAVING子句
HAVING子句指定组或集合的搜索条件,HAVING通常与 GROUP BY
一起使用 。 如果不使用 GROUP BY子句,HAVING的行为与 WHERE子句一样 。 HAVING子句的语法格式如下:
[HAVING< search_condition> ]
参数 search_condition指定组或集合应满足的搜索条件 。
返回目录
6.6.3 COMPUTE和 COMPUTEBY子句
GROUP BY有一个缺点,就是返回的结果集中只有合计数据,而不是原始的详细记录 。 在 SQL Server中完成这项工作可以使用 COMPUTE BY子句 。 COMPUTE子句的语法格式如下:
[ COMPUTE
{ { AVG | COUNT | MAX | MIN | STDEV | STDEVP
| VAR | VARP | SUM }
( expression ) } [,...n ]
[ BY expression [,...n ] ]
6.6.4 ROLLUP和 CUBE选项
SQL Server 2000中有许多生成合计数据的方法,当这些选择产生相关的结果输出时,却很难解释说明。 ROLLUP关键字对 GROUP BY子句中的列按不同的等级进行分组,然后对这些分组进行合计。 CUBE关键字则创建所有可能的分组,然后对这些组进行合计。我们建议使用这两个函数,以确保数据库设计原型能不断改进,确保在数据库中查询到的信息能按要求生成输出报表。
返回目录
6.7高级查询技巧
6.7.1 联合查询
联合查询就是使用 UNION字句将来自不同查询的结果合并成为一个结果,UNION会自动将重复的数据行删除 。
带 UNION子句的 SELECT语句的主要用法是:
SELECT select_list FROM table_source [WHERE search_condition]
{UNION
SELECT select_list FROM table_source [WHERE search_condition] }
[,...n ]
ORDER BY {order_by_expression [DESC]}[,...n]
其中,[ ]表示可选项; { }表示必选项; [,...n ]表示前面的项可重复 n次
【 例 6.26--6.27】
返回目录
6.7.2连接查询
在进行一个查询时,用户往往需要从多个表中查询相关数据,这就需要用到连接查询 。 连接查询的主要用法是:
SELECT select_list FROM first_table join_type second_table [ON
(join_condition)]
[WHERE search_condition]
[ORDER BY order_expression [DESC]]
其中,join_type指定所执行的连接类型; join_condition指定连接条件 。
连接类型可分为内联接 (INNER JOIN),外联接 (OUTER JOIN)和交叉联接 (CROSS JOIN)三类 。
1 内连接 (INNER JOIN)
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行 。
它所使用比较算符有 =,>,<,> =,< =,! =,< >,! >,! <等 。
【 例 6.28--6.29】
返回目录
2 外连接 (OUTER JOIN)
外部连接中,参与连接的表有主从之分,以主表的每行数据去匹配从表的数据行,符合连接条件的数据将直接返回到查询结果中;如果主表的行在从表中没有相匹配的行,与内连接丢弃不匹配行的做法不同,主表的行不会被丢弃,而是也返回到查询结果中,相对应的从表的行的列位置将被填上 NULL值后再返回到结果集中 。
外连接又可分为左连接 (LEFT OUTER JOIN),右连接 (RIGHT
OUTER JOIN)和完全连接 (FULL OUTER JOIN)。
(1) 左外连接 (LEFT OUTER JOIN)
以连结左边的表作为主表 。
(2) 右外连接 (RIGHT OUTER JOIN)
以连结左边的表作为主表。
(2) 右外连接 (RIGHT OUTER JOIN)
以连结左边的表作为主表。 【 例 6.30--6.31】
3,交叉连接 (CROSS JOIN)
交叉连接产生的查询结果的行数为第一个表的行数乘以第二个表的行数,即笛卡尔积。 【 例 6.33】
返回目录
6.7.3 子查询
子查询是一个包含在另一条 SELECT语句里的 SELECT语句 。 外层的 SELECT语句叫外部查询,内层的 SELECT语句叫内部查询 ( 或子查询 ) 。 通常,任何允许使用表达式的地方都可以使用子查询 。
包括子查询的 SELECT语句主要采用以下格式中的一种:
① WHERE expression [NOT] IN (subquery)
② WHERE expression comparison_operator [ANY | ALL] (subquery)
③ WHERE [NOT] EXISTS (subquery)
1 使用 IN的子查询
使用 IN( 或 NOT IN) 引入的子查询返回的查询结果是一列零值或更多值 。 子查询返回结果之后,外部查询可以使用这些结果 。 其格式为:
WHERE expression [NOT] IN (subquery)
返回目录
2 使用比较运算符的子查询
子查询可由一个比较运算符引入 。 比较运算符可以是 =、
< >,>,> =,<,!>,! < 或 < =等等 。 其格式为:
WHERE expression comparison_operator [ANY | ALL] (subquery)
其中,comparison_operator为比较运算符,ALL表示子查询 subquery返回的查询结果中的每一个值,ANY表示子查询中的任意一个值。
【 例 6.35--6.37】
3,使用 EXISTS 的子查询
使用 EXISTS(或 NOT EXISTS)关键字引入一个子查询时,
就相当于进行一次存在测试 。 外部查询的 WHERE子句测试子查询返回的行是否存在 。 子查询实际上不产生任何数据;它只返回 TRUE 或 FALSE 值 。
其格式:
WHERE [NOT] EXISTS (subquery)
【 例 6.38】
返回目录
6.7.4 基于查询生成新表
有时候可能需要将查询结果保存下来,使用 INTO
子句可以生成一个新表并将查询结果保存在这个新表中 。 其主要用法是:
SELECT select_list
INTO new_table
FROM table_source [WHERE search_condition]
其中,new_table为要新建的表的名称 。
【 例 6.39】
返回目录