以下是 MySQL 中 选择(SELECT)、投影(PROJECT)、并(UNION)、差(EXCEPT)、笛卡尔积(CROSS JOIN) 五种基本关系代数操作的实现方法及示例,结合具体 SQL 语法和适用场景:
一、选择(SELECT)
定义:从表中筛选满足条件的行。
SQL 语法:
SELECT * FROM 表名 WHERE 条件;
示例:
-- 筛选年龄大于 18 的用户
SELECT * FROM users WHERE age > 18;
关键点:
- 支持复杂条件(如
AND
、OR
、BETWEEN
)。 - 可结合索引优化查询性能。
二、投影(PROJECT)
定义:从表中选择特定列,而非所有列。
SQL 语法:
SELECT 列1, 列2 FROM 表名;
示例:
-- 仅获取用户姓名和邮箱
SELECT name, email FROM users;
关键点:
- 可重命名列名(如
SELECT name AS 姓名
)。 - 支持聚合函数(如
SUM
、AVG
)。
三、并(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 IN
或NOT 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 |
全组合生成、测试数据 | 避免大表直接使用 |
评论区