2012-07-11 29 views
6

Tôi đã phạm sai lầm và đã nhập:SQL với LIMIT1 trả về tất cả các hồ sơ

SELECT * FROM table LIMIT1

thay vì

SELECT * FROM table LIMIT 1 (lưu ý khoảng cách giữa LIMIT1)

trong CLI của MySQL . Tôi dự kiến ​​sẽ nhận được một số loại lỗi phân tích cú pháp, nhưng tôi đã rất ngạc nhiên, bởi vì truy vấn trả về tất cả các bản ghi trong bảng. Suy nghĩ đầu tiên của tôi là "MySQL ngu ngốc, tôi đặt cược rằng điều này sẽ trả về lỗi trong PostgreSQL", nhưng PostgreSQL cũng trả về tất cả các bản ghi. Sau đó kiểm tra nó bằng SQLite - với cùng một kết quả.

Sau khi đào một số, tôi nhận ra rằng không quan trọng những gì tôi nhập sau bảng. Chừng nào không có WHERE/ORDER/GROUP khoản:

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

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

Tôi đoán rằng đây là một hành vi tiêu chuẩn, nhưng tôi không thể tìm thấy bất kỳ lời giải thích lý do tại sao là vậy. Bất kỳ ý tưởng?

+4

Bạn có thể đưa ra bất cứ bảng một bí danh trong một truy vấn. Điều này cho phép bạn tự tham gia (chỉ định cùng một bảng nhiều lần). –

+2

@ NikolaMarkovinović Spot on.OP đã đặt bí danh 'bảng' là' LIMIT1' Bạn nên đăng câu trả lời. –

+1

Đề xuất thẻ duy nhất thuộc về đây là 'sql' – Smandoli

Trả lời

12

truy vấn đầu tiên của bạn là tương đương với truy vấn này sử dụng một bí danh bảng:

SELECT * FROM yourtable AS LIMIT1 

Các AS từ khóa là không bắt buộc. Bí danh bảng cho phép bạn tham chiếu đến các cột của bảng đó bằng cách sử dụng bí danh LIMIT1.foo thay vì tên bảng ban đầu. Có thể hữu ích khi sử dụng bí danh nếu bạn muốn cung cấp cho các bảng một bí danh ngắn hơn hoặc mô tả hơn trong truy vấn. Nó là cần thiết để sử dụng bí danh nếu bạn tham gia một bảng cho chính nó.

Từ SQL lite documentation:

AS keyword optional

+0

Oooh! Đồ họa đẹp! Upvote! – Smandoli

+0

Chết tiệt, quên nó đi. Tôi luôn sử dụng cú pháp 'AS'. Tôi sẽ chấp nhận câu trả lời trong 10 phút, cảm ơn. – strkol

+0

Tôi ghét rất nhiều loại đồ họa oradoc này: D – Sebas

0
SELECT * FROM table LIMIT1; 

LIMIT1 này được thực hiện như là bí danh của SQL, gây LIMIT1 không phải là một chữ reserved của SQL. Một cái gì đó sau tên bảng và đó không phải là một từ khóa dành riêng luôn luôn được thực hiện như một bí danh bảng bởi SQL.

SELECT * FROM table LIMIT 1; 

Khi bạn sử dụng LIMIT ngay sau tên bảng, SQL đã tìm thấy từ khóa dành riêng và làm việc theo hành vi. NẾU bạn muốn sử dụng từ khóa dành riêng trong truy vấn Nó có thể được thực hiện bằng cách đặt các chữ được đặt trước trong dấu ngoặc kép. như ..

SELECT * FROM table `LIMIT`; 

HOẶC

SELECT * FROM table `LIMIT 1`; 

Bây giờ tất cả các từ được bảo hiểm theo '' dấu ngoặc kép sẽ đối xử như người sử dụng xác định. Thông thường chúng tôi đã nhầm lẫn với ngày ngày, dấu thời gian, giới hạn, v.v. từ khóa bằng cách sử dụng chúng làm tên cột.

+1

OP không nhận được bất kỳ lỗi nào ... OP đang chờ ERROR ... –

Các vấn đề liên quan