Mysql
数据库(DB:DateBase)
概念:数据仓库,可以存储大量数据和管理数据
分类
关系型数据库:
- MySQL,Oracle,Sql Server,SQLite
- 通过表和表之间,行和列之间的关系进行数据的存储
非关系型数据库: (NoSQL) Not Only
- Redis,MongDB
- 对象存储,通过对象的自身属性决定。
数据表的类型
| MYISAM | INNODB | |
|---|---|---|
| 事务支持 | N | Y |
| 数据行锁定 | N | Y |
| 外键约束 | N | Y |
| 全文索引 | Y | N |
| 空间大小 | 较小 | 较大 |
登录:mysql -u root -p
初始化/创建data文件:mysqld --initialize-insecure --user=root
DDL(数据库定义语言)
创建数据库:create database if not exists student charset = gbk;
删除数据库:drop database if exists student;
更新数据库:alter database teacher charset = gbk;
查看数据库:show databases;
创建表:
①创建库 create database if not exists frank_school charset = gbk;
②use frank_school;
③create table if not exists teacher(
id int auto_increment primary key comment '主键id',
name varchar(30) not null comment '老师的名字',
phone varchar(20) comment '电话号码',
address varchar(100) default '暂时未知' comment '住址'
)engine=innnodb;
④show tables;
查看表: desc teacher;
删除表:drop table if exists stu, ooo;
修改表:
alter table student add gender varchar(1) first/after name;
alter table student drop address;
alter table student change phone tel_phone int(11); 可修改字段名
alter table student modify tel_phone int(13); 修改约束
alter table student rename students; 修改表名
清空表:truncate table student; --自增会归零
删除表:delete from test; --不会影响自增
delete删除后,重启数据库现象:
- InnoDB 自增列会从1开始(存在内存中,断电即失)
- MyISAM 继续从上一个自增量开始(存在文件中,不会丢失)
DML (数据库操纵语言)
插入数据:insert into teacher (id,name,phone,address) values (1,'Frank','1888888','ShangHai');
删除数据:detele from teacher where age < 20;
更新数据:update teacher set name = 'frank' where phone = '111';
DQL(数据库查询语言)
查询数据:
select * from teacher order by chinese asc/desc;
select avg(age) as '年龄' , gender as '性别' from ifo group by gender;
多表查询:
select name,score from student inner/left/right join score on student.id = score.stuId;
子查询:select * from student where id in/exists (select stuid from score where score >= 85);
MD5加密
update student set pwd=MD5(pwd)
事务
- 原子性:要么成功,要么失败
- 一致性:事务前后的数据完整性保证一致
- 持久性:事务一旦提交则不可逆,被持久化到数据库中
- 隔离性:多个用户并发访问数据库时,每个事务相互隔离
- 脏读:指一个事务读取了另一个事务未提交的数据
- 不可重复读:在一个事务内读取表中的某一个行数据,多次读取结果不同。
- 虚读:指在一个事务内读取到了别的事务插入的数据,导致前后不一致。
模拟转账
set autocommit = 0; --关闭自动提交
start transaction; --开启一个事务
update account set money=money-500 where name = 'a';
update account set money=money+500 where name = 'b';
commit; --提交后,就被持久化了
rollback; --回滚
set autocommit = 1; --恢复默认值
索引 Innodb默认数据结构:Btree
show index from student; --显示所有的索引信息
alter table school.student add fulltext index 'studentName' ('student'); --增加一个全文索引 (索引名)列名
create index id_app_user_name on app_user('name'); --添加索引 索引名 on 表(字段)
三大范式
第一范式;原子性,保证每一列不可再分
第二范式:满足第一范式前提,每张表只描述一件事情
第三范式:前提满足第一二范式,确保数据表中的每一列数据都和主键直接相关,不能间接相关
- 规范性和性能的问题:关联查询的表不得超过三张表
- 考虑商业化的需求,(成本,用户体验)数据库的性能更加重要
- 在规范性能的问题,需要适当的考虑规范性
- 故意给某些表增加冗余的字段(从多表查询变为单表查询)
- 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
浙公网安备 33010602011771号