Subconsultas en SQL

¿Qué son las subconsultas? ¿Cómo se usan? Te respondo a estas preguntas con ejemplos prácticos

consultas sql sql select

Si ya dominas las consultas SELECT de SQL con WHERE, GROUP BY o HAVING lo siguiente que debes aprender son las subconsultas SQL.

A continuación encontrarás el tutorial dividido en tres partes:

  • Respuesta a qué son las subconsultas.
  • Explicación de cómo se utilizan las subqueries en SQL.
  • Varios ejemplos de subconsultas, de más fácil a más complejo.

¿Qué es una subconsulta SQL?

Primero una definición: una subconsulta es una instrucción SELECT SQL anidada dentro de otra instrucción SELECT, INSERT, DELETE o UPDATE. Además, debes saber que se realizarán casi siempre dentro de la cláusula WHERE de las consultas.

Otra forma de explicarlo sería diciendo que tenemos un SELECT dentro de otra consulta SELECT, INSERT ... INTO, UPDATE o DELETE.

Además existen tres formas distintas de crear una subconsulta:

  1. Con ANY, ALL, SOME precediendo a la consulta anidada.
  2. Haciendo uso de la expresión IN o NOT IN antes de la subconsulta.
  3. EXISTS o NOT EXISTS y a continuación la subquery.

¿Cómo se usa una subconsulta SQL?

En esta parte me voy a centrar en las consultas anidadas dentro de la cláusula WHERE, ya que las consultas INSERT INTO las expliqué en otro artículo.

Para realizar una consulta de SQL con subqueries necesitaremos:

  • Una consulta normalmente formada del tipo SELECT, UPDATE o DELETE
  • Una cláusula WHERE o HAVING con las condiciones deseadas más uno de los operadores SQL anteriores (ANY, ALL,SOME,IN,NOT IN, EXISTS o NOT EXISTS) u operadores de comparación como "=", ">" o "<"
  • La consulta SELECT entre paréntesis.

Hay varias puntos importantes sobre su uso a tener en cuenta para evitar errores:

  • La subconsulta siempre irá entre paréntesis, sin excepciones.
  • Las subconsultas se pueden anidar dentro de otras subconsultas.
  • La subconsulta siempre deberá devolver el mismo tipo y número de valores a comparar: no puede haber una subconsulta que devuelva dos columnas para una comparación con 1 columna.
  • La subconsulta siempre debería (aunque no es obligatorio) de colocarse a la derecha del operador relacional.

Ahora que ya tienes la teoría rondando por tu cabeza, a continuación te enseño un pequeño ejemplo cumpliendo los tres puntos recién comentados.

Consulta SELECT de ejemplo

Primero voy a crear una consulta SELECT normal, que obtenga el nombre y apellidos de las filas de una tala llamada ciudadanos

SELECT nombre, apellidos
FROM ciudadanos

Añadir la cláusula WHERE

Ahora añado la cláusula WHERE a la consulta anterior y le voy a añadir uno de los operadores compatibles.

SELECT nombre, apellidos
FROM ciudadanos
WHERE dni IN ....

Subconsulta entre paréntesis

Y por último voy a realizar la subconsulta entre paréntesis que seleccione la columna DNI de una tabla "delincuentes":

SELECT nombre, apellidos
FROM ciudadanos
WHERE dni IN ( SELECT dni FROM delincuentes );

¡Ya está! Lo que ocurrirá ahora es que la base de datos hará:

  1. Primero resolver la subconsulta.
  2. Después comparara los valores devueltos por el DNI de la subconsulta con el dni de la consulta SELECT "PADRE".
  3. Devolverá los valores de la consulta principal como resultado de la consulta.

Ejemplos de subconsultas en SQL

Hora de los ejemplos. A partir de aquí voy a mostrarte varios ejemplos para que acabes de interiorizar las subconsultas.

Empezaré con un par de ejemplos sencillos, siguiendo la tónica del anterior apartado y continuaré con ejemplos más complejos y avanzados.

Para los siguientes ejemplos voy a crear 2 tablas:

  1. Tabla sobre videojuegos a la que llamaré videojuego
  2. Tabla sobre jugadores a la que llamaré jugador.

Las consultas CREATE SQL son las siguientes:

CREATE TABLE videojuego (
   id INT (11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
   titulo VARCHAR(100) NOT NULL,
   lenguaje VARCHAR(5) NOT NULL,
   resumen TEXT NULL,
   nota DECIMAL (3,1),
   total_jugadores INT DEFAULT 0
);

CREATE TABLE jugador(
   id INT (11) NOT NULL AUTO_INCREMENT,
   nombre VARCHAR(80) NOT NULL,
   edad INT NOT NULL,
   es_famoso INT NOT NULL DEFAULT 0,
   id_videojuego INT NOT NULL,
   FOREIGN KEY(id_videojuego) REFERENCES videojuego(id),
  fecha_registro DATE NULL
);

Ahora que ya tengo mis dos tablas vamos a realizar unas subconsultas.

Ejemplo subconsultas 1

Recuperar todos los juegos en los que al menos juega 1 jugador:

SELECT *
FROM videojuego
WHERE id IN ( SELECT id_videojuego FROM jugador );

Otra forma alternativa de realizar esta subconsulta sería utilizando la cláusula ANY o SOME:

SELECT *
FROM videojuego
WHERE id = ANY ( SELECT id_videojuego FROM jugador );

//alternativa con SOME

SELECT *
FROM videojuego
WHERE id = SOME ( SELECT id_videojuego FROM jugador );

Realmente las dos condiciones son iguales ya que SOME es un ALIAS de ANY, lo que quiere decir que son el mismo comando.

Ejemplo de subqueries 2

En el siguiente ejemplo seleccionaré todos los jugadores que juegan a un juego en Español:

SELECT nombre, es_famoso
FROM jugador
WHERE id_videojuego IN ( SELECT id FROM videojuego WHERE lenguaje = 'es' );

Ejemplo 3 de consultas anidadas

Ahora voy a realizar otra consulta con una subconsulta y funciones agregadas, en concreto utilizando MAX.

Para demostrártelo selecciono los jugadores que tienen la mayor edad entre los jugadores:

SELECT nombre, apellidos
FROM jugador
WHERE edad = ( SELECT MAX(edad) FROM jugador );

Ejemplo 4 subconsulta con subconsulta anidada

En este ejemplo voy a subir un poco la dificultad, voy a mostrarte las posiblidades casi infinitas de las subqueries utilizando para ello una subconsulta anidada dentro de otra subconsulta. Lo entenderás mejor con el ejemplo.

Recuerda: Las subconsultas se resuelven antes que su consulta principal

SELECT *
FROM videojuego
WHERE lenguaje IN ( SELECT lenguaje FROM videojuego WHERE id = SOME ( SELECT id_videojuego FROM jugador WHERE es_famoso = 1 ) );

¿Lo has entendido? La consulta en su totalidad selecciona todos los videojuegos de uno de los lenguajes a los que juega algún jugador famoso.

En orden de ejecución de las subconsultas ( de la última a la principal) selecciono:

  1. El ID de todos los jugadores famosos
  2. El lenguaje de todos los videojuegos que si ID coincide con el ID de los jugadores famosos.
  3. Todos los datos de los videojuegos que su lenguaje coincide con alguno de los idiomas de la subconsulta del punto 2.

#5 Ejemplo de subconsulta con UPDATE SQL

Creo que con las consultas SELECT se ven todas las posibilidades de las subconsultas, pero para que veas de forma gráfica un ejemplo de como usarlas en UPDATE o DELETE te dejo ahora un ejemplo.

En concreto, voy a añadir 1 al contador de total_jugadores de aquellos videojuegos que tienen un jugador jugandolo en la fecha '2019-12-01'

UPDATE videojuego
SET total_jugadores = jugadores + 1
WHERE id IN ( SELECT id_videojuego FROM jugador WHERE fecha = '2019-12-01' )

Conclusión sobre la subconsultas SQL

Bueno, no he querido enrollarme más, continuaré con las subconsultas si es necesario en otro artículo.

¡Espero que te hay asido de utilidad! Si es así, estaría genial que dejaras un comentario con alguna duda/aporte para entre todos mejorar el artículo. Además, si lo compartes, nos ayudarás a seguir motivados y en crear contenido útil para programadores de todo el mundo.

¡Gracias!

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Cargando comentarios

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.