Está en la página 1de 26

PROYECTO DE FIN DE CURSO

BASES DE DATOS

 MARTIN BRAVO
 ILIANA CARVAJAL
 GABRIELA COELLO
 DARIO PIEDRA
 ANDRES VILLAVICENCIO
INTRODUCCION

PostgreSQL

Es un sistema de gestión de base de datos relacional orientada a objetos de


software libre, publicado bajo la licencia BSD. Como muchos otros proyectos
open source, el desarrollo de PostgreSQL no es manejado por una sola
compañía sino que es dirigido por una comunidad de desarrolladores y orga-
nizaciones comerciales las cuales trabajan en su desarrollo. Dicha comuni-
dad es denominada el PGDG (PostgreSQL Global Development Group).

Ultimas versiones de PostgreSQL

PostgreSQL versión 8.3: con nuevas funcionalidades y mejoras en el ren-


dimiento, que tenemos que agradecer a la comunidad de desarrolladores
que apoya el proyecto y que han dado un gran impulso al desarrollo del ges-
tor de base de datos. Con la tecnología HOT (Heap-Only Tuples) se ace-
lera la reutilización de espacio para la mayoría de UPDATEs y DELETEs para
ganar en velocidad, teniendo que una tupla dada (o registro) no tiene que
estar necesariamente sincronizada con el estado definitivo de la base de da-
tos.

PostgreSQL versión 8.3.7: Esta versión se caracteriza por incluir gran


cantidad de mejoras en la administración, consulta y programación de bases
de datos con el ánimo de hacer más fácil PostgreSQL que nunca.
INTRODUCCION

Ventajas y Desventajas

Ventajas: Restauración de la base de datos en paralelo acelerando la recu-


peración hasta 8 veces desde una copia de seguridad.

Permisos por columna, permitiendo un manejo mucho mas granular de datos


sensibles. Soporte de colasión por base de datos característica especialmente
útil en ambientes multi lenguajes. Actualizaciones a través de pg_migrator
(beta), que permite actualizaciones de 8,3 a 8,4, sin mucho tiempo fuera de
línea. Nuevas herramientas de monitereo de consultas dando al administra-
dor una vista más profunda de una transacción. VACUUM extraordinariamen-
te optimizado a través de la reducción de la visibilidad mapa. Nuevas herra-
mientas de control para actuales consultas, consulta y bloqueos de carga.

Desventajas: MySQL es más rápida que PostgreSQL a la hora de resolver


consultas. MySQL tiene mejor documentación y se ha orientado más a facili-
tarle la vida al desarrollador proporcionando mejores herramientas de admi-
nistración.
INSTALACION

Como primer paso es necesario descargar el


software, esto se puede realizar en el siguiente
enlace:
http://www.postgresql.org/download/

Luego se mostrara la pantalla de inicio para co-


menzar la instalación de PostgreSQL en la cual
INSTALACION

En la siguiente pantalla que aparecerá debemos


escoger el directorio de instalación, luego de es-
coger este directorio debemos hacer clic en si-
guiente.
INSTALACION

En este punto debemos escribir una contraseña para


el super usuario, luego de hacer esto debemos hacer
clic en siguiente.
INSTALACION

En este momento debemos escribir el puerto


donde podrá conectarse el programa, luego
debemos hacer clic en siguiente.
INSTALACION

En opciones avanzadas debemos escoger la


configuración regional del nuevo clúster de
base de datos, en esta pantalla debemos
seleccionar Spanish, Ecuador, luego debe-
mos hacer clic en siguiente.
INSTALACION

En este momento luego de haber configura-


do, el programa está listo para instalarse al
hacer clic en siguiente el programa comen-
zara a instalarse.
INSTALACION

En este momento solo resta esperar que el


programa termine de instalarse clic en
siguiente.
INSTALACION

Clic en terminar y finalizo la


instalación.
POSTGRESQL
CR

Para conectarse a la base de datos, damos doble clic en la para donde dice servi-
dor y ponemos la contraseña y automáticamente se conecta al servidor del post-
greSQL.

Luego aparecerá esta ventana donde pide que ingresemos la contraseña que le
asignamos al momento de la instalación.

Ponemos la contraseña correcta y damos clic en OK.


POSTGRESQL

Entonces aparecerá esta ventana

Entonces al momento de queremos crear una base de datos, damos clic derecho en
bases de datos, ponemos crear nueva base de datos
POSTGRESQL

Damos clic en OK y la base de datos ya estará creada.


El área de texto para realizar consultas, la obtenemos
dando clic en el icono siguiente.
Que se encuentra en la parte superior.
POSTGRESQL

CREATE TABLE
Create Tabla es el comando fundamental para definir datos es el que crea una nueva rela-
ción (una nueva tabla). La sintaxis del comando CREATE TABLE es:
CREATE TABLE table_name
(name_of_attr_1 type_of_attr_1
[, name_of_attr_2 type_of_attr_2
[, ...]]);
A continuación sigue una lista de algunos tipos de datos soportados por POSTGRESQL:
INTEGER: entero binario con signo de palabra completa (31 bits de precisión).
SMALLINT: entero binario con signo de media palabra (15 bits de precisión).
DECIMAL (p[,q]): número decimal con signo de p dígitos de precisión, asumiendo
q a la derecha para el punto decimal. (15 _ p _ qq _ 0). Si q se omite, se asume
que vale 0.
FLOAT: numérico con signo de doble palabra y coma flotante.
CHAR(n): cadena de caracteres de longitud fija, de longitud n.
VARCHAR(n): cadena de caracteres de longitud variable, de longitud máxima n.
Ejemplos. Creación de una tabla
Tabla Empleados
CREATE TABLE EMPLEADOS(
EMPLEADOID int NOT NULL,
NOMBRE char(30) NULL,
APELLIDO char(30) NULL,
FECHA_NAC date NULL,
REPORTA_A int NULL,
EXTENSION int NULL,
CONSTRAINT PK_EMPLEADOS PRIMARY KEY (EMPLEADOID),
CONSTRAINT FK_EMPLEADO_REPORTA FOREIGN KEY(REPORTA_A)
REFERENCES EMPLEADOS (EMPLEADOID))
POSTGRESQL

DROP TABLE
Se utiliza el comando DROP TABLE para eliminar una tabla (incluyendo todas las
tuplas almacenadas en ella):
DROP TABLE table_name;

INSERT INTO
Una vez que se crea una tabla puede ser llenada con tuplas
mediante el comando INSERT INTO. La sintaxis es:

INSERT INTO table_name (name_of_attr_1


[, name_of_attr_2 [,...]])
VALUES (val_attr_1
[, val_attr_2 [, ...]]);

Ejemplo de Inserción de datos


use PEDIDOS
go
insert into categorias (categoriaid, nombrecat) values (100, 'CARNICOS')
POSTGRESQL

Update
Para cambiar uno o más valores de atributos de tuplas en una relación, se utiliza el
comando UPDATE. La sintaxis es:
UPDATE table_name
SET name_of_attr_1 = value_1
[, ... [, name_of_attr_k = value_k]]
WHERE condition;

Delete
Para borrar una tupla de una tabla particular, utilizamos el comando DELETE FROM.
La sintaxis es:
DELETE FROM table_name
WHERE condition;
SCRIPT BASE DE DATOS PEDIDOS

La creación de la base de datos es automática y genera este código

CREATE DATABASE "PEDIDOS"


WITH OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'Spanish_Spain.1252'
LC_CTYPE = 'Spanish_Spain.1252'
CONNECTION LIMIT = -1;

CREATE TABLE EMPLEADOS(


EMPLEADOID int NOT NULL,
NOMBRE char(30) NULL,
APELLIDO char(30) NULL,
FECHA_NAC date NULL,
REPORTA_A int NULL,
EXTENSION int NULL,
CONSTRAINT PK_EMPLEADOS PRIMARY KEY (EMPLEADOID),
CONSTRAINT FK_EMPLEADO_REPORTA FOREIGN KEY(REPORTA_A)
REFERENCES EMPLEADOS (EMPLEADOID))

CREATE TABLE PROVEEDORES(


PROVEEDORID int NOT NULL,
NOMBREPROV char(50) NOT NULL,
CONTACTO char(50) NOT NULL,
CELUPROV char(12) NULL,
FIJOPROV char(12) NULL,
CONSTRAINT PK_PROVEEDORES PRIMARY KEY
(PROVEEDORID ) )

CREATE TABLE CATEGORIAS(


CATEGORIAID int NOT NULL,
NOMBRECAT char(50) NOT NULL,
CONSTRAINT PK_CATEGORIAS PRIMARY KEY
(CATEGORIAID) )

CREATE TABLE CLIENTES (


CLIENTEID int NOT NULL,
CEDULA_RUC char(10) NOT NULL,
NOMBRECIA char(30) NOT NULL,
NOMBRECONTACTO char(50) NOT NULL,
DIRECCIONCLI char(50) NOT NULL,
FAX char(12) NULL,
EMAIL char(50) NULL,
CELULAR char(12) NULL,
FIJO char(12) NULL,
CONSTRAINT PK_CLIENTES PRIMARY KEY
(CLIENTEID) )
SCRIPT BASE DE DATOS PEDIDOS

CREATE TABLE ORDENES(


ORDENID int NOT NULL,
EMPLEADOID int NOT NULL,
CLIENTEID int NOT NULL,
FECHAORDEN date NOT NULL,
DESCUENTO int NULL,
CONSTRAINT PK_ORDENES PRIMARY KEY
(ORDENID),
CONSTRAINT FK_ORDENES_CLIEN_ORD_CLIENTES FOREIGN KEY(CLIENTEID)
REFERENCES CLIENTES (CLIENTEID),
CONSTRAINT FK_ORDENES_EMPLE_ORD_EMPLEADO FOREIGN KEY(EMPLEADOID)
REFERENCES EMPLEADOS(EMPLEADOID))

CREATE TABLE DETALLE_ORDENES(


ORDENID int NOT NULL,
DETALLEID int NOT NULL,
PRODUCTOID int NOT NULL,
CANTIDAD int NOT NULL,
CONSTRAINT PK_DETALLE_ORDENES PRIMARY KEY
(ORDENID,DETALLEID ),
CONSTRAINT FK_DETALLE__ORDEN_DET_ORDENES FOREIGN KEY(ORDENID)
REFERENCES ORDENES (ORDENID),
CONSTRAINT FK_DETALLE__PROD_DETA_PRODUCTO FOREIGN KEY(PRODUCTOID)
REFERENCES PRODUCTOS (PRODUCTOID)
)

CREATE TABLE PRODUCTOS(


PRODUCTOID int NOT NULL,
PROVEEDORID int NOT NULL,
CATEGORIAID int NOT NULL,
DESCRIPCION char(50) NULL,
PRECIOUNIT numeric NOT NULL,
EXISTENCIA int NOT NULL,
CONSTRAINT PK_PRODUCTOS PRIMARY KEY
(PRODUCTOID ),
CONSTRAINT FK_PRODUCTO_CATE_PROD_CATEGORI FOREIGN KEY(CATEGORIAID)
REFERENCES CATEGORIAS (CATEGORIAID),
CONSTRAINT FK_PRODUCTO_PROV_PROD_PROVEEDO FOREIGN KEY(PROVEEDORID)
REFERENCES PROVEEDORES (PROVEEDORID))
SCRIPT BASE DE DATOS PEDIDOS

insert into categorias (categoriaid, nombrecat) values (100, 'CARNICOS')


insert into categorias (categoriaid, nombrecat) values (200, 'LACTEOS')
insert into categorias (categoriaid, nombrecat) values (300, 'LIMPIEZA')
insert into categorias (categoriaid, nombrecat) values (400, 'HIGINE PERSONAL')
insert into categorias (categoriaid, nombrecat) values (500, 'MEDICINAS')
insert into categorias (categoriaid, nombrecat) values (600, 'COSMETICOS')
insert into categorias (categoriaid, nombrecat) values (700, 'REVISTAS')

select * from categorias


insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(10, 'DON DIEGO', 'MANUEL ANDRADE', '099234567','2124456')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(20, 'PRONACA', 'JUAN PEREZ', '0923434467','2124456')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(30, 'TONY', 'JORGE BRITO', '099234567','2124456')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(40, 'MIRAFLORES', 'MARIA PAZ', '098124498','2458799')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(50, 'ALMAY', 'PEDRO GONZALEZ', '097654567','2507190')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(60, 'REVLON', 'MONICA SALAS', '099245678','2609876')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(70, 'YANBAL', 'BETY ARIAS', '098124458','2450887')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(120, 'JURIS', 'MANUEL ANDRADE', '099234567','2124456')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(80, 'CLEANER', 'MANUEL ANDRADE', '099234567','2124456')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(90, 'BAYER', 'MANUEL ANDRADE', '099234567','2124456')
insert into proveedores (proveedorid, nombreprov, contacto,celuprov,fijoprov) values
(110, 'PALMOLIVE', 'MANUEL ANDRADE', '099234567','2124456')
select * from proveedores

INSERT INTO PRODUCTOS VALUES (1,10,100,'SALCHICHAS VIENESAS',2.60,200);


INSERT INTO PRODUCTOS VALUES (2,10,100,'SALAMI DE AJO',3.60,300);
INSERT INTO PRODUCTOS VALUES (3,10,100,'BOTON PARA ASADO',4.70,400);
INSERT INTO PRODUCTOS VALUES (4,20,100,'SALCHICHAS DE POLLO',2.90,200);
INSERT INTO PRODUCTOS VALUES (5,20,100,'JAMON DE POLLO',2.80,100);
INSERT INTO PRODUCTOS VALUES (6,30,200,'YOGURT NATURAL',4.30,80);
INSERT INTO PRODUCTOS VALUES (7,30,200,'LECHE CHOCOLATE',1.60,90);
INSERT INTO PRODUCTOS VALUES (8,40,200,'YOGURT DE SABORES',1.60,200);
INSERT INTO PRODUCTOS VALUES (9,40,200,'CREMA DE LECHE',3.60,30);
INSERT INTO PRODUCTOS VALUES (10,50,600,'BASE DE MAQUILLAJE',14.70,40);
INSERT INTO PRODUCTOS VALUES (11,50,600,'RIMMEL',12.90,20);
select * from productos
SCRIPT BASE DE DATOS PEDIDOS

set datestyle to dmy

INSERT INTO EMPLEADOS VALUES (1,'JUAN', 'CRUZ', '18/01/67',null, 231)


INSERT INTO EMPLEADOS VALUES (2,'MARIO', 'SANCHEZ', '01/03/79',1,144)
INSERT INTO EMPLEADOS VALUES (3,'VERONICA', 'ARIAS', '23/06/77',1, 234)
INSERT INTO EMPLEADOS VALUES (4,'PABLO', 'CELY', '28/01/77',2, 567)
INSERT INTO EMPLEADOS VALUES (5,'DIEGO', 'ANDRADE', '15/05/70',2, 890)
INSERT INTO EMPLEADOS VALUES (6,'JUAN', 'ANDRADE', '17/11/76',3, 230)
select * from empleados

INSERT INTO CLIENTES VALUES (1,'1890786576','SUPERMERCADO ESTRELLA','JUAN


ALBAN','AV.AMAZONAS',NULL,NULL,NULL,NULL)
INSERT INTO CLIENTES VALUES (2,'1298765477','EL ROSADO','MARIA CORDERO','AV.AEL
INCA',NULL,NULL,NULL,NULL)
INSERT INTO CLIENTES VALUES (3,'1009876567','DISTRIBUIDORA PRENSA','PEDRO PINTO','EL
PINAR',NULL,NULL,NULL,NULL)
INSERT INTO CLIENTES VALUES (4,'1876090006','SU TIENDA','PABLO
PONCE','AV.AMAZONAS',NULL,NULL,NULL,NULL)
INSERT INTO CLIENTES VALUES (5,'1893456776','SUPERMERCADO DORADO','LORENA
PAZ','AV.6 DICIEMBRE',NULL,NULL,NULL,NULL)
INSERT INTO CLIENTES VALUES (6,'1678999891','MI COMISARIATO','ROSARIO
UTRERAS','AV.AMAZONAS',NULL,NULL,NULL,NULL)
INSERT INTO CLIENTES VALUES (7,'1244567888','SUPERMERCADO DESCUENTO','LETICIA
ORTEGA','AV.LA PRENSA',NULL,NULL,NULL,NULL)
INSERT INTO CLIENTES VALUES (8,'1456799022','EL DESCUENTO','JUAN
TORRES','AV.PATRIA',NULL,NULL,NULL,NULL)
INSERT INTO CLIENTES VALUES (9,'1845677777','DE LUISE','JORGE
PARRA','AV.AMAZONAS',NULL,NULL,NULL,NULL)
INSERT INTO CLIENTES VALUES (10,'183445667','YARBANTRELLA','PABLO
POLIT','AV.REPUBLICA',NULL,NULL,NULL,NULL)
select * from clientes

INSERT INTO ORDENES VALUES(1,3,4,'17/06/07', 5)


INSERT INTO ORDENES VALUES(2,3,4,'02/06/07', 10)
INSERT INTO ORDENES VALUES(3,4,5,'05/06/07', 6)
INSERT INTO ORDENES VALUES(4,2,6,'06/06/07', 2)
INSERT INTO ORDENES VALUES(5,2,7,'09/06/07', NULL)
INSERT INTO ORDENES VALUES(6,4,5,'12/06/07', 10)
INSERT INTO ORDENES VALUES(7,2,5,'14/06/07', 10)
INSERT INTO ORDENES VALUES(8,3,2,'13/06/07', 10)
INSERT INTO ORDENES VALUES(9,3,2,'17/06/07', 3)
INSERT INTO ORDENES VALUES(10,2,2,'18/06/07', 2)
select * from ordenes
SCRIPT BASE DE DATOS PEDIDOS

insert into detalle_ordenes values(1,1,1,2)


insert into detalle_ordenes values(1,2,4,1)
insert into detalle_ordenes values(1,3,6,1)
insert into detalle_ordenes values(1,4,9,1)

insert into detalle_ordenes values(2,1,10,10)


insert into detalle_ordenes values(2,2,13,20)
insert into detalle_ordenes values(3,1,3,10)
insert into detalle_ordenes values(4,1,9,12)

insert into detalle_ordenes values(5,1,1,14)


insert into detalle_ordenes values(5,2,4,20)
insert into detalle_ordenes values(6,1,3,12)
insert into detalle_ordenes values(7,1,11,10)

insert into detalle_ordenes values(8,1,2,10)


insert into detalle_ordenes values(8,2,5,14)
insert into detalle_ordenes values(8,3,7,10)
insert into detalle_ordenes values(9,1,11,10)

select * from detalle_ordenes


CONSULTAS SOBRE LA BASE DE DATOS CREADA

1. Actualizar el precio unitario de los productos de la categoría CARNICOS, subiéndolos en un 10%

select * from productos


update productos
set preciounit= (preciounit*0.1) + preciounit

2. Actualizar el teléfono celular del proveedor cuyo contacto es MANUEL ANDRADE, con el valor
099010291

select * from proveedores


update proveedores
set celuprov= '0990101291'
where contacto= 'MANUEL ANDRADE'

3. Borrar el producto YOGURT DE SABORES

select * from productos


delete from productos
where descripcion ='YOGURT DE SABORES'

4. Realizar las siguientes consultas:

4.1 Mostrar todas las órdenes: el id de la orden, el apellido y nombre del empleado que la atendió
el nombre de la compañía cliente y la fecha de orden

SELECT * FROM ORDENES


select * from empleados
select * from clientes
select o.ordenid, e.empleadoid, e.nombre, e.apellido, o.fechaorden, c.clienteid, c.nombrecia from ordenes o,
empleados e, clientes c
where o.empleadoid=e.empleadoid and o.clienteid=c.clienteid

4.2 Mostrar la suma total de cada tipo de producto pedidos en todas las órdenes.

select * from detalle_ordenes


select productoid, sum (cantidad) from detalle_ordenes
group by productoid

4.3 Mostrar el número de órdenes atendidas por cada empleado, incluidos los que tienen 0 órdenes.
select * from empleados
select * from ordenes
select nombre , apellido , count (o.empleadoid) from empleados e left join ordenes o
on e.empleadoid= o.empleadoid
group by nombre, apellido
CONSULTAS SOBRE LA BASE DE DATOS CREADA

1. Actualizar el precio unitario de los productos de la categoría CARNICOS, subiéndolos en un 10%

select * from productos


update productos
set preciounit= (preciounit*0.1) + preciounit

2. Actualizar el teléfono celular del proveedor cuyo contacto es MANUEL ANDRADE, con el valor
099010291

select * from proveedores


update proveedores
set celuprov= '0990101291'
where contacto= 'MANUEL ANDRADE'

3. Borrar el producto YOGURT DE SABORES

select * from productos


delete from productos
where descripcion ='YOGURT DE SABORES'

4. Realizar las siguientes consultas:

4.1 Mostrar todas las órdenes: el id de la orden, el apellido y nombre del empleado que la atendió
el nombre de la compañía cliente y la fecha de orden

SELECT * FROM ORDENES


select * from empleados
select * from clientes
select o.ordenid, e.empleadoid, e.nombre, e.apellido, o.fechaorden, c.clienteid, c.nombrecia from ordenes o,
empleados e, clientes c
where o.empleadoid=e.empleadoid and o.clienteid=c.clienteid

4.2 Mostrar la suma total de cada tipo de producto pedidos en todas las órdenes.

select * from detalle_ordenes


select productoid, sum (cantidad) from detalle_ordenes
group by productoid

4.3 Mostrar el número de órdenes atendidas por cada empleado, incluidos los que tienen 0 órdenes.
select * from empleados
select * from ordenes
select nombre , apellido , count (o.empleadoid) from empleados e left join ordenes o
on e.empleadoid= o.empleadoid
group by nombre, apellido
CONSULTAS SOBRE LA BASE DE DATOS CREADA

4.4 Muestre los proveedores y la suma de dinero vendido en los productos de ese proveedor.

select * from proveedores


select * from productos
select * from detalle_ordenes

select prov.nombreprov,sum(d.cantidad * pro.preciounit ) from proveedores prov, productos pro,


detalle_ordenes d
where d.productoid= pro.productoid and prov.proveedorid= pro.proveedorid
group by nombreprov

5. Realizar el siguiente procedimiento almacenado.

5.1 Escriba un procedimiento almacenado que reciba como parámetro un código de proveedor y
devuelve el número de órdenes en las que están incluidos productos de ese proveedor.

select * from productos


select * from ordenes
select * from detalle_ordenes
create or replace function num_ordene_proveedor(idproo int) returns integer as $$
declare
num int;
begin
select count(p.productoid) into num from productos p join detalle_ordenes dor
on (p.productoid=dor.productoid)join ordenes ord on(ord.ordenid=dor.ordenid)
where proveedorid=idproo
group by proveedorid;
return num;
end;
$$LANGUAGE 'plpgsql';

select num_ordene_proveedor(10)
CONSULTAS SOBRE LA BASE DE DATOS CREADA

5.2 Escriba un procedimiento almacenado que reciba como parámetro un nombre de una categoría y
devuelve el código del producto de esa categoría que tiene más unidades vendidas.
select * from categorias
select * from productos
select * from detalle_ordenes

create or replace function mas_vendido (nomCat character(50)) returns integer as $$


declare
num int;
begin
select p.productoid,sum(cantidad)INTO NUM from productos p join categorias c on
(c.categoriaid=p.categoriaid)
join detalle_ordenes dor on (p.productoid=dor.productoid)
where c.nombrecat=nomCat
group by descripcion, p.productoid
order by sum DESC
limit 1;
return num;
end;
$$LANGUAGE 'plpgsql';

select mas_vendido('CARNICOS');