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