Ir al contenido principal

Subquery Parte - 1

Subquery o subconsulta
Un subquery es una sentencia SELECT que su salida es utilizada por otra sentencia SELECT. Un Subquery es una consulta que esta anidado dentro de una sentencia SELECT, INSERT, UPDATE o DELETE o dentro de otro subquery. Un subquery puede devolver un conjunto de filas o solo una fila a la consulta padre. Un subquery Escalar es una consulta que devuelve exactamente un valor: una sola fila con una sola columna. Subquery escalares pueden ser utilizados en muchos lugares, en una sentencia SQL donde puede haber una expresión o un valor literal.

Lugares en una consulta donde puede ser utilizado un subquery son:
·         En la Lista SELECT.
·         En la clausula FROM.
·         En la clausula WHERE.
·         En la clausula HAVING.

Un subquery es a menudo referido como  un inner query y la sentencia dentro de la cual aparece es llamada el outer query. La implementación de subquery en Oracle no tiene niveles de anidamiento, solo en la clausula WHERE es de 255 como máximo.
Un subquery puede tener cualquiera de las clausula usuales de proyección y selección. Las siguientes clausulas son requeridas:
·         SELECT
·         FROM
Las siguientes son opcionales:
·         WHERE
·         GROUP BY
·         HAVING

Ejemplos:

-- SUBQUERY EN LA LISTA SELECT
SELECT (SELECT COUNT(*) FROM employees) NO_EMPLEADOS,
       (SELECT COUNT(*) FROM departments) NO_DEPARTAMENTOS,
       (SELECT COUNT(*) FROM countries) NO_PAISES,
       (SELECT COUNT(*) FROM LOCATIONS) NO_LOCALIZACIONES
FROM DUAL;

-- SUBQUERY EN LA CLAUSULA FROM
SELECT *
FROM   (SELECT employee_id, first_name, department_id FROM employees WHERE department_id = 50);

-- SUBQUERY EN LA CLAUSULA WHERE
SELECT *
FROM   jobs
WHERE  job_id IN (SELECT DISTINCT job_id FROM job_history);

-- SUBQUERY EN LA CLAUSULA HAVING
SELECT employee_id, first_name, last_name, COUNT(*)
FROM   employees
GROUP BY employee_id, first_name, last_name
HAVING COUNT(*) <= (SELECT COUNT(*) FROM DUAL);

-- SUBQUERY EN LA CLAUSULA GROUP BY
   NO PUEDE EXISTIR EN ESTA CLAUSULA PORQUE PARA AGRUPAR DEBEN SER ELEMENTOS
   DE LAS TABLAS QUE ESTAN EN LA CLAUSULA FROM
  
-- SUBQUERY EN LA CAUSULA ORDER BY
   NO SE PUEDE ORDER EN BASE A UN SUBQUERY POR QUE LO QUE SE ORDENA ES EL RESULTADO

   DE UNA COSNSULTA

Comentarios