一,MySQL数据库
MySQL 是一款非常流行的开源关系型数据库管理系统(RDBMS),它被广泛应用于各种网站和应用软件中。MySQL 提供了高性能、高可靠性和易用性,支持 SQL(Structured Query Language)语言标准,用于管理结构化的数据
1.特点
| 特点 | 描述 |
|---|
| 开放源代码 | MySQL 是一个开源项目,任何人都可以免费下载和使用它的源代码来构建自己的版本 |
| 跨平台 | MySQL 支持多种操作系统,包括 Windows、Linux 和 macOS 等 |
| 安全性 | MySQL 提供了一系列的安全特性,如用户权限管理、加密连接等 |
| 性能优化 | MySQL 具有良好的性能,并且可以通过配置调整来进一步优化 |
| 支持多种存储引擎 | MySQL 支持多种存储引擎,如 InnoDB、MyISAM 和 Memory 等,每种引擎都有其特定的功能和优势 |
| 可扩展性 | MySQL 可以轻松地通过添加更多硬件资源来扩展其容量和性能 |
| 备份与恢复 | MySQL 提供了多种备份和恢复解决方案,以确保数据安全 |
2.数据类型
(1)数值类型
| 数据类型 | 大小 | 有符号范围(SIGNED) | 无符号范围(UNSIGNED) | 描述 |
|---|
| TINYINT | 1 byte | [-128, 127] | [0, 255] | 小整数值 |
| SMALLINT | 2 bytes | [-32768, 32767] | [0, 65535] | 大整数值 |
| MEDIUMINT | 3 bytes | [-8388608, 8388607] | [0, 16777215] | 小整数值 |
| INT | 4 bytes | [-2147483648, 2147483647] | [0, 4294967295] | 大整数 |
| BIGINT | 8 bytes | [-2^63, 2^63-1] | [0, 2^64-1] | 极大整数 |
| FLOAT | 4 bytes | [-3.402823466 E+38, 3.402823466351 E+38] | 0和[1.175494351 E-39, 3.402823466 E+38] | 单精度浮点数值 |
| DOUBLE | 8 bytes | [-1.7976931348623157 E+308, 1.7976931348623157 E+308] | 0和[2.2250738585072014 E-308, 1.7976931348623157 E+308] | 双精度浮点数值 |
| DECIMAL | | 依赖于M(精度,即整个数值的长度)和D(标度的值,即小数的位数) | 依赖于M(精度,即整个数值的长度)和D(标度的值,即小数的位数) | 小数值(精确定点数) |
(2)字符串类型
| 类型 | 大小 | 描述 |
|---|
| CHAR | 0-255 bytes | 定长字符串 |
| VARCHAR | 0-65535 bytes | 变长字符串 |
| TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
| TINYTEXT | 0-255 bytes | 短文本字符串 |
| BLOB | 0-65535 bytes | 二进制形式的长文本数据 |
| TEXT | 0-65535 bytes | 长文本数据 |
| MEDIUMBLOB | 0-16777215 bytes | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0-16777215 bytes | 中等长度文本数据 |
| LONGBLOB | 0-4294967295 bytes | 二进制形式的极大文本数据 |
| LONGTEXT | 0-4294967295 bytes | 极大文本数据 |
(3)日期类型
| 类型 | 大小 | 范围 | 格式 | 描述 |
|---|
| DATE | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续时间 |
| YEAR | 1 | 1901 至 2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
| TIMESTAMP | 4 | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值,是一个时间戳 |
二,SQL(Structured Query Language)
SQL全称Structured Query Language,一种专门用来与数据库沟通的语言。被设计用于查询、更新和管理关系型数据库管理系统(RDBMS)
1.SQL通用语法
(1)SQL可以分成单行或者多行书写,以分号结尾
(2)SQL语句可以使用空格或缩进来增强语句的可读性
(3)SQL语句关键字不区分大小写,建议关键字使用大写
(4)注释语法
2.SQL语句的分类
(1)DDL
Data Definition Language,数据定义语言,用来定义数据库对象,如数据库,表,字段
1)数据库操作
SHOW DATABASES;
SELECT DATABASE();
SHOW CREATE DATABASE 数据库名称;
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET SET 字符集] [COLLATE 排序规则];
DROP DATABASE[IF EXISTS] 数据库名称;
USE 数据库名;
2)表操作
SHOW TABLES;
DESC 表名;
SHOW CREATE TABLE 表名;
CREATE TABLE 表名(字段1 字段1类型 [约束] [COMMENT 字段1注释],字段2 字段2类型 [约束] [COMMENT 字段2注释],... ...
)[ENGINE = 存储引擎类型] [COMMENT 表注释];
DROP TABLE 表名;
(2)DML
Data Manipulation Language,数据操作语言,用来对数据库表中的数据进行增删改
1)插入数据
注:插入数据时,指定的字段顺序需要与值的顺序是一一对应的 。字符串和日期型数据应该包含在引号内。插入的数据大小,应该在字段规定的范围内
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
INSERT INTO 表名 VALUES (值1, 值2, ...);
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...),(值1, 值2, ...);
INSERT INTO 表名 VALUES (值1, 值2, ...),(值1, 值2, ...);
2)修改数据
UPDATE 表名 SET 字段1 = 值1, 字段名2 = 值2, ...[WHERE条件];
3)删除数据
DELETE FROM 表名 [WHERE 条件]
(3)DQL
Data Query Language,数据查询语言,用来查询数据库中表的记录
DQL语句执行顺序:FROM,WHERE,GROUP BY [HAVING],SELECT,ORDER BY,LIMIT
1)WHERE子句操作符
| 运算符 | 功能 |
|---|
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| = | 等于 |
| <> 或 != | 不等于 |
| BETWEEN … AND … | 在某个范围之内 |
| IN(…) | 在IN之后的列表中的值,多选一 |
| LIKE 占位符 | 模糊匹配(例如:_匹配单个字符,%匹配任意个字符) |
| IS NULL | 是NULL |
| AND 或 && | 且 |
| OR 或 || | 或 |
| NOT 或 | | 非 |
2)聚合函数
聚合函数:将一列数据作为一个整体,进行纵向计算
注:所有NULL值不参与聚合函数运算
| 聚合函数 | 功能 |
|---|
| count | 统计数量 |
| max | 最大值 |
| min | 最小值 |
| avg | 平均值 |
| sum | 求和 |
3)单表查询
SELECT字段列表
FROM表名列表
WHERE条件列表
GROUP BY分组字段列表
HAVING分组后条件列表
GROUP BY排序字段列表
LIMIT 分页参数
SELECT [DISTINCT] 字段1[AS 别名1], 字段2[AS 别名1],... FROM 表名;
SELECT 字段列表 FROM 表名 WHERE 条件列表;
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式, 字段2 排序方式...;
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
4)多表查询
多表查询(JOIN)
(4)DCL
Data Control Language,数据库控制语言,用来创建数据库用户,控制访问数据库权限
1)管理用户
任何主机可以使用%通配
USE mysql;
SELECT * FROM user;
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY 新密码;
DROP USER '用户名'@'主机名';
2)权限控制
| 权限 | 说明 |
|---|
| ALL, ALL PRIVILEGES | 所有权限 |
| SELECT | 查询数据 |
| INSERT | 插入数据 |
| UPDATE | 更新数据 |
| DELETE | 删除数据 |
| ALTER | 修改表 |
| DROP | 删除数据库/表/视图 |
| CREATE | 创建数据库/表 |
数据库和表可以使用*通配,例如所有数据库和表用*.*
SHOW GRANTS FOR '用户名'@'主机名';
GRANT 权限列表 ON 数据库.表名 TO '用户名'@'主机名';
REVOKE 权限列表 ON 数据库.表名 FROM '用户名'@'主机名';
三,常用内置函数
1.字符串函数
| 函数 | 功能 |
|---|
| CONCAT(S1,S2,…) | 将S1,S2…拼接成一个字符串 |
| LOWER(str) | 将字符串str全部转为小写 |
| UPPER(str) | 将字符串str全部转为大写 |
| LPAD(str,n,pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 |
| RPAD (str,n,pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
| TRIM(str) | 去掉字符串头部和尾部的空格 |
| SUBSTRING(str,start,len) | 返回从字符串str从start位置起的len个长度字符串 |
2.数值函数
| 函数 | 功能 |
|---|
| CEIL(x) | 向上取整 |
| FLOOR(x) | 向下取整 |
| MOD(x, y) | 返回x/y的模 |
| RAND() | 返回0~1内的随机数 |
| ROUND(x, y) | 求参数x的四舍五入的值,保留y位小数 |
3.日期函数
| 函数 | 功能 |
|---|
| CURDATE() | 返回当前日期 |
| CURTIME() | 返回当前时间 |
| NOW() | 返回当前日期和时间 |
| YEAR(date) | 获取指定date的年份 |
| MONTH(date) | 获取指定date的月份 |
| DAY(date) | 获取指定date的日期 |
| DATE_ADD(date, INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
| DATEDIFF(date1, date2) | 返回起始时间date1和结束时间date2之间的天数 |
4.流程函数
在SQL语句中实现条件筛选,从而提高语句的效率
| 函数 | 功能 |
|---|
| IF(value, t, f) | 如果value为true,则返回t,否则返回f |
| IFNULL(value1, value2) | 如果value1不为空,返回value1,否则返回value2 |
| CASE WHEN [val1] THEN [res1] … ELSE [default] END | 如果val1为true,返回res1,…否则返回default默认值 |
| CASE [expr] WHEN [val1] THEN [res1] … ELSE [default] END | 如果expr的值等于val1,返回res1,…否则返回default默认值 |
四,约束
约束是作用于表中字段上的规则,用于限制存储在表中的数据,保证数据库中数据的正确,有效性和完整性
1.常见约束
| 约束 | 描述 | 关键字 |
|---|
| 非空约束 | 限制该字段的数据不能为null | NOT NULL |
| 唯一约束 | 保证该字段的所有数据都是唯一的、不重复的 | UNIQUE |
| 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
| 默认约束 | 保存数据时,若果未指定该字段的值,则采用默认值 | DEFAULT |
| 检查约束(8.0.16版本之后) | 保证字段满足某一个条件 | CHECK |
| 外键约束 | 用于让两张表的数据建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
2.SQL示例
CREATE TABLE employee{id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键且自增',name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名不能为null且唯一',age INT CHECK (age > 0 && age < 100) COMMENT '年龄大于0小于100',dept_id INT DEFAULT 1 COMMENT '部门id默认为1',CONSTRAINT fk_emp_dept_id FOREIGN KEY dept_id REFERENCES department(id)
} COMMENT '员工表';
ALTER TABLE 表名 ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY dept_id REFERENCES department(id);
3.外键约束的删除/更新行为
| 行为 | 说明 |
|---|
| NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新 |
| RESTRICT | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新 |
| CASCADE | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则也删除/更新外键在子表中的记录 |
| SET NULL | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(注:需允许外键的值为null) |
| SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值(注:Innodb不支持) |
ALTER TABLE 表名 ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY dept_id REFERENCES department(id) ON UPDATE 行为 ON DELETE 行为;
五,事务
事务是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求。这些操作要么同时成功,要么同时失效
MySQL数据库事务是默认提交的
1.事务操作
SELECT @@autocommit;
SET @@autocommit = 0;
START TRANSACTION;
COMMIT;
ROLLBACK;
2.事务的特性
| 特性 | 说明 |
|---|
| 原子性 Atomicity | 事务是不可分割的最小操作单元,要么全部成功,要么全部失效 |
| 一致性 Consistency | 事务完成时,必须使所有的数据都保持一致状态 |
| 隔离性 Isolation | 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 |
| 持久性 Durability | 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的 |
3.并发事务问题
| 问题 | 描述 |
|---|
| 脏读 | 一个事务读到另一个事务还没提交的数据 |
| 不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同 |
| 幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在 |
4.事务隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|
| 读未提交 Read uncommitted | 可能出现 | 可能出现 | 可能出现 |
| 读已提交 Read commited | 不会 | 可能出现 | 可能出现 |
| 可重复读 Repeatable Read (MySQL默认级别) | 不会 | 不会 | 可能出现 |
| 串行化 Serializable | 不会 | 不会 | 不会 |
SELECT @@TRANSACTION_ISOLATION;
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE}