2012-07-11 13 views
6

ich einen Fehler gemacht und trat:SQL mit LIMIT1 gibt alle Datensätze

SELECT * FROM table LIMIT1

statt

SELECT * FROM table LIMIT 1 (man beachte den Raum zwischen LIMIT und 1)

in der CLI von MySQL . Ich erwartete eine Art Parse-Fehler, aber ich war überrascht, weil die Abfrage alle Datensätze in der Tabelle zurückgab. Mein erster Gedanke war "dumm MySQL, ich wette, dass dies Fehler in PostgreSQL zurückgeben wird", aber PostgreSQL gab auch alle Datensätze zurück. Dann getestet mit SQLite - mit dem gleichen Ergebnis.

Nach etwas graben, erkannte ich, dass es egal ist, was ich nach der Tabelle eingeben. Solange es keine WHERE/ORDER/GROUP Klauseln:

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

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

Ich denke, dass dies ein standardisiertes Verhalten ist, aber ich konnte keine Erklärung finden, warum das ist. Irgendwelche Ideen?

+4

Sie eine beliebige Tabelle in einer Abfrage einen Aliasnamen geben. Auf diese Weise können Sie Self-Joins durchführen (dieselbe Tabelle mehrmals angeben). –

+2

@ NikolaMarkovinović Spot auf.Das OP hat "Tabelle" als "LIMIT1" bezeichnet. Sie sollten als Antwort posten. –

+1

Schlagen Sie das einzige Tag, das hierher gehört, ist 'sql' – Smandoli

Antwort

12

Ihre erste Abfrage ist auf diese Abfrage äquivalent eine Tabelle Alias:

SELECT * FROM yourtable AS LIMIT1 

Das AS Schlüsselwort ist optional. Mit dem Tabellenalias können Sie auf Spalten dieser Tabelle verweisen, indem Sie den Alias ​​LIMIT1.foo anstelle des ursprünglichen Tabellennamens verwenden. Es kann nützlich sein, Aliase zu verwenden, wenn Sie Tabellen innerhalb einer Abfrage einen kürzeren oder einen aussagekräftigeren Alias ​​geben möchten. Wenn Sie eine Tabelle mit sich selbst verbinden, müssen Sie Aliase verwenden.

Vom SQL lite documentation:

AS keyword optional

+0

Oooh! Schöne Grafik! Upvote! – Smandoli

+0

Verdammt, habe es vergessen. Ich benutze immer die AS-Syntax. Ich werde die Antwort in 10 Minuten akzeptieren, danke. – strkol

+0

Ich hasse so viel diese oradoc Arten von Grafiken: D – Sebas

0
SELECT * FROM table LIMIT1; 

LIMIT1 Dies als Alias ​​von SQL übernommen hat, verursachen LIMIT1 ist kein reserviert wörtliche von SQL. Etwas nach Tabellenname und das ist kein reserviertes Schlüsselwort, das immer als Tabellenalias von SQL verwendet wird.

SELECT * FROM table LIMIT 1; 

Wenn Sie LIMIT nur nach dem Tabellennamen verwendet, fand SQL, dass als ein reserviertes Schlüsselwort und arbeitete für sie gemäß dem Verhalten. WENN Sie reservierte Schlüsselwörter in der Abfrage verwenden möchten, können reservierte Literale in Anführungszeichen gesetzt werden. wie ..

SELECT * FROM table `LIMIT`; 

ODER

SELECT * FROM table `LIMIT 1`; 

Jetzt bedeckt alle Wörter unter `` Anführungszeichen wird so behandelt, als Benutzer definiert. Häufig haben wir einen Fehler gemacht mit Datum, Zeitstempel, Limit usw. Schlüsselwörter, indem Sie sie als Spaltennamen verwenden. Diese

+1

OP hat keinen Fehler bekommen ... OP hat ERROR erwartet ... –

Verwandte Themen