Database
 sql >> Base de Dados >  >> RDS >> Database

Operador SQL OR para iniciantes


Em SQL, o OR O operador permite que você use condições alternativas ao filtrar suas consultas.

O OR operador combina duas condições e retorna TRUE quando uma das condições for TRUE .

Tabela de origem


A tabela a seguir é usada para os exemplos nesta página.
SELECT * FROM Pets;

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

Exemplo


Aqui está um exemplo simples para demonstrar o OR operador.
SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';

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

Podemos ver que ele realmente retornou as linhas onde o PetName coluna era Fluffy ou Tweet . Nenhuma outra linha foi retornada.

Colunas diferentes


No exemplo anterior, ambas as condições estavam comparando valores com a mesma coluna, mas isso não é um requisito. As expressões em ambos os lados do OR O operador pode usar colunas diferentes para comparar valores. O OR operador simplesmente retornará TRUE quando uma dessas condições for TRUE .
SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';

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

Combinado com outros operadores


Seus critérios de filtragem podem combinar expressões que usam outros operadores além do OR operador.

Aqui está um exemplo que inclui o AND operador.
SELECT * FROM Pets 
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';

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

Observe que eu cerquei o OR condição entre parênteses. O motivo pelo qual fiz isso foi porque, por padrão, OR os operadores são avaliados após AND operadores. SQL tem uma ordem definida de precedência dos operadores em uma expressão, e isso determina que o AND operador é avaliado antes do OR operador.

No entanto, você pode usar parênteses para substituir a precedência definida dos operadores em uma expressão. Tudo entre parênteses é avaliado para retornar um único valor. Esse valor pode ser usado por qualquer operador fora desses parênteses.

Em outras palavras, você pode usar parênteses para especificar a ordem na qual deseja que cada operador lógico seja avaliado em uma expressão.

Por que isso é um problema?

Dê uma olhada nos resultados quando removemos os parênteses.
SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';

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

Na verdade, obtemos um resultado diferente.

Isso ocorre porque a consulta agora verifica PetName = 'Tweet' AND DOB >= '2020-11-20' primeiro, depois verifica o OR expressão PetName = 'Fluffy' .

É como se pudéssemos colocar parênteses em AND expressão, assim:
SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');

No entanto, para confundir ainda mais as coisas, podemos reorganizar nossa consulta para que não usemos parênteses e ainda assim obter o mesmo resultado do nosso primeiro exemplo com parênteses.

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

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

Neste caso, o AND expressão foi avaliada primeiro, como esperado. A ordem das expressões acabou de se alinhar para que DOB >= '2020-11-20' AND PetName = 'Fluffy' foi avaliado primeiro, então excluímos o outro pet chamado Fluffy devido ao seu DOB caindo fora desse intervalo. Só depois disso, foi o OR expressão avaliada como uma condição alternativa ao nosso AND existente resultado.

A moral desta história? Use parênteses ao usar vários operadores. Dessa forma, você pode especificar a ordem exata na qual deseja que cada expressão seja avaliada.