Volver a la lista de artículos Artículos
Lectura de 7 minutos

¿Qué es una consulta anidada en SQL?

¿Alguna vez quiso crear una consulta con varias sentencias SELECT? Buenas noticias. Puede hacer esto, y mucho más, con las consultas anidadas de SQL.

Si lleva tiempo aprendiendo SQL (y, quizás, escribiendo algunas consultas), probablemente se haya encontrado con casos en los que parece que hace falta otra expresión SELECT dentro de la expresión principal. A lo mejor, se pregunta: "¿Es posible utilizar SELECT anidadas en SQL?" Sí, es posible. En este artículo, explicaré el funcionamiento de las consultas anidadas (también conocidas como SELECT anidadas) y cómo utilizarlas de forma eficiente.

Si quiere realizar ejercicios prácticos de SQL, eche un vistazo a nuestro programa de enseñanza Ejercicio de SQL. Contiene múltiples cursos interactivos de SQL con ejercicios que cubren las expresiones SELECT anidadas y otras funciones complicadas de SQL.

¿Qué es una SELECT anidada?

Una SELECT anidada es una consulta dentro de otra consulta, es decir, una consulta SELECT dentro de la SELECT principal. Para aclarar el concepto, veamos juntos un ejemplo.

En este artículo vamos a trabajar con datos de un instituto ficticio. La base de datos incluye tres tablas, students, teachers y classes, que muestro a continuación:

students

idnameclass_idGPA
1Jack Black33.45
2Daniel White13.15
3Kathrine Star13.85
4Helen Bright23.10
5Steve May22.40

teachers

idnamesubjectclass_idmonthly_salary
1Elisabeth GreyHistory32,500
2Robert SunLiterature[NULL]2,000
3John ChurchillEnglish12,350
4Sara ParkerMath23,000

classes

idgradeteacher_idnumber_of_students
110321
211425
312128

Supongamos que quiere encontrar todos los alumnos (students) cuyo promedio de calificaciones (GPA) es superior a la media del instituto. Sin embargo, no conoce la media del promedio de calificaciones del instituto, pero puede utilizar la siguiente consulta para averiguarla:

SELECT AVG(GPA)
FROM students;

Obtendrá un número (3,19) que puede utilizar para resolver la tarea inicial (mostrar toda la información de los alumnos cuyo GPA sea superior a esta media). Lo podría hacer con la siguiente consulta:

SELECT *
FROM students
WHERE GPA > 3.19;

Pero, ¿puede resolver esta tarea con un solo paso? Sí, con una consulta anidada, de la siguiente manera:

SELECT *
FROM students
WHERE GPA > (
	SELECT AVG(GPA)
	FROM students);

Nuestra subconsulta devuelve un único valor (es decir, una tabla con solo una columna y una fila). Esto es importante para que el operador de comparación funcione. Una vez que la consulta interna devuelve la puntuación media del promedio de calificaciones, la consulta externa puede seleccionar los alumnos que satisfacen nuestra condición de filtrado (es decir, que la puntuación de su promedio de calificaciones sea superior a la media del instituto).

Y, este es el resultado:

idnameclass_idGPA
1Jack Black33.45
3Kathrine Star13.85

El término apropiado para esta expresión SELECT anidada es subconsulta. Existen muchos escenarios diferentes donde las subconsultas de SQL son muy útiles.

Más ejemplos de consultas anidadas de SQL

En primer lugar, puede poner una SELECT anidada dentro de la cláusula WHERE que tenga operadores de comparación o los operadores IN, NOT IN, ANY o ALL. El segundo grupo de operadores se utiliza cuando la subconsulta devuelve una lista de valores (en lugar de un único valor, como ocurría en el ejemplo anterior). Dichos operadores se utilizan en los siguientes casos:

  • El operador IN comprueba si un valor específico está en la tabla que la subconsulta devuelve.
  • El operador NOT IN muestra las filas que corresponden a los valores que no están presentes en la tabla que la subconsulta devuelve.
  • El operador ANY se utiliza con operadores de comparación para evaluar si alguno de los valores que la subconsulta devuelve cumple la condición.
  • El operador ALL también se utiliza con operadores de comparación para evaluar si todos los valores que la subconsulta devuelve cumplen la condición.

Veamos cómo funciona el operador IN. En este ejemplo, calcularemos el número medio de alumnos de las clases en las que el profesor imparte Historia (History) o Inglés (English):

SELECT AVG(number_of_students)
FROM classes
WHERE teacher_id IN (
	SELECT id
	FROM teachers
	WHERE subject = 'English' OR subject = 'History');

En este caso, se utiliza una subconsulta para seleccionar solo los ID de los profesores de Inglés o Historia. Observe que, nuestra subconsulta devuelve una lista de valores, es decir, una tabla con una columna(id) y varias filas que cumplen la condición de la consulta interna.

A continuación, nuestra consulta externa calcula el número medio de alumnos solo para las clases que cumplen la condición anterior. Para cada teacher_id, el operador IN comprueba si ese ID está presente en la tabla devuelta por la consulta interna; esto garantiza que solo se usarán en el cálculo las clases correspondientes a estos profesores.

Si desea conocer más ejemplos de uso de los operadores IN, NOT IN, ANY o ALL, consulte nuestra guía Subconsultas de SQL.

Varias subconsultas en una expresión

¿Está listo para más ejemplos difíciles? Porque, en realidad, se pueden escribir varias SELECT anidadas en una expresión.

Digamos que quiere mostrar toda la información sobre los alumnos de la clase que tiene el mayor número de alumnos. Para responder a esta pregunta, tendrá que encontrar cuál es el número mayor de alumnos y, luego, saber cuál es la clase que los tiene. Por último, tendrá que mostrar la información de los alumnos de esa clase.

Para responder a esta pregunta, se puede utilizar una subconsulta dentro de otra subconsulta, como en la siguiente expresión:

SELECT *
FROM students
WHERE class_id = (
	SELECT id
	FROM classes
	WHERE number_of_students = (
		SELECT MAX(number_of_students)
		FROM classes));

Es muy práctico, ¿verdad?

Usar subconsultas fuera de WHERE

Además, las subconsultas no solo se usan en las cláusulas WHERE; también se pueden utilizar consultas anidadas en cláusulas FROM. En el siguiente ejemplo, nuestra subconsulta no devuelve solo un valor, sino una tabla.

Ahora, vamos a averiguar en qué asignatura los profesores tienen el salario medio más alto. Primero, tendremos que calcular el salario medio por asignatura y, luego, utilizar esa tabla para encontrar el salario medio más alto. Lo podemos hacer mediante la siguiente consulta:

SELECT subject, MAX(salary_by_subject.avg_salary) AS max_salary
FROM (
	SELECT subject, AVG(monthly_salary) AS avg_salary
	FROM teachers
	GROUP BY subject) salary_by_subject;

Observe que la consulta interna devuelve una tabla con varias filas y columnas. Para ser más específicos, la tabla tiene dos columnas, subject y avg_salary, que muestran el salario medio de los profesores en función de su asignatura principal. El número de filas corresponde al número de asignaturas únicas que se imparten en el instituto (es decir, las que aparecen en la tabla teachers). También hay que especificar un alias para esta tabla (en este caso, utilizamos salary_by_subject).

A continuación, la consulta externa solo calcula el salario medio más alto basándose en la tabla salary_by_subject, y devuelve ese valor junto con el nombre de la asignatura correspondiente:

subjectmax_salary
Math3,000

Como puede ver, los profesores de Matemáticas (Math) de nuestro centro tienen el salario medio mensual más alto (3.000 dólares).

Para algunas tareas, es posible que necesite que la consulta interna utilice información de la consulta externa. Cuando dos consultas están relacionadas de esta manera, las llamamos subconsultas correlacionadas. Este es un tema más avanzado que explicamos muy bien en nuestra guía para principiantes sobre subconsultas correlacionadas y en este tutorial práctico sobre cómo escribir subconsultas correlacionadas.

Consejos adicionales sobre el uso de expresiones SELECT anidadas

Las subconsultas de SQL son una herramienta poderosa. Nos permiten realizar tareas de forma más eficiente, ya que se hacen con una sola consulta, en vez de varias.

Cuando utilice consultas anidadas, tenga en cuenta estas consideraciones:

  • Las subconsultas pueden devolver valores únicos o tablas (con una o varias filas y columnas).
  • Las subconsultas se pueden incluir en las siguientes cláusulas:
    • WHERE, para filtrar datos.
    • FROM, para especificar una tabla nueva.
    • SELECT, para especificar una columna específica.
    • HAVING, como un selector de grupo.
  • Las subconsultas deben ir siempre entre paréntesis ().
  • Cada sistema de gestión de bases de datos tiene sus limitaciones específicas en cuanto al número de niveles de subconsultas (por ejemplo, hasta 32 niveles en SQL Server). Sin embargo, en la práctica, rara vez se tendrán más de 2-3 niveles de consultas anidadas.
  • Las subconsultas suelen ser ineficientes desde el punto de vista computacional. Por lo tanto, le recomiendo que evite las consultas anidadas cuando haya otras opciones disponibles (por ejemplo, JOIN).

Es hora de practicar con las subconsultas de SQL.

Ahora que sabe tanto sobre las consultas anidadas de SQL, estará con ganas de empezar a practicar con ellas. Por suerte, tenemos MUCHOS ejercicios interactivos para que practique los diferentes tipos de subconsultas de SQL.

En primer lugar, nuestro curso SQL para principiantes tiene una gran sección de subconsultas. ¡Échelo un vistazo!

Si quiere usar las consultas anidadas de SQL con completa confianza, también le recomiendo que vea nuestro programa de enseñanza Ejercicio de SQL. Contiene cursos interactivos de SQL con ejercicios prácticos sobre subconsultas y otras construcciones difíciles de SQL.

Las subconsultas realmente le harán sentir que es un usuario de SQL mucho más experto. ¡Feliz aprendizaje!