问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL 中的各种联接的详细用法用途

发布网友 发布时间:2022-04-08 10:36

我来回答

3个回答

热心网友 时间:2022-04-08 12:05

连接表
一个连接表是根据特定的连接规则从两个其它表(真实表或生成表)中派生的表。我们支持内连接、外连接、交叉连接。

连接类型

交叉连接
T1 CROSS JOIN T2对每个来自 T1 和 T2 的行进行组合,生成的表将包含这样的行:所有 T1 里面的字段后面跟着所有 T2 里面的字段。如果两表分别有 N 和 M 行,连接成的表将有 N*M 行。

FROM T1 CROSS JOIN T2 等效于 FROM T1, T2 。它还等效于 FROM T1 INNER JOIN T2 ON TRUE (见下文)。

条件连接
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( join column list )
T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2INNER 和 OUTER 对所有连接类型都是可选的。INNER 为缺省。LEFT, RIGHT, FULL 隐含外连接。

连接条件在 ON 或 USING 子句里声明,或者用关键字 NATURAL 隐含地声明。连接条件判断来自两个源表中的那些行是"匹配"的,这些我们将在下面详细解释。

ON 子句是最常见的连接条件的类型:它接收一个和 WHERE 子句相同的布尔表达式。如果两个分别来自 T1 和 T2 的行在 ON 表达式上运算的结果为真,那么它们就算是匹配的行。

USING 是个一个连接条件的缩写语法:它接收一个用逗号分隔的字段名列表,这些字段必须是连接表共有的并且其值必须相同。最后,JOIN USING 会将每一对相等的输入字段输出为一个字段,其后跟着所有其它字段。因此,USING (a, b, c) 等效于 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) 只不过是如果使用了 ON ,那么在结果里 a, b, c 字段都会有两个,而用 USING 的时候就只会有一个。

最后,NATURAL 是 USING 的缩写形式:它自动形成一个由两个表中同名的字段组成的 USING 列表(同名字段只出现一次)。

条件连接可能的类型是:

INNER JOIN
内连接。对于 T1 中的每一行 R1 ,如果能在 T2 中找到一个或多个满足连接条件的行,那么这些满足条件的每一行都在连接表中生成一行。

LEFT OUTER JOIN
左外连接。首先执行一次内连接。然后为每一个 T1 中无法在 T2 中找到匹配的行生成一行,该行中对应 T2 的列用 NULL 补齐。因此,生成的连接表里无条件地包含来自 T1 里的每一行至少一个副本。

RIGHT OUTER JOIN
右外连接。首先执行一次内连接。然后为每一个 T2 中无法在 T1 中找到匹配的行生成一行,该行中对应 T1 的列用 NULL 补齐。因此,生成的连接表里无条件地包含来自 T2 里的每一行至少一个副本。

FULL OUTER JOIN
全连接。首先执行一次内连接。然后为每一个 T1 与 T2 中找不到匹配的行生成一行,该行中无法匹配的列用 NULL 补齐。因此,生成的连接表里无条件地包含 T1 和 T2 里的每一行至少一个副本。

如果 T1 和 T2 之一或全部是可以连接的表,那么所有类型的连接都可以串连或嵌套在一起。你可以在 JOIN 子句周围使用圆括弧来控制连接顺序,如果没有圆括弧,那么 JOIN 子句从左向右嵌套。

为了解释这些问题,假设我们有一个表 t1

num | name
-----+------
1 | a
2 | b
3 | c和 t2

num | value
-----+-------
1 | xxx
3 | yyy
5 | zzz然后我们用不同的连接方式可以获得各种结果:

=> SELECT * FROM t1 CROSS JOIN t2;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | xxx
1 | a | 3 | yyy
1 | a | 5 | zzz
2 | b | 1 | xxx
2 | b | 3 | yyy
2 | b | 5 | zzz
3 | c | 1 | xxx
3 | c | 3 | yyy
3 | c | 5 | zzz
(9 rows)

=> SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | xxx
3 | c | 3 | yyy
(2 rows)

=> SELECT * FROM t1 INNER JOIN t2 USING (num);
num | name | value
-----+------+-------
1 | a | xxx
3 | c | yyy
(2 rows)

=> SELECT * FROM t1 NATURAL INNER JOIN t2;
num | name | value
-----+------+-------
1 | a | xxx
3 | c | yyy
(2 rows)

=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | xxx
2 | b | |
3 | c | 3 | yyy
(3 rows)

=> SELECT * FROM t1 LEFT JOIN t2 USING (num);
num | name | value
-----+------+-------
1 | a | xxx
2 | b |
3 | c | yyy
(3 rows)

=> SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | xxx
3 | c | 3 | yyy
| | 5 | zzz
(3 rows)

=> SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;
num | name | num | value
-----+------+-----+-------
1 | a | 1 | xxx
2 | b | |
3 | c | 3 | yyy
| | 5 | zzz
(4 rows)用 ON 声明的连接条件也可以包含与连接不直接相关的条件。这种功能可能对某些查询很有用,但是需要我们仔细想清楚。比如:

=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';
num | name | num | value
-----+------+-----+-------
1 | a | 1 | xxx
2 | b | |
3 | c | |
(3 rows)

热心网友 时间:2022-04-08 13:23

这张图片展示了各种联接的用途了,各种连接产生的交集或并集是不同的

热心网友 时间:2022-04-08 14:58

select * from tableA inner join tableB on TableA.A=TableB.b group by id
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怀孕错过了糖筛怎么办 糖筛有哪些注意事项 怀孕几个月查唐筛 蔡家沟镇慈云寺 哈佳高铁高楞站多少平方米位置在那 超威电池生产日期怎么看 超威电池寿命一般多长时间 华晨宇鸟巢四面台10w+秒罄!!火星演唱会舞台概念图震撼发布! 手机连接160wifi电脑蓝屏使用160WiFi遇到问题应该如何解决 为什么手机wifi总是刚开启,锁屏就掉了。wifi设置里的休眠模式也是永久的... 建行卡为什么不能网上转账 学校发我们的建设银行卡一定要激活吗? 我打电话查余额说输入取钱密码... 为什么电脑玩生死狙击鼠标移动的速度很慢 为什么啊,Window7在桌面下载的生死狙击鼠标会不受控制乱晃? 生死狙击鼠标移动不灵敏,求解决!! IE浏览器4399网页游戏生死狙击在游戏中无法移动射击准星 4399生死狙击游戏进去后鼠标根本不可以移动,而以前是可以的,为什么? 生死狙击有时卡屏和鼠标动不了 为什么玩生死狙击时鼠标不动角色老是往天上看? 为什么电脑版的4399小游戏里的生死狙击鼠标不好使? word2003指定其中两页有页码怎么设置 生死狙击鼠标不灵 电脑生死狙击鼠标右击为什么没反应 我的电脑玩生死狙击鼠标难移动,不过玩CF很正常。 生死狙击游戏中,鼠标不好移动,为什么 期货是一个零和游戏吗? 期货中9M是什么 期货交易中的D、M是什么意思? 中国银行信用卡分期付款可以提前结清吗? 如何通过中国银行个人网上银行提前还清已消费分期的款项? 期货公式M5下穿M15如何写 期货合同中的M+1、M+2是什么意思? 生死狙击鼠标左右动不了怎么办? 玩生死狙击鼠标弹出来一闪_闪,转不来身 生死狙击为什么鼠标只能攻击不能左右移动 为什么我玩生死狙击的时候不能点鼠标右键了 生死狙击进入游戏后鼠标方向控制不了,一动鼠标就跑到天上或地下,还转圈 手机版罪恶都市怎样输入秘籍? 手机版罪恶都市怎么输秘籍 ps样机导入XD怎么剪切蒙版? Adobe XD中如何做出投影效果 XD做的图变成灰色 adobexd如何做滚动页面 新买的冰箱结冰了正常吗 海尔分式冰箱冷冻室结冰正常吗?我新买的冰箱冷冻室结冰正常吗? 如何看懂邮政信用卡账单 无线网路由器天线怎么设置 怎么样用无线路由器当wifi天线 怎么样摆天线wifi信号拓展器信号最好 怎么设置荣耀6plus WiFi的天线位置?更换中框后WiFi信号差是什么原因? 有线(无天线)路由器怎么设置wifi 我家的有线路由器上面自带天线,怎么设置才能发射WIFI?