Toán tử này <=> trong MySQL là gì?


163

Tôi đang làm việc với mã được viết bởi một nhà phát triển trước đó và trong một truy vấn có ghi,

WHERE p.name <=> NULL

Điều này <=>có nghĩa gì trong truy vấn này? Nó có phải là một cái gì đó bằng =? Hay là một lỗi cú pháp?

Nhưng nó không hiển thị bất kỳ lỗi hoặc ngoại lệ. Tôi đã biết rằng <>= !=trong MySQL .


19
người spaceshipđiều khiển
lạc đà Moha toàn năng

4
@ Mhd.Tahawi, Chúng tôi cần một google cho phép chúng tôi google trực tiếp cho các nhà khai thác.
Pacerier 14/2/2015

@Pacerier - Tôi đã tìm thấy cái này, khoảng 5 năm trước Symbolhound.com (dunno nếu có một sự thay thế tốt hơn)
Andrew

Câu trả lời:


239

TL; DR

Đó là sự NULLan toàn như nhau toán tử .

Như thường lệ = toán tử , hai giá trị được so sánh và kết quả là0 (không bằng) hoặc 1(bằng); nói cách khác: 'a' <=> 'b'sản lượng 0'a' <=> 'a'sản lượng 1.

Không giống như =toán tử thông thường , các giá trị củaNULL không có ý nghĩa đặc biệt và vì vậy nó không bao giờ mang lạiNULL kết quả khả dĩ; vì vậy: 'a' <=> NULLsản lượng 0NULL <=> NULLsản lượng 1.

Hữu ích

Điều này có thể hữu ích khi cả hai toán hạng có thể chứa NULLvà bạn cần một kết quả so sánh nhất quán giữa hai cột.

Một trường hợp sử dụng khác là với các câu lệnh được chuẩn bị, ví dụ:

... WHERE col_a <=> ? ...

Ở đây, trình giữ chỗ có thể là giá trị vô hướng hoặc NULLkhông phải thay đổi bất cứ điều gì về truy vấn.

Toán tử liên quan

Ngoài ra <=>, còn có hai toán tử khác có thể được sử dụng để so sánh với NULL, đó là IS NULLIS NOT NULL; chúng là một phần của tiêu chuẩn ANSI và do đó được hỗ trợ trên các cơ sở dữ liệu khác, không giống như<=> MySQL.

Bạn có thể coi chúng là các chuyên ngành của MySQL <=>:

'a' IS NULL     ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)

Dựa trên điều này, truy vấn cụ thể của bạn (đoạn) có thể được chuyển đổi sang dễ mang theo hơn:

WHERE p.name IS NULL

Ủng hộ

Tiêu chuẩn SQL: 2003 đã giới thiệu một vị từ cho cái này, hoạt động chính xác như <=>toán tử của MySQL , ở dạng sau:

IS [NOT] DISTINCT FROM 

Sau đây là phổ biến được hỗ trợ, nhưng tương đối phức tạp:

CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
     THEN 1
     ELSE 0
END = 1

2
vậy có nghĩa là không có sự khác biệt? và đây <=>có phải là một nhà điều hành vô dụng? đúng?
zzlalani

16
@zzlalani Không hề; <=>mất hai toán hạng trong khi IS (NOT) NULLchỉ mất một; sự khác biệt lớn ... nó hữu ích như =chính nó trong khía cạnh đó.
Ja͢ck

12
@zzlalani IS NULLIS NOT NULLnằm trong tiêu chuẩn SQL. <=>là một phần mở rộng cụ thể của MySQL.
Daniel Dinnyes

5
Vì vậy, giống như các is not distinct fromnhà điều hành. Tò mò muốn biết liệu MySQL có thể sử dụng một chỉ mục trên đó không ...
Denis de Bernardy

3
@Pacerier Không, nghịch đảo a <=> bNOT(a <=> b).
Ja͢ck

57

<=> NULL-safe equal to operator

Toán tử này thực hiện so sánh bằng như toán tử =, nhưng trả về 1 thay vì NULL nếu cả hai toán hạng là NULL và 0 thay vì NULL nếu một toán hạng là NULL.

Xem ở đây để xem tài liệu

Mẫu vật :

bạn nên sử dụng KHÔNG PHẢI. (Các toán tử so sánh = và <> đều cho UNKNOWN với NULL ở hai bên của biểu thức.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

cũng có thể phủ định toán tử đẳng thức an toàn null nhưng đây không phải là SQL chuẩn.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

1
Sửa lỗi: <=>nên được gọi là toán tử bằng=NULLtoán tử bằng không an toàn.
Pacerier

26

Đó là NULL-safe bằng toán tử

<=> Toán tử được sử dụng để so sánh các giá trị NULL với các trường. Nếu bình thường = (bằng) Toán tử trả về NULL nếu một trong các giá trị so sánh là NULL. Với toán tử <=> trả về đúng hay sai. <=> Toán tử giống như IS NULL.

Từ hướng dẫn: -

<=> thực hiện so sánh bằng như toán tử =, nhưng trả về 1 thay vì NULL nếu cả hai toán hạng là NULL và 0 thay vì NULL nếu một toán hạng là NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

Chỉnh sửa: - ( Mặc dù rất muộn để thêm một mặt lưu ý quan trọng đề cập KHÔNG <=> cũng )

Còn một chú ý đáng nói:-

KHÔNG <=>

Còn một điểm nữa KHÔNG <=> được sử dụng để so sánh các giá trị NULL với các trường. Nếu bình thường! = Hoặc <> (không bằng) Toán tử trả về NULL nếu một trong các giá trị so sánh là NULL. Với KHÔNG áp dụng cho toán tử <=> trả về đúng hoặc sai. KHÔNG được áp dụng cho <=> Toán tử giống như IS KHÔNG NULL.

Thí dụ:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0

1
NOT <=>không phải là một toán tử, nó NOTđược áp dụng cho kết quả của op1 <=> op2.
Ja͢ck

@Jack: - Có bạn đúng. Cập nhật câu trả lời! Đã thêm vào đó để tạo điểm nhấn :)
Rahul Tripathi

Vì vậy, tôi đoán không có <!=>nhà điều hành
Kip

@kip: không có!
Rahul Tripathi

18

<=>là toán tử "bằng" an toàn của MySQL. Từ hướng dẫn :

NULL-an toàn như nhau. Toán tử này thực hiện so sánh bằng như toán tử =, nhưng trả về 1 thay vì NULL nếu cả hai toán hạng là NULL và 0 thay vì NULL nếu một toán hạng là NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

11

NULL-an toàn như nhau. Toán tử này thực hiện so sánh bằng như toán tử =, nhưng trả về 1 thay vì NULL nếu cả hai toán hạng là NULL và 0 thay vì NULL nếu một toán hạng là NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

Nó có ý nghĩa:

Khi bạn so sánh giá trị NULL với giá trị không phải NULL, bạn sẽ nhận được NULL. Nếu bạn muốn kiểm tra nếu một giá trị là null.

Toán tử Equality (<=>) coi NULL là giá trị bình thường, do đó, nó trả về 1 (không phải NULL) nếu cả hai giá trị là NULL và trả về 0 (không phải NULL) nếu một trong các giá trị là NULL:

ví dụ

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable

10

<=>toán tử bằng nhau an toàn NULL . a <=> bgiống như viết:

CASE
    WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
    WHEN a IS NULL OR  b IS NULL THEN 0 -- one operand is null then 0
    ELSE a = b                          -- else behave like normal = operator
END

Và xin lỗi, tôi không thể tìm thấy một lý do chính đáng để sử dụng toán tử này thay vì AND/OR IS (NOT) NULL. Ví dụ của bạn, ví dụ, WHERE p.name <=> NULLgiống như WHERE p.name IS NULL.


9

Từ tài liệu MySQL :

NULL-an toàn như nhau. Toán tử này thực hiện so sánh bằng như toán tử =, nhưng trả về 1 thay vì NULL nếu cả hai toán hạng là NULL và 0 thay vì NULL nếu một toán hạng là NULL.

Một ví dụ sử dụng <=>toán tử sẽ là:

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

Mà sẽ trở lại:

1, 1, 0

Một ví dụ về =toán tử thông thường sẽ là:

SELECT 1 = 1, NULL = NULL, 1 = NULL;

Mà sẽ trở lại:

1, NULL, NULL

Các <=>nhà điều hành là rất giống với các =nhà điều hành, trừ trường hợp <=>sẽ không bao giờ quay trở lạiNULL



1
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
+----+------+----+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  3 | NULL |  3 | NULL |
|  4 | NULL |  3 | NULL |
|  3 | NULL |  4 | NULL |
|  4 | NULL |  4 | NULL |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
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.