数据库左连接、右连接、内连接、全连接、交叉连接、自连接、自然连接

在数据库中,JOIN 用于连接多个表并返回符合条件的数据。主要有以下几种 JOIN 方式:

1. INNER JOIN(内连接)

  • 作用: 只返回两个表中匹配的记录
  • 示例: 连接 users 表和 orders 表,获取有订单的用户信息。
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;

结果: 仅包含 usersorders 表中 user_id 相同 的行。

2. LEFT JOIN(左连接)

  • 作用: 返回 左表的所有数据,右表匹配的记录(如果没有匹配,则右表数据为 NULL)。
  • 示例: 获取所有用户,即使他们没有订单。
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
  • 结果:
    • 如果用户有订单,则显示订单信息。
    • 如果用户没有订单,orders 列的值为 NULL

3. RIGHT JOIN(右连接)

  • 作用: 返回 右表的所有数据,左表匹配的记录(如果没有匹配,则左表数据为 NULL)。
  • 示例: 获取所有订单,即使它们没有关联用户。
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
  • 结果:
    • 如果订单有用户,返回正常数据。
    • 如果订单没有匹配的用户,users 列的值为 NULL

4. FULL JOIN(全连接)

  • 作用: 返回 左表和右表所有记录,如果没有匹配,则缺失一方的数据填充 NULL(MySQL 不支持 FULL JOIN)。
  • 示例(PostgreSQL 支持):
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
FULL JOIN orders ON users.id = orders.user_id;
  • 结果:
    • 有匹配的记录 → 正常显示。
    • 无匹配的记录 → 另一表的列填充 NULL

5. CROSS JOIN(交叉连接)

  • 作用: 返回 两个表的笛卡尔积(所有可能的组合)。
  • 示例: 获取所有用户与所有订单的组合。
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
CROSS JOIN orders;

结果:

  • users 表有 5 行,orders 表有 3 行,则返回 5 × 3 = 15 条记录。

6. SELF JOIN(自连接)

  • 作用: 让表自己连接自己,通常用于处理层级结构(如员工与经理)。
  • 示例: 查询员工及其经理信息(employees 表中 manager_id 指向 id)。
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;

结果: 显示每个员工及其上级。

7. NATURAL JOIN(自然连接)

  • 作用: 自动匹配 两个表中相同名称的列 进行连接(不推荐,容易出错)。
  • 示例:
SELECT * FROM users NATURAL JOIN orders;

结果: usersorders 自动 以相同列名的字段连接(如 iduser_id)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值