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.