首页 > 代码库 > 数据库基础
数据库基础
数据库基础问题汇总
1.并发事务之间相互影响的类型?
脏读:一个事务读取了另一个事务尚未提交的数据。
不可重复读:同一个事物中前后两次相同的查询,结果不一样。
幻读:一个事务中多次进行相同范围的查询,结果不一样。
eg1 幻读:事务T1第一次查询select count(*) from people where age < 10得到了10,然后另一个事务T2此时插入了一条age=9的记录,然后T1再次执行age<10的查询时,结果等于11,两次结果不同,产生了幻读。
2. SQL92标准定义的四种事务隔离级别?
Read Uncommitted:未提交读,容许:脏读、不可重复读、幻读
Read Committed:已提交读,不容许:脏读;容许:不可重复读、幻读
Repeatable Read:可重复读,不容许:脏读、不可重复读;容许:幻读
Serializable:串行化,不容许:脏读、不可重复读、幻读
3.Oracle支持的事务隔离级别?
Read Committed:(默认级别)语句级数据一致性,不能保证事务级数据一致性。
Serializable:能保证事务级数据一致性
read-only-mode:事务只能看到事务执行前已经提交的数据,且不能执行insert/update/delete语句。
4.Oracle如何实现并发访问的数据一致性?
利用“多版本一致性模型(Multiversion Consistency Model)”、各种锁和事务来共同实现。
参考:http://blog.csdn.net/gufeng672/article/details/7489679
多版本一致性模型:本质上是给每个查询约定了一个时间时间点,查询只能看到那个时间点的数据库数据,那个时间点之后数据库的修改对它是不可见的。
Oracle中强制实现“语句级读一致性”和在Serializable模式下的“事务级读一致性”。
语句级读一致性:通过保证单一查询(是单一查询而不是事务)的结果来自DML语句开始执行的时间点的所有数据,DML语句执行之后数据库的数据变化对该语句是不可见的。
事务级读一致性:事务只能看到事务执行前已经提交的数据,和事务内部通过Insert、Update、Delete语句对数据的修改。
5.Oracle数据库中的锁?
有各种锁,如DML锁(数据锁)、DDL锁(字典锁)等,平时主要讲的数数据锁。
DML锁又分为TM锁(表锁)、TX锁(行锁/事务锁),TX锁只有排他锁,TM锁有多种类型:S锁(共享锁)、X锁(排他锁)、SS锁(行共享锁)、SX锁(行排他锁)、SRX锁。
参考:http://blog.csdn.net/liqfyiyi/article/details/7371723
6.SQL语句执行顺序?
参考:http://www.cnblogs.com/qanholas/archive/2010/10/24/1859924.html
参考:http://www.tuicool.com/articles/fERNv2
(8)SELECT (9)DISTINCT (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
逻辑查询处理阶段简介
1.FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
2.ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
3.OUTER(JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
4.WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.
5.GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.
6.CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
7.HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7.
8.SELECT:处理SELECT列表,产生VT8.
9.DISTINCT:将重复的行从VT8中移除,产生VT9.
10.ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).
11.TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。
7.连接查询有哪几种?
内连接(等值连接)
左外连接/右外连接
交叉连接
8.where和having子句区别?
where是行级别筛选,having是组级别筛选,它们后面接的条件语法一样,这意味着用在where后面的语句,一般都可以用在having后(having中的字段必须出现在group by中吗?)。
9.having可以在没有group by的查询中使用吗?结果会怎样?
9.SQL中的派生表?
派生表就是子查询产生的虚表。
from (select * from t1)
10.SQL窗口函数/分析函数能做什么?
窗口函数用来指定聚集函数的计算范围,可以在不使用group by情况下,来指定每个聚集函数的作用范围。使用了group by子句后,select中能够操作的字段就会受限,而是用窗口函数则不会收影响。当然,有些情况下,可以先通过group by来做子查询,外部套用其它查询也能实现窗口函数的功能。事实上窗口函数能够提供更容易理解的SQL语句,同时窗口函数性能应该也更容易被DBMS优化。
参考:http://blog.csdn.net/mfkpie/article/details/16364513
“聚合函数over()”
“聚合函数over(partition by 字段)” 按照字段分区后来进行聚合函数计算
“聚合函数 over(order by 字段 [计算范围描述])”
范围描述格式:
[(range|rows)
between
(unbounded preceding|NUM preceding|current row)
and
(current row|unbounded follwing| NUM following)
]
11.执行计划解读?
每条sql语句都会被解析成执行计划,然后再执行。执行计划实际上是一个树状结构,每个节点表示一个操作,每个父操作都有一个或者多个子操作,调用时,从上往下依次调用,数据返回时,从下往上,子操作的数据返回给父操作,依次往上返回执行。
每个操作可能需要谓词条件(比如where中提供的查询条件限制)。
谓词条件:条件谓词、过滤谓词。要理解两种谓词的差别。
条件谓词:用来定位从物理对象上定位符合条件的数据,然后读取。
过滤谓词:过滤谓词操作的数据是已经从物理存储上读取了的数据。
对象访问方式:表访问、索引访问、固态表访问、物化视图访问
表访问:
TABLE ACCESS ( FULL )
TABLE ACCESS ( BY INDEX ROWID )从(全局分区)索引中获得rowid
TABLE ACCESS ( BY LOCAL INDEX ROWID ) 本地分区索引获得roid
TABLE ACCESS ( BY GLOBAL INDEX ROWID )
TABLE ACCESS ( BY USER ROWID )
LOAD AS SELECT
数据库基础