SQL连接两张或多张表

本文深入解析SQL中的连接类型,包括内连接、外连接和交叉连接的使用方法及区别。详细阐述了left join、right join、full outer join和cross join的执行过程,以及on和where条件在连接中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用left jion时,on和where条件的区别如下:

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。


book表 :

stu表 :

1.内连接

1.1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。

1.2.不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<、!>、!<>。

1.3.自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。 内连接:内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。

select * from book as a,stu as b where a.sutid = b.stuid

select * from book as a inner join stu as b on a.sutid = b.stuid

其连接结果如上图,是按照a.stuid = b.stuid进行连接。

2.外连接

2.1.左联接:是以左表为基准,将a.stuid = b.stuid的数据进行连接,然后将左表没有的对应项显示,右表的列为NULL

select * from book as a left join stu as b on a.sutid = b.stuid

2.2.右连接:是以右表为基准,将a.stuid = b.stuid的数据进行连接,然以将右表没有的对应项显示,左表的列为NULL

select * from book as a right join stu as b on a.sutid = b.stuid

2.3.全连接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

select * from book as a full outer join stu as b on a.sutid = b.stuid

3.交叉连接

交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

select * from book as a cross join stu as b order by a.id


实在不行,直接(下面两句开玩笑的哈~)

DROP DATABASE test; 或者rm -rf * (删除当前目录下的所有文件,所删除的文件,一般都不能恢复!)

删库跑路,溜了遛了……

 

### SQL连接多张的执行顺序 在 SQL 中,外连接(如 LEFT JOIN、RIGHT JOIN FULL OUTER JOIN)涉及多张时,其执行顺序遵循一定的逻辑规则。以下是详细的执行流程: 1. **FROM 子句**:SQL 查询的第一步是确定数据来源的。这一步通过 `FROM` 子句指定目标[^1]。如果查询只涉及单张,则直接加载该的数据;如果是多张,则进入下一步。 2. **ON 条件**:当需要连接多张时,首先会根据 `ON` 条件对进行匹配。这是为了减少不必要的笛卡尔积运算,从而提高性能[^2]。在此阶段,SQL 引擎会基于指定的字段关系(如主键-外键关系)筛选出符合条件的记录。 3. **JOIN 类型**:根据所使用的连接类型(LEFT JOIN、RIGHT JOIN FULL OUTER JOIN),SQL 引擎会保留左、右的所有记录。即使没有匹配到对应的记录,也会保留未匹配的一侧,并用 `NULL` 填充缺失值[^2]。 4. **WHERE 过滤条件**:在完成连接后,SQL 引擎会应用 `WHERE` 子句中的过滤条件,进一步缩小结果集。需要注意的是,`WHERE` 条件会对整个结果集生效,而不会影响连接逻辑本身[^1]。 5. **GROUP BY 分组**:如果查询中包含聚合操作(如 `SUM()`、`COUNT()` 等),则会在 `GROUP BY` 子句的作用下对数据进行分组[^3]。此时,每组数据会被视为一个整体,用于后续的聚合计算。 6. **聚合函数计算**:在分组完成后,SQL 引擎会计算聚合函数的结果(如 `AVG()`、`MAX()` 等)。这些函数通常依赖于分组后的数据结构[^3]。 7. **HAVING 过滤条件**:与 `WHERE` 类似,`HAVING` 用于对分组后的结果进行过滤。不同之处在于,`HAVING` 可以引用聚合函数的结果,而 `WHERE` 则不能[^1]。 8. **SELECT 字段选择**:最后,SQL 引擎会根据 `SELECT` 子句中指定的字段返回最终结果。此阶段可能会涉及字段别名定义、去重(如 `DISTINCT`)等操作[^3]。 9. **ORDER BY 排序**:如果需要对结果进行排序,则通过 `ORDER BY` 子句实现。排序操作通常发生在查询的最后阶段[^1]。 10. **LIMIT 结果限制**:对于某些数据库系统(如 MySQL),可以通过 `LIMIT` 子句限制返回的行数。这是查询执行的最后一个步骤[^1]。 ```sql SELECT t1.id, t1.name, t2.salary, AVG(t2.salary) AS avg_salary FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.employee_id WHERE t1.department = 'Sales' GROUP BY t1.id, t1.name, t2.salary HAVING COUNT(t2.salary) > 0 ORDER BY t1.name ASC LIMIT 10; ``` ### 示例说明 上述代码展示了如何使用外连接(`LEFT JOIN`)将两张连接起来,并按照特定条件筛选和排序结果。注意以下几点: - `ON` 条件指定了之间的关联关系。 - `WHERE` 和 `HAVING` 分别用于行级和分组后的过滤。 - `SELECT` 部分定义了输出字段,包括聚合函数 `AVG()` 的结果。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值