当前位置: 首页 > article >正文

从‘学生选课’到‘商品订单’:手把手带你用MySQL实战理解关系代数(选择、投影、连接)

从‘学生选课’到‘商品订单’手把手带你用MySQL实战理解关系代数选择、投影、连接1. 关系代数与SQL的桥梁关系代数是数据库理论的基石而SQL则是实际应用中的利器。理解两者之间的对应关系能让我们在编写SQL时更加得心应手。让我们从一个简单的学生选课系统开始-- 创建学生表 CREATE TABLE students ( student_id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, major VARCHAR(50) ); -- 创建课程表 CREATE TABLE courses ( course_id INT PRIMARY KEY, title VARCHAR(100) NOT NULL, credit INT ); -- 创建选课关系表 CREATE TABLE enrollments ( student_id INT, course_id INT, semester VARCHAR(20), grade CHAR(2), PRIMARY KEY (student_id, course_id, semester), FOREIGN KEY (student_id) REFERENCES students(student_id), FOREIGN KEY (course_id) REFERENCES courses(course_id) );关系代数中的**选择(σ)**操作对应SQL中的WHERE子句。例如要查询计算机专业的学生-- 关系代数σ_major计算机(students) SELECT * FROM students WHERE major 计算机;**投影(π)**操作则对应SELECT子句中指定的列-- 关系代数π_name,major(students) SELECT name, major FROM students;2. 连接操作的实战解析连接(⋈)是关系代数中最强大的操作之一在SQL中有多种实现方式。让我们看一个电商订单系统的例子-- 创建商品表 CREATE TABLE products ( product_id INT PRIMARY KEY, name VARCHAR(100) NOT NULL, price DECIMAL(10,2), category VARCHAR(50) ); -- 创建订单表 CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, total_amount DECIMAL(12,2) ); -- 创建订单详情表 CREATE TABLE order_items ( order_id INT, product_id INT, quantity INT, unit_price DECIMAL(10,2), PRIMARY KEY (order_id, product_id), FOREIGN KEY (order_id) REFERENCES orders(order_id), FOREIGN KEY (product_id) REFERENCES products(product_id) );自然连接在SQL中可以通过JOIN实现-- 关系代数orders ⋈ order_items SELECT * FROM orders NATURAL JOIN order_items;更常见的是使用显式的INNER JOIN-- 查询每个订单的详细信息 SELECT o.order_id, o.order_date, p.name, oi.quantity, oi.unit_price FROM orders o INNER JOIN order_items oi ON o.order_id oi.order_id INNER JOIN products p ON oi.product_id p.product_id;3. 复杂查询的关系代数解析让我们通过几个实际案例深入理解关系代数操作3.1 查询选了数据库原理课程的学生-- 关系代数π_name(σ_title数据库原理(courses) ⋈ enrollments ⋈ students) SELECT s.name FROM students s JOIN enrollments e ON s.student_id e.student_id JOIN courses c ON e.course_id c.course_id WHERE c.title 数据库原理;3.2 统计每个商品的销售总额-- 关系代数π_name,sum(quantity*unit_price)(products ⋈ order_items) SELECT p.name, SUM(oi.quantity * oi.unit_price) AS total_sales FROM products p JOIN order_items oi ON p.product_id oi.product_id GROUP BY p.name;3.3 使用外连接处理不完整数据-- 左外连接列出所有商品即使没有销售记录 SELECT p.name, COALESCE(SUM(oi.quantity), 0) AS total_quantity FROM products p LEFT JOIN order_items oi ON p.product_id oi.product_id GROUP BY p.name;4. 关系代数运算的SQL实现关系代数的基本运算在SQL中都有对应实现关系代数运算SQL实现示例选择(σ)WHERESELECT * FROM table WHERE condition投影(π)SELECTSELECT col1, col2 FROM table并(∪)UNIONSELECT * FROM table1 UNION SELECT * FROM table2差(-)EXCEPTSELECT * FROM table1 EXCEPT SELECT * FROM table2笛卡尔积(×)CROSS JOINSELECT * FROM table1 CROSS JOIN table2连接(⋈)JOINSELECT * FROM table1 JOIN table2 ON condition除运算的实现较为复杂但可以通过嵌套查询实现-- 找出选了所有课程的学生 SELECT s.name FROM students s WHERE NOT EXISTS ( SELECT c.course_id FROM courses c WHERE NOT EXISTS ( SELECT * FROM enrollments e WHERE e.student_id s.student_id AND e.course_id c.course_id ) );5. 性能优化与实践技巧理解关系代数有助于我们编写更高效的SQL查询。以下是一些实用技巧选择操作尽早应用在连接前先过滤数据减少处理的数据量-- 优化前 SELECT s.name, c.title FROM students s JOIN enrollments e ON s.student_id e.student_id JOIN courses c ON e.course_id c.course_id WHERE s.major 计算机; -- 优化后先过滤计算机专业的学生 SELECT s.name, c.title FROM (SELECT * FROM students WHERE major 计算机) s JOIN enrollments e ON s.student_id e.student_id JOIN courses c ON e.course_id c.course_id;合理使用索引为连接条件和常用过滤条件创建索引CREATE INDEX idx_enrollments_student ON enrollments(student_id); CREATE INDEX idx_enrollments_course ON enrollments(course_id);理解执行计划使用EXPLAIN分析查询性能EXPLAIN SELECT s.name, c.title FROM students s JOIN enrollments e ON s.student_id e.student_id JOIN courses c ON e.course_id c.course_id WHERE s.major 计算机;6. 实际案例电商系统复杂查询让我们通过一个电商系统的综合案例展示如何将关系代数应用于实际业务场景-- 查询每个客户的购买总金额及购买商品种类数 SELECT c.customer_id, c.name, SUM(oi.quantity * oi.unit_price) AS total_spent, COUNT(DISTINCT oi.product_id) AS unique_products FROM customers c LEFT JOIN orders o ON c.customer_id o.customer_id LEFT JOIN order_items oi ON o.order_id oi.order_id GROUP BY c.customer_id, c.name ORDER BY total_spent DESC; -- 查询热销商品销量前10 SELECT p.product_id, p.name, SUM(oi.quantity) AS total_quantity, SUM(oi.quantity * oi.unit_price) AS total_revenue FROM products p JOIN order_items oi ON p.product_id oi.product_id GROUP BY p.product_id, p.name ORDER BY total_quantity DESC LIMIT 10; -- 查询有潜力但销量不佳的商品高单价低销量 SELECT p.product_id, p.name, p.price, COALESCE(SUM(oi.quantity), 0) AS total_quantity FROM products p LEFT JOIN order_items oi ON p.product_id oi.product_id GROUP BY p.product_id, p.name, p.price HAVING COALESCE(SUM(oi.quantity), 0) 10 AND p.price 500 ORDER BY p.price DESC;通过这些实际案例我们可以看到关系代数理论如何指导我们构建复杂的业务查询。掌握这些基础操作能够帮助我们在面对各种数据查询需求时游刃有余。

相关文章:

从‘学生选课’到‘商品订单’:手把手带你用MySQL实战理解关系代数(选择、投影、连接)

从‘学生选课’到‘商品订单’:手把手带你用MySQL实战理解关系代数(选择、投影、连接) 1. 关系代数与SQL的桥梁 关系代数是数据库理论的基石,而SQL则是实际应用中的利器。理解两者之间的对应关系,能让我们在编写SQL时更…...

ROS机器人系统与URDF建模入门

一、机器人系统的核心组成一个完整的机器人,本质是“感知-决策-执行”的闭环系统,就像一个精密协作的生命体,四大核心模块各司其职、相互配合,缺一不可。从控制角度来看,分别是执行机构、驱动系统、传感系统、控制系统…...

Mac上IDEA的PlantUML插件报错‘找不到Graphviz’?手把手教你用Homebrew搞定(附阿里云镜像避坑)

Mac上IDEA的PlantUML插件报错‘找不到Graphviz’?手把手教你用Homebrew搞定(附阿里云镜像避坑) 最近在Mac上使用IntelliJ IDEA的PlantUML插件时,不少开发者遇到了一个经典问题:插件报错提示"找不到Graphviz"…...

MCP 工具数量爆炸后,如何高效做 Tool Selection?

MCP 工具数量爆炸后,如何高效做 Tool Selection? 背景:规模扩展带来的路由难题 在 MCP(Model Context Protocol)架构中,随着接入工具数量的增长,一个问题会越来越突出:LLM 开始选错工…...

用 Agent 自动化数据处理:从 2 小时到 15 分钟的效率革命

💻 完整可运行代码: https://github.com/Lee985-cmd/AI-30-Day-Challenge ⭐ 如果觉得有用,欢迎 Star 支持! 一、场景痛点:数据分析师的日常困境 真实场景还原 早上 9:00 - 收到老板邮件:"帮我分析一…...

手把手排查SSV6155/6255 WiFi模块不识别问题:从硬件检查到驱动加载

SSV6x5x WiFi模块深度排障指南:从硬件信号到驱动加载全流程解析 当你的开发板上的SSV6155或SSV6255 WiFi模块突然"消失"时,那种感觉就像在迷宫里失去了指南针。作为嵌入式开发者,我们需要的不是泛泛而谈的理论,而是一套…...

Rhino 7 + Grasshopper 新手避坑指南:这5个隐藏设置不打开,效率直接减半

Rhino 7 Grasshopper 新手避坑指南:这5个隐藏设置不打开,效率直接减半 刚接触Rhino和Grasshopper的新手设计师们,往往会被默认界面中那些看似无害实则拖累效率的"隐形陷阱"困扰。当你在深夜赶项目时,是否经历过反复切…...

MCP C# SDK v. 正式发布

OCP原则 ocp指开闭原则,对扩展开放,对修改关闭。是七大原则中最基本的一个原则。 依赖倒置原则(DIP) 什么是依赖倒置原则 核心是面向接口编程、面向抽象编程, 不是面向具体编程。 依赖倒置原则的目的 降低耦合度&#…...

KeysPerSecond终极指南:实时键盘操作监控与性能优化神器

KeysPerSecond终极指南:实时键盘操作监控与性能优化神器 【免费下载链接】KeysPerSecond A keys-per-second meter & counter. Written for osu! but should work for other rhythm games too. 项目地址: https://gitcode.com/gh_mirrors/ke/KeysPerSecond …...

明日方舟自动化助手MAA:从入门到精通的完整游戏辅助指南

明日方舟自动化助手MAA:从入门到精通的完整游戏辅助指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://g…...

Windows Defender 四层防护解除技术深度解析:defender-control 开源项目完全指南

Windows Defender 四层防护解除技术深度解析:defender-control 开源项目完全指南 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/d…...

告别实体卡!Android 系统级 SIM 卡模拟:CarrierTestOverride 机制深度解读与自定义配置

Android 系统级 SIM 卡模拟:CarrierTestOverride 机制深度解析与实战指南 在移动设备开发与测试领域,模拟运营商环境一直是个高频需求。传统方式往往依赖实体 SIM 卡或专用测试设备,不仅成本高昂,灵活性也受限。Android 系统内置的…...

如何零成本掌握专业统计分析?JASP开源统计软件终极指南

如何零成本掌握专业统计分析?JASP开源统计软件终极指南 【免费下载链接】jasp-desktop JASP aims to be a complete statistical package for both Bayesian and Frequentist statistical methods, that is easy to use and familiar to users of SPSS 项目地址: …...

实战复盘:我是如何用Frida Hook一个AES加密的SO库,并拿到Key和IV的

逆向工程实战:Frida动态Hook解密AES加密SO库的关键技术解析 在移动安全领域,逆向分析加密算法一直是极具挑战性的技术课题。当遇到关键业务逻辑被编译到SO库中,特别是采用AES这类标准加密算法时,如何高效提取密钥参数成为安全研究…...

手把手教你排查STM32 SPI通信失败:从示波器看CLK信号到CubeMX代码审查

STM32 SPI通信故障深度排查:从硬件信号捕获到CubeMX配置陷阱 引言 当你在深夜调试一块新设计的STM32板卡,SPI外设无论如何都无法正常通信时,那种挫败感足以让任何嵌入式工程师抓狂。SPI作为嵌入式系统中最常用的串行通信协议之一,…...

如何在5分钟内免费拥有专属音乐播放器:开源酷狗客户端完整配置秘籍

如何在5分钟内免费拥有专属音乐播放器:开源酷狗客户端完整配置秘籍 【免费下载链接】MoeKoeMusic 一款开源简洁高颜值的酷狗第三方客户端 An open-source, concise, and aesthetically pleasing third-party client for KuGou that supports Windows / macOS / Linu…...

山东楼顶广告字技术白皮书:从选材到安装的完整实践指南

楼顶广告字的行业地位与价值在户外广告领域,山东楼顶广告字作为城市天际线的重要组成部分,不仅承担着商业宣传的功能,更成为区域经济发展的风向标。这类广告字通常安装在建筑物顶部,具有视野开阔、传播范围广的特点。随着城市建设…...

Excel跨表格查找神器:VLOOKUP+粘贴链接实现数据自动同步(附避坑指南)

Excel跨表格动态同步:VLOOKUP与粘贴链接的进阶组合技 每次手动复制粘贴不同表格的数据,不仅耗时费力,还容易出错。想象一下,当源数据更新时,所有关联表格能自动同步变化,这才是高效办公的真谛。今天要分享的…...

AI Agent行动规划算法:动态环境下的最优决策生成

AI Agent行动规划算法:动态环境下的最优决策生成 1. 引言 在人工智能技术飞速发展的今天,AI Agent(智能体)已经成为了连接理论与实践的关键桥梁。从自动驾驶汽车到智能客服机器人,从游戏AI到工业自动化控制,AI Agent正在以前所未有的方式改变着我们的生活和工作方式。然…...

Axure RP中文界面终极配置指南:3分钟实现专业汉化

Axure RP中文界面终极配置指南:3分钟实现专业汉化 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英…...

别再只盯着SENet了!手把手教你用PyTorch复现SKNet和CBAM(附完整代码)

深度学习注意力机制实战:从SKNet到CBAM的PyTorch实现精要 在计算机视觉领域,注意力机制已经成为提升模型性能的关键技术。不同于传统的卷积神经网络平等对待所有特征通道,注意力机制让模型学会"关注"最重要的信息。本文将带您深入…...

SQL盲注技术全解析:布尔盲注、时间盲注与DNSLog带外注入

前言 在之前的学习中,我们掌握了 SQL 注入的基本原理,包括联合查询注入和报错注入技术。这些攻击方式都有一个共同点:需要页面能够显示查询结果或通过报错信息泄露数据。但在实际环境中,Web 应用通常会采取多种防护措施&#xff…...

SQL注入攻击与防御实战:手把手教你挖漏洞

三、防御方案。1.参数化查询:用Prepared Statements,用户输入当数据处理。PHP用PDO,Java用PreparedStatement。2.输入验证:白名单过滤危险字符单引号、分号等。3.使用ORM框架:Laravel、Hibernate等内置防注入。4.最小权…...

Vue3怎么起步入门?

Vue.js 是一个渐进式 JavaScript 框架,主要用于构建用户界面。 刚开始学习 Vue,我们不推荐使用 vue-cli 命令行工具来创建项目,更简单的方式是直接在页面引入 vue.global.js 文件来测试学习。 Vue3 中的应用是通过使用 createApp 函数来创建…...

从集合到点云:深入浅出图解Deep Sets的置换不变性到底在说什么

从集合到点云:深入浅出图解Deep Sets的置换不变性到底在说什么 想象一下,你面前有一堆散落的乐高积木,无论你怎么打乱它们的顺序,最终拼出来的城堡总是一样的。这就是置换不变性(Permutation Invariance)的…...

终极指南:3步解锁百度网盘SVIP高速下载功能(macOS版)

终极指南:3步解锁百度网盘SVIP高速下载功能(macOS版) 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘…...

【Python基础】零基础入门到实战,这一篇就够了!(附详细代码)

前言 大家好,我是jifeng,今天给大家带来一篇全网最贴心的Python保姆级入门教程。 在这个AI与大数据爆发的时代,“人生苦短,我用Python” 早已不仅仅是一句口号。无论是Web开发、数据分析、人工智能还是日常办公自动化&#xff0…...

SiameseUIE模型在网络安全领域的应用:威胁情报抽取

SiameseUIE模型在网络安全领域的应用:威胁情报抽取 网络安全分析师每天都要面对海量的威胁情报报告、安全日志和漏洞公告。这些文本数据里藏着攻击者的IP地址、恶意域名、攻击手法、漏洞编号等关键信息。传统做法是人工逐篇阅读、标记、整理,不仅效率低…...

终极指南:如何用KMS_VL_ALL_AIO一键永久激活Windows和Office系统

终极指南:如何用KMS_VL_ALL_AIO一键永久激活Windows和Office系统 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档…...

SOCD Cleaner:终极键盘优化工具 - 5个关键优势提升游戏操作精度

SOCD Cleaner:终极键盘优化工具 - 5个关键优势提升游戏操作精度 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在竞技游戏的微秒级对决中,你是否曾因同时按下W和S键导致角色卡顿&#x…...