Ⅶ、compute子句
compute子句在查询结果的末尾生成一个汇总数据行,其语法如下:compute{{AVG|count|max|min|sum}(expression)}[,···n][]by expression [,···n]
参数:
AVG|count|max|min|sum这些参数与对应的函数有相同的含义expression:指定需要统计的列的名称,此列必须包含于select列表中,且不能用别名。compute子句中也不能使用txt,ntext和image数据类型
by expression :在查询结果中生成分类统计的行。如果使用此选项,则必须同时使用order by 子句。expression是对应的order by 子句中的order_by_expression的子集或全集
备注:汇总函数
把一列中的值进行汇总运算,返回单指的函数五个预定义的聚合函数
平均值:avg
总和:sum
最大值:max
最小值:min
计数:count
count(*) 、count(distinct)汇总函数忽略null
count:count函数将忽略对象中的空值,而count(*)函数则将所有符号条件的记录都计算在内
sum 忽略求和对象中的空值
avg:忽略求和对象中的空值
max/min :忽略求和对象中的空值
Ⅷ、union子句
union操作符将两个或两个以上的查询结果合并为一个结果集。它与使用连接查询合并两个 表的列是不同的,使用union操作符合并查询结果需要遵循两个基本规则:列的数目和顺序在所有查询中必须是一致的;数据类型必须兼容
语法:select语句 union [all] select语句注意:使用union子句获得的结果集的字段名称与union运算符之前的select语句结果集中的字段名相同,union运算符之后的select语句结束集的字段名将被忽略
在默认情况下,union运算符将从最终结果集中删除重复的记录。如果希望最终结果集保留所有的记录,则必须使用all关键字。
在使用union运算符时,单独的select语句中不能包含其自己的order by或coumpute子句只能在最后一个select语句的后面使用一个order by 或 coumpute子句,此时,该子句将适用于最终的组合结果集
若需要对查询结果进行分组以及在分组后对结果使用having子句进行过滤,则必须在单独的select语句中指定group by 和having子句
联接查询
通过使用连接查询,可以根据各个数据表之间的逻辑关系从两个或多个数据表中检索数据
定义数据表之间的关联方式:
1在数据表中指定用于联接的字段。典型的联接条件是在一个数据表中指定外键,同时在另一个数据表中指定与其关联的主键
2在select语句中指定比较各字段值时要使用的逻辑运算符。联接的类型:
内链接
外连接:左向外连接,又向外联接,完整外联接
交叉联接内链接:
内链接的格式:数据表1 inner join 数据表2 on 连接表达式 指定返回两个表中所有匹配的行。inner是缺省的表达式外连接:左向外连接,又向外连接和完整外连接。
左向外联接的格式
数据表1 left join 数据表2 on 联接表达式 或 数据表1 left outer join 数据表2 on 联接表达式注意:返回结果集中将包括数据表1中所有记录,而不仅仅是连接字段所匹配的记录。如果数据表1的某条记录在数据表2中没有匹配的记录,则结果集应记录的有关数据表2的所有字段将为空值。
又向外连接的格式:
数据表1 right join 数据表2 on 连接表达式 或者 数据表1 right outer join 数据表2 on 连接表达式注意:返回结果集中将包括数据表2中所有的记录,而不仅仅是连接字段所匹配的记录,如果数据表2的某条记录在数据表1中没有匹配的记录,则结果集相应记录的有关数据表1的所有字段将为空值
完成外联接:
格式
数据表1 full join 数据表2 on 连接表达式或数据表1 full outer 数据表2 on 连接表达式
结果集将包含两个数据表中的所有记录,当某条记录在另一个数据表中没有匹配记录时,则将另一个数据表的选择列表字段指定为空
交叉连接:
格式数据表1 cross join 数据表2如果在select语句中没有使用where子句,则交叉连接将返回数据表1和数据表2中记录笛卡儿乘积,即交叉连接返回数据表1中的所有记录,以及数据表1中的每一条记录与数据表2 中的所有记录的组合
嵌套查询:
嵌套查询是指一个外层查询中包含另一个内层查询。其中,外层查询称为主查询,内层查询称为子查询
sql允许多层嵌套,有内而外进行分析,子查询的结果作为主查询的查找条件
可以用多个简单查询来构成复杂查询,以增强sql的查询能力子查询中一般不是用order子句,orderby 子句只能对最终查询结果进行排序
子查询(subquery)
包含子查询的格式通常采用:
where 表达式 [not] in (子查询)
where表达式 比较运算符[any|all]子查询where [not] exists (子查询)
子查询--单值比较
返回单值的子查询,只返回一行一列
主查询与单值查询之间用比较运算符进行连接
运算符>、>=、=、<=、<、<>子查询--in
子查询--多值比较all
多值比较:多行一列
复查询与多值子查询之间的比较需用all 来连接
标量值s比子查询返回集R中的每个都大时,s>all R 为true
all表示所有
>all, <=all,>=all,<>all
<>all 等价于not in子查询--多值比较some/any
父查询与多值子查询之间的比较需用some/any来连接
标量值s比子查询返回集r中的每个都大时,s>some r 为true或S>any r 为true>some, <=some,>=some,<>some
=some等价与in
<>some不等价于not in子查询--存在判断exists
exists+子查询用来判断该子查询是否返回元组
当子查询的结果非空时,exists为true
当子查询的结果集为空时,exists为false
不关心子查询的具体内容,因此用select*