Introducción
Imagina que estás intentando encontrar una pieza específica de información en una biblioteca gigante donde algunos libros tienen otros libros más pequeños dentro. Para encontrar la respuesta correcta, es posible que primero tengas que mirar los libros más pequeños y luego usar esa información para encontrar el más grande. ¡Así es exactamente como funcionan las consultas anidadas en SQL! Al colocar una consulta dentro de otra, puedes extraer datos complejos con facilidad. En esta guía, exploraremos cómo funcionan las consultas anidadas y cómo puedes aprovechar su poder en SQL para una administración de bases de datos más eficiente.
Resultado del aprendizaje
- Comprenda qué son las consultas anidadas (subconsultas) en SQL.
- Escribir e implementar consultas anidadas dentro de varias declaraciones SQL.
- Distinguir entre consultas anidadas correlacionadas y no correlacionadas.
- Optimice las consultas SQL utilizando estructuras anidadas para mejorar el rendimiento.
¿Qué son las consultas anidadas en SQL?
Una consulta anidada, también conocida como subconsulta, es una consulta SQL que se coloca dentro de otra consulta SQL. La consulta externa utiliza el resultado de la consulta interna (la subconsulta) para lograr el resultado deseado. Este enfoque es particularmente útil cuando los resultados de la consulta interna dependen de los datos recuperados por la consulta externa.
Sintaxis básica
SELECT column_name(s)
FROM table_name
WHERE column_name = (SELECT column_name FROM table_name WHERE condition);
Tipos de consultas anidadas en SQL
Las consultas anidadas, también conocidas como subconsultas, permiten realizar recuperaciones de datos complejas mediante la incorporación de una consulta SQL dentro de otra. Esta función es esencial para escribir código SQL eficiente y gestionar operaciones complejas de bases de datos. En esta sección, exploraremos los diferentes tipos de consultas anidadas, junto con ejemplos y resultados esperados.
Subconsulta de una sola fila en SQL
Una subconsulta de una sola fila es un tipo de consulta anidada que genera una o más columnas en una sola fila. Es muy común en las instrucciones SQL en las que se desea utilizar un operador de comparación o una condición con respecto a un único valor, como =, , etc.
Características principales de las subconsultas de una sola fila
- Devuelve una fila: Debido al nombre asignado, se puede esperar una sola fila de datos.
- Generalmente se utiliza con operadores de comparación: Generalmente se utiliza con operadores como =, >, =, <= etc.
- Puede devolver una o más columnas: Aunque devuelve una sola fila, puede devolver varias columnas.
Ejemplo: Busque empleados que ganen más que el salario promedio
Mesa: employees
id_empleado | nombre de pila | apellido | salario | id_departamento |
---|---|---|---|---|
1 | John | Gama | 90000 | 1 |
2 | Jane | Herrero | 95000 | 1 |
3 | Alicia | Johnson | 60000 | 2 |
4 | Chelín | Marrón | 65000 | 2 |
5 | Charlie | Davis | 40000 | 3 |
6 | Víspera | Adán | 75000 | 3 |
Mesa: departments
id_departamento | nombre_del_departamento | id_ubicación |
---|---|---|
1 | Ventas | 1700 |
2 | Marketing | 1700 |
3 | ÉL | 1800 |
4 | HORA | 1900 |
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
Producción:
| first_name | last_name | salary |
|------------|-----------|--------|
| John | Doe | 90000 |
| Jane | Smith | 95000 |
Por ejemplo, en el ejemplo, la consulta interna (SELECT AVG(salary) FROM employee) busca los salarios promedio de todos los empleados. La consulta externa obtiene el nombre, apellido y salario de todos los empleados cuyos ingresos son superiores a esta cifra.
Subconsulta de varias filas en SQL
La subconsulta de varias filas es un tipo de consulta anidada que devuelve, por lo tanto, más de una fila de datos. Se suele utilizar con los operadores IN, ANY o ALL para comparar una columna con un conjunto de valores devueltos por la subconsulta. Una de las ventajas de utilizar una subconsulta de varias filas es que combina los resultados de una lista de valores y aplica varias filas para realizar los cálculos.
Ejemplo: Buscar empleados en determinados departamentos
SELECT first_name, last_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
Producción:
| first_name | last_name |
|------------|-----------|
| Alice | Johnson |
| Bob | Brown |
Aquí, la consulta interna recupera department_id
s de la departments
mesa donde se encuentra la location_id
es 1700. La consulta externa luego busca empleados que trabajan en estos departamentos.
Subconsulta correlacionada en SQL
Una subconsulta correlacionada es un tipo de consulta anidada en SQL. Depende de la consulta externa para obtener sus valores. Mientras que una subconsulta normal puede ejecutarse de forma independiente, una subconsulta correlacionada calcula en relación con cada fila procesada por la consulta externa, por lo que es dinámica y sensible al contexto.
Características de las subconsultas correlacionadas
- Dependencia:La consulta interna hace referencia a las columnas de la consulta externa, estableciendo una dependencia directa.
- Ejecución fila por fila:La consulta interna se ejecuta varias veces: una por cada fila procesada por la consulta externa.
- Consideraciones de rendimiento:Debido a que la consulta interna se ejecuta repetidamente, las subconsultas correlacionadas pueden ser más lentas que sus contrapartes no correlacionadas, especialmente en conjuntos de datos grandes.
Ejemplo: Buscar empleados con salarios superiores al promedio de su departamento
SELECT first_name, salary
FROM employees e1
WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e1.department_id = e2.department_id);
Producción:
| first_name | salary |
|------------|--------|
| John | 90000 |
| Jane | 95000 |
En este caso, la consulta interna calcula el salario promedio de cada departamento mientras que la consulta externa procesa a cada empleado. La consulta externa selecciona a los empleados que ganan más que el salario promedio de su departamento.
Subconsultas anidadas en SQL
Una subconsulta anidada también se conoce como consulta anidada. Se trata de una consulta interna o una consulta ubicada dentro de otra consulta, donde una consulta aparece dentro de otra. Estas consultas resultan muy útiles para acceder a datos difíciles y transformarlos de formas muy específicas, lo que permite dividir problemas complejos en partes más constituyentes y manejables, lo que hace que sea mucho más fácil consultar bases de datos relacionales.
Estructura de subconsultas anidadas
Una subconsulta anidada normalmente consta de dos componentes principales:
- Consulta externa: Esta es la consulta principal que contiene la subconsulta. Utiliza el resultado de la subconsulta para filtrar o manipular datos.
- Consulta interna (subconsulta): Esta consulta está integrada dentro de la consulta externa y proporciona un conjunto de resultados que la consulta externa puede utilizar.
Ejemplo: Buscar departamentos con empleados que ganan más que el salario promedio
SELECT department_id, department_name
FROM departments
WHERE department_id IN (
SELECT department_id
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
);
Producción:
| department_id | department_name |
|---------------|------------------|
| 1 | Sales |
| 2 | Marketing |
En este ejemplo, la consulta más interna (SELECT AVG(salary) FROM employee) toma el promedio. La consulta del medio obtendrá los department_ids de los empleados que ganan más que ese promedio y la consulta externa recuperará los nombres de los departamentos que se les asignaron.
Subconsulta escalar
Una subconsulta escalar se define como una subconsulta que proporciona un único valor, una única fila y una única columna. Por lo tanto, las subconsultas escalares son muy útiles cuando se requiere un único valor en la consulta principal. Las subconsultas escalares se pueden utilizar en muchas cláusulas SQL como SELECT, WHERE y HAVING.
Características de las subconsultas escalares
- Devuelve un valor: Como sugiere su nombre, la subconsulta escalar solo devuelve un único valor. Cualquier subconsulta que intente devolver una fila que no sea una única o una columna que no sea una única generará un error.
- Usado en varias cláusulas: Las columnas derivadas se pueden calcular en las instrucciones SELECT, limitando los resultados en las cláusulas WHERE y agregando condiciones a una colección de datos dentro de una cláusula HAVING, todo con la ayuda de estas subconsultas escalares dentro de esta cláusula.
- Eficiente para comparaciones: A menudo se utilizan para realizar comparaciones con un único valor derivado de otra consulta.
Ejemplo: Recuperar empleados y su diferencia salarial con respecto al salario promedio
SELECT first_name, last_name, salary - (SELECT AVG(salary) FROM employees) AS salary_difference
FROM employees;
Producción:
| first_name | last_name | salary_difference |
|------------|-----------|-------------------|
| John | Doe | 10000 |
| Jane | Smith | 15000 |
En este caso, la subconsulta escalar calcula el salario promedio una vez y la consulta externa calcula la diferencia entre el salario de cada empleado y el promedio.
Casos de uso para consultas anidadas
Las consultas anidadas, o subconsultas, son herramientas poderosas en SQL que pueden resolver una variedad de desafíos complejos de recuperación de datos. A continuación, se muestran algunos casos de uso comunes:
Filtrado de datos
Las consultas anidadas se pueden utilizar para filtrar resultados según valores derivados de otra tabla.
Ejemplo: Encuentre empleados cuyos salarios estén por encima del salario promedio en sus respectivos departamentos.
SELECT first_name, last_name, salary
FROM employees e1
WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e1.department_id = e2.department_id);
Cálculo de agregados
Puede calcular agregados en una consulta anidada y utilizar esos resultados en la consulta externa.
Ejemplo: Recuperar departamentos con un salario promedio mayor que el salario promedio general.
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);
Lógica condicional
Las consultas anidadas le permiten implementar lógica condicional dentro de sus declaraciones SQL.
Ejemplo: Enumere los empleados que pertenecen a departamentos ubicados en una ciudad específica.
SELECT first_name, last_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE city = 'New York');
Subconsultas correlacionadas para cálculos a nivel de fila
Las subconsultas correlacionadas permiten realizar cálculos a nivel de fila basados en valores de la fila actual en la consulta externa.
Ejemplo: Obtenga una lista de productos con un precio superior al precio promedio de los productos de la misma categoría.
SELECT product_name, price
FROM products p1
WHERE price > (SELECT AVG(price) FROM products p2 WHERE p1.category_id = p2.category_id);
Diferencias entre consultas anidadas y otras consultas SQL
Veamos ahora la diferencia entre las consultas anidadas y otras consultas SQL a continuación:
Característica | Consultas anidadas | Se une | Consultas simples |
---|---|---|---|
Definición | Una consulta colocada dentro de otra consulta | Combina filas de dos o más tablas según una columna relacionada | Una única declaración SQL que recupera datos |
Ejecución | Ejecuta la consulta interna para cada fila procesada por la consulta externa | Se ejecuta simultáneamente para todas las filas de ambas tablas | Se ejecuta de forma independiente sin ninguna dependencia. |
Caso de uso | Útil para cálculos complejos y filtrado basado en otra consulta. | Ideal para combinar datos relacionados de varias tablas | Adecuado para una recuperación de datos sencilla |
Actuación | Puede provocar un rendimiento más lento debido a la ejecución repetida de la consulta interna. | Generalmente más eficiente ya que procesa los datos de una sola vez. | El más rápido para la recuperación de datos simples |
Complejidad | Puede volverse complejo y difícil de leer. | También puede ser complejo, pero normalmente es más claro con relaciones explícitas. | Sencillo y fácil de entender. |
Dependencia de datos | La consulta interna puede depender del resultado de la consulta externa | Los datos de las tablas unidas son independientes entre sí | Los datos recuperados son independientes, no hay subconsultas involucradas |
Ejemplo | SELECT first_name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); |
SELECT e.first_name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id; |
SELECT * FROM employees; |
Errores comunes en las consultas anidadas
Si bien las consultas anidadas pueden ser increíblemente útiles, también tienen sus inconvenientes. A continuación, se indican algunos errores comunes a los que hay que prestar atención:
Devolución de varias filas
Una subconsulta escalar debe devolver un único valor; si devuelve varias filas, provocará un error.
Error:
SELECT first_name
FROM employees
WHERE salary = (SELECT salary FROM employees);
Solución: Asegúrese de que la consulta interna utilice agregación o filtrado para devolver un único valor.
Problemas de rendimiento
Las consultas anidadas a veces pueden generar cuellos de botella en el rendimiento, especialmente si se ejecutan para cada fila de la consulta externa.
Error: Usar una consulta anidada dentro de una consulta externa grande sin considerar las implicaciones de rendimiento.
Solución: Analice los planes de ejecución de consultas y considere métodos alternativos, como uniones, cuando trabaje con grandes conjuntos de datos.
Uso inadecuado de paréntesis
La colocación incorrecta de paréntesis puede generar resultados inesperados o errores.
Error:
SELECT first_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id);
Solución: Asegúrese de que la lógica de su consulta sea clara y que los paréntesis se utilicen adecuadamente para agrupar las condiciones.
No considerar valores nulos
Las consultas anidadas pueden producir resultados inesperados cuando hay valores NULL en los datos.
SELECT first_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id IS NOT NULL);
Solución: Manejar valores NULL explícitamente usando funciones como COALESCE
para evitar filtrados involuntarios.
Conclusión
Las consultas anidadas de SQL, también conocidas como subconsultas, son muy útiles para llevar a cabo operaciones de recuperación de datos altamente complejas de manera eficiente. Puede incrustar una consulta dentro de otra para realizar cualquier cálculo sobre los datos que no se pueda realizar con consultas simples por sí solas. Será útil conocer cuatro tipos principales de consultas: consultas de una sola fila, consultas de varias filas, consultas correlacionadas y consultas escalares. Si aplica las mejores prácticas y evita algunos errores comunes, podrá aprovechar todo el potencial de las consultas anidadas para mejorar la administración y el rendimiento de su base de datos.
Preguntas frecuentes
A. Una consulta anidada, o subconsulta, es una consulta SQL ubicada dentro de otra consulta. El resultado de la consulta interna es utilizado por la consulta externa para realizar una recuperación de datos compleja.
A. Los tipos principales incluyen subconsultas de una sola fila, subconsultas de varias filas, subconsultas correlacionadas y subconsultas escalares, cada una de las cuales atiende diferentes casos de uso.
A. Utilice una subconsulta correlacionada cuando la consulta interna necesita hacer referencia a una columna de la consulta externa, lo que permite evaluaciones dinámicas fila por fila.
A. Sí, las consultas anidadas pueden generar problemas de rendimiento, especialmente si se ejecutan para cada fila de la consulta externa. Analizar los planes de ejecución y considerar alternativas como las uniones puede ayudar a mejorar la eficiencia.