此外,如何适应左外加入,右外加入和全外加入?
当前回答
“外部”和“内部”只是可选的元素,你只是处理两个(三个)类型的加入。内部加入(或什么是默认使用只有“加入”)是一个加入,只有符合标准的元素在两个表上存在。
“外部”插件是相同的内部插件加上不匹配的左或右表的元素,并在其他表的所有列上添加零。
全合是内合,右合和左合。
总之,如果我们有这样的表A
idA | ColumnTableA | idB |
---|---|---|
1 | Jonh | 1 |
2 | Sarah | 1 |
3 | Clark | 2 |
4 | Barbie | NULL |
图B如下:
idB | ColumnTableB |
---|---|
1 | Connor |
2 | Kent |
3 | Spock |
内部加入:
from tableA join tableB on tableA.idB = tableB.idB
idA | ColumnTableA | idB | ColumnTableB |
---|---|---|---|
1 | Jonh | 1 | Connor |
2 | Sarah | 1 | Connor |
3 | Clark | 2 | Kent |
左边加入:
from tableA left join tableB on tableA.idB = tableB.idB
idA | ColumnTableA | idB | ColumnTableB |
---|---|---|---|
1 | Jonh | 1 | Connor |
2 | Sarah | 1 | Connor |
3 | Clark | 2 | Kent |
4 | Barbie | NULL | NULL |
向外加入:
from tableA right join tableB on tableA.idB = tableB.idB
idA | ColumnTableA | idB | ColumnTableB |
---|---|---|---|
1 | Jonh | 1 | Connor |
2 | Sarah | 1 | Connor |
3 | Clark | 2 | Kent |
NULL | NULL | 3 | Spock |
全外加入:
from tableA full join tableB on tableA.idB = tableB.idB
idA | ColumnTableA | idB | ColumnTableB |
---|---|---|---|
1 | Jonh | 1 | Connor |
2 | Sarah | 1 | Connor |
3 | Clark | 2 | Kent |
4 | Barbie | NULL | NULL |
NULL | NULL | 3 | Spock |
其他回答
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 加入. 它返回左表中的所有行,并从右表中匹配行(如有)。
右外加入:也称为右加入. 返回相匹配的行从桌面左(如果有),并所有行在桌面右。
此分類上一篇
加入的好处
更快的执行
内部加入。
一个加入是结合两个表的行列,一个内部加入试图根据您在查询中指定的标准匹配两个表,并只返回相匹配的行列,如果加入中的第一个表中的行列匹配第二个表中的两个行列,那么两个行列将返回结果。
外面加入
左派加入试图从第一张桌子到第二张桌子中的列相匹配,如果它无法找到一场比赛,它将从第一张桌子返回列,并将第二张桌子中的列空白(零)。
下面看两张桌子:
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。
简单的说法:
左边“加入”
1.Take All records from left Table
2.for(each record in right table,) {
if(Records from left & right table matching on primary & foreign key){
use their values as it is as result of join at the right side for 2nd table.
} else {
put value NULL values in that particular record as result of join at the right side for 2nd table.
}
}
右加入 : 正反对左加入. 在右加入中的左加入中输入表名称,您将获得与左加入相同的输出。
外部加入: 显示两张表中的所有记录 不管是什么. 如果左表中的记录不符合基于首要, 前进密钥的右表,则使用加入结果的 NULL 值。
例子:
1. 工人, 2.phone_numbers_工人
employees : id , name
phone_numbers_employees : id , phone_num , emp_id
在这里,员工表是主表,电话_数字_员工是儿童表(它包含 emp_id 作为外国密钥,连接员工.id 因此其儿童表)。
内部加入
问答会是:
SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
在这里只采取相匹配的行在主键 = 外国键如上所述。在这里不相匹配的行在主键 = 外国键因加入而被排除。
左联盟保留左桌的所有行,无论是否有一个行在右桌上相匹配。
SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
外面加入:
SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;
格式上看起来如下:
这里有很多很好的答案,非常准确的相对 algebra 例子. 这里是一个非常简单的答案,这可能有助于爱好者或初学者编码器与 SQL 编码 dilemmas。
基本上,更常见的是,JOIN询问会分为两个案例:
对于一个数据组的选项:
使用 INNER JOIN 当您正在寻找的相关 B 数据必须根据数据库设计存在;使用 LEFT JOIN 当您正在寻找的相关 B 数据 MIGHT 或 MIGHT NOT 根据数据库设计存在。
推荐文章
- 将一列的多个结果行连接为一列,按另一列分组
- 检查MySQL表是否存在而不使用“select from”语法?
- 在PostgreSQL中快速发现表的行数
- 更改varchar列的大小为较低的长度
- 从表中选择1是什么意思?
- SQL Server中User和Login的区别
- 如何更改表的默认排序规则?
- 为两列的组合添加唯一的约束
- 设置NOW()为datetime数据类型的默认值?
- 在MySQL中Datetime等于或大于今天
- 删除MySQL中的主键
- 对象'DF__*'依赖于列'*' -将int改为double
- 如何根据出生日期和getDate()计算年龄(以年为单位)
- 最有效的T-SQL方法垫一个varchar的左边到一定的长度?
- 字符串作为SQL数据库的主键