此外,如何适应左外加入,右外加入和全外加入?
当前回答
假设你加入没有复制的列,这是一个非常常见的案例:
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
其他回答
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 无重复的组合。
批评了我非常喜欢的红色阴影的Venn图表,我认为发表我自己的尝试是公平的。
虽然 @Martin Smith 的答案在很长一段时间内是这个集合中最好的,但他的单一显示每个桌子的关键列,而我认为理想的非关键列也应该显示。
在允许的半小时内我能做的最好,我仍然不认为它足够地表明,由于TableB中缺乏关键值,零值存在,或者外加入实际上是一个联盟而不是一个联盟:
此分類上一篇
下面看两张桌子:
EMP
empid name dept_id salary
1 Rob 1 100
2 Mark 1 300
3 John 2 100
4 Mary 2 300
5 Bill 3 700
6 Jose 6 400
部門
deptid name
1 IT
2 Accounts
3 Security
4 HR
5 R&D
内部加入:
大多数写作只是在 sql 查询中加入,它只返回表之间的匹配记录。
查找所有员工及其部门名称:
Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
正如你上面看到的那样,Jose 不是从 EMP 在输出中打印,因为它是 dept_id 6 在部门桌上找不到比赛。
因此,加入或只是加入,只返回匹配行。
左边加入:
这将从左表中返回所有记录,仅从右表中匹配记录。
Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;
empid name dept_name
1 Rob IT
2 Mark IT
3 John Accounts
4 Mary Accounts
5 Bill Security
6 Jose
HR 和 R&D 行不从部门桌上打印,因为他们没有在 dept_id 上的 Emp 桌上找到比赛。
因此,LEFT JOIN从左桌返回所有行,仅从右桌匹配行。
您也可以在这里查看Demo。
他们不显示一个十字路口和一个内部联盟之间的区别,例如,或者更一般地显示不同类型的联盟预言之间的区别,或者提供一个框架,以便思考他们将如何运作。
此分類上一篇
選擇 A.Colour, B.Colour 從 A CROSS JOIN B
一些例子
上面是经典的equi加入。
内部合并条件不一定是平等条件,也不需要从两个(甚至任何)表中提到列。 评估 A.Colour NOT IN(“绿色”,“蓝色”)在交叉合并返回的每个行。
选择 A.Colour, B.Colour FROM A INNER JOIN B ON 1 = 1
此分類上一篇
此分類上一篇
此分類上一篇
选择 A.Colour, B.Colour FROM A FULL OUTER JOIN B ON 1 = 0
此分類上一篇
此分類上一篇
此分類上一篇
饰 SQL Fiddle
一个内部合并只显示行,如果在合并的另一边(右)有一个匹配记录。
一(左)外部连接显示在左侧的每个记录的行列,即使连接的另一(右)侧没有匹配行列,如果没有匹配行列,对另一(右)侧的列将显示零。
推荐文章
- 将一列的多个结果行连接为一列,按另一列分组
- 检查MySQL表是否存在而不使用“select from”语法?
- 在PostgreSQL中快速发现表的行数
- 更改varchar列的大小为较低的长度
- 从表中选择1是什么意思?
- SQL Server中User和Login的区别
- 如何更改表的默认排序规则?
- 为两列的组合添加唯一的约束
- 设置NOW()为datetime数据类型的默认值?
- 在MySQL中Datetime等于或大于今天
- 删除MySQL中的主键
- 对象'DF__*'依赖于列'*' -将int改为double
- 如何根据出生日期和getDate()计算年龄(以年为单位)
- 最有效的T-SQL方法垫一个varchar的左边到一定的长度?
- 字符串作为SQL数据库的主键