侧边栏壁纸
博主头像
BvBeJ的小站 博主等级

行动起来,活在当下

  • 累计撰写 23 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

MySQL 中的五种基本关系代数操作

BvBeJ
2025-03-25 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

以下是 MySQL 中 选择(SELECT)、投影(PROJECT)、并(UNION)、差(EXCEPT)、笛卡尔积(CROSS JOIN) 五种基本关系代数操作的实现方法及示例,结合具体 SQL 语法和适用场景:


一、选择(SELECT)

定义:从表中筛选满足条件的行。
SQL 语法

SELECT * FROM 表名 WHERE 条件;

示例

-- 筛选年龄大于 18 的用户
SELECT * FROM users WHERE age > 18;

关键点

  • 支持复杂条件(如 ANDORBETWEEN)。
  • 可结合索引优化查询性能。

二、投影(PROJECT)

定义:从表中选择特定列,而非所有列。
SQL 语法

SELECT 列1, 列2 FROM 表名;

示例

-- 仅获取用户姓名和邮箱
SELECT name, email FROM users;

关键点

  • 可重命名列名(如 SELECT name AS 姓名)。
  • 支持聚合函数(如 SUMAVG)。

三、并(UNION)

定义:合并两个查询结果集,去除重复行。
SQL 语法

SELECT 列1 FROM 表A
UNION
SELECT 列1 FROM 表B;

示例

-- 合并两个表的用户ID(去重)
SELECT user_id FROM orders
UNION
SELECT user_id FROM payments;

注意

  • 需保证列数和数据类型一致。
  • UNION ALL 保留重复行。

四、差(EXCEPT / MINUS)

定义:返回第一个查询中存在而第二个查询中不存在的行。
SQL 语法(MySQL 8.0+):

SELECT 列1 FROM 表A
EXCEPT
SELECT 列1 FROM 表B;

替代方法(适用于低版本 MySQL):

-- 使用 LEFT JOIN 和 IS NULL
SELECT A.* FROM 表A A
LEFT JOIN 表B B ON A.id = B.id
WHERE B.id IS NULL;

示例

-- 找出未下单的用户
SELECT user_id FROM users
EXCEPT
SELECT user_id FROM orders;

关键点

  • EXCEPT 在 MySQL 8.0+ 支持。
  • 低版本可用 NOT INNOT EXISTS 替代。

五、笛卡尔积(CROSS JOIN)

定义:返回两个表所有行的组合。
SQL 语法

SELECT * FROM 表A CROSS JOIN 表B;
-- 或省略 JOIN 条件
SELECT * FROM 表A, 表B;

示例

-- 生成所有用户与产品的组合
SELECT * FROM users CROSS JOIN products;

关键点

  • 结果行数为两表行数乘积(慎用大数据表)。
  • 常用于生成测试数据或全排列场景。

总结与对比

操作 核心 SQL 语法 适用场景 性能注意事项
选择 WHERE 条件筛选 过滤数据 合理使用索引
投影 指定列名 减少数据传输量 避免 SELECT *
UNION / UNION ALL 合并数据集 去重影响性能
EXCEPT / LEFT JOIN ... NULL 数据校验、差异分析 低版本需替代方案
笛卡尔积 CROSS JOIN 全组合生成、测试数据 避免大表直接使用
0

评论区