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)
高水位线:曾经包含数据的最右边的块
将扫描高水位线以下的所有数据块
通过rowid来扫描数据
Rowid:标识一条记录的物理位置
包含如下信息:
该记录属于哪张表的(哪个数据库对象):object_id
该记录在哪个数据文件里:file_id
该记录在数据文件的第几个数据块里:block_id
该记录在数据块里是第几条记录:row_id

索引使用的是B*tree结构
B*tree索引由根节点(root block)、分支块(branch block)、叶子节点(leaf block)组成
根块下面是分支块,用于导航结构,包含了索引列范围和另一索引块(可以是分支块或叶子节点)的地址
最底层为叶子节点,包含索引项(index entry),索引项由key值(被索引列的值)和相应行所对应的rowid组成
索引上叶子节点实际上是双向链接的表。一旦找到叶子节点的“开始”点(一旦找到第一个值),对值进行顺序扫描(索引范围扫描)是很容易的。不必再做结构导航,只要通过叶子节点转发就行


ROWNUM是一个伪列,对查询返回的行编号即行号,由1开始依次递增
WHERE ROWNUM <= 5的执行过程
Oracle获取第一个符合条1件的行,将它叫做第1行
有5行了吗?如果没有,oracle就再返回行,因为它要满足行号
小于等于5的条件,如果到了5行,那么,oracle就不再返回行
Oracle获取下一行,并递增行号(从2,到3,再到4,等等)
返回到第2步
关键点:Oracle的rownum数值是在获取每行之后才赋予的

WHERE ROWNUM = 5的执行过程
Oracle获取第一个符合条1件的行,将它叫做第1行
有5行了吗?如果没有,oracle就再返回行,因为它要满足行号
小于等于5的条件,如果到了5行,那么,oracle就不再返回行
Oracle获取下一行,并递增行号(从2,到3,再到4,等等)
返回到第2步

你可能感兴趣的:(数据结构,oracle)