数据库常考知识点

1. 并发控制:数据库

不管什么时候,只要有多个查询须要在同一时刻修改数据,都会产生并发控制问题。在处理并发读或者写时,能够经过实现一个由两种类型的锁组成的锁系统来解决问题。这两种锁叫作共享锁排他锁。也叫读锁写锁。读锁是共享的,写锁则是排他的。服务器

锁粒度: 任什么时候候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突便可。表锁是MySQL中最基本的锁策略,而且是开销最小的策略,它会锁定整张表。行级锁能够最大程度地支持并发处理,同时也带来了最大的锁开销。并发

 

2. 事务数据库设计

事务是一组原子性的SQL查询,或者说是一个独立的工做单元。若是数据库引擎可以成功地对数据库应用该组查询的所有语句,那么就执行该组查询。若是有任何一条语句由于崩溃或其余缘由没法执行,阿么其余的语句都不会执行。事务内的语句,要么所有执行成功,要么所有执行失败。函数

事务的ACID特性:atom

原子性(atomicity):一个事务必须被视为一个不可分割的最小工做单元,整个事务中的全部操做要么所有提交成功,要么所有失败回滚,对于一个事务来讲,不可能只执行其中的一部分操做,这就是事务的原子性。spa

一致性(consistency): 数据库老是从一个一致性的状态转换到另一个一致性的状态。设计

隔离性(isolation):一般来讲一个事务所作的修改在最终提交以前,对其余事务是不可见的。code

持久性(durability): 一旦事务提交,则其所做的修改就会永久保存到数据库中。排序

 

3. 隔离级别

READ UNCOMMITTED(未提交读):事务中的修改,即便没有提交,对其余的事务也是可见的。 事务能够读取未提交的数据,这个称为脏读

READ COMMITTED(提交读): 大多数数据库系统的默认隔离级别都是READ COMMITTED(可是MySQL不是)。一个事务开始时,只能“看见”已经提交的事务所作的修改。这个级别也叫做不可重复读。由于两次执行一样的查询,可能会获得 不同的结果。

REPEATABLE READ:可重复读  解决了脏读的问题。该级别保证了在同一个事务中屡次读取一样记录的结果是一致的。可是仍是没法解决另外一个幻读的问题。幻读是指当某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入了新的记录,当以前的事务再次读取该范围的记录时,会产生换行。

SERIALIZABLE(可串行化): 是最高的隔离机制,他经过事务串行执行,避免了幻读的出现。

 

4. 数据库的关系完整性

关系完整性的用于保证数据库中数据的正确性。系统在进行更新、插入或删除等操做时都要检查数据的完整性,核实其约束条件,即关系模型的完整性规则。在关系模型中有四类完整性约束:实体完整性域完整性参照完整性用户定义的完整性,其中实体完整性和参照完整性约束条件,称为关系的两个不变性。

 

实体完整性指表中行的完整性。主要用于保证操做的数据(记录)非空、惟一且不重复。即实体完整性要求每一个关系(表)有且仅有一个主键,每个主键值必须惟一,并且不容许为“空”(NULL)或重复。

域完整性(Domain Integrity)是指数据库表中的列必须知足某种特定的数据类型或约束。其中约束又包括取值范围、精度等规定。表中的CHECK、FOREIGN KEY 约束和DEFAULT、 NOT NULL定义都属于域完整性的范畴。

参照完整性(Referential Integrity)属于表间规则。对于永久关系的相关表,在更新、插入或删除记录时,若是只改其一,就会影响数据的完整性。

用户定义完整性(User-defined Integrity)是对数据表中字段属性的约束,用户定义完整性规则(User-defined integrity)也称域完整性规则。包括字段的值域、字段的类型和字段的有效规则(如小数位数)等约束,是由肯定关系结构时所定义的字段的属性决定的。如,百分制成绩的取值范围在0~100之间等。

 5. 经常使用的命令

     show  status  显示服务器的信息

     show create database   /   show create table   显示建立特定数据库或者表

     show grants   显示授予用用户

     SELECT prod_id,  prod_name,  prod_price   FROM products          // 检索多个列

     SELECT *    FROM    products               检索全部列

     SELECT DISTINCT vend_id FROM products;           //  检索不一样的行

     SELECT prod_name FROM products  LIMIT 5        

     SELECT prod_name FROM products ORDER BY prod_name  DESC          对输出按降序排序

     SELECT prod_price FROM products ORERDE BY prod_price DESC LIMIT 1     //   order by  和 limit 组合找出一个列中的最小值或最低值

     SELECT vend_id, prod_name FROM products WHERE vend_id  <>  1003    //  不匹配检查

     SELECT vend_id, prod_name FROM products WHERE prod_price BETWEEN 5 AND 10   // 范围值检查

      通配符进行过滤使用   LIKE,% 表示任何字符出现任意次

      SELECT prod_id, prod_name FROM products  WHERE prod_name LIKE    'jet%'   // 找出全部以jet开头的产品

 

      LIKEREGEXP的区别:

      LIKE 匹配整个列,  REGEXP 在列值内进行匹配。

      SELECT Concat (vend_name,  '(',  vend_country,  ')' ) FROM vendors  ORDER BY vend_name;   // 将两个列拼接起来     

      汇集函数: 运行在行组上,计算和返回单个值的函数。经常使用的有: AVG(),   COUNT(),    MAX(),   MIN(),   SUM().

      SELECT AVG(prod_price) AS avg_price  FROM products.     //  AVG()只能用来肯定特定数值列的平均值

      

      SELECT vend_id ,  COUNT(*)  AS num_prods  FROM products GROUP BY vend_id  

       WHERE 过滤行,HAVING 过滤分组

      SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id  HAVING COUNT(*) >= 2

       理解数据库的几种种链接。

       链接分为三种:内链接外链接交叉链接

       内链接:  1.   等值链接  概念:在链接条件中使用等于号(=)运算符,其查询结果中列出被链接表中的全部列,包括其中的重复列。

                        2.   在链接条件中使用除等于号以外运算符(>、<、<>、>=、<=、!>和!<)

       外链接:  外链接分为左链接(LEFT JOIN)或左外链接(LEFT OUTER JOIN)、右链接(RIGHT JOIN)或右外链接(RIGHT OUTER JOIN)、全链接(FULL JOIN)或全外链接(FULL OUTER JOIN)。咱们就简单的叫:左链接、右链接和全链接。

                        左链接:返回左表中的全部行,若是左表中行在右表中没有匹配行,则结果中右表中的列返回空值。左链接显示左表所有行,和右表与左表相同行。

                        右链接:恰与左链接相反,返回右表中的全部行,若是右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

                        全链接:返回左表和右表中的全部行。当某行在另外一表中没有匹配行,则另外一表中的列返回空值

       交叉链接(CROSS JOIN):也称迪卡尔积:不带WHERE条件子句,它将会返回被链接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:                              T_student和T_class,返回4*4=16条记录),若是带where,返回或显示的是匹配的行数

6.  数据库的索引问题

           汇集索引非汇集索引的区别:

           汇集索引的顺序就是数据的物理存储顺序,而非汇集索引的解释是索引顺序与数据的物理排列顺序无关。一个表最多只能有一个汇集索引。

            汇集索引对于那些常常要搜索范围值的列特别有效。使用汇集索引找到第一个值得行后,即可以确保包含后续索引值的行在物理相邻。

          数据库索引的

 

7.   数据库的四大范式

    第一范式(1NF):属性不可拆分 或 无重复的列

        这个简单,就是一个属性不容许再分红多个属性来创建列。事实上,在目前的DBMS中是不可能拆分属性的,由于他们不容许这么作。

    第二范式(2NF):彻底函数依赖

       先讲讲什么是部分函数依赖。

       部分函数依赖,就是多个属性决定另外一个属性,但事实上,这多个属性是有冗余的。例如,(学号,班级)->姓名,事实上,只须要学号就能决定姓名,所以班级        是冗余的,应该去掉。知足第二范式的数据库设计必须先知足第一范式。所以第二范式的目标就是消除函数依赖关系中左边存在的冗余属性。

     第三范式(3NF):消除传递依赖

       不依赖于其余非主属性(消除传递依赖)。

       知足第三范式的数据库必须先知足第二范式。

       也就是,数据库中的属性依赖仅能依赖于主属性,不存在于其余非主属性的关联。

       例如,图书,图书室的关系。图书包括编号、出版商、页码等信息,图书室包括图书室编号、所存图书(外键)。其中,图书室的表中不该该存储任何图书的具体         信息(例如,出版商。。),而只能经过主键图书编号来得到对应图书的信息。

    BC范式(BCNF):

       (1)全部非主属性对每个码都是彻底函数依赖;

       (2)全部的主属性对于每个不包含它的码,也是彻底函数依赖;

       (3)没有任何属性彻底函数依赖于非码的任意一个组合。

        R属于3NF,不必定属于BCNF,若是R属于BCNF,必定属于3NF。

    第四范式(4NF):

       对于每个X->Y,X都能找到一个候选码( 若关系中的某一属性组的值能惟一地表示一个元组,而其真子集不行,则称该属性组为候选码)。

       最后举个例子(网上的):

 

学生表
学号
姓名
教师学生关系编号
系编号
爱好编号
一范式,就是表里的字段不能在划分属性了。
二范式,知足一范式基础,表里不存在与学号不要紧的信息
三范式,知足二范式的基础上,表里不存在其余字段的关联,
BC范式,知足三范式的基础上,就是学生表里的每行都不存在重复的信息
第四范式,知足BC范式,就是连爱好这样字段,也不能出现 ”篮球,足球“;要创建一个爱好编号表,插入数据:   insert into table values (,  , , )
相关文章
相关标签/搜索