@@ -112,10 +112,10 @@ SELECT <[DISTINCT] c1,c2,…> FROM <r1,…>
112112ORDER BY < c1[DESC ][,c2[DESC |ASC ],…]>
113113```
114114
115- 执行顺序:From → where → group (aggregate) → having → select → order by
116- ** 因此 where 后的条件先于 having 后的条件进行筛选 **
117-
118- 当出现嵌套时,在同一SQL语句内,除非外层查询的元组变量引入内层查询,否则内层查询只进行一次。
115+ - GROUP BY子句应该在HAVING子句之前
116+ - 执行顺序:From → where → group (aggregate) → having → select → order by
117+ ** 因此 where 后的条件先于 having 后的条件进行筛选 **
118+ - 当出现嵌套时,在同一SQL语句内,除非外层查询的元组变量引入内层查询,否则内层查询只进行一次。
119119
120120#### Null
121121
@@ -215,3 +215,119 @@ set salary = case
215215
216216- View 是虚表,对其进行的所有操作都转化为对基表的操作。
217217- Most SQL implementations allow updates only on simple views defined on a single relation and without aggregates.
218+
219+ ### Transaction
220+
221+ 事务是一系列数据库操作序列,这些操作要么** 全部完成** ,要么** 全部不完成** ,是一个不可分割的工作单位。
222+
223+ - commit
224+ - rollback
225+
226+ ### Join
227+
228+ #### 语法
229+
230+ - ** 自然连接** :R natural {inner join, left join, right join, full join} S
231+ - ** 非自然连接** :R {inner join, left join, right join, full join} S
232+ on <连接条件判别式>
233+ using (<同名的等值连接属性名>)
234+
235+ #### tip
236+
237+ - 由于不会引起歧义,` inner ` 、` outer ` 可省略。
238+ - 但 ` natural ` 不能省略,不然就变成笛卡尔积了。
239+ - 非自然连接,容许不同名属性的比较;且结果关系中不消去重名属性
240+ - 使用 using 的连接类似于 natural 连接。但仅以 using 列出的公共属性为连接条件。
241+
242+ ## Intermidiate
243+
244+ ### Integrity Constraints
245+
246+ 对数据库中数据的某种限制,比如
247+
248+ #### Single Relation
249+
250+ - primary key
251+ - not null
252+ - unique
253+
254+ ** CHECK** 语句可以限定某个属性必须满足某个条件,在 create table 时使用。
255+
256+ ``` sql
257+ create domain hourly - wage numeric (5 ,2 )
258+ constraint value- test check (value > = 4 .00 );
259+ ```
260+
261+ 给 constraint 命名可以用于 debug。
262+
263+ #### Referential Integrity
264+
265+ ** foreign key** ,需进行以下检查:
266+
267+ - Insert 确保新插入的元组在参照关系中存在
268+ - Delete 要么 reject,要么 cascading delete
269+
270+ ** SQL 中的写法** :
271+
272+ ``` sql
273+ foreign key (dept_name) references department -- 在最后指定
274+ dept_name varchar (20 ) references department -- 在定义时指定
275+ ```
276+
277+ ** foreign key** 默认引用主键,也可以指定引用其他属性,但必须是唯一的
278+
279+ ``` sql
280+ foreign key (dept_name) references department (building)
281+ ```
282+
283+ ** 冲突处理方法**
284+
285+ ``` sql
286+ create table course (
287+ . . .
288+ foreign key (dept_name) references department
289+ [on delete cascade ]
290+ [on update cascade]
291+ . . . );
292+ ```
293+
294+ - NULL 是视作符合外键要求的值
295+
296+ #### Assertions
297+
298+ ``` sql
299+ CREATE ASSERTION < assertion- name>
300+ CHECK < predicate> ;
301+ ```
302+
303+ 每当系统更新时都运行检查,开销很大
304+
305+ #### Trigger
306+
307+ ** Example**
308+
309+ ``` sql
310+ create trigger timeslot_check1 after insert [of < attr> ] on section
311+ referencing new row as nrow
312+ for each row
313+ when (nrow .time_slot_id not in (
314+ select time_slot_id
315+ from time_slot)) /* time_slot_id not present
316+ in time_slot */
317+ begin
318+ rollback
319+ end;
320+ ```
321+
322+ 或者直接检查整个表:
323+
324+ ``` sql
325+ referencing new table as ntable
326+ for each statement
327+ ...
328+ ```
329+
330+ 删除触发器:drop trigger <触发器名>;
331+
332+ ### Authorization
333+
0 commit comments