2012-07-11 125 views
6

我犯了一個錯誤,並進入:SQL與LIMIT1返回所有記錄

SELECT * FROM table LIMIT1

,而不是

SELECT * FROM table LIMIT 1(注意LIMIT1之間的空間)

在MySQL的CLI 。我期望收到某種解析錯誤,但我很驚訝,因爲查詢返回了表中的所有記錄。我的第一個想法是「愚蠢的MySQL,我敢打賭,這將在PostgreSQL中返回錯誤」,但是PostgreSQL也返回了所有記錄。然後用SQLite對其進行測試 - 結果相同。

經過一番挖掘,我意識到,無論我在桌子後面輸入什麼東西都沒有關係。只要沒有WHERE/ORDER/GROUP條款:

SELECT * FROM table SOMETHING -- works and returns all records in table 

SELECT * FROM table WHERE true SOMETHING -- doesn't work - returns parse error 

我想,這是一個標準的行爲,但我找不到任何的解釋,爲什麼就是這樣。有任何想法嗎?

+4

你可以給任何表在查詢中的別名。這使您可以進行自聯接(多次指定同一個表)。 – 2012-07-11 12:53:02

+2

@NikolaMarkovinovićSpot on。OP將'table'設置爲'LIMIT1',您應該將其作爲答案發布。 – 2012-07-11 12:53:48

+1

建議這裏屬於的唯一標籤是'sql' – Smandoli 2012-07-11 13:05:27

回答

12

你的第一個查詢等效於使用表的別名這個查詢:

SELECT * FROM yourtable AS LIMIT1 

AS關鍵字是可選的。表別名允許您使用別名LIMIT1.foo而不是原始表名稱引用該表的列。如果您希望在查詢中爲表提供更短或更具描述性的別名,則使用別名會很有用。如果您將表加入自己,則必須使用別名。

SQL lite documentation

AS keyword optional

+0

Oooh!漂亮的圖形!給予好評! – Smandoli 2012-07-11 12:56:52

+0

該死的,忘了它。我總是使用'​​AS'語法。我會在10分鐘內接受答案,謝謝。 – strkol 2012-07-11 12:57:00

+0

我非常討厭這些oradoc種類的圖形:D – Sebas 2012-07-11 12:59:06

0
SELECT * FROM table LIMIT1; 

LIMIT1這已經通過SQL作爲別名,導致LIMIT1不是保留字面SQL的。 表名之後的東西,並不是一個保留關鍵字,通常被SQL視爲表別名。

SELECT * FROM table LIMIT 1; 

當你只是表名後使用LIMIT,SQL發現,作爲一個保留關鍵字,併爲它工作按行爲。如果要在查詢中使用保留關鍵字可以通過將保留文字置於引號中來完成。如..

SELECT * FROM table `LIMIT`; 

OR

SELECT * FROM table `LIMIT 1`; 

現在下`覆蓋了所有的話`引號將作爲用戶定義的處理。 通常我們做錯了日期,時間戳,限制等。關鍵字通過使用它們作爲列名。

+1

OP沒有得到任何錯誤... OP期待錯誤... – 2012-07-11 13:03:01