过年没回老家,在这没事做就开始学习,还是学习效率低,但是我尽力了,今天终于把这个mysql的视频看完,总结一下。
参考:
老杜 – mysql入门基础 + 数据库实战:https://www.bilibili.com/video/BV1Vy4y1z7EX(较新、内容相对精炼,有习题)
视频感受:总体看完,感觉很新手,合适所有没学过数据库的人员学习,而且讲的比较详细,还有习题练习,缺乏的是对索引原理的详细解析,但是对于一个开发人员来说,完全足够
DB:数据库
DBMS:数据库管理系统,如mysql,oracle
SQL:结构化查询语言
关系:DBMS执行SQL操作DB
SQL可在DBMS使用,是个标准
安装卸载网上很多,就不详细写了
1 |
mysql -uroot -p123456//进入数据库 use test;//使用该数据库 create database create_db;//创建数据库 show tables;//查看表 |
- DQL:查询
- DML:CRUD
- DDL:数据库定义语言(操作表结构)
- TCL:事务控制语言
- DCL:数据控制语言(grant,revoke)
单表查询
DQL语句分类
- 单行处理函数
- 分组函数
关键字格式
1 |
<span class="token keyword">select</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">from</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">where</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">group</span> <span class="token keyword">by</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">order</span> <span class="token keyword">by</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> |
执行顺序
1 |
from---->where--->group by--->select--->order by |
注:
- 分组函数必须先分组再使用,因此不能再where中使用
having
不能单独使用,必须联合group by
使用where
和having
,优先使用where
连接查询
分类:
- 内连接
1 |
<span class="token keyword">select</span> e<span class="token punctuation">.</span>ename<span class="token punctuation">,</span>d<span class="token punctuation">.</span>name <span class="token keyword">from</span> emp e joint dept d <span class="token keyword">on</span> e<span class="token punctuation">.</span>deptno <span class="token operator">-</span> d<span class="token punctuation">.</span>deptno<span class="token punctuation">;</span> |
- 外连接
外连接中,表与表存在主次关系,内连接不存在
子查询
1 |
<span class="token keyword">select</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">from</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">where</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> |
...
中均可出现select…,即套娃行为
Union
1 |
<span class="token keyword">select</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">from</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">where</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">union</span> <span class="token keyword">select</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">from</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">where</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> |
union
效率比连接查询
高,连接查询
每次连接则匹配满足笛卡尔积现象,而union
使乘法转换为加法
limit
limit 5
取前5条
limit startIndex,len
取下标为startIndex
开始后len
条
关系:(pageIndex-1)*pageSize,pageSize=startIndex,len
1 |
<span class="token keyword">create</span> <span class="token keyword">table</span> tableName<span class="token punctuation">(</span>param1 <span class="token keyword">type</span><span class="token punctuation">,</span>param2 <span class="token keyword">type</span><span class="token punctuation">,</span>param3 <span class="token keyword">type</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> |
数据类型
- varchar:变长
- char:固定长度
- int
- clob:字符大对象
- blob:二进制大对象,如图,声音,视频
CURD
1 |
<span class="token keyword">insert</span> <span class="token keyword">into</span> <span class="token keyword">table</span> <span class="token punctuation">(</span>param1<span class="token punctuation">,</span>param2<span class="token punctuation">,</span>param3<span class="token punctuation">)</span><span class="token keyword">values</span> <span class="token punctuation">(</span>v1<span class="token punctuation">,</span>v2<span class="token punctuation">,</span>v3<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">(</span>v1<span class="token punctuation">,</span>v2<span class="token punctuation">,</span>v3<span class="token punctuation">)</span> |
快速建表
1 |
<span class="token keyword">create</span> <span class="token keyword">table</span> emp2 <span class="token keyword">as</span> <span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> emp |
delete和truncate
- delete一个一个删除,物理存储空间还在,可以回滚,效率低
- 快速删除,不支持回滚
- not null
- primary key
- unique
- foreign key
1 |
<span class="token keyword">foreign</span> <span class="token keyword">key</span><span class="token punctuation">(</span>cno<span class="token punctuation">)</span> <span class="token keyword">references</span> t_class<span class="token punctuation">(</span>classno<span class="token punctuation">)</span> |
- MyISAM
- 便于压缩
- 不支持事务
- InnoDB
- 支持事务
- MEMORY
- 查询快
- 断电即失,不安全
一个事务需要多个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特性:
- 主键自动添加索引
- unique约束自动添加索引
创建索引
create index emp_ename_index on emp(ename);
删除
drop index emp_ename_index on emp;
索引失效
使用explain
查看是否使用索引,expalin
是查看执行计划
索引分类
- 单一索引
- 复合索引
- 主键索引
- 唯一性索引
本质就是一个表,可以认为是个临时表,但是操作数据又会影响原表数据
作用:便于操作复杂的联合select
出来的表格,建个临时表,筛选需要的字段,便于操作
语法:
create view emp_view as select * from emp;
由于自身不是DBA,只是开发人员,不需要记住太多命令,需要去查找即可
-
导出数据
mysqldump 库名(表名,选填)> 路径
-
导入数据
source 文件
这种就不符合,应该把邮箱和手机分开写
多对多关系,就产生部份依赖
一对多,产生传递依赖
总结建表:
- 一对多,两张表,多的表加外键
- 多对多,三张表,关系表加两外键
- 一对一,字段多,拆多表,外键唯一
由于表和表之间连接次数越多,效率越低,因此又是可能存在冗余字段,但是为了减少表连接次数,这样做也是合理的,并且这对于开发人员来说,sql语句的编写难度也会降低