6

間違えて入力しました:

SELECT * FROM table LIMIT1

それ以外の

SELECT * FROM table LIMIT 1LIMIT(との間のスペースに注意してください1

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

3 に答える 3

0
SELECT * FROM table LIMIT1;

LIMIT1これは SQL によってエイリアスとして取られています。原因LIMIT1は SQL の予約済みリテラルではありません。テーブル名の後の何かで、SQL によって常にテーブル エイリアスとして使用される予約済みキーワードではありません。

 SELECT * FROM table LIMIT 1;

LIMITテーブル名の直後に使用すると、SQL はそれを予約済みキーワードとして検出し、動作に従って機能しました。クエリで予約済みのキーワードを使用する場合は、予約済みのリテラルを引用符で囲むことで実行できます。お気に入り..

SELECT * FROM table `LIMIT`;

また

SELECT * FROM table `LIMIT 1`;

`` 引用符で囲まれたすべての単語は、ユーザー定義として扱われます。一般的に、日付、タイムスタンプ、制限などのキーワードを列名として使用して間違えました。

于 2012-07-11T13:01:49.507 に答える