Tôi đã thấy SQL
rằng sử dụng cả hai !=
và <>
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
.
NOT (A = B)
.
Tôi đã thấy SQL
rằng sử dụng cả hai !=
và <>
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
.
NOT (A = B)
.
Câu trả lời:
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 ...
!=
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 <>
và !=
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!
<>
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:
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ả !=
và <>
:
!=
và<>
!=
và<>
!=
và<>
!=
và<>
!=
và<>
!=
và<>
!=
và<>
!=
và<>
!=
và<>
Cơ sở dữ liệu hỗ trợ toán tử tiêu chuẩn ANSI, độc quyền :
NOT (a = b)
thay vì (a <> b)
hoặc (a != b)
. Có phải cùng một nội bộ?
'<>'
là từ tiêu chuẩn SQL-92 và '!='
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.
!=
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.
Tiêu chuẩn SQL ANSI định nghĩa <>
là toán tử "không bằng"
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ( 5.2 <token> and <separator>
)
Không có !=
toán tử theo tiêu chuẩn ANSI / SQL 92.
<>
là SQL hợp lệ theo tiêu chuẩn SQL-92.
http://msdn.microsoft.com/en-us/l Library / aa276846 (MySQL.80) .aspx
Cả hai đều hợp lệ và giống nhau đối với SQL Server ,
https://docs.microsoft.com/en-us/sql/t-sql/lingu-elements/not-equal-to-transact-sql-exclamation
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à <>
.
!=
, 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.
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 <>
.
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 <>
và !=
như sau:
NULLIF(arg1, arg2) IS NOT NULL
Như tôi thấy rằng, sử dụng <>
và !=
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.
<>
đố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 ...
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.
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!
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ị !=
và <>
. 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.