Database
 sql >> Baza danych >  >> RDS >> Database

Operator SQL OR dla początkujących

W SQL OR Operator umożliwia korzystanie z alternatywnych warunków podczas filtrowania zapytań.

OR operator łączy dwa warunki i zwraca TRUE gdy którykolwiek z warunków jest TRUE .

Tabela źródłowa

Poniższa tabela jest używana jako przykłady na tej stronie.

SELECT * FROM Pets;

Wynik:

+---------+-------------+-----------+-----------+------------+
| 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)

Przykład

Oto prosty przykład demonstrujący OR operatora.

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';

Wynik:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

Widzimy, że rzeczywiście zwrócił on wiersze, w których PetName kolumna była albo Fluffy lub Tweet . Żadne inne wiersze nie zostały zwrócone.

Różne kolumny

W poprzednim przykładzie oba warunki porównywały wartości z tą samą kolumną, ale nie jest to wymagane. Wyrażenia po obu stronach OR operator może używać różnych kolumn do porównywania wartości. OR operator po prostu zwróci TRUE gdy którykolwiek z tych warunków jest TRUE .

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';

Wynik:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

W połączeniu z innymi operatorami

Twoje kryteria filtrowania mogą łączyć wyrażenia, które używają innych operatorów oprócz OR operator.

Oto przykład, który zawiera AND operatora.

SELECT * FROM Pets 
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';

Wynik:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
+---------+-------------+-----------+-----------+------------+

Zauważ, że otoczyłem OR stan z nawiasami. Powodem, dla którego to zrobiłem, było to, że domyślnie OR operatory są oceniane po AND operatorów. SQL ma zdefiniowaną kolejność pierwszeństwa operatorów w wyrażeniu, a to dyktuje, że AND operator jest oceniany przed OR operator.

Możesz jednak użyć nawiasów, aby przesłonić zdefiniowane pierwszeństwo operatorów w wyrażeniu. Wszystko w nawiasach jest oceniane, aby zwrócić pojedynczą wartość. Ta wartość może być używana przez dowolny operator poza tymi nawiasami.

Innymi słowy, możesz użyć nawiasów, aby określić kolejność, w jakiej każdy operator logiczny ma być oceniany w wyrażeniu.

Dlaczego jest to problem?

Spójrz na wyniki, gdy usuniemy nawiasy.

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';

Wynik:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

W rzeczywistości otrzymujemy inny wynik.

Dzieje się tak, ponieważ zapytanie sprawdza teraz PetName = 'Tweet' AND DOB >= '2020-11-20' najpierw, potem sprawdza OR wyrażenie PetName = 'Fluffy' .

To tak, jakbyśmy umieścili nawiasy wokół AND wyrażenie, jak to:

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');

Jednak, aby jeszcze bardziej pomylić sprawę, możemy zmienić kolejność naszego zapytania, aby nie używać nawiasów, a mimo to uzyskać ten sam wynik, co nasz pierwszy przykład z nawiasami.

Tak:

SELECT * FROM Pets 
WHERE DOB >= '2020-11-20' 
AND PetName = 'Fluffy' OR PetName = 'Tweet';

Wynik:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
+---------+-------------+-----------+-----------+------------+

W tym przypadku AND wyrażenie zostało ocenione jako pierwsze, zgodnie z oczekiwaniami. Tak się złożyło, że kolejność wyrażeń została wyrównana tak, że DOB >= '2020-11-20' AND PetName = 'Fluffy' został oceniony jako pierwszy, więc wykluczyliśmy drugiego zwierzaka o imieniu Fluffy ze względu na jego DOB wypadanie poza ten zakres. Dopiero po tym nastąpiło OR wyrażenie oceniane jako warunek alternatywny do naszego istniejącego AND wynik.

Morał tej opowieści? Używaj nawiasów, gdy używasz wielu operatorów. W ten sposób możesz określić dokładną kolejność, w jakiej chcesz, aby każde wyrażenie było oceniane.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klauzula SQL GROUP BY dla początkujących

  2. Jak przyspieszyć zapytania SQL

  3. Radzenie sobie z datą i godziną zamiast datetime

  4. Zatrzask FGCB_ADD_REMOVE

  5. Łączenie SQuirreL SQL z Microsoft Excel