此外,如何适应左外加入,右外加入和全外加入?
当前回答
在简单的条件下,
1.INNER JOIN OR EQUI JOIN : 返回结果组,仅符合两张表中的状态。
2.OUTER JOIN : 从两个表中返回所有值的结果,即使有条件相匹配或不相匹配。
3.LEFT JOIN : 从左表中返回所有值的结果组合,并仅与右表中的条件相匹配的行。
4.RIGHT JOIN : 从右表返回所有值的结果组合,并且仅符合左表的条件的行列。
5、全加入:全加入和全外加入是相同的。
其他回答
下面看两张桌子:
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。
批评了我非常喜欢的红色阴影的Venn图表,我认为发表我自己的尝试是公平的。
虽然 @Martin Smith 的答案在很长一段时间内是这个集合中最好的,但他的单一显示每个桌子的关键列,而我认为理想的非关键列也应该显示。
在允许的半小时内我能做的最好,我仍然不认为它足够地表明,由于TableB中缺乏关键值,零值存在,或者外加入实际上是一个联盟而不是一个联盟:
此分類上一篇
内部加入 - 使用相同的查询中的任何一个内部加入将交叉两个表,即它们有两个行,左外加入 - 左外加入将提供所有行在A,加上任何常见行在B。
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 无重复的组合。
1.内部加入:也称为加入. 它返回在左表中的两行,右表只有如果有比赛。
例子:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
INNER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
此分類上一篇
2.Full Outer 加入: 也称为Full 加入. 它返回所有的行在左表和右表。
例子:
SELECT
e1.emp_name,
e2.emp_salary
FROM emp1 e1
FULL OUTER JOIN emp2 e2
ON e1.emp_id = e2.emp_id
此分類上一篇
3.Left Outer 加入: 或者简单地称为Left 加入. 它返回左表中的所有行,并从右表中匹配行(如有)。
右外加入:也称为右加入. 返回相匹配的行从桌面左(如果有),并所有行在桌面右。
此分類上一篇
加入的好处
更快的执行
推荐文章
- GROUP BY with MAX(DATE)
- 删除id与其他表不匹配的sql行
- 等价的限制和偏移SQL Server?
- 是什么导致这个ActiveRecord::ReadOnlyRecord错误?
- 为什么我不能在DELETE语句中使用别名?
- 在SQL Server Management Studio中保存带有标题的结果
- "where 1=1"语句
- 如何选择一个记录和更新它,与一个单一的查询集在Django?
- 多语句表值函数vs内联表值函数
- 如何从Oracle的表中获取列名?
- NOLOCK提示在SELECT语句中的作用
- SQL OVER()子句-它什么时候有用,为什么有用?
- 如果字段在MySQL中为空,则返回0
- 我如何使用ROW_NUMBER()?
- SQL或者TSQL是图灵完备的吗?