在 ANSI SQL 中,连表(JOIN)操作是标准且通用的,几乎所有关系型数据库(如 MySQL、PostgreSQL、Oracle、SQL Server 等)都支持。下面按从基础到常见用法给你系统讲解。
ANSI SQL 定义了以下几种标准连表方式:
| JOIN 类型 | 含义 |
|---|---|
INNER JOIN |
内连接(默认) |
LEFT OUTER JOIN |
左外连接 |
RIGHT OUTER JOIN |
右外连接 |
FULL OUTER JOIN |
全外连接 |
CROSS JOIN |
笛卡尔积 |
NATURAL JOIN |
自然连接(不推荐) |
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 订单表
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2)
);
✅ 最常用的连接方式
SELECT
u.id,
u.name,
o.amount
FROM users u
INNER JOIN orders o
ON u.id = o.user_id;
users.id 在 orders 中不存在,该行不会返回SELECT
u.id,
u.name,
o.amount
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id;
orders 字段为 NULL✅ 常用于:
“查出所有用户,即使没有订单”
SELECT
u.id,
u.name,
o.amount
FROM users u
RIGHT JOIN orders o
ON u.id = o.user_id;
users 字段为 NULL⚠️ 实际中较少使用(通常改用 LEFT JOIN)
SELECT
u.id,
u.name,
o.amount
FROM users u
FULL OUTER JOIN orders o
ON u.id = o.user_id;
NULL 填充⚠️ 注意:
SELECT *
FROM users
CROSS JOIN orders;
⚠️ 谨慎使用,数据量大会爆炸
SELECT *
FROM users
NATURAL JOIN orders;
❌ 实际项目中不建议使用
✅ 明确 JOIN + ON
SELECT
u.id,
u.name,
o.amount
FROM users u
JOIN orders o
ON u.id = o.user_id
WHERE o.amount > 100;
INNER JOIN 可简写为 JOINLEFT OUTER JOIN 可简写为 LEFT JOINSELECT
u.name,
o.amount,
p.name AS product_name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;
✅ 一句话总结
ANSI SQL 使用
JOIN ... ON实现连表,推荐INNER JOIN/LEFT JOIN,避免隐式连接和 NATURAL JOIN。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。