目录
6.外键约束foreign key(列名) references 表名(主键)
一、MySQL介绍
开源关系型数据库管理系统(RDBMS)
使用SQL(结构化查询语言)进行数据库操作
支持多种操作系统,包括Linux、Windows和macOS
由Oracle公司开发、维护和支持
二、数据类型
整数 | tinyint、smallint、mediumint、int、bigint |
浮点数 | float、double、decimal |
字符串 | char、varchar、text、mediumtext、longtext |
二进制 | 推荐:可以将二进制文件存放在磁盘,数据库中存储文件对应的磁盘路径 |
日期与时间 | date、time、datetime、timestamp |
枚举 | enum |
三、数据库命令
不区分大小写,单行分号结尾。
- 创建数据库:create database 数据库名 character set utf8;
- 查看所有数据库:show databases;
- 删除数据库: drop database 数据库名;
- 切换数据库:use 数据库名;
- 查看数据库:select database();
四、表命令
1.查看所有表
show tables;
2.创建数据库表
CREATE TABLE table_name (
column1 datatype constraints,
column2 datatype constraints,
...
PRIMARY KEY (one_or_more_columns)
);
3.查看表结构
desc 表名;
4.删除数据库表
DROP TABLE table_name;
5.修改表
-- 添加列
ALTER TABLE table_name ADD column_name datatype;
-- 修改列
ALTER TABLE table_name MODIFY COLUMN column_name datatype;
-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;
-- 重命名表
RENAME TABLE old_name TO new_name;
五、数据操作CURD
1. 插入数据(INSERT)
-- 插入单行
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
-- 插入多行
INSERT INTO table_name (column1, column2)
VALUES (value1, value2), (value3, value4), (value5, value6);
2. 查询数据(SELECT)
-- 基本查询
SELECT column1, column2 FROM table_name;
-- 条件查询
SELECT * FROM table_name WHERE condition;
-- 排序
SELECT * FROM table_name ORDER BY column1 ASC, column2 DESC;
-- 分组
SELECT column1, COUNT(*) FROM table_name GROUP BY column1;
-- 分页
SELECT * FROM table_name LIMIT offset, count;
3. 更新数据(UPDATE)
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;
4. 删除数据(DELETE)
DELETE FROM table_name WHERE condition;
六、约束
1.主键约束primary key
唯一且非空,一表只能有一个。
ALTER TABLE emp ADD CONSTRAINT pk_emp PRIMARY KEY (id);
2.唯一约束unique
该列不能出现重复值。
ALTER TABLE emp ADD CONSTRAINT uq_email UNIQUE (email);
3.检查约束check
某一列需要满足条件。
ALTER TABLE emp ADD CONSTRAINT chk_age CHECK (age BETWEEN 0 AND 120);
4.非空约束not null
不能为空。
ALTER TABLE emp MODIFY city VARCHAR(20) NOT NULL;
5.默认约束default
拥有默认值。
ALTER TABLE emp ALTER city SET DEFAULT 'Beijing';
6.外键约束foreign key(列名) references 表名(主键)
一个表中的主键可以作为另外一个表中的外键。
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept
FOREIGN KEY (dept_id) REFERENCES dept(id)
ON UPDATE CASCADE
ON DELETE SET NULL;
七、外键
1.级联删除、级联更新cascade。
2.拒绝更新或删除父表中的记录restrict。
-- 父表:部门
CREATE TABLE dept (
dept_id INT PRIMARY KEY,
name VARCHAR(30)
);
-- 子表:员工
CREATE TABLE emp (
emp_id INT PRIMARY KEY,
name VARCHAR(30),
dept_id INT,
-- 外键约束
CONSTRAINT fk_emp_dept
FOREIGN KEY (dept_id)
REFERENCES dept(dept_id)
ON UPDATE CASCADE -- 父表更新,子表跟着更新
ON DELETE SET NULL -- 父表删除,子表设为 NULL
);
八、三大范式
1.第一范式
每个字段都是不可再分的原子值。
2.第二范式
必须满足第一范式,所有非主键字段必须完全依赖于整个主键,而不能只依赖于主键的一部分。
3.第三范式
必须满足第二范式,非主键字段不能依赖于其他非主键字段(消除传递依赖)。
九、用户与权限
1. 用户管理
-- 创建用户
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
-- 修改密码
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
-- 删除用户
DROP USER 'username'@'host';
2. 权限管理
-- 授予权限
GRANT ALL PRIVILEGES ON database.* TO 'username'@'host';
GRANT SELECT, INSERT ON database.table TO 'username'@'host';
-- 撤销权限
REVOKE ALL PRIVILEGES ON database.* FROM 'username'@'host';
-- 刷新权限
FLUSH PRIVILEGES;
十、条件查询
1.比较运算符
SELECT * FROM users WHERE age < 18 ;
2.逻辑运算符
-- AND: 同时满足多个条件
SELECT * FROM users WHERE age > 18 AND gender = '男';
-- OR: 满足任意一个条件
SELECT * FROM users WHERE age < 18 OR age > 60;
-- NOT: 否定条件
SELECT * FROM users WHERE NOT age = 20;
3.成员运算符
-- 查询年龄为18、20或22岁的用户
SELECT * FROM users WHERE age IN (18, 20, 22);
-- 等价于
SELECT * FROM users WHERE age = 18 OR age = 20 OR age = 22;
4.范围运算符
-- 查询年龄在18到30岁之间的用户(包含18和30)
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
5.模糊查询
-- % 表示任意多个字符
SELECT * FROM users WHERE name LIKE '张%'; -- 姓张的用户
-- _ 表示单个字符
SELECT * FROM users WHERE name LIKE '_三'; -- 名字为两个字且第二个字是"三"的用户
6.空查询
-- 查询没有填写电话号码的用户
SELECT * FROM users WHERE phone IS NULL;
-- 查询填写了电话号码的用户
SELECT * FROM users WHERE phone IS NOT NULL;
十一、分页查询
SELECT 列名 FROM 表名
[WHERE 条件]
[ORDER BY 排序字段]
LIMIT 偏移量, 每页记录数;
分页通用公式:limit (m-1)*n, n (每一页显示n条,第m页)
-- 第一页,每页10条
SELECT * FROM products ORDER BY id LIMIT 0, 10;
-- 等价于
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 0;
-- 第二页
SELECT * FROM products ORDER BY id LIMIT 10, 10;
-- 等价于
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 10;
十二、排序查询
SELECT 列名1, 列名2, ...
FROM 表名
[WHERE 条件]
ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...;
-- 默认升序(ASC)
SELECT * FROM products ORDER BY price;
-- 显式指定升序
SELECT * FROM products ORDER BY price ASC;
-- 降序排序
SELECT * FROM products ORDER BY price DESC;
十三、分组查询
SELECT 列名1, 列名2, ..., 聚合函数(列名)
FROM 表名
[WHERE 条件]
GROUP BY 分组列1, 分组列2, ...
[HAVING 分组后条件]
[ORDER BY 排序列]
[LIMIT 限制行数];
-- 统计每个部门的员工数量
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
十四、去重查询
-- 单列去重
SELECT DISTINCT department FROM employees;
-- 多列联合去重
SELECT DISTINCT department, position FROM employees;
十五、聚合函数
COUNT():计数
SUM():求和
AVG():平均值
MAX():最大值
MIN():最小值
GROUP_CONCAT():连接字符串(MySQL特有)
十六、关联查询
1.嵌套查询
在一个查询语句中嵌入另一个查询语句。
-- WHERE子句中的子查询
SELECT * FROM table1 WHERE column1 IN (SELECT column1 FROM table2);
-- FROM子句中的子查询
SELECT * FROM (SELECT column1, column2 FROM table1) AS temp_table;
-- SELECT子句中的子查询
SELECT column1, (SELECT MAX(column2) FROM table2) AS max_value FROM table1;
2.连接查询
笛卡尔连接、内连接、外连接、全连接。
-- 内连接
SELECT a.column1, b.column2
FROM table1 a INNER JOIN table2 b ON a.id = b.id;
-- 左连接
SELECT a.column1, b.column2
FROM table1 a LEFT JOIN table2 b ON a.id = b.id;
-- 右连接
SELECT a.column1, b.column2
FROM table1 a RIGHT JOIN table2 b ON a.id = b.id;
-- 全连接(MySQL不支持FULL JOIN,需用UNION实现)
SELECT a.column1, b.column2 FROM table1 a LEFT JOIN table2 b ON a.id = b.id
UNION
SELECT a.column1, b.column2 FROM table1 a RIGHT JOIN table2 b ON a.id = b.id;
十七、关联关系
1.自关联:一个表与自己发生关联。
2.一对一:可以合并为一个表,外键定义在任意一方。
3.一对多:外键定义在多方。
4.多对多:外键定义在任意一方,通过第三个表来存储两个主表的主键。
十八、视图
视图是一张虚拟表,操作视图相当于操作真实表。
1. 创建视图
CREATE VIEW view_name AS SELECT column1, column2 FROM table_name WHERE condition;
2.使用视图
SELECT * FROM view_name;
3. 修改视图
ALTER VIEW view_name AS SELECT column1, column2, column3 FROM table_name;
4. 删除视图
DROP VIEW view_name;
十九、存储过程与函数
1. 存储过程
-- 创建存储过程
DELIMITER //
CREATE PROCEDURE procedure_name(IN param1 INT, OUT param2 VARCHAR(255))
BEGIN
-- SQL语句
SELECT column1 INTO param2 FROM table_name WHERE id = param1;
END //
DELIMITER ;
-- 调用存储过程
CALL procedure_name(1, @result);
SELECT @result;
2. 函数
-- 创建函数
DELIMITER //
CREATE FUNCTION function_name(param1 INT) RETURNS INT
DETERMINISTIC
BEGIN
DECLARE result INT;
-- 计算逻辑
SET result = param1 * 2;
RETURN result;
END //
DELIMITER ;
-- 调用函数
SELECT function_name(10);
二十、事务
1.事务特性(ACID)
原子性(Atomicity):事务中的操作要么全部提交,要么全部回滚。
一致性(Consistency):事务执行前后,数据库都必须处于一致状态。
隔离性(Isolation):并发事务之间互不影响。
持久性(Durability):一旦提交,数据永久保存,即使宕机也不丢失。
2.事务生命周期
-- 开始事务
START TRANSACTION;
-- 执行SQL语句
INSERT INTO table1 VALUES (1, 'value1');
UPDATE table2 SET column1 = 'new_value' WHERE id = 1;
-- 提交或回滚
COMMIT; -- 提交事务
-- 或
ROLLBACK; -- 回滚事务
二十一、索引
为了提升性能,建立索引。
1. 索引类型
普通索引(INDEX)
唯一索引(UNIQUE)
主键索引(PRIMARY KEY)
全文索引(FULLTEXT)
2.索引方法
BTREE、HASH
二十二、存储引擎
存储引擎是MySQL的核心组件,负责数据的存储、检索和管理。MySQL采用插件式架构,支持多种存储引擎,每种引擎都有其特点和适用场景。InnoDB为默认存储引擎。
总结
MySQL作为最流行的开源关系型数据库,提供了全面的数据管理解决方案。其核心特性包括支持SQL标准、ACID事务、多种存储引擎和跨平台能力。数据库操作涵盖CRUD基本命令、复杂查询(连接、子查询、聚合函数)以及索引优化。高级功能涉及视图、存储过程、触发器和事务管理,确保数据完整性和业务逻辑封装。MySQL提供完善的用户权限体系、备份恢复机制和性能优化工具,如EXPLAIN分析和配置参数调整。存储引擎方面,InnoDB作为默认引擎支持事务和行级锁,MyISAM适合读密集型场景,MEMORY引擎提供高速内存访问,ARCHIVE引擎实现高压缩归档。MySQL 8.0引入了窗口函数、CTE和JSON增强等现代特性。与各种编程语言和ORM框架的集成使其成为全栈开发的理想选择。在高可用方面支持主从复制、组复制和InnoDB集群。安全措施包括访问控制、数据加密和审计功能。云服务集成和丰富的监控工具使其适应现代化部署环境。学习资源涵盖官方文档、在线课程和活跃社区,而持续的功能演进保持其在大数据时代的竞争力。无论是OLTP系统、数据仓库还是Web应用,MySQL都能提供可靠、高效且灵活的数据存储解决方案。