2011-09-21 92 views
1

我正在讀一SQL「食譜」式的引用,我碰到一個聲明是數字,我以前從來沒有遇到過:困惑在SQL SELECT語句

INSERT INTO table (col1, col2) 
SELECT t.col1, 8 
FROM table AS t 
WHERE t.col2 = 5 
UNION ALL 
SELECT 8, 8 

現在什麼混淆我是一個數字(在這個例子中,8)緊跟在SELECT語句之後。在我有限的SQL體驗中,我只遇到了SELECT查詢,後面跟着列名。有人能幫我理解這是什麼嗎?謝謝!

回答

3

SELECT 8, 8究竟是幹什麼的它似乎做到了;它會返回一個結果集,其中包含兩個未命名的列,每個列都包含8 - 如果您自己運行該語句,您將看到完全相同的結果。

您可以自由選擇文字值&表達式,就像您是列,函數結果等一樣;

SELECT 'cake', 123 + 456 

UNION ALL合併(不重複),從第1表中的行與第2的結果,選擇選擇讓你插入一個額外的(8,8)行插入表中。

+0

謝謝!這就說得通了。我相信這是一個相當普遍的說法,但我還沒有遇到它。 – Andrew

2

您可以將一個文字值添加到select語句。

在這種情況下,它將只爲結果添加一列,所有行的值爲8。

您還可以使用不類似引用列的函數。例如

SELECT t.col1, NOW() AS t 

AS t定義了額外列的列別名。這在你的例子中並不重要,因爲它只是作爲insert的來源。

我不會打擾處理UNION ALL,因爲這不是混淆你的地步。

1

您可以選擇任何您想要的,從表字段開始,結束於可以由SQL引擎評估的自定義表達式(例如table.field * 2)。在這個查詢中,你將有8個作爲每個返回記錄的字段。

2

它選擇的文字8和8的語句將插入到表COL1和值8,從表所在表= 5的COL2還有一排用值8,8

2
INSERT INTO table1 (col1, col2) 

插入到一個名爲table1一排值colcol2表。
將所有其他列設置爲其默認值(如果沒有則爲空)。

SELECT t.col1, 8 
FROM table AS t 
WHERE t.col2 = 5 

插入此選擇語句的輸出。
請注意select 8將在輸出的每一行中替換一個文字8。

UNION ALL 
SELECT 8, 8 

在結果中放入一個額外的行,只有col1 = 8,col2 = 8。

鏈接
http://dev.mysql.com/doc/refman/5.0/en/insert-select.html
http://dev.mysql.com/doc/refman/5.0/en/select.html

從最後一個環節:

SELECT也可以用來檢索不引用任何表的計算行。
例如:

mysql> SELECT 1 + 1; 
     -> 2 
0

您可以在SELECT語句中直接把值。 t.col1實際上是一個變量,它在不同的返回寄存器中具有不同的值。 8是一個文字值。

1

這是關係操作,被稱爲'extend'(有趣的是,Codd最初被省略延伸出他的關係代數,可能是因爲他設想計算在'前端'完成)。

雖然通常用於計算,擴展涉及文字是允許的,而不是非常有用,從一個語言設計點沒有理由來禁止它。