public class DataBase { public static void main() { } } /* 3.5 集合运算 SQL作用在关系上的union、intersect和expect运算对应于数学集合论中的并,交,减运算 union、intersect、expect:去除重复 union all、intersect all、expect all:不去除重复 */ /* 3.6 空值 如果算术表达式的任一输入为空,则该算术表达式的结果为空 涉及到空值的比较运算的结果为unknown 由于where子句中对比较结果使用诸如and or not的布尔运算,所以这些不二运算的定义也 扩展到了可以处理unknown值。 and:true and unknown 是 unknown false and unknown 是 false unknown and unknown 是 false or:true or unknown 是 true false or unknown 是 unknown unknown or unknown 是 false not not unknown 是 unknown 如果where子句的谓词对一个元组计算出false或unknown,那么该元组不能加入到结果集中。 当使用select distinct子句时:重复元组被除去。为了达到这个目的,当比较两个元组的属性 时,如果这两个值都是非空并且值相等,或者为空,那么它们是相同的。这与在where中对null的 比较结果并不相同。同适用于集合的并、交、差 */ /* 3.7 聚集函数 avg、min、max、sum、count 3.7.1 基本聚集 某种情况下,我们需要删除重复元组,可以在聚集表达式中使用关键字distinct。 select count(distinct Id) from teachers where semester = 'Spring' and year = 2010 3.7.2 分组聚集 group by子句中给出的一个或多个属性是用来构造分组的,在group by子句中的所有 属性上取值相同的元组被分到一个组中。 ****************************************************************** ****************************************************************** 当SQL查询使用分组时,一个很重要的事情就是需要保证出现在select语句中,但是没有 没有被聚集的属性只能是出现在group by子句中的那些属性。 select dept_name, avg(salary) as avg_salary from instructor group by dept_name select avg(salary) from instructor select dept_name, count(distinct ID) as instr_count from instructor natural join teachers where semester = ’Spring' and year = 2010 group by dept_name ****************************************************************** ****************************************************************** 3.7.3 having子句 有时候,对分组限定条件比对元组限定条件更有用。例如,我们也许只对教师平均工资超过 42000美元的系感兴趣。该条件不是针对单个元组,而是针对group by子句构成的分组。 select dept_name,avg(salary) as avg_salary from instructor group by dept_name having avg(salary) > 42000; 与select子句的情况类似,任何出现在having子句中,但是没有被聚集的属性,必须出现在 group by子句中。 包含了聚集、group by 或 having子句的查询的含义可通过下述操作序列来定义: 1.与不带聚集的情况类似,最先根据from子句来计算出一个关系。 2.如果出现了where子句,where子句中的谓词将应用到from子句的结果集上 3.如果出现了group by子句,满足where谓词的元组通过group by子句形成分组。如果 没有group by子句,满足where谓词的整个元组集被当作一个分组。 4.如果出现了having子句,它将应用到每个分组上;不满足having子句谓词的分组将被抛弃 5.select子句利用剩下的分组产生出查询结果中的元组,即在每个分组上应用聚集函数来得到 单个结果元组。 3.7.4 对空值和布尔值的聚集 聚集函数根据以下原则处理空值:除了count(*)外所有的聚集函数都忽略输入集合中的空值。由于 空值被忽略,有可能造成参加函数运算的输入集合为空集。规定空集的count运算值为0,其他 的所有聚集运算在输入空集的情况下,返回一个空值。 */