33
UNIVERSIDAD CENTRAL DEL ECUADOR FACULTAD DE INGENIERIA ESCUELA DE CIENCIAS ESCUELA DE CIENCIAS 2009- 2010 ORACLE MATERIA BASE DE DATOS II CECILIA TULCÁN Ing. Jorge Gordillo

Materia de Base (Ing. Gordillo)

Embed Size (px)

Citation preview

Page 1: Materia de Base (Ing. Gordillo)

ORACLEMATERIA BASE DE DATOS II

CECILIA TULCÁN

2009-2010

UNIVERSIDAD CENTRAL DEL ECUADORFACULTAD DE INGENIERIA

ESCUELA DE CIENCIAS

Ing. Jorge Gordillo

Page 2: Materia de Base (Ing. Gordillo)

ContenidoContenido.....................................................................................................................................1

CARACTERISTICAS DE UNA BASE DE DATOS.................................................................................2

Definición de base de datos.....................................................................................................3

Características..........................................................................................................................3

Sistema de Gestión de Base de Datos (SGBD)..........................................................................3

TIPOS DE RELACIONES..................................................................................................................4

Relación identificadora y no identificadora..............................................................................4

GRADOS DE NORMALIZACION.....................................................................................................4

PRIMERA FORMA NORMAL......................................................................................................4

SEGUNDA FORMA NORMAL.....................................................................................................5

TERCERA FORMA NORMAL......................................................................................................5

MANIPULACION DE DATOS..........................................................................................................5

Tipos de sentencias SQL...........................................................................................................5

Sentencias de definición de datos (DDL)..............................................................................5

Sentencias de manipulación de datos (DML).......................................................................6

FUNCIONES DE AGREGACION......................................................................................................9

USO DE LA CLAUSULA GROUP BY...............................................................................................11

USO DE LA CLAUSULA HAVING...................................................................................................14

SELECT ANIDADOS......................................................................................................................16

JOINS..........................................................................................................................................22

JOIN EQUIJOINS......................................................................................................................22

SELECT SINCRONIZADOS............................................................................................................24

1

Page 3: Materia de Base (Ing. Gordillo)

CARACTERISTICAS DE UNA BASE DE DATOS

Definición de base de datos

Se define una base de datos como una serie de datos organizados y relacionados entre sí, los cuales son recolectados y explotados por los sistemas de información de una empresa o negocio en particular.

Características

Entre las principales características de los sistemas de base de datos podemos mencionar:

Independencia lógica y física de los datos. Redundancia mínima. Acceso concurrente por parte de múltiples usuarios. Integridad de los datos. Consultas complejas optimizadas. Seguridad de acceso y auditoría. Respaldo y recuperación. Acceso a través de lenguajes de programación estándar.

Sistema de Gestión de Base de Datos (SGBD)

Los Sistemas de Gestión de Base de Datos (en inglés DataBase Management System) son un tipo de software muy específico, dedicado a servir de interfaz entre la base de datos, el usuario y las aplicaciones que la utilizan. Se compone de un lenguaje de definición de datos, de un lenguaje de manipulación de datos y de un lenguaje de consulta.

2

Page 4: Materia de Base (Ing. Gordillo)

TIPOS DE RELACIONES

Relación identificadora y no identificadora

Relaciones Identificadores

Las llaves primarias de la entidad origen pasa a formar parte de la entidad destino.

Se representa con línea continua. Las llaves primarias tienen algunos atributos y al relacionarse con otra

entidad la llave primaria sigue amentando. Cuando usamos relaciones identificadoras las llaves primarias se van

haciendo más grandes. Relaciones no Identificadoras

Las llaves primarias de la entidad origen no pasan a formar parte de la entidad destino.

Se representa con línea punteada. Las llaves primarias solo tienen un atributo.

GRADOS DE NORMALIZACION

Existen básicamente tres niveles de normalización:Primera forma normal, segunda forma normal, tercera forma normal. Cada una de estas formas tiene sus propias reglas. Cuando una base de datos se conforma a un nivel, se considera normalizada a esa forma de normalización. Por ejemplo una base de datos cumple con todas las reglas del segundo nivel de normalización, se considera que la base de datos está en la segunda forma normal. No siempre es buena idea tener una base de datos conformada en el nivel más alto de normalización, esto puede llevar a un nivel de complejidad que pudiera ser evitado si estuviera en un nivel más bajo de normalización. En general el nivel apropiado de normalización dependerá del diseño de cada base de datos.

PRIMERA FORMA NORMAL

La primera forma normal establece que las columnas repetidas deben eliminarse y colocarse en tablas separadas, esta es una regla muy fácil de seguir.

Como un ejemplo podríamos considerar el caso en que se tiene una tabla correspondiente a los clientes de una empresa en donde se almacenan datos del cliente y datos correspondientes a los productos que compro el cliente en este caso habrían que definir varios campos correspondientes a producto1, producto2, producto3, así la tabla contendría varias columnas repetidas por los que tendríamos que crear una tabla aparte para los productos.

3

Page 5: Materia de Base (Ing. Gordillo)

SEGUNDA FORMA NORMAL

Una relación está en 2FN si está en 1FN y si los atributos que no forman parte de ninguna clave dependen de forma completa de la clave principal. Es decir que no existen dependencias parciales.

En otras palabras podríamos decir que la segunda forma normal está basada en el concepto de dependencia completamente funcional. Una dependencia funcional

es completamente funcional si al eliminar los atributos A de X significa que la dependencia no es mantenida, esto es que A X, (X – {A}) -x-> Y. Una Єdependencia funcional es una dependencia parcial si hay algunos atributos

que pueden ser eliminados de X y la dependencia todavía se mantiene, esto es A X, (X – {A}) -> Y.Є

Por ejemplo {DNI, ID_PROYECTO} HORAS_TRABAJO (con el DNI de un empleado y el ID de un proyecto sabemos cuántas horas de trabajo por semana trabaja un empleado en dicho proyecto) es completamente dependiente dado que ni DNI HORAS_TRABAJO ni ID_PROYECTO HORAS_TRABAJO mantienen la dependencia. Sin embargo {DNI, ID_PROYECTO} NOMBRE_EMPLEADO es parcialmente dependiente dado que DNI NOMBRE_EMPLEADO mantiene la dependencia.

TERCERA FORMA NORMAL

Una relación esta en 3FN si esta en 2FN y además se debe eliminar y separar cualquier dato que no sea clave. Todos los valores deben identificarse únicamente por la clave.

MANIPULACION DE DATOS

Tipos de sentencias SQL

Sentencias de definición de datos (DDL)

Un lenguaje de definición de datos (Data DefinitionLanguage, DDL por sus siglas en inglés) es un lenguaje proporcionado por el sistema de gestión de base de datos que permite a los usuarios de la misma llevar a cabo las tareas de definición de las estructuras que almacenarán los datos así como de los procedimientos o funciones que permitan consultarlos.

4

Page 6: Materia de Base (Ing. Gordillo)

El lenguaje de programación SQL , admite las siguientes sentencias de definición: CREATE, DROP y ALTER, cada una de las cuales se puede aplicar a las tablas, vistas, procedimientos almacenados y triggers de la base de datos.

Sentencia DDL ObjetivoAlter procedure Recompilar un procedimiento

almacenadoAlter table Añadir o redefinir una columna,

modificar la asignación de almacenamiento de una tabla

Createtable Crear una tablaCreateindex Crear un índiceDroptable Eliminar una tabla y su contenidoDropindex Eliminar un índice

Otras que se incluyen dentro del DDL, son GRANT y REVOKE, los cuales sirven para otorgar permisos o quitarlos, ya sea a usuarios específicos o a un rol creado dentro de la base de datos.

Sentencias de manipulación de datos (DML)

DML son las siglas de Data Manipulation Language y se refiere a los comandos que permiten a un usuario manipular los datos en un repositorio, es decir, añadir, consultar, borrar o actualizar.En SQL los comandos SELECT, INSERT, UPDATE y DELETE son comandos DML.

SELECT Utilizado para consultar registros de una base datos que satisfagan un criterio determinado.INSERT Utilizado para insertar registros en una tabla.UPDATE Utilizado para modificar los valores de los campos y registros en tabla.DELETE Utilizado para borrar registros de una tabla.

Otras órdenes como: COMMITo ROLLBACK, las cuales sirven para validar o deshacer los cambios dentro de una transacción, están en el límite de lo que podemos considerar órdenes DML de SQL puesto que no inciden en la manipulación o consulta de datos pero sí en el proceso en que esto se realiza.

Ejemplo:1. Cree la tabla provincia con los siguientes atributos:

Cod_prov, nom_prov, desc_prov.

CREATE TABLE PROVINCIA( COD_PRO NUMBER NOT NULL, NOM_PRO VARCHAR2(20), DESC_PROV VARCHAR2(20), CONSTRAINT PROVINCIA_PK PRIMARY KEY (COD_PRO ));

5

Page 7: Materia de Base (Ing. Gordillo)

2. Cree la tabla estudiante con los siguientes atributos:Cod_estudiante, cod_prov, nom_estudiante, telf_estudiante.

CREATE TABLE ESTUDIANTE( COD_ESTUDIANTE NUMBER NOT NULL, COD_PRO NUMBER,NOM_ESTUDIANTE VARCHAR2(20), TELF_ESTUDIANTE VARCHAR2(20),CONSTRAINT PROVINCIA_PK PRIMARY KEY (COD_ESTUDIANTE ));

Para establecer la relación de uno a muchos de la tabla provincia hacia estudiante utilizamos la siguiente instrucción SQL:

ALTER TABLE ESTUDIANTE ADD ( FOREKIGN KEY (COD_PRO)REFERENCES PROVINCIA);

3. Inserte datos en las tablas provincia y estudiantes haciendo uso de la cláusula insert.

INSERT INTO provincia (cod_pro, nom_pro, desc_prov) VALUES (001,'PICHINCHA','');INSERT INTO provincia (cod_pro, nom_pro, desc_prov) VALUES (002,'GUAYAS','');

INSERT INTO ESTUDIANTE (cod_estudiante, cod_pro, nom_estudiante, telf_estudiante) VALUES (101,001,'PEDRO','09876543');

INSERT INTO ESTUDIANTE (cod_estudiante, cod_pro, nom_estudiante, telf_estudiante) VALUES (102,001,'JUAN','098888098');

INSERT INTO ESTUDIANTE (cod_estudiante, cod_pro, nom_estudiante, telf_estudiante) VALUES (103,002,'ANDRES','0977777098');

4. Actualice el número de teléfono del estudiante con código 103

update estudianteset telf_estudiante='11111111' where cod_estudiante=103;

5. Borre todos los datos de los estudiantes de nombre Andrés

delete * from estudiante where nom_estudiante=’ANDRES’;

6

Page 8: Materia de Base (Ing. Gordillo)

Ejercicios

1. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que ganan entre 1000 y 2500 y que trabajan en el departamento 10 y 30.

Select * from empwhere sal BETWEEN 1000 and 2500and (deptno=10 or deptno=30);

Observación:Nótese que la presencia de paréntesis en la clausula and es necesaria puesto que esta tiene mayor precedencia que la cláusula or.La consulta anterior se puede realizar también usando la clausula in que funciona de forma similar a la cláusula or.

select * from empwhere sal BETWEEN 1000 and 2500and deptno in(10,30);

2. Repetir la misma instrucción anterior pero presentar los datos ordenados en forma ascendente por departamento y descendente por salario.

select * from empwhere sal BETWEEN 1000 and 2500and deptno in(10,30)order by deptno asc, sal desc;

Nota:La palabra asc de ascendente puede ser omitida puesto que es el valor por defecto.

7

Page 9: Materia de Base (Ing. Gordillo)

3. Escribir la instrucción SQL que presente en pantalla el nombre del empleado, la comisión y valor total que gana entre salario y comisión cada empleado.

Select ename, sal, comm, sal+nvl(comm,0) from emp;

FUNCIONES DE AGREGACION

Avg()Devuelve un valor que es el promedio de todos los valores válidos y que no estén en blanco de campo.

Select avg(sal) from emp;

AVG(SAL) ---------------------- 2073,214285714285714285714285714285714286

Max()Devuelve el valor válido más alto del campo.

select max (sal) from emp;

MAX(SAL) ---------------------- 5000

8

Page 10: Materia de Base (Ing. Gordillo)

Min()Devuelve el valor válido más pequeño y que no esté en blanco de campo.

select min (sal) from emp;

MIN(SAL) ---------------------- 800

Count()Devuelve el número de valores válidos y que no estén en blanco de campo.

select count (*) from emp;

COUNT(*) ---------------------- 14

Sum()Devuelve el total de valores válidos y que no estén en blanco de campo.

select sum (sal) from emp;

SUM(SAL) ---------------------- 29025

Variance()Devuelve la varianza de una muestra representada por una serie de valores que no están en blanco de campo.

select variance (sal) from emp;

VARIANCE(SAL) ---------------------- 1398313,87362637362637362637362637362637

Stddev()Devuelve la desviación estándar de una muestra representada por una serie de valores que no están en blanco de campo.

Select stddev (sal) from emp;

STDDEV(SAL) ---------------------- 1182,503223516271699458653359613061928508

9

Page 11: Materia de Base (Ing. Gordillo)

USO DE LA CLAUSULA GROUP BY

Agrupa los registros similares siempre y cuando sean del mismo atributo. En el group by van todos los atributos que estén en el select y que no tengan ninguna función que tenga una aplicación de agregación.

Ejemplo:Escribir la instrucción SQL que calcule el sueldo promedio que ganan los empleados pero sin usar la función avg().select sum(sal)/count(empno) from emp;

SUM(SAL)/COUNT(EMPNO) ---------------------- 2073,214285714285714285714285714285714286

Observación:

Select deptno from emp;⇨ 14 registrosSelect sum(sal) from emp; ⇨ 1 registroSelect deptno, sum(sal) from emp; ⇨ Se produce un error (no es posible match)

Sin función de agregación Función de agregación

Para evitar este inconveniente se debe hacer uso de la función Group by , en esta función deben ir al menos todos los atributos que no contienen función de agregación .(Pueden ir mas)

De esta manera la instrucción anterior debe ser escrita de la siguiente manera:

Select deptno, sum(sal) from emp group by deptno;

DEPTNO SUM(SAL) ---------------------- ---------------------- 30 9400 20 10875 10 8750

Esta instrucción muestra el total de salarios que se paga en cada departamento.

10

Page 12: Materia de Base (Ing. Gordillo)

Ejercicios:

1. Escribir la instrucción SQL que presente en pantalla la suma total de salarios, el sueldo mínimo, el sueldo máximo y el sueldo promedio que se paga en cada uno de los departamentos.

Select deptno, sum(sal), min(sal),max(sal),avg(sal) from emp group by deptno;

2. Escribir la instrucción SQL que presente en pantalla el número de empleados que existe por departamento y el ingreso total que reciben los empleados de cada departamento durante un año.

Select deptno, count(*), sum(sal)*12 From emp group by deptno;

DEPTNO COUNT(*) SUM(SAL)*12 ---------------------- ---------------------- ---------------------- 30 6 112800 20 5 130500 10 3 105000

3. Escribir la instrucción SQL que presente en pantalla el número de personas que desempeña cada uno de los trabajos en la empresa.

select job, count(*) from empgroup by job;

JOB COUNT(*) --------- ---------------------- CLERK 4 SALESMAN 4 PRESIDENT 1 MANAGER 3 ANALYST 2

11

Page 13: Materia de Base (Ing. Gordillo)

4. Cuantos empleados existen en cada departamento y que desempeñen un mismo trabajo.

Select deptno, job, count(*) from empgroup by deptno, job;

DEPTNO JOB COUNT(*) ---------------------- --------- ---------------------- 20 CLERK 2 30 SALESMAN 4 20 MANAGER 1 30 CLERK 1 10 PRESIDENT 1 30 MANAGER 1 10 CLERK 1 10 MANAGER 1 20 ANALYST 2

5. Escribir la instrucción SQL que presente en pantalla la desviación estándar del salario que reciben los empleados.

Select stddev(sal) from emp;

STDDEV (SAL) ---------------------- 1182,503223516271699458653359613061928508

6. Escribir la instrucción SQL que presente en pantalla el número de empleados que realice el trabajo de obrero(CLERK) en cada uno de los departamentos.

Select deptno, count (*)From empWhere job='CLERK'Group by deptno;

DEPTNO COUNT (*) ---------------------- ----------------------

30 1 20 2 10 1

12

Page 14: Materia de Base (Ing. Gordillo)

USO DE LA CLAUSULA HAVING

Trabaja sobre una tabla temporal que se crea cuando se utiliza el group by es igual que el where y solo se utiliza cuando utilizamos group by. En el where no se puede utilizar funciones de agregación ya que trabaja en la tabla original mientras que con having se trabaja en la tabla temporal por lo que se puede utilizar cualquier función de agregación

Ejemplo:

Escribir la instrucción SQL que presente en pantalla el número de empleados que tiene cada departamento de aquellos departamentos que tienen más de 4 empleados.

Select deptno, count(*) From empgroup by deptnohaving count(*)>4;

DEPTNO COUNT (*) ---------------------- ---------------------- 30 6 20 5

Observación:

La instrucción SQL anterior sin la cláusula having:

Select deptno, count(*) From empgroup by deptno;

DEPTNO COUNT(*) ---------------------- ---------------------- 30 6 20 5 10 3

Esta consulta crea una tabla temporal con el número de empleados de cada departamento, para filtrar datos o presentar datos de esta tabla temporal que cumplan una determinada condición se usa la cláusula having, como se puede apreciar en el ejercicio 7, en donde se usa la cláusula having presentando solo los departamentos que tienen más de 4 empleados.

Con la cláusula having se puede hacer uso de cualquiera de las funciones de agregación vistas anteriormente.

13

Page 15: Materia de Base (Ing. Gordillo)

La cláusula where actúa de igual manera filtrando datos pero que están sobre la tabla original, con la cláusula where no podemos hacer uso de funciones de agregación.

Ejercicios

1. Escribir la instrucción SQL que presente en pantalla el número de obreros (CLERK) que existe por departamento de todos aquellos departamentos que tengan más de 1 obrero.

Select deptno, job, count(*) from empwhere job='CLERK'group by deptno, jobhaving count(*)>1;

DEPTNO JOB COUNT(*) ---------------------- --------- ---------------------- 20 CLERK 2

2. Escribir la instrucción SQL que presente en pantalla el ingreso total mensual que ganan los empleados de cada departamento de aquellos departamentos que ganan más de 10000 dólares.

Select deptno,sum (sal+nvl(comm,0)) from empgroup by deptnohaving sum (sal+nvl(comm,0))>10000;

DEPTNO SUM(SAL+NVL(COMM,0)) ---------------------- ----------------------

30 11600 20 10875

3. Escribir la instrucción SQL que presente en pantalla el ingreso total mensual que ganan los empleados de cada departamento de aquellos departamentos que ganan más de 5000 dólares considerando solamente a los manager, presidentes, salesman.

Select deptno, sum (sal+nvl(comm,0)) From empwhere job in ('MANAGER','PRESIDENT','SALESMAN')group by deptnohaving sum (sal+nvl(comm,0))>5000;

DEPTNO SUM(SAL+NVL(COMM,0)) ---------------------- ---------------------- 30 10650 10 7450

14

Page 16: Materia de Base (Ing. Gordillo)

SELECT ANIDADOS

Los select simplemente anidados trabajan desde el select interno hasta el select externo. Los select internos pasan los datos a los select externos donde el select externo es ejecutado.En el where se hace operaciones con datos similares es decir tienen que ser del mismo tipo.

Ejemplo:

Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que trabajan en la ciudad de DALLAS.

En este caso se puede realizar la consulta en dos pasos:

Obteniendo primero el deptno del departamento de la ciudad de DALLAS:

Select deptno from deptwhere loc= 'DALLAS';

DEPTNO ---------------------- 20

Seleccionamos los empleados que están asociados con este deptno:

Select * from empwhere deptno=20;

La consulta anterior puede ser realizada en un solo paso:

Select * from empwhere deptno=(select deptno from dept where loc='DALLAS');

15

Page 17: Materia de Base (Ing. Gordillo)

A este tipo de consulta se le denomina con select anidado puesto que se utiliza el resultado que devuelve un selectpara utilizarlo con otro en una misma consulta.

Ejercicios:

1. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que desempeñan el mismo trabajo que realizan los empleados del departamento 10.

select * from empwhere job in (select job from emp where deptno=10);

2. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados de aquellos departamentos que tienen más de 4 empleados.

select * from empwhere deptno in (select deptno from emp

group by deptnohaving count(*)>4);

Nota:Los select se ejecutan desde el mas interno al más externo

16

Page 18: Materia de Base (Ing. Gordillo)

3. Escribir la instrucción SQL que presente en pantalla todos los datos de aquellos empleados que ganan el máximo salario de la empresa.

Select * from empWhere sal in (select max(sal) from emp);

4. Escribir la instrucción SQL que presente en pantalla todos los datos del empleado que es el más nuevo de la empresa.

Select * fromempWhere hiredate in (select max(hiredate) from emp);

5. Escribir la instrucción SQL que presente en pantalla todos los datos del empleado que es el más antiguo de la empresa.

Select * fromempWhere hiredate in (select min(hiredate) from emp);

6. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que ganan un salario superior al salario promedio de la empresa.

select * from empwhere sal> (select avg(sal) from emp);

17

Page 19: Materia de Base (Ing. Gordillo)

7. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que ganan más que todos los empleados del departamento 20 individualmente.

select * from empwhere sal> (select max(sal) from empwhere deptno=20);

Otra forma de obtener el mismo resultado:

select * from empwhere sal>all (select sal from empwhere deptno=20);

8. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que ganan un salario mayor a cualquiera de los salarios ganan los empleados del departamento 10.

select * from empwhere sal> (select min(sal) from empwhere deptno=10);

Otra forma de obtener el mismo resultado:

select * from empwhere sal>any (select sal from empwhere deptno=10);

18

Page 20: Materia de Base (Ing. Gordillo)

Nota:

La expresión all es equivalente a un and puesto que debe cumplirse la condición para todos los datos que devuelve una consulta, en el ejemplo anterior ejercicio 7:

select * from empwhere sal>all (select sal from empwhere deptno=20);

El select interno:

Select sal from empwhere deptno=20

devuelve como resultados:

SAL ---------------------- 800 2975 3000 1100 3000

Al hacer uso de la cláusula all el select externo sería equivalente a:

Sal>800 and sal>2975 and sal>3000 and sal>1000 and sal>3000

Y se presentan los datos de los empleados que tienen un salario mayor a todos los salarios que devuelve el select interno en este caso los salario del deptno=20.

De manera similar la cláusula any es equivalente a la cláusula or.

9. Escribir la instrucción SQL que presente en pantalla todos los datos de aquellos empleados que ganan el máximo salario de la empresa.

Select * from empwhere sal in (select max(sal) from emp);

10. Escribir la instrucción SQL que presente en pantalla todos los datos del empleado que es el más nuevo de la empresa.

Select * from empwhere hiredate in (select max(hiredate) from emp);

19

Page 21: Materia de Base (Ing. Gordillo)

11. Escribir la instrucción SQL que presente en pantalla todos los datos del empleado que es el más antiguo de la empresa.

Select * from empwhere hiredate in (select min(hiredate) from emp);

12. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que ganan un salario superior al salario promedio de la empresa.

Select * from empwhere sal>(select avg(sal) from emp);

13. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que ganan más que todos los empleados del departamento 20 individualmente.

Select * from empWhere sal>(select max (sal) from emp

where deptno=20);

Otra forma:

Select * from empWhere sal> all (select sal from emp

where deptno=20);

14. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que ganan un salario mayor a cualquiera de los salarios que ganan los empleados del departamento 10.

Select * from empwhere sal>(select min(sal) from emp

where deptno=10);

Otra forma:

Select * from empwhere sal> any (select sal from emp

where deptno=10);

15. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que ganan el máximo salario en cada uno de sus departamentos.

Select * from empWhere (detpno,sal) in (select deptno, max(sal) from emp

group by deptno);

20

Page 22: Materia de Base (Ing. Gordillo)

NOTA:La consulta anterior es válida únicamente en Oracle, pero existe una forma general para obtener el mismo resultado que es válida en cualquier base de datos, a esto se le conoce con el nombre de SELECT SINCRONIZADO, a continuación se da el formato de esta consulta haciendo uso de este tipo select, únicamente como una introducción, pues más adelante se estudiara en detalle este tipo de consultas sincronizadas.

select * from emp xwhere sal in (select max(sal) from emp e

where e.deptno = x.deptno);

JOINS

JOIN EQUIJOINS

Este tipo de join el más usado, se usa para unir dos o más tablas y presentar los registros relacionados entre sí.Para este tipo de join es necesario colocar en la cláusula where de la consulta al menos n-1 condiciones,donde n es el número de tablas que se relacionan.Ejercicios.

1. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados y de sus departamentos.

select * from emp e, dept dwhere e.deptno=d.deptno;

NOTA:Se puede hacer uso de alias para las tablas, como en el ejemplo anterior, esto facilita la escritura y simplicidad de la consulta. Una vez que se hace uso de un alias ya no se puede hacer uso del nombre de la tabla, en adelante se usa solamente el alias, en caso contrario se producirá un error en la ejecución.

Como una acotación más en el ejemplo anterior se usó el * para indicar que se seleccionen todos los datos, en este caso como se trata de un join se seleccionan todos los datos de las tablas que se encuentran en el from es decir de la tabla emp y dept. Si se desea seleccionar únicamente los datos de una tabla se debería escribir por ejemplo e.* que mostraría todos los datos de la tabla emp únicamente.

2. Escribir la instrucción SQL que presente en pantalla el código del empleado, el nombre del empleado, el ingreso total que recibe cada empleado y el nombre del departamento al que pertenece de todos los empleado del departamento 20 y 30.

Select empno, ename, sal+nvl(comm,0), dnameFrom emp e, dept dwhere e.deptno=d.deptnoand e.deptno in (20,30);

21

Page 23: Materia de Base (Ing. Gordillo)

3. Escribir la instrucción SQL que presente en pantalla el nombre del departamento y el salario total que se paga por departamento.

selectdname, sum(sal+nvl(comm,0))fromemp e, deptwhere e.deptno=d.deptnogroup by dname;

4. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados que trabajan en la ciudad de DALLAS.

select * from emp e, dept dwhere e.deptno=d.deptnoandd.loc='DALLAS';

5. Escribir la instrucción que presente en pantalla el nombre del departamento, el número de empleados y el ingreso total que reciben los empleados de cada departamento.

Select dname, count(*), sum(sal+nvl(comm,0)) from emp e, dept dwhere e.deptno=d.deptnogroup by dname;

6. Escribir la instrucción SQL que presente en pantalla el nombre del departamento, el salario promedio del departamento de todos aquellos departamentos que tienen más de 4 empleados.

Select dname, count(*), avg(sal+nvl(comm,0)) from emp e, dept dwhere e.deptno=d.deptnogroup by dnamehaving count(*)>4;

7. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados más el nombre del departamento en el que trabaja, de aquellos empleados que trabajan en el departamento de contabilidad y que son gerentes.

select e.*, dname from emp e, dept dwhere e.deptno=d.deptnoand dname='ACCOUNTING'and job='MANAGER';

22

Page 24: Materia de Base (Ing. Gordillo)

8. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados más el nombre del departamento y la localización del departamento de todos aquellos empleados que trabajan en el departamento 10 o en el departamento 30 y que tienen un ingreso total anual superior a 30000 dólares.

select e.*,d.dname, d.loc from emp e, dept dwhere e.deptno=d.deptnoand e.deptno in (10,30)and (e.sal + nvl(e.comm,0))*12 >30000;

9. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados más el nombre del departamento de todos aquellos empleados que ganen un salario superior al salario promedio de la empresa.

select e.*, d.dname from emp e, dept dwhere e.deptno=d.deptnoand sal>(select avg(sal) from emp);

NOTA:

Para obtener en la consulta el salario promedio de la empresa se puede colocar un select anidado.

select e.*, d.dname, (select avg(sal) from emp) salario_promediofrom emp e, dept dwhere e.deptno=d.deptnoand sal>(select avg(sal) from emp);

SELECT SINCRONIZADOS

Llamados también select anidados correlacionados, el select anidado interno hace referencia a la tabla de afuera es decir:

El select interno necesita del dato externo El select externo necesita del dato interno

Los select correlacionados no se ejecutan solos es decir el select interno depende del select externo asi como el select externo depende del select interno a diferencia de los select simplemente anidados se pueden ejecutar por si solos.

23

Page 25: Materia de Base (Ing. Gordillo)

Ejercicios

1. Escribir la instrucción SQL que presente en pantalla todos los datos de los empleados más el nombre del departamento de todos aquellos empleados que ganan el salario máximo de su departamento.

select e.*, dname from emp e, dept dwhere e.deptno=d.deptnoand sal =(select max(sal) from emp

where deptno=e.deptno);

2. Escribir la instrucción sql que presente en pantalla todos los datos de los empleados más el nombre del departamento de aquel departamento que tenga el mayor número de empleados.

Esta consulta función únicamente en el RGBD ORACLE:

Select deptno from emp Group by deptnoHaving count(*)>= all(Select cont(*) from emp Group by deptno)

Funciona para todas las demas bases de datos:Select e.* d.dname from emp e, dept dWhere e. deptno=d.deptno And e.deptno=(Select deptno from emp

Group by deptno Having count(*)>= all(select count(*)from emp

Group by deptno))3. Escribir la instrucción sql que presente en pantalla todos los datos de los

empleados más el nombre del departamento del empleado más antiguo y del empleado más nuevo.

Select e.* from emp e,dept d Where e.deptno=d.deptno And empno in (select empno from emp

Where hiredate=(select max (hiredate) from emp) Or hiredate = (select min (hiredate) from emp));

Otra forma de hacer:

Select e.* d.dname From emp e , dept dWhere e.deptno=d.deptnoAnd hiredate in (select max(hiredate)from emp),( select min(hiredate)from emp));

24

Page 26: Materia de Base (Ing. Gordillo)

4. Escribir la instrucción sql que presente en pantalla todos los datos del departamento más el valor total de sueldos que se pagó por departamento de aquel departamento en el que se pagó el mayor valor total de sueldos.

Select * from dept Where deptno in (select deptno from emp

Group by deptno Having sum(sal)>=all(select sum(sal) from emp

group by deptno));

El mismo ejercicio anterior pero que la respuesta salga el total del salario.Select e.deptno,d.dname,d.loc,sum(e.sal) from dept d,emp e Where e.deptno=d.deptnoGroup by e.deptno,d.dnameHaving e.deptno in (select deptno from emp

Group by deptno Having sum(sal)>=all(select sum(sal) from emp

group by deptno));

5. Escribir la instrucción sql que presente en pantalla todos los datos del empleado más el nombre del departamento de todos aquellos empleados que tienen un ingreso total anual superior al ingreso total anual de cualquiera de los empleados del departamento 20.

Select e.*, d.dname from emp e, dept dWhere e.deptno = d.deptno And (sal+nvl(comm,0))*12 > any (select (sal+nvl(com,0))*12 from emp

Where deptno=20);

6. Escribir la instrucción sql que presente en pantalla todos los datos del empleado y todos los datos del departamento de todos aquellos empleados que trabajan en la ciudad de NEY YORK y que desepeñan el trabajo de obrero,

Select e.* from emp e, dept dWhere e.deptno=d.deptnoAnd loc=’NEY YORK’ And job = ‘CLERK’;

7. Escribir la instrucción sql que presente en pantalla todos los datos del empleado más el nombre del departamento de todos aquellos empleados que ganan una comisión superior al 20% de su salario.

Select e.*, d.dname from emp e, dept dWhere e.deptno = d.deptno And comm>(select sal*0.12 from emp x

Where e.empno = x.empno);

25

Page 27: Materia de Base (Ing. Gordillo)

Otra forma sin el uso de select sincronizados

Select e.*, d.dname from emp e, dept dWhere e.deptno = d.deptno And comm> sal*0.12;

26