[Introdução ao SQL] Torne-se um Mestre em Múltiplas Condições! Domine Completamente AND, OR e NOT
"Quero obter dados específicos do banco de dados, mas uma condição simplesmente не é suficiente..."
Como um criador web, você já se deparou com um obstáculo como este ao tentar aprimorar suas habilidades?
SQL é a linguagem usada para manipular bancos de dados, e a instrução SELECT, que extrai dados, é o básico do básico. No entanto, para obter a informação exata que você realmente deseja, a técnica de combinar múltiplas condições para filtrar dados é essencial.
Neste artigo, vamos explicar detalhadamente como usar os três operadores lógicos para especificar múltiplas condições —AND, OR e NOT— com exemplos de código que até mesmo iniciantes podem copiar e colar para obter resultados funcionais! Ao vivenciar aquele momento de "funcionou!", você vai entender como o SQL pode ser divertido e conveniente.
Preparação: Vamos Configurar uma Tabela de Prática!
Primeiro, vamos criar a tabela de prática que usaremos neste artigo. É uma tabela employees que armazena informações fictícias de funcionários. Por favor, copie a seguinte instrução SQL e execute-a em seu próprio ambiente de banco de dados.
Mas não se preocupe se você не tiver um ambiente pronto para usar! Mais adiante no artigo, nós fornecemos um "ambiente de execução de SQL" que permite que você experimente o SQL diretamente no seu navegador, então sinta-se à vontade para continuar lendo por enquanto.
-- Excluir a tabela se ela existir
DROP TABLE IF EXISTS employees;
-- Criar a tabela de funcionários
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
position VARCHAR(50),
salary INT,
hire_date DATE
);
-- Inserir os dados
INSERT INTO employees (id, name, department, position, salary, hire_date) VALUES
(1, '山田 太郎', '営業部', 'マネージャー', 600000, '2018-04-01'),
(2, '鈴木 花子', '開発部', 'エンジニア', 550000, '2020-10-01'),
(3, '佐藤 次郎', '営業部', 'スタッフ', 400000, '2022-04-01'),
(4, '高橋 三郎', '人事部', 'マネージャー', 650000, '2017-07-01'),
(5, '田中 恵子', '開発部', 'デザイナー', 500000, '2021-08-15'),
(6, '伊藤 四郎', '営業部', 'マネージャー', 700000, '2015-02-01'),
(7, '渡辺 久美', '開発部', 'エンジニア', 750000, '2019-06-01'),
(8, '山本 五郎', '人事部', 'スタッフ', 380000, '2023-04-01'),
(9, '中村 さくら', '開発部', 'マネージャー', 800000, '2016-09-01'),
(10, '小林 健太', '営業部', 'スタッフ', 420000, '2023-10-01');
Tudo pronto? Vamos mergulhar no mundo das consultas condicionais usando esta tabela!
1. AND: Encontre Dados que Atendam a Todas as Condições!
AND significa que um registro deve atender a todas as condições especificadas. É usado quando você quer extrair apenas os dados que satisfazem todos os requisitos.
Por exemplo, um caso em que você quer informações de um funcionário que está "no departamento de Vendas" e "tem o cargo de Gerente".
Uso Básico
Na cláusula WHERE, você conecta as condições usando AND.
SELECT *
FROM employees
WHERE department = '営業部' AND position = 'マネージャー';
Quando você executa este SQL, obterá todos os dados dos funcionários cujo department é '営業部' (Vendas) e cujo position é 'マネージャー' (Gerente). Você verá que o Sr. Yamada e o Sr. Ito correspondem.
Encadeando Múltiplos ANDs
Você pode encadear quantas condições AND quiser. Quanto mais condições você adicionar, mais precisamente seus dados serão filtrados.
Como exemplo, vamos encontrar um funcionário que está "no departamento de Vendas" e "é um Gerente" e "tem um salário de 650.000 ou mais".
SELECT *
FROM employees
WHERE
department = '営業部'
AND position = 'マネージャー'
AND salary >= 650000;
Desta vez, apenas o Sr. Ito foi retornado. Ao adicionar outra condição, o Sr. Yamada foi excluído. Como você pode ver, AND é extremamente poderoso para encontrar dados específicos ao sobrepor condições.
2. OR: Obtenha Dados que Atendam a Qualquer uma das Condições!
OR significa que um registro deve atender a pelo menos uma das condições especificadas. É usado quando você quer extrair dados que satisfaçam qualquer um dos requisitos.
Por exemplo, é perfeito para quando você quer uma lista de funcionários que estão "no departamento de Vendas" ou "no departamento de Desenvolvimento".
Uso Básico
Assim como AND, você conecta as condições com OR na cláusula WHERE.
SELECT *
FROM employees
WHERE department = '営業部' OR department = '開発部';
Executar isso exibirá todos os funcionários do departamento '営業部' (Vendas) e todos os funcionários do departamento '開発部' (Desenvolvimento). Enquanto AND refina os resultados ao sobrepor condições, você pode pensar no OR como adicionando mais e mais possibilidades ao conjunto de resultados.
Encadeando Múltiplos ORs
Claro, você também pode encadear múltiplos ORs. Vamos encontrar funcionários que são "Gerente" ou "têm um salário de 700.000 ou mais".
SELECT *
FROM employees
WHERE position = 'マネージャー' OR salary >= 700000;
Este resultado inclui:
- Pessoas que são Gerentes (Yamada, Takahashi, Ito, Nakamura)
- Pessoas com um salário de 700.000 ou mais (Ito, Watanabe, Nakamura)
O Sr. Ito e a Sra. Nakamura atendem a ambas as condições, e eles estão, é claro, incluídos nos resultados. OR é uma condição flexível que significa "está tudo bem, desde que atenda a pelo menos uma".
3. NOT: Extraia Dados que Não Correspondem a uma Condição!
Como o nome sugere, NOT especifica uma condição negativa: "não é ~". É útil quando você quer excluir dados com uma certa característica.
Uso Básico
Coloque NOT diretamente antes da condição que você quer negar na cláusula WHERE.
Como exemplo, vamos obter todos os funcionários que não estão no departamento '開発部' (Desenvolvimento).
SELECT *
FROM employees
WHERE NOT department = '開発部';
Executar isso exibirá os funcionários de todos os departamentos, exceto '開発部' (Desenvolvimento) — em outras palavras, funcionários de '営業部' (Vendas) e '人事部' (RH).
A propósito, você pode obter o mesmo resultado escrevendo WHERE department != '開発部' ou WHERE department <> '開発部'. Qual deles usar é uma questão de preferência ou padrões de equipe, mas NOT é único porque pode ser combinado com outros operadores como IN e EXISTS, dando a você uma gama mais ampla de expressão.
[Avançado] Combinando AND e OR e a Importância dos Parênteses
Ok, aqui é onde as coisas ficam sérias! Ao combinar AND e OR, você pode especificar condições ainda mais complexas. No entanto, há uma grande armadilha aqui em que os iniciantes costumam cair. Essa armadilha é a precedência de operadores.
No SQL, se você não especificar o contrário, AND é avaliado antes de OR. Isso é semelhante a como na matemática, a multiplicação (×) é feita antes da adição (+).
Para obter os dados que você realmente pretende, é extremamente importante usar () (parênteses) para definir claramente a ordem das operações, assim como na matemática.
Exemplo Ruim: Funcionários que estão no departamento de "Vendas" ou "Desenvolvimento" E são "Gerentes"?
Se você fosse escrever esta condição sem pensar muito, poderia acabar com isto:
-- Este SQL resulta em um resultado não intencional
SELECT *
FROM employees
WHERE
department = '営業部'
OR department = '開発部' AND position = 'マネージャー';
O que você acha que vai acontecer se executar este SQL?
Como AND tem maior precedência, o banco de dados primeiro avalia department = '開発部' AND position = 'マネージャー' (Gerentes no departamento de Desenvolvimento). Em seguida, pega esse resultado e o conecta com department = '営業部' (todos os funcionários do departamento de Vendas) usando OR.
Em outras palavras, o que esta consulta está realmente procurando é:
- ① Funcionários do departamento de "Vendas" (independentemente do cargo)
- ② Funcionários que estão no departamento de "Desenvolvimento" E são "Gerentes"
Está procurando por registros que correspondam a qualquer uma dessas opções. Isso não é o que queríamos originalmente, que era "Gerentes que estão no departamento de Vendas ou de Desenvolvimento", certo?
Bom Exemplo: Agrupando Corretamente com Parênteses
Para expressar corretamente a condição "(no departamento de Vendas OU Desenvolvimento) E tem o cargo de Gerente", você precisa envolver a parte com OR em ().
-- Usando parênteses para obter o resultado desejado!
SELECT *
FROM employees
WHERE
(department = '営業部' OR department = '開発部')
AND position = 'マネージャー';
Ao fazer isso, (department = '営業部' OR department = '開発部') é avaliado primeiro, tornando-se um único bloco de lógica que significa "pertence ao departamento de Vendas ou Desenvolvimento". A condição AND position = 'マネージャー' é então aplicada a esse resultado, permitindo que você extraia corretamente os "Gerentes que estão no departamento de Vendas ou Desenvolvimento".
Ao misturar AND e OR, sempre use parênteses () para definir explicitamente a ordem de precedência! Lembre-se disso como uma regra de ouro!
Prática! Vamos Executar SQL no seu Navegador
Obrigado pela sua paciência! Aqui está um presente para você: um ambiente onde você pode experimentar tudo o que aprendeu até agora, colocando a mão na massa.
Isso usa uma biblioteca JavaScript (AlaSQL.js) para permitir que você execute SQL aqui mesmo no seu navegador. Copie todo o código abaixo, salve-o como um arquivo chamado sql_practice.html e abra-o no seu navegador.
Cole as várias consultas SQL introduzidas neste artigo na área de texto e pressione o botão "Executar SQL", e você verá os resultados na hora. Experimente coisas diferentes e sinta como os dados mudam!
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8">
<title>Ambiente de Testes SQL</title>
<script src="https://cdn.jsdelivr.net/npm/alasql@4"></script>
<style>
body { font-family: sans-serif; padding: 2rem; background-color: #f9f9f9; }
.container { max-width: 800px; margin: auto; background: white; padding: 2rem; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
h1 { color: #333; }
textarea { width: 100%; height: 150px; font-family: monospace; font-size: 16px; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; margin-bottom: 1rem; }
button { background-color: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
button:hover { background-color: #0056b3; }
#result-area { margin-top: 2rem; }
table { width: 100%; border-collapse: collapse; margin-top: 1rem; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.error { color: red; font-weight: bold; }
</style>
</head>
<body>
<div class="container">
<h1>Vamos Experimentar um Pouco de SQL!</h1>
<p>Insira uma instrução SQL na área de texto abaixo e pressione o botão "Executar SQL". Experimente as diferentes consultas SQL que introduzimos no artigo!</p>
<textarea id="sql-input">-- Escreva seu SQL aqui
SELECT * FROM employees WHERE (department = '営業部' OR department = '開発部') AND position = 'マネージャー';</textarea>
<button onclick="executeSQL()">Executar SQL</button>
<div id="result-area"></div>
</div>
<script>
// Preparar os dados
const createTableSQL = `
CREATE TABLE employees (
id INT, name STRING, department STRING, position STRING, salary INT, hire_date DATE
);
`;
const insertDataSQL = `
INSERT INTO employees VALUES
(1, '山田 太郎', '営業部', 'マネージャー', 600000, '2018-04-01'),
(2, '鈴木 花子', '開発部', 'エンジニア', 550000, '2020-10-01'),
(3, '佐藤 次郎', '営業部', 'スタッフ', 400000, '2022-04-01'),
(4, '高橋 三郎', '人事部', 'マネージャー', 650000, '2017-07-01'),
(5, '田中 恵子', '開発部', 'デザイナー', 500000, '2021-08-15'),
(6, '伊藤 四郎', '営業部', 'マネージャー', 700000, '2015-02-01'),
(7, '渡辺 久美', '開発部', 'エンジニア', 750000, '2019-06-01'),
(8, '山本 五郎', '人事部', 'スタッフ', 380000, '2023-04-01'),
(9, '中村 さくら', '開発部', 'マネージャー', 800000, '2016-09-01'),
(10, '小林 健太', '営業部', 'スタッフ', 420000, '2023-10-01');
`;
// Inicializar o banco de dados AlaSQL
const db = new alasql.Database();
db.exec(createTableSQL);
db.exec(insertDataSQL);
function executeSQL() {
const sql = document.getElementById('sql-input').value;
const resultArea = document.getElementById('result-area');
resultArea.innerHTML = ''; // Limpar resultados anteriores
try {
const result = db.exec(sql);
if (result.length > 0) {
resultArea.appendChild(createTable(result));
} else {
resultArea.innerHTML = '<p>A consulta retornou 0 linhas.</p>';
}
} catch (e) {
resultArea.innerHTML = `<p class="error">Erro: ${e.message}</p>`;
}
}
function createTable(data) {
const table = document.createElement('table');
const thead = table.createTHead();
const tbody = table.createTBody();
const headerRow = thead.insertRow();
// Criar cabeçalhos
for (const key in data[0]) {
const th = document.createElement('th');
th.textContent = key;
headerRow.appendChild(th);
}
// Criar linhas de dados
data.forEach(rowData => {
const row = tbody.insertRow();
for (const key in rowData) {
const cell = row.insertCell();
cell.textContent = rowData[key];
}
});
return table;
}
// Exibição inicial
executeSQL();
</script>
</body>
</html>
Pontos de Atenção e Técnicas Relacionadas
Finalmente, vamos apresentar alguns pontos para ter cuidado ao lidar com múltiplas condições, bem como alguns operadores relacionados e úteis.
Lidando com NULL
Bancos de dados têm um valor especial chamado NULL. Ele representa um estado vazio, indicando que "não existem dados".
O importante a notar é que você não pode comparar NULL usando = ou !=. Para verificar se algo é NULL, você deve usar os operadores dedicados IS NULL ou IS NOT NULL.
-- Encontrar funcionários onde o salário não está definido (é NULL)
SELECT * FROM employees WHERE salary IS NULL;
-- Encontrar funcionários onde o salário está definido (NÃO é NULL)
SELECT * FROM employees WHERE salary IS NOT NULL;
Nossos dados de exemplo não contêm nenhum valor NULL, mas você os encontrará com frequência no desenvolvimento do mundo real. Escrever WHERE salary = NULL não causará um erro, mas também не lhe dará os resultados que você pretende, então tenha cuidado.
Condições Mais Convenientes: IN e BETWEEN
Às vezes, você pode escrever suas consultas de forma mais simples em vez de usar muitos ORs ou ANDs.
IN: Uma Alternativa ao OR
Quando você está conectando múltiplos valores para a mesma coluna com OR, como "no departamento de Vendas, RH ou Contabilidade", você pode escrevê-lo de forma mais limpa usando IN.
-- A forma detalhada com OR
SELECT * FROM employees
WHERE department = '営業部' OR department = '人事部';
-- A forma limpa com IN
SELECT * FROM employees
WHERE department IN ('営業部', '人事部');
BETWEEN: Uma Alternativa ao AND
Quando você precisa especificar um intervalo de números ou datas, como "salário é maior ou igual a 400.000 e menor ou igual a 600.000", o operador BETWEEN é conveniente.
-- Especificando um intervalo com AND
SELECT * FROM employees
WHERE salary >= 400000 AND salary <= 600000;
-- A forma limpa com BETWEEN
SELECT * FROM employees
WHERE salary BETWEEN 400000 AND 600000;
Você pode, é claro, combinar esses operadores com AND, OR e NOT também. Adicioná-los ao seu conjunto de ferramentas permitirá que você escreva um SQL ainda mais inteligente.
Resumo
Ótimo trabalho! Neste artigo, aprendemos os fundamentos da especificação de múltiplas condições em SQL —AND, OR e NOT— usando exemplos concretos.
- AND: "A e B". Verdadeiro se todas as condições forem atendidas. Pense nisso como refinar.
- OR: "A ou B". Verdadeiro se qualquer uma das condições for atendida. Pense nisso como ampliar as opções.
- NOT: "Não é ~". Inverte a condição. Pense nisso como excluir.
- Combinando AND & OR:
ANDtem prioridade, então é de importância crítica usar()para esclarecer a ordem das operações!
Ao dominar esses operadores lógicos, você será capaz de extrair dados exatamente como deseja, mesmo com condições complexas, e suas habilidades de manipulação de dados melhorarão drasticamente.
Por favor, use o ambiente de execução de SQL que fornecemos para experimentar várias condições. Com o SQL, quanto mais você escreve e mais experimenta, melhor você fica. Esperamos que este artigo sirva como um passo útil em sua jornada para se tornar um mestre em SQL!