MySQL在表之间的连接期间是否自动使用coalesce函数?
问题描述:
在表连接期间,MySQL何时使用此函数?MySQL在表之间的连接期间是否自动使用coalesce函数?
替换两个公共列的单个结果列使用合并操作定义为 。即,对于两个t1.a和t2.a的 得到的单连接列一个被定义为= COALESCE(t1.a,t2.a) 其中:
COALESCE(x, y) = (CASE WHEN x IS NOT NULL THEN x ELSE y END)
https://dev.mysql.com/doc/refman/8.0/en/join.html
我知道该功能是干什么的,但我想知道在join
操作中何时使用它。这对我来说毫无意义!有人能给我看一个例子吗?
答
这是指在自然连接和使用连接期间冗余列消除。描述如何将列从显示中排除。
操作顺序在您参考的部分上方描述。
首先,聚结公共列的两个联接的表,在其中它们出现在第一个表
其次,列独特到第一表中的顺序,以便在它们发生在该表
第三,列所特有的第二表,以便在它们出现在该表
例
T1
| a | b | c |
| 1 | 1 | 1 |
T2
| a | b | d |
| 1 | 1 | 1 |
使用
SELECT * FROM t1 JOIN t2 USING (b);
将导致加入,t1.b
被聚结(由于USING
),后面是第一个表的唯一列,后面是第二个表中的列。
| b | a | c | a | d |
| 1 | 1 | 1 | 1 | 1 |
而自然连接
SELECT * FROM t1 NATURAL JOIN t2;
会导致的t1
列(或相当常见的列从两个表)进行合并,然后是第一个表的唯一列,其次是在第二个表格中。
| a | b | c | d |
| 1 | 1 | 1 | 1 |
但是函数COALESCE(x,y)只会在我们得到NULL参数的情况下有用。所以在你的例子中,如果你的第一个表中的列b得到一个NULL值会发生什么? COALESCE(NULL,y)?内部联接会从结果集中排除此行。但左连接会返回NULL并且不是'y'值。 – folder
正确,这就是为什么我注意到“NATURAL JOIN”和“JOIN USING”的上下文以及它如何删除冗余列('COALESCE')。 MySQL文档还指出:“如果连接操作是任何其他连接,则连接的结果列由连接的表的所有列的连接组成。”除了对内部连接的解释,COALESCE(a。 c1,b.c1)与a.c1或b.c1相同,因为两列的值都相同。对于外连接(如LEFT JOIN),两列中的一列可以为NULL' – fyrye
至于在我的示例中,如果'b'的其中一条记录是'NULL',则不会检索到任何结果。这是因为没有满足加入的标准。 – fyrye