日期:2014-05-16  浏览次数:20473 次

oracle笔记(1)
t1表和t2表做内连接,连接条件为on t1.c1 = t2.c2,
假设t1表做驱动表,t2表做匹配表,记录的匹配过程如下:
1、从t1表中读取第一条记录r1,若它的c1值为1
2、根据该值到t2表中查找匹配的记录,即需要遍历t2表,从t2表中的第一条记录开始,若该记录(r1)的c2列的值=1,我们就说这两条记录能够匹配上,那么t1的r1和t2的r1组合起来,作为结果集里的一条记录,否则不能组合起来,即被过滤掉。
3、按照方法2依次将t2表中所有的记录检测一遍,只要匹配就放入结果集中
4、从t1表中读取第二条记录,依次重复步骤2和3,产生最终的结果集

t1表和t2表做内连接,连接条件为on t1.c1 = t2.c2,
假设t1表做驱动表,t2表做匹配表,记录的匹配有如下三
种情况:
1、t1表中的某条记录在t2中找不到任何一条匹配的记录,那么t1表中的该记录不会出现在结果集中
2、t1表中的某条记录在t2表中只有一条匹配的记录,那么t1表中的该记录和t2表中匹配的记录组合成新记录出现在结果集中
3、t1表中的某条记录在t2表中有多条匹配的记录,那么t1表中的该记录会和t2表中每一条匹配的记录组合成新记录出现在结果集中
4、内连接的核心为任何一张表里的记录一定要在另一张表中找到匹配的记录,否则不能出现在结果集中

t1表和t2表做内连接,连接条件为on t1.c1 = t2.c2
有两种方式都能得到结果集记录
1、一种t1表做驱动表,t2表做匹配表
2、另一种t2表做驱动表,t1表做匹配表
3、无论哪种方式最终得到的结果集都一样,所不同的是效率

t1表和t2表做外连接,连接条件为
from t1 left outer join t2 on t1.c1 = t2.c2,
t1表必须做驱动表,t2表做匹配表,记录的匹配过程如下:
1、从t1表中读取第一条记录r1,若它的c1值为1
2、根据该值到t2表中查找匹配的记录,即需要遍历t2表,从t2表中的第一条记录开始,若该记录(r1)的c2列的值=1,我们就说这两条记录能够匹配上,那么t1的r1和t2的r1组合起来,作为结果集里的一条记录,否则不能组合起来,即被过滤掉。
3、按照方法2依次将t2表中所有的记录检测一遍,只要匹配就放入结果集中,若扫描完后,t1的r1记录在t2表中找不到任何匹配的记录,t2表中模拟一条null记录与t1表中r1组合起来,放入结果集中
4、从t1表中读取第二条记录,依次重复步骤2和3,产生最终的结果集

t1表和t2表做外连接,连接条件为
from t1 left outer join t2 on t1.c1 = t2.c2,
t1表必须做驱动表,t2表做匹配表,
1、外连接的结果集=内连接的结果集+t1表中匹配不上的记录和一条null记录的组合
2、外连接的核心可以将匹配不上的记录找回来,即一个都不能少

t1表和t2表做外连接,连接条件为
from t1 right outer join t2 on t1.c1 = t2.c2,
t2表必须做驱动表,t1表做匹配表,
1、外连接的结果集=内连接的结果集+t2表中匹配不上的记录和一条null记录的组合

t1表和t2表做外连接,连接条件为
from t1 full outer join t2 on t1.c1 = t2.c2,
t2表必须做驱动表,t1表做匹配表,
外连接的结果集=内连接的结果集+t2表中匹配不上的记录和一条null记录的组合+t1表中匹配不上的记录和一条null记录的组合

根据GROUP BY子句指定的表达式,将要处理的数据(若有WHERE子句即为通过条件过滤后的数据)分成若干组,每组有唯一的组标识,组内有若干条记录,根据SELECT后面的组函数对每组的记录进行计算,每组对应一个返回值

where和having的区别
WHERE子句过滤的是行(记录)
HAVING子句过滤的是分组以后的聚合结果
WHERE子句包含单行函数
HAVING子句只能包含GROUP BY后面的表达式和组函数
WHERE子句执行在前,HAVING子句执行在后
WHERE子句和HAVING子句都不允许用列别名

先执行子查询,子查询的返回结果作为主查询的条件,再执行主查询。
子查询只执行一遍
若子查询的返回结果为多个值,ORACLE会去掉重复值之后,再将结果返回给主查询

关联子查询采用的是循环(loop)的方式,执行步骤如下:
1 外部查询得到一条记录(查询先从outer表中读取数据)并将其传入到内部查询。
2 内部查询基于传入的值执行。
3 内部查询从其结果中把值传回到外部查询,外部查询使用这些值来完成其处理,若符合条件,outer表中得到的那条记录就放入结果集中,否则放弃,该记录不符合条件。
4 重复执行步骤1-3, 直到把outer表中的所有记录判断一遍。

EXISTS采用的是循环(loop)方式,判断outer表中是否存在记录只要在inner表中找到一条匹配的记录即可。
1 外部查询得到一条记录(查询先从outer表中读取数据)并将其传入到内部查询的表。
2 对inner表中的记录依次扫描,若根据条件存在一条记录与outer表中的记录匹配,立即停止扫描,返回true,将outer表中的记录放入结果集中,若扫描了全部记录,没有任何一条记录符合匹配条件,返回false ,outer表中的该记录被过滤掉,不能出现在结果集中。
3 重复执行步骤1-2, 直到把outer表中的所有记录判断一遍。


NOT EXISTS采用的是循环(loop)方式,判断在outer表中是否不存在记录,它能在inner表中能找到匹配的记录。
1 外部查询得到一条记录(查询先从outer表中读取数据)并将其传入到内部查询的表。
2 对inner表中的记录依次扫描,若根据条件存在一条记录与outer表中的记录匹配,立即停止扫描,返回false, outer表中的该记录被过滤掉,不能出现在结果集中,若扫描了全部记录,没有任何一条记录符合匹配条件,返回true,将outer表中的记录放入结果集中。
3 重复执行步骤1-2, 直到把outer表中的所有记录判断一遍。

EXISTS是用循环(loop)的方式,由outer表的记录数决定循环的次数,对于exists影响最大,所以,外表的记录数要少
IN先执行子查询,子查询的返回结果去重之后,再执行主查询,所以,子查询的返回结果越少,越适合用该方式

事务的特性:ACID
原子性(atomic):一个事务要么完全发生、要么完全不发生
一致性(consistent):事务把数据库从一个一致状态转变到另一个状态
隔离性(isolated):在事务提交之前,其他事务觉察不到事务的影响
持久性(durable):一旦事务提交,它是永久的

数据库应用程序中最常用的隔离级别
Read committed
一个事务只可以读取在事务开始之前提交的数据和本事务正
在修改的数据。

在开发多用户、数据库驱动的应用程序中,关键性的挑战之一是要使并行的访问量达到最大化,同时还要保证每一个用户可以以一致的方式读取并修改数据。
锁(lock)机制
用来管理对一个共享资源的并行访问
多版本一致读
非阻塞查询:写不阻塞读,读不阻塞写
一致读查询:在某一时刻查询产生一致结果

排他锁
如果一个对象上加了X锁,在这个锁被采用commit或rollback
释放之前,该对象上不能施加任何其他类型的锁
共享锁:
如果一个对象被加上了S锁,该对象上可以加其他类型的S锁,但
是,在该锁释放之前,该对象不能被加任何其他类型的X锁

为确保并发用户能正确使用与管理共享资源,如表中的记录,oracle引进锁机制
DML锁:用于保护数据的完整性
TX锁,即事务锁(行级锁),类型为X锁
TM锁,即意向锁(表级锁),属于一种S锁
DDL锁:用于保护数据库对象的结构(例如表、索引的结构定义)
X类型的DDL锁,这些锁定防止其他会话自己获得DDL锁定或
TM(DML)锁定。这意味着可以在DDL其间查询一个表,但不
可以以任何方式进行修改

全表扫描FTS(Full Table Scan)
高水位