MySQL的简介
什么是数据库
1. 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同 的API(接口)用于创建,访问,管理,搜索和复制所保存的数据 2. 我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据 库管理系统(RDBMS)来存储和管理的大数据量 3. 所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据 4. RDBMS即关系数据库管理系统(Relational Database Management System)的特点: 1)数据以表格的形式出现 2)每行为各种记录名称 3)每列为记录名称所对应的数据域 4)许多的行和列组成一张表单 5)若干的表单组成database
2、RDBMS 术语
1. 数据库: 数据库是一些关联表的集合。
2. 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格
3. 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
4. 行: 一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
5. 冗余: 存储两倍数据,冗余可以使系统速度更快
1)查询时可能经常需要在多个表之间进行连接查询;而进行连接操作会降低查询速度
2)学生的信息存储在student表中,院系信息存储在department表中,如果要查询一个学生所在系的名
称,必须从student表中查找学生所在院系的编号,然后根据这个编号去department查找系的名称
3)如果经常需要进行这个操作时,连接查询会浪费很多的时间,因此可以在student表中增加一个冗余
字段dept_name,该字段用来存储学生所在院系的名称(这样就不用每次都进行连接操作了)
6. 主键: 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据
7. 外键: 外键用于关联两个表(两个表通过都有的一个字段连接起来了)
8. 复合键: 复合键(组合键)将多个列作为一个索引键,一般用于复合索引
9. 索引: 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。
类似于书籍的目录。
1) 当某个字段设置为索引后,就会将此字段中所有值对应自己的md5
2) 当从数据库查询时可以通过二分法等算法快速查找到这个条目
10. 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体
3、Mysql数据库特点
1. Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database
Management System:关系数据库管理系统)应用软件之一
2. 由瑞典MySQL AB公司开发,目前属于Oracle公司
3. MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大
仓库内,这样就增加了速度并提高了灵活性
1) Mysql是开源的,所以你不需要支付额外的费用
2) Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库
3) MySQL使用标准的SQL数据语言形式
4) Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言
5) MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,
64位系统支持最大的表文件为8TB
6) Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统
4、主键、外键、索引比较
1. 主键与外键区别
1. 主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
2. 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键
2. 主键与唯一索引区别
1. 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
2. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
3. 唯一性索引列允许空值,而主键列不允许为空值。
4. 主键可以被其他表引用为外键,而唯一索引不能。
5. 一个表最多只能创建一个主键,但可以创建多个唯一索引。
6. 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
视图
1、什么是视图
1)视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】
2)用户使用时只需使用视图【名称】即可获取结果集,并可以将其当作表来使用
3)视图通常用在对某个结果查询的非常频繁,那么就可以使用视图虚拟出一张表,将这个查询结果放到这个视
中,以后我们仅仅对这个视图就行查询是对上面结果的查询
4)如果原表数据改变那么视图中的值也会随着改变,视图中的数据修改也会影响原表中数据
5)一下几种情况视图中数据无法改变:
A. 视图中的列不在原表中(比如视图中查询时取得别名列:商品平均价格)
B. 视图中的那个数据对应原表中多个数据时也无法修改
2、为什么要有视图
1)可以简化查询
2)可以进行权限限制(将一部分列放到视图中让其他人操作)
3)大数据分表时可以用到
3、视图例子
1)比如现在我们有一张商品表,表中有许多字段,现在我们需要经常查询商品价格和名称这两个字段 2)并且我们只想显示这个表中价格大于100的所有商品 3)那么我们就可以创建一个视图good_price,然后将需要查的指定信息存储到这个视图中 #1 创建视图good_price create view good_price as select name,price from goods where price > 100; #2 修改视图 alter view good_price as select name,price from goods where price >300; #3 删除视图 drop view good_price;
触发器
1、什么是触发器
1)对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器
2)触发器用于定制用户对表的行进行【增/删/改】前后的行为
3)触发器只能对永久表使用,不能对临时表 创建
4)MySQL对同一表相同触发时间的相同触发事件,只能定义一个触发器
2、创建触发器使用语法
1. 创建触发器基本语法
Create trigger 触发器名
{before | after} #insert,update,delete之前还是之后触发
{insert | update | delete} #触发的事件是什么
On 表明 for each row 要出发的SQL语句:
2. 触发器使用举例
说明:创建一个触发器t1每次向data表中插入一条数据后就计算一下插入后的新表中数据条目数放到total表
Create trigger t1 #创建触发器名称是:t1
after #在下面插入语句insert之后执行这个触发器
insert #指定只有当执行insert语句才会触发
on data for each row #指定是对表data执行每行都会执行触发器update操作
update total set count=char_length(NEW.name) #指定触发的事件即执行这条SQL语句
3. 删除触发器
DROP TRIGGER t1;
4. 使用触发器
触发器无法由用户直接调用,而是由于对表的【增/删/改】操作被动引发的
事物
1、事务的介绍
1)事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行
它是一个不可分割的工作执行单元。
2、事务的使用场景
1)在日常生活中,有时我们需要进行银行转账,这个银行转账操作背后就是需要执行多个SQL语句,假
如这些SQL执行到一半突然停电了,那么就会导致这个功能只完成了一半,这种情况是不允许出现,
要想解决这个问题就需要通过事务来完成。
3、事务的四大特性
原子性:
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么
全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
一致性:
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即
使在转账过程中系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做
的修改也不会保存到数据库中。)
隔离性:
通常来说,一个事务所做的修改操作在提交事务之前,对于其他事务来说是不可见的。(在前面的例
子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则
其看到支票帐户的余额并没有被减去200美元。)
持久性:
一旦事务提交,则其所做的修改会永久保存到数据库。
说明:事务能够保证数据的完整性和一致性,让用户的操作更加安全。
4、事务的定义 (作用是可以撤销begin后面执行的命令)
1)MySQL 事务主要用于处理操作量大,复杂度高的数据。
2)在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等
3)这样,这些数据库操作语句就构成一个事务!
4)在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
5)事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
6)事务用来管理insert,update,delete语句
5、事务是必须满足4个条件
1、原子性:一组事务,要么成功;要么撤回
2、稳定性: 有非法数据(外键约束之类),事务撤回
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回
4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得,
innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。
6、使用事务手动撤销对MySQL的操作
mysql> begin; #开始一个事务
mysql> insert into student(name,age,register_data) values("wangwu",99,"2016-06-20"); #执行一条命令
mysql>rollback; #回滚 , 这样数据是不会写入的
mysql> commit; #执行commit后命令执行结果是正真的写入硬盘了(rollback也无法撤回)
MySQL数据库默认采用自动提交(autocommit)模式, 也就是说修改数据(insert、update、delete)的操作
会自动的触发事务,完成事务的提交或者回滚
开启事务使用 begin 或者 start transaction; 事务 81
pymysql 里面的 conn.commit() 操作就是提交事务
pymysql 里面的 conn.rollback() 操作就是回滚事务
注:当然如果上面的数据没问题,就输入commit提交命令就行