1. 创建表
2. 删除表
drop table if exists t_student;
3. 插入数据
insert into t_student(no,name,sex,classno,birth) values(1,'zhangsan','1','gaosan1','2020-02-02'); 插入一条数据
insert into t_student(no,name,sex,classno,birth) values(3,'wang','1','gaosan',2020-02-03),(4,'gang','1','gaosan',2020-02-23),(5,'san','0','gaosan',2020-09-02); 插入多条数据
4. 表的复制
create table t1 as select * from dept;
5. 修改数据
update dept set dname = 'RENSHIBU',loc = 'SHANGHAI' where deptno = 10; 部门是10的名字改为人事部,地点改为上海
update t_student set name = 'X',classno = 'Y'; 修改表中字段的所有数据
6. 删除数据
delete from t_student where no = 1;
delete from t_student; 删除所有数据
truncate t1; 删除大表中的数据,表被截断,不可回滚,永久删除,危险度高
7. 约束
保证表中数据的合法性,有效性,完整性。
非空约束(NOT NULL),唯一约束(unique),主键约束(primary key),外键约束(foreign key)
非空约束
insert into t_user(id,password) values(1,'aa'); ERROR 1364 (HY000): Field 'username' doesn't have a default value
唯一性约束(列级约束,表级约束)
insert into t_user(id ,username) values(1,'aa');
insert into t_user(id ,username) values(2,'bb');
insert into t_user(id ,username) values(3,'bb'); ERROR 1062 (23000): Duplicate entry 'bb' for key 't_user.username'
insert into t_user values(1,'111','AAA');
insert into t_user values(2,'111','BBB');
insert into t_user values(3,'333','AAA');
insert into t_user values(4,'111','AAA'); ERROR 1062 (23000): Duplicate entry '111-AAA' for key 't_user.usercode'
主键约束(不能为空,不能重复)
根据主键字段的字段数量划分:
单一主键(推荐常用)
复合主键(多个字段联合添加一个主键约束,不推荐使用)
根据主键性质划分:
自然主键:和业务场景没有关系的自然数,推荐使用
业务主键:主键和系统业务有关系,不推荐使用
insert into t_user values(1,'aa','111'),(2,'bb','222'),(3,'cc','333');
select * from t_user;
insert into t_user (id ,username,password) values(1,'dd','444'); ERROR 1062 (23000): Duplicate entry '1' for key 't_user.PRIMARY'
insert into t_user(username,password) values('ee','555'); ERROR 1364 (HY000): Field 'id' doesn't have a default value
insert into t_user values(1,'aa','111'),(2,'bb','222'),(3,'cc','333');
select * from t_user;
insert into t_user(id ,username,password) values(1,'dd','444'); ERROR 1062 (23000): Duplicate entry '1' for key 't_user.PRIMARY'
mysql主键自增
insert into t_user(username) values('AA');
insert into t_user(username) values('BB');
insert into t_user(username) values('CC');
select * from t_user;
外键约束
外键约束的两张表可以看作父子表。创建表、数据时,要先创建父表、数据;删除表、数据时,要先删除子表、数据。
创建父表
创建子表
insert into t_class(cno,cname) values(101,'xian'); 在父表中创建数据
insert into t_class(cno,cname) values(102,'henan');
insert into t_student values(1,'aa',101); 在子表中创建数据
insert into t_student values(2,'bb',101);
insert into t_student values(3,'cc',102);
insert into t_student values(4,'dd',102);
select * from t_class;
select * from t_student;
insert into t_student values(5,'ee',103); 字段作为外键,要插入的数据必须在父表中已经存在。ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mydatabase`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
insert into t_student(id,name) values(6,'ff'); 可以插入,外键可以为空
外键字段引用某个表的字段时,被引用表的字段不一定要是主键,但至少要具有唯一性(因为如果父表中该字段重复,那么子表就不能确定对应字段的值)。
8. 存储引擎
存储引擎:数据的存储方式
MySQL5.5之前默认存储引擎是MyISAM,5.5之后都改为InnoDB,
(1)查看默认存储引擎:
show create table emp;
(2)查看MySQL支持的所有存储引擎:
show engines;
(3)在创建表时指定存储引擎:
create table t1(id int) engine = innodb;
create table t2(id int) engine = myisam;
create table t3(id int) engine = memory;
几种常见的存储引擎:
MyISAM 存储引擎:可被压缩,节省空间,但是不支持事务;
InnoDB存储引擎:支持事务,安全,但是不能被压缩;
MEMORY存储引擎:数据和索引都存储在内存中,查询速度快,但是数据容易丢失;
9. 事务(Transaction)
事务是一个完整的业务逻辑单元,不可分割;
事务的四大特性:ACID
A:原子性:事务是最小的工作单元,不可再分;
C:一致性:事务必须保证多条DML语句同时成功或者同时失败;
I:隔离性:事务A和事务B之间具有隔离;
D:持久性:最终的数据必须持久化到硬盘文件中,事务才算成功结束;
事务的隔离级别
(1)read uncommitted 未提交读,所有事务都可以看到没有提交事务的数据。
可能出现脏读,指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另一个事务也在访问整个数据,然后使用了数据。
(2)read committed 提交读,事务成功提交后才可以被查询到。
当设置为read committed时,避免了脏读,但是可能会造成不可重复读,指一个事务多次读同一数据时,这个事务还没结束,此时另一个事务也访问了该数据并对该数据修改,那么在第一个事务的两次读数据之间,读到的数据可能是不一样的。
(3)repeatable 重复读,同一事务多次查询却返回了不同的数据值,即可能将未提交的记录查询出来,这是MySQL的默认隔离级别。
当设置未repeatable时,可以避免不可重复读,但是可能出现幻读,第一个事务对一个表中数据修改,这种修改涉及表中全部数据行,同时第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据,那么以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就像发生了幻觉一样。
(4)Serializable 可串行化,在每个读数据行上添加共享锁,导致大量超时现象和锁竞争,多个事务时,只有运行完一个事务之后,才能运行其他事务,完全串行化,避免了脏读,不可重复度和幻读。
查看MySQL的提交机制,返回1是自动提交,MySQL是自动提交机制
SELECT @@AUTOCOMMIT;
insert into t_user values (1,'AA'),(2,'BB'),(3,'CC');
select * from t_user;
rollback; 执行rollback,数据还是存在,说明MySQL中执行语句后事务是自动提交的
select * from t_user;
start transction; 开启事务,关闭自动提交,数据已经不能自动保存提交到硬盘文件中,回滚后数据丢失
insert into t_user values (4,'DD'),(5,'EE');
select * from t_user;
rollback; 回滚后,数据丢失
select * from t_user;
insert into t_user values (6,'FF'),(7,'GG');
commit; 使用commit手动提交,数据依然可以保存到硬盘文件中
select * from t_user;
rollback; 执行回滚,数据依然在
select * from t_user;
10 索引
给字段添加索引,加快查询速度
(1)查看sql执行计划
explain select ename,sal from emp where sal = 5000; 没有创建索引会在14条记录中查询
(2)创建索引
create index emp_sal_index on emp(sal); 格式:create index 索引名 on 表明(字段名)
explain select ename,sal from emp where sal = 5000; 创建索引后在一条记录中查询
(3)删除索引
drop index emp_sal_index on emp;
索引的实现原理:
索引底层使用数据结构是:B+Tree
通过B Tree缩小扫描范围,底层索引进行排序,分区,索引会携带数据在表中的物理地址,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的。
select ename from emp where ename = 'smith';
转换为:
select ename from emp where ename = '0x33';
11 视图
视图是一个虚拟表,方便用户操作数据,对视图操作影响原表数据,视图可以隐藏表的实现细节。
drop table if exists emp_bak;
create table emp_bak as select * from emp;
(1)创建视图
create view myview as select empno,ename,sal from emp_bak;
(2)更新视图中数据
update myview set ename = 'tom' where empno = 7369;
(3)查看视图中数据
select * from myview;
(4)删除视图中数据
delete from myview where empno = 7369; 对视图更新删除数据影响原表数据,会删除emp_bak表中的数据
(5)查看视图中数据
select * from myview;
(6)查看原本中的数据
select * from emp_bak;
12 导出
windows平台在windows的dos命令窗口执行
(1)导出整个数据库:
mysqldump mydatabase > D:\mydatabase.sql -u用户名 -p密码
(2)导出数据库中的一张表:
mysqldump mydatabase emp > D:mydatabase.sql -uroot -p密码
(3)导入数据库表:
create database 数据库;
use 数据库;
source 文件名.sql
13 数据库设计三范式
设计表的依据,依照这三个范式不会出现数据冗余
第一范式:表中要有主键,字段满足原子性,不可再分;
第二范式:在第一范式基础上,非主键字段完全依赖主键,不能产生部分依赖(一般复合主键的场景);多对多,三张表,关系表两个外键;
第三范式:在第二范式的基础上,非主键字段直接依赖主键,不能产生传递依赖;一对多,两张表,多的表加外键;
一对一表的设计:
主键共享:主键字段既是主键也是外键;
外键唯一:一对多表,多表中的外键具有唯一性,具有唯一性才可以唯一匹配,一一对应;
MySQL存储引擎参考:https://www.cnblogs.com/tjp40922/p/10077190.html
MySQL事务隔离参考:https://www.cnblogs.com/personsiglewine/p/11507866.html