注意,该笔记来自于黑马Mysql的听课记录且尚未扩展,希望通过这篇博客你能完美入门mysql。
Mysql DataBase Management System(DBMS)
SQL分类:
DCL DDL DQL DML
数据类型
数值类型
字符串数据
日期类型
DDL data definition language
1.查询所有数据库 show databases
2.查询当前数据库 select database
3.创建 create database[if not exists] 数据库名 [default charset 字符集] [collate]排序规则
4.删除 drop database[if exists]数据库名
5.use 数据库名 使用指定的数据库
6.DESC 表名 查询表结构
7.show create table表名 查询指定表的建表语句
8.添加字段 alter table 表名 ADD 字段名 类型(长度) [comment 注释] [约束]
9.修改数据类型 alter table 表名 modify 字段名 新数据类型(长度)
10.修改字段名和字段类型 alter table 表名 change 旧字段名 新字段名 类型(长度)[comment注释] [约束]
11 修改表名 alter table 表名 rename to 新表名
12 删除表 drop table[if exists] 表名
13 删除指定表,并重新创建该表 truncate table 表名(在删除表时,表中的全部数据也会被删除)
DML data manipulation language
1.insert into 表名(字段名1, 字段名2...) values(值1,值2); 给指定字段添加数据
2.insert into 表名 values(值1, 值2);给全部字段添加数据
3.insert into 表名(字段名1, 字段名2) values(值1, 值2...), (值1, 值2...), (值1, 值2, ...); 批量添加数据
4.insert into 表名(值1, 值2...), (值1, 值2...), (值1, 值2...); 批量添加数据
注意
插入数据时,指定的字段顺序需要与值的顺序是一 一对应的
字符串和日期型数据应该包含在引号中
插入的数据大小,应该在批量添加数据
5.update 表名 set 字段名=值1 字段名=值二,...[where 条件] 修改数据
6.delete from 表名 [where 条件] 删除语句
注意
7.7delete 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据
8.delete语句不能删除某一个字段的值(可以使用update)
DQL data query language
略,已拿捏(把力扣数据库的题刷完就行了, 2-3天就能刷完)。
DCL data control language
1.use mysql;
2.select * from user 查询用户
3.create user '用户名'@'主机名' identified by ’密码'; 创建用户
4.alter suer '用户名'@'主机名' identified with mysql_native_password by '新密码'; 修改用户密码
5.drop user '用户名'@'主机名' 删除用户
权限控制
6.show grants for '用户名'@'主机名';查询权限
7.grant 权限列表 on 数据库.表名 to '用户名'@'主机名' 授予权限
8 revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名' 撤销权限
多个权限之间,使用逗号分隔
授权时,数据库名和表名可以使用*进行通配,代表所有。
函数
是指一段可以直接被另一段程序调用的程序或代码
字符串函数
数值函数
日期函数
流程函数
约束
概念:约束时作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库中数据的正确,有效性和完整性
分类:
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束
外键约束
删除外键
alter table 表名 drop foreign key 外键名称
多表查询
分类:
一对多
多对多
一对一
笛卡尔积:笛卡尔乘积是指在数学中,两个集合A集合和B集合的所有组合情况.(在多表查询时,需要消除无效的笛卡尔积)
连接查询
内连接:
相当于查询A,B交集部分数据
隐私内连接:select 字段列表 from 表1,表2 where 条件...;
显示内连接:select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
外连接
左外连接:查询左表所有数据,以及两张表交集部分数据
select 字段列表 from 表1 left [outer] join 表二 on 条件...;
右外连接:查询右表所有数据,以及两张表交集部分数据
select 字段列表 from 表1 right [outer] join 表二 on 条件...;
自连接
当前表与自身的连接查询,自连接必须使用表名
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;
子查询
标量子查询(子查询结果为单个值)
列子查询(子查询结果为一列) in, not in, any, some, all,
行字查询(子查询结果为1行)= != <> in not in
表子查询(子查询结构为多行多列) in
根据子查询位置,分为: where之后,from之后,select之后
事务
是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败(默认mysql的事务是自动提交的,也就是说,当执行一条DML语句,mysql会立即隐私的提交事务)
查看/设置事务提交方式
select @@autocommit;
set @@autocommit=0
开始事务
start transaction/begin
提交事务
commit
回滚事务
rollback
事务的四大特性
并发事务问题
隔离
mysql体系结构
连接层
最上层是一些客户端和链接服务,主要完成一些类似于连接处理,授权认证即相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限
服务层
第二层架构主要完成大多数的核心服务功能,如sql接口,并完成缓存的查询,sql的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程,函数等。
引擎层
存储引擎真正的负责了mysql中数据的存储和提取,服务器通过api和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。
存储层
主要是将数据存储在文件系统上,并完成与存储引擎的交互
存储引擎 InnoDB
存储引擎memory和MyIsam
三者差异对比
存储引擎选择
InnoDB: 是mysql的默认存储引擎,支持事务,外键。如果应用对事务的完整性有比较高的要求,在并发条件要求下数据的一致性,数据操作除了插入和查询之外,还包含很多的更新,删除操作。那么InnoDB存储引擎是比较合适的选择.
MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性,并发性要求不是很高,那么选则这个存储引擎是非常合适的。
MeMory(不推荐,以被替代): 将所有数据保存在内存中,访问速度快,通常用于临时表即缓存。memory的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。
索引
概念:是帮助Mysql高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引概述
索引结构
在存储引擎层实现的,不同的存储引擎有不同的结构。
B+树索引
优点
相对于二叉树,层级更少,搜索效率高。
相对于Hash索引,B+tree支持范围匹配即排序操作
对于B-tree,无论是叶子结点还是非叶子结点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低