数据库常考知识点

1. 并发控制:

无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制问题。在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种锁叫做共享锁排他锁。也叫读锁写锁。读锁是共享的,写锁则是排他的。

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

 

2. 事务

事务是一组原子性的SQL查询,或者说是一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果有任何一条语句因为崩溃或其他原因无法执行,阿么其他的语句都不会执行。事务内的语句,要么全部执行成功,要么全部执行失败。

事务的ACID特性:

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

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

隔离性(isolation):通常来说一个事务所做的修改在最终提交之前,对其他事务是不可见的。

持久性(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 (, , , )




posted @ 2017-10-11 19:01  爱简单的Paul  阅读(1440)  评论(0编辑  收藏  举报