写在前面
本文是边看黑马b站视频边写的一片笔记, 文中大多图片都来自黑马视频. 旨在巩固学习以及方便后续查阅和供广大朋友们学习, 感谢黑马视频分享
开篇-怎么学-学什么
MySQL-基础篇
数据库的启动与停止
mysql 连接
这种方式记得配 bin 路径的 path 变量
01SQL
SQL通用语法
SQL分类
01 DDL data definition language
DDL - 数据库操作
note:
IF NOT EXISTS
– 如果不存在则创建数据库, 存在则无效, 不报错, 但是不加该语句, 若创建的数据库已存在会报错IF EXISTS
– 如果存在则删除数据库, 不存在无效, 不报错, 但是不加该语句, 若删除的数据库不存在会报错
DDL – 操作表
创建与查询
修改表结构
mysql数据类型
数值类型
代码示例
age TINYINT UNSIGNED
score double(4,1) # 长度为4, 有一位小数
字符串类型
note:
- char(len) – 长度固定为len, 不足空格补齐 内存固定 性能好
- varchar(len) – 最长为len, 不足有多少用多少 节省内存 性能低
日期时间类型
修改表结构
修改表名
删除表
添加字段
删除字段
修改字段
02 DML data manipulation language
用于对数据库中表的数据记录进行增删改操作
- insert
- update
- delete
添加记录
修改记录
删除记录
02 DQL data query language
数据查询语言
数据查询语言最为复杂和常用, 要重点掌握
select 总格式
基本查询
一般不使用通配符 * , 效率较低, 不易辨识
别名 as
可以省略
去重 distinct
条件查询
模糊查询示例
聚合函数
查询记录数量, 一般使用通配符 * , 这是因为 null 值不参与任何聚合函数的运算, 所以此时使用具体字段, 可能结果不准
分组查询
排序查询
分页查询
1. select * from emp where age in(20,21,22,23);
2. select * from emp where gender = '男' and age between 20 and 40 and name like '___';
3. select gender, count(*) from emp where age < 60 group by gender;
4. select name, age from emp where age <= 35 order by age, entrydate desc;
5. select * from emp where gender = '男' and age between 20 and 40 order by age asc, entrydate desc limit 5; # 注意 limit 位于最后
编写顺序与执行顺序
04 DCL data control language
管理数据库用户, 控制用户对数据库的访问权限
DCL 管理用户
note:
- 用户都记录在 mysql 的 user 表中
权限列表
DCL 权限控制
02 函数
函数 : 指一段可以直接被另一段程序调用的程序或代码
- 字符串函数
- 数值函数
- 日期函数
- 流程函数
01 字符串函数
# 将员工表的工作id字段补足5位, 不足前补0
update emp set workno = lpad(workno, 5, '0');
02 数值函数
# 生成一个六位数的随机验证码
select lpad( round( rand() * 1000000 , 0 ) , 6 , '0' );
03 日期函数
04 流程函数
进行条件筛选
### 总结
03 约束
约束: 约束是作用于表中字段上的规则, 用于限制存储在表中的数据
作用: 保证数据库中数据的正确 有效 完整
create table user(
id int primary key auto_increment comment '主键',
name varchar(10) not null unique comment '姓名',
age int check ( age > 0 && age <= 120) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
) comment '用户表';
外键约束
外键约束建立两张表之间数据的联系, 保证数据的一致性和完整性
外键约束的删除更新行为
默认是 no action / restrict
04 多表查询
01 多表关系
01 内连接
内连接: 查询两张表的交集
代码示例
02 外连接
代码示例
03 自连接
如: 查询下表中员工直属领导的姓名
代码示例
04 联合查询
代码示例
06 子查询
01 标量子查询
代码示例
02 列子查询
代码示例
03 行子查询
代码示例
04 表子查询
代码示例
03 案例
代码示例
# inner
1 select emp.name, emp.age, emp.job, dept.name from emp, dept where emp.deptid = dept.id;
2 select e.name, e.age, e.job, d.name from (select * from emp where age < 30) e, inner join dept d on e.deptid = d.id ;
select e.name, e.age, e.job, d.name from emp e inner job dept d on e.deptid = d.id where age < 30;
select e.name, e.age, e.job, d.name from emp e , dept d where emp.deptid = d.id and emp.age < 30;
3 select distinct dept.id dept.name from emp, dept where emp.deptid = dept.id;
# outter
4 select e.*, d.name from emp e left join dept d on e.deptid = d.id where e.age >40;
5 select e.name, s.level from emp e left join salgrade s on e.salary > s.lowsal and e. salary < s.upsal;
6 select e.*, s.level form (select * from emp where emp.deptid = (select id from dept where name = '研发部')) e left join salgrade s on e.salary between s.lowsal and s.upsal;
select e.*, s.level
from emp e,
dept d,
salgrade s
where e.deptid = d.id,
and (e.salary between s.lowsal and s.upsal)
and d.name = '研发部';
7 select avg(e.salary) from emp e where e.deptid = (select id from dept where name = '研发部');
select avg(e.salary) from emp e, dept d where e.deptid = d.id and d.name = '研发部';
# 子查询
8 select * from emp e where e.salary > (select salary from emp where name = '灭绝');
9 select * from emp where salary > (select avg(salary) from emp);
10 select * from (select * from emp e left join dept d on e.deptid = d.id group by d.name) e where e.salary > (select ave(salary) from emp e left join dept d on e.deptid = d.id group by d.name);
select * from emp e2 where e2.salary < ( select avg(e1.salary) from emp e1 where e1.deptid = e2.deptid )
11 select count(*) from dept d left join emp e on dept.id = e.deptid group by d.name;
select d.id, d.name, ( select count(*) from emp e where e.deptid = d.id) from dept d;
12 select s.name, s.num, c.name from student s, course c, student_course sc where s.id = sc.studentid and c.id = sc.courseid;
04 总结
05 事务
目录
- 事务简介
- 事务操作
- 事务四大特性
- 并发事务问题
- 事务隔离级别
事务: 是一组操作的集合, 是一个不可分割的单位。
事务会把所有的操作作为一个整体向系统提交或撤销操作请求
即事务表示的操作要么同时成功, 要么同时失败
mysql默认事务自动提交, 也就是说, 当执行一条 mysql 语句时, mysql 会立即隐式的提交事务, 每一条语句就是一个事务
01 事务操作
代码示例
set @@autocommit = 0; # 手动开启事务
start transaction; # 手动开启事务
begin; # 手动开启事务
update account set money = money -1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commint; # 提交事务
rollback; # 回滚事务
02 事务四大特性 acid
03 并发事务问题于事务隔离级别
- 多个并发操作引发并发事务问题
事务隔离级别
隔离级别越高, 数据越安全, 性能越低