过年没回老家,在这没事做就开始学习,还是学习效率低,但是我尽力了,今天终于把这个mysql的视频看完,总结一下。
参考: 老杜 - mysql入门基础 + 数据库实战:https://www.bilibili.com/video/BV1Vy4y1z7EX(较新、内容相对精炼,有习题)
视频感受:总体看完,感觉很新手,合适所有没学过数据库的人员学习,而且讲的比较详细,还有习题练习,缺乏的是对索引原理的详细解析,但是对于一个开发人员来说,完全足够
什么是DB?DBMS?SQL?他们的关系
DB:数据库 DBMS:数据库管理系统,如mysql,oracle SQL:结构化查询语言 关系:DBMS执行SQL操作DB
SQL可在DBMS使用,是个标准
安装,卸载mysql
安装卸载网上很多,就不详细写了
使用
登录
mysql -uroot -p123456//进入数据库
use test;//使用该数据库
create database create_db;//创建数据库
show tables;//查看表
SQL语句分类
- DQL:查询
- DML:CRUD
- DDL:数据库定义语言(操作表结构)
- TCL:事务控制语言
- DCL:数据控制语言(grant,revoke)
DQL
单表查询
DQL语句分类
关键字格式
select
...
from
...
where
...
group by
...
order by
...
执行顺序
from---->where--->group by--->select--->order by
注:
- 分组函数必须先分组再使用,因此不能再where中使用
having 不能单独使用,必须联合group by 使用where 和having ,优先使用where
连接查询
分类:
select
e.ename,d.name
from
emp e
joint
dept d
on
e.deptno - d.deptno;
外连接中,表与表存在主次关系,内连接不存在
子查询
select ... from ... where...
... 中均可出现select…,即套娃行为
Union
select ... from... where ...
union
select... from ... where...
union 效率比连接查询 高,连接查询 每次连接则匹配满足笛卡尔积现象,而union 使乘法转换为加法
limit
limit 5 取前5条 limit startIndex,len 取下标为startIndex 开始后len 条
关系:(pageIndex-1)*pageSize,pageSize=startIndex,len
建表
create table tableName(param1 type,param2 type,param3 type...)
数据类型
- varchar:变长
- char:固定长度
- int
- clob:字符大对象
- blob:二进制大对象,如图,声音,视频
DML
CURD
insert into table (param1,param2,param3)values
(v1,v2,v3),(v1,v2,v3)
快速建表
create table emp2 as select * from emp
delete和truncate
- delete一个一个删除,物理存储空间还在,可以回滚,效率低
- 快速删除,不支持回滚
约束
- not null
- primary key
- unique
- foreign key
foreign key(cno) references t_class(classno)
存储引擎
事务
一个事务需要多个DML语句,因为一个业务不可能一个DML语句可以完成,因此需要事务
如何做到
使用事务性活动的日志文件
mysql默认自动commit,需要使用start transcation关闭自动提交事务
事务特性
ACID
- 原子性:一个事务为基本单位,不可分割
- 一致性:要么成功,要么失败
- 隔离性:事务存在隔离级别
- 持久性:持久化到硬盘中
隔离级别
- 读未提交
read uncommitted
- A可读B未提交的数据
- 存在脏读现象
- 一般没人用这个隔离级别
- 读已提交
read committed
- A只能读到B提交的数据
- 存在不可重复读数据(即同一条语句,产生不同结果)
- 每次读的数据是绝对的真实
- 可重复读
repeatable read
- mysql默认
- 存在幻读现象
- 永远读的是事务开始前的数据
- 串行化
serializable
修改隔离级别 set global transaction isolation level ____ 查看隔离级别 select @@tx_isolation
索引
本质就是目录 原理使用B树的搜索,更细致是B+树搜索
mysql特性:
创建索引 create index emp_ename_index on emp(ename);
删除 drop index emp_ename_index on emp;
索引失效
使用explain 查看是否使用索引,expalin 是查看执行计划
- 使用
% 开头的模糊查询 - 使用
or ,要求两边条件都有索引,单边会使索引失效 - 使用复合索引未使用左侧的列查找
- where中索引列参加运算
- where中索引列使用了函数
索引分类
试图
本质就是一个表,可以认为是个临时表,但是操作数据又会影响原表数据
作用:便于操作复杂的联合select 出来的表格,建个临时表,筛选需要的字段,便于操作
语法: create view emp_view as select * from emp;
DBA常用命令
由于自身不是DBA,只是开发人员,不需要记住太多命令,需要去查找即可
数据库设计三范式
- 第一范式:有主键,每个字段原子性不可分
id | name | contact |
---|
1 | lisi | 162524243353@qq.com,136xxxx |
这种就不符合,应该把邮箱和手机分开写
- 第二范式:在第一范式基础上,非主键完全以来主键,不产生部分依赖
sid | sname | tid | tname |
---|
1 | lisi | 1001 | 李老师 | 2 | zhangsan | 1001 | 李老师 | 3 | wangwu | 1002 | 赵老师 |
多对多关系,就产生部份依赖
- 第三范式:第二范式基础上,非主直接依赖主键,不产生传递依赖
sid | sname | classno | class |
---|
1 | lisi | 1001 | 一班 | 2 | zhangsan | 1005 | 五班 | 3 | wangwu | 1006 | 五班 |
一对多,产生传递依赖
总结建表:
- 一对多,两张表,多的表加外键
- 多对多,三张表,关系表加两外键
- 一对一,字段多,拆多表,外键唯一
由于表和表之间连接次数越多,效率越低,因此又是可能存在冗余字段,但是为了减少表连接次数,这样做也是合理的,并且这对于开发人员来说,sql语句的编写难度也会降低
|