2012-01-26 64 views
7

Sự khác biệt giữa hai lệnh sau đây là gì?Sự khác biệt SQL giữa IN và OR trong WHERE

SELECT * FROM table WHERE id IN (id1, id2, ..., idn) 

SELECT * FROM table WHERE id = id1 OR id = id2 OR ... OR id = idn 

Cái nào nhanh hơn? Và nó sẽ khác nếu id là một loại khác?

+0

Nó cũng sẽ là tốt để biết những gì thực hiện SQL chúng tôi đang nói về ở đây. – JNK

Trả lời

10

Họ là ngữ nghĩa giống hệt nhau.

IN chỉ là viết tắt của một chuỗi các câu bình đẳng như trong ví dụ thứ hai của bạn. Hiệu suất cũng phải giống nhau.

Loại không quan trọng, nó sẽ luôn luôn đánh giá theo một chuỗi các điểm cân bằng.

Có một sự khác biệt khi bạn đang sử dụng NOT IN và dữ liệu có thể được NULL, mặc dù - một NULL sẽ không đánh giá sai để so sánh NOT IN, vì vậy bạn có thể nhận được hàng bạn không mong đợi trong tập kết quả.

Như một ví dụ:

SELECT 'Passed!' WHERE NULL NOT IN ('foo', 'bar')

Các truy vấn trên sẽ không trở lại liên tiếp mặc dù theo mệnh giá NULL không phải là 'foo' hoặc 'bar' - điều này là bởi vì NULL là tình trạng không rõ, và SQL không thể nói chắc chắn rằng giá trị không xác định là KHÔNG một trong các giá trị được liệt kê IN.

+0

'Có sự khác biệt khi bạn đang sử dụng NOT IN' - - thế nào? 'NOT IN' ===' f! = 1 VÀ f! = 2'. Và cả hai biểu thức một lần nữa được tối ưu hóa theo cùng một cách (khủng khiếp) – zerkms

+0

@zerkms - không phải với 'NULL', ít nhất là trong SQL Server. 'SELECT 1 WHERE NULL NOT IN ('foo', 'bar')' - bạn sẽ không nhận được một hàng, nhưng bạn sẽ mong đợi từ 'NULL' không phải là foo hoặc thanh – JNK

+0

ah, tôi mặc dù bạn có nghĩa là rằng có 2 trường hợp khác nhau: khi bạn sử dụng 'NOT IN' và khi có' NULL' bên trong dấu ngoặc đơn – zerkms

-3

Tôi nghĩ IN nhanh hơn hoàn toàn bởi vì bạn đưa ra một truy vấn dễ dàng hơn mà máy chủ có thể xử lý. Chỉ là suy nghĩ của tôi.

Xem các bình luận sau đây của Fernando Giovanini trong bài viết này, ông đề cập rằng TRÊN làm cho nó có thể đọc được không chỉ nhiều mà còn nhanh hơn: http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries#comment-325677194

+1

Không thể nói bất cứ điều gì là nhanh hơn bất cứ điều gì khác khi bạn sử dụng 'secmatrix như '% 8: 0%' HOẶC secmatrix LIKE '% 8: 0%' HOẶC secmatrix LIKE '% 4: 0%' HOẶC secmatrix LIKE ' % 2: 0% ''trong truy vấn của bạn.Có vẻ ít nhất là hài hước (hoặc stuid) ;-) – zerkms

+0

cá nhân tôi khuyên bạn không bao giờ đề cập đến những người không rõ với các phát biểu mà không có bất kỳ bằng chứng nào (đặc biệt là khi nó hoàn toàn sai) – zerkms

+0

Tôi chưa bao giờ nói rằng điều ông ấy nói là đúng, tôi đã nói rằng những gì tôi nói là sự thật. Tất cả những gì tôi làm là suy nghĩ và tham khảo một bài báo. Đó là lý do tại sao nhiều người đặt câu trả lời, mọi người đều có ý kiến ​​và/hoặc kinh nghiệm riêng của họ. Xem tổng quan và bạn sẽ biết bên nào đang chiến thắng. –

1

Điều này phụ thuộc vào việc triển khai trình tối ưu hóa DBMS cụ thể và bản thân động cơ.

Nhưng bạn nên ổn với suy nghĩ rằng chúng tương tự ngữ nghĩa và được tối ưu hóa theo cách tương tự.

Tối ưu hóa sẽ không phụ thuộc vào loại trường

1

ít nhất trong sqlserver đều cho cùng một kế hoạch thực hiện !!!

+0

Tôi nghĩ câu hỏi đặt ra là điều chỉnh, không hoạt động. – blong

+0

@Brian là anwser của tôi chưa hoàn thành? trong bất kỳ điều khoản nào các truy vấn đều bình đẳng, ngoại trừ trong phù thủy có thể đọc được rõ ràng khác nhau –

+0

@ Brian L .: "Cái nào nhanh hơn?" --- đây là câu hỏi rõ ràng và câu trả lời này, để được rõ ràng, một phần câu trả lời nó (mặc dù tôi không thích nó ;-) +1 anyway – zerkms

0

Mỗi DBMS đáng tin cậy đủ biểu mẫu phôi IN tốt hơn nhiều vì cấu trúc dữ liệu. Hơn nữa, khi db tính toán một kế hoạch sql, nó không nhất thiết phải dịch biểu mẫu OR thành biểu mẫu IN, chỉ vì toán tử OR có thể kết hợp các điều kiện khác nhau hoàn toàn. Từ góc nhìn logic, chúng khá giống nhau.

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