Está en la página 1de 90

1.

DBMS PostgreSQL
2. Sentencia SELECT
3. lgebra Relacional
4. Procedimientos almacenados /
Lenguaje PL/pgSQL
5. Procedimientos almacenados
desde Java
6. Transacciones
Sin querys no hay diversin
Instalacin , puesta a punto y respaldo de la BD

Sin querys no hay diversin


Versin 8.1.4 de PostgreSQL
1. Ejecutar postgresql-8.1
2. Ejecutar postgresql-8.1-int
3. Ejecutar upgrade
4. Una vez terminada la instalacin,
modificar la variable de entorno path y
agregar la ruta de la carpeta bin de
PostgreSQL

Sin querys no hay diversin


Unavez instalado el DBMS y modificado la
variable path, en una consola, ejecutar las
siguientes lneas:

C:\> psql d postgres U postgres

postgres=# create database swcc


postgres=# encoding SQL_ASCII;
create
postgres=#\q

Sin querys no hay diversin


Yaque la base ha sido creada, ahora hay
que correr los scripts que contienen el
esquema y la informacin, se har de la
siguiente manera, desde la lnea de
comandos:

psql d swcc U postgres < swcc.sql


psql d swcc U postgres < swcc_info.sql

Sin querys no hay diversin


Si en algn momento quisiramos hacer
un respaldo del esquema, de la
informacin, o de ambos, esto se puede
lograr con el programa pg_dump, que
trae consigo PostgreSQL.
La sintaxis cambia de versin en versin,
pero de manera general se tiene la
siguiente, desde lnea de comandos:

Sin querys no hay diversin


pg_dump d base U usuario > file.sql

Existen ms opciones para este


programa, las cuales se pueden consultar
con la opcin --help.
Es importante sealar que para que no
haya problemas, la versin de pg_dump
debe ser la misma en la mquina origen
y en la mquina destino.
Sin querys no hay diversin
Sin querys no hay diversin
Lasentencia SELECT es quiz la
sentencia de SQL ms utilizada y cuenta
con muchas opciones que generalmente
no conocemos. El lgebra relacional se
basa principalmente en esta sentencia y
en la optimizacin de su uso para
generar querys ms eficientes que
obtengan informacin de varias tablas a
la vez.
Sin querys no hay diversin
Sin querys no hay diversin
Existen dos clusulas que generalmente
causan confusin, ellas son ORDER BY y
GROUP BY. A continuacin se tratar de
ilustrar la diferencia.

Sin querys no hay diversin


Laclausula ORDER BY sirve para ordenas
las columnas seleccionadas en orden
lexicogrfico ascendiente (ASC) o
descendiente (DESC).

Seleccionar el tipo, nombre, y apellidos de


cada usuario, ordenndolos por su tipo.

Sin querys no hay diversin


SELECT id_tipo, nmbre_usrio, ap_ptrno,
ap_mtrno
FROM test.swcc_admin_usuario
ORDER BY id_tipo;

Sin querys no hay diversin


Por otro lado, la clausula GROUP BY es
usada normalmente slo cuando se
utilizan funciones agregadas. Sirve para
agrupar la informacin regresada por la
sentencia SELECT de acuerdo a una o
ms columnas.

Mostrar cuntos usuarios de cada tipo hay


dentro de la BD.
Sin querys no hay diversin
SELECT id_tipo, count(*) AS "Nmero de
usuarios"
FROM test.swcc_admin_usuario
GROUP BY id_tipo;

Sin querys no hay diversin


Ambas clusulas se pueden combinar
para obtener informacin an ms
ordenada.

Mostrar cuntos usuarios de cada tipo hay


dentro de la BD ordenndolo de menor a
mayor.

Sin querys no hay diversin


SELECT id_tipo, count(*) AS "Nmero de
usuarios"
FROM test.swcc_admin_usuario
GROUP BY id_tipo ORDER BY id_tipo ;

Sin querys no hay diversin


La
clusula DISTINCT de la sentencia
SELECT asegura que cada registro
aparezca solamente una vez.

SELECT id_tipo AS "Clave"


FROM test.swcc_admin_usuario;

SELECT DISTINCT id_tipo AS "Clave"


FROM test.swcc_admin_usuario;
Sin querys no hay diversin
PostgreSQL tiene dos manera de
representar la fecha, como tipo
timestamp (fecha y hora) o como tipo
date (slo la fecha) y de igual manera
existen muchas funciones internas dentro
del DBMS que sirven para manipular
fechas y que se pueden consultar en la
documentacin por internet.

Sin querys no hay diversin


Uno de los principales problemas de
los DBMS es la manera en la que manejan
las fechas, ya que una fecha como
1/2/2010 puede resultar confusa.
En el estilo europeo, la fecha anterior
significa el da primero de febrero de
2010, sin embargo en el estilo
estadounidense, esa fecha significa el
segundo da de enero de 2010.
Sin querys no hay diversin
Debido a este problema, ISO creo un
formato de fecha estndar, en l se
representa primero el ao, seguido del
mes y del da, p. ej., 2010-01-07.
El servidor PostgreSQL maneja
internamente las fechas , de esta
manera, es decir, cualquier fecha que se
ingrese, en cualquier formato, es
transformada al estndar ISO 8601.
Sin querys no hay diversin
Generalmente, anivel de usuario,
PostgreSQL maneja las fechas al estilo
estadounidense, es decir, MM/DD/AAAA,
esto se puede comprobar tecleando lo
siguiente:

SHOW datestyle;

ISO, MDY
Sin querys no hay diversin
Elformato en el que PostgreSQL maneja
las fechas, a nivel de usuario, puede ser
cambiado durante la sesin actual a
travs de la siguiente lnea:

SET datestyle TO EUROPEAN, SQL;

SQL,DMY

Sin querys no hay diversin


EnPostgreSQL se pueden hacer infinidad
de operaciones con las fechas y las
horas, tales como restar, sumar,
multiplicar, dividir. Tambin existen
muchas funciones para el manejo de
fecha y hora, dos de las ms importantes
son now y date_part.

Sin querys no hay diversin


Lafuncin now devuelve la fecha y hora
actual del sistema, se utiliza como sigue:

SELECT now();

Sin querys no hay diversin


Lafuncin date_part permite extraer un
componente particular de la fecha o de
la hora, tal como el mes.

SELECT date_part(month, now());

Seleccionar el ttulo y la sntesis as como


la fecha de publicacin de todas las
noticias del mes actual.
Sin querys no hay diversin
Sin querys no hay diversin
SELECT ttlo AS "Ttulo", sntsis AS "Sntesis",
fcha_pblccion AS "Publicacin"
FROM test.swcc_news_noticia
WHERE
date_part('month', fcha_pblccion) =
date_part('month', now())
AND
date_part('year', fcha_pblccion) =
date_part('year', now());

Sin querys no hay diversin


Mostrarel nmero de noticias de
primera plana agrupadas por mes y ao
(mostrando tambin estos campos) y
ordenadas en orden ascendente.

Sin querys no hay diversin


SELECT date_part('month', fcha_pblccion) AS
"MES", date_part('year', fcha_pblccion) AS
"AO", count(*)
FROM test.swcc_news_noticia
WHERE
prmra_plna = true
GROUP BY date_part('month', fcha_pblccion),
date_part('year', fcha_pblccion)
ORDER BY date_part('month', fcha_pblccion),
date_part('year', fcha_pblccion);

Sin querys no hay diversin


Consultas complejas

Sin querys no hay diversin


Ellgebra relacional es un tipo de
lgebra con una serie de operadores que
trabajan sobre una varias relaciones
(tablas) para obtener una relacin (tabla)
resultado. Es la base indispensable para
poder escribir buenas consultas en SQL.

Sin querys no hay diversin


Ellgebra relacional es muy similar a las
operaciones con conjuntos ya que cuenta
con operadores de unin, interseccin,
diferencia, combinaciones, entre otros.

Sin querys no hay diversin


Existenocho operadores relacionales,
divididos en dos grupos, bsicos y
derivados.

Sin querys no hay diversin


SELECCIN: Extrae todas los renglones,
de una tabla dada, que satisfagan la
condicin dada.
En SQL, este operador es la clusula
WHERE de la sentencia SELECT.

Sin querys no hay diversin


PROYECCIN: Este operador extrae las
columnas especficas de una tabla dada.
En SQL, este operador corresponde a la
sintaxis de la sentencia SELECT ms
sencilla.

Sin querys no hay diversin


PRODUCTO CARTESIANO (RS): El
producto cartesiano de dos tablas es una
tabla que obtiene todas las
combinaciones posibles de los registros
de ambas tablas. Aparecern primero las
columnas de R y luego las de S.

Sin querys no hay diversin


En SQL, el producto cartesiano se logra
con la clusula CROSS JOIN, o separando
las tablas del producto con comas en el
FROM de la sentencia SELECT.

Sin querys no hay diversin


Seleccionar el nombre, apellidos y tipo de
usuarios, de todos los usuarios del
sistema.

Sin querys no hay diversin


SELECT nmbre_usrio, ap_ptrno, ap_mtrno,
tipo FROM test.swcc_admin_tipo_usuario t
CROSS JOIN test.swcc_admin_usuario u
WHERE t.id_tipo = u.id_tipo;

Sin querys no hay diversin


Mostrar login del usuario, tipo de noticia,
ttulo, sntesis, y autores de todas las
noticias que no sean de primera plana,
que estn activas y que hayan publicado
el mes de marzo del 2009.

Sin querys no hay diversin


Sin querys no hay diversin
SELECT login, tipo, ttlo, sntsis, autres
FROM test.swcc_news_catalogo_categoria c,
test.swcc_news_noticia n,
test.swcc_admin_usuario u
WHERE
n.id_usrio = u.id_usrio
AND
n.id_ctgria = c.id_ctgria
AND
date_part('month', fcha_pblccion) = 3
AND
date_part('year', fcha_pblccion) = 2009;
Sin querys no hay diversin
Unin (RS): Es el conjunto de registros
que aparecen en R o en S o en ambos.
En SQL, este operador se representa con
la clusula UNION de la sentencia
SELECT.

Sin querys no hay diversin


Seleccionar el ttulo de la noticia y el ttulo
de sus complementos de tipo audio y de
tipo imagen.

Sin querys no hay diversin


Sin querys no hay diversin
Sin querys no hay diversin
SELECT ttlo, ttlo_audio as "Complemento"
FROM test.swcc_news_noticia n,
test.swcc_news_audio_noticia an, test.swcc_productos_audio a
WHERE
n.id_ntcia = an.id_ntcia
AND
a.id_audio = an.id_audio
UNION
SELECT ttlo, ttlo_imgen as "Complemento"
FROM test.swcc_news_noticia n,
test.swcc_news_imagen_noticia i_n,
test.swcc_productos_imagen i
WHERE
n.id_ntcia = i_n.id_ntcia
AND
i.id_imgen = i_n.id_imgen;

Sin querys no hay diversin


Diferencia(R-S): Es una tabla formada por
todos los registros que estn en R pero
que no estn en S. No es un operador
conmutativo. R-S es diferente de S-R.
En SQL, esta operacin se logra con la
clusula EXCEPT de la sentencia SELECT.

Sin querys no hay diversin


Seleccionar el id de la imagen, y el ttulo
de todas las imgenes que no formen
parte de una galera de imgenes de
alguna noticia.

Sin querys no hay diversin


Sin querys no hay diversin
Sin querys no hay diversin
SELECT i.id_imgen, i.ttlo_imgen FROM
test.swcc_productos_imagen i
EXCEPT
SELECT i.id_imgen, i.ttlo_imgen
FROM
test.swcc_productos_imagen i,
test.swcc_news_imagen_noticia ino
WHERE i.id_imgen = ino.id_imgen;

Sin querys no hay diversin


Interseccin (RS): La interseccin de R
y S es el conjunto de elementos que
existen en R y en S.
En el lenguaje SQL este tipo de
operacin se puede realizar con la
clausula INTERSECT de la sentencia
SELECT.

Sin querys no hay diversin


Seleccionar todos los usuarios que han
escrito tanto noticias de Vida acadmica
como de Tecnologa, investigacin y
vinculacin.

Sin querys no hay diversin


Sin querys no hay diversin
SELECT login
FROM test.swcc_admin_usuario u, test.swcc_news_noticia n,
test.swcc_news_catalogo_categoria c
WHERE
u.id_usrio = n.id_usrio
AND
n.id_ctgria = c.id_ctgria
AND
c.tipo = 'VIDA ACADEMICA'
INTERSECT
SELECT login
FROM test.swcc_admin_usuario u, test.swcc_news_noticia n,
test.swcc_news_catalogo_categoria c
WHERE
u.id_usrio = n.id_usrio
AND
n.id_ctgria = c.id_ctgria
AND
c.tipo = 'TECNOLOGA, INVESTIGACIN Y VINCULACIN';

Sin querys no hay diversin


Join(RS): Los joins son combaniaciones
de relaciones (tablas) que crea todas las
posibles combinaciones actuando sobre
atributos en comn, de manera anloga
al producto cartesiano.
En SQL existen diferentes tipos de join,
entre ellos el INNER JOIN y el NATURAL
JOIN.

Sin querys no hay diversin


INNER JOIN: Es el resultado que se
obtiene despus de aplicar el producto
cartesiano RS y una condicin para
acotar dicho producto.

Sin querys no hay diversin


Seleccionar el id de la imagen, y el ttulo
de todas las imgenes que no formen
parte de una galera de imgenes de
alguna noticia.

Sin querys no hay diversin


Sin querys no hay diversin
Sin querys no hay diversin
SELECT i.id_imgen, i.ttlo_imgen FROM
test.swcc_productos_imagen i
EXCEPT
SELECT i.id_imgen, i.ttlo_imgen
FROM
test.swcc_productos_imagen i INNER
JOIN test.swcc_news_imagen_noticia ino
ON (i.id_imgen = ino.id_imgen);

Sin querys no hay diversin


NATURAL JOIN: Es un caso especial de
INNER JOIN, en el que la condicin que
acota el resultado es una comparacin de
igualdad. Y a parte, en el caso de existir
columnas con el mismo nombre en las
relaciones que se combinan, slo se
incluir una de ellas en el resultado de la
combinacin.

Sin querys no hay diversin


Seleccionar el id de la imagen, el ttulo y
el id de la noticia de todas las imgenes
que formen parte de una galera de
imgenes de alguna noticia.

Sin querys no hay diversin


SELECT id_imgen, ttlo_imgen, id_ntcia
FROM
test.swcc_productos_imagen NATURAL
JOIN test.swcc_news_imagen_noticia;

Sin querys no hay diversin


Seleccionar el nombre, apellidos y tipo de
usuarios, de todos los usuarios del
sistema.

Sin querys no hay diversin


SELECT nmbre_usrio, ap_ptrno, ap_mtrno,
tipo FROM test.swcc_admin_tipo_usuario
NATURAL JOIN test.swcc_admin_usuario;

Sin querys no hay diversin


Mostrar tipo de noticia, ttulo, sntesis,
url_imagen, url_noticia y fecha de
publicacin de las ltimas 2 noticias
agregadas del mes actual.

Sin querys no hay diversin


Sin querys no hay diversin
SELECT tipo, ttlo, sntsis, url_imgen,
url_ntcia, fcha_pblccion
FROM test.swcc_news_noticia NATURAL
JOIN test.swcc_news_catalogo_categoria
WHERE date_part('month', fcha_pblccion)
= date_part('month', now())
AND date_part('year', fcha_pblccion) =
date_part('year', now())
ORDER BY fcha_pblccion desc LIMIT 2;
Sin querys no hay diversin
Mostrar la noticia de primera plana ms
reciente.

Sin querys no hay diversin


Sin querys no hay diversin
SELECT tipo, ttlo, sntsis, url_imgen, url_ntcia,
fcha_pblccion
FROM test.swcc_news_noticia NATURAL JOIN
test.swcc_news_catalogo_categoria
WHERE date_part('month', fcha_pblccion) =
date_part('month', now())
AND date_part('year', fcha_pblccion) =
date_part('year', now())
AND prmra_plna = true
ORDER BY fcha_pblccion desc limit 1;

Sin querys no hay diversin


PL/pgSQL

Sin querys no hay diversin


Elementode base de datos reutilizable
almacenado que realiza alguna
operacin en la base de datos.

Unprocedimiento almacenado contiene


cdigo SQL que puede, entre otras cosas,
insertar, actualizar o eliminar registros.

Sin querys no hay diversin


Unprocedimiento almacenado tambin
puede llamar a otro procedimiento
almacenado, as como aceptar entradas y
devolver mltiples valores al
procedimiento llamado en forma de
parmetros de salida.

Sin querys no hay diversin


Enpocas palabras, un procedimiento
almacenado es una funcin, como la de
cualquier lenguaje de programacin,
pero que se crea y ejecuta en el DBMS.

Sin querys no hay diversin


EnPostgreSQL se pueden crear
procedimientos almacenados en
mltiples lenguajes, como C, Java y
PL/pgSQL (similar al PL/SQL de Oracle).

Sin querys no hay diversin


CREATE OR REPLACE FUNCTION nombre(<argumentos
de entrada y salida>) RETURNS <tipo>
AS
$$
DECLARE
-- declaracin de variables
BEGIN
-- cuerpo de la funcin
END;
$$
LANGUAGE plpgsql;

Sin querys no hay diversin


La
lista de argumentos se puede pasar
de dos manera:

Sloindicando el tipo de datos, es decir,


integer, varchar, date, etc.

O indicando, modo, nombre y tipo del


parmetro.

Sin querys no hay diversin


Ejemplos:
IN cuenta VARCHAR
OUT impresiones INTEGER
INOUT activo BOOL

Sin querys no hay diversin


Realizar una funcin que nos indique si
un login est disponible

Sin querys no hay diversin


CREATE OR REPLACE FUNCTION test.isLoginAvailable(IN lgin
VARCHAR)
RETURNS BOOLEAN
AS $$
BEGIN
perform * from test.swcc_admin_usuario where login = lgin;
IF FOUND THEN
return false;
ELSE
return true;
END IF;
END;
$$
LANGUAGE plpgsql;

Sin querys no hay diversin


Obtener el nombre completo, password y
correo electrnico de un usuario a travs
de su login.

Sin querys no hay diversin


CREATE OR REPLACE FUNCTION test.userInfo(IN lgin VARCHAR,
OUT n test.swcc_admin_usuario.nmbre_usrio%TYPE,
OUT ap test.swcc_admin_usuario.ap_ptrno%TYPE, OUT am
test.swcc_admin_usuario.ap_mtrno%TYPE,
OUT p test.swcc_admin_usuario.pssword%TYPE, OUT e
test.swcc_admin_usuario.email%TYPE)
AS
$$
BEGIN
SELECT INTO n,ap,am,p,e nmbre_usrio, ap_ptrno, ap_mtrno,
pssword, email
FROM test.swcc_admin_usuario
WHERE login = lgin;
END;
$$
LANGUAGE plpgsql;

Sin querys no hay diversin


Seleccionar el nombre, apellidos y tipo de
usuarios, de todos los usuarios activos del
sistema.

Sin querys no hay diversin


CREATE OR REPLACE FUNCTION test.users(IN crsor REFCURSOR)
RETURNS REFCURSOR
AS
$$
BEGIN
OPEN $1 FOR
SELECT nmbre_usrio, ap_ptrno, ap_mtrno, tipo FROM
test.swcc_admin_tipo_usuario NATURAL JOIN
test.swcc_admin_usuario
where actvo = true;
RETURN $1;
END;
$$
LANGUAGE plpgsql;

Sin querys no hay diversin


Es mucho ms difcil hacer SQL injection
a un PA que a una aplicacin que cree
sus sentencias SQL.
Ofrecen mayor rendimiento ya que se
ejecutan en el servidor de bases de
datos.
Los procedimientos almacenados son
analizados en el momento de su
creacin.
Centraliza la informacin.

Sin querys no hay diversin


Se ocultan las querys dentro del cdigo
fuente del sistema.
Se ejecutan ms rpido que las querys
generadas por un sistema.

Sin querys no hay diversin

También podría gustarte