Pregunta 1¿Cuál de los siguientes es el orden correcto en que se evalúan las cláusulas SQL?
Componer consultas — combinar JOIN, subconsultas y UNION
Aprende a hacer crecer una sola consulta paso a paso combinando JOIN, subconsultas y UNION con WHERE / ORDER BY / LIMIT, todo ejecutándose en vivo en tu navegador.
Datos usados en este artículo — employee / department / sales
JOIN (conectar varias tablas), las subconsultas (una consulta dentro de una consulta) y UNION (apilar resultados verticalmente) funcionan cada uno por su cuenta, pero cuando los combinas con WHERE / ORDER BY / LIMIT puedes escribir consultas prácticas del mundo real.
En este artículo recorrerás, en orden, cómo combinar estas técnicas y hacerlas crecer en una sola consulta.
El material son tres tablas de empleados — employee (30 empleados), department (6 departamentos) y sales (50 líneas de venta).
Empezarás con un JOIN simple, y luego construirás a través de subconsultas y UNION paso a paso.
Fija el orden en que se evalúan las cláusulas — JOIN, WHERE, ORDER BY, LIMIT
El orden en que escribes una consulta (SELECT … FROM … WHERE … ORDER BY) es diferente del orden en que se evalúa.
La base de datos primero conecta tablas con FROM / JOIN, luego reduce filas con WHERE, agrega con GROUP BY / HAVING, construye columnas con SELECT, y finalmente ordena con ORDER BY y limita el número de filas con LIMIT.
Una vez que dominas este orden, reglas como "para filtrar sobre un resultado agregado usa HAVING, no WHERE" y "LIMIT surte efecto después de ordenar" empiezan a tener sentido.
-- JOIN + WHERE + ORDER BY: empleados de departamentos en Osaka, ordenados por fecha de contratación
SELECT emp.name, dept.dept_name, emp.hired_on
FROM employee emp
JOIN department dept ON dept.dept_id = emp.dept_id
WHERE dept.location = 'Osaka'
ORDER BY emp.hired_on;
Construir un valor de referencia con una subconsulta y reducir el resultado del JOIN
Una subconsulta se puede usar para construir el "valor de referencia" que necesitas para reducir aún más un resultado que ensamblaste con JOIN.
Un valor de criterio que cambia por empleado, como "el salario promedio de mi propio departamento", se calcula con una subconsulta correlacionada (una subconsulta que se recalcula para cada empleado individual) que referencia la fila exterior.
Cuando adjuntas el nombre del departamento con JOIN y reduces filas usando una condición de subconsulta correlacionada, varias piezas de sintaxis encajan juntas en una sola consulta.
-- JOIN + subconsulta correlacionada: empleados cuyo salario es igual al máximo de su propio departamento (el que más gana del departamento)
SELECT emp.name, dept.dept_name, emp.salary
FROM employee emp
JOIN department dept ON dept.dept_id = emp.dept_id
WHERE emp.salary = (
SELECT MAX(dept_member.salary)
FROM employee dept_member
WHERE dept_member.dept_id = emp.dept_id
);
Combinar dos perspectivas con UNION y rematar con ORDER BY
UNION apila los resultados de dos SELECT verticalmente.
El SELECT superior y el inferior deben ser compatibles UNION (el mismo número de columnas, con los tipos de las columnas correspondientes siendo compatibles).
UNION colapsa en una las filas totalmente idénticas (eliminando duplicados), mientras que UNION ALL conserva los duplicados tal cual.
La ordenación y los límites de número de filas se aplican al resultado combinado en su conjunto, así que escribe ORDER BY / LIMIT una sola vez, al final del todo.
-- UNION ALL: apila dos perspectivas verticalmente con una columna de etiqueta (conserva duplicados)
SELECT name, 'Kyoto' AS via FROM employee WHERE city = 'Kyoto'
UNION ALL
SELECT emp.name, 'HighSales' AS via
FROM employee emp
JOIN sales sale ON sale.emp_id = emp.emp_id
GROUP BY emp.emp_id
HAVING SUM(sale.amount) >= 1500000
ORDER BY name;
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Cuál es la explicación correcta de WHERE emp.salary > (SELECT AVG(dept_member.salary) FROM employee dept_member WHERE dept_member.dept_id = emp.dept_id)?
Pregunta 3Cuando conectas dos SELECT con UNION y ordenas todo por nombre, ¿cuál es la forma correcta de escribir ORDER BY?