此外,如何适应左外加入,右外加入和全外加入?
当前回答
内部加入 - 使用相同的查询中的任何一个内部加入将交叉两个表,即它们有两个行,左外加入 - 左外加入将提供所有行在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 无重复的组合。
一次示威
设置
跳进 psql 并创建一个小数据库的猫和人类. 你可以只是复制这个整个部分。
CREATE DATABASE catdb;
\c catdb;
\pset null '[NULL]' -- how to display null values
CREATE TABLE humans (
name text primary key
);
CREATE TABLE cats (
human_name text references humans(name),
name text
);
INSERT INTO humans (name)
VALUES ('Abe'), ('Ann'), ('Ben'), ('Jen');
INSERT INTO cats (human_name, name)
VALUES
('Abe', 'Axel'),
(NULL, 'Bitty'),
('Jen', 'Jellybean'),
('Jen', 'Juniper');
求求
SELECT
humans.name AS human_name,
cats.name AS cat_name
FROM humans
[SOMETHING JOIN] cats ON humans.name = cats.human_name
ORDER BY humans.name;
任何人,没有猫或猫,没有人,都被排除在外。
human_name | cat_name
------------+-----------
Abe | Axel
Jen | Jellybean
Jen | Juniper
A FULL OUTER JOIN returns all humans and all cats, with zero if there is no match on both sides. 全外加入将返回所有人类和所有猫,如果双方都没有比赛,则零。
human_name | cat_name
------------+-----------
Abe | Axel
Ann | [NULL]
Ben | [NULL]
Jen | Jellybean
Jen | Juniper
[NULL] | Bitty
human_name | cat_name
------------+-----------
Abe | Axel
Ann | [NULL]
Ben | [NULL]
Jen | Jellybean
Jen | Juniper
每只猫,没有人,都会在人名列中获得零;每只猫,没有人,都会被排除。
human_name | cat_name
------------+-----------
Abe | Axel
Jen | Jellybean
Jen | Juniper
[NULL] | Bitty
你可以看到,虽然一个内部加入只获得匹配夫妇,每个类型的外部加入包括一些没有比赛的项目。
加入本身意味着内部左加入,右加入和外加入,所有意味着外加入。
最简单的定义
内部加入:从两个表中返回相匹配的记录。
Full Outer 加入:从两个表中返回相匹配和未相匹配的记录,从两个表中返回未相匹配的记录为零。
左外加入:只从左侧的桌子上返回匹配和不匹配的记录。
右外加入:只从右侧的桌子上返回相匹配和不相匹配的记录。
短短
相匹配 + 左不相匹配 + 右不相匹配 = 全外加入
相匹配 + 左不相匹配 = 左外加入
相匹配 + 相匹配不相匹配 = 相匹配不相匹配
相匹配 = 内部加入
这里有很多很好的答案,非常准确的相对 algebra 例子. 这里是一个非常简单的答案,这可能有助于爱好者或初学者编码器与 SQL 编码 dilemmas。
基本上,更常见的是,JOIN询问会分为两个案例:
对于一个数据组的选项:
使用 INNER JOIN 当您正在寻找的相关 B 数据必须根据数据库设计存在;使用 LEFT JOIN 当您正在寻找的相关 B 数据 MIGHT 或 MIGHT NOT 根据数据库设计存在。
INNER JOIN,LEVT/RIGHT OUTER JOIN的准确算法如下:
從第一個表中取出每個行: a 考慮從第二個表中取出所有行: (a,b[i]) 評估對每個對方的 ON... 條件: ON(a,b[i] = 真實/錯誤? 當條件評估為真實時,返回相結合的行(a,b[i])。
... ON T1.title = T2.title AND T1.version < T2.version ( => see this post as a sample use: Select only rows with max value on a column)... ON T1.y IS NULL... ON 1 = 0 (just as sample)
此分類上一篇
此分類上一篇
注意:左加入 = 左外加入,右加入 = 右外加入。
推荐文章
- 选项(RECOMPILE)总是更快;为什么?
- 设置数据库从单用户模式到多用户
- oracle中的RANK()和DENSE_RANK()函数有什么区别?
- 的类型不能用作索引中的键列
- SQL逻辑运算符优先级:And和Or
- 如何检查一个表是否存在于给定的模式中
- 添加一个复合主键
- 如何在SQL Server Management Studio中查看查询历史
- 可以为公共表表达式创建嵌套WITH子句吗?
- 什么时候我需要在Oracle SQL中使用分号vs斜杠?
- SQL Server的NOW()?
- 在SQL中,count(列)和count(*)之间的区别是什么?
- 在SQL Server中截断(不是四舍五入)小数位
- 仅在Datetime列上按日期分组
- PostgreSQL通配符LIKE用于单词列表中的任何一个