[¡Introducción a SQL] ¡Conviértete en un maestro de las condiciones múltiples! Domina por completo AND, OR y NOT
"Quiero obtener datos específicos de la base de datos, pero una sola condición no es suficiente..."
Como creador web, ¿alguna vez te has topado con un muro así mientras intentabas mejorar tus habilidades?
SQL es el lenguaje utilizado para manipular bases de datos, y la sentencia SELECT, que extrae datos, es la base de todo. Sin embargo, para obtener la información exacta que realmente deseas, la técnica de combinar múltiples condiciones para filtrar datos es esencial.
En este artículo, explicaremos a fondo cómo usar los tres operadores lógicos para especificar condiciones múltiples —AND, OR y NOT— ¡con código de ejemplo que hasta los principiantes pueden copiar y pegar para que funcione! Al experimentar ese momento de "¡Funciona!", te darás cuenta de lo divertido y útil que puede ser SQL.
Preparación: ¡Configuremos una tabla de práctica!
Primero, vamos a crear la tabla de práctica que usaremos en este artículo. Es una tabla de employees que almacena información ficticia de empleados. Por favor, copia la siguiente sentencia SQL y ejecútala en tu propio entorno de base de datos.
Pero no te preocupes si no tienes un entorno listo. Más adelante en el artículo, proporcionamos un "entorno de ejecución de SQL" que te permite probar SQL directamente en tu navegador, así que por ahora, ¡puedes seguir leyendo!
-- Eliminar la tabla si existe
DROP TABLE IF EXISTS employees;
-- Crear la tabla de empleados
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
position VARCHAR(50),
salary INT,
hire_date DATE
);
-- Insertar los datos
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');
¿Todo listo? ¡Vamos a sumergirnos en el mundo de las consultas condicionales usando esta tabla!
1. AND: ¡Encuentra datos que cumplan todas las condiciones!
AND significa que un registro debe cumplir todas las condiciones especificadas. Se usa cuando quieres extraer solo los datos que satisfacen cada uno de los requisitos.
Por ejemplo, un caso en el que quieres la información de un empleado que está "en el departamento de Ventas" y "tiene el puesto de Gerente".
Uso básico
En la cláusula WHERE, conectas las condiciones usando AND.
SELECT *
FROM employees
WHERE department = '営業部' AND position = 'マネージャー';
Cuando ejecutas este SQL, obtendrás todos los datos de los empleados cuyo department es '営業部' (Ventas) y cuyo position es 'マネージャー' (Gerente). Verás que el Sr. Yamada y el Sr. Ito coinciden.
Encadenar múltiples AND
Puedes encadenar tantas condiciones AND como quieras. Cuantas más condiciones agregues, más precisamente se filtrarán tus datos.
Como ejemplo, busquemos un empleado que esté "en el departamento de Ventas" y "sea Gerente" y "tenga un salario de 650,000 o más".
SELECT *
FROM employees
WHERE
department = '営業部'
AND position = 'マネージャー'
AND salary >= 650000;
Esta vez, solo apareció el Sr. Ito. Al agregar otra condición, el Sr. Yamada fue excluido. Como puedes ver, AND es extremadamente poderoso para localizar datos específicos superponiendo condiciones.
2. OR: ¡Obtén datos que cumplan cualquiera de las condiciones!
OR significa que un registro debe cumplir al menos una de las condiciones especificadas. Se usa cuando quieres extraer datos que satisfagan cualquiera de los requisitos.
Por ejemplo, es perfecto para cuando quieres una lista de empleados que están "en el departamento de Ventas" o "en el departamento de Desarrollo".
Uso básico
Al igual que AND, conectas las condiciones con OR en la cláusula WHERE.
SELECT *
FROM employees
WHERE department = '営業部' OR department = '開発部';
Ejecutar esto mostrará todos los empleados del departamento '営業部' (Ventas) y todos los empleados del departamento '開発部' (Desarrollo). Mientras que AND reduce los resultados superponiendo condiciones, puedes pensar en OR como si estuviera añadiendo más y más posibilidades al conjunto de resultados.
Encadenar múltiples OR
Por supuesto, también puedes encadenar múltiples OR. Busquemos empleados que sean "Gerente" o "tengan un salario de 700,000 o más".
SELECT *
FROM employees
WHERE position = 'マネージャー' OR salary >= 700000;
Este resultado incluye:
- Personas que son Gerentes (Yamada, Takahashi, Ito, Nakamura)
- Personas con un salario de 700,000 o más (Ito, Watanabe, Nakamura)
El Sr. Ito y la Sra. Nakamura cumplen ambas condiciones y, por supuesto, están incluidos en los resultados. OR es una condición flexible que significa "está bien siempre que cumpla al menos una".
3. NOT: ¡Extrae datos que no cumplan una condición!
Como su nombre indica, NOT especifica una condición negativa: "no es ~". Es útil cuando quieres excluir datos con una cierta característica.
Uso básico
Coloca NOT directamente antes de la condición que quieres negar en la cláusula WHERE.
Como ejemplo, obtengamos todos los empleados que no están en el departamento de '開発部' (Desarrollo).
SELECT *
FROM employees
WHERE NOT department = '開発部';
Ejecutar esto mostrará a los empleados de todos los departamentos excepto '開発部' (Desarrollo), en otras palabras, los empleados de '営業部' (Ventas) y '人事部' (RRHH).
Por cierto, puedes obtener el mismo resultado escribiendo WHERE department != '開発部' o WHERE department <> '開発部'. Cuál usar es una cuestión de preferencia o de las normas del equipo, pero NOT es único en el sentido de que se puede combinar con otros operadores como IN y EXISTS, lo que te da un rango de expresión más amplio.
[Avanzado] Combinar AND y OR y la importancia de los paréntesis
¡Bien, aquí es donde la cosa se pone seria! Al combinar AND y OR, puedes especificar condiciones aún más complejas. Sin embargo, aquí hay una gran trampa en la que los principiantes suelen caer. Esa trampa es la precedencia de operadores.
En SQL, si no especificas lo contrario, AND se evalúa antes que OR. Esto es similar a cómo en matemáticas, la multiplicación (×) se hace antes que la suma (+).
Para obtener los datos que realmente pretendes obtener, es extremadamente importante usar () (paréntesis) para definir claramente el orden de las operaciones, igual que en matemáticas.
Mal ejemplo: ¿Empleados que están en el departamento de "Ventas" u "Desarrollo" Y son "Gerentes"?
Si fueras a escribir esta condición sin pensarlo mucho, podrías terminar con esto:
-- Este SQL da un resultado no deseado
SELECT *
FROM employees
WHERE
department = '営業部'
OR department = '開発部' AND position = 'マネージャー';
¿Qué crees que pasará si ejecutas este SQL?
Debido a que AND tiene mayor precedencia, la base de datos primero evalúa department = '開発部' AND position = 'マネージャー' (Gerentes en el departamento de Desarrollo). Luego, toma ese resultado y lo conecta con department = '営業部' (todos los empleados en el departamento de Ventas) usando OR.
En otras palabras, lo que esta consulta realmente está buscando es:
- ① Empleados en el departamento de "Ventas" (independientemente del puesto)
- ② Empleados que están en el departamento de "Desarrollo" Y son "Gerentes"
Está buscando registros que coincidan con cualquiera de esas dos opciones. Esto no es lo que queríamos originalmente, que era "Gerentes que están en el departamento de Ventas o Desarrollo", ¿verdad?
Buen ejemplo: Agrupar correctamente con paréntesis
Para expresar correctamente la condición "(en el departamento de Ventas O Desarrollo) Y tiene el puesto de Gerente", necesitas envolver la parte del OR en ().
-- ¡Usando paréntesis para obtener el resultado deseado!
SELECT *
FROM employees
WHERE
(department = '営業部' OR department = '開発部')
AND position = 'マネージャー';
Al hacer esto, (department = '営業部' OR department = '開発部') se evalúa primero, convirtiéndose en un único bloque de lógica que significa "pertenece al departamento de Ventas o Desarrollo". La condición AND position = 'マネージャー' se aplica entonces a ese resultado, permitiéndote extraer correctamente a los "Gerentes que están en el departamento de Ventas o Desarrollo".
¡Cuando mezcles AND y OR, usa siempre paréntesis () para definir explícitamente el orden de precedencia! ¡Recuerda esto como una regla de oro!
¡Práctica! Ejecutemos SQL en tu navegador
¡Gracias por tu paciencia! Aquí tienes un regalo: un entorno donde puedes probar todo lo que has aprendido hasta ahora ensuciándote las manos.
Esto usa una librería de JavaScript (AlaSQL.js) para permitirte ejecutar SQL aquí mismo en tu navegador. Copia todo el código de abajo, guárdalo como un archivo llamado sql_practice.html, y ábrelo en tu navegador.
Pega las diversas consultas SQL introducidas en este artículo en el área de texto y presiona el botón "Ejecutar SQL", ¡y verás los resultados en el acto! ¡Prueba diferentes cosas y siente cómo cambian los datos!
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Patio de Pruebas de 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>¡Probemos un poco de SQL!</h1>
<p>¡Introduce una sentencia SQL en el área de texto de abajo y presiona el botón "Ejecutar SQL". Prueba las diferentes consultas que introdujimos en el artículo!</p>
<textarea id="sql-input">-- Escribe tu SQL aquí
SELECT * FROM employees WHERE (department = '営業部' OR department = '開発部') AND position = 'マネージャー';</textarea>
<button onclick="executeSQL()">Ejecutar SQL</button>
<div id="result-area"></div>
</div>
<script>
// Preparar los datos
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 la base de datos de 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 = ''; // Limpiar resultados previos
try {
const result = db.exec(sql);
if (result.length > 0) {
resultArea.appendChild(createTable(result));
} else {
resultArea.innerHTML = '<p>La consulta devolvió 0 filas.</p>';
}
} catch (e) {
resultArea.innerHTML = `<p class="error">Error: ${e.message}</p>`;
}
}
function createTable(data) {
const table = document.createElement('table');
const thead = table.createTHead();
const tbody = table.createTBody();
const headerRow = thead.insertRow();
// Crear encabezados
for (const key in data[0]) {
const th = document.createElement('th');
th.textContent = key;
headerRow.appendChild(th);
}
// Crear filas de datos
data.forEach(rowData => {
const row = tbody.insertRow();
for (const key in rowData) {
const cell = row.insertCell();
cell.textContent = rowData[key];
}
});
return table;
}
// Visualización inicial
executeSQL();
</script>
</body>
</html>
Puntos a tener en cuenta y técnicas relacionadas
Finalmente, introduzcamos algunos puntos a tener en cuenta al tratar con condiciones múltiples, así como algunos operadores relacionados y útiles.
Manejo de NULL
Las bases de datos tienen un valor especial llamado NULL. Representa un estado vacío, indicando que "no existen datos".
Lo importante a tener en cuenta es que no puedes comparar NULL usando = o !=. Para comprobar si algo es NULL, debes usar los operadores dedicados IS NULL o IS NOT NULL.
-- Encontrar empleados donde el salario no está definido (es NULL)
SELECT * FROM employees WHERE salary IS NULL;
-- Encontrar empleados donde el salario está definido (no es NULL)
SELECT * FROM employees WHERE salary IS NOT NULL;
Nuestros datos de ejemplo no contienen ningún valor NULL, pero te los encontrarás con frecuencia en el desarrollo del mundo real. Escribir WHERE salary = NULL no causará un error, pero tampoco te dará los resultados que esperas, así que ten cuidado.
Condiciones más convenientes: IN y BETWEEN
A veces, puedes escribir tus consultas de forma más sencilla en lugar de usar muchos OR o AND.
IN: Una alternativa a OR
Cuando conectas múltiples valores para la misma columna con OR, como "en el departamento de Ventas, RRHH o Contabilidad", puedes escribirlo de forma más limpia usando IN.
-- La forma larga con OR
SELECT * FROM employees
WHERE department = '営業部' OR department = '人事部';
-- La forma limpia con IN
SELECT * FROM employees
WHERE department IN ('営業部', '人事部');
BETWEEN: Una alternativa a AND
Cuando necesites especificar un rango de números o fechas, como "el salario es mayor o igual a 400,000 y menor o igual a 600,000", el operador BETWEEN es conveniente.
-- Especificar un rango con AND
SELECT * FROM employees
WHERE salary >= 400000 AND salary <= 600000;
-- La forma limpia con BETWEEN
SELECT * FROM employees
WHERE salary BETWEEN 400000 AND 600000;
Por supuesto, también puedes combinar estos operadores con AND, OR y NOT. Añadirlos a tu conjunto de herramientas te permitirá escribir un SQL aún más inteligente.
Resumen
¡Buen trabajo! En este artículo, hemos aprendido los fundamentos para especificar condiciones múltiples en SQL —AND, OR y NOT— usando ejemplos concretos.
- AND: "A y B". Verdadero si se cumplen todas las condiciones. Piensa en ello como reducir.
- OR: "A o B". Verdadero si se cumple alguna de las condiciones. Piensa en ello como ampliar las opciones.
- NOT: "No es ~". Invierte la condición. Piensa en ello como excluir.
- Combinar AND y OR:
ANDtiene prioridad, por lo que es de vital importancia usar()para aclarar el orden de las operaciones.
Al dominar estos operadores lógicos, serás capaz de extraer datos tal y como quieres, incluso con condiciones complejas, y tus habilidades de manipulación de datos mejorarán drásticamente.
Por favor, utiliza el entorno de ejecución de SQL que te proporcionamos para probar varias condiciones. Con SQL, cuanto más escribes y más pruebas, mejor te vuelves. ¡Esperamos que este artículo sirva como un paso útil en tu viaje para convertirte en un maestro de SQL!