2022.2.1-2022.2.3mysql学习笔记

过年没回老家,在这没事做就开始学习,还是学习效率低,但是我尽力了,今天终于把这个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使用
  • wherehaving,优先使用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)

存储引擎

  • 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是查看执行计划

  1. 使用%开头的模糊查询
  2. 使用or,要求两边条件都有索引,单边会使索引失效
  3. 使用复合索引未使用左侧的列查找
  4. where中索引列参加运算
  5. where中索引列使用了函数

索引分类

  • 单一索引
  • 复合索引
  • 主键索引
  • 唯一性索引

试图

本质就是一个表,可以认为是个临时表,但是操作数据又会影响原表数据

作用:便于操作复杂的联合select出来的表格,建个临时表,筛选需要的字段,便于操作

语法:
create view emp_view as select * from emp;

DBA常用命令

由于自身不是DBA,只是开发人员,不需要记住太多命令,需要去查找即可

  • 导出数据
    mysqldump 库名(表名,选填)> 路径

  • 导入数据
    source 文件

数据库设计三范式

  1. 第一范式:有主键,每个字段原子性不可分
id name contact
1 lisi [email protected],136xxxx

这种就不符合,应该把邮箱和手机分开写

  1. 第二范式:在第一范式基础上,非主键完全以来主键,不产生部分依赖
sid sname tid tname
1 lisi 1001 李老师
2 zhangsan 1001 李老师
3 wangwu 1002 赵老师

多对多关系,就产生部份依赖

  1. 第三范式:第二范式基础上,非主直接依赖主键,不产生传递依赖
sid sname classno class
1 lisi 1001 一班
2 zhangsan 1005 五班
3 wangwu 1006 五班

一对多,产生传递依赖

总结建表:

  • 一对多,两张表,多的表加外键
  • 多对多,三张表,关系表加两外键
  • 一对一,字段多,拆多表,外键唯一

由于表和表之间连接次数越多,效率越低,因此又是可能存在冗余字段,但是为了减少表连接次数,这样做也是合理的,并且这对于开发人员来说,sql语句的编写难度也会降低

你可能感兴趣的:(学习笔记,数据库,mysql,sql)