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 | 
+0

但是函数COALESCE(x,y)只会在我们得到NULL参数的情况下有用。所以在你的例子中,如果你的第一个表中的列b得到一个NULL值会发生什么? COALESCE(NULL,y)?内部联接会从结果集中排除此行。但左连接会返回NULL并且不是'y'值。 – folder

+0

正确,这就是为什么我注意到“NATURAL JOIN”和“JOIN USING”的上下文以及它如何删除冗余列('COALESCE')。 MySQL文档还指出:“如果连接操作是任何其他连接,则连接的结果列由连接的表的所有列的连接组成。”除了对内部连接的解释,COALESCE(a。 c1,b.c1)与a.c1或b.c1相同,因为两列的值都相同。对于外连接(如LEFT JOIN),两列中的一列可以为NULL' – fyrye

+0

至于在我的示例中,如果'b'的其中一条记录是'NULL',则不会检索到任何结果。这是因为没有满足加入的标准。 – fyrye