Trong SQL, OR
toán tử cho phép bạn sử dụng các điều kiện thay thế khi lọc các truy vấn của bạn.
OR
toán tử kết hợp hai điều kiện và trả về TRUE
khi một trong hai điều kiện là TRUE
.
Bảng nguồn
Bảng sau được sử dụng cho các ví dụ trên trang này.
SELECT * FROM Pets;
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Ví dụ
Dưới đây là một ví dụ đơn giản để chứng minh OR
nhà điều hành.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Chúng ta có thể thấy rằng nó đã thực sự trả về các hàng có PetName
cột là Fluffy
hoặc Tweet
. Không có hàng nào khác được trả lại.
Các cột khác nhau
Trong ví dụ trước, cả hai điều kiện đang so sánh các giá trị với cùng một cột, nhưng đây không phải là một yêu cầu. Các biểu thức ở hai bên của OR
toán tử có thể sử dụng các cột khác nhau để so sánh các giá trị với nhau. OR
toán tử sẽ chỉ trả về TRUE
khi một trong hai điều kiện đó là TRUE
.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Kết hợp với các nhà khai thác khác
Tiêu chí lọc của bạn có thể kết hợp các biểu thức sử dụng các toán tử khác ngoài OR
nhà điều hành.
Dưới đây là một ví dụ bao gồm AND
nhà điều hành.
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Lưu ý rằng tôi đã bao quanh OR
điều kiện với dấu ngoặc đơn. Lý do tôi làm điều đó là vì theo mặc định, OR
toán tử được đánh giá sau AND
các toán tử. SQL có một thứ tự ưu tiên xác định của các toán tử trong một biểu thức và điều này cho thấy rằng AND
toán tử được đánh giá trước OR
nhà điều hành.
Tuy nhiên, bạn có thể sử dụng dấu ngoặc đơn để ghi đè mức độ ưu tiên đã xác định của các toán tử trong một biểu thức. Mọi thứ trong dấu ngoặc đơn được đánh giá để trả về một giá trị duy nhất. Giá trị đó có thể được sử dụng bởi bất kỳ toán tử nào bên ngoài các dấu ngoặc đơn đó.
Nói cách khác, bạn có thể sử dụng dấu ngoặc đơn để chỉ định thứ tự mà bạn muốn mỗi toán tử logic được đánh giá trong một biểu thức.
Tại sao đây là một vấn đề?
Hãy xem kết quả khi chúng tôi loại bỏ dấu ngoặc đơn.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Chúng tôi thực sự nhận được một kết quả khác nhau.
Điều này là do, truy vấn hiện kiểm tra PetName = 'Tweet' AND DOB >= '2020-11-20'
trước tiên, sau đó kiểm tra OR
biểu thức PetName = 'Fluffy'
.
Giống như thể chúng ta đặt dấu ngoặc đơn xung quanh AND
biểu thức, như thế này:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Tuy nhiên, để làm mọi thứ nhầm lẫn hơn nữa, chúng tôi có thể sắp xếp lại truy vấn của mình để chúng tôi không sử dụng dấu ngoặc đơn nhưng vẫn nhận được kết quả giống như ví dụ đầu tiên của chúng tôi với dấu ngoặc đơn.
Như thế này:
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet';
Kết quả:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Trong trường hợp này, AND
biểu thức đã được đánh giá đầu tiên, như mong đợi. Thứ tự của các biểu thức vừa xếp hàng sao cho DOB >= '2020-11-20' AND PetName = 'Fluffy'
được đánh giá đầu tiên, vì vậy chúng tôi đã loại trừ vật nuôi khác có tên Fluffy do DOB
của nó nằm ngoài phạm vi đó. Chỉ sau đó, là OR
biểu thức được đánh giá như một điều kiện thay thế cho AND
hiện có của chúng tôi kết quả.
Những đạo đức của câu chuyện này? Sử dụng dấu ngoặc đơn khi sử dụng nhiều toán tử. Bằng cách đó, bạn có thể chỉ định thứ tự chính xác mà bạn muốn đánh giá từng biểu thức.