当一个查询语句中同时出现了 WHERE、GROUP BY、HAVING、ORDER BY的时候:
1. 执行where... 对全表数据做筛选,返回结果集 ①。
2. 对结果集 ② 进行分组,返回结果集 ③。
3. 对结果集 ③ 执行 having... 筛选,返回结果集 ④。
4. 对第结果集 ④ 排序。
HAVING 短语与WHERE 子句的区别:作用对象不同。
1. WHERE 子句作用于基表或视图,从中选择满足条件的元祖。
2. HAVING 短语作用于组,从中选择满足条件的组。
3. WHERE在分组前进行过滤选择,HAVING在分组后进行过滤。
4. HAVING 是対分组之后的组数据进行筛选,WHERE是対分组之前的每一行数据进行筛选。
5. WHERE 后的条件表达式不允许使用聚合函数,而 HAVING 可以。
等值连接 VS 自然连接:
1. 自然连接一定是等值连接,但等值连接不一定是自然连接。
2. 等值连接要求相等的分量,不一定是公共属性;而自然连接要求相等的分量必须是公共属性。
3. 等值连接不把重复的属性除去;而自然连接要把重复的属性除去。
自身连接:一个表与其自身连接
1. 需要给表起别名以示区别
2. 由于所有属性名都是同名属性,因此必须使用别名前缀
外连接 VS 普通连接:
1. 普通连接操作只输出满足连接条件的元祖
2. 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元祖一并输出
一个 SELECT-FROM-WHERE 语句称为一个查询块
嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询。
子查询的限制:不能使用 ORDER BY 子句
相关子查询 VS 不相关子查询
1. 相关:子查询的查询条件依赖于父查询
2. 不相关:子查询的查询条件不依赖于父查询
EXISTS谓词:存在量词
EXISTS谓词:存在量词
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值或逻辑假值
用EXISTS/NOT EXISTS 实现全称量词(难点)
1. SQL语言中没有全称量词
2. 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词
需要注意的问题 :
1. GROUP BY必须放到WHERE语句之后,GROUP BY 与 ORDER BY 都是对筛选后的数据进行处理,而where 是用来筛选数据的。
2. 当使用了group by 或者 聚合函数的时候,在select 查询列表中不能包含其他列名,除非该列同时也出现在了group 子句中,或者该列出现在某个聚合函数中。
3. 当某列出现null值时,count ( * ) 仍然会计算,但是count ( 列名 ) 不会。
难点
插入元祖:
INTO子句:属性列的顺序可与表定义中的顺序不一致。
VALUES子句:提供的值(个数、类型)必须与INTO子句匹配。
视图的特点:
1. 虚表,是从一个或几个基本表(或视图)导出的表
2. 只存放视图的定义,不存放视图对应的数据
3. 基表中的数据发生变化,从视图中查询出的数据也随之变化
(DBMS执行CREATE VIEW时只是把视图定义存入数据字典,并不执行其中的SELECT语句)