martes, 23 de agosto de 2011

SQL 1

ALUMNO: MARCELO ALEJO CALLE

INNER JOIN  -> Combinación interna

Con esta operación se calcula el producto cruzado de todos los registros; así cada registro en la tabla A es combinado con cada registro de la tabla B; pero sólo permanecen aquellos registros en la tabla combinada que satisfacen las condiciones que se especifiquen. Este es el tipo de JOIN más utilizado por lo que es considerado el tipo de combinación predeterminado.

SQL:2003 especifica dos formas diferentes para expresar estas combinaciones. La primera, conocida como explícita usa la palabra JOIN, mientras que la segunda es implícita y usa ',' para separar las tablas a combinar en la sentencia FROM de la declaración SELECT. Entonces siempre se genera el producto cruzado del cual se seleccionan las combinaciones que cumplan lo que indica la sentencia WHERE.

Es necesario tener especial cuidado cuando se combinan columnas con valores nulos NULL ya que el valor nulo no se combina con otro valor o con otro nulo, excepto cuando se le agregan predicados tales como IS NULL o IS NOT NULL.

Como ejemplo, la siguiente consulta toma todos los registros de la tabla Empleado y encuentra todas las combinaciones en la tabla Departamento. La sentencia JOIN compara los valores en la columna IDDepartamento en ambas tablas. Cuando no existe esta correspondencia entre algunas combinaciones, éstas no se muestran; es decir que si el número de departamento de un empleado no coincide con los números de departamento de la tabla Departamento, no se mostrará el empleado con su respectivo departamento en la tabla resultante.

Las dos consultas siguientes son similares, y se realizan de manera explicita (A) e implícita (B).

A. Ejemplo de la sentencia INNER JOIN explícita:

SELECT *
FROM   empleado
       INNER JOIN cargo
          ON empleado.codCargo = cargo.codCar

B. Ejemplo de la sentencia INNER JOIN implícita:

SELECT *
FROM   empleado,cargo
WHERE  empleado.codCargo = cargo.codCar


El empleado Gaspar y el departamento de Mercadeo no son presentados en los resultados ya que ninguno de éstos tiene registros correspondientes en la otra tabla. No existe un departamento con número 36 ni existe un empleado con número de departamento 35.
A la combinación que utiliza comparaciones dentro del predicado JOIN se le llama theta-join.
C. Ejemplo de combinación tipo theta:

SELECT *
FROM   venta
       INNER JOIN detalle_venta
          ON venta.nro < detalle_venta.nrod


Las operaciones INNER JOIN puede ser clasificadas como de equivalencia, naturales, y cruzadas.

De equivalencia (equi-join)

Es una especie de theta-join que usa comparaciones de igualdad en el predicado JOIN. Cuando se usan operadores, tales como < o > no se puede clasificar en este rango.

D. Ejemplo de combinación de equivalencia:

SELECT *
FROM   empleado
       INNER JOIN cargo
          ON empleado.codCargo = cargo.codCar

La tabla resultante presenta dos columnas llamadas IDDepartamento, una proveniente de la tabla Empleado y otra de la tabla Departamento.


Cruzada (CROSS JOIN)

Presenta el producto cartesiano de todos los registros de las dos tablas.

El código SQL para realizar este producto cartesiano enuncia las tablas que serán combinadas, pero no incluye algún predicado que filtre el resultado.

F. Ejemplo de combinación cruzada explícita:

SELECT *
FROM   venta CROSS JOIN detalle_venta

G. Ejemplo de combinación cruzada implícita:

SELECT *
FROM   empresa, contacto;

Esta clase de combinaciones son usadas pocas veces, generalmente se les agregan condiciones de filtrado con la sentencia WHERE para hallar resultados específicos.

Combinación externa (OUTER JOIN)

Mediante esta operación no se requiere que cada registro en las tablas a tratar tenga un registro equivalente en la otra tabla. El registro es mantenido en la tabla combinada si no existe otro registro que le corresponda.

Este tipo de operación se subdivide dependiendo de la tabla a la cual se le admitirán los registros que no tienen correspondencia, ya sean de tabla izquierda, de tabla derecha, o combinación completa.

De tabla izquierda (LEFT OUTER JOIN o LEFT JOIN)

El resultado de esta operación siempre contiene todos los registros de la tabla de la izquierda (la primera tabla que se menciona en la consulta), aun cuando no exista un registro correspondiente en la tabla de la derecha, para uno de la izquierda.

    La sentencia LEFT OUTER JOIN retorna la pareja de todos los valores de la tabla izquierda con los valores de la tabla de la derecha correspondientes, o retorna un valor nulo NULL en caso de no correspondencia.

A diferencia del resultado presentado en los ejemplos A y B (de combinación interna) donde no se mostraba el empleado cuyo departamento no existía; en el siguiente ejemplo se presentarán los empleados con su respectivo departamento, e inclusive se presentará el empleado, cuyo departamento no existe.

H. Ejemplo de tabla izquierda para la combinación externa:

SELECT *
FROM   empleado
       LEFT OUTER JOIN cargo
          ON empleado.codCargo = cargo.codCar

 De tabla derecha (RIGHT OUTER JOIN o RIGHT JOIN)

Esta operación es inversa a la anterior; el resultado de esta operación siempre contiene todos los registros de la tabla de la derecha (la segunda tabla que se menciona en la consulta), aun cuando no exista un registro correspondiente en la tabla de la izquierda, para uno de la derecha.

    La sentencia RIGHT OUTER JOIN retorna la pareja de todos los valores de la tabla derecha con los valores de la tabla de la izquierda correspondientes, o retorna un valor nulo NULL en caso de no correspondencia.

I. Ejemplo de tabla derecha para la combinación externa:

SELECT *
FROM   empleado
       RIGHT OUTER JOIN cargo
          ON empleado.codCargo = cargo.codCar

En este caso el área de Mercadeo fue presentada en los resultados, aunque aún no hay empleados registrados en dicha área.

combinación completa (FULL OUTER JOIN)

Esta operación presenta los resultados de tabla izquierda y tabla derecha aunque no tengan correspondencia en la otra tabla. La tabla combinada contendrá, entonces, todos los registros de ambas tablas y presentará valores nulos NULLs para registros sin pareja.

J. Ejemplo de combinación externa completa:

SELECT * 
FROM   empleado
       FULL OUTER JOIN cargo
          ON empleado.codCargo = cargo.codCar



Como se puede notar, en este caso se encuentra el empleado Gaspar con valor nulo en su área correspondiente, y se muestra además el departamento de Mercadeo con valor nulo en los empleados de esa área.

Algunos sistemas de bases de datos no soportan esta funcionalidad, pero esta puede ser emulada a través de las combinaciones de tabla izquierda, tabla derecha y de la sentencia de unión union.

K. El mismo ejemplo puede expresarse así:

SELECT *
FROM   empleado
       LEFT JOINcargo
          ON empleado.codCargo = cargo.codCar
UNION
SELECT *
FROM   empleado
       RIGHT JOIN cargo
          ON empleado.codCargo = cargo.codCar
WHERE  empleado.codCargo IS NULL


Funciones de agregación
Las funciones de agregación operan sobre conjuntos de filas de una tabla con el objeto de dar un resultado en un SELECT.

Ejemplos:
Obtener cuántas asignaturas existen en la universidad:
Obtener el mayor número de alumnos matriculados en una asignatura
Obtener la media de alumnos matriculados en una asignatura:
Obtener la suma total de los alumnos de las asignaturas:

Funciones de agregación – tipos 

  • AVG([DISTINCT | ALL] n) Valor promedio de n, ignorando nulos.
  • COUNT(* | [DISTINCT | ALL] expr) Número de filas, en donde la expresión evalúa a un valor diferente de nulo. Si se coloca * cuenta todas las filas incluyendo duplicados y filas con nulos.
  • MAX([DISTINCT | ALL] expr ) Máximo valor de la expresión ignorando nulos.
  • MIN([DISTINCT | ALL] expr) Mínimo valor de la expresión ignorando nulos.
  • SUM([DISTINCT | ALL] n) Suma de valores de n ignorando nulos
·         Los tipos de datos para expr son CHAR, VARCHAR2, NUMBER y DATE.
·         Los tipos de datos para n son numéricos.

Sintaxis
      SELECT columna, ffunciion_de_agrregaciion((columna)
      FROM tabla
      [WHERE condicion]
      [ORDER BY columna];

Ejemplo:
" Obtener cuántas asignaturas existen en la universidad: "
      SELECT COUNT(*)   FROM ASIGNATURAS;

“Obtener cuantas asignaturas hay que tengan 9 créditos y sean troncales”
      SELECT COUNT(*)   FROM ASIGNATURAS       WHERE CREDITOS=9 AND CLASE=’T’;

La cláusula GROUP BY seguida de una lista de atributos permite agrupar las tuplas en grupos que tengan los mismos valores en todos los atributos de esa lista

Ejemplo:
“Obtener el número de profesores de cada área”
      SELECT COUNT(*) ,AREA   FROM PROFESORES   GROUP BY AREA;

Si queremos que aparezca con un alias de columna: nº de profesores (hay que poner doble comilla “” ya que hay espacios en blanco)
      SELECT COUNT(*) "nº de profesores",AREA
      FROM PROFESORES   GROUP BY AREA;

Si queremos que aparezca en el SELECT el literal profesores de
      SELECT COUNT(*) || ' profesores de '|| AREA
      FROM PROFESORES   GROUP BY AREA;

La cláusula HAVING permite establecer una condición sobre los grupos de manera que sólo se seleccionan aquellos grupos que la cumplen “listar los profesores y el nº de clases que imparten, pero sólo de aquellos profesores que imparten más de 10 clases”
      SELECT PROFESOR,COUNT(*)
      FROM DOCENCIA
      GROUP BY PROFESOR
      HAVING COUNT(*)>10;

BD Supermercado


INFORME DE LABORATORIO INF-272
Nombre: MARCELO ALEJO CALLE
Materia: INF-272
===============================================================================
SCRIPT  DE CREACION
create database superMercado

SCRIPT  DE  CREACION DE TABLAS

USE superMercado

CREATE TABLE CLIENTE(
        nit integer not null,
        ci varchar(15),
        paterno varchar(15),
        materno varchar(15),
           nombre_RazonSocial varchar(15),
        direccion  varchar(15),
           fono Varchar(15),
primary key(nit)
);

CREATE TABLE PRODUCTO(
        codProd varchar(15) not null,
        nombre varchar(40) not null,
           precioCpra float,
           precioVta float,
primary key(codProd)
);

CREATE TABLE EMPRESA(
        cod varchar(5) not null,
        nombre varchar(15),
        ubicacion varchar(15),
           fono Varchar(15),
        primary key(cod)
);

CREATE TABLE CONTACTO(
        ci varchar(15) not null,
        codEmp varchar(5) not null,
        paterno varchar(15),
        materno varchar(15),
       nombre varchar(15),
           fono Varchar(15),
primary key(ci,codEmp),
foreign key(codEmp) references Empresa);
CREATE TABLE CARGO(
        codCar varchar(5) not null,
        nombre varchar(40) not null,
        descr varchar(200),
primary key(codCar)
);


CREATE TABLE EMPLEADO(
        ci varchar(15) not null,
        nombre varchar(40) not null,
        paterno varchar(15),
        materno varchar(15),
           sueldo integer,
           turno varchar(15),
        codCargo varchar(5),
primary key(ci),
foreign key(codCargo) references cargo
);

CREATE TABLE COMPRA(
        nro integer not null,
           codResp varchar(15),
           codEmp varchar(5),
        monto float,
        fecha datetime,
 primary key(nro),
 foreign key(codResp)REFERENCES EMPLEADO,
 foreign key(codEmP)REFERENCES EMPRESA
);

CREATE TABLE DETALLE_COMPRA(
        nro integer not null,
           nrod integer not null,
        codPro varchar(15),
           cantidad integer,
           precioc float,
        primary key(nro,nrod),
        foreign key(nro) REFERENCES COMPRA,
        foreign key(codPro) REFERENCES PRODUCTO
);
CREATE TABLE VENTA(
        nro integer not null,
           codCaj varchar(15),
           nit integer,
        fecha datetime,
        hora datetime,
           monto float,
primary key(nro),
foreign key(codCaj)REFERENCES EMPLEADO,
foreign key(nit)REFERENCES CLIENTE
);

CREATE TABLE DETALLE_VENTA(
        nro integer not null,
           nrod integer not null,
        codPro varchar(15),
           cantidad integer,
           descuento integer,
primary key(nro,nrod),
foreign key(nro) REFERENCES VENTA,
foreign key(codPro) REFERENCES PRODUCTO
);

SCRIPT DE INSERCION DE DATOS
USE superMercado
--CLIENTE
INSERT INTO CLIENTE VALUES(111,'id1','loza','mamani','luis','Av.Sucre','F111')
INSERT INTO CLIENTE VALUES(222,'id2','Llanos','Condori','Miraflores','Marco','F222')
INSERT INTO CLIENTE VALUES(333,'id3','Peres','Copa','Ana','C.RosGutierrez','F333')
INSERT INTO CLIENTE VALUES(777,null,null,null,'UMSA','Av. Villazon','F777')
INSERT INTO CLIENTE VALUES(888,null,null,null,'CNS','El Prado','F888')
INSERT INTO CLIENTE VALUES(999,null,null,null,'MinEducacion','Av.Principal','F999')
--PRODUCTO
INSERT INTO PRODUCTO VALUES('pr1','Nescafe',20,30)
INSERT INTO PRODUCTO VALUES('pr2','Aceite Fino',50,70)
INSERT INTO PRODUCTO VALUES('pr3','Sedal',15,25)
INSERT INTO PRODUCTO VALUES('pr4','pil 1 litro',3,6)
INSERT INTO PRODUCTO VALUES('pr5','yogourt',15,25)
INSERT INTO PRODUCTO VALUES('pr6','queso',15,25)
INSERT INTO PRODUCTO VALUES('pr7','galleta',5,7)
INSERT INTO PRODUCTO VALUES('pr8','vino',15,25)
--EMPRESA
INSERT INTO EMPRESA VALUES('e001','Pil','El Alto','ff1')
INSERT INTO EMPRESA VALUES('e002','Venado','SantaCruz','ff2')
INSERT INTO EMPRESA VALUES('e003','Aceite Fino','santaCruz','ff3')
--CONTACTO
INSERT INTO CONTACTO VALUES(123,'e001','Linares','Layme','Pedro','70623123')
INSERT INTO CONTACTO VALUES(321,'e001','Sanjines','Salinas','Jaime','70623444')
INSERT INTO CONTACTO VALUES(234,'e002','Millares','Llanos','Pablo','70623555')
INSERT INTO CONTACTO VALUES(345,'e003','Laura','Altamirano','Rogelio','70623666')
--CARGO
INSERT INTO CARGO VALUES('car01','Cajero','Atencion en cajas')
INSERT INTO CARGO VALUES('car02','Contador','Administracion de cuentas')
INSERT INTO CARGO VALUES('car03','Supervisor','Control de compras y ventas')
INSERT INTO CARGO VALUES('car04','JefeCompras','Control de compras')
--EMPLEADO
INSERT INTO EMPLEADO VALUES(789,'Murillo','Mejillones','Carlos',100,'tarde','car01')
INSERT INTO EMPLEADO VALUES(897,'Terrazas','Miranda','Miriam',100,'mañana','car01')
INSERT INTO EMPLEADO VALUES(978,'Perez','Alarcon','Clara',100,'noche','car01')
INSERT INTO EMPLEADO VALUES(567,'Quiroz','Ruiz','Miguel',500,null,'car03')
--COMPRA
INSERT INTO COMPRA VALUES(1,567,'e001',156.89,'1/1/2011')
INSERT INTO COMPRA VALUES(2,567,'e002',156.89,'2/2/2011')
INSERT INTO COMPRA VALUES(3,567,'e003',156.89,'3/3/2011')
--DETALLE_COMPRA
INSERT INTO DETALLE_COMPRA VALUES(1,1,'pr4',500,5)
INSERT INTO DETALLE_COMPRA VALUES(1,2,'pr5',300,10)
INSERT INTO DETALLE_COMPRA VALUES(1,3,'pr6',150,15)
--VENTA
INSERT INTO VENTA VALUES(1,789,111,'1/1/2011','15:00',1300)
INSERT INTO VENTA VALUES(2,897,222,'1/1/2011','17:00',100)
INSERT INTO VENTA VALUES(3,978,333,'2/1/2011','18:00',320)
--DETALLE VENTA
INSERT INTO DETALLE_VENTA VALUES(1,1,'pr1',3,0)
INSERT INTO DETALLE_VENTA VALUES(1,2,'pr2',10,0)
INSERT INTO DETALLE_VENTA VALUES(1,3,'pr3',50,0)
INSERT INTO DETALLE_VENTA VALUES(1,4,'pr4',20,0)

INSERT INTO DETALLE_VENTA VALUES(2,1,'pr4',3,0)
INSERT INTO DETALLE_VENTA VALUES(2,2,'pr5',10,0)
INSERT INTO DETALLE_VENTA VALUES(2,3,'pr3',50,0)

INSERT INTO DETALLE_VENTA VALUES(3,1,'pr1',3,0)
INSERT INTO DETALLE_VENTA VALUES(3,2,'pr2',10,0)
INSERT INTO DETALLE_VENTA VALUES(3,3,'pr3',50,0)

DIAGRAMA DE LA BASE DE DATOS