Sub-Consultas
Como funcionan las subconsultas en SQL Server
Las subconsultas en SQL son consultas anidadas dentro de otra consulta. Permiten usar el resultado de una consulta interna como entrada para la consulta externa. Pueden mejorar la legibilidad del código y permiten realizar consultas complejas de manera más estructurada.
Tipos de Subconsultas
- Subconsultas Escalares:
- Devuelven un solo valor.
- Pueden ser usadas en el lugar donde se espera un solo valor, como en el
SELECT
,WHERE
, oHAVING
. - Ejemplo:
SELECT empleado_id, (SELECT AVG(salario) FROM empleados WHERE departamento_id = e.departamento_id) AS salario_promedio FROM empleados e;
- Subconsultas de Columna Única:
- Devuelven una columna con múltiples filas.
- Utilizadas comúnmente con operadores como
IN
,NOT IN
,ANY
,ALL
. - Ejemplo:
SELECT nombre FROM productos WHERE categoria_id IN (SELECT categoria_id FROM categorias WHERE nombre = 'Electrónica');
- Subconsultas de Varias Columnas:
- Devuelven múltiples columnas y filas.
- Utilizadas en cláusulas como
IN
para comparar múltiples columnas. - Ejemplo:
SELECT nombre FROM empleados WHERE (departamento_id, salario) IN (SELECT departamento_id, MAX(salario) FROM empleados GROUP BY departamento_id);
- Subconsultas Correlacionadas:
- Se refieren a la consulta externa y son ejecutadas repetidamente para cada fila procesada por la consulta externa.
- Ejemplo:
SELECT e1.nombre FROM empleados e1 WHERE e1.salario > (SELECT AVG(e2.salario) FROM empleados e2 WHERE e2.departamento_id = e1.departamento_id);
Cómo Funcionan las Subconsultas
Las subconsultas son ejecutadas antes que la consulta principal. Sus resultados son utilizados como parámetros de entrada para la consulta externa. Dependiendo del tipo, las subconsultas pueden influir en la forma en que se filtran, agregan o seleccionan los datos.
- Subconsultas en la Cláusula
SELECT
: Permiten calcular valores derivados. - Subconsultas en la Cláusula
WHERE
: Utilizadas para filtrar datos basados en el resultado de otra consulta. - Subconsultas en la Cláusula
FROM
: Tratadas como tablas derivadas, permitiendo usar los resultados de una subconsulta como una tabla temporal.
Ejemplo
Imagina que quieres encontrar todos los empleados cuyo salario es mayor que el salario promedio de su departamento. Utilizarías una subconsulta correlacionada de la siguiente manera:
SELECT e1.nombre, e1.salario
FROM empleados e1
WHERE e1.salario > (SELECT AVG(e2.salario)
FROM empleados e2
WHERE e2.departamento_id = e1.departamento_id);
En este ejemplo:
- La subconsulta
(SELECT AVG(e2.salario) FROM empleados e2 WHERE e2.departamento_id = e1.departamento_id)
calcula el salario promedio de cada departamento. - La consulta externa compara el salario de cada empleado con el salario promedio de su respectivo departamento.
Consideraciones
- Rendimiento: Las subconsultas correlacionadas pueden ser costosas en términos de rendimiento, ya que se ejecutan repetidamente.
- Legibilidad: Las subconsultas pueden mejorar la legibilidad del código al dividir consultas complejas en partes manejables.
- Alternativas: A veces, las subconsultas pueden ser reemplazadas por
JOIN
para mejorar el rendimiento.
Hay algun video o tutorial de como instalar, SQL server 2008?
http://www.youtube.com/watch?v=3oBkIFpATaQ&feature=player_embedded#at=172
Si, pero en vhcardenas.blogspot.com
Una consulta? el orden de las condiciones afectan al query?
No afecta, amenos que como en la matematica, usemos parentesis para agrupar condiciones
No el orden de las condiciones no afecta a menos que se usen parentesis
Hola Ing. Cardenas – Vi el video de subconsultas lo cual me parecio bastante bien y claro. Solo tengo dudas referentes al siguiente codigo:
SELECT companyname FROM Customers WHERE EXISTS
(SELECT * FROM Products)
Aqui, el resultado devuelve 91 filas como si se hubiera simplemente ejecutado el query sin el subquery. Sin embargo, no deberia de mostrar el resultado de este codigo cero filas ya que el codigo esta pidiendo que devuelva cualquier companyname que aparezcan en el resultado del subquery? y al generar el subquery por si solo no devuelve nada del companyname. Gracias! el blog esta muy bueno, voy a seguir viendo los videos
Lo que sucede es que cuando se usa Exists es necesario que la consulta externa le pase un parametro a la consulta interna para correlacionarlas, si no solo esta haciendo que si la consulta interna devuelve por lo menos un dato, ejecuta la consulta de afuera pero no tiene relacion una con la otra
segun el video de la instalacion, a mi me da un error, justo en la pantalla que sale en el video al minuto 4:31 dice error de autentificacion…