数据库基础

 数据库基础问题汇总

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.wherehaving子句区别?

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

原文地址:https://www.cnblogs.com/wrencai/p/5857076.html