SQL中的JOIN

这里写图片描述

Students.addressId = Address.id
Students.id = Scores.studentId
Scores.courseId = Courses.id

如何在SQL查询语句中将两个表联接起来?我们将运用最重要的语法Join。

select * from Students
join  Address on Students.addressId = Address.id

join将Students和Address两表关联,关联需要一个或多个字段作为联接桥梁。例子中的桥梁就是addressid,我们使用on语句,将Students表的addressId字段和Address的id字段匹配。

这里需要注意的是,因为字段可能重名,所以一旦使用了Join,字段前应该加上表名,如Students.addressId和Address.id
,这种用法是为了字段的唯一性,否则遇到重名,系统不知道使用哪个字段,就会报错。

select * from Students as s
join Address as a on s.addressId = a.id

上图是更优雅的写法,将表命名为一个缩略的别名,避免了语句过于冗余。不要使用拼音做别名,不是好习惯。

Join语法有很多不同的变形,Left Join,Outer Join等,新人很容易混淆。这个我们可以用数学中的交集和并集掌握。
这里写图片描述

通过上面的例子,我们已经掌握了Join的主流语法,其他无非是变种。比如加约束条件 where XX is null,这里的XX可以是结果为空的字段。拿上文Left Join的例子演示:

select Persons.LastName, Persons.FirstName, Orders.OrderNo
fromPersons
left joinOrders
onPersons.Id_P=Orders.Id_P
whereOrders.Id_P is Null
<think>嗯,用户想了解SQLJOIN的使用方法,我应该整理一个清晰的教程。用户提供了5个引用资料,其中引用[1]详细解释了INNER JOIN的概念,强调它只返回匹配的行。引用[2]和引用[3]都提到LEFT JOIN的用法,特别是引用[2]指出LEFT JOIN会保留左表所有行并用NULL填充右表缺失值。引用[4]补充了JOIN的分类体系,将常见类型分为内连接和外连接(左外、右外、全外)。引用[5]则展示了一个具体例子,演示如何用LEFT JOIN配合WHERE子句筛选右表为NULL的情况。 用户之前询问过JOIN的基本用法,这次可能需要更系统的分类说明。考虑到SQL实际应用场景,应该从最常见的内连接开始讲起,然后扩展到外连接。特别要注意: 1)分类逻辑要严谨,根据引用[4]的体系,明确内连接和外连接的包含关系 2)每个JOIN类型都需要包含标准语法(参考引用[3]的格式) 3)必须强调ON子句的重要性(引用[2]和引用[3]都提到) 4)对于容易混淆的LEFT/RIGHT JOIN,要突出"保留哪边数据"的特性(引用[2]) 5)NULL值的处理需要单独说明(引用[5]的例子很典型) 准备用表格对比常见类型的特性,这样更直观。但要注意用户可能用手机查看,表格不能太宽。外连接部分需要补充引用[4]提到的FULL JOIN,这个在引用[2][3]里没展开。最后提醒用户实际写SQL时的常见错误点,比如忘记连接条件导致的笛卡尔积问题——虽然引用里没提,但这对新手很重要。 用户提供的引用[5]有点特殊,是筛选不匹配记录的技巧,这个可以放在LEFT JOIN的注意事项里作为高阶用法。不过主要篇幅还是放在基础操作上,避免让初学者困惑。 </think>SQLJOIN是数据库查询的核心操作,用于组合多个表的行。以下是主要JOIN类型的使用详解及对比: --- ### 一、基础JOIN类型 1. **INNER JOIN(内连接)** - **作用**:仅返回两个表中**匹配成功**的行 - **语法**: ```sql SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.关联列 = 表2.关联列; ``` - **示例**: ```sql SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; ``` > 仅显示有订单记录的客户信息[^1][^4] 2. **LEFT JOIN(左连接)** - **作用**:返回**左表全部行** + 右表匹配行(无匹配时右表字段为`NULL`) - **语法**: ```sql SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.关联列 = 表2.关联列; ``` - **特殊应用(找不匹配项)**: ```sql SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.关联列 = 表2.关联列 WHERE 表2.关联列 IS NULL; -- 筛选右表无匹配的记录[^5] ``` 3. **RIGHT JOIN(右连接)** - **作用**:返回**右表全部行** + 左表匹配行(与LEFT JOIN逻辑镜像) - **语法**: ```sql SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 表1.关联列 = 表2.关联列; ``` 4. **FULL OUTER JOIN(全外连接)** - **作用**:返回左右表所有行(无匹配时对方字段为`NULL`) - **语法**: ```sql SELECT 列名 FROM 表1 FULL OUTER JOIN 表2 ON 表1.关联列 = 表2.关联列; ``` --- ### 二、关键对比表 | JOIN类型 | 保留左表所有行 | 保留右表所有行 | 保留匹配行 | 典型应用场景 | |------------------|----------------|----------------|------------|----------------------------| | **INNER JOIN** | ❌ | ❌ | ✔️ | 精确关联数据(如订单-客户)| | **LEFT JOIN** | ✔️ | ❌ | ✔️ | 主表数据完整性(如用户行为分析)| | **RIGHT JOIN** | ❌ | ✔️ | ✔️ | 从属表数据优先展示 | | **FULL JOIN** | ✔️ | ✔️ | ✔️ | 数据完整性校验(如合并新旧系统)| --- ### 三、使用注意事项 1. **关联条件必须精确** ```sql -- 错误示例(可能导致笛卡尔积) SELECT * FROM 表A JOIN 表B; -- 缺少ON子句! ``` > 需明确指定`ON 表A.key = 表B.key`避免意外结果[^2][^3] 2. **性能优化技巧** - 在关联列上建立索引 - 避免`SELECT *`,明确列出所需字段 - 大表优先放在JOIN右侧(优化器处理策略) 3. **多表连接顺序** ```sql SELECT * FROM 主表 LEFT JOIN 子表1 ON 主表.id = 子表1.main_id INNER JOIN 子表2 ON 主表.id = 子表2.main_id; ``` > 执行顺序:先处理主表与子表1的左连接,再与子表2内连接[^4] --- ### 四、常见错误场景 ```sql -- 错误:将过滤条件放在WHERE而非ON SELECT * FROM Users LEFT JOIN Orders ON Users.id = Orders.user_id WHERE Orders.amount > 100; -- 会过滤掉左表未匹配行! ``` ✅ **修正方案**: ```sql SELECT * FROM Users LEFT JOIN Orders ON Users.id = Orders.user_id AND Orders.amount > 100; -- 条件移至ON子句 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值