此外,如何适应左外加入,右外加入和全外加入?
当前回答
在内部加入中,我们可以在不同表中获取相同/相关数据的数据。
我们有三种类型的外部加入:
左加入,右加入,全加入
我们还将从左(第一)表中获取不相关的数据。
SELECT Sname, Tname FROM student s LEFT JOIN 教师 t ON s.id = t.id;
右外加入,我们还从正确的表中获取与此无关的数据(第二表)
SELECT Sname, Tname FROM student s RIGHT JOIN 教师 t ON s.id = t.id;
我们可以使用 FULL OUTER JOIN 当我们想要从两个表中获取所有 / 完整的数据时,丢失的数据将以 NULL 填写。
SELECT Sname, Tname FROM student s FULL JOIN 教师 t ON s.id = t.id;
其他回答
我在其他答案中看不到很多关于性能和优化的细节。
有时,知道只有INNER JOIN是合并的,这意味着优化器有最多的选择与它一起玩,它可以重新订单加入顺序,使它更快地保持相同的结果,优化器可以使用最多加入模式。
一般来说,尝试使用 INNER JOIN 而不是不同类型的插件是很好的做法(当然,如果可以考虑到预期的结果设置)。
这里有几个好例子和解释这个奇怪的协会行为:
是否留在外部合并合并合并?合并命令在SQL中的内容?
这里有很多很好的答案,非常准确的相对 algebra 例子. 这里是一个非常简单的答案,这可能有助于爱好者或初学者编码器与 SQL 编码 dilemmas。
基本上,更常见的是,JOIN询问会分为两个案例:
对于一个数据组的选项:
使用 INNER JOIN 当您正在寻找的相关 B 数据必须根据数据库设计存在;使用 LEFT JOIN 当您正在寻找的相关 B 数据 MIGHT 或 MIGHT NOT 根据数据库设计存在。
简单的说法:
一个内部合并只接收相匹配的行列。
虽然一个外部加入从一个表中获取相匹配的行,而在另一个表中的所有行......结果取决于你使用哪个行:
左: 右桌上的匹配行和左桌上的所有行 右: 左桌上的匹配行和右桌上的所有行 或 完整: 所有桌上的所有行。
INNER JOIN 要求在比较两个表中至少有一场比赛. 例如,表 A 和表 B 意味着 A 8 B (A 交叉点 B)。
LEFT OUTER JOIN 和 LEFT JOIN 是相同的. 它提供所有相匹配的记录在两张桌子和所有选项的左桌子。
同样,RIGHT OUTER JOIN和RIGHT JOIN是相同的,它提供了所有记录相匹配的两张表和所有可能的正确的表。
FULL JOIN 是 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 无重复的组合。
假设你加入没有复制的列,这是一个非常常见的案例:
A 和 B 的内部结合会产生 A 交叉B 的结果,即 Venn 图表交叉的内部部分; A 和 B 的外部结合会产生 A 联盟 B 的结果,即 Venn 图表联盟的外部部分。
例子
假设你有两个表,每个单列,并数据如下:
A B
- -
1 3
2 4
3 5
4 6
内部加入
使用相同的查询中的任何一个内部连接提供两张表的交叉,即它们共通的两行。
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
左边加入
左向外加入将提供A中的所有行,加上B中的任何常见行。
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
向外加入
一个正确的外部加入将给所有行在B,加上任何常见行在A。
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
全外加入
一个完整的外部加入会给你A和B的联盟,即A中的所有行和B中的所有行,如果A中的任何东西没有相应的日期在B,那么B部分是零,反之亦然。
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
推荐文章
- 如何在不知道其名称的情况下删除SQL默认约束?
- SQL语法区分大小写吗?
- MySQL工作台:如何保持连接活动
- 左连接与Where子句
- 如何使用实体框架只更新一个字段?
- 在表变量上创建索引
- 为什么历史上人们使用255而不是256作为数据库字段大小?
- 如何选择记录从过去24小时使用SQL?
- 如何为查询返回的每一行执行存储过程一次?
- 按IN值列表排序
- 如何使用SQL Server 2008做多个CASE WHEN条件?
- 计数在VARCHAR字段中字符串的出现次数?
- 如何选择多行填充常量?
- 修改一个MySQL列为AUTO_INCREMENT
- 如果没有使用EXISTS引入子查询,则只能在选择列表中指定一个表达式