首页 > 数据库 >【MySQL】提高篇—理论讲解与案例分析:实践练习:编写复杂查询、创建视图和存储过程

【MySQL】提高篇—理论讲解与案例分析:实践练习:编写复杂查询、创建视图和存储过程

时间:2024-10-24 09:16:35浏览次数:10  
标签:customer product -- MySQL 视图 订单 讲解 id

关系数据库是存储和管理数据的核心工具。随着数据量的不断增加和业务需求的复杂化,开发者和数据分析师需要掌握编写复杂查询、创建视图和存储过程的技能。这些技能不仅能够提高数据操作的效率,还能确保数据处理的准确性和安全性。

  • 复杂查询:能够从多个表中提取相关数据,进行联接、聚合和筛选,以满足特定的业务需求。

  • 视图:是一个虚拟表,可以简化复杂查询的使用,提供更好的数据安全性和简化数据访问。

  • 存储过程:是一组预编译的 SQL 语句,可以封装复杂的逻辑,减少代码重复,提高性能和安全性。

在本文中,我将通过一个完整的案例来演示如何编写复杂查询、创建视图和存储过程。案例将围绕一个简单的在线商店数据库进行,涵盖产品、订单和客户信息。

案例背景

构建一个在线商店数据库,包含以下三个表:

  1. customers:存储客户信息。

  2. products:存储产品信息。

  3. orders:存储订单信息,包括客户和产品的关联。

1. 创建数据库及表

创建数据库和相应的表。

-- 创建数据库
CREATE DATABASE online_store;

-- 使用数据库
USE online_store;

-- 创建客户表
CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT, -- 客户ID,主键,自增
    first_name VARCHAR(50) NOT NULL,           -- 名字,不能为空
    last_name VARCHAR(50) NOT NULL,            -- 姓氏,不能为空
    email VARCHAR(100) UNIQUE NOT NULL          -- 电子邮件,唯一,不能为空
);

-- 创建产品表
CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,  -- 产品ID,主键,自增
    product_name VARCHAR(100) NOT NULL,         -- 产品名称,不能为空
    price DECIMAL(10, 2) NOT NULL                -- 产品价格,不能为空
);

-- 创建订单表
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,     -- 订单ID,主键,自增
    customer_id INT NOT NULL,                    -- 客户ID,不能为空
    product_id INT NOT NULL,                     -- 产品ID,不能为空
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP, -- 订单日期,默认为当前时间
    quantity INT NOT NULL,                       -- 订单数量,不能为空
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id), -- 外键,引用客户表
    FOREIGN KEY (product_id) REFERENCES products(product_id)     -- 外键,引用产品表
);

解释

  • 创建了一个名为 online_store 的数据库,并在其中创建了三个表:customersproductsorders。每个表都定义了主键和外键,以维护数据的完整性。

2. 插入示例数据

接下来,向这些表中插入一些示例数据,以便进行后续的查询和操作。

-- 插入客户数据
INSERT INTO customers (first_name, last_name, email) VALUES
('John', 'Doe', '[email protected]'),
('Jane', 'Smith', '[email protected]'),
('Alice', 'Johnson', '[email protected]');

-- 插入产品数据
INSERT INTO products (product_name, price) VALUES
('Laptop', 999.99),
('Smartphone', 499.99),
('Tablet', 299.99);

-- 插入订单数据
INSERT INTO orders (customer_id, product_id, quantity) VALUES
(1, 1, 1),  -- John Doe 购买 1 台 Laptop
(1, 2, 2),  -- John Doe 购买 2 台 Smartphone
(2, 3, 1),  -- Jane Smith 购买 1 台 Tablet
(3, 1, 1);  -- Alice Johnson 购买 1 台 Laptop

解释

  • 插入了三位客户、三种产品和四个订单记录。订单记录中包含了客户和产品的关联信息。

3. 编写复杂查询

编写一个复杂查询,以获取每位客户的订单详情,包括客户姓名、产品名称、数量和订单日期。

SELECT 
    c.first_name AS CustomerFirstName,
    c.last_name AS CustomerLastName,
    p.product_name AS ProductName,
    o.quantity AS Quantity,
    o.order_date AS OrderDate
FROM 
    orders o
JOIN 
    customers c ON o.customer_id = c.customer_id  -- 连接客户表
JOIN 
    products p ON o.product_id = p.product_id;    -- 连接产品表

解释

  • 在查询中,使用了 JOIN 操作符来连接 orders 表、customers 表和 products 表。通过连接,能够提取出客户的姓名、所购买的产品名称、购买数量和订单日期。查询结果将显示每个订单的详细信息。

4. 创建视图

为了简化后续的查询,可以创建一个视图,以便快速访问客户订单信息。

CREATE VIEW customer_orders AS
SELECT 
    c.customer_id,
    c.first_name AS CustomerFirstName,
    c.last_name AS CustomerLastName,
    p.product_name AS ProductName,
    o.quantity AS Quantity,
    o.order_date AS OrderDate
FROM 
    orders o
JOIN 
    customers c ON o.customer_id = c.customer_id
JOIN 
    products p ON o.product_id = p.product_id;

解释

  • 通过创建视图 customer_orders,将复杂的查询封装在一个虚拟表中。今后,只需查询视图即可获取客户订单信息,简化了数据访问。

5. 使用视图进行查询

可以通过查询视图来获取客户订单信息,示例如下:

SELECT * FROM customer_orders;

解释

  • 这个查询将返回所有客户的订单信息,包括客户的姓名、产品名称、数量和订单日期,使用视图可以让查询更加简洁明了。

6. 创建存储过程

为了封装某些操作,可以创建一个存储过程,该过程可以用于添加新订单并自动更新库存(假设我们有库存管理)。以下是一个简单的存储过程示例。

DELIMITER //

CREATE PROCEDURE AddOrder (
    IN p_customer_id INT,
    IN p_product_id INT,
    IN p_quantity INT
)
BEGIN
    -- 插入新订单
    INSERT INTO orders (customer_id, product_id, quantity)
    VALUES (p_customer_id, p_product_id, p_quantity);
    
    -- 这里可以添加库存更新的逻辑(假设有库存表)
    -- UPDATE products SET stock = stock - p_quantity WHERE product_id = p_product_id;
END //

DELIMITER ;

解释

  • 定义了 AddOrder 的存储过程,接受客户 ID、产品 ID 和数量作为输入参数。该过程首先插入新订单记录,然后可以扩展逻辑以更新库存(假设有库存管理表)。使用存储过程可以提高代码的重用性和维护性。

7. 调用存储过程

可以通过调用存储过程来添加新订单。

CALL AddOrder(1, 2, 1);  -- John Doe 购买 1 台 Smartphone

解释

  • 通过调用 AddOrder 存储过程,为客户 ID 为 1 的 John Doe 添加了一条新订单记录,购买了 1 台 Smartphone。

总结

通过本案例,我详细演示了如何在关系数据库中:

  1. 创建数据库和表结构,确保数据的完整性。

  2. 插入示例数据,构建实际应用场景。

  3. 编写复杂查询,提取客户的订单详情。

  4. 创建视图,简化复杂查询的使用。

  5. 创建存储过程,封装业务逻辑,提高代码重用性。

掌握这些技能对于数据库开发和管理至关重要,可以帮助开发者更高效地处理数据,提升系统性能和安全性。通过不断的实践,将能够在实际项目中提高数据应用与性能。

标签:customer,product,--,MySQL,视图,订单,讲解,id
From: https://blog.csdn.net/thinking_chou/article/details/143198638

相关文章

  • Python连接MySQL
    要使用Python连接MySQL并操作数据,通常会使用pymysql或mysql-connector-python这样的库。使用pymysql库来连接MySQL、读取表并按照某个关系将它们连接起来。1、安装必要的库:pipinstallpymysqlpandas2、连接MySQL并读取数据:importpymysqlimportpandasaspd#MySQL......
  • LPDDR4/LPDDR4X讲解(一)
    1  基本概念与历史背景1.1基本概念 LPDDR4,全称为LowPowerDoubleDataRate4thGenerationSynchronousDynamicRandomAccessMemory,即第四代低功耗双倍数据率同步动态随机存取存储器。它是DDRSDRAM(DoubleDataRateSynchronousDynamicRandomAccessMemory,双......
  • MYSQL-SQL-01-DDL(Data Definition Language,数据定义语言)
    DDL(数据定义语言)DDL(DataDefinitionLanguage),数据定义语言,用来定义数据库对象(数据库,表,字段)。一、数据库操作1、查询mysql数据库管理系统的所有数据库语法:showdatabases;示例:2、查询当前所在的数据库语法:selectdatabase();示例:3、创建数据库语法:([]括号......
  • mysql 行级锁,四种事务隔离级别,两种读
    只说innodb存储引擎1.默认使用行级锁InnoDB存储引擎默认使用行级锁定(Row-LevelLocking)来提高并发性能和数据一致性不可更改2.四种事务隔离级别,默认是Repeatable级别(可重复读)问题场景:脏读1.A进行了一条数据操作,但是没有提交事务,如果此时B进行这条数据的查询,是可以查......
  • [MySQL笔记]窗口函数
    什么是窗口函数窗口函数(WindowFunction),又被叫做分析函数(AnalyticsFunction)。窗口函数允许用户在不显式分组查询的情况下对结果集进行分组和聚合计算。窗口函数能够为结果集中的每一行计算类似排名、行号、百分比和移动聚合函数等值。窗口函数原则上只能写在select子句中......
  • MySQL 存储引擎
    一、MySQL架构连接层         最上层是一些客户端和连接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为每个安全接入的用户端验证它所具有的操作权限。服务层         第二层架构主要完成大多数的核心服务功能,如SQL接口,并......
  • 如何将MySQL数据集成到金蝶云星空以实现生产领料单新增
    MySQL数据集成到金蝶云星空:SLD生产领料单新增深圳天一-单工序-好在企业信息化系统中,数据的高效流转和准确对接是业务运作的关键。本文将分享一个具体的技术案例,展示如何通过轻易云数据集成平台,将MySQL中的数据无缝集成到金蝶云星空,实现SLD生产领料单新增深圳天一-单工序-好的任......
  • mysql中将一行数据根据条件分拆多行
    以下用法只支持mysql8.0以上;遇到了个数据结构,字符串用逗号隔开的,需要分拆后统计数据,用到了mysql8的一个JSON_TABLE用法CREATETABLEitems(idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(255),tagsVARCHAR(255));INSERTINTOitems(name,tags)VALUES......
  • kubesphere搭建nacos2.2.3(MySQL)
    环境准备创建nacos数据库,sql来自于nacos官网,自行查找并执行启动环境配置如图具体配置如下具体含义请参考nacos官网#***************SpringBootRelatedConfigurations***************####Defaultwebcontextpath:server.servlet.contextPath=/nacos###Inc......
  • 高效集成:旺店通旗舰版与MySQL的数据对接方案
    旺店通旗舰版-其他入库单-->BI泰海-其他入库单表_原始查询(2024年起)数据集成方案在现代企业的数据管理中,如何高效、可靠地实现系统间的数据对接是一个关键挑战。本文将分享一个具体的技术案例,展示如何通过轻易云数据集成平台,将旺店通·旗舰奇门的数据无缝集成到MySQL数据库中。......