《MySQL 简易速速上手小册》第9章:高级 MySQL 特性和技巧(2024 最新版)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 《MySQL 简易速速上手小册》第9章:高级 MySQL 特性和技巧(2024 最新版)

05163ff3f5ff78e28cb2b8fc9dac5c9.png

9.1 使用存储过程和触发器

探索存储过程和触发器的魔法世界

在MySQL的奇妙世界里,存储过程和触发器是那些默默守护着数据完整性和自动化工作流的守护者。它们就像是被赋予了特殊魔法的仪式和符咒,一旦被唤醒,就能自动执行一系列复杂的任务。

9.1.1 基础知识

  • 存储过程:是一组为了完成特定功能的SQL语句集,存储在数据库中,可以通过简单的调用来执行。它们就像是预先编排好的魔法组合,旨在提高数据处理的效率和一致性。
  • 触发器:是数据库中的一种特殊类型的存储过程,它会在数据表上发生特定事件(如INSERT、UPDATE、DELETE)时自动执行。触发器就像是那些守护着秘密入口的看门人,一旦有人触发了门铃,它们就会按照既定的规则行动。

9.1.2 重点案例:使用 Python 调用存储过程实现用户注册

假设你正在开发一个网站,需要实现一个用户注册的功能,这个功能需要通过调用存储过程来完成。

步骤

  1. 首先,在MySQL中创建一个存储过程create_user
DELIMITER $$
CREATE PROCEDURE create_user(IN username VARCHAR(255), IN password VARCHAR(255))
BEGIN
    INSERT INTO users(username, password) VALUES(username, password);
END$$
DELIMITER ;
  1. 使用Python调用这个存储过程。
import mysql.connector
conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
cursor = conn.cursor()
cursor.callproc('create_user', ['new_user', 'password123'])
conn.commit()
cursor.close()
conn.close()
print("User registered successfully.")

9.1.3 拓展案例 1:利用触发器自动记录数据更改历史

为了追踪users表的更改历史,你可以创建一个触发器,在每次用户信息更新时自动记录更改。

DELIMITER $$
CREATE TRIGGER before_user_update
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
 INSERT INTO users_history(user_id, username, action)
 VALUES(OLD.id, OLD.username, 'UPDATE');
END$$
DELIMITER ;

9.1.4 拓展案例 2:使用 Python 和触发器实现数据完整性检查

假设你要确保orders表中的order_amount字段总是正数,你可以创建一个触发器来实现这一规则,并使用Python插入数据测试它。

DELIMITER $$
CREATE TRIGGER check_order_amount
BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
 IF NEW.order_amount <= 0 THEN
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Order amount must be positive';
 END IF;
END$$
DELIMITER ;
import mysql.connector
from mysql.connector import Error
try:
    conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
    cursor = conn.cursor()
    cursor.execute("INSERT INTO orders (order_id, order_amount) VALUES (%s, %s)", (1, -100))
    conn.commit()
except Error as e:
    print(f"Error: {e}")
finally:
    if conn.is_connected():
        cursor.close()
        conn.close()

通过上述案例,你已经学会了如何在MySQL中利用存储过程和触发器来自动化和简化复杂的数据操作,并通过Python来与这些强大的工具互动。这些高级特性能够帮助你构建更加健壮、高效的应用,同时保证数据的一致性和完整性。


9.2 管理和查询 JSON 数据

在MySQL的宝库中,JSON数据类型是一颗璀璨的宝石,它允许你以非常灵活的格式存储和查询结构化数据。从5.7版本开始,MySQL加入了对JSON数据类型的支持,让你能够轻松地在关系数据库中处理非关系型数据。

9.2.1 基础知识

  • JSON数据类型:MySQL中的JSON是一种格式良好的字符串,能够存储复杂的数据对象和数组。
  • 函数和操作符:MySQL提供了一系列的函数和操作符来创建、查询和修改JSON文档,如JSON_EXTRACT()JSON_SET()等。
  • 索引:你可以在JSON列上创建虚拟列,并在这些虚拟列上建立索引,以提高查询性能。

9.2.2 重点案例:使用 Python 将数据存储为 JSON 格式

假设你正在开发一个内容管理系统,需要存储文章及其元数据,其中一些字段是可选的,这使得JSON成为理想的存储格式。

步骤

  1. 在MySQL数据库中创建一张表,其中包含一个JSON类型的列用来存储文章的元数据。
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    metadata JSON
);
  1. 使用Python插入一篇文章及其元数据。
import mysql.connector
import json
article = {
    "title": "Exploring JSON in MySQL",
    "content": "Here is the content...",
    "metadata": {
        "author": "John Doe",
        "keywords": ["MySQL", "JSON"],
        "published_date": "2021-08-01"
    }
}
conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
cursor = conn.cursor()
cursor.execute(
    "INSERT INTO articles (title, content, metadata) VALUES (%s, %s, %s)",
    (article["title"], article["content"], json.dumps(article["metadata"]))
)
conn.commit()
cursor.close()
conn.close()

9.2.3 拓展案例 1:查询 JSON 数据

现在,我们需要查询所有包含特定关键字的文章。

keyword = "MySQL"
query = f"SELECT title FROM articles WHERE JSON_CONTAINS(metadata->'$.keywords', '\"{keyword}\"')"
cursor.execute(query)
for (title,) in cursor.fetchall():
 print(title)

9.2.4 拓展案例 2:更新 JSON 数据

某篇文章的发布日期需要更改,我们可以使用Python来更新这篇文章的元数据。

new_date = "2021-09-01"
article_id = 1
update_query = "UPDATE articles SET metadata = JSON_SET(metadata, '$.published_date', %s) WHERE id = %s"
cursor.execute(update_query, (new_date, article_id))
conn.commit()

通过上述案例,你已经掌握了如何在MySQL中灵活使用JSON数据类型,并通过Python来进行高效的数据操作。无论是存储复杂的数据结构,还是进行高效的数据查询和更新,JSON都能够帮助你轻松应对,使你的数据库应用更加强大和灵活。


9.3 使用视图和临时表

在MySQL的魔法世界里,视图和临时表是两种强大的魔法工具。它们像是幻术师,能够让复杂的数据和查询在你眼前变得简单明了。视图可以为复杂的查询提供一个清晰的窗口,而临时表则在你需要它们时出现,用完即消失,帮助你高效地处理数据。

9.3.1 基础知识

  • 视图:是一种虚拟的表,其内容由查询定义。视图不仅可以简化复杂的查询,还能提供数据访问的层级,增强安全性。
  • 临时表:是在会话期间创建的,并在会话结束时自动销毁。它们非常适合存储临时数据,比如计算结果,或者作为复杂查询中的中间步骤。

9.3.2 重点案例:使用 Python 和视图简化数据访问

假设你正在开发一个报告系统,需要从多个表中聚合数据。为了简化查询,你决定创建一个视图。

步骤

  1. 创建视图以聚合数据。
CREATE VIEW sales_summary AS
SELECT product_id, SUM(quantity) AS total_quantity, SUM(quantity * price) AS total_sales
FROM sales
GROUP BY product_id;
  1. 使用Python查询这个视图。
import mysql.connector
conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
cursor = conn.cursor()
cursor.execute("SELECT * FROM sales_summary")
for row in cursor.fetchall():
    print(row)
cursor.close()
conn.close()

9.3.3 拓展案例 1:使用 Python 和临时表处理复杂数据

在处理一项复杂的数据分析任务时,你需要创建一个临时表来存储中间结果。

conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
cursor = conn.cursor()
cursor.execute("CREATE TEMPORARY TABLE temp_sales AS SELECT * FROM sales WHERE date >= '2021-01-01'")
cursor.execute("SELECT * FROM temp_sales")
for row in cursor.fetchall():
 print(row)
# 临时表在连接关闭时自动销毁
cursor.close()
conn.close()

9.3.4 拓展案例 2:使用视图和 Python 实现数据权限管理

假设你的应用对数据访问有着严格的权限要求,你可以使用视图来实现数据访问的安全层。

CREATE VIEW user_view AS
SELECT id, username, email FROM users WHERE active = 1;
# 假设只有特定的用户可以访问这个视图
def fetch_active_users(user_id):
 # 这里添加权限检查逻辑
 if user_id == "admin":
     cursor.execute("SELECT * FROM user_view")
     for row in cursor.fetchall():
         print(row)
 else:
     print("Access denied.")

通过上述案例,你已经学会了如何在MySQL中使用视图和临时表来简化数据访问和处理。这些技巧可以帮助你提高查询的效率,优化数据处理流程,同时保证数据访问的安全性和一致性。使用Python进行操作让这一切变得更加灵活和强大,无论是简化数据访问,还是处理复杂的数据分析任务,都能够轻松应对。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
29天前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆
|
1月前
|
存储 关系型数据库 MySQL
MySQL 8.0特性-自增变量的持久化
【11月更文挑战第8天】在 MySQL 8.0 之前,自增变量(`AUTO_INCREMENT`)的行为在服务器重启后可能会发生变化,导致意外结果。MySQL 8.0 引入了自增变量的持久化特性,将其信息存储在数据字典中,确保重启后的一致性。这提高了开发和管理的稳定性,减少了主键冲突和数据不一致的风险。默认情况下,MySQL 8.0 启用了这一特性,但在升级时需注意行为变化。
|
3月前
|
JSON 关系型数据库 MySQL
MySQL 8.0 新特性
MySQL 8.0 新特性
169 10
MySQL 8.0 新特性
|
3月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
708 18
|
2月前
|
SQL 安全 关系型数据库
MySQL8.2有哪些新特性?
【10月更文挑战第3天】MySQL8.2有哪些新特性?
60 2
|
4月前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
4月前
|
SQL 算法 关系型数据库
(二十)MySQL特性篇:2022年的我们,必须要懂的那些数据库新技术!
 MySQL数据库从1995年诞生至今,已经过去了二十多个年头了,到2022.04.26日为止,MySQL8.0.29正式发行了GA版本,在此之前版本也发生了多次迭代,发行了大大小小N多个版本,其中每个版本中都有各自的新特性,所有版本的特性加起来,用一本书的篇幅也无法完全阐述清楚,因此本章主要会挑重点特性来讲,具体各版本的特性可参考MySQL官网的开发手册。
190 1
|
5月前
|
关系型数据库 MySQL 调度
MySQL高级功能与优化策略深度探索
MySQL高级功能与优化策略深度探索
|
6月前
|
关系型数据库 MySQL 测试技术
深入探索MySQL 8:隐藏索引与降序索引的新特性
深入探索MySQL 8:隐藏索引与降序索引的新特性
|
6月前
|
关系型数据库 MySQL 数据库
MySQL 8.0 新特性之不可见主键
【6月更文挑战第9天】MySQL 8.0 引入了不可见主键特性,提供更灵活的数据库管理方式。不可见主键能减少业务逻辑干扰,提高数据安全性和隐私,同时在某些场景下更适用。示例展示了如何创建和使用不可见主键,但需要注意它可能带来的理解和调试难题。此特性增加了设计和管理数据库的选项,适用于对数据隐私有高要求的场景。随着技术发展,不断学习和探索新特性将提升数据库性能和功能。
92 9