此外,如何适应左外加入,右外加入和全外加入?
当前回答
内部加入
回收相匹配的行只,也就是说, A 交叉 B。
此分類上一篇
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
左向外加入
从第一张表中选择所有记录,以及与附件密钥相匹配的第二张表中的任何记录。
此分類上一篇
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
全外加入
从第二张表中选择所有记录,以及与附件密钥相匹配的第一张表中的任何记录。
此分類上一篇
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
参考
内部和外部加入 SQL 示例和加入区块 SQL: JOINS
其他回答
简单的说法:
左边“加入”
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;
格式上看起来如下:
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 加入. 它返回左表中的所有行,并从右表中匹配行(如有)。
右外加入:也称为右加入. 返回相匹配的行从桌面左(如果有),并所有行在桌面右。
此分類上一篇
加入的好处
更快的执行
最简单的定义
内部加入:从两个表中返回相匹配的记录。
Full Outer 加入:从两个表中返回相匹配和未相匹配的记录,从两个表中返回未相匹配的记录为零。
左外加入:只从左侧的桌子上返回匹配和不匹配的记录。
右外加入:只从右侧的桌子上返回相匹配和不相匹配的记录。
短短
相匹配 + 左不相匹配 + 右不相匹配 = 全外加入
相匹配 + 左不相匹配 = 左外加入
相匹配 + 相匹配不相匹配 = 相匹配不相匹配
相匹配 = 内部加入
内部加入
回收相匹配的行只,也就是说, A 交叉 B。
此分類上一篇
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
左向外加入
从第一张表中选择所有记录,以及与附件密钥相匹配的第二张表中的任何记录。
此分類上一篇
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
全外加入
从第二张表中选择所有记录,以及与附件密钥相匹配的第一张表中的任何记录。
此分類上一篇
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
参考
内部和外部加入 SQL 示例和加入区块 SQL: JOINS
我在其他答案中看不到很多关于性能和优化的细节。
有时,知道只有INNER JOIN是合并的,这意味着优化器有最多的选择与它一起玩,它可以重新订单加入顺序,使它更快地保持相同的结果,优化器可以使用最多加入模式。
一般来说,尝试使用 INNER JOIN 而不是不同类型的插件是很好的做法(当然,如果可以考虑到预期的结果设置)。
这里有几个好例子和解释这个奇怪的协会行为:
是否留在外部合并合并合并?合并命令在SQL中的内容?
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何选择每一行的列值不是独特的
- 如何改变字符集(和排序)在整个数据库?
- mySQL:: insert到表,数据从另一个表?
- 如何在Postgres中获得两个字段的MIN() ?