(NOT) EXISTS
, (NOT) UNIQUE
用于指示某个表是否是空的/有重复元素。
ALL
, ANY
b <relation> ALL
:= ∀ a ∈ S: b \<relation> a
b <relation> ANY
:= ∃ a ∈ S: b \<relation> a
如何构建 SQL 指令
以这个问题为例:Find all students who have taken all courses offered in the Biology department.
Sol 1
- 注意:其实这里的 P(S) 和 Q 不是 predicates,而只是 set/set-valued function
Sol 2
明显,sol 2 比 sol 1 繁琐不少,但是 nonetheless 都是 valid solutions。
Update with Scalar Tricks
我们可以在修改某些行的时候,根据行的具体的值,修改成不同的值。
视图
一般的视图,就是所属表的一个引用。通过视图,我们可以更方便的进行 query。
但是,如果要修改视图,其实是比较麻烦的。
- 视图可能比原 table 要小,导致插入视图的时候,可能有些列插不进去,而被自动设为 NULL
- 视图可能含有
WHERE
,导致插入视图的时候,可能有些项插进去就被WHERE
过滤了。- 也就是说,插进去了一项,但是插进去之后,在视图里却找不到。
- 这虽然不违反 SQL 规则,但是违反“一般习惯”
- 因此,如果不希望插入可能被过滤的项,可以使用
With Check Option
的选项
- 也就是说,插进去了一项,但是插进去之后,在视图里却找不到。
Materialized View
视图的计算是需要时间的(和 query 同理)。因此,如果一个视图过于复杂,而我们需要频繁调用,那么我们就应该考虑将其变成 materialized view。
顾名思义,materialized view,就是把视图 materialize——从 query 变成物理上的一个真实的表。
Index
Index 便于快速寻找到某个元素。