Tôi nên sử dụng! = Hoặc <> cho không bằng T-SQL?


801

Tôi đã thấy SQLrằng sử dụng cả hai !=<>cho không bằng . Cú pháp ưa thích là gì và tại sao?

Tôi thích !=, vì <>nhắc nhở tôi Visual Basic.



Tính di động của mã. Nếu các yêu cầu của bạn dễ dàng được đáp ứng bởi ANSI SQL, thì tốt hơn là sử dụng nó. Bạn có thể sử dụng cùng một mã trong tất cả các DB. Ví dụ. Một tác giả sách SQL muốn minh họa SQL cơ bản bằng cách sử dụng mã mẫu.
Hơi nước

1
Tôi muốn thêm một ví dụ trong đó chỉ có mã ANSI SQL có thể là một vấn đề - SQL chuẩn hỗ trợ các tùy chọn NULLS FIRST và NULLS LAST để kiểm soát cách sắp xếp NULL, nhưng T-SQL không hỗ trợ tùy chọn này.
Hấp

Không cần mở lại. Câu hỏi được đánh dấu là một bản sao, chỉ được mở rộng thêm một tùy chọn nữa NOT (A = B).
TLama

@Steam, bạn nên chỉ định phiên bản ansi sql năm nào chính xác mà bạn đang đề cập đến. Một số phiên bản này thậm chí còn yêu cầu bạn chỉ định mức độ tương thích hoặc các phần chính xác của tiêu chuẩn. Ai trong số họ đã giới thiệu NULLS FIRST và NULLS LAST?
Gherman

Câu trả lời:


539

Về mặt kỹ thuật, chúng hoạt động giống nhau nếu bạn đang sử dụng SQL Server AKA T-SQL. Nếu bạn đang sử dụng nó trong các thủ tục được lưu trữ, không có lý do hiệu suất để sử dụng cái này hơn cái kia. Sau đó nó đi xuống sở thích cá nhân. Tôi thích sử dụng <> vì nó tuân thủ ANSI.

Bạn có thể tìm thấy các liên kết đến các tiêu chuẩn ANSI khác nhau tại ...

http://en.wikipedia.org/wiki/Query


41
Tôi luôn thích sử dụng !=vì sự tồn tại của nó trong mọi ngôn ngữ chịu ảnh hưởng C mà tôi đã sử dụng và bởi vì tài liệu Python nói: "Các hình thức <>!=tương đương; để thống nhất với C, !=được ưu tiên, nơi !=được đề cập dưới đây <>cũng được chấp nhận. Chính <>tả được coi là lỗi thời. " Nhưng SQL không phải là Python!
Iain Samuel McLean Elder

24
Tôi thích sử dụng <> vì nó làm tôi nhớ đến XML. Nhưng SQL không phải là XML!
Rob Grant

32
Đúng; Microsoft tự khuyên bạn sử dụng <>trên !=đặc biệt cho việc tuân thủ ANSI, ví dụ như trong Microsoft Press bộ đào tạo cho 70-461 thi, "Truy vấn Microsoft SQL Server", họ nói "Là một ví dụ khi lựa chọn hình thức tiêu chuẩn, T-SQL hỗ trợ hai“không ngang bằng với các nhà khai thác của người dùng:
Matt Gibson

10
Tôi thích <> vì nó dễ gõ hơn.
2023861

731

Hầu hết các cơ sở dữ liệu hỗ trợ !=(ngôn ngữ lập trình phổ biến) và <>(ANSI).

Cơ sở dữ liệu hỗ trợ cả !=<>:

Cơ sở dữ liệu hỗ trợ toán tử tiêu chuẩn ANSI, độc quyền :

  • IBM UDB 9.5: <>
  • Truy cập Microsoft 2010: <>

Bản đồ truy vấn Django ORM NOT (a = b)thay vì (a <> b)hoặc (a != b). Có phải cùng một nội bộ?
người dùng

7
@buffer, chúng giống nhau về mặt logic , nghĩa là nó sẽ khớp hoặc loại trừ cùng một tập hợp các hàng. Nhưng liệu một thương hiệu RDBMS cụ thể có tối ưu hóa nó hay không thì điều đó phụ thuộc vào việc triển khai. Điều đó nói rằng, tôi sẽ ngạc nhiên nếu có bất kỳ sự khác biệt giữa các thương hiệu cơ sở dữ liệu.
Bill Karwin

lưu ý phụ: LINQ trong C # bạn phải sử dụng! =
Tom Stickel

! = được IBM DB2 LUW 10.5+ hỗ trợ
Cristi S.

10
@TomStickel LINQ trong C # không phải là SQL.
Craig

109

'<>'là từ tiêu chuẩn SQL-92'!='là một toán tử T-SQL độc quyền . Nó cũng có sẵn trong các cơ sở dữ liệu khác, nhưng vì nó không phải là tiêu chuẩn nên bạn phải sử dụng nó trong từng trường hợp cụ thể.

Trong hầu hết các trường hợp, bạn sẽ biết cơ sở dữ liệu nào bạn đang kết nối để điều này thực sự không phải là vấn đề. Tệ nhất là bạn có thể phải thực hiện tìm kiếm và thay thế trong SQL của mình.


Tôi cũng đã thấy mysql sql cũng sử dụng nó
Bob The Janitor

3
Chúng ta có thể tiếp tục gọi một phần mở rộng rộng rãi như vậy sang ngôn ngữ tiêu chuẩn là ngôn ngữ độc quyền không? Tại thời điểm này, có vẻ như tiêu chuẩn cần được cập nhật để yêu cầu hoặc ít nhất là cho phép cả hai cú pháp.
Johan Boulé

3
@JohanBoule tốt, có một tiêu chuẩn bằng văn bản cho SQL và theo hiểu biết của tôi !=không phải là một phần của nó. Mặc dù đối với tất cả các mục đích thực tế, nó là một tiêu chuẩn defacto, chúng ta không nên nhầm lẫn giữa các tính năng và không phải là tiêu chuẩn.
Adam Lassek



24

Đó là SQL Server cụ thể. Cấp cho anh ta hỏi về SQL Server, nhưng bạn có thể tìm một tài liệu tham khảo thông số ANSI để xem liệu nó có đảm bảo có thể mang theo được cho những người trong chúng ta muốn biết loại đó không?
Joel Coehoorn

6
@Joel Coehoorn, nếu bạn chuyển mã T-SQL của bạn "<>" và "! =" Sẽ là điều ít lo lắng nhất của bạn !!
KM.

1
Chuyển không phải là vấn đề - đó là khi, với tư cách là nhà phát triển, bạn bắt buộc phải qua lại giữa các môi trường. Kiên định là tốt.
Đánh dấu tiền chuộc

20

Dường như bản thân Microsoft thích <>để !=được minh chứng trong các ràng buộc bảng của họ. Cá nhân tôi thích sử dụng !=vì tôi đọc rõ ràng là "không bằng", nhưng nếu bạn nhập [field1 != field2]và lưu nó dưới dạng một eo biển, lần sau khi bạn truy vấn nó, nó sẽ hiển thị dưới dạng [field1 <> field2]. Điều này nói với tôi rằng cách chính xác để làm điều đó là <>.


15

!=, mặc dù không phải là ANSI, nhưng theo tinh thần thực sự của SQL là ngôn ngữ dễ đọc hơn. Nó hét không bằng. <>nói rằng với tôi (ít hơn, lớn hơn), điều này thật kỳ lạ. Tôi biết ý định là nó nhỏ hơn hoặc lớn hơn do đó không bằng nhau, nhưng đó là một cách thực sự phức tạp để nói điều gì đó thực sự đơn giản.

Tôi vừa phải thực hiện một số truy vấn SQL dài và đặt chúng một cách đáng yêu vào một tệp XML vì cả đống lý do ngu ngốc mà tôi sẽ không tham gia.

Đủ để nói rằng XML hoàn toàn không phù hợp <>và tôi đã phải thay đổi chúng !=và tự kiểm tra trước khi tôi tự làm hỏng bản thân mình.


6
Tại sao không chỉ là CDATA? Điều gì xảy ra khi truy vấn của bạn chứa XML?
Janus Troelsen

12

Bạn có thể sử dụng bất cứ thứ gì bạn thích trong T-SQL. Các tài liệu nói rằng cả hai hoạt động theo cùng một cách. Tôi thích !=, bởi vì nó đọc "không bằng" tâm trí của tôi (dựa trên C / C ++ / C #), nhưng các chuyên gia cơ sở dữ liệu dường như thích <>.


10

Tôi hiểu rằng cú pháp C !=có trong SQL Server do di sản Unix của nó (trở lại trong Sybase SQL Server, trước Microsoft SQL Server 6.5).


7

Một cách khác là sử dụng toán tử NULLIF khác <>hoặc !=trả về NULL nếu hai đối số bằng NULLIF bằng Microsoft Docs . Vì vậy, tôi tin rằng mệnh đề WHERE có thể được sửa đổi cho <>!=như sau:

NULLIF(arg1, arg2) IS NOT NULL

Như tôi thấy rằng, sử dụng <>!=không hoạt động cho đến nay trong một số trường hợp. Do đó sử dụng các biểu thức trên không cần thiết.


6
Tôi không chắc chức năng này có hoạt động tốt hay không <>đối với việc sử dụng chỉ mục trong tất cả các trường hợp góc. Bên cạnh đó, khả năng đọc chắc chắn còn tệ hơn nhiều ...
Lukas Eder

Như tôi đã đề cập trong câu trả lời, điều này có hiệu quả đối với tôi trên các trường ngày ở đó vào năm 2014. Không chắc điều khoản / điều kiện nào đã hạn chế các câu trả lời khác, nhưng nhìn vào một số upvote, điều này dường như cũng giúp người khác.
jitendrapurohit

1

Tôi thích sử dụng !=thay <>vì bởi vì đôi khi tôi sử dụng <s></s>cú pháp để viết các lệnh SQL. Sử dụng !=là tiện dụng hơn để tránh lỗi cú pháp trong trường hợp này.


-6

Cả hai đều được chấp nhận trong T-SQL. Tuy nhiên, dường như việc sử dụng <>công việc nhanh hơn rất nhiều!= . Tôi vừa chạy một truy vấn phức tạp đang sử dụng !=và trung bình mất khoảng 16 giây để chạy. Tôi đã thay đổi chúng <>và truy vấn trung bình mất khoảng 4 giây để chạy. Đó là một cải tiến lớn!


20
Nếu bạn chạy hai truy vấn tương tự lần lượt trong SQL Server, nó có thể sẽ có dữ liệu được lưu trong bộ nhớ cache và được tối ưu hóa cho các truy vấn tương tự. Nếu bạn làm theo thứ tự ngược lại, bạn có thể tìm thấy kết quả ngược lại!
codemonkey

2
Điều này cũng sai, họ sẽ không có hai toán tử hoạt động giống hệt nhau và một toán tử "chậm" hơn. Có nhiều yếu tố góp phần giải thích tại sao cùng một truy vấn sẽ tạo ra thời gian thực hiện khác nhau.
Cơ hội Elliot

-11

Mặc dù chúng hoạt động theo cùng một cách, !=có nghĩa là chính xác "không bằng", trong khi <>có nghĩa lớn hơn và nhỏ hơn giá trị được lưu trữ.

Xem xét >=hoặc <=, và điều này sẽ có ý nghĩa khi bao thanh toán trong các chỉ mục của bạn cho các truy vấn ... <>sẽ chạy nhanh hơn trong một số trường hợp (với chỉ mục đúng), nhưng trong một số trường hợp khác (không có chỉ mục) chúng sẽ chạy giống nhau.

Điều này cũng phụ thuộc vào cách hệ thống cơ sở dữ liệu của bạn đọc các giá trị !=<>. Nhà cung cấp cơ sở dữ liệu có thể chỉ cần tắt nó và làm cho chúng hoạt động giống nhau, do đó không có bất kỳ lợi ích nào cả. PostgreQuery và SQL Server không tắt phím này; Nó được đọc như nó xuất hiện ở trên.


3
Bạn có bất kỳ tài liệu tham khảo hỗ trợ cho tuyên bố của bạn? Cả hai toán tử dường như giống hệt nhau trong PostgreSQL , OracleMySQL .
GhostGambler

8
Điều này là hoàn toàn sai, nó có thể trông giống như bạn "lớn hơn và nhỏ hơn giá trị được lưu trữ" khi bạn kết hợp các ký tự đó trong tâm trí của bạn, nhưng đối với người từ chối thì đó chỉ là một cách khác để biểu thị mã thông báo.
Cơ hội Elliot

Thiếu tài nguyên liên quan!
mostafa8026
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.