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开头的产品
LIKE 和 REGEXP的区别:
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都能找到一个候选码( 若关系中的某一属性组的值能惟一地表示一个元组,而其真子集不行,则称该属性组为候选码)。
最后举个例子(网上的):