Professional Documents
Culture Documents
DDL Definicin
CREATE - Crear DROP - Borrar ALTER - Modificar
) INHERITS (nombre_tabla_base) ;
DDL Definicin
DROP DATABASE
drop database nombre_de_la_BD ;
DROP TABLE
drop table nombre_de_la_Tabla ;
DDL Definicin
ALTER DATABASE
ALTER DATABASE nombre OWNER TO usuario ; ALTER DATABASE nombre RENAME TO nuevo_nombre ;
DDL Definicin
ALTER TABLE
DROP
alter table productos drop existencias ;
ADD
alter table productos add existencias integer check (existencias>=0);
DML Manipulacin
INSERT Agregar (Insertar) UPDATE Modificar (Actualizar) DELETE Borrar (Eliminar) SELECT Listar (Seleccionar)
DML Manipulacin
INSERT
Insert into tabla (campos) values (valores) ; Insert into tabla1 (campos) select campos from tabla2 ; Insert into tabla1 select * from tabla2 ;
DML Manipulacin
UPDATE
Update nombre_tabla Set campo1 = valor1 , , campoN = valorN Where (Condicin) ;
DML Manipulacin
DELETE
Delete From nombre_tabla Where (Condicin) ;
DML Manipulacin
SELECT
Select campos From tablas Where (condicin) ; Select campos From tablas Where (condiciones) Group By campos Having (condicin) Order By campos Asc/Desc;
DML Manipulacin
SELECT
Select campos into variables From tablas ; Select funcion_almac (parametros) ; Select func_almac () into variable ;
Algunos Tipos Vlidos Para Create, Insert, Alter, que destacan son:
text timetz numeric [ (p, s) ] double precision varchar [ (n) ] boolean real date datetime serial bigserial integer bigint xml
UNIQUE (nombre_campo1, ..., nombre_campoN) NOT NULL NULL PRIMARY KEY UNIQUE REFERENCES nombre_tabla (PK_de_tabla_ext) FOREIGN KEY (campo1, camposN) REFERENCES tabla_ext (campo_ext1, campo_ext2) REFERENCES tabla_ext ON DELETE CASCADE ON UPDATE CASCADE
** La imagen ha sido extrada de la captura de pantalla Del programa de instalacin de PostgreSQL empaquetado Por EnterpriseDB, quien tiene los derechos reservados.
Sintaxis :
); Ejemplo: CREATE TYPE alumnos ( matricula varchar(50), nombre varchar(50), carrera varchar(50) ); AS
OBJETOS
);
MTODOS
Sintaxis : CREATE FUNCTION nombre_funcion (parametros) RETURNS tipo AS $$ DECLARE -- variables : nombre_variable tipo ; BEGIN -- sentencias SQL y de programacion RETURN variable_del_tipo ; END ; $$ LANGUAGE plpgsql ;
NOTA: LOS parmetros SE INTEGRAN POR : variable Tipo, ..... SEPARADOS POR COMA.
MTODOS
Ejemplo : CREATE FUNCTION civa (saldo numeric, iva integer) RETURNS numeric AS $$ DECLARE myiva numeric := 0; BEGIN myiva := (saldo * iva) / 100; RETURN myiva; END ; $$ LANGUAGE plpgsql ;
EVENTOS -
SE COMBINAN DOS ELEMENTOS: 1) EL USO DE FUNCTION CUYO TIPO DE RETORNO ES UN TRIGGER . Y 2) SE IMPLEMENTAN UTILIZANDO LA SIGUIENTE SINTAXIS:
PASO 1
CREATE OR REPLACE FUNCTION nombre (parametros) RETURNS TRIGGER AS $$ NOTA: LOS parmetros DECLARE POR : -- variables : nombre_variable tipo ; SE INTEGRAN variable Tipo, ..... SEPARADOS POR COMA. BEGIN -- sentencias SQL y de programacin RETURN Tipo_Trigger ; -- NEW , OLD, NULL NOTA: Donde: END ; MODIFICADOR $$ LANGUAGE plpgsql ;
puede ser BEFORE o AFTER. Y SENTENCIA puede ser DROP , INSERT, DELETE, UPDATE, ......
PASO 2
CREATE TRIGGER nombre_del_disparador MODIFICADOR SENTENCIA ON tabla FOR EACH ROW EXECUTE PROCEDURE nombre_function ( parametros);
NOTA: Para SENTENCIA o MODIFICADOR : BEFORE o DELETE o UPDATE, se recomienda el uso de OLD o NULL .
Oh My God
Primero, Lo Primero: CURSO PostgreSQL 8.4 ........................................... Para Entrar .................... 1.- Entrar a pgAdmin y hacer doble click sobre PostgreSQL 8.4 (localhost:5432) 2.- Teclear clave de acceso que se dio durante la instalacin (Por Ejemplo: 12345678)
Luego : Crear BD ................ 1.- Botn derecho sobre databases 2.- Click en opcin : New Database... 3.- Se escribe nombre a la BD, se selecciona un dueo (usuario), y se ajustan el resto de los parmetros y privilegios 4.- Se pulsa botn OK
Despus :
1.- Click sobre el nombre de la base de datos 2.- Se pulsa sobre signo + para expandir la estructura 3.- Se hace doble click sobre Schemas y luego doble click sobre public 4.- Luego, botn derecho sobre Tables 5.- Y CLick sobre New Table... 6.- Se escribe nombre a la tabla y se selecciona un dueo (usuario) 7.- En pestaa columns se pulsa botn add
7.1.- Se escribe nombre del campo y se selecciona un tipo de datos 7.2.- Se escribe valor por default 7.3.- Se indica si se desea Not Null (marcando la casilla de verificacin) 7.4.- Se pulsa botn OK 7.5.- Si desea otro campo, ir al paso 7
8.- Luego, en la pestaa constrains, se selecciona Primary Key y se pulsa botn add
8.1.- En pestaa columns, se selecciona el campo que sera clave primaria y se pulsa botn add 8.2.- Se pulsa OK a la ventana o dialogo
Finalmente : OTRA MANERA: -- USANDO COMANDO CREATE .... 1.- Se pulsa sobre boton de barra de herramientas SQL (Execute arbitrary SQL query) 2.- En la pestaa SQL Editor se escribe: create table datos_personales ( domicilio varchar(50) null, telefono numeric );
OTRO EJEMPLO: Crear una tabla productos usando Restricciones o constraints CREATE TABLE productos (
codigo_barras bigint PRIMARY KEY NOT NULL, descripcion varchar(40) NOT NULL, precio numeric (8, 2) NOT NULL CHECK (precio>0), costo numeric (8, 2) NOT NULL CHECK (costo>0), exist integer NULL CHECK (exist >= 0)
);
Ahora s , Que Vengan Los Ejemplos
Herencia ................
Suponiendo que proveedores y clientes tienen los mismos campos como datos personales, solo se crea la tabla con algunos datos y el resto se hereda: create table datos_personales ( domicilio varchar(50) null, telefono numeric );
create table proveedores ( clave_pro integer PRIMARY KEY, razon_social varchar(50) NOT NULL ) INHERITS (datos_personales); create table clientes ( clave_cli integer PRIMARY KEY, nombre varchar(50) NOT NULL, saldo float NOT NULL ) INHERITS (datos_personales);
clave integer PRIMARY KEY id integer UNIQUE descripcion NULL precio numeric CHECK(precio>0) costo numeric UNIQUE NOT NULL CHECK(costo<precio AND costo>0) UNIQUE (precio, costo) -- ERROR deben ser integer
Recordando ... ......................... Y Los Operadores < > >= <= = <> != between like and or not + * / ^
Para agregar hora (time) y fecha (date) puede utilizar el formato: (date) (time) insert into ventas values( '20-01-2009', '12:30' ); Para Modificar y Eliminar Usando Fechas: DELETE FROM ventas WHERE fecha='22-02-2010'; UPDATE ventas SET fecha='22-02-2010' , hora='13:30:25' WHERE fecha = '20-01-2009';
Y PARA LOS TIPOS ENUMERADOS : Create TYPE mybinario AS ENUM ('F', 'V'); Create table BINARIOS ( clave SERIAL primary key, datos mybinario default 'V' );
Y PARA LOS ARREGLOS : Create table AAA ( datos integer [3] [3] ); insert into AAA values( '{ {0,0,0},{1,1,1},{2,2,2} }' );
-- clases CREATE TYPE alumnos AS ( matricula varchar(20), nombre varchar(50), carrera varchar(45), semestre varchar(5) ) ; CREATE TYPE maestros AS ( cedula varchar(20), nombre varchar(50), carrera varchar(45), semestre varchar(5) ) ; CREATE TABLE escuela ( clave serial primary key, estudiante alumnos, -- objeto profes maestros -- objeto );
insert into escuela (estudiante, profes) values ( ('675849', 'cholillo' , 'informatica','5a') , ('342450', 'chuchita', 'agronomia' ,7b' ) ); select * from escuela; select (profes).nombre, (estudiante).nombre from escuela ;
UPDATE escuela SET profes = ROW('valor1', , 'valorN' ) WHERE (Condicin) ; UPDATE escuela SET (profes).nombre = 'valor_dato' WHERE (Condicin) ;
CREATE FUNCTION mostrar() RETURNS numeric AS $$ DECLARE num numeric := 0; BEGIN RAISE NOTICE 'Num= %', num; select sum(saldo) into num from clientes; if not found then RAISE NOTICE 'No se encontro'; -- En consola, else se invocara as: RAISE NOTICE 'Ok'; end if; select mostrar() ; RETURN num; Permite mostrar el saldo de END; todos los clientes $$ LANGUAGE plpgsql;
insert into clientes(nombre, saldo) values('cholillo', 800); select mostrar() into num; return num; -- En consola, END; se invocara as: $$ LANGUAGE plpgsql; select ok ( ) ;
Inserta dos clientes y regresa la suma de todos los saldos
CREATE function mayor (a numeric, b numeric) returns numeric as $$ DECLARE c numeric := 0; BEGIN if (a > b ) then c:= a; -- En consola, else se invocara as: if (a = b) then c:= -1; else select mayor(5, 6) ; c:=b; select mayor(5, 5) ; end if; Regresa el nmero mayor end if; entre a y b. Si son iguales, return c; Regresa -1 END; $$ LANGUAGE plpgsql;
select nombre, saldo into a, p from clientes where nombre='chuchita'; select nombre, saldo into b, q from clientes where nombre='cholillo';
select mayor(p, q) into r; return 'chuchita vs. Cholillo: ' || a || ' > ' || b || ' ? : ' || r; END; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION visualizar() RETURNS TRIGGER AS $$ DECLARE filas clientes%ROWTYPE ; i clientes%ROWTYPE ; BEGIN -- Cuando sea invocada por -- muestra registros antes de agregar algn Trigger, Mostrar for i IN select * from clientes los clientes antes o despus LOOP De la operacin, segn se RAISE NOTICE ' %', i; Indique en el Trigger END LOOP; RAISE NOTICE ' Correcto' ;
-- obligatorio, porque sino, No agrega el dato nuevo, -- cuando se use UPDATE puede regresar RETURN NULL;
TRIGGERS
CREATE TRIGGER mostrar_trigger BEFORE INSERT ON clientes FOR EACH ROW EXECUTE PROCEDURE visualizar(); CREATE TRIGGER mostrar_trigger2 AFTER INSERT ON clientes FOR EACH ROW EXECUTE PROCEDURE visualizar();
-- En el primer caso, se mostrar el listado de clientes antes de Agregar una tupla en dicha tabla. Y en el segundo caso, se mostrar el listado de clientes despus de haber agregado Una tupla en la tabla clientes.
create table datos ( clave serial primary key, nombre varchar(50), edad integer check(edad>5), domicilio varchar(60) ); create table clientes ( cla_cli serial primary key, rfc varchar(50), saldo integer check(saldo>0) ) inherits (datos) ; create table empleados ( clave_emp serial primary key, turno varchar(30), dias_trab integer check(dias_trab>=0) ) inherits (datos); insert into datos(nombre, edad, domicilio) values('fausto lopez', 41, 'conocido'); insert into clientes (nombre, edad, domicilio, rfc, saldo) values('pancho lopez', 23, 'desconocido', '????', 1500.50 ); insert into clientes (nombre, edad, domicilio, rfc, saldo) values('chuchita', 25, 'coyuca', '????', 2000 );
CREATE TYPE alumnos AS ( matricula varchar(50), nombre varchar(50), carrera varchar(50) ) ; CREATE TYPE maestros AS ( cedula varchar(50), nombre varchar(50), grado_academico varchar(50) ) ; CREATE TABLE escuela ( clave serial primary key, -- es un campo estudiantes alumnos, -- es un objeto profesores maestros -- es un objeto );
insert into escuela (estudiantes, profesores) values( ('2010990', 'agripino', 'biologia' ) , ('02934', 'jirafales', 'ing.') ); insert into escuela (estudiantes, profesores) values( ('5670977', 'fandila', 'contaduria' ) , ('02934', 'jirafales', 'ing.') ); insert into escuela (estudiantes, profesores) values( ('11120909', 'chuchita', 'contaduria' ) , ('12934', 'juan lopez', 'dr.') ); insert into escuela (estudiantes, profesores) values( ('789000', 'cholillo', 'biologia' ) , ('12934', 'juan lopez', 'dr.') ); select * from escuela ;
where (profesores).nombre like '%ales%' ; -- TAREA: CHECAR SI ESTO NO TIENE ERROR: select (estudiantes).nombre, (estudiantes).carrera from escuela where (profesores).nombre = 'jirafales'; select (profesores).nombre, (profesores).grado_academico from escuela where (estudiantes).nombre = 'agripino'; select (profesores).nombre, (profesores).grado_academico from escuela where (estudiantes).nombre = 'chuchita'; select (estudiantes).nombre, (estudiantes).carrera from escuela where (profesores).nombre = 'juan lopez';
CREATE TYPE proveedores AS ( cla_pro integer, nombre varchar(50), domicilio varchar(50), telefono varchar(50) ) ; CREATE TABLE productos ( clave serial primary key, codigo_barras numeric not null, descripcion varchar(50), costo numeric check(costo>0), precio numeric check(precio>0), existencias integer default '0', proveedor proveedores ) ;
insert into productos (codigo_barras, descripcion, costo, precio, existencias, proveedor ) values (203948 , 'fab' , 4, 10.50, 10, (111, 'Blanca Nieves', 'suc. indep.', '01-747-1234565')); insert into productos (codigo_barras, descripcion, costo, precio, existencias, proveedor ) values (345679 , 'aceite' , 8, 20.50, 5, (112, 'oleico', 'reforma', '01722-222333')); insert into productos (codigo_barras, descripcion, costo, precio, existencias, proveedor ) values (203948 , 'rufles' , 1, 5, 4, (211, 'sabritas', 'c. brazil # 21', '0155-59234565'));
CREATE TRIGGER trigger_lista BEFORE DELETE ON clientes FOR EACH ROW EXECUTE PROCEDURE listar () ;
delete from productos where descripcion like '%ru%'; delete from productos;
create function ganancias (costo numeric, precio numeric) returns numeric as $$ declare ganancia numeric:=0; begin ganancia:= precio-costo; return ganancia; Indicando el costo y end; Preciola funcin $$ language plpgsql; Regresa la resta, que
Refiere a las ganancias Para ese producto.
Create table respaldo ( clave serial primary key, codigo_barras numeric not null, descripcion varchar(50), costo numeric check(costo>0), precio numeric check(precio>0), existencias integer default '0', proveedor proveedores );
CREATE OR REPLACE FUNCTION respaldar () RETURNS TRIGGER AS $$ BEGIN delete from respaldo; INSERT INTO respaldo select * from productos ; RETURN NEW ; END ; $$ LANGUAGE plpgsql ; CREATE TRIGGER mytrigger3 BEFORE INSERT ON productos FOR EACH ROW EXECUTE PROCEDURE respaldar () ; insert into productos(codigo_barras, descripcion, costo, precio, existencias, proveedor) values (12905, 'cafe legal', 7.50, 18.30, 10, (1234, 'nestle', 'ninguno', '01-34-567-89') ); select * from respaldo; select * from productos;
MS EJERCICIOS DE TAREA
Hacer un trigger que permita respaldar los datos en una tabla llamada backup antes de eliminar productos
Hacer trigger que despus de actualizar datos en productos, muestre un listado de los valores que tenan los registros antes de su actualizacin
ADICIONALES
Pues quien sabe, De que le entiendan los Estudiantes del M.C. Edgar Rangel Lugo
OTRA PRCTICA
create table proveedores ( id_proveedor numeric primary key, nombre text, domicilio text, telefono numeric); create table productos ( codigo numeric primary key, id_proveedor numeric, descripcion text, precio numeric, costo numeric, existencias numeric, foreign key (id_proveedor) references proveedores (id_proveedor) on delete cascade on update cascade); create table respaldo (codigo numeric primary key, id_proveedor numeric, descripcion text, precio numeric, costo numeric, existencias numeric);
-- ------------------------------------------------------------------------------ ESTE EJEMPLO ELIMINA TODO DE RESPALDO Y LO VUELVE A COPIAR -- ----------------------------------------------------------------------------create or replace function respaldando () returns trigger as $$ declare -- Solo si se desea mostrarlos antes del respaldo -- actual productos%ROWTYPE ; begin -- Solo si se desea mostrarlos antes del respaldo -- for actual in select * from productos -- loop -- raise notice '% % %', actual.codigo , actual.id_proveedor, actual.descripcion ; -- end loop; delete from respaldo ; insert into respaldo select * from productos ; return OLD ; end ; $$ language plpgsql ; create trigger respaldo4 before delete on proveedores for each row execute procedure respaldando () ;
-- ------------------------------------------------------------------------------- OTRO EJEMPLO QUE NO ELIMINA LO QUE HAY EN RESPALDO, SOLO COPIA LO NUEVO -- QUE SE HA ELIMINADO EN CASCADA ... -- -----------------------------------------------------------------------------create or replace function respaldando () returns trigger as $$ declare actual productos%ROWTYPE ; begin -- Solo si se desea mostrarlos antes del respaldo for actual in select * from productos where id_proveedor = OLD.id_proveedor loop raise notice '% % %', actual.codigo , actual.id_proveedor, actual.descripcion ; end loop; -- delete from respaldo ; insert into respaldo select * from productos where id_proveedor = OLD.id_proveedor ; return OLD ; end ; $$ language plpgsql ; create trigger respaldo5 before delete on proveedores for each row execute procedure respaldando () ;
insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (01, 'Lala','-',7671010011) ; insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (02, 'Alpura','-',7671010022) ; insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (03, 'Sabritas','-',7671010023) ; insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (04, 'Coca-Cola','-',7671010111) ; insert into proveedores (id_proveedor, nombre, domicilio, telefono) values (05, 'Bimbo','-',7671010010) ; insert into productos (codigo, id_proveedor, descripcion, precio, costo, existencias ) values (0001, 01 , 'Flan', 10 , 7 , 5) ; insert into productos (codigo, id_proveedor, descripcion, precio, costo, existencias ) values (0002, 01 , 'Leche', 15 , 11 , 5) ; insert into productos (codigo, id_proveedor, descripcion, precio, costo, existencias ) values (0003, 05 , 'Donitas', 10 , 7 , 5) ; insert into productos (codigo, id_proveedor, descripcion, precio, costo, existencias ) values (0004, 05 , 'Pan Integral', 12 , 8 , 5) ;
create or replace function ganancia (precio numeric, costo numeric) returns numeric as $$ declare ganancia1 numeric := 0 ; begin ganancia1 = precio - costo ; return ganancia1 ; end; $$ language plpgsql ; create view v_existencias as select id_proveedor, codigo, descripcion, existencias from productos order by id_proveedor ; create view v_ganancias as select id_proveedor, codigo, descripcion, precio, costo, ganancia (precio,costo) from productos order by id_proveedor ; select * from v_existencias ; select * from v_ganancias ; delete from proveedores where id_proveedor = 5 ; delete from proveedores where id_proveedor = 5 ; -- Para el Caso 2
Fin
Pues yo ni sent Pasar el tiempo