• MySQL学习系列(1)-每天学习10个知识



    👍 点赞,你的认可是我创作的动力!

    ⭐️ 收藏,你的青睐是我努力的方向!

    ✏️ 评论,你的意见是我进步的财富!


    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:返回两个表中匹配行的交集。
    SELECT customers.name, orders.order_number
    FROM customers
    INNER JOIN orders ON customers.id = orders.customer_id;
    
    • 1
    • 2
    • 3
    • LEFT JOIN:返回左表中的所有行和与右表中匹配行的交集。
    SELECT customers.name, orders.order_number
    FROM customers
    LEFT JOIN orders ON customers.id = orders.customer_id;
    
    • 1
    • 2
    • 3
    • RIGHT JOIN:返回右表中的所有行和与左表中匹配行的交集。
    SELECT customers.name, orders.order_number
    FROM customers
    RIGHT JOIN orders ON customers.id = orders.customer_id;
    
    • 1
    • 2
    • 3
    • FULL JOIN:返回左表和右表中的所有行。
    SELECT customers.name, orders.order_number
    FROM customers
    FULL JOIN orders ON customers.id = orders.customer_id;
    
    • 1
    • 2
    • 3

    3. 索引

    索引是一种数据库对象,用于加速查询操作。在MySQL中,常见的索引类型包括B树索引、哈希索引、全文索引等。

    • B树索引:最常见的索引类型,适用于等值查找和范围查询。它的优势在于适用于各种查询类型,但劣势是对插入和更新操作有一定开销。

    • 哈希索引:适用于精确查找,对于等值查找非常快,但不支持范围查询。它的优势是查找速度快,但劣势是不适用于复杂查询。

    • 全文索引:用于全文搜索,例如在文本数据中查找关键词。它的优势是支持文本搜索,但劣势是占用更多存储空间。

    4. ACID

    ACID 是数据库事务的属性,代表以下四个特性:

    • 原子性(Atomicity):事务是一个不可分割的工作单元,要么全部执行成功,要么全部失败。

    • 一致性(Consistency):事务使数据库从一个一致状态转移到另一个一致状态,不会破坏数据库完整性约束。

    • 隔离性(Isolation):多个事务同时执行时,它们之间应该相互隔离,不会互相干扰。

    • 持久性(Durability):一旦事务提交,其结果应该持久保存在数据库中,即使系统故障也不会丢失。

    ACID确保了数据库在事务处理方面的可靠性和稳定性。

    5. 优化MySQL查询性能

    要优化MySQL查询性能,可以采取以下措施:

    • 使用合适的索引来加速查询操作。
    • 优化SQL查询语句,确保它们是高效的。
    • 使用查询缓存来减少重复查询的开销。
    • 分区表以减少查询的数据量。
    • 避免使用SELECT *,只选择所需的列。
    • 调整服务器参数,如缓冲区大小和连接池设置。

    6. 创建MySQL存储过程的步骤

    创建MySQL存储过程的步骤如下:

    1. 使用CREATE PROCEDURE语句定义存储过程名称和参数列表。
    DELIMITER //
    CREATE PROCEDURE sp_example(IN param1 INT, OUT result INT)
    BEGIN
        -- 存储过程主体
    END;
    //
    DELIMITER ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. BEGINEND之间编写存储过程的主体,包括SQL语句和逻辑。

    2. 使用OUT参数或SELECT语句设置结果。

    3. 使用DELIMITER定义语句分隔符。

    4. 执行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)一起使用,以便对每个组执行计算。

    SELECT department, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department;
    
    • 1
    • 2
    • 3

    HAVING用于筛选GROUP BY后的结果集,它允许您对分组后的数据进行过滤。

    SELECT department, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department
    HAVING AVG(salary) > 50000;
    
    • 1
    • 2
    • 3
    • 4

    区别:

    • GROUP BY在分组之前进行筛选和计算。
    • HAVING在分组之后对结果进行筛选。

    10. UNION 和 UNION ALL

    UNIONUNION ALL都用于合并两个或多个SELECT查询的结果。

    • UNION:合并结果集时会去重,只返回唯一的行。
    SELECT name FROM table1
    UNION
    SELECT name FROM table2;
    
    • 1
    • 2
    • 3
    • UNION ALL:合并结果集时不去重,返回所有行。
    SELECT name FROM table1
    UNION ALL
    SELECT name FROM table2;
    
    • 1
    • 2
    • 3

    区别:

    • UNION会去除重复行,性能开销较大。
    • UNION ALL不去重,性能较好,但可能返回重复行。
  • 相关阅读:
    C++读写锁
    Apache Maven 3.6.0的下载安装和环境配置(详细图解+不限速下载链接)
    java计算机毕业设计惠济区疫情期间监测管理系统MyBatis+系统+LW文档+源码+调试部署
    【C语言基础】近期所学到的函数以及关键字(函数memset、scanf、关键字staric、 inline、volatile)
    JS高级-语言特性(持续更新一)
    golang 必会之 pprof 监控系列(5) —— cpu 占用率 统计原理
    以解析csv数据为例,讨论string、char[]、stream 不同类型来源是否能进行高性能读取解析封装可能性
    第2篇【Docker项目实战】使用Docker部署Raneto知识库平台(转载)
    读HDF5格式的文件
    万字手撕——Java集合源码
  • 原文地址:https://blog.csdn.net/weixin_52003205/article/details/133103426