四 多表查询
笛卡尔集
笛卡尔集会在下面条件下产生:
- 省略连接条件
- 连接条件无效
- 所有表中的所有行互相连接
- 为了避免笛卡尔集, 可以在 WHERE 加入有效的
- 连接条件。
- 在实际运行环境下,应避免使用全笛卡尔全集。
Oracle的连接分为等值连接,不等值连接,外连接,自连接
使用连接在多个表中查询数据
区分重复的列名
- 使用表名前缀在多个表中区分相同的列。
- 在不同表中具有相同列名的列可以用表的别名加以
- 区分。
表的别名
- 使用别名可以简化查询。
- 使用表名前缀可以提高执行效率。
- 如果使用了表的别名,则不能再使用表的真名。
连接多个表
连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
自连接
五 子查询
子查询语法
子查询的类型
注意事项:
- 子查询要包含在括号内 。
- 将子查询放在比较条件的右侧 。
- 单行操作符对应单行子查询,多行操作符对应多行子查询。
单行子查询,多行子查询(in,all,any)
六 集合运算
集合运算的注意事项
- select语句中参数类型和个数要一致。
- 可以使用括号改变集合执行的顺序
- 如果有order by子句,必须放到最后一句查询语句后
- 集合运算采用第一个语句的表头作为表头
七 处理数据
使用DML语句,处理事务
数据操作语言:
DML(Data Manipulation Language – 数据操作语言) 可以在下列条件下执行:
- 向表中插入数据
- 修改现存数据
- 删除现存数据
- 事务是由完成若干项工作的DML语句组成的
数据库事务
- 数据库事务由以下的部分组成:
- 一个或多个DML 语句
- 一个 DDL(Data Definition Language – 数据定义语言) 语句
- 一个 DCL(Data Control Language – 数据控制语言)语句
以第一个 DML 语句的执行作为开始:
- 以下面的其中之一作为结束:
- 显示结束: commit rollback
- 隐式结束(自动提交): DDL语言,DCL语言, exit(事务
- 正常退出)
- 隐式回滚(系统异常终了): 关闭窗口,死机,掉电
COMMIT和ROLLBACK语句的优点
- 使用COMMIT 和 ROLLBACK语句,我们可以:
- 确保数据完整性。
- 数据改变被提交之前预览。
- 将逻辑上相关的操作分组.
数据库的隔离级别
对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
- 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段.之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
- 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段.之后, T1再次读取同一个字段, 值就不同了.
- 幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度,
隔离级别越高, 数据一致性就越好, 但并发性越弱
数据库提供的 4 种事务隔离级别:
Oracle 支持的 2 种事务隔离级别:READ,COMMITED, SERIALIZABLE.
Oracle 默认的事务隔离级别为: READ COMMITED
Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ