目录
-
- [1. SQL 和 MySQL](#1. SQL 和 MySQL)
- [2. JOIN 类型](#2. JOIN 类型)
- [3. 索引](#3. 索引)
- [4. ACID](#4. ACID)
- [5. 优化MySQL查询性能](#5. 优化MySQL查询性能)
- [6. 创建MySQL存储过程的步骤](#6. 创建MySQL存储过程的步骤)
- [7. 范式和反范式设计](#7. 范式和反范式设计)
- [8. SQL注入](#8. SQL注入)
- [9. GROUP BY 和 HAVING](#9. GROUP BY 和 HAVING)
- [10. UNION 和 UNION ALL](#10. UNION 和 UNION ALL)
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
1. SQL 和 MySQL
SQL(Structured Query Language) 是一种用于管理关系数据库系统的标准化查询语言。它允许用户执行诸如查询、插入、更新和删除等操作,以与数据库交互。SQL是一种通用的语言,可以应用于多种数据库系统。
MySQL 是一个流行的开源关系数据库管理系统(RDBMS),它使用SQL作为查询语言。MySQL具有高性能、可靠性和扩展性,被广泛用于Web应用程序和其他各种应用中。
区别:
- SQL 是一种查询语言,而 MySQL 是一个关系数据库管理系统,它实现了SQL语言规范。
- SQL是通用的,适用于各种数据库系统,而MySQL是一个具体的数据库产品。
- MySQL有自己的特性和性能优化策略,而SQL仅仅是一种语言规范。
2. JOIN 类型
在MySQL中,JOIN 用于合并两个或多个表的数据。不同的 JOIN 类型包括:
- INNER JOIN:返回两个表中匹配行的交集。
sql
SELECT customers.name, orders.order_number
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id;
- LEFT JOIN:返回左表中的所有行和与右表中匹配行的交集。
sql
SELECT customers.name, orders.order_number
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id;
- RIGHT JOIN:返回右表中的所有行和与左表中匹配行的交集。
sql
SELECT customers.name, orders.order_number
FROM customers
RIGHT JOIN orders ON customers.id = orders.customer_id;
- FULL JOIN:返回左表和右表中的所有行。
sql
SELECT customers.name, orders.order_number
FROM customers
FULL JOIN orders ON customers.id = orders.customer_id;
3. 索引
索引是一种数据库对象,用于加速查询操作。在MySQL中,常见的索引类型包括B树索引、哈希索引、全文索引等。
-
B树索引:最常见的索引类型,适用于等值查找和范围查询。它的优势在于适用于各种查询类型,但劣势是对插入和更新操作有一定开销。
-
哈希索引:适用于精确查找,对于等值查找非常快,但不支持范围查询。它的优势是查找速度快,但劣势是不适用于复杂查询。
-
全文索引:用于全文搜索,例如在文本数据中查找关键词。它的优势是支持文本搜索,但劣势是占用更多存储空间。
4. ACID
ACID 是数据库事务的属性,代表以下四个特性:
-
原子性(Atomicity):事务是一个不可分割的工作单元,要么全部执行成功,要么全部失败。
-
一致性(Consistency):事务使数据库从一个一致状态转移到另一个一致状态,不会破坏数据库完整性约束。
-
隔离性(Isolation):多个事务同时执行时,它们之间应该相互隔离,不会互相干扰。
-
持久性(Durability):一旦事务提交,其结果应该持久保存在数据库中,即使系统故障也不会丢失。
ACID确保了数据库在事务处理方面的可靠性和稳定性。
5. 优化MySQL查询性能
要优化MySQL查询性能,可以采取以下措施:
- 使用合适的索引来加速查询操作。
- 优化SQL查询语句,确保它们是高效的。
- 使用查询缓存来减少重复查询的开销。
- 分区表以减少查询的数据量。
- 避免使用SELECT *,只选择所需的列。
- 调整服务器参数,如缓冲区大小和连接池设置。
6. 创建MySQL存储过程的步骤
创建MySQL存储过程的步骤如下:
- 使用
CREATE PROCEDURE
语句定义存储过程名称和参数列表。
sql
DELIMITER //
CREATE PROCEDURE sp_example(IN param1 INT, OUT result INT)
BEGIN
-- 存储过程主体
END;
//
DELIMITER ;
-
在
BEGIN
和END
之间编写存储过程的主体,包括SQL语句和逻辑。 -
使用
OUT
参数或SELECT
语句设置结果。 -
使用
DELIMITER
定义语句分隔符。 -
执行
CREATE PROCEDURE
语句来创建存储过程。
7. 范式和反范式设计
范式设计是一种数据库设计方法,旨在减少数据冗余并确保数据一致性。主要范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。例如,将数据分解成关联的表,以减少数据冗余。
反范式设计是相反的概念,它允许数据冗余以提高查询性能。例如,在一个表中包含冗余数据,以避免频繁的 JOIN 操作。
示例:
- 范式设计:将订单信息分为订单表和顾客表,以减少冗余。
- 反范式设计:在订单表中包含顾客信息,以避免 JOIN 操作。
8. SQL注入
SQL注入是一种安全漏洞,
允许攻击者通过恶意构造的输入来执行未经授权的SQL查询或命令。为防止SQL注入,应采取以下措施:
- 使用参数化查询(Prepared Statements)。
- 对输入数据进行严格的验证和过滤。
- 不要将用户输入直接拼接到SQL查询中。
- 使用数据库访问框架,如ORM(对象关系映射)来自动处理输入验证和防止注入。
9. GROUP BY 和 HAVING
GROUP BY用于将结果集分组,通常与聚合函数(如SUM、COUNT)一起使用,以便对每个组执行计算。
sql
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
HAVING用于筛选GROUP BY后的结果集,它允许您对分组后的数据进行过滤。
sql
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
区别:
- GROUP BY在分组之前进行筛选和计算。
- HAVING在分组之后对结果进行筛选。
10. UNION 和 UNION ALL
UNION 和UNION ALL都用于合并两个或多个SELECT查询的结果。
- UNION:合并结果集时会去重,只返回唯一的行。
sql
SELECT name FROM table1
UNION
SELECT name FROM table2;
- UNION ALL:合并结果集时不去重,返回所有行。
sql
SELECT name FROM table1
UNION ALL
SELECT name FROM table2;
区别:
- UNION会去除重复行,性能开销较大。
- UNION ALL不去重,性能较好,但可能返回重复行。