Subconsultas para SQL Server

(cómo aprovechar la funcionalidad de una subconsulta)

Fecha: 04/Oct/2005 (04/10/2005)
Autor: Arbis Percy Reyes Paredes 
Email: bigpercynet@hotmail.com

http://percyreyes.blogspot.com  - http://netarticles-percyreyes.blogspot.com


para empezar...

Este artículo sobre subconsultas para Microsoft SQL Server, pretende cubrir los puntos importantes evitando todo tipo de tecnicismos que muchas veces nos confunden a la hora de tratar este tema. Pues por ejemplo, podemos encontrarnos con mucha información teórica que ciertamente terminan sumergiéndonos en un lío de conceptos. Aquí veremos desde cómo aprovechar la funcionalidad de una subconsulta hasta manejar el rendimiento de este, evaluando cuando hacer uso de ella y cuando no. Debo decirle que haremos us, en la mayoría de ejmplos, de la base de datos Northwind y Pubs, espero se acuerde de ellos.

Como sabéis, ell lenguaje SQL está compuesto por comandos (CREATE, DROP, ALTER, SELECT, INSERT, UPDATE, DELETE), cláusulas(FROM, WHERE, GROUP BY, HAVING, ORDER BY), operadores lógicos (AND, OR, NOT) y de comparación (<, >, =, LIKE, IN...), y funciones de agregado(AVG, COUNT, MAX, MIN, SUM), las cuales se combinan en las instrucciones para crear, actualizar y manipular las base de datos. Cuando se comprende el significado de estos comandos las consultas (tanto consultas internas o  subconsultas, y externas) pueden verse bastante sencillas y realizar muchas operaciones contra la base datos con mucha facillidad. Para continuar, dejo por hecho que usted tiene conocimientos básicos de SQL Server, entre ellas, los tipos de consultas.

entrándole a las subconsultas...

Volviendo al tema de la subconsultas, es propicio mencionar que una subconsulta es una instrucción SELECT anidada dentro de otra instrucción SELECT: SELECT INTO, INSERT INTO, DELETE, o UPDATE o dentro de otra subconsulta.Los formatos para las instrucciones de subconsultas son las siguientes:

Una subconsulta puede devolver:

  1. Una sola columna o un solo valor en cualquier lugar en donde pueda utilizarse una expresión de un sólo valor y puede compararse usando los siguientes operadores: =,<,>,<=,>= ,<>,!> y !<.
  2. Una sola columna o muchos valores que se pueden utilizar con el operador de comparación de listas IN en la cláusula WHERE.
  3. Muchas filas que pueden utilizarse para comprobar la existencia, usando la palabra EXISTS en la cláusula WHERE.

Se puede usar el predicado ANY o SOME, para recuperar registros de la consulta principal, que satisfagan la comparación con cualquier otro registro recuperado en la subconsulta. Ejemplo:

    

En ejemplo anterior se usa el operador de comparación >, es así que, >ALL significa mayor que cualquier valor; es decir, mayor que el valor máximo. Por ejemplo, >ALL (1, 2, 3,....7) significa mayor que 7. De manera similar, >ANY significa mayor que, como mínimo, un valor, es decir, mayor que el mínimo. En consecuencia, >ANY (1, 2, 3, ... 7) significa mayor que 1. Aquí otro ejemplo:

    

NOTA: los dos ejemplos anteriores fueron obtenidos directamente de la Documentación de Microsoft SQL Server.

En el proceso de trabajo con subconsultas, necesariamente manejaremos dos tipos de consultas: consultas internas y consultas externas. Las consultas internas no es más que las subconsultas propiamente dichas y la consultas externa es aquella que hace uso de los resultados devueltos por la consulta interna o subconsulta. En todo este rollo, también se harán uso del predicado IN. La consulta externa usa el predicado IN para operar con los valores devueltos por la subconsulta. Ejemplo:

    

Por otra parte, cuando se presenta una subconsulta con la palabra clave EXISTS, funciona como una prueba de existencia. La cláusula WHERE de la consulta externa comprueba la existencia de las filas devueltas por la subconsulta. La subconsulta en realidad no produce ningún dato, devuelve el valor TRUE o FALSE.

    

Subconsultas en las instrucciones UPDATE, DELETE e INSERT

Es posible anidar las subconsultas en este tipo de instrucciones. Pero dejándo de lado la teoría, creo que para entender mejor esta parte haremos uso de unos ejemplos...

INSERT

                   

UPDATE

                   

DELETE

                   

rendimiento y resultados...

En muchos casos puede usarse una operación de combinación en lugar de una consulta, no obstante algunas instancias pueden procesarse solo con una subconsulta. En algunos casos una operación de combinación puede producir un mejor rendimiento que una subconsulta, pero por lo general se observa muy poca diferencia en el rendimiento. Sin embargo, el uso de grandes anidamientos de subconsultas puede afectar seriamente el rendimiento. Creo que ya nos metimos en un lío entre cuestiones de rendimiento y calidad de resultados. De manera general la utilización de combinaciones producirá los mejores resultados. Veámos un ejemplo...

Haciendo uso de una subconsulta podríamos realizar la siguiente consulta:

     

Formulando la anterior subconsulta como una combinación...

    

La subconsulta siempre está encerrada entre paréntesis y a menos que se vaya a ejecutar una subconsulta correlacionada termina antes de que se procese la consulta externa. Una subconsulta puede contener otra subconsulta, y esta subconsulta puede, a su vez, contener otra subconsulta, ... y así sucesivamente. Los recursos del sistema(como la memoria disponible) limitan el número de subconsultas que pueden procesarce. Se puede anidar subconsultas hasta 32 niveles, pero esto como le mencioné, depende de los recursos disponibles del sistema. He aquí otro "botón" como ejemplo.

    

Formulando la anterior subconsulta como una combinación...

    

Todo esto fue por esta vez, espero haber contribuido a aclarar este tema.

MÇP - P€®©¥ R€¥€$™

Saludos desde Trujillo - Perú.

Por favor, califica este artículo en PanoramaBox, así me animarás a continuar colaborando contigo...


Fichero con el código de ejemplo: Percynet_SUBCONSULTAS_SQL.zip - Tamaño 2 KB


ir al índice del Guille