Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Toán tử SQL HOẶC cho người mới bắt đầu

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển bảng dữ liệu làm tham số cho các thủ tục được lưu trữ

  2. Vui lòng trợ giúp với các cải tiến STRING_SPLIT

  3. SQL GROUP BY- 3 Mẹo dễ dàng để nhóm kết quả giống như một chuyên gia

  4. Tìm hiểu cách xử lý ngoại lệ trong PL / SQL

  5. Đừng chỉ tạo ra những chỉ mục bị thiếu một cách mù quáng!