Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tallerbd
Tallerbd
datos en postgreSQL
Primero vamos a abrir una
terminar con control+alt+t
Luego cambiar del usuario
actual al usuario postgres
sudo su postgres
Despues ya como usuario
postgres
Createdb taller
Una vez creada la base de
datos, vamos a acceder a ella:
psql taller
Creación de tablas
create table NOMBRETABLA(
NOMBRECAMPO1
TIPODEDATO,
...
NOMBRECAMPON
TIPODEDATO
);
Para ver la información de la
tablas se utiliza el siguiente
comando:
Taller# \d tabla
Para eliminar una tabla
Taller=# DROP TABLE tabla;
Crear la tabla jobs
CREATE TABLE jobs (
job_id serial NOT NULL,
job_title varchar(255) NOT NULL,
min_salary integer NOT NULL,
max_salary integer NOT NULL,
PRIMARY KEY (job_id));
Inserte datos el la tabla jobs
INSERT INTO jobs (job_title,
min_salary, max_salary)
VALUES
('Gerente', 10000, 11000);
create table editoriales(
codigo serial,
nombre varchar(30),
primary key (codigo) );
create table libros (
codigo serial,
titulo varchar(40),
autor varchar(30),
codigoeditorial smallint,
primary key(codigo) );
insert into editoriales(nombre) values('Planeta');
insert into editoriales(nombre) values('Emece');
insert into editoriales(nombre) values('Paidos');
insert into editoriales(nombre) values('Siglo XXI');
insert into libros(titulo,autor,editorial)
values('Uno','Richard Bach',1);
insert into libros(titulo,autor,editorial)
values('Ilusiones','Richard Bach',1);
insert into libros(titulo,autor,editorial)
values('Puente al infinito','Richard Bach',2);
Realizar una consulta que
obtenga el nombre de las
editoriales que han publicado
libros del autor "Richard
Bach":
select nombre
from editoriales
where codigo in
(select codigoeditorial
from libros
where autor='Richard
Bach');
SUBCONSULTAS
Una subconsulta (subquery) es
una sentencia "select" anidada en
otra sentencia "select", "insert",
"update" o "delete" (o en otra
subconsulta).
Las subconsultas se emplean
cuando una consulta es muy
compleja, entonces se la divide en
varios pasos lógicos y se obtiene
el resultado con una única
instrucción y cuando la consulta
depende de los resultados de otra
consulta.
Las subconsultas se DEBEN
incluir entre paréntesis.
...where EXPRESION in
(SUBCONSULTA);
Podemos buscar las
editoriales que no han
publicado libros de "Richard
Bach":
select nombre
from editoriales
where codigo not in
(select codigoeditorial
from libros
where autor='Richard
Bach');
Ejercicio:
Una empresa tiene registrados
sus clientes en una tabla
llamada "clientes", también
tiene una tabla "ciudades"
donde registra los nombres de
las ciudades.
1- Cree la tabla "clientes"
create table clientes (
codigo_cliente serial,
nombre_cliente varchar(30),
domicilio varchar(30),
codigo_ciudad smallint not
null, primary
key(codigo_cliente)
);
2.-Cree la tabla ciudades:
create table ciudades(
codigo_ciudad serial,
nombre_ciudad varchar(20),
primary key (codigo_ciudad)
);
insert into ciudades (nombre_ciudad)
values('Cordoba'),('Cruz del Eje'),('Carlos Paz'),
('La Falda'),('Villa Maria');
insert into
clientes(nombre,domicilio,codigociudad)
values ('Lopez Marcos','Colon 111',1),
('Lopez Hector','San Martin 222',1),
('Perez Ana','San Martin 333',2),
('Garcia Juan','Rivadavia 444',3);
insert into
clientes(nombre,domicilio,codigociudad)
values ('Perez Luis','Sarmiento 555',3),
('Gomez Ines','San Martin 666',4),('Torres
Fabiola','Alem 777',5),('Garcia Luis','Sucre
888',5);
Necesitamos conocer los
nombres de las ciudades de
aquellos clientes cuyo
domicilio es en calle
"San Martin", empleando
subconsulta.
select nombre
from ciudades
where codigo in
(select codigociudad
from clientes
where domicilio like 'San
Martin %');
Obtenga los nombre de las
ciudades de los clientes cuyo
apellido no comienza con una
letra específica, empleando
subconsulta.
COMBINACIONES (JOINS)
Por medio del operador
combinación (JOIN) podemos
combinar dos relaciones o
tablas segun una condición
para obtener tuplas
compuestas por atributos de
las dos relaciones
combinadas.
En el lenguaje SQL existen
diferentes maneras de
combinar dos relaciones o
tablas.
Combinaciones internas
(R INNER JOIN S): Un INNER
JOIN entre dos relaciones R y S,
es el resultado que se obtiene
después de aplicar al producto
cartesiano de las dos relaciones R
y S, una condición para acotar
dicho producto.
Un join es una operación que
relaciona dos o más tablas
para obtener un resultado que
incluya datos (campos y
registros) de ambas; las tablas
participantes se combinan
según los campos comunes a
ambas tablas.
La sintaxis básica es la
siguiente:
select CAMPOS
from TABLA1
inner join TABLA2
on CONDICIONdeCOMBINACION;
Ejemplos:
select * from libros inner join
editoriales on
codigo_editorial=editoriales.co
digo_editorial;
select l.*, e.nombre_editorial
from libros as l inner join
editoriales as e on
l.codigo_editorial=e.codigo_ed
itorial where
e.codigo_editorial=2;
Analicemos la consulta
anterior.
CREATE VIEW
cliente_apellido AS
SELECT * FROM clientes
WHERE ap_paterno LIKE
‘A%’
ELIMINAR VISTAS.
select sumar(3,4);
create or replace function
retornarclave(varchar) returns
integer
as
'select cliente_id from
clientes where nombre=$1;'
language sql;
Cree la tabla con la siguiente
estructura:
create table medicamentos(
codigo serial,
nombre varchar(20),
laboratorio varchar(20),
precio decimal(5,2),
cantidad smallint,
primary key(codigo)
);
('Sertal','Roche',5.2,100);
('Buscapina','Roche',4.10,200);
('Amoxidal','Bayer',15.60,100);
('Paracetamol','Bago',1.90,200);
('Aspirina','Bayer',2.10,150);
('Amoxidal jarabe','Bayer',5.10,250);
Implementar una función que
retorne el precio promedio de la
tabla medicamentos.
Imprimir el precio promedio de los
medicamentos.
Imprimir los medicamentos que
tienen un precio mayor al
promedio.
create or replace function
preciopromedio() returns
decimal
as
'select avg(precio) from
medicamentos;'
language sql;
select preciopromedio();
select * from medicamentos
where
precio>preciopromedio();
Funciones que no retornan
valor
Cuando queremos crear una
función que no retorne dato lo
debemos indicar luego de la
palabra clave returns
disponiendo el valor void:
create or replace function cargarusuarios()
returns void
as
$$
insert into clientes (nombre) values ('Marcelo');
insert into clientes (nombre) values ('JuanPerez');
insert into clientes (nombre) values ('Susana');
insert into clientes (nombre) values ('Luis');
$$
language sql;
Implementar una función que
reciba el código de un
medicamento y proceda a
borrarlo.
La función no retorna dato.
create or replace function
borrarmedicamento(integer)
returns void
as
'delete from medicamentos
where codigo=$1;'
language sql;
select borrarmedicamento(1);
cliente_id clientes.cliente_id%TYPE;
Al usar %TYPE puede
despreocuparse de los
cambios futuros en la
definición de la tabla.
Nombre tabla%ROWTYPE
Declara un renglón con la
estructura de la tabla
especificada. tabla puede
ser una tabla o una vista
que exista en la base de
datos.
Los campos del renglón se
accesan con la notación
punto. Los parámetros de
una función pueden ser de
tipo compuesto (renglones
completos de una tabla).
Es este caso, el identificador
correspondiente $n será del
tipo rowtype, pero debe
usarse un seudónimo o alias
usando el comando ALIAS
DECLARE
renglon clientes%ROWTYPE;
Sentencias
Asignación
Una asignación de un valor
a una variable o campo de
fila o de registro se escribe:
identifier := expression;
Si el tipo de dato resultante
de la expresión no coincide
con el tipo de dato de las
variables, o la variable
tienen un tamaño o
precisión conocido (como
char(29))
El resultado será amoldado
implicitamente por el
interprete de PL/pgSQL,
usando los tipos de las
variables para las funciones
de entrada y los tipos
resultantes en las funciones
de salida.
impuesto := subtotal * 0.15;
mi_registro.user_id := 20;
Una asignación de una
selección completa en un
registro o fila puede hacerse
del siguiente modo:
RETURN segmento_precio;
END; $$
LANGUAGE plpgsql;
Ciclos
LOOP
[<<Etiqueta>>]
LOOP
sentencias
END LOOP;
Se trata de un bucle no
condicional que ha de ser
terminado de forma
explicita, mediante una
sentencia EXIT.
La etiqueta opcional puede
ser usada por las sentencias
EXIT de otros ciclos
anidados, para especificar el
nivel del ciclo que ha de
terminarse.
EXIT [ Etiqueta ] [ WHEN
Expresión boolean ];
LOOP
-- Algunos Calculos
IF contador > 0 THEN
EXIT; -- sale del loop
END IF;
END LOOP;
CICLO LOOP
-- Algunos Calculos
EXIT WHEN contador > 0;
nombre RECORD;
Una asignación se puede
dar de la siguiente forma:
{BEFORE|AFTER}
tipo_evento
ON
nombre_tabla
FOR EACH {ROW|
STATEMENT}
EXECUTE PROCEDURE
nombre_funcion
(parametros)
El orden importa:
Si primero se crea un
Trigger y despues se crea la
función que el Trigger llama,
el Trigger no se ejecutará de
forma correcta.
Se debe crear primero la
función y despues el Trigger
que usará esa función
Variables especiales en
PL/pgSQL
Cuando una función escrita en
PL/pgSQL es llamada por un
Trigger tenemos ciertas
variables especiales
disponibles en dicha función.
Estas variables son las
siguientes:
NEW
Tipo de dato RECORD; Variable
que contiene la nueva fila de la
tabla para las operaciones
INSERT/UPDATE en Triggers del
tipo row-level. Esta variable es
NULL en Triggers del tipo
statement-level.
OLD
Tipo de dato RECORD; Variable
que contiene la antigua fila de la
tabla para las operaciones
UPDATE/DELETE en Triggers
del tipo row-level. Esta variable
es NULL en Triggers del tipo
statement-level.
TG_NAME
Tipo de dato name; variable
que contiene el nombre del
Trigger que está usando la
función actualmente.
TG_WHEN
Tipo de dato text; una cadena
de texto con el valor BEFORE o
AFTER dependiendo de como el
Trigger que está usando la
función actualmente ha sido
definido.
TG_OP
Tipo de dato text; una cadena
de texto con el valor INSERT,
UPDATE o DELETE
dependiendo de la operación
que ha activado el Trigger que
está usando la función
actualmente.
Crear la tabla:
create table
autores(id_autor integer,
nombre varchar);
Otro ejemplo de un Trigger
es guardar una bitacora de
cambios sobre una tabla
Realizar un trigger que
proteja la tabla
medicamentos de ser
borrada.
En resumen: