CHỌN * TỪ tablename Ở ĐÂU 1


129

Tôi đã tò mò. Sự khác biệt giữa các truy vấn tương ứng là gì:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1


9
Có một cờ "quá hẹp" cho các thẻ? bởi vì điều đó áp dụng cho nhiều phương ngữ, nếu không phải tất cả, phương ngữ SQL. Tôi cũng thấy nó thường xuyên trong MSSQL và Oracle. btw các dấu nháy đơn là gì? không phải là backtick `được sử dụng để trích dẫn tên đối tượng mysql?
Cee McSharpface

3
@dlatikay bạn có thể chỉnh sửa các thẻ ...
Braiam

2
hm Tại sao không đơn giản ... WHERE TRUE? Tôi biết rằng (trong hầu hết các SQL, bao gồm cả MySQL) TRUE chỉ là một macro ưa thích cho 1- nhưng vẫn không rõ ràng hơn đối với người đọc?

2
2 không hợp lệ trong hầu hết các phương ngữ SQL
edc65

Câu trả lời:


177

2 và 3 giống nhau trong MySQL, chức năng 1 cũng giống nhau.

where 1 là không chuẩn vì vậy, như những người khác đã chỉ ra, sẽ không hoạt động trong các phương ngữ khác.

Người thêm where 1hoặc where 1 = 1để wheređiều kiện có thể dễ dàng thêm hoặc xóa đi / đến một truy vấn bằng cách thêm vào / ý kiến ra một số " and..." thành phần.

I E

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'

11
Và cũng như khi bạn lập trình xây dựng một truy vấn thành một chuỗi để thực hiện nó sau này, nếu bạn thêm WHERE 1=1bạn sẽ không cần phải quan tâm nếu điều kiện bạn đang cố gắng thêm vào chuỗi là lần đầu tiên (vì vậy nó sẽ cần một chuỗi WHEREphía trước ) hay không.
Vincent Olivert Riera

45
Đã lập trình được 6 năm và chưa bao giờ nghĩ sẽ làm điều này - cảm ơn!
SimonGates

6
ORDER BY 1Cú pháp @dlatikay là bắt buộc (thay vì tên cột) nếu bạn đang thực hiện kết hợp hai hoặc nhiều câu lệnh CHỌN.
Mark Stewart

5
@SimonGates Tôi đã lập trình được 6 năm và chưa bao giờ nghĩ đến việc làm gì khác lol
WernerCD

4
@WernerCD Tôi nghĩ rằng sẽ hợp lý hơn nhiều khi xây dựng một danh sách các mệnh đề bộ lọc trong một danh sách một số loại, và sau đó xâu chuỗi chúng với nhau " AND "như là dấu phân cách.
Zev Spitz

76

Như bạn đã biết, cả ba đều cho kết quả như nhau. (Trong ngữ cảnh boolean, MySQL coi số nguyên "1" là đúng - thực tế, bất kỳ số nào không phải là "0" đều được coi là đúng).

Tôi ưu hoa MySQL được một cách rõ ràng tài liệu để loại bỏ điều kiện liên tục trong các WHEREđiều khoản:

  • Loại bỏ điều kiện liên tục. . .:

    (B> = ​​5 VÀ B = 5) HOẶC (B = 6 VÀ 5 = 5) HOẶC (B = 7 VÀ 5 = 6) -> B = 5 HOẶC B = 6

Do đó, cả ba sẽ được biên dịch thành cùng một mã.

Chúng đều có chức năng tương đương và nên có cùng đặc điểm hiệu suất.

Điều đó nói rằng, thứ nhất và thứ ba là SQL tiêu chuẩn. Thứ hai sẽ gây ra một số loại lỗi biểu thức boolean trong nhiều cơ sở dữ liệu. Vì vậy, tôi sẽ khuyên bạn tránh điều đó (Tôi không chắc liệu nó có hoạt động hay không trong chế độ SQL nghiêm ngặt của MySQL).

Thông thường thứ ba được sử dụng khi xây dựng WHEREmệnh đề động . Nó giúp dễ dàng thêm các điều kiện bổ sung AND <condition>mà không phải lo lắng về việc kéo dài ANDs.


6
Đây là một câu trả lời vượt trội khi nói tất cả mọi thứ mà câu trả lời khác làm nhưng chủ yếu chỉ ra sự khác biệt rằng # 2 không tuân thủ ANSI.
gạch dưới

16

Nếu bạn đang hỏi về sự khác biệt trong màn trình diễn và kết quả, thì không có gì, 2 và 3 giống nhau WHERE TRUE, và chúng sẽ cho kết quả giống như lần đầu tiên.

1 - SELECT * FROM table_name

Kết quả trong tất cả các dữ liệu từ table_name(không có bộ lọc)

2 - SELECT * FROM table_name WHERE 1

TRUEDo đó, 1 sẽ được đánh giá là - không có bộ lọc - mọi bản ghi sẽ được trả về.

3 - SELECT * FROM table_name where 1=1

Giống như cái cuối cùng, 1 = 1 là một TRUEbiểu thức, do đó - không có bộ lọc - mọi bản ghi sẽ được chọn.


14

Tất cả đều giống nhau nhưng 2 và 3 được sử dụng để dễ dàng xử lý các AND/ORđiều kiện như:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

8

Trong 1, MySQL không cần đánh giá bất kỳ điều kiện WHERE nào.

Trong 2 và 3, điều kiện nơi là tĩnh và không dựa trên các giá trị của hàng. Nó sẽ được đánh giá với logic boolean và luôn luôn đúng.

Về mặt chức năng, không có sự khác biệt. Bạn nên chọn 1 cho mã rõ ràng.


7

Tất cả đều giống nhau nhưng 2 và 3 được sử dụng để tạo truy vấn động cho điều kiện AND / OR

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

chúng tôi sử dụng định dạng 2 và 3 để thực hiện truy vấn động để chúng tôi đã biết từ khóa "ở đâu" được thêm vào và chúng tôi tiếp tục thêm nhiều bộ lọc. Giống

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

sau vài dòng nếu chúng ta có bộ lọc mới, chúng ta thêm "AND coulmnb = b", v.v.

Bạn không phải kiểm tra truy vấn sql xem từ khóa được đặt ở đâu trong truy vấn đầu tiên hoặc truy vấn ban đầu

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

Nếu không chúng ta có thể viết sqlquery = "SELECT * FROM tablename"

sau đó

nếu không có mệnh đề 'where' trong sqlquery thì

sqlquery  = sqlquery + "where columna =a"

khác

sqlquery  = sqlquery + "and columna =a"

4 không gian hàng đầu biểu thị một khối mã. Vui lòng chỉnh sửa câu trả lời của bạn để định dạng chính xác và xem trợ giúp chỉnh sửa cho toàn bộ Kinh thánh định dạng Markdown.
Mathieu Guindon

4

Tất cả đều cho cùng một câu trả lời. Tuy nhiên, cách viết 2 và 3 chủ yếu là để có quyền kiểm soát câu lệnh "Where" để giúp việc thêm hoặc xóa nó sau này dễ dàng hơn.

Tôi nghĩ rằng cách thứ nhất và thứ ba là cách viết đúng đắn. Nếu bạn cần một câu lệnh where bạn thích ở số 3 thì nếu không thì số 1 sẽ đủ tốt.


3

Tuy nhiên, trong MS SQL 1 và 3 giống nhau, tùy chọn 2 sẽ không hoạt động, tùy chọn 2 là một câu lệnh không hợp lệ như trong MS SQL, WHERE được sử dụng để so sánh một số giá trị. Ví dụ:

  1. Chọn * từ 'myTable trong đó ID = 3 (hợp lệ)
  2. Chọn * từ 'myTable trong đó 1 = 1 giống với Chọn * từ' myTable trong đó 2 = 2 giống với Chọn * từ 'myTable trong đó 3 = 3 bạn có ý tưởng (hợp lệ) giống như Chọn * Từ' myTable '

2
  1. CHỌN * TỪ tên_bảng : nó sẽ cung cấp cho bạn tất cả các bản ghi của bảng với việc chạy bất kỳ câu lệnh where nào.
  2. CHỌN * TỪ tên_bảng Ở ĐÂU 1 : điều này luôn luôn đúng, điều này chủ yếu được tin tặc sử dụng để xâm nhập vào bất kỳ hệ thống nào. Nếu bạn nghe nói về việc tiêm sql hơn 2 & 3 là các tình huống buộc phải xây dựng bởi tin tặc để lấy tất cả các bản ghi của bảng.
  3. CHỌN * TỪ tên_bảng trong đó 1 = 1 : Điều này sẽ cung cấp cho bạn tất cả các bản ghi của bảng nhưng nó sẽ so sánh câu lệnh where và sau đó di chuyển về phía trước, về cơ bản nó được thêm vào để thêm hoặc xóa thêm các câu lệnh sau đó.

1

Kết quả - Cung cấp tất cả các bản ghi trong bảng được chỉ định thay vì tablename cho cả ba truy vấn

SELECT * FROM tablename WHERE 1- Kiểm tra câu trả lời này

SELECT * FROM tablename WHERE 1=1- Kiểm tra câu trả lời này

Để biết thêm thông tin về tối ưu hóa mệnh đề WHERE, hãy kiểm tra các mục sau: MYSQL , SQLite , SQL

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.