Cómo utilizar subselects en SQL para optimizar tus consultas


Cuando necesitas obtener información específica de una base de datos, las subconsultas, también conocidas como subselects, pueden ser la solución perfecta. Esta característica del lenguaje SQL te permite realizar consultas dentro de un conjunto de resultados, limitar creativamente tu conjunto de resultados o correlacionar tus resultados con una consulta no relacionada en una sola llamada a la base de datos. En este artículo, te proporcionaré varios ejemplos de subconsultas y te explicaré cuándo debes utilizarlas.


Índice de Contenido
  1. ¿Necesitas repasar los conceptos básicos de SQL?
  2. Búsqueda dentro de un conjunto de resultados
  3. Excluir resultados utilizando NOT IN
  4. Correlacionar resultados utilizando EXISTS
  5. Utilizar funciones de agregado para comparar
  6. Devolver resultados de subconsultas
  7. Palabras clave de comparación de subconsultas (ALL, SOME, ANY)
  8. ¡No le temas a las estructuras de datos normalizadas!

¿Necesitas repasar los conceptos básicos de SQL?

Estos artículos te ayudarán a ponerte en marcha:

  • SQL Básico I: Consultas de datos - cubre la terminología de las bases de datos y los cuatro tipos básicos de consultas.
  • SQL Básico: Opciones de la instrucción SELECT - cubre en detalle la instrucción SELECT y explica las funciones de agregado.

Búsqueda dentro de un conjunto de resultados

El concepto de una subconsulta es simple: una consulta SELECT anidada dentro de otra consulta, lo que crea un recurso que de otra manera no estaría disponible para buscar en una sola sentencia. La subconsulta permite la consolidación de consultas y coloca la carga de comparación de conjuntos de resultados en la base de datos en lugar del código de la aplicación.

Una forma de utilizar esta funcionalidad es localizar un valor relacionado por columna con datos comparables en dos tablas. Por ejemplo, tengo una base de datos con dos tablas: Álbum y Letra. Puedo encontrar fácilmente el nombre de cada canción de Metallica que contiene la letra "justicia" con la siguiente consulta de subconsulta:

SELECT nombre_cancion FROM Album
WHERE nombre_banda = 'Metallica'
AND nombre_cancion IN
(SELECT nombre_cancion FROM Letra
WHERE letra_cancion LIKE '%justicia%');

Este ejemplo es simple. Seleccioné todas las canciones de Metallica de la tabla Álbum. A continuación, seleccioné todas las canciones que contienen la letra "justicia" de la tabla Letra. Por último, utilicé la palabra clave IN para devolver los nombres de las canciones de la tabla Álbum que aparecen en el conjunto de resultados de la tabla Letra.

Utilicé el conjunto de resultados de la tabla Letra para limitar nuestros resultados de la tabla Álbum. La parte de la subconsulta de la cláusula WHERE es completamente independiente, por lo que no tengo que utilizar nombres de columna completamente cualificados como Album.nombre_cancion y Letra.nombre_cancion. No estoy devolviendo ningún valor de la tabla Letra en el conjunto de resultados final. Si necesitara las letras de las canciones en sí, utilizaría una instrucción JOIN.

El poder y la importancia del lenguaje SQL en el desarrollo de software

Excluir resultados utilizando NOT IN

Puedes utilizar la palabra clave NOT IN para obtener resultados que no estén explícitamente contenidos en otro conjunto de resultados. Por ejemplo, puedo querer devolver todas las canciones de Metallica en el álbum "And Justice for All" que no contienen la palabra "justicia" a través del siguiente código:

SELECT nombre_cancion FROM Album
WHERE nombre_album = 'And Justice for All'
AND nombre_banda = 'Metallica'
AND nombre_cancion NOT IN
(SELECT nombre_cancion FROM Letra
WHERE letra_cancion LIKE '%justicia%');

En el código SQL anterior, seleccioné todas las canciones del álbum "And Justice for All" de Metallica, seguido de todas las canciones con la letra "justicia" y finalmente devolví todas las canciones del conjunto de resultados de la tabla Álbum que no aparecen en el conjunto de resultados de la tabla Letra. En lugar de devolver dos consultas y utilizar código para comparar arrays, puedes obtener los resultados exactos con una sola instrucción.


Correlacionar resultados utilizando EXISTS

A veces, puedes acceder a los mismos datos a través de más de una vía y necesitas relacionar tus resultados para obtener una intersección de valores. Por ejemplo, puedo obtener una lista de canciones de Metallica buscando en la tabla Álbum. Sin embargo, puedo obtener una lista de canciones de Metallica interpretadas por Damage, Inc. de mi tabla Cover. Puedo correlacionar los valores comparando directamente los resultados de la consulta de ambas tablas.

SELECT Album.nombre_cancion FROM Album
WHERE Album.nombre_banda = 'Metallica'
AND EXISTS
(SELECT Cover.nombre_cancion FROM Cover
WHERE Cover.nombre_banda = 'Damage, Inc.'
AND Cover.nombre_cancion = Album.nombre_cancion);

En el código SQL, utilicé nombres de columna completamente cualificados porque estoy comparando directamente las dos tablas, no simplemente utilizando el conjunto de resultados como un recurso pasivo. No estoy devolviendo resultados de la tabla Cover. Algunas bases de datos admiten la palabra clave NOT EXISTS, que garantiza que no haya una coincidencia.


Utilizar funciones de agregado para comparar

Además de utilizar subconsultas para examinar datos en tablas relacionadas, también es posible utilizar una función de agregado en una subconsulta de la cláusula WHERE para tomar una determinación sobre el conjunto de resultados principal. Por ejemplo, quiero verificar las entradas de la tabla Álbum para cada canción de Metallica. Además, quiero devolver los nombres de los álbumes que tienen pistas faltantes. Convenientemente, la tabla AlbumInfo contiene una columna (album_tracks) que indica cuántas pistas debería haber.

SELECT AlbumInfo.nombre_album FROM AlbumInfo
WHERE AlbumInfo.nombre_banda = 'Metallica'
AND album_tracks < > 
(SELECT COUNT(*) FROM Album
WHERE Album.nombre_album = AlbumInfo.nombre_album);

He devuelto con éxito los nombres de todos los álbumes de Metallica en los que el número esperado de pistas no es igual al número de entradas de canciones en la tabla Álbum.

Tipos de datos datetime e intervalo en SQL92: descripción y uso

Devolver resultados de subconsultas

¿Y si todavía estoy preocupado por el número de canciones por álbum y necesito generar un informe de comparación? Es posible devolver los resultados de una subconsulta como parte de mi conjunto de resultados final. Esta característica se utiliza con mayor frecuencia para funciones de agregado. Por lo general, puedes acceder a otras tablas directamente como parte de tu consulta. El siguiente ejemplo devolverá cada álbum de Metallica, el número de pistas que debería contener y cuántas entradas están incluidas en la tabla Álbum:

SELECT AlbumInfo.nombre_album, album_tracks,
(SELECT COUNT(*) FROM Album
WHERE Album.nombre_album = AlbumInfo.nombre_album)
FROM  AlbumInfo
WHERE AlbumInfo.nombre_banda = 'Metallica';

Otro ejemplo poderoso de este último concepto implica cambiar el valor de album_tracks en la tabla AlbumInfo al número real de entradas en la tabla Álbum:

UPDATE AlbumInfo SET album_tracks =
(SELECT COUNT(*) FROM Album
WHERE AlbumInfo.nombre_album = Album.nombre_album)
WHERE AlbumInfo.nombre_banda = 'Metallica';

Las declaraciones de subconsulta en los dos ejemplos anteriores se ejecutan como una unidad independiente.


Palabras clave de comparación de subconsultas (ALL, SOME, ANY)

Además de utilizar la funcionalidad de consulta estándar, hay tres palabras clave que te permiten comparar el valor de una expresión con un conjunto de resultados de una subconsulta de una sola columna. Estas palabras clave devuelven un valor booleano TRUE o FALSE. La palabra clave ALL requiere que todos los valores de la subconsulta cumplan con el operador de comparación. Las palabras clave SOME y ANY requieren que al menos un par cumpla. Aquí tienes un ejemplo sencillo de la palabra clave ALL:

SELECT * FROM AlbumVentas
WHERE ingresos_album > 
ALL (SELECT costos_album FROM ProduccionAlbum);

El ejemplo anterior devolverá todos los registros de la tabla AlbumVentas que hayan obtenido más ingresos que el costo de producir el álbum más caro de la tabla ProduccionAlbum. Si se utilizara ANY en lugar de ALL, la declaración devolvería registros de todos los álbumes que hayan obtenido más ingresos que el costo del álbum de producción menos costoso. La declaración = ANY (igual a cualquier) es equivalente a la palabra clave IN. La declaración <> ALL (no igual a todos) es equivalente a utilizar la palabra clave NOT IN. Las palabras clave ANY y SOME son equivalentes. El soporte para estas palabras clave varía entre los fabricantes de bases de datos, por lo que asegúrate de consultar tu documentación si los resultados no son los esperados.


¡No le temas a las estructuras de datos normalizadas!

La sintaxis de la consulta de subconsulta es sencilla y directa, pero saber cuándo utilizarla es la parte difícil. Si alguna vez te has sentido intimidado por las estructuras de datos normalizadas, la sentencia de subconsulta te ayudará a darte cuenta de su potencial.

Cuál es el mejor motor de base de datos para MySQL

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Gestión de datos, allí encontraras muchos artículos similares a Cómo utilizar subselects en SQL para optimizar tus consultas , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.