MySQL 的架构共分为两层:Server 层和存储引擎层
1、Server 层负责建⽴连接、分析和执⾏ SQL
2、存储引擎层负责数据的存储和提取, ⽀持 InnoDB、MyISAM、Memory 等多个存储引擎, 现在最常⽤的存储引擎是 InnoDB,其⽀持索引类型是 B+ 树索引。
数据库
创建数据库
查看数据库
删除数据库
连接到数据库(需要进入特定数据库)
修改数据库编码集
表格
创建表
查看数据库所有的表
查看具体表
删除表
通过外键约束连接在一起的表不能被删除。删除表之前,需先删除约束。
复制表
只复制表结构,不需要数据
修改表名
添加列
修改列名
修改列类型
删除列
插入数据行
注意:
1、每次插入一行,不能只插入半行或几列。
2、数据值的数据类型、精度与对应列匹配,否则MySQL可能作自动处理。
3、若列是自增列,一般不手动指定该列指定值。
4、设计表的时候指定了某列NOT NULL,但插入数据时未提供值,MySQL自动处理为一个默认值。
一次插入多行
更新数据行
删除数据行
删除表所有数据
功能类似语句DELETE FROM;
注意:
1、不能用于有外键约束的表。
2、表结构、列、约束不被改动。
3、标识列重新开始编号。
4、DELETE 按条删除数据行,TRUNCATE一次性删除数据表。
5、DELETE手动提交事务、可在事务中回滚,TRUNCATE自动提交事务、无法回滚。
查询语句
注意:
1、大小写不敏感。
2、可写为一行或多行;但关键字不能跨行。
3、子语句独立行编写
计算
定义列的别名
若别名中存在空格,需要使用引号
使用DISTINCT关键字删除重行
不能使用DISTINCT多列排除重复
限制查询行数
查询条件
预算符 | 含义 |
BETWEEN …… AND…… | 两值之间(包含) |
IN(list) | 匹配列出的值 |
LIKE | 匹配一个字符模式 |
IS NULL | 空值 |
= | 相等 |
AND | 组合条件and |
OR | 组合条件or |
NOT | 条件为假返回真值 |
LIKE执行通配查询
查询条件可包含文字字符或数字。
% 表示0或多个字符。
_ 表示1个字符。
排序
ASC:升序,默认升序
DESC:降序
ORDER BY语句必须放在SELECT语句整体最后
可使用别名排序
可使用多列排序
聚合分组
聚合函数针对进行运算的所有记录返回唯一一个结果。
分组函数group by对记录进行分组。分组函数会省略列中的空值
IFNULL函数强制分组函数包括空值
SELECT后出现聚合函数,该位置只能出现其他聚合函数和分组依据列,普通列仅显示第一行值。
HAVING子句对分组进行过滤
放在GROUP BY后面,ORDER BY 之前
语句执行顺序
①先执行FROM子句,从表中加载数据,在内存形成一张虚拟表
②若有WHERE子句,根据条件,在虚拟表中去掉不满足条件行
③根据GROUP BY子句指定的分组列,进行分组
④计算分组中SELECT子句中聚合函数值,并为每组生成查询结果中的一行
⑤若有HAVING子句,根据条件,分组计算、聚合计算的结果再次过滤
⑥若有ORDER BY子句,根据列,对结果排序
多行子查询
运算符 | 解释 |
IN | 在子查询中 |
ANY | 其中一个值满足条件返回True |
ALL | 其中任意值满足条件返回True |
多表连接查询
类型
内连接INNER JOIN
外连接LEFT JOIN 和 RIGHT JOIN
内连接
在WHERE子句或者JOIN ON中写连接条件。利用主键与外键相等的特性。
连接查询必须指定连接条件,否则会形成笛卡尔积结果。
多表连接必须限定列名,即table.column。
外连接
LEFT JOIN中,会返回左表的所有行,即使坐标中有不符合连接条件的记录,也会在查询结果中显示。RIGHT JOIN相似。
约束
数据类型
类型 | 精度范围与格式 | 用途 | |
INT(n) | (-2147483648, 2147483647) | (0,4294967295) | 整数 |
CHAR(n) | 0 - 255 | 字符型 | 定长字符 |
VARCHAR(n) | 0 - 65535 | 字符型 | 不定长字符 |
FLOAT | (-3.40E-38,3.40E+38) | 7位小数 | 单精度浮点数 |
TEXT | 0 - 65535 | 文本型 | 大容量文本 |
BLOB | 65K | 二进制文件 | 二进制大对象 |
定长字符串:长度固定;实际字符不足时,空格补齐;
变长字符串:最长长度固定;实际长度根据实际存储值确定;
日期和时间类型
类型 | 格式 | 范围 |
YEAR | YYYY | 1901-2155 |
DATE | YYYY-MM-DD | 1000-01-01 - 9999-12-31 |
TIME | HH:MM:SS | -835:59:59 - 838:59:59 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 - 2038 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 - 9999-12-31 23:59:59 |
日期和时间类型插入示例
创建主键
1、直接在字段定义后面声明主键
2、用constraint声明主键
3、用alter语句补充声明主键
删除主键
创建外键
用于强制引用完整性。
指定外键删除或更新的行为
1、若子表试图创建一个父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作
2、若父表试图UPDATE或DELETE任何子表中存在的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。
InnoDB支持四种不同的动作(MyISAM),若没有指定ON UPDATE和ON DELETE,默认动作RESTRICT。
CASCADE:父表删除或更新对应行,同时自动删除或更新子表匹配的行
SET NULL:父表删除或更新对应行,同时子表外键列设为空,仅外键列未设置为NOT NULL生效;否则报错
NO ACTION:InnoDB拒绝删除或者更新父表
RESTRICT:拒绝删除或者更新父表
通过alter + constraint补充添加外键
删除外键
创建自增长
设定自增的列必须为主键,且一张表只能有一个自增列
创建唯一约束
创建非空约束
创建检查约束
Mysql原生并不支持检查越苏,对于离散值可使用set和enum方式解决;对于连续值只能通过触发器解决。
创建默认值
高级特性、存储过程
变量
设置用户自定义变量
1、以@开始,形式为“@变量名”
查询变量
2、通过SELECT语句定义
使用变量
存储过程
存储在数据库目录中的一段声明性SQL语句。
优点
定义存储过程
创建成功后,若使用Navicat工具,函数一栏中会出现存储过程名。
声明变量
变量赋值
带参数的存储过程
三种模式
IN——默认模式。调用存储过程时,必须将参数传递给存储过程。IN参数值不能被改变。
OUT——可以更改OUT参数值
INOUT——可以传递参数,并在存储过程中修改INOUT参数
如:
流程控制
可以在存储过程中加入流程控制
IF判断
CASE条件
循环
循环跳出
ITERATE:类似continue
LEAVE:类似break
触发器
一种特殊的存储过程,不由用户直接调用。主要用于强制复杂的业务规则或要求。
创建
old和new的使用
使用INSERT时,原表无数据,插入数据后,新插入数据是new。
使用UPDATE时,修改原表数据的时候,原表数据是old;修改后的数据是new。
使用DELETE时,删除的那一条数据是old。
删除
查看触发器
示例:
数据库事务
事务是作为单个逻辑单元执行的一系列操作。
多个操作 作为一个整体向系统提交,要么执行、要么都不执行,事务是一个不可分割的工作逻辑单元。
特别适用多用户同时操作的数据通信系统。
InnoDB:不能结构化编程,只能通过标记开启、提交或回滚事务。
MyISAM:不支持事务,用于只读程序提高性能。
事务的特性
事务控制语句
开始事务
提交事务
对于数据库的修改是永久性的,无法回滚。