2017-08-14 42 views
1

在表連接期間,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操作中何時使用它。這對我來說毫無意義!有人能給我看一個例子嗎?

回答

1

這是指在自然連接和使用連接期間冗餘列消除。描述如何將列從顯示中排除。

操作順序在您參考的部分上方描述。

  • 首先,聚結公共列的兩個聯接的表,在其中它們出現在第一個表

  • 其次,列獨特到第一表中的順序,以便在它們發生在該表

  • 第三,列所特有的第二表,以便在它們出現在該表

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