第二章 sql语言结构------select语句详解
select语句
1)数据检索是数据库中最频繁执行的活动
2)在sql中,使用select语句可以在需要的表单中检索数据
3)再进行检索之前,必须知道需要的数据存储在哪里
4)select语句可以由多个查询子句组成
select语句可用于检索:
1)全部的行和列
2)全部的行和特定的列
3)限定范围的行
4)与一组值匹配的行
5)根据未知值检索的行
6)隐藏有重复值的行
7)根据多个搜索条件检索的行
select语句的基本结构
select [all | distinct] select_list [ into [ new_table_name ] ] from { table_name | view_name } [ [, {table_name2 | view_name2} [ ...., { table_name16 | view_name16 } ] ] [ where search_conditions ] [group by group_by_list] [ having search_conditions ] [ order by order_list [ asc | desc ] ]
各参数解释
1)all 指明查询结果可以显示值相同的列.all是系统默认的
2)distinct 指明查询结果中如果有值相同的列,则只显示其中的一列.对distinct来说,null值被认为是相同的列
3)select_list需要检索的字段的列表,字段名称之间用逗号分隔.这个列表中既可以包含数据源或视图中的字段名称,还可以包含其他表达式.如用* ,则系统返回数据表中所有的字段
4)select子句 指定需要通过查询返回的表的列.其语法如下: select [all | distinct ] [ top n ] < select_list>
5)top n [persent ] 指明返回查询结果的前n行数据,如果percent关键字指定的话,则返回查询结果的前百分之n行的数据
6)into子句 用于把查询结果存放到一个新建的表中.select...into句式不能与compute子句一起使用.其语法 into new_table
7)from子句
8)where子句
1>比较查询条件 text/ntext和image数据类型不能与比较运算符组合成查询条件.
2>模式查询条件like /not like
通配符
* 匹配任意字符串
? 匹配任意一个字符
% 由0个或更多个字符组成的任意字符串
- 任意单个字符
[] 用于指定范围,例如[a - f ] 表示a到f范围内的任何单个字符
[^]表示指定范围,例如[^a-f]表示a到f范围以外的任何单个字符
如果用户要查找的数据中本身就包含了通配符,如sql_Mail,就需要使用转义字符来区分通配符与实际存在的字符.
格式 like 字符匹配串 escape 转义字符
例;查找对象名称为SQL_M开头,il结尾,中间有一个不确定字符的对象
select * from objects where objecct_name like 'SQL#_M_il' escape '#'
上例中使用了两个下划线_符号,前一个下划线由于有逃逸字符在其前面作标志,因而被认为是实际存在的下划线字符;后一个下划
线没有逃逸字符在其前面作标识,因此将它作为通配符
使用[]来将通配符指定为普通字符
select * from object where columnl like '%54[%]%' 将返回所有包含54%的字符串
9)group by 子句 指定查询结果的分组条件,其语法如下: group by [ all ] group_by_expression [ , ......n ] [ with { cube | rollup } ]
各参数说明 group_by_expression 指明分组条件 通常是一个列名,但不能是列的别名.数据类型为text ntext image 或bit类型的列不能作为分组条件
all 返回所有可能的查询结果组合,即使此组合中没有任何满足where子句的数据. 分组的统计列如果不满足查询条件,则将由null值构成期数据.all选项不恩与cube或rollup选项同时使用
cube 除了返回由group by子句指定的列外,还返回按组统计的行.返回结果先按分组的第一个条件列排序显示,再按第二个条件列排序显示,以此类推.统计行包括了group by 子句指定那个列的各种组合的数据统计
rollup 与cube不同的是,此选项对group by 子句中的列顺序敏感,它只返回第一个分组条件指定的列的统计行,改变列的顺序会是返回的结果的行数发生变化.
10) having 子句 指定分组搜索条件.having子句通常与group by 子句一起使用.text ntext 和image数据类型不能用于having子句.其语法格式 having < search_condition>
having子句与where子句很相似,其区别在于其作用的对象不同.where子句作用于表和视图,having子句作用于组
11)order by 子句 指定查询结果的排序方式 语法格式 order by { order_by_expression [asc | desc ] } [ , ....n]
各参数说明如下:
order_by_expression 指定排序的规则 可以是表或视图的名称或别名.
asc 指明查询结果按升序排列,这是系统默认值
desc 指定查询结果按降序排列
例: select top 3 e_name,e_wage from employee order by e_wage desc
12)compute子句 指在查询结果的末尾生成一个汇总数据行,其语法如下: compute { { AVG | COUNT | MAX | SUM } ( expression ) } [,....n ] [ by expression [ , ... n ] ]
各参数说明如下 avg | count | max | min | sum 以上参数与对应的函数有相同的含义,这些函数均会忽略NULL值且DISTINCT选项不能在此使用
expression 指定需要统计的列的名称,此列必须包含与select列表中,且不能用别名. compute子句中也不能使用
text ntext image 数据类型
汇总函数: 把一列中的值进行汇总计算,返回单值的函数.
五个预定义的聚合函数
平均值 avg
最小值 min
总和 sum
最大值 max
计数 count
count(*) 把相同的记录个数都找出来
count(distinct)把不同的记录个数找出来
by expression 在查询结果中生成分类统计的行.如果使用此选项,则必须是同时使用ordere by 子句.expression
对应order by 子句中的order_by_expression的子集或全集
13)union子句 union操作符将两个或两个以上的查询结果合并成一个结果集.它与使用联接查询合并两个表的列是不同的,使用union操作符合并查询结果需要遵循两个基本规则: 1>列的数目和顺序在所有查询结果中必须是一致的 2>数据类型必须兼容
语法: select 语句 union [ all ] select 语句
注意: 1>使用union子句获得的结果集的字段名称与union运算符之前的select语句结果集中的字段名相同. union运算符之后的select语句结果集的字段名将被忽略. 2> 在默认情况下,union运算符将从最终结果集中删除重复的记录,如果希望最终结果中保留所有的记录,则必须使用all关键字 3> 在使用union运算符时,单独的select语句不能包含其自己的order by
或compute子句.只能在最后一个select语句的后面使用一个order by或compute子句,该子句将适用于最终的组合结果集 4> 若需要对查询结果进行分组以及在分组后对结果使用having子句进行过滤,则必须在单独的select语句中指定group by 和having子句