如何为指定表编写SQL请求/命令?表连接SQL语句相关咨询
如何编写连接两个数据表的SQL语句?
嘿,我来帮你梳理下用SQL连接两个数据表的常用方法~常见的连接类型有几种,我一个个给你讲清楚,配个简单例子方便理解:
1. 内连接(INNER JOIN)
这是最常用的连接方式,只返回两个表中匹配连接条件的行,也就是两个表数据的交集部分。
比如我们有users表(存储用户ID、姓名)和orders表(存储订单ID、关联用户ID、订单金额),要找出有订单记录的用户及其订单信息,可以这么写:
SELECT users.user_id, users.name, orders.order_id, orders.amount FROM users INNER JOIN orders ON users.user_id = orders.user_id;
小贴士:ON后面是两个表的关联字段,这里是user_id,一定要确保这两个字段的类型匹配哦!
2. 左连接(LEFT JOIN / LEFT OUTER JOIN)
返回左表(FROM后面的表)的所有行,以及右表中匹配连接条件的行;如果右表没有对应匹配的记录,那右表的列会显示NULL。
比如要找出所有用户,包括那些还没下过订单的用户:
SELECT users.user_id, users.name, orders.order_id, orders.amount FROM users LEFT JOIN orders ON users.user_id = orders.user_id;
如果只想筛选出没有订单的用户,加个条件就行:
SELECT users.user_id, users.name FROM users LEFT JOIN orders ON users.user_id = orders.user_id WHERE orders.order_id IS NULL;
3. 右连接(RIGHT JOIN / RIGHT OUTER JOIN)
和左连接逻辑相反,返回右表的所有行,以及左表中匹配连接条件的行;左表无匹配的部分,对应列会显示NULL。
比如要查看所有订单,包括那些可能缺失关联用户信息的测试订单:
SELECT users.user_id, users.name, orders.order_id, orders.amount FROM users RIGHT JOIN orders ON users.user_id = orders.user_id;
4. 全连接(FULL JOIN / FULL OUTER JOIN)
返回两个表的所有行,不管有没有匹配的记录;某一方无匹配的部分,对应列会显示NULL。
注意:像MySQL这类数据库不支持直接的FULL JOIN,可以用UNION组合左连接和右连接来实现效果。
支持全连接的数据库(比如PostgreSQL)写法:
SELECT users.user_id, users.name, orders.order_id, orders.amount FROM users FULL JOIN orders ON users.user_id = orders.user_id;
MySQL替代写法:
SELECT users.user_id, users.name, orders.order_id, orders.amount FROM users LEFT JOIN orders ON users.user_id = orders.user_id UNION SELECT users.user_id, users.name, orders.order_id, orders.amount FROM users RIGHT JOIN orders ON users.user_id = orders.user_id;
额外小技巧
可以给表起别名简化代码,让SQL更简洁易读:
SELECT u.user_id, u.name, o.order_id, o.amount FROM users u INNER JOIN orders o ON u.user_id = o.user_id;
注意:连接时一定要指定ON子句,避免出现笛卡尔积(两个表所有行无规则匹配,数据量会爆炸)!
内容的提问来源于stack exchange,提问作者Gurinder Singh
相关产品推荐
相关产品推荐

