Vous êtes sur la page 1sur 6

Consultas Mltiples SISTEMAS UNI

CONSULTAS
-- CONSULTA DE MULTIPLES TABLAS

----------------------------------
-- 1. NATURAL JOINS
----------------------------------
Combinacin natural: realiza un join entre dos tablas cuando los campos por los cuales se
enlazan tienen el mismo nombre. Involucra claves primarias y forneas.

SELECT DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID, CITY


FROM HR.DEPARTMENTS
NATURAL JOIN HR.LOCATIONS
ORDER BY 1

SELECT COUNTRY_NAME, REGION_NAME


FROM HR.COUNTRIES
NATURAL JOIN HR.REGIONS
WHERE HR.REGIONS.REGION_NAME = 'Europe'

SELECT FIRST_NAME , LAST_NAME , JOB_TITLE


FROM EMPLOYEES
NATURAL JOIN JOBS

INSTRUCTOR : ALAIN MEJIA AVALOS alain_mejia@hotmail.com


Consultas Mltiples SISTEMAS UNI

----------------------------------
-- 2. USING CLAUSE
----------------------------------
Combinacin empleando la clusula "using": permite especificar el campo (o los campos) por
el cual se enlazarn las tablas; los campos de ambas tablas DEBEN tener el mismo nombre y
ser de tipos compatibles.

SELECT EMPLOYEE_ID, LAST_NAME, LOCATION_ID, DEPARTMENT_ID


FROM HR.EMPLOYEES
JOIN HR.DEPARTMENTS USING (DEPARTMENT_ID)
WHERE DEPARTMENT_ID = 100;

SELECT FIRST_NAME , LAST_NAME , JOB_TITLE


FROM EMPLOYEES
JOIN JOBS USING ( JOB_ID )

----------------------------------
-- 3. USANDO ALIAS DE TABLAS CON CAMPOS REFERENCIADOS EN CLAUS. USING
----------------------------------
Las columnas utilizadas en USING no deben ser referenciadas con alias de tablas.

ERROR

SELECT L.CITY, D.DEPARTMENT_NAME


FROM LOCATIONS L JOIN DEPARTMENTS D
USING (LOCATION_ID)
WHERE D.LOCATION_ID = 1400;

OK

SELECT L.CITY, D.DEPARTMENT_NAME


FROM LOCATIONS L JOIN DEPARTMENTS D
USING (LOCATION_ID)
WHERE LOCATION_ID = 1400;

INSTRUCTOR : ALAIN MEJIA AVALOS alain_mejia@hotmail.com


Consultas Mltiples SISTEMAS UNI

----------------------------------
-- 4. JOINS CON CLAUSULA ON
----------------------------------
Use la clusula ON para identificar las columnas que une la consulta. Con ello separa de
la condicin de filtro.

Ejemplo1 : 2 tablas consultadas

SELECT E.EMPLOYEE_ID, E.LAST_NAME, E.DEPARTMENT_ID,


D.DEPARTMENT_ID, D.LOCATION_ID
FROM HR.EMPLOYEES E
JOIN HR.DEPARTMENTS D ON (E.DEPARTMENT_ID =
D.DEPARTMENT_ID);

Ejemplo2 : 3 tablas consultadas

SELECT EMPLOYEE_ID, CITY, DEPARTMENT_NAME


FROM EMPLOYEES E
JOIN DEPARTMENTS D ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
JOIN LOCATIONS L ON D.LOCATION_ID = L.LOCATION_ID;

Ejemplo3 : 2 tablas consultadas con filtro use AND o WHERE con los mismos resultados

SELECT E.EMPLOYEE_ID, E.LAST_NAME, E.DEPARTMENT_ID,


D.DEPARTMENT_ID, D.LOCATION_ID
FROM HR.EMPLOYEES E JOIN HR.DEPARTMENTS D
ON (E.DEPARTMENT_ID = D.DEPARTMENT_ID)
AND E.MANAGER_ID = 149 ;

SELECT E.EMPLOYEE_ID, E.LAST_NAME, E.DEPARTMENT_ID,


D.DEPARTMENT_ID, D.LOCATION_ID
FROM HR.EMPLOYEES E JOIN HR.DEPARTMENTS D
ON (E.DEPARTMENT_ID = D.DEPARTMENT_ID)
WHERE E.MANAGER_ID = 149 ;

----------------------------------
-- 5. JOINS A LA MISMA TABLA ( RECURSIVIDAD )
----------------------------------
Utilizada para casos de tablas recursivas

SELECT WORKER.LAST_NAME EMP, MANAGER.LAST_NAME MGR


FROM EMPLOYEES WORKER JOIN EMPLOYEES MANAGER
ON (WORKER.MANAGER_ID = MANAGER.EMPLOYEE_ID);

INSTRUCTOR : ALAIN MEJIA AVALOS alain_mejia@hotmail.com


Consultas Mltiples SISTEMAS UNI

----------------------------------
-- 6. LEFT OUTER JOIN
----------------------------------
Esta consulta recupera todas las filas de la tabla EMPLEADOS, que es la tabla de la izquierda,
incluso si no hay ninguna coincidencia en la tabla DEPARTAMENTOS.

SELECT E.LAST_NAME, E.DEPARTMENT_ID, D.DEPARTMENT_NAME


FROM EMPLOYEES E
LEFT OUTER JOIN DEPARTMENTS D ON (E.DEPARTMENT_ID = D.DEPARTMENT_ID) ;

----------------------------------
-- 7. RIGHT OUTER JOIN
----------------------------------
Esta consulta recupera todas las filas de la tabla DEPARTAMENTOS, que es la tabla de la
derecha, incluso si no hay ninguna coincidencia en la tabla EMPLEADOS.

SELECT e.last_name, d.department_id, d.department_name


FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

----------------------------------
-- 8. FULL OUTER JOIN
----------------------------------
Esta consulta recupera todas las filas de la tabla EMPLEADOS, incluso si no hay ninguna
coincidencia en la tabla DEPARTAMENTOS. Tambin recupera todas las filas en la tabla de
departamentos, incluso si no hay ninguna coincidencia en la tabla EMPLEADOS.

SELECT e.last_name, d.department_id, d.department_name


FROM employees e FULL OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

----------------------------------
-- 9. ROWNUM
----------------------------------
Es una pseudocolumna ( no es real ), es un nmero virtual que se le asigna a los registros
devueltos por una select.

SELECT DEPTNO, DNAME , ROWNUM


FROM SCOTT.DEPT;

SELECT DEPTNO, DNAME , ROWNUM


FROM SCOTT.DEPT
WHERE DEPTNO > 20 AND ROWNUM < 3

SELECT * FROM (
SELECT ENAME , SAL
FROM SCOTT.EMP ORDER BY SAL )
WHERE ROWNUM < 5

INSTRUCTOR : ALAIN MEJIA AVALOS alain_mejia@hotmail.com


Consultas Mltiples SISTEMAS UNI

----------------------------------
-- 10. RANK()
----------------------------------
Establece un ranking dentro de un grupo de valores.

SELECT FIRST_NAME , SALARY , DEPARTMENT_ID,


RANK() OVER ( PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC ) "RANKING"
FROM EMPLOYEES ;

SELECT FIRST_NAME , SALARY , DEPARTMENT_ID,


RANK() OVER ( PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC ) "RANKING"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 50

SELECT ROWNUM, DEPTNO, ENAME, SAL, COMM,


RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC, COMM DESC ) "RANKING"
FROM SCOTT.EMP WHERE DEPTNO = 30;

----------------------------------
-- 11. PIVOT
----------------------------------
CREATE TABLE VENTAS
( VENTA_ID NUMBER,
VENDEDOR CHAR(10),
MONTO NUMBER,
FECHA DATE );

INSERT INTO VENTAS VALUES ( 1 , 'ALBERTO' , 1200, '01/09/2014');


INSERT INTO VENTAS VALUES ( 2 , 'JUAN' , 5000, '01/10/2014');
INSERT INTO VENTAS VALUES ( 3 , 'SOFIA' , 3000, '01/09/2014');
INSERT INTO VENTAS VALUES ( 4 , 'ALBERTO' , 1200, '01/10/2014');
COMMIT;

SELECT * FROM VENTAS;

-- MUESTRA LA SUMA DE VENTAS POR CADA VENDEDOR POR MES


SELECT *
FROM ( SELECT to_char(FECHA,'MM') MES,VENDEDOR, MONTO FROM VENTAS)
PIVOT
( SUM(MONTO) AS TOTAL FOR VENDEDOR IN ( 'ALBERTO' ALBERTO, 'SOFIA' SOFIA ,
'JUAN' JUAN ))

-- CUENTA EL NO DE EMPLEADOS A CARGO DE LOS SGTES JEFES


SELECT *
FROM ( SELECT to_char(HIRE_DATE,'yyyy') AO, JOB_ID FROM EMPLOYEES)
PIVOT
( COUNT(*) FOR JOB_ID IN ( 'ST_MAN' , 'ST_CLERK' , 'SH_CLERK' ))

INSTRUCTOR : ALAIN MEJIA AVALOS alain_mejia@hotmail.com


Consultas Mltiples SISTEMAS UNI

----------------------------------
-- 12. CASE
----------------------------------
SELECT LAST_NAME , SALARY,
CASE JOB_ID
WHEN 'SH_CLERK' THEN SALARY * 1.1
WHEN 'HR_REP' THEN SALARY * 1.2
ELSE SALARY
END
FROM EMPLOYEES;

INSTRUCTOR : ALAIN MEJIA AVALOS alain_mejia@hotmail.com

Vous aimerez peut-être aussi