21st Jul 2022 Lectura de 9 minutos Guía para principiantes de la subconsulta SQL Ignacio L. Bisso SQL aprender SQL subconsulta Índice Subconsultas Básicas por Ejemplo Subconsultas escalares o no escalares: Esa es la cuestión Subconsultas avanzadas ¿En cuántos lugares diferentes se puede colocar una subconsulta? EXISTS: Un operador orientado a la subconsulta Los operadores ALL y ANY Sus próximos pasos con las subconsultas 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. Tags: SQL aprender SQL subconsulta