目录:
一、查询数据库/表格
二、Mysql的建表约束
1.主键约束
2.联合主键
3.自增约束
4.唯一约束
5.非空约束
6.默认约束
7.外键约束
三、Mysql的三大设计范式
1.第一范式
2.第二范式
3.第三范式
四、Mysql的四种连接查询
1.内连接
2.外连接(左连接、右连接、完全外连接)
五、Mysql的事务
1.事务的四种特征
2.隔离性的四种情况
一、查询数据库/表格
1.查询数据库服务器中的所有数据库:show databases
2.查询数据库中的所有表格:show tables
二、Mysql的建表约束
1.主键约束
它能够唯一确定一张表中的一条记录,该字段不重复且不能为空,创建表时如果忘记添加主键,可以使用命令:alter table (表名) add primary key (属性名)来增加主键,alter table (表名) drop primary key来删除主键,alter table (表名) modify (属性名+变量类型) primary key来修改主键。
2.联合主键
多个字段联合组成的主键,只要联合的值不完全重复即可,primary key(属性名,...)
3.自增约束
和主键约束联合使用后可以自动累加ID值(auto_increment)
4.唯一约束
约束修饰的字段的值不能重复alter table (表名) add unique (属性名),多个元素联合则类似于联合主键,只要联合值不重复就可以。alter table (表名) drop index (属性名)删除。alter table (表名) modify (属性名+变量类型) unique来删除主键。
5.非空约束
修饰的字段不能为空NULL(not null)
6.默认约束
当我们插入字段值的时候,如果没有传值,就会使用默认值,例如age int default 10,传了值就不会是默认值。
7.外键约束
涉及到两个表,父表和子表-主表和副表,例如:
班级表
Create table classes(id int primary key, name varchar(20));
学生表:
Create table students(id int primary key, name varchar(20),class_id int, foreign key(class_id ) references classes(id));
主表中classes没有的数据值在副表中是不可以使用的,若主表中的记录被幅表引用了,那么也不可以被删除。
三、Mysql的三大设计范式
1.第一范式
数据表中的所有字段都是不可分割的原子集,字段值还可以继续拆分的,就不满足第一范式,下图就不满足第一范式
2.第二范式
必须是满足第一范式的前提下,第二范式要求,除主键外的每一列都必须完全依赖于主键,如果要出现不完全依赖,只可能发生在联合主键的情况下。
3.第三范式
必须先满足第二范式,除开主键列的其他列之间不能有传递依赖关系。
四、Mysql的四种连接查询
1.内连接
inner join 或 join
语句示例:select * from person inner join card on person.cardID=card.id;
其实就是两张表的数据,通过某个字段相等,查询出相关记录数据。
2.外连接(左连接、右连接、完全外连接)
①左连接 left join 或 left outer join
语句示例:select * from person left join card on person.cardID=card.id;
左外连接,会把左边表里面的所有数据取出来,而右边表中的数据,如果有相等的,就显示出来,如果没有就补NULL。
②右连接 right join 或 right outer join
语句示例:select * from person right join card on person.cardID=card.id;
右外连接,会把右边表里面的所有数据取出来,而左边表中的数据,如果有相等的,就显示出来,如果没有就补NULL。
③完全外连接 full join 或 full outer join
语句示例:select * from person full join card on person.cardID=card.id; mysql不支持full join
五、Mysql的事务
事务其实是一个最小的不可分割的工作单元,事务能够保证一个业务的完整性。给我们提供了一个返回的机会。
比如我们的银行转账:
A --> -100 Update user set money=money-100 where name = ‘A’
B --> +100 Update user set money=money+100 where name = ‘B’
实际的程序中,如果只有一条语句执行成功了,而另一条没有执行成功,那么这次事务就判定为失败。事务默认状态下是开启的,当我们执行一个sql语句的时候,效果会立即体现出来,不能回滚(rollback)。所以,我们可以在转账之前先执行begin/start transaction操作,手动开启事务,但如果事务一旦提交了(commit)就不能回滚了。
1.事务的四种特征
A:原子性:事务是最小的单位,不可以再分割
C:一致性:事务要求,同一事务中的SQL语句,必须保证同时成功或失败
I:隔离性:事务1和事务2之间是具有隔离性的
D:持久性:事务一旦结束(commit),就不可以返回
2.隔离性的四种情况
分为以下4种情况,越往后安全级别越高,但性能越差:
1.read uncommitted:读未提交的
如果有事务a和事务b,a事务对数据进行操作,在操作过程中,事务没有被提交,但b可以看见a操作的结果。这样就会出现脏读(一个事务读到了另一个事务没有提交的数据),例如小明在淘宝点买东西转账后使用rollback撤回转出去的钱。
2.Read committed:读已经提交的
虽然我能读到另一个事务提交的数据,但还是会出现问题,就是读取到同一个表的数据,发现前后不一致。两个人同时操作时没有实时更新导致,a和b同时操作一张表,a插入了一条数据,b要求平均值,此时b查到平均值是更新后的而不是原表的。
3.Repeatable read:可以重复读
两个人同时开启事务进行操作一张表时,会出现幻读,例如A插入了一条数据6号,同时B也插入一条数据6号,但显示不能插入,也查询不到6号。即事务a提交的数据,不能被事务b读到。
4.Serializable:串行化
会出现SQL语句被卡住的情况,对于同一张表,当一方在进行事务操作的时候,另一方会进入排队状态,直到另一方提交。