您的位置:首页 > 数据库

数据库基础知识

2015-08-03 16:15 204 查看
数据库基础知识

1、三个范式

即: 属性唯一, 记录唯一, 表唯一
第一范式(1NF):列不可分,每一项都是不可分割的原子数。
第二范式(2NF):要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。要有主键。要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,不存在部分依赖,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
第三范式(3NF):任何非主属性不依赖于其它非主属性,不存在传递依赖。每一列数据都和主键直接相关,而不能间接相关。

2、什么是主键?什么是外键?

主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表(可能是同一表)里的字段。那么这些相连的字段就是外键。

3、什么是触发器?

触发器是一种专用类型的存储过程,它被捆绑到表格或者视图上。触发器是一中特殊的存储过程,主要是通过事件(增、删、改)来触发而被执行的。它可以强化约束来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

常见的触发器有两种:after(for)、instead of,用于insert、update、delete事件。
after(for) 表示执行代码后,执行触发器
insteadof 表示执行代码前,用已经写好的触发器代替你的操作
Example1
--删除谁就让谁的账户加上10元
createtrigger tr_dalete on bank
insteadof
delete
as
updatebank balance=balance+10 where cid=(select cid from
deleted)
数据库有两张临时表deleted和inserted
对应相应的操作。
Update 先删除 后插入
  生成这个触发器之后,当用户输入delete语句后,对应的那个id不但没有被删除掉,而且他的账户增加了10元

  如:deletefrom bank where cid='0002',执行完这句话后,编号为0002的账户会增加10元
Example2
--禁止用户插入数据(实际上是先插入,然后立刻将其删除!)
createtrigger tr_insert on bank
for --for表示执行之后的操作
insert --即先执行了插入操作,同时在临时表中保存了插入记录
as
--执行完插入之后,在新生成的表中将刚刚插入的那条记录删除,
--而此时得到的刚刚插入的记录的id是通过临时表 inserted得到的
delete* from bank where cid=(select cid from inserted)
  生成上面的触发器后,当用户再输入insert语句后就见不到效果了!
  如:insertinto bank values('0004',10000),是插入不进数据库的。

4、什么是存储过程?用什么来调用?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

存储过程的优点:
1.执行速度更快 –
在数据库中保存的存储过程语句都是编译过的
2.允许模块化程序设计 –
类似方法的复用
3.提高系统安全性–防止SQL注入
4.减少网络流通量–只要传输存储过程的名称
简单的一个例子
  定义存储过程:
createproc usp_StudentByGenderAge
@gendernvarchar(10) [='男'],
@ageint [=30]
as
select* from MyStudent where FGender=@gender and FAge=@age

  执行存储过程:
Situation One(调用默认的参数):
execusp_StudentByGenderAge
Situation Two(调用自己指定的参数):
execusp_StudentByGenderAge '女',50
或者指定变量名 execusp_StudentByGenderAge @age=50,@gender='女'

5、索引的作用?和它的优点缺点是什么?

索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

优点:

第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

适合创建索引的地方:

在经常需要搜索的列上,可以加快搜索的速度;

在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

创建索引的方法 :

创建索引有多种方法,这些方法包括直接创建索引的方法和间接创建索引的方法。直接创建索引,例如使用CREATE INDEX语句或者使用创建索引向导,间接创建索引,例如在表中定义主键约束或者唯一性键约束时,同时也创建了索引。虽然,这两种方法都可以创建索引,但是,它们创建索引的具体内容是有区别的。

6、什么叫视图?游标是什么?

视图:视图是从一张表或多张表或视图中导出的表,是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

二、视图的优点

1.集中用户使用的数据;把不需要的数据过滤掉。

2.掩码数据库的复杂性,视图把数据库设计的复杂性与用户屏蔽分开;

3.简化用户权限的管理;

4.为向其他应用程序输出而重新组织数据。

7、什么是事务?什么是锁?

事物:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,要么完全地执行,要么完全地不执行,如果出错以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

:在所有的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。

隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。

持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持

行级锁是一种排他锁,防止其他事务修改此行;

表级锁又分为5类:

行共享 (ROW SHARE) – 禁止排他锁定表

行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁

共享锁(SHARE) - 锁定表,对记录只读不写,多个用户可以同时在同一个表上应用此锁

共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁

排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表

一:悲观锁(Pessimistic Locking)

悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)

二 :乐观锁(OptimisticLocking)

相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情

况下依 靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的

就是数据库 性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。

乐观锁 大多是基于数据版本 (Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来 实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提 交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据 版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

8、什么是内存泄漏?

答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

9、说出数据连接池的工作机制是什么

J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

9、说出一些数据库优化方面的经验?

(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):

ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.

(2) WHERE子句中的连接顺序.:

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

(3) SELECT子句中避免使用 * :

ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间

(4)减少访问数据库的次数:

ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;

(17)用索引提高效率:

索引是表的一个概念部分,用来提高检索数据的效率

(14)使用表的别名(Alias):

当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

(8)删除重复记录:

(10)尽量多使用COMMIT:

只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:

(13)通过内部函数提高SQL效率.:

(12)减少对表的查询:

28)用UNION-ALL 替换UNION ( 如果有可能的话):

10、union和union all有什么不同?

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。

而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

11、SQL Server 2000 数据库有三种类型的文件:

主要数据文件

主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。

次要数据文件

次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。

日志文件

日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。

12、什么是数据库的隔离级别?

数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.。

READ UNCOMMITTED(读未提交数据) 允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现

READ COMMITED(读已提交数据) 只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然会出现

REPEATABLE READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题依然存在

SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可以避免,但性能十分低

Oracle 支持的 2 种事务隔离级别:READ COMMITED、 SERIALIZABLE。Oracle 默认的事务隔离级别为: READ COMMITED

Mysql 支持 4 中事务隔离级别。Mysql 默认的事务隔离级别为: REPEATABLE READ 。

13、sql语句执行顺序

SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。

每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回给调用者。

二、执行顺序

1. FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1

2. ON: 对vt1表应用ON筛选器只有满足
join_condition 为真的行才被插入vt2

3. OUTER(join):如果指定了 OUTER JOIN保留表(preservedtable)中未找到的行将行作为外部行添加到vt2,生成t3,如果from包含两个以上表,则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束。

4. WHERE:对vt3应用 WHERE
筛选器只有使where_condition
为true的行才被插入vt4

5. GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5

6. CUBE|ROLLUP:把超组(supergroups)插入vt6,生成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
并返回调用者

14、having与where的区别

having 和where
都是用来筛选用的,having
是筛选组 而where是筛选记录。

结论:

1.WHERE 子句用来筛选FROM
子句中指定的操作所产生的行。

2.GROUP BY 子句用来分组 WHERE
子句的输出。

3.HAVING 子句用来从分组的结果中筛选行
having子句与where有相似之处但也有区别,都是设定条件的语句。

在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行。而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。

简单说来:

where子句:

select sum(num) as rmb from order where id>10

//只有先查询出id大于10的记录才能进行聚合语句

15、limt

select * from table limit m,n

其中m是指记录开始的index,从0开始,表示第一条记录

n是指从第m+1条开始,取n条。

select * from tablename limit 2,4

即取出第3条至第6条,4条记录

16、sql中的join方式比较

一、外连接

1.概念:包括左向外联接、右向外联接或完整外部联接

table1 | table2 |

-------------------------------------------------

id name |id score |

1 lee |190 |

2 zhang |2 100 |

4 wang |370 |

-------------------------------------------------

2.左连接:left join 或 left outer join (执行的结果是一样的)

(1)左向外联接的结果集包括 left outer 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。

(2)sql语句

select * from table1 left join table2 on table1.id=table2.id

-------------结果-------------

id name id score

------------------------------

1 lee 1 90

2 zhang 2 100

4 wang null null

------------------------------

注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示

3.右连接:right join 或 right outer join

(2)sql语句

(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中

没有匹配行,则将为左表返回空值。

select * from table1 right join table2 on table1.id=table2.id

-------------结果-------------

id name id score

------------------------------

1 lee 1 90

2 zhang 2 100

null null 3 70

------------------------------

注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示 。

4.完整外部联接:full join 或 full outer join (做实验语句出现错误)

(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另

一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

(2)sql语句

select * from table1 full join table2 on table1.id=table2.id

-------------结果-------------

id name id score

------------------------------

1 lee 1 90

2 zhang 2 100

4 wang null null

null null 3 70

------------------------------

注释:返回左右连接的和

二、内连接

1.概念:内联接是用比较运算符比较要联接列的值的联接

2.内连接:join 或 inner join

3.sql语句

select * from table1 join table2 on table1.id=table2.id

-------------结果-------------

id name id score

------------------------------

1 lee 1 90

2 zhang 2 100

------------------------------

注释:只返回符合条件的table1和table2的列

三、交叉连接(完全)

1.概念:没有 where 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。

2.交叉连接:cross join (不带条件where...)

3.sql语句

select * from table1 cross join table2

-------------结果-------------

id name id score

------------------------------

1 lee 1 90

2 zhang 1 90

4 wang 1 90

1 lee 2 100

2 zhang 2 100

4 wang 2 100

1 lee 3 70

2 zhang 3 70

4 wang 3 70

------------------------------

注释:返回3*3=9条记录,即笛卡尔积

17、常用的约束

主键约束(primary key)

外键约束(foreign key)

唯一性约束(unique)

非空(not null)

检查约束(check)

18、E-R图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: