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

Guía para principiantes de la subconsulta SQL

Las subconsultas son un poderoso recurso de SQL que nos permite combinar datos de varias tablas en una sola consulta. En este artículo, te enseñaremos todo lo que necesitas para empezar a utilizar las subconsultas.

Quizás la definición más simple de una subconsulta SQL es "Una consulta dentro de otra consulta". Las subconsultas son tan fáciles de entender que a menudo aparecen en los primeros capítulos de los cursos de SQL.

Sin embargo, hay muchas variantes de subconsultas que deben ser explicadas. Y aunque las subconsultas se usan generalmente en la cláusula WHERE, puedes usarlas en otras cláusulas, como FROM, HAVING y SELECT.

En resumen, hay mucho más que saber sobre las subconsultas que lo que son y dónde van. Así que, empecemos con nuestro primer ejemplo de subconsulta SQL para principiantes.

Subconsultas Básicas por Ejemplo

Antes de entrar en las subconsultas, necesitamos explicar las tablas de nuestra base de datos. Para relajar nuestras mentes en esta época de distanciamiento social, utilizaré ejemplos relacionados con lugares hermosos y relajantes. Nuestra base de datos de ejemplo tendrá dos tablas. La primera tabla se llama best_10_places y almacena los 10 mejores lugares para diferentes tipos de actividades (como el buceo, el esquí y el senderismo). La tabla tiene columnas para el nombre del lugar, la actividad que podemos hacer allí, el ranking de este lugar, y la ciudad más cercana. Echa un vistazo:

Place_NameActivityRanking_PositionClosest_City
Praia do Sepulturasnorkeling1Florianopolis
Hanauma Baysnorkeling2Honolulu
Elliot Islandsnorkeling3Melbourne
Cerro Catedralskiing1Bariloche
Camino de Santiagotrekking1Compostela
Cerro Ottotrekking2Bariloche
Black Vulcanotrekking3Honolulu

Tabla: best_10_places


Si quieres viajar a cualquiera de estos hermosos lugares, necesitarás un billete; la one_way_ticket tabla tiene un registro para cualquier par de ciudades que estén conectadas por cualquier tipo de transporte. Utilizaremos esta tabla para determinar cómo ir de una ciudad a otra. Las columnas contienen información sobre la ciudad de origen, la ciudad de destino, el precio del billete, la duración del viaje y el tipo de transporte (por ejemplo, tren, avión, etc.). A continuación se muestra un subconjunto de esta tabla:

City_OriginCity_DestinationTicket_PriceTravel_TimeTransportation
ParisFlorianopolis830.0011hr 30 minair
ParisHonolulu1564.0015hr 20 minair
ParisMelbourne2200.0018hr 50minair
ParisBariloche970.0012hr 20 minair
MadridCompostela80.001hr 10minair

Tabla: one_way_ticket


Ahora estamos listos para el primer ejemplo. Supongamos que una persona en París quiere ir al lugar número 1 del mundo para hacer snorkel. ¿Qué tipo de transporte va de París a este lugar?

Como probablemente sepa, la consulta SQL más sencilla está formada por una cláusula SELECT, una FROM y (opcionalmente) una WHERE. Y como ya hemos dicho, una subconsulta es una consulta dentro de otra consulta. Así, en el siguiente ejemplo verás dos consultas: la consulta principal (también llamada consulta externa) y la subconsulta(en azul):

SELECT city_destination, transportation, ticket_price, travel_time
FROM one_way_ticket
WHERE city_destination = (
    SELECT closest_city
    FROM best_10_places
    WHERE activity_type = 'snorkeling'
      AND ranking_position = 1
  )
  AND city_origin = 'Paris'

La subconsulta se ejecuta primero, devolviendo el closest_city al mejor destino de buceo (la ciudad de Florianópolis en Brasil). A continuación se ejecuta la consulta principal, sustituyendo la subconsulta por su resultado (Florianópolis). El resultado final es:

City_DestinationTransportationTicket_PriceTravel_Time
Florianopolisair$ 830.0011hr 30 min

Al utilizar subconsultas:

  • Siempre hay que encerrar la subconsulta entre paréntesis.
  • Preste atención al operador utilizado para comparar el resultado de la subconsulta. En nuestro ejemplo anterior, utilizamos "="; sin embargo, este operador debe utilizarse con subconsultas que devuelven una sola fila y una sola columna (también conocidas como subconsultas "escalares").

Le sugiero que lea el artículo Subconsultas SQL para ver más ejemplos de subconsultas para principiantes explicados en detalle. Las subconsultas también forman parte de nuestro SQL para principiantes curso, un tutorial paso a paso que te lleva a través de los fundamentos de SQL usando ejemplos y ejercicios.

Subconsultas escalares o no escalares: Esa es la cuestión

Entonces, una subconsulta escalar devuelve una sola columna con una sola fila. ¿Qué es una subconsulta no escalar? Una subconsulta que devuelve múltiples filas.

Hay muchos operadores que podemos usar para comparar una columna con una subconsulta. Sin embargo, algunos de ellos sólo pueden utilizarse con subconsultas escalares: =, >, >=, < y <=. Si utiliza uno de estos operadores, su subconsulta debe ser escalar.

Veamos un ejemplo con una subconsulta escalar. Suponga que tiene un cliente que quiere ir de París a Bariloche. Antes de comprar el billete, el cliente quiere ver si hay algún lugar con un billete más barato. La siguiente consulta encontrará esas ciudades:

SELECT city_destination, ticket_price, travel_time, transportation
FROM one_way_ticket
WHERE ticket_price < (
    SELECT ticket_price
    FROM one_way_ticket
    WHERE city_destination = 'Bariloche'
      AND city_origin = 'Paris'
  )
  AND city_origin = 'Paris'

De nuevo, la subconsulta se ejecuta primero; su resultado (el precio de un billete París-Bariloche, o 970 dólares) se compara con la columna ticket_price en la consulta externa. Así se obtienen todos los registros de one_way_ticket con un valor de ticket_price inferior a 970 dólares. El resultado de la consulta se muestra a continuación:

City_DestinationTicket_PriceTravel_TimeTransportation
Florianopolis830.0011hr 30 minair
Compostela80.001hr 10minair

Otros operadores, como IN, EXISTS o NOT EXISTS, > ALL, = ANY, pueden utilizarse con subconsultas escalares o no escalares.

Nuestro siguiente ejemplo utiliza el operador IN. Supongamos que la persona que ha preguntado por el mejor lugar para hacer snorkel quiere explorar otros destinos; de hecho, le gustaría ver los tres mejores lugares para hacer snorkel. El cambio en nuestra subconsulta es claro: sólo tenemos que cambiar “ranking_position = 1” por “ranking_position <= 3”. Sin embargo, nuestra subconsulta devolverá tres registros y ya no será escalar. Utilizaremos el operador IN, así:

SELECT city_destination, transportation, ticket_price, travel_time
FROM one_way_ticket
WHERE city_destination IN (
    SELECT closest_city
    FROM best_10_places
    WHERE activity_type = 'snorkeling'
      AND ranking_position <= 3
  )
  AND city_origin = 'Paris'

Como en el ejemplo anterior, la base de datos ejecuta primero la subconsulta, que devuelve una lista de tres ciudades (las ciudades más cercanas a los 3 principales destinos de buceo: Florianópolis, Honolulu y Melbourne). A continuación, se ejecuta la consulta externa con estas condiciones:

city_destination IN ('Florianopolis', 'Honolulu', 'Melbourne')

El operador IN devuelve TRUE cuando el valor de city_destination es una de estas tres ciudades. Así, la consulta principal devuelve el siguiente resultado:

City_DestinationTransportationTicket_PriceTravel_Time
Florianopolisair$ 830.0011hr 30 min
Honoluluair$ 1564.0015hr 20 min
Melbourneair$ 2200.0018hr 50min

Si quiere profundizar en los matices de las subconsultas SQL, consulte el capítulo de subconsultas de nuestro curso interactivo SQL para principiantes donde encontrarás varios ejemplos y muchos ejercicios de práctica.

Subconsultas avanzadas

El concepto de subconsulta es fácil de entender. Pero debido a la flexibilidad de SQL, las subconsultas pueden utilizarse de muchas formas diferentes. Cubrir todos los usos posibles está más allá del alcance de este artículo. Lo que haremos en cambio es demostrar algunos de los usos más importantes.

¿En cuántos lugares diferentes se puede colocar una subconsulta?

Las subconsultas pueden utilizarse en diferentes lugares de una consulta SQL, incluyendo las cláusulas WHERE, FROM, HAVING, y SELECT; además, una subconsulta también puede utilizarse como parte de una sentencia UPDATE, DELETE, o INSERT. En el siguiente ejemplo, veremos cómo utilizar una subconsulta en la cláusula FROM.

Supongamos que el propietario de la agencia de viajes quiere mostrar cada ciudad junto con el coste del billete y la cantidad de "mejores lugares" cerca de esta ciudad. Para obtener la cantidad de "mejores lugares" de cada ciudad, utilizaremos una subconsulta (mostrada en azul) en la cláusula FROM para crear una pseudotabla. A continuación, la consulta externa será JOIN con one_way_ticket y la pseudotabla.

SELECT city_destination, ticket_price, pseudo_table.quantity
FROM one_way_ticket
JOIN (
    SELECT closest_city AS city, count(*) AS quantity
    FROM best_10_places
    GROUP BY 1
  ) pseudo_table
  ON one_way_ticket.pseudo_table.city

El resultado de esta consulta es:

City_DestinationTicket_PriceQuantity
Florianopolis830.001
Honolulu1564.002
Melbourne2200.001
Bariloche970.002
Compostela80.001

Para más información sobre el uso de subconsultas en otras sentencias SQL, lea Subconsultas en sentencias UPDATE y DELETE. Este artículo tiene varios ejemplos con código SQL que está listo para copiar y pegar si quieres probarlo.

EXISTS: Un operador orientado a la subconsulta

Uno de los operadores más potentes que puedes utilizar con las subconsultas es el operador EXISTS. Como podemos ver en el siguiente ejemplo, el operador EXISTS debe ir antes de la subconsulta. Devolverá TRUE si la subconsulta devuelve al menos una fila - sin importar el contenido de la fila. Si la subconsulta devuelve 0 filas, EXISTS devolverá FALSE.

Para el siguiente ejemplo, supongamos que nuestro cliente de París quiere viajar a un lugar donde pueda hacer tanto senderismo como buceo. Para responder a este cliente se puede utilizar la siguiente consulta:

SELECT city_destination, transportation, ticket_price, travel_time
FROM one_way_ticket
WHERE EXISTS (
    SELECT closest_city
    FROM best_10_places
    WHERE activity_type = 'snorkeling'
      AND closest_city = one_way_ticket.city_destination
  )
  AND EXISTS (
    SELECT closest_city
    FROM best_10_places
    WHERE activity_type = 'trekking'
    AND closest_city = one_way_ticket.city_destination
  )
  AND city_origin = 'Paris'

El resultado muestra los registros relacionados con ciudades con actividades de senderismo y snorkel:

City_DestinationTransportationTicket_PriceTravel_Time
Honoluluair$ 1564.0015hr 20 min

Un punto interesante de la subconsulta anterior es la referencia a la columna one_way_ticket.city_destination en la consulta externa. Las subconsultas que hacen referencia a columnas de la consulta externa se denominan "subconsultas correlacionadas" y tienen algunos comportamientos específicos. Como en el ejemplo anterior, las subconsultas correlacionadas suelen utilizarse con los operadores de subconsulta EXISTS y NOT EXISTS.

Las subconsultas correlacionadas son un poderoso recurso de SQL. En ciertos escenarios, son la forma natural de resolver un problema. Si está interesado en este tema, le sugiero que lea Correlated Subquery in SQL: A Beginner's Guide y Learn to Write a SQL Correlated Subquery in 5 Minutes.

Los operadores ALL y ANY

Este par de operadores funciona junto con los operadores =, <>, >, >=, < y <=, añadiendo más expresividad al lenguaje. Debido al elevado número de combinaciones posibles con ALL y ANY, he incluido una tabla con los usos más comunes de estos operadores:

ConditionReturns TRUE if ...Returns FALSE if ...
Where 10 > ANY ( subquery )The subquery returns at least one value that’s greater than 10.All returned values are 10 or less.
Where 10 > ALL ( subquery )The subquery returns only values greater than 10.The subquery returns at least one value of 10 or less.
Where 10 = ANY (subquery)The subquery returns at least one value equal to 10.No returned values are equal to 10.
Where 10 = ALL (subquery)All values returned by subquery are 10.At least one returned value is not equal to 10.

Apliquemos este operador a un ejemplo de la vida real. Supongamos que queremos promocionar todos los "mejores lugares del mundo" que se pueden visitar con un billete de menos de 1.000 dólares. Cada "mejor lugar" de la tabla best_10_places puede tener muchos billetes posibles; sólo nos interesan los lugares en los que al menos un billete cuesta menos de 1.000 dólares. La consulta es la siguiente:

SELECT Place_name, Activity, Ranking_position
FROM best_10_places
WHERE 1000 > ANY (
    SELECT ticket_price
    FROM one_way_ticket
    WHERE city_destination = best_10_places.closest_city
  )

A continuación se muestran los resultados de la consulta anterior. Puedes ir al mejor lugar para realizar cualquier actividad (esnórquel, esquí y senderismo) por menos de 1.000 dólares.

Place_NameActivityRanking_Position
Praia do Sepulturasnorkeling1
Cerro Catedralskiing1
Camino de Santiagotrekking1
Cerro Ottotrekking2

Sus próximos pasos con las subconsultas

En este artículo, he explicado las subconsultas y he mostrado varios ejemplos de cómo utilizarlas. Sin embargo, este tema tiene muchas variaciones, incluyendo los diferentes tipos de subconsultas y operadores. Para tener una comprensión más completa de las subconsultas, sugiero que tomes un curso en línea como el de LearnSQL.es SQL para principiantes o leer los artículos adicionales que he mencionado.