数据库
1数据库联接操作,左连接,右链接,全链接的操作以及区别,问了数据库的三大范式
一编码
1登录 mysql -uroot -p
2查询数据库 mysql>show database;
3 选中数据库 use 数据库
4 创建数据库 mysql>create database test;
创建数据表 CREATE TABLE *(No CHAR(9) PRIMARY KEY , ... ,... );
5 查询数据表mysql>show tables;
查询mysql>SELECT *FROM表名(WHERE...);WHERE加比较(<=>!NOT)范围(BETWEEN AND;IN)匹配(LIKE)空(IS NOT NULL)多重条件(AND;OR;NOT)
6 聚集函数:统计元组个数:SELECT COUNT(*) 加DISTINCT去掉重复值
统计一列中值的个数: SELECT COUNT(DISTINCT|ALL 列名)
计算一列值的总和/平均值:SELECT SUM/AVG(DISTINCT|ALL 列名)
一列值中的最大最小值: SELECT MAX/MIN(DISTINCT|ALL 列名)
附:聚集函数作为条件表达式不用WHERE用HAVING
7 删除数据库 drop database <数据库名>;
8 插入数据 INSERT INTO 表名( field1, field2,...fieldN )
VALUES( value1, value2,...valueN );
9 修改数据 UPDATE表名 SET 列名1=value1[,列名2=value2] [WHERE ...]
9 删除数据 DELETE FROM 表名[WHERE ...]
10 排序 SELECT * from 表ORDER BY field1 ASC/DESC;
11 分组 SELECT name, COUNT(*) FROM 表GROUP BY name;
12 连接 在SELECT, UPDATE和DELETE语句中使用连接来联合多表查询
INNER JOIN(内连接,等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接):获取右表所有记录,即使左表没有对应匹配的记录。
附:1) 自然连接:特殊的等值连接,将两表重复属性列去掉
- 等值连接必须要有等值的条件,自然连接必须要有相同的属性列。
- JOIN连接用条件语句时,使用 ON 而不是 WHERE
13 统计select count(*) from table 表示返回表中包括空行和重复行在内的行数,但是会扫描所有列
select count(1) from table 也是返回表中包括空行和重复行在内的行数,不会扫描所有列,1其实就是表示有多少个符合条件的行,但是此时没有where,所有没条件也就是返回总行数
14 多表查询Q:查询选修2号课程的学生学号和姓名
A:SELECT Student.Sno,Sname FROM Student,SC
WHERE Student.Sno=SC.Sno AND SC.Cno=’2’;
15例2:test表有id,name,subject,grade。求出总分大于300分的学生的名单
SELECT name FROM test GROUP BYname HAVING SUM(score)>240
二、范式
1 X确定Y,Y依赖于X,记X->Y
U完全依赖k,则k为R<u,f>的候选码,在任意候选码的属性叫主属性
2 第一范式 每个字段/属性不可再分
3 第二范式 第一范式且每个非主属性完全依赖任何一个候选码
4 第三范式 是第二范式且;每一个非主属性既不传递依赖于码也不部分依赖码
三、约束
1 实体完整性 主码值唯一,主码各属性不空
2 参照完整性 若属性组F是基本关系R的外码,它与基本关系S的主码k相对应,则R中每个元组在F上的值是空值或S中某元组的主码值
3 用户完整性 非空(NOT NULL);唯一(UNIQUE);检查满足(CHECK)
附:外码:如果一个关系中的一个属性是另外一个关系中的主码则这个属性为外码。外码的值要嘛为空,要嘛要为其对应的主码中的一个值。
附2:部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
四 MySQL索引
1索引是排好序帮助快速查找的数据结构,用B+数不用红黑树:
2 B+树在B树的基础上,将非叶节点改造为不存储数据纯索引节点,m叉树,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。B+树节点key 从左到右非递减排列。
3 查看是否使用索引用explain 关键字(加在select前)查询,看如下字段值:
- type至少达 range 级别,最好能ref 级,否则可能性能问题,值为all没用索引
- possible_keys 字段没加索引时值为 NULL,加了索引后的值为 address
- key 显示实际决定查询结果使用的键(索引)。如果没有使用索引,值为NULL
- rows 字段显示执行查询时必须检查的行数,没用索引是数据表全部行数
4 索引优化
1) 索引列的顺序:让选择性最强的索引列放在前面。
索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,选择性越高,每个记录的区分度越高,查询效率也越高。
- 事务指一组 SQL 语句;可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。
1事务满足ACID4个特性
1) 原子性(Atomicity)事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
2) 一致性(Consistency)数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。
3) 隔离性(Isolation)某事务所做的修改在最终提交以前对其它事务是不可见的。
4) 持久性(Durability)一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。系统发生崩溃可以用重做日志(Redo Log)进行恢复,从而实现持久性
2 并发一致性问题:在并发环境下,事务的隔离性很难保证。
- 丢失修改指一个事务的更新操作被另外一个事务的更新操作替换。
- 读脏数据指在不同的事务下,当前事务可以读到另外事务未提交的数据。例如:T1 修改一个数据但未提交,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
- 不可重复读指在一个事务内多次读取同一数据集合。在这一事务还未结束前,另一事务也访问了该同一数据集合并做了修改,由于第二个事务的修改,第一个事务的两次读取的数据可能不一致。
- 幻读本质上也属于不可重复读的情况,T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
- 注:不可重复读的重点是修改,幻读的重点在于新增或者删除。不可重复读只需要锁住满足条件的记录,幻读要锁住满足条件及其相近的记录
3隔离级别
- 未提交读(READ UNCOMMITTED): 事务中的修改,即使没有提交,对其它事务也是可见的。
- 提交读(READ COMMITTED): 一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
- 可重复读(REPEATABLE READ): 保证在同一个事务中多次读取同一数据的结果是一样的。
- 可串行化(SERIALIZABLE): 强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。该隔离级别需要加锁实现。
- 附:未提交3个都不能解决,提交读可解决脏读,可重复读可解决脏读和不可重复读,可串行化可解决脏读,不可重复读和幻读。
4 读写锁
互斥锁(Exclusive),简写为 X 锁,又称写锁。
共享锁(Shared),简写为 S 锁,又称读锁。
一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。
一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。
5事务相关概念和注意事项
- 回退(rollback)指撤销指定 SQL 语句的过程;
- 提交(commit)指将未存储的 SQL 语句结果写入数据库表;
- 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)。
- 不能回退 SELECT 语句,回退 SELECT 语句也没意义;也不能回退 CREATE 和 DROP 语句。
5) MySQL 的事务提交默认是隐式提交,每执行一条语句就把这条语句当成一个事务然后进行提交。
六、视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。对视图的操作和对普通表的操作一样。视图具有如下好处:
1) 简化复杂的 SQL 操作,比如复杂的连接;
2) 只使用实际表的一部分数据;
3) 通过只给用户访问视图的权限,保证数据的安全性;
4) 更改数据格式和表示。
- 触发器会在某个表执行以下语句时而自动执行:DELETE、INSERT、UPDATE。
十、Redis 是完全开源的,遵守BSD协议,是一个高性能的 key-value 数据库。是缓存数据库,非关系数据库。当浏览器执行请求时,首先会对在缓存中进行查找,如果存在,就获取;否则就访问数据库。缓存的好处就是读取速度快。
- 为什么Redis快:
a.基于内存实现,减少了一些不必要的 I/O 操作。
b.高效的数据结构,支持Redis存储不同的数据,数据存储时间复杂度降到最低
c.合理的数据编码,根据字符串的长度及元素的个数适配不同的编码格式。
d.合适的线程模型,I/O 多路复用模型同时监听客户端连接;单线程在执行过程中不需要进行上下文切换,减少了耗时。