Database
 sql >> база данни >  >> RDS >> Database

SQL OR оператор за начинаещи

В SQL, OR операторът ви позволява да използвате алтернативни условия при филтриране на вашите заявки.

OR оператор комбинира две условия и връща TRUE когато някое от условията е TRUE .

Изходна таблица

Следната таблица се използва за примерите на тази страница.

SELECT * FROM Pets;

Резултат:

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

Пример

Ето един прост пример за демонстриране на OR оператор.

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

Резултат:

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

Можем да видим, че наистина е върнал редовете, където е PetName колоната беше или Fluffy или Tweet . Не бяха върнати други редове.

Различни колони

В предишния пример и двете условия сравняваха стойности с една и съща колона, но това не е изискване. Изразите от двете страни на OR операторът може да използва различни колони за сравняване на стойности. OR операторът просто ще върне TRUE когато някое от тези условия е TRUE .

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

Резултат:

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

Комбинирано с други оператори

Вашите критерии за филтриране могат да комбинират изрази, които използват други оператори в допълнение към OR оператор.

Ето пример, който включва AND оператор.

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

Резултат:

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

Забележете, че заобиколих OR условие със скоби. Причината да го направя беше, че по подразбиране OR операторите се оценяват след AND оператори. SQL има дефиниран ред на приоритет на операторите в израз и това диктува, че AND операторът се оценява преди OR оператор.

Въпреки това, можете да използвате скоби, за да замените дефинирания приоритет на операторите в израз. Всичко в скоби се оценява, за да върне една стойност. Тази стойност може да се използва от всеки оператор извън тези скоби.

С други думи, можете да използвате скоби, за да посочите реда, в който искате всеки логически оператор да бъде оценен в израз.

Защо това е проблем?

Разгледайте резултатите, когато премахнем скобите.

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

Резултат:

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

Всъщност получаваме различен резултат.

Това е така, защото заявката сега проверява PetName = 'Tweet' AND DOB >= '2020-11-20' първо, след това проверява OR израз PetName = 'Fluffy' .

Сякаш бихме поставили скоби около AND израз, като този:

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

Въпреки това, за да объркаме нещата още повече, бихме могли да пренаредим заявката си, така че да не използваме скоби и въпреки това да получим същия резултат като първия ни пример със скоби.

Като това:

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

Резултат:

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

В този случай AND експресията беше оценена първо, както се очакваше. Редът на изразите току-що се подреди така, че DOB >= '2020-11-20' AND PetName = 'Fluffy' беше оценено първо, така че изключихме другия домашен любимец, наречен Fluffy, поради неговия DOB попадат извън този диапазон. Едва след това беше OR израз, оценен като алтернативно условие на нашето съществуващо AND резултат.

Моралът на тази история? Използвайте скоби, когато използвате няколко оператора. По този начин можете да посочите точния ред, в който искате всеки израз да бъде оценен.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на JShell в Java 9 в NetBeans 9.0, част 4

  2. SQL оператор за сравнение

  3. Какво представляват потребителските права на база данни?

  4. Прагове за оптимизиране – групиране и агрегиране на данни, част 3

  5. Как да замените част от низ в SQL