2011-08-06 52 views
4

昨天一位同事向我展示了以下postgres查詢。我們都驚訝的是它的工作:SELECT * vs SELECT *

SELECT* FROM mytable; 

因爲我最近編碼爲另一種語言解析器,我想更深入地瞭解爲什麼這個查詢「編譯」,並返回相同的結果SELECT * FROM mytable;

據推測,這是因爲在詞法分析識別爲有效查詢,Postgres的從輸入讀取SELECT作爲標記,然後搜索下一個標記,它發現爲*,等等 - 是或多或少什麼在這裏?

此外,postgres詞法分析器/解析器是否剛好足夠強大以理解此查詢,或者其他數據庫是否會理解類似的SELECT*查詢?

+1

作品也沒有在Oracle APEX。 – Jacob

+0

不知道APEX與它有什麼關係。 –

+0

您是否因數據庫接受「SELECT *」而不管間距如何而感到困惑,還是您對「SELEcT *」被接受而不管間距如何感到驚訝?後者是編程語言的一般標準;空白通常是可選的。我不知道數據庫廠商中有多少常見的「SELECT *」,但說的很清楚。 –

回答

5

通常詞法分析器會爲當前的標記添加字符,直到找到一個不能屬於當前標記的字符,然後退出並從之前無法繼續的地方重新開始。

那麼,什麼是怎麼回事是詞法分析器吃掉SELECT,看到下一個字符是一個*它,因爲它是收集一個字,不能用SELECT屬於。所以它停下來,分析SELECT這是一個關鍵字,並從它識別的*開始,等等。這與您在其他編程語言中從2*22 * 2獲得4的原因相同。

至於它是否適用於其他數據庫,這一切都取決於詞法分析器的細節和語法規則。

2

據我所知,SQL跳過解析空格,所以你可以做SELECT*FROM or SELECT * FROM它基本上是一樣的。

它也使用`'瞭解什麼是什麼。所以SELECT * FROM myTable WHERE id = my string將是一個無效的查詢,因爲在「和」的「字符串」不被理解。

+0

你確定嗎?例如,Cularis指出,這種語法至少不適用於Oracle的一種風格。 –

3

很顯然,標記器標記了白色空間和算術中使用的特殊字符。

這裏的SELECT語句的BNF:h2database.com:在MySQL

SELECT [ TOP term ] [ DISTINCT | ALL ] selectExpression [,...] 
FROM tableExpression [,...] [ WHERE expression ] 
[ GROUP BY expression [,...] ] [ HAVING expression ] 
[ { UNION [ ALL ] | MINUS | EXCEPT | INTERSECT } select ] [ ORDER BY order [,...] ] 
[ LIMIT expression [ OFFSET expression ] [ SAMPLE_SIZE rowCountInt ] ] 
[ FOR UPDATE ]