Professional Documents
Culture Documents
Agosto de 2014
Pgina 1 de 253
Contenido
Introduccin ...................................................................................................................................... 13
Leccin I - Bases de datos relacionales: El modelo relacional ....................................................... 14
Qu son las Bases de Datos (BD)? ............................................................................................... 14
El Sistema Gestor de Base de Datos (SGBD) ................................................................................. 14
El modelo Entidad-Relacin (E-R).................................................................................................. 14
Entidades......................................................................................................... 15
Relaciones ....................................................................................................... 16
Base de Datos Relacionales ........................................................................................................... 16
Ventajas .......................................................................................................... 16
Caractersticas ................................................................................................. 17
Motores de Bases de Datos Relacionales ..................................................................................... 18
PostgreSQL .................................................................................................................................... 19
Un poco de historia ......................................................................................... 19
Caractersticas ................................................................................................. 19
Leccin II - Bases de datos relacionales: Consulta de bases de datos relacionales .......................... 21
Utilizando una Base de Datos Relacional ...................................................................................... 21
Consultas en lenguajes de alto nivel ............................................................................................. 21
Consultas y relaciones (tablas) ...................................................................................................... 22
Lenguajes de consultas ................................................................................................................. 22
Utilizando lgebra Relacional ....................................................................................................... 23
Utilizando SQL ............................................................................................................................... 23
Leccin III - lgebra Relacional: Select, Project, Join ........................................................................ 24
Conceptos bsicos de lgebra relacional ...................................................................................... 24
Operaciones relacionales: ............................................................................................................. 25
Seleccin (Select) .......................................................................................................................... 25
Proyeccin (Project) ...................................................................................................................... 28
Notacin en lgebra Relacional ....................................................................... 28
Producto cartesiano (Cross-Product) ............................................................................................ 29
Notacin en lgebra Relacional ....................................................................... 30
Curso SQL PostgreSQL
Pgina 2 de 253
Pgina 3 de 253
Pgina 4 de 253
Ejemplo 2 ........................................................................................................ 88
Ejemplo 3 ........................................................................................................ 89
Ejemplo 4 ........................................................................................................ 89
SELECT-FROM (SELECT)-WHERE .................................................................................................... 89
Ejemplo 5 ........................................................................................................ 90
RECAPITULACIN .......................................................................................................................... 91
Ejemplo extra .................................................................................................. 91
Leccin XI - La familia de operadores JOIN ....................................................................................... 93
INNER JOIN .................................................................................................................................... 93
NATURAL JOIN ............................................................................................................................... 95
INNER JOIN USING (attrs) .............................................................................................................. 96
LEFT|RIGHT|FULL OUTER JOIN ..................................................................................................... 96
LEFT OUTER JOIN ........................................................................................................................... 97
RIGHT OUTER JOIN ........................................................................................................................ 97
FULL OUTER JOIN .......................................................................................................................... 98
Leccin XII - Funciones de Agregacin ............................................................................................ 100
Funciones de Agregacin ............................................................................................................ 100
Funcin AVG() ................................................................................................ 101
Funcin COUNT() ........................................................................................... 101
SQL COUNT (nombre_columna) ..................................................................... 101
SQL COUNT(*) ................................................................................................ 102
SQL COUNT (DISTINCT nombre_columna) ..................................................... 102
Funcin MAX() ............................................................................................... 103
Funcin MIN() ................................................................................................ 103
Funcin SUM()................................................................................................ 103
SQL GROUP BY............................................................................................................................. 104
SQL HAVING ................................................................................................................................ 104
Leccin XIII - SQL: Valores NULL ...................................................................................................... 106
CREATE TABLE ............................................................................................................................. 106
Curso SQL PostgreSQL
Pgina 5 de 253
Pgina 6 de 253
Pgina 7 de 253
Pgina 8 de 253
Pgina 9 de 253
Pgina 10 de 253
Pgina 11 de 253
Leccin XXXI - Servicios de Respaldo y Recuperacin para Bases de Datos (BD) ...................... 238
Servicios en PostgreSQL........................................................................................................ 239
SQL Dump................................................................................................................................. 239
pg_dump ....................................................................................................... 239
Ejemplo 1 ...................................................................................................... 239
Ejemplo 2 ...................................................................................................... 242
Ejercicio propuesto ........................................................................................ 243
pg_dumpall ................................................................................................... 244
Respaldo a nivel de archivos ............................................................................................... 244
Rsync ............................................................................................................. 245
Conclusiones ........................................................................................................................... 245
Leccin XXXII Querys al Catalogo de PostgreSQL ......................................................................... 246
Obtener objetos del servidor PostgreSQL. ...................................................................... 246
Leccin XXXIII. Consultas tiles de monitoreo. ............................................................................... 253
Pgina 12 de 253
Introduccin
Este Manual tiene como objetivo ser una Gua de Referencia durante el transcurso del curso SQLPostgreSQL.
En l podrn encontrar definiciones, notas, ejemplos practicos de casos de estudio que les servirn
en sus labores cotidianas con sta poderosa herramienta llamada PostgreSQL.
Espero que este este Manual y en curso en s les sea de mucha utilidad y les resulte entretenido.
Pgina 13 de 253
Pgina 14 de 253
Entidades
Los objetos que aparecen en la vida real, corresponden a una entidad. Por ejemplo:
alumnos, empleados, aviones, coches, alojamientos, etc. Una entidad da lugar a
una tabla en la BD.
Estas entidades estn compuestas por varios atributos, que vienen a ser sus
propiedades.
Por
ejemplo:
la
entidad
Alumnos,
tendr
los
Pgina 15 de 253
Nota
En los textos se utilizan ciertos sinnimos:
Relaciones
Las entidades no estn aisladas sino que estn relacionadas entre s. Estas relaciones
reflejan las interacciones lgicas existentes entre entidades. Las relaciones pueden ser
de tres tipos:
Relaciones 1 - 1: Las entidades que intervienen en la relacin se asocian una a una (Ej:
la entidad HOMBRE, la entidad MUJER y entre ellos la relacin MATRIMONIO).
Relaciones 1 - N: Una ocurrencia de una entidad est asociada con muchas (n) de otra
(Ej: la entidad EMPRESA, la entidad TRABAJADOR y entre ellos la relacin TRABAJAR-EN).
Ventajas
Modelo simple.
Pgina 16 de 253
Implementacin eficiente.
Caractersticas
La relacin entre una tabla padre y un hijo se lleva a cabo por medio de
claves primarias y forneas.
Ejemplo
Se tiene una base de datos que contiene dos tablas: una denominada
Empleados, que
almacena datos de los empleados de una empresa, y otra con el nombre Despachos,
que almacena los datos de los despachos que tiene la empresa. Los empleados que
trabajan para una empresa pueden estar vinculados con los despachos de la empresa,
porque a cada empleado se le asigna un despacho concreto para trabajar.
Tabla Despachos
edificioPrincessPrincessPrincessGreyDiagonalnumero120121122230110super
ficie1012152010
La
numero,superficie) y
atributos (edificio,
conjunto de atributos cuyos valores combinados dan la unicidad a cada fila. Se trata de
los atributos edificio y numero; se les llama clave primaria compuesta.
Tabla Empleados
DNI40.444.25533.567.71155.898.42577.232.144nombreAlexGeorgeDerekAri
zonaapellidoKarevO'MalleyShepherdRobbinsDNIjefe40.783.15040.444.2554
0.444.25540.444.255edificiodespPrincessNULLDiagonalGreynumerodesp120
NULL110230
Pgina 17 de 253
Empleados posee
6
atributos (DNI,nombre,
apellido,
DNIjefe, edificiodesp, numerodesp) y 4 registros (o filas), en el segundo registro se
La
tabla
aprecia que George no posee despacho asignado por lo que se agrega el valor
unknown o undefined que se define como NULL. Esta tabla posee un atributo cuyo
valor es nico en cada tupla que es atributo DNI y se le llama clave primaria.
En Empleados,
existe
una
clave
fornea
formada
por
los
Despachos.
De este modo, se cumple que todos los valores que no son nulos de los
atributos edificiodesp y numerodesp son
valores
que
existen
para
los
atributos edificio y numero de Despachos. Esta clave fornea indica, para cada
empleado, el despacho donde trabaja. Adems, el atributo DNIjefe es otra clave fornea
que referencia la clave primaria de la misma tabla
Empleados,
Ejemplo en SQL
La creacin de relaciones (tablas) en SQL
CREATE TABLE Despachos(edificio VARCHAR(50), numero INTEGER, superficie
INTEGER, PRIMARY KEY(edificio,numero));
CREATE
TABLE
Empleados(DNI
VARCHAR(50),
nombre
VARCHAR(50),
apellido
VARCHAR(50), DNIjefe VARCHAR(50),
edificiodesp VARCHAR(50), numerodesp INTEGER, PRIMARY KEY(DNI), FOREIGN
KEY(edificiodesp,numerodesp)
REFERENCES Despachos(edificio,numero));
Pgina 18 de 253
PostgreSQL
PostGreSQL es un sistema de gestin de bases de datos objeto-relacional basado en el
proyecto POSTGRES, de la Universidad de Berkeley. El director de este proyecto es el
profesor Michael Stonebraker, patrocinado por Defense Advanced Research Projects
Agency (DARPA), Army Research Office (ARO), National Science Foundation (NSF), y ESL,
Inc.
Un poco de historia
PostGreSQL fue derivado del proyecto Postgres, lleva ms de una dcada de desarrollo,
siendo hoy en da, el sistema libre ms avanzado, soportando la gran mayora de las
transacciones SQL, control concurrente y un variado conjunto de language bindings
como por ejemplo C, C++, Java, Python, PHP y muchos ms.
La implementacin de Postgres DBMS comenz en 1986, y no hubo una versin
operativa hasta 1987. La versin 1.0 fue liberada en Junio de 1989 a unos pocos
usuarios, tras la cual se liber la versin 2.0 en Junio de 1990 debido a fuertes crticas
sobre el sistema de integridad referencial, que oblig a su reimplementacin. La versin
3.0 apareci en el ao 1991.
En 1994, Andrew Yu y Jolly Chen aadieron un intrprete de SQL a este gestor.
Postgres95, como as se llam fue liberado a Internet como un proyecto libre
(OpenSource). Estaba escrito totalmente en C, y la primera versin fue un 25% ms
pequea que Postgres, y entre un 30 y un 50% ms rpida. A parte de la correccin de
algunos bugs, se mejor el motor interno, se aadi un nuevo programa monitor, y se
compil usando GNU Make y el compilador gcc.
En 1996, los desarrolladores decidieron cambiar el nombre al SGDB, y lo llamaron
PostGreSQL para reflejar la relacin entre Postgres y las versiones recientes de SQL.
Caractersticas
Licencia BSD.
Pgina 19 de 253
Pgina 20 de 253
Nota
Existen las llamadas Operaciones Bsicas de DML que se pueden realizar en una Base de
Datos Relacional:
1. Consultar: SELECT
2. Almacenar: INSERT
3. Actualizar: UPDATE
4. Borrar: DELETE
Nota
Existen las llamadas Operaciones Bsicas de DDL que se pueden realizar en una Base de
Datos Relacional:
1. Almacenar: CREATE
2. Borrar: DROP
Por ahora slo se nombran junto a sus funciones SQL relacionadas. A medida que el
curso avance, se profundizar el contenido.
Pgina 21 de 253
Una consulta a la BD, puede entenderse como una pregunta que se le realiza para
obtener cierta informacin. Algunos ejemplos pueden ser:
Los 2 puntos anteriores no son dependientes uno del otro, puede existir
una consulta fcil de formular, pero difcil de ejecutar de forma eficiente,
dependiendo del DBMS.
Lenguajes de consultas
Algunos de los lenguajes de consultas son
Pgina 22 de 253
Tabla Alumnos
id12345idRamo12113nombreAlumnoRobertRobertHarryJaneMaryprome
dioNota4570556035
Tabla Ramos
id123nombreRamoProgramacionBase de datosEstructuras de datos
Consultar por el id de los alumnos con promedio de notas mayor o igual a 55 en el
ramo de Programacin:
, realiza un PROJECT sobre una tabla, es decir selecciona una columna. Por
otro lado:
selecciona una fila que cumpla con una cierta condicin, en el ejemplo
dado se seleccionan las filas que cumplen con tener nota mayor a 55 y que
el nombreRamo sea programacin.
Utilizando SQL
SELECT ALUMNOS.ID FROM ALUMNOS, Ramos WHERE ALUMNOS.ID_ramo=Ramos.ID
AND ALUMNOS.promedio_nota>=55 AND Ramos.nombreRamo='Programacion';
Pgina 23 de 253
Suma,
Resta,
Multiplicacin,
Divisin.
(x+y)z ((x+7)/(y3))+x.
El lgebra Relacional es otro ejemplo del lgebra. Sus operandos atmicos son:
1. Variables que representan relaciones.
2. Constantes que son relaciones finitas.
Nota
En algunos textos de lgebra relacional o SQL, una relacin es sinnimo de una tabla.
conjuntos
habituales
de
Pgina 24 de 253
RS como
tres
operaciones
ms
comunes
en
conjuntos
Operaciones relacionales:
Los operadores relacionales se utilizan para filtrar, cortar o combinar tablas.
Seleccin (Select)
Este operador se aplica a una relacin
R produciendo
subconjunto de tuplas de R. Las tuplas de la relacin resultante son las que satisfacen
una condicin C sobre algn atributo de R. Es decir selecciona filas (tuplas) de una
tabla segn un cierto criterio C. El criterio C es una expresin condicional, similar a las
declaraciones del tipo if, es booleana esto quiere decir que para cada tupla
de R toma el valor Verdad(true) o Falso(false).
Cada
condicin
simple
clusula
tiene
el
el
campo Comparador es
un operador
lgico,
que
pueden
ser {=,,>,<,,}.
o
Pgina 25 de 253
Los operadores lgicos que se utilizan, tambin llamados operadores relacionales, nos
proporcionan un resultado a partir de que se cumpla o no una cierta condicin. Son
smbolos que se usan para comparar dos valores. Si el resultado de la comparacin es
correcto la expresin considerada es verdadera, en caso contrario es falsa. Por ejemplo,
11>4 (once mayor que cuatro) es verdadera, se representa por el valor true del tipo
bsico boolean, en cambio, 11<4 (once menor que cuatro) es falsa se representa por el
valor false.
Las clusulas C pueden conectarse con otros operadores lgicos, que al igual que los
anteriores que se usaban como comparador (entre atributos o atributo y constante),
arrojan booleano (true o false) de resultado:
NOT: El operador NOT denota una salida verdadera si la entrada es falsa, y una
salida falsa si la entrada es verdadera. Su notacin en algebra es:
C1.
AND: El operador AND denota una salida verdadera si y slo si sus entradas son
verdaderas. Si C1 se cumple y C2 tambin se cumple, la salida ser verdadera.
La notacin en algebra de un AND es: C1
C2.
OR: El operador OR denota una salida verdadera si hay alguna de las entradas (o
ambas) verdaderas. Si C1 y/o C2 es o son verdaderas, la expresin ser
verdadera. La notacin en algebra de un OR es: C1
C2.
R queremos
Por lo
Ca
Pgina 26 de 253
Ejemplo 1
Tabla Ingenieros
id123234345143nombreLeonTomasJoseJosefaedad39344525aosTrabajados1
510211
Seleccionar las tuplas de la tabla
30 aos:
Respuesta
edad>30Ingenieros
En la imagen se ve que selecciona solo las filas que cumplen con la condicin que se
peda (tener una edad mayor a 30 aos), la tupla de Josefa queda fuera de la seleccin
por no cumplir la condicin (pues 25 < 30). De esta forma la tabla queda:
Tabla Ingenieros
id123234345nombreLeonTomasJoseedad393445aosTrabajados151021
Ejemplo 2
Seleccionar de la tabla
(edad>30aosTrabajados<16) Ingenieros
Pgina 27 de 253
Al tener el operador lgico AND se pide que cumplan dos condiciones simultneamente.
Primero que la edad sea mayor de 30 aos, al igual que en el ejemplo anterior, la tupla
de Josefa queda fuera de la seleccin. Luego de las tuplas que quedan se evala la
segunda condicin. En la imagen se aprecia, que solo se seleccionan las filas que no
tengan X en alguna de las condiciones.
As finalmente quedara la tabla:
Tabla Ingenieros
id123234nombreLeonTomasedad3934aosTrabajados1510
Proyeccin (Project)
El operador Proyeccin se utiliza para producir una nueva relacin desde
relacin contiene slo algunos de los atributos de
R,
R. Esta nueva
(A1,...,An)R
El resultado es una relacin seleccionando solo los atributos A1,...,An de la relacin
R.
Ejemplo 1
Tabla Ingenieros
id123234345143nombreLeonTomasJoseJosefaedad39344525aosTrabajados1
510211
Pgina 28 de 253
(id,nombre)Ingenieros
La tabla finalmente queda como:
Tabla Ingenieros
id123234345143nombreLeonTomasJoseJosefa
Ejemplo 2
Seleccionar id y nombre de los Ingenieros que tienen ms de 30 aos.
Respuesta
(id,nombre)(edad>30Ingenieros)
Se aprecia que las tuplas que no cumplan con la condicin de seleccin quedan fuera
del resultado, luego se realiza un Project sobre las filas del resultado, separando solo
las columnas que contienen los atributos id y nombre. Finalmente la tabla queda de la
siguiente manera:
Tabla Ingenieros
id123234345nombreLeonTomasJose
R y S son
tuplas, que
Pgina 29 de 253
una tupla de R con una tupla de S es una tupla ms larga, con un componente para
cada uno de los componentes de las tuplas constituyentes. Es decirCrossproduct define una relacin que es la concatenacin de cada una de las filas de la
S.
representar Cross-product en
lgebra
Relacional
se
utiliza
la
siguiente
terminologa:
RS
Por convencin para la sentencia anterior, los componentes de
R preceden
a los
R y S. El nmero de tuplas
de la nueva relacin resultante es la multiplicacin de la cantidad de tuplas de R por la
cantidad de tuplas que tenga S (producto de ambos). Si Ry S tienen algunos atributos
en comn, entonces se debe inventar nuevos nombres para al menos uno de cada par
de atributos idnticos. Para eliminar la ambigedad de un atributo a, que se encuentra
en R y S, se usa R.a para el atributo de R y S.a para el atributo de S.
Cabe mencionar que por notacin que: RSSR
Ejemplo 1
Pgina 30 de 253
de S resaltadas en verde.
Con las tablas dadas realice el Cross-product de S con R:
Ejemplo 2
Dada las siguientes tablas:
Tabla Ingenieros
id123234143nombreLeonTomasJosefad#393425
Tabla Proyectos
proyectoACU0034USM7345duracion30060
Escriba la tabla resultante al realizar la siguiente operacin:
IngenierosProyectos
Respuesta
IngenierosProyectos
Pgina 31 de 253
id123123234234143143nombreLeonLeonTomasTomasJosefaJosefad#393934
342525proyectoACU0034USM7345ACU0034USM7345ACU0034USM7345
duracion300603006030060
Natural Join
Este operador se utiliza cuando se tiene la necesidad de unir relaciones vinculando slo
las tuplas que coinciden de alguna manera.NaturalJoin une slo los pares de tuplas
de R y S que sean comunes. Ms precisamente una tupla r de
R y una tupla s de S se
equivalencia es la siguiente:
RS=R.A1,...,R.An,S.A1,...,S.An(R.A1=S.A1...R.An=S.An(RS))
Mtodo
1. Se realiza el producto cartesiano RS .
2. Se seleccionan aquellas filas del producto cartesiano para las que los
atributos comunes tengan el mismo valor.
3. Se elimina del resultado una ocurrencia (columna) de cada uno de los
atributos comunes.
Ejemplo 1
R
a14b25c36
Pgina 32 de 253
S
c763d524
Con las tablas dadas realice el NaturalJoin de R y S:
RS
a14b25c36d42
Ejemplo 2
Realizar NaturalJoin a las siguientes tablas:
Tabla Ingenieros
id123234143090nombreLeonTomasJosefaMariad#39342534
Tabla Proyectos
d#3934proyectoACU0034USM7345
Respuesta
IngenierosProyectos
id123234090nombreLeonTomasMariad#393434proyectoACU0034USM7345
USM7345
ThetaJoin
Define una relacin que contiene las tuplas que satisfacen el predicado
Product de
RS.
tienen
una
C en el Cross-
especfica.
La
condicin
C es
de
la
Pgina 33 de 253
RCS
C = <Atributo> <Comparador> <Atributo o Constante del Dominio> Donde: <Comparad
or>
{=,,>,<,,}
RCS=F(RS)
Mtodo
1. Se forma el producto cartesiano RS .
2. Se selecciona, en el producto, solo la tupla que cumplan la condicin
C.
Ejemplo 1
R
a132b323c595d714
S
a1132c5593e2927
Escriba la tabla resultante al realizar la siguiente operacin:
R(a>=e)S
Respuesta
Pgina 34 de 253
S.
R con
verdadero (true).
S.
R mezclada
S
R.a3322b2233R.c9955d1144S.a1313S.c5959e2222
Ejemplo 2
Con el esquema conceptual siguiente, hallar los nombres de los directores de cada
departamento:
Pgina 35 de 253
(Dpto.nombre,empleado.nombre)(DptonIFDirector=NIFEmpleado)
Ejercicio propuesto
Considere la siguiente base de datos:
1.
2.
3.
4.
la
clave.
Escribir expresiones en lgebra relacional para las siguientes dos preguntas:
Pgina 36 de 253
de
objetos
considerada
como
un
objeto
en
s.
La Unin de
Ay
dos
de B. El
Pgina 37 de 253
De manera anloga, la Unin de dos relaciones R y S, es otra relacin que contiene las
tuplas
que
estn
en
R,
en
S,
en
ambas,
eliminndose
las
tuplas
RS
Si se realiza
Ejemplo
Dadas las siguientes relaciones:
Tabla Ingenieros
id123234345143nombreLeonTomasJoseJosefaedad39344525
Tabla Jefes
id123235nombreLeonMariaedad3929
Aplicar el operador Unin:
Tabla IngenierosJefes
id123234345143235nombreLeonTomasJoseJosefaMariaedad3934452529
Como se mencion anteriormente, realizar la operacin
Diferencia
Volviendo
la
analoga
de
lgebra
de
conjuntos,
la
diferencia
entre
A que
dos
no
B.
AB
Pgina 38 de 253
BA
ABBA
De la misma forma la diferencia de dos relaciones
las tuplas que estn en la relacin
R,
pero no
RS
Es importante resaltar que RS es diferente a SR.
Ejemplo
Empleando
las
mismas
tablas
dadas
en
el
ejemplo
anterior,
Ingenieros - Jefes
id234345143nombreTomasJoseJosefaedad344525
Jefes - Ingenieros
Curso SQL PostgreSQL
Pgina 39 de 253
id235nombreMariaedad29
Como se puede apreciar, ambas operaciones dieron como resultado distintas
relaciones, tal como se haba mencionado anteriormente.
Interseccin
En lgebra de conjuntos la Interseccin de dos conjuntos A y B es el conjunto que
contiene
todos
los
elementos
comunes
de
A y B.
El
smbolo
representa
AB
RS
Si se realiza
RS es
lo mismo que
SR,
RS=R(RS)
Ejemplo
Utilizando las mismas tablas del ejemplo anterior, encontrar la Interseccin de la tabla
de Ingenieros con la de Jefes:
IngenierosJefes
Pgina 40 de 253
id123nombreLeonedad39
Importante
Para aplicar estas operaciones a relaciones, necesitamos que
R y S sean unin-compatible:
puede
ser
expresada
en
trminos
de
conjuntos
de
S de R para
formar una relacin T que consiste en todas aquellas tuplas en R pero no en S.
Cuando se resta T de R, dejamos solo esas tuplas de R que estn tambin en S.
R=0 es
S.
supuesto, el resultado de S puede contener tuplas adicionales no producidas en R.
Por
Estas formas para expresar restriccin son de hecho equivalentes en lo que pueden
expresar, pero algunas veces uno de los dos es ms clara o ms sucinta. Es decir, la
restriccin RS pudo tambin ser escrito RS=0. Para ver por qu, observe que si
cada tupla en
Pgina 41 de 253
R debe
estar en S (o de lo que
sera RS).
Por otra parte, una restriccin de la primera forma,
R=0,
usar 0 como una expresin de algebra relacional. Tenga en cuenta que estas
equivalencias sostienen se sostienen incluso si R y S son bolsas, dado que hacemos la
interpretacin convencional de RS: cada tupla t aparece en
S al
como aparece en R.
Ejercicios Propuestos
Ejercicio 1
Las relaciones base que forman la base de datos de un video club son las siguientes:
Socio(codsocio,nombre,direccion,telefono):
de cada uno de los socios del video club: cdigo del socio, nombre, direccin y
telfono.
Pelicula(codpeli,titulo,genero):
una de las pelculas de las cuales tiene copias el vdeo club: cdigo de la
pelcula, ttulo y gnero (terror, comedia, etc.).
Cinta(codcinta,codpeli):
copias que hay de cada pelcula (copias distintas de una misma pelcula tendrn
distinto cdigo de cinta).
Prestamo(codsocio,codcinta,fecha,presdev):
almacena informacin de los prstamos que se han realizado. Cada prstamo es
de una cinta a un socio en una fecha. Si el prstamo an no ha finalizado,
presdev tiene el valor prestada; si no su valor es devuelta.
ListaEspera(codsocio,codpeli,fecha):
almacena
informacin sobre los socios que esperan a que haya copias disponibles de
pelculas, para tomarlas prestadas. Se guarda tambin la fecha en que comenz
la espera para mantener el orden. Es importante tener en cuenta que cuando el
socio consigue la pelcula esperada, ste desaparece de la lista de espera.
Pgina 42 de 253
En las relaciones anteriores, son claves primarias los atributos y grupos de atributos
que aparecen en negrita. Las claves ajenas se muestran en los siguientes diagramas
referenciales:
Resolver las siguientes consultas mediante el lgebra relacional (recuerde que en la
Leccin 3 tambin se dieron algunos operadores de lgebra relacional):
1.1. Seleccionar todos los socios que se llaman: Charles.
Respuesta
nombre='Charles'(Socio)
1.2. Seleccionar el cdigo socio de todos los socios que se llaman: Charles.
Respuesta
codsocio(nombre='Charles'(Socio))
1.3. Seleccionar los nombres de las pelculas que se encuentran en lista de espera.
Respuesta
titulo(PeliculaListaEspera)
1.4. Obtener los nombres de los socios que esperan pelculas.
Respuesta
nombre(SocioListaEspera)
1.5. Obtener los nombres de los socios que tienen actualmente prestada una pelcula
que ya tuvieron prestada con anterioridad.
Respuesta
nombre({(Prestamo(presdev='prestada')Cinta)(Prestamo(presdev='devuelta')Cinta
)}Socio)
1.6. Obtener los ttulos de las pelculas que nunca han sido prestadas.
Respuesta
titulo{(codpeliPeliculacodpeli(PrestamoCinta))Pelicula}
(todas las pelculas) menos (las pelculas que han sido prestadas alguna vez)
Pgina 43 de 253
1.7. Obtener los nombres de los socios que han tomado prestada la pelcula WALL*E
alguna vez o que estn esperando para tomarla prestada.
Respuesta
nombre(titulo='WALL*E'(SocioPrestamoCintaPelicula)titulo='WALL*E'(
SocioListaEsperaPelicula))
1.8. Obtener los nombres de los socios que han tomado prestada la pelcula WALL*E
alguna vez y que adems estn en su lista de espera.
Respuesta
nombre(titulo='WALL*E'(SocioPrestamoCintaPelicula)titulo='WALL*E'
(SocioListaEsperaPelicula))
Ejercicio 2
Considere la base de datos con el siguiente esquema:
1.
2.
3.
4.
la
clave.
Escribir las expresiones de lgebra relacional para las siguientes nueve consultas.
(Precaucin: algunas de las siguientes consultas son un poco desafiantes).
Encuentre los nombres de todas las mujeres que comen pizza ya sea con
championes o salchichn (o ambas).
Encuentre los nombres de todas las mujeres que comen pizzas con los
dos ingredientes, championes y salchichn.
Encuentre todas las pizzeras que sirven al menos una pizza que Amy
come por menos de 10 dlares.
Encuentre todas las pizzeras que son frecuentadas por solo mujeres o
solo hombres.
Pgina 44 de 253
Para cada persona, encuentre todas las pizzas que la persona come, que
no son servidas por ninguna pizzera que la persona frecuenta. Devuelve
toda dicha persona (nombre)/ pizza pares.
Caractersticas
Algunas de las caractersticas de este lenguaje son:
Pgina 45 de 253
Ejemplos de DDL:
CREATE TABLE nombre_tabla;
DROP TABLE nombre_tabla;
ALTER TABLE nombre_tabla ADD id INTEGER;
CREATE:
Un
argumento CREATE en
SQL
crea
un
objeto
dentro
del
sistema
de
DROP:
El tipo de objetos que se pueden eliminar depende de que RDBMS esta siendo
utilizado, pero la mayora soporta la eliminacin de tablas, ndices, usuarios y
bases de datos.
Algunos sistemas (tales como PostgreSQL) permiten DROP y otros comandos
DDL, dentro de transacciones, y por lo tanto pueden ser revertidos
ALTER:
Pgina 46 de 253
Ejemplos de DML
SELECT atributo FROM nombre_tabla;
INSERT
INTO
nombre_tabla(atributo_1,...,atributo_n)
(dato_1,...,dato_n);
DELETE FROM nombre_tabla WHERE condicion;
UPDATE nombre_tabla SET atributo = nuevo dato WHERE condicion;
VALUES
Descripcin de comandos
SELECT
Como
SQL
es
un
lenguaje
de
programacin
declarativo,
Significado:
Pgina 47 de 253
A1,,An de
las tablas o
lgebra relacional:
A1,,An(condicin(R1Rm))
Comandos SQL:
relacional.
puede ser eliminado si existe una condicin, de lo contrario todos los registros
sern eliminados.
UPDATE - cambia los datos de uno o ms registros de una tabla. Una fila o un
subconjunto de filas puede ser actualizadas utilizando una condicin.
Ejemplo prctico
Nota
Para realizar estos ejercicios, debe utilizar Postgresql mediante la conexin ssh o tambin
puede instalarlo en su computador.
Si tiene un sistema Linux puede utilizar el gestor de paquetes del sistema operativo.
Para usuarios que utilicen Debian / Ubuntu pueden ejecutar el siguiente comando
como root:
sudo apt-get
libpq-dev
install
postgresql
postgresql-client
postgresql-contrib
Pgina 48 de 253
Para usuarios que utilicen Debian / Ubuntu pueden ejecutar el siguiente comando
como root
sudo su postgres -c psql
Comenzamos el servicio
/etc/init.d/postgresql start
psql
Primero que todo debemos crear una base de datos para comenzar nuestros ejercicios.
La llamaremos example:
postgres=# create database example;
CREATE DATABASE
Luego de haber creado nuestra base de datos, necesitamos ingresar a ella para
comenzar a realizar las distintas operaciones:
postgres=# \c example
psql (8.4.14)
Ahora est conectado a la base de datos example.
Ahora comenzamos a crear una tabla llamada cliente con las variables id que se define
como serial en que al ir agregando datos se autoincrementar automticamente en la
base de datos example:
example=# CREATE TABLE cliente (id SERIAL, nombre VARCHAR(50), apellido
VARCHAR(50), edad INTEGER, direccion VARCHAR(50), pais VARCHAR(25));
Pgina 49 de 253
VALUES
VALUES
VALUES
VALUES
VALUES
Pgina 50 de 253
Pgina 51 de 253
Ejemplo Prctico
Primero crearemos la tabla profesores en que ID_profesor ser la clave primaria y est
definido como serial que automticamente ir ingresando los valores 1, 2, 3 a cada
registro.
postgres=# CREATE TABLE profesores(ID_profesor serial, nombre VARCHAR(30),
apellido VARCHAR(30), PRIMARY KEY(ID_profesor));
Ahora vamos a crear la tabla de cursos en que ID_curso ser la clave primaria de esta
tabla y ID_profesor ser la clave fornea, que se encargar de realizar una conexin
entre estas dos tablas.
postgres=#
CREATE
TABLE
cursos(ID_curso
serial,
titulo
VARCHAR(30),
ID_profesor
INTEGER,
PRIMARY
KEY(ID_curso),
FOREIGN
KEY(ID_profesor)
REFERENCES profesores(ID_profesor));
Pgina 52 de 253
Se insertarn algunos datos para poder realizar una seleccin y poder visualizar el
funcionamiento de la clave primaria y fornea
postgres=#
INSERT
INTO
profesores(nombre,
apellido)
VALUES('Alfred','JOHNSON');
INSERT 0 1
postgres=#
INSERT
INTO
profesores(nombre,
apellido)
VALUES('Alisson','DAVIS');
INSERT 0 1
postgres=# INSERT INTO profesores(nombre, apellido) VALUES('Bob','MILLER');
INSERT 0 1
postgres=# INSERT INTO profesores(nombre, apellido) VALUES('Betty','WILSON');
INSERT 0 1
postgres=#
INSERT
INTO
profesores(nombre,
apellido)
VALUES('Christin','JONES');
INSERT 0 1
postgres=# INSERT INTO profesores(nombre, apellido) VALUES('Edison','SMITH');
INSERT 0 1
Pgina 53 de 253
Ahora queremos tener solo una tabla con el nombre, apellido del profesor y el
titulo de la asignatura que dicta. Para esto realizamos una seleccin de la siguiente
manera:
postgres=# SELECT nombre, apellido, titulo FROM profesores, cursos
profesores.id_profesor=cursos.id_profesor;
nombre | apellido |
titulo
----------+----------+-----------------------------Alisson | DAVIS
| Base de datos
Christin | JONES
| Estructura de datos
Alfred
| JOHNSON | Arquitectura de computadores
Bob
| MILLER
| Recuperacion de informacion
Betty
| WILSON
| Teoria de sistemas
WHERE
Pgina 54 de 253
Edison
(6 rows)
| SMITH
| Sistemas de informacion
podemos
realizar
una
igualdad
entre
los
id_profesor
de
la
Pgina 55 de 253
de
dato
tpicos
valores
enteros.
El
TipoDATETIMESTAMPTIMEDescripcinFecha ANSI SQL "aaaa-mmdd".Fecha y hora "aaaa-mm-dd hh:mm:ss".Hora ANSI SQL "hh:mm:ss".
Ejemplo prctico
A continuacin se mostrarn ejemplos realizados con PostgreSQL de los tipos de datos
nombrados anteriormente.
Este ejemplo trata del juego adivina quin donde se realizan preguntas como: tu
personaje tiene gafas, es rubio, es alto. La tabla queda de la siguiente manera
utilizando los valores booleanos para crear las tablas:
Pgina 56 de 253
Pgina 57 de 253
ramo
VARCHAR(30),
nota_1
Retornando PostgreSQL
NOTICE:
CREATE TABLE crear una secuencia implcita notas_id_seq
para la columna serial notas.id
CREATE TABLE
Ingresando datos
postgres=# INSERT INTO notas(ramo,nota_1,nota_2,promedio) VALUES('Base
de datos', 57, 36, 46.5);
INSERT 0 1
Advertencia
Para ingresar un dato tipo FLOAT, el valor no lleva una coma, sino que un punto
Ahora
se
realizar
el
siguiente
ejemplo
en
el
que
se crear la
tabla test_datatype con los tipos de datos BIT(n) y BIT VARYING(n). Que en este
caso ser data1 con un largo fijo de 4 y data2 con un largo variable de 6.
postgres=# CREATE
VARYING(6));
CREATE TABLE
TABLE
test_datatype_bit(data1
BIT(4),
data2
BIT
INTO
test_datatype_bit(data1,data2)
INTO
test_datatype_bit(data1,data2)
Los siguientes datos ingresador retornaron un error puesto que no cumplen con
el largo fijo y variable definido en la creacin de la tabla test_datatype_bit
postgres=#
INSERT
INTO
test_datatype_bit(data1,data2)
VALUES(B'101',B'10110');
ERROR: el largo de la cadena de bits 3 no coincide con el tipo bit(4)
Pgina 58 de 253
postgres=#
INSERT
INTO
test_datatype_bit(data1,data2)
VALUES(B'1011',B'1011011');
ERROR:
la cadena de bits es demasiado larga para el tipo bit
varying(6)
postgres=#
CREATE
TABLE
registro(id_registro
serial,
nombre
VARCHAR(30), apellido VARCHAR(30), ingreso TIMESTAMP, anos_trabajados
SMALLINT);
Retornando lo siguiente
NOTICE:
CREATE
TABLE
registro_id_registro_seq
registro.id_registro
CREATE TABLE
crear
para
una
la
secuencia
columna
implcita
serial
Ahora
realizamos
una seleccin de
la
INTO
VALUES('Elliott',
verificar
como
Pgina 59 de 253
El id, es de tipo serial, es decir es un numero entero que tiene una secuencia
asociada. Al crear la tabla notas e indicar que el campo id es serial, se crea de
forma implcita una secuencia asociada al campo id.
ramo
VARCHAR(30),
nota_1
Retornando PostgreSQL
NOTICE:
CREATE TABLE crear una secuencia implcita notas_id_seq
para la columna serial notas.id
CREATE TABLE
Ingresando datos
postgres=# INSERT INTO notas(ramo,nota_1,nota_2,promedio) VALUES('Base
de datos', 57, 36, 46.5);
INSERT 0 1
Pgina 60 de 253
En palabras simples, lo que se busca con esta consulta es seleccionar cierta informacin
(SELECT) de alguna tabla (FROM) que satisfaga (WHERE) ciertas condiciones. Por ejemplo:
Obtener los nombres de los alumnos que hayan nacido en el mes de Noviembre
SELECT "los nombres" FROM "alumnos" WHERE "hayan nacido en el mes de
Noviembre"
= igual a
Pgina 61 de 253
SELECT-FROM-WHERE
Trabajemos bajo el siguiente ejemplo, el cual consiste en seleccionar toda la
informacin de la relacin (o tabla) Empleados cuyos atributos departamento sea
Informatica y que su atributo ano_ingreso sea mayor o igual al ao 2005.
Para comenzar a realizar este ejemplo, primero debemos crear la tabla Empleados de la
siguiente manera.
postgres=#
CREATE
TABLE
Empleados(id_empleado
serial,
nombre_empleado
VARCHAR(30), departamento VARCHAR(30), ano_ingreso INTEGER);
departamento, ano_ingreso)
departamento, ano_ingreso)
departamento, ano_ingreso)
departamento, ano_ingreso)
departamento, ano_ingreso)
Pgina 62 de 253
AND
Nota
Podemos notar que la consulta retorna el registro que se cumplian las dos condiciones.
OR
Nota
Podemos observar que la consulta realizada retorna los registros que cumplen con una de
las dos condiciones o cuando se cumplen las dos al mismo tiempo.
Esta consulta present un ejemplo bsico de una consulta SELECT - FROM - WHERE de la
mayora de las consultas SQL. La palabra claveFROM selecciona la relacin o relaciones
de donde se obtiene la informacin (tablas). En estos ejemplos, se utilizaron dos
comparaciones unidas por la condicin AND y OR.
El atributo departamento de la tabla Empleados es probada por igualdad contra la
constante Informtica. Esta constante corresponde a una cadena de caracteres de
largo variable que en SQL como se detall en la Leccin anterior se denomina como
VARCHAR(n) y que al momento del ingreso de los datos a las tablas se escribe entre
comillas simples.
Como se mencion anteriormente, la consulta del tipo SELECT - FROM - WHERE busca la
informacin de una o ms relaciones que cumplan con ciertas condiciones. Hasta ahora
slo se ha visto qu pasa si se comparan atributos de las relaciones con constantes.
Pero cmo se pueden comparar los valores almacenados de atributos que estn en
varias relaciones?.
Pgina 63 de 253
El ejemplo anterior se podra realizar de otra manera para poder combinar dos
relaciones (tablas) a la hora de realizar la consulta, pero primero debemos realizar
la creacin de la tabla Empleados y Departamentos.
Advertencia
Antes de realizar la creacin de las tablas, hay que borrar la tabla Empleados con
un DROP TABLE Empleados.
serial,
departamento
secuencia
columna
implcita
serial
el
implcito
ndice
Pgina 64 de 253
postgres=#
ano_ingreso)
INSERT 0 1
postgres=#
ano_ingreso)
INSERT 0 1
postgres=#
ano_ingreso)
INSERT 0 1
postgres=#
ano_ingreso)
INSERT 0 1
postgres=#
ano_ingreso)
INSERT 0 1
INSERT
INTO
Empleados(nombre_empleado,
VALUES('Edgar', 1, 2000);
id_departamento,
INSERT
INTO
Empleados(nombre_empleado,
VALUES('Andrew', 4, 2009);
id_departamento,
INSERT
INTO
Empleados(nombre_empleado,
VALUES('Valerie', 2, 2000);
id_departamento,
INSERT
INTO
Empleados(nombre_empleado,
VALUES('Karl', 2, 2008);
id_departamento,
INSERT
INTO
Empleados(nombre_empleado,
VALUES('Kevin', 3, 2010);
id_departamento,
Pgina 65 de 253
PTrueTrueFalseFalseQTrueFalseTrueFalseANDTrueFalseFal
seFalse
comparar sea TRUE. Si TODOS los valores son FALSE, retornar FALSE.
Su tabla de verdad es:
PTrueTrueFalseFalseQTrueFalseTrueFalseORTrueTrueTrue
False
rario al valor actual, es decir que si el valor es TRUE, retorna FALSE y vice
versa.
Su tabla de verdad es
PTrueFalseNOT PFalseTrue
Nota
SQL no distingue entre maysculas y minsculas. Por ejemplo, FROM (palabra reservada) es
equivalente a from, inclusive a From. Para los nombres de atributos, relaciones, etc., tambin
ocurre lo mismo. El nico caso en que se distingue entre maysculas y minsculas es al
momento de encerrar un string entre . Por ejemplo PALABRA es diferente a palabra.
Resultados Repetidos
Al realizar una consulta SELECT, no hay omisin de resultados repetidos, este
problema se soluciona agregando DISTINCT a la consulta.
SELECT FROM WHERE
SELECT DISTINCT FROM WHERE
En el ejemplo anterior tambin es posible eliminar los resultados repetidos, puesto que
existen muchas personas que trabajan en el mismo departamento, pero si eliminamos
las repeticiones solo nos retornaran los departamentos que existen.
Primero mostraremos un resultado con una consulta con repeticiones.
postgres=# SELECT Departamentos.departamento, Empleados.id_departamento FROM
Empleados,
Departamentos
WHERE
Pgina 66 de 253
Empleados.id_departamento=Departamentos.id_departamento;
id_departamento
----------------+----------------Administracion |
1
Comercial
|
4
Informatica
|
2
Informatica
|
2
Finanzas
|
3
(5 filas)
departamento
Nota
Segn los datos que se ingresaron en la tabla Empleados existe ms de una persona en el
departamento de Informtica.
Nota
Se puede notar que solo nos retorna los departamentos que existen.
SELECT-BY-ORDER
Hasta este momento, es posible obtener datos de una tabla utilizando los comandos
SELECT y WHERE. Sin embargo, muchas veces es necesario enumerar el resultado en un
orden particular. Esto podra ser en orden ascendente, en orden descendente, o podra
basarse en valores numricos o de texto. En tales casos, podemos utilizar la palabra
clave ORDER BY para lograr esto.
SELECT "L"
FROM "R"
WHERE "C"
ORDER BY "O" [ASC, DESC];
Pgina 67 de 253
donde:
Como se puede apreciar, con la sentencia ORDER BY se pueden ordenar las consultas a
travs de mltiples atributos. En este caso todos los campos estaran ordenados de
forma ascendente (ASC).
Podemos utilizar los mismos ejemplos que creamos anteriormente ordenando los
nombres de los empleados de la tabla Empleados.
postgres=# SELECT * FROM Empleados ORDER BY nombre_empleado;
id_empleados | nombre_empleado | id_departamento | ano_ingreso
--------------+-----------------+-----------------+------------2 | Andrew
|
4 |
2009
1 | Edgar
|
1 |
2000
4 | Karl
|
2 |
2008
5 | Kevin
|
3 |
2010
3 | Valerie
|
2 |
2000
(5 filas)
Pgina 68 de 253
(5 filas)
Pgina 69 de 253
las
cuales
representar
un
sistema
simple
de
postulacin
de
estudiantes
4 estudiantes:
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
Student
Student
Student
Student
(sName,
(sName,
(sName,
(sName,
Average)
Average)
Average)
Average)
Values
Values
Values
Values
('Amy', 60);
('Edward', 65);
('Craig', 50);
('Irene', 49);
y 6 postulaciones:
INSERT INTO Apply (sID, cName,
'science', True);
INSERT INTO Apply (sID, cName,
'engineering', False);
INSERT INTO Apply (sID, cName,
'natural hostory', False);
major,
decision)
VALUES
(1,
'Stanford',
major,
decision)
VALUES
(1,
'Stanford',
major,
decision)
VALUES
(2,
'Berkeley',
Pgina 70 de 253
INSERT INTO Apply (sID, cName, major, decision) VALUES (3, 'MIT', 'math',
True);
INSERT INTO Apply (sID, cName, major, decision) VALUES (3, 'Harvard',
'science', False);
INSERT INTO Apply (sID, cName, major, decision) VALUES (4, 'Stanford',
'marine biology', True);
Ejemplo 1
En este ejemplo se busca la informacin del nombre e id de los alumnos, que postulan
a uno o ms establecimientos educacionales con determinado Average:
SELECT Student.sID, sName, Apply.cName, Average FROM Student, Apply WHERE
Apply.sID = Student.sID;
Pgina 71 de 253
4 | Irene
| Stanford |
49
Nota
Al igual que en la consulta anterior, es posible evitar el valor duplicado utilizando SELECT
DISTINCT en lugar de SELECT.
Ejemplo 2
Cuidado con los duplicados!!
Si el lector se fija en la situacin descrita, los nombres de algunos atributos de
diferentes relaciones y/o tablas se repiten, lo cual podra plantear la interrogante a que
tabla se refiere el atributo en cuestin?. Para resolver este problema, se escribe de la
siguiente manera:
"NombreTabla.atributo"
Para la realizacin de este ejemplo, suponga que llegan los papeles de un postulante
ms, por lo que el administrador de la base de datos deber agregar la informacin
necesaria, es decir:
INSERT INTO Student (sName, Average) Values ('Tim', 60);
En variadas ocasiones, los nombres de los atributos se repiten, dado que se comparan
dos instancias de una tabla. En el este ejemplo, se buscan todos los pares de
estudiantes con el mismo Average:
SELECT S1.sID, S1.sName, S1.Average, S2.sID, S2.sName, S2.Average
Pgina 72 de 253
Tim
es decir, que el id del estudiante S1 sea diferente al id del estudiante S2; en cuyo caso
la salida de la consulta es:
sid | sname | Average | sid | sname | Average
----+--------+-----+-----+--------+----1
| Amy
| 60 |
5 | Tim
| 60
5
| Tim
| 60 |
1 | Amy
| 60
Pgina 73 de 253
Establecimiento de Operadores
Los Operadores de conjunto son 3:
Unin
Interseccin
Excepcin
Unin
El operador UNION, permite combinar el resultado de dos o ms sentencias SELECT. Es
necesario que estas tengan el mismo nmero de columnas, y que, adems tengan los
mismos tipos de datos, por ejemplo, si se tienen las siguientes tablas:
Employees_Norway:
E_ID
E_Name
1
Hansen, Ola
2
Svendson, Tove
3
Svendson, Stephen
4
Pettersen, Kari
Employees_USA:
E_ID
E_Name
1
Turner, Sally
2
Kent, Clark
3
Svendson, Stephen
4
Scott, Stephen
Employees_Norway
(E_ID
serial,
E_Name
varchar(50),
PRIMARY
CREATE TABLE
KEY(E_ID));
Employees_USA
E_ID
serial,
E_Name
varchar(50),
PRIMARY
Pgina 74 de 253
es:
e_name
-------------Turner, Sally
Svendson, Tove
Svendson, Stephen
Pettersen, Kari
Hansen, Ola
Kent, Clark
Scott, Stephen
Hay que tener en cuenta que existe en ambas tablas un empleado con el mismo
nombre Svendson, Stephen. Sin embargo en la salida slo se nombra uno. Si se desea
que aparezcan UNION ALL:
SELECT E_Name as name FROM Employees_Norway
UNION ALL
SELECT E_Name as name FROM Employees_USA;
Pgina 75 de 253
Nota
En el ejemplo anterior, se utiliza as name en ambos SELECT. Es un hecho curioso que, si se
utilizan diferentes nombres junto al as, digamos as nombre1 y as nombre2, queda
como nombre de la tabla UNION el primero en ser declarado, en este caso nombre1.
Interseccin
Muy similar al operador UNION, INTERSECT tambin opera con dos sentencias SELECT.
La diferencia consiste en que UNION acta como un OR, e INTERSECT lo hace como
AND.
Nota
Las tablas de verdad de estos OR y AND se encuentran en la Leccin 7.
su salida es:
e_name
---------Svendson, Stephen
Excepcin
Similar a los operadores anteriores, su estructura se compone de dos o mas sentencias
SELECT, y el operador EXCEPT. Es equivalente a la diferencia en el lgebra relacional.
Utilizando las mismas tablas de los empleados, y realizando la siguiente consulta:
SELECT E_Name as name FROM Employees_Norway
EXCEPT
SELECT E_Name as name FROM Employees_USA;
Su salida es:
e-name
----------Pettersen, Kari
Svedson, Tove
Curso SQL PostgreSQL
Pgina 76 de 253
Hansen, Ola
su salida ser:
e-name
-----------Turner, Sally
Kent, Clark
Scott, Stephen
Pgina 77 de 253
SELECT-FROM-WHERE (SELECT)
Hasta ahora se han visto las consultas del tipo SELECT, WHERE, FROM, y algunos de sus
derivados, como lo son el uso de JOIN y operadores lgicos AND, OR, NOT, que son
normalmente utilizados para filtrar resultados mediante la manipulacin de una serie
de condiciones.
Sin embargo Las subconsultas son otra manera de filtrar consultas. Una subconsulta es
una sentencia SELECT que aparece dentro de otra sentencia SELECT y que
normalmente son utilizadas para filtrar una clusula WHERE con el conjunto de
resultados de la subconsulta.
Una
subconsulta
tiene
la
misma
sintaxis
que
una
(cName,
state,
enrollment)
VALUES
(cName,
state,
enrollment)
VALUES
Pgina 78 de 253
INSERT
INTO
'MA',10000);
INSERT
INTO
'CM',23000);
College
College
(cName,
(cName,
state,
state,
enrollment)
enrollment)
VALUES
VALUES
('MIT',
('Harvard',
8 estudiantes:
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
Student
Student
Student
Student
Student
Student
Student
Student
(sName,
(sName,
(sName,
(sName,
(sName,
(sName,
(sName,
(sName,
Average)
Average)
Average)
Average)
Average)
Average)
Average)
Average)
Values
Values
Values
Values
Values
Values
Values
Values
('Amy',
('Edward',
('Craig',
('Irene',
('Doris',
('Gary',
('Doris',
('Tim',
60);
65);
50);
49);
45);
53);
70);
60);
y 21 postulaciones:
INSERT INTO Apply (sID, cName,
'science'
, True);
INSERT INTO Apply (sID, cName,
'engineering'
, False);
INSERT INTO Apply (sID, cName,
'science'
, True);
INSERT INTO Apply (sID, cName,
'engineering'
, False);
INSERT INTO Apply (sID, cName,
'natural history', False);
INSERT INTO Apply (sID, cName,
'math'
, True);
INSERT INTO Apply (sID, cName,
'math'
, False);
INSERT INTO Apply (sID, cName,
, 'science'
, False);
INSERT INTO Apply (sID, cName,
'engineering'
, True);
INSERT INTO Apply (sID, cName,
'marine biology' , True);
INSERT INTO Apply (sID, cName,
'natural history', False);
INSERT INTO Apply (sID, cName,
'science'
, False);
INSERT INTO Apply (sID, cName,
'psychology'
, True);
INSERT INTO Apply (sID, cName,
'math'
, True);
INSERT INTO Apply (sID, cName,
'science'
, False);
INSERT INTO Apply (sID, cName,
'psychology'
, True);
Pgina 79 de 253
Ejemplo 1
El primer ejemplo de subconsulta corresponder al listado de IDs y Nombres de los
estudiantes que han postulado para estudiar science en algn centro educacional.
SELECT sID, sName
FROM Student
WHERE sID in
(SELECT sID FROM Apply WHERE major = 'science');
Pgina 80 de 253
Advertencia
En la consulta se debe especificar que el atributo sID corresponde al de la tabla Student, pues
la tabla Apply tambin cuenta con dicho atributo. Si no se toma en cuenta este detalle, es
probable que la consulta termine en un error con resultados no deseados.
Las 3 filas extra se deben, a que al utilizar join y operadores lgicos, se toman en
cuenta todos los resultados, por ejemplo Amy postul en dos ocasiones a science. Al
utilizar la subconsulta, se eliminan estos resultados duplicados, haciendo la consulta
ms fiel a la realidad pues se pregunta por aquellos estudiantes que han postulado a
science, no cuntas veces postul cada uno. No obstante si se agrega la
clausula DISTINCT, se obtiene la misma respuesta que al utilizar una subconsulta. Es
decir que para la consulta:
SELECT DISTINCT Student.sID, sName
FROM Student, Apply
WHERE Student.sID = Apply.sID AND major = 'science';
su salida ser:
sid | sname
----+------6 | Gary
1 | Amy
3 | Craig
7 | Doris
5 | Doris
Pgina 81 de 253
(5 rows)
Ejemplo 2
Este ejemplo corresponder slo al listado de Nombres de los estudiantes que han
quedado seleccionados para estudiar ciencias en algn centro educacional.
SELECT sName
FROM Student
WHERE sID in
(SELECT sID FROM Apply WHERE major = 'science' and decision ='t' );
Pgina 82 de 253
Pero solo hay 4 estudiantes. Esto se debe a que en ejemplo anterior, se utiliz tanto
el sID como el sName, como ambas Doris cuentan con un sID diferente, no se tomaba
en cuenta como duplicado, pero en esta consulta, al solo contar con sName, ambas
Doris se toman como 2 instancias de la misma y se elimina una.
En este caso, la nica forma de obtener el nmero correcto de duplicados es
utilizando subconsultas.
IN AND NOT IN
IN y NOT IN permiten realizar filtros de forma ms especfica, que permiten responder
preguntas como la del ejemplo 3
Ejemplo 3
En el siguiente ejemplo se quiere saber el sID y el sName de aquellos estudiantes que
postularon a science, pero no a engineering:
SELECT sID, sName FROM Student WHERE
sID in (SELECT sID FROM Apply WHERE major = 'science')
and sID not in (SELECT sID FROM Apply WHERE major = 'engineering');
Pgina 83 de 253
(3 rows)
Nota
Es posible corroborar el resultado ejecutando :sql:SELECT * FROM Apply; y verificar
manualmente.
Ejemplo 4
En este ejemplo se busca el nombre de todos los establecimientos educacionales que
estn en el mismo estado. Si se ejecuta:
SELECT cName, state FROM College;
Pgina 84 de 253
Esto pasa debido a que C1 y C2 pueden ser el mismo establecimiento. Por ende, es
necesario dejar en claro que C1 y C2 son diferentes.
SELECT cName, state
FROM College C1
WHERE exists
(SELECT * FROM College
C2.cName);
C2
WHERE
C2.state
C1.state
and
C1.cName
<>
CLCULOS MATEMTICOS
Es posible realizar clculos matemticos (valor ms alto, valor ms bajo) utilizando
subconsultas:
Ejemplo 5
Se busca el establecimiento con mayor cantidad de alumnos. La consulta que se
realizar corresponde a buscar todos los establecimientos donde no exista otro
establecimiento que su cantidad de alumnos sea mayor que la primera.
Curso SQL PostgreSQL
Pgina 85 de 253
Pgina 86 de 253
SELECT (SELECT)-FROM-WHERE
Es posible utilizar una subconsulta como una columna dentro de la seleccin.
Ejemplo 1
Supongamos que se termin el periodo de postulaciones y desea obtener una lista de
los estudiantes y cuantas veces fueron aceptados.
SELECT sid, sname,
(SELECT COUNT (*) FROM apply A WHERE A.sid = S.sid and A.decision = 't')
as acepted
FROM student S
ORDER BY acepted DESC;
Pgina 87 de 253
Ejemplo 2
Se desea saber el promedio de un determinado alumno y su diferencia con el promedio
ms alto del grupo de alumnos. Podra conseguirse averiguando el promedio ms alto
de grupo, y luego, en otra consulta, calcular la diferencia con el del valor del promedio
del alumno en cuestin (en este caso Doris). Esto es posible realizarlo en una sola
consulta:
SELECT sname, average, average-(SELECT max(average) FROM student )
as diferencia
FROM student
WHERE sname ='Doris';
Pgina 88 de 253
Hay que tener la precaucin de retornar un slo valor a la hora de realizar una
subconsulta dentro de un SELECT. De otra forma se retornar un error, como se ve en el
ejemplo 3.
Ejemplo 3
Supongamos que se trabaja bajo el contexto del ejemplo 2, pero sin utilizar la funcin
MAX, que retorna slo un valor:
SELECT sname, average, average-(SELECT average FROM student )
as diferencia
FROM student
WHERE sname ='Doris';
Ejemplo 4
Supongamos que se desea saber el nombre de cada alumno, su promedio, y su
diferencia respecto al promedio ms bajo del curso:
SELECT sname,
diferencia
FROM student;
average,
average-(SELECT
min(average)
FROM
student
as
SELECT-FROM (SELECT)-WHERE
Otro uso que se les da a las subconsultas es en la palabra reservada FROM. En el FROM
de la consulta, es posible utilizar una subconsulta. De todos modos es necesario
Pgina 89 de 253
Como ya se ha mencionado, en la seccin del FROM, se listan las tablas desde donde se
sacarn los datos para crear las relaciones. Por lo tanto la subconsulta de este estilo
corresponde a crear una nueva tabla desde donde se podrn extraer datos.
Ejemplo 5
Para demostrar el funcionamiento de la subconsulta dentro del FROM, supongamos que
se desea extraer el id y nombre de cada alumno dentro de la tabla student:
SELECT sid, sname FROM student;
Pgina 90 de 253
RECAPITULACIN
Las subconsultas se utilizan cuando la consulta a realizar es demasiado compleja,
Como se ha mencionado en la Leccin anterior, es posible realizar Prcticas de
insercin, actualizacin y eliminacin de datos en las subconsultas.
Ejemplo extra
Nota
A continuacin se vern ejemplos de subconsultas en actualizacin y eliminacin de datos. Su
sintaxis y propiedades se explicarn en la Leccin 14 (semana 4). Ahora se exponen para
dejar en claro que las subconsultas se pueden utilizar en cualquiera de las 4 operaciones
bsicas.
FROM
student)
as
Pgina 91 de 253
3
4
6
7
8
5
|
|
|
|
|
|
Craig
Irene
Gary
Doris
Tim
Doris
|
|
|
|
|
|
50
49
53
70
60
100
Sin embargo, se descubre que Doris de id = 5, hizo trampa. Ella se meti de forma
remota y sin permiso al servidor de datos donde se encontraban las planillas de notas,
y procedi a alterar aquellas que aportaban en su promedio. Como castigo se opta por
eliminarla del proceso de postulacin. El encargado realiza la accin a travs de
subconsultas, considerando que Doris es la nica alumna con promedio 100, que
corresponde a la mxima calificacin:
DELETE FROM student where average = (SELECT max(average) FROM student);
Pgina 92 de 253
INNER JOIN
La sentencia INNER JOIN es el sentencia JOIN por defecto que consiste en combinar
cada fila de una tabla con cada fila de la otra tabla, seleccionado las filas que cumplan
con una determinada condicin.
Esta es la estructura que se ocupa para este tipo de JOIN.
SELECT * FROM tabla_1 INNER JOIN tabla_2 ON condicion
Pgina 93 de 253
Y realizamos la consulta para unir las dos tablas, de acuerdo a la condicin que
detallemos.
postgres=# SELECT Personas.nombre, Personas.apellido, Ordenes.numero_orden
FROM Personas INNER JOIN Ordenes ON Personas.id_persona=Ordenes.persona;
nombre | apellido | numero_orden
--------+----------+-------------Bibi
| Mingus
|
226345
Amy
| Looper
|
345478
Amy
| Looper
|
218909
Calvin | Dixson
|
567432
Calvin | Dixson
|
675209
(5 filas)
Pgina 94 de 253
Nota
Se observa que se unen las dos tablas Personas y Ordenes cumpliendo la condicin que
definimos.
NATURAL JOIN
En el caso de existir columnas con el mismo nombre en las relaciones que se combinan,
solo se incluir una de ellas en el resultado de la combinacin.
Se crearn dos tablas llamadas Alimentos y Compaia, para realizar el ejemplo que
mostrar como funciona el NATURAL JOIN.
CREATE TABLE COMPANIA(id_compania serial, nombre_compania VARCHAR(30), ciudad
VARCHAR(30), PRIMARY KEY(id_compania));
CREATE TABLE ALIMENTOS(id_alimento serial, nombre_alimento VARCHAR(30),
id_compania INTEGER, PRIMARY KEY(id_alimento), FOREIGN KEY(id_compania)
REFERENCES COMPANIA(id_compania));
Pgina 95 de 253
4 |
5 | Pot Rice
| sip-n-Bite
| New York
(5 filas)
Nota
Al realizar el NATURAL JOIN, retorna una tabla con solo una columna llamada id_compania, que
estaba repetida en las dos tablas ALIMENTOSy COMPANIA y la unin de las otras columnas.
continuacin
mostraremos
el
ejemplo
anterior
utilizando
la
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
tabla_A(nombre)
tabla_A(nombre)
tabla_A(nombre)
tabla_A(nombre)
tabla_B(nombre)
tabla_B(nombre)
tabla_B(nombre)
tabla_B(nombre)
VALUES('Pirate');
VALUES('Monkey');
VALUES('Ninja');
VALUES('Spaghetti');
VALUES('Rutabaga');
VALUES('Pirate');
VALUES('Darth Vader');
VALUES('Ninja');
Pgina 96 de 253
tabla_1
LEFT
OUTER
JOIN
tabla_2
ON
tabla_1.columna
tabla_A
LEFT
OUTER
JOIN
tabla_B
ON
Nota
Podemos observar que retorna todos los atributos de la tabla_A (izquierda) y de la tabla_B, solo
retorna los atributos que cumplen con la condicin que establecimos.
tabla_1
RIGHT
OUTER
JOIN
tabla_2
ON
tabla_1.columna
Pgina 97 de 253
RIGHT
OUTER
JOIN
tabla_B
ON
Nota
Se observa que el retorno de la consulta son todos los atributos de tabla_B (derecha) y solo los
atributos que cumplen con la condicin que definimos de tabla_A.
tabla_1
FULL
OUTER
JOIN
tabla_2
ON
tabla_1.columna
Pgina 98 de 253
FULL
OUTER
JOIN
tabla_B
ON
Nota
Se observa que se retornan todos los atributos de tabla_A y tabla_B, aunque no cumpla con la
condicin.
Pgina 99 de 253
tabla
de Ordenes,
que
tendr
los
atributos
precio_ordenes,
cliente)
precio_ordenes,
cliente)
precio_ordenes,
cliente)
precio_ordenes,
cliente)
precio_ordenes,
cliente)
precio_ordenes,
cliente)
Funcin AVG()
La funcin AVG() retorna el valor promedio de una columna numrica.
En SQL la sintaxis es de la siguiente manera:
SELECT AVG(nombre_columna) FROM nombre_tabla;
Tambin podemos calcular con SELECT anidados, el precio de las ordenes que son
mayores al promedio calculado, retornando el id,fecha de orden, precio_ordenes y
el cliente.
postgres=# SELECT id, fecha_ordenes, precio_ordenes, cliente FROM Ordenes
WHERE precio_ordenes > (SELECT AVG(precio_ordenes) FROM Ordenes);
id | fecha_ordenes | precio_ordenes | cliente
----+---------------+----------------+--------1 | 2010-09-23
|
1120 | Alison
2 | 2007-02-21
|
1990 | Alicia
5 | 2005-03-30
|
2120 | Brad
(3 filas)
Funcin COUNT()
La funcin COUNT() retorna el nmero de filas segn los criterios que especificaron.
En SQL la sintaxis que se utiliza para realizar la consulta es:
COUNT(cliente)
AS
cliente_Alison
FROM
Ordenes
WHERE
SQL COUNT(*)
COUNT(*) retorna el nmero de registros de una tabla.
SELECT COUNT(*) FROM nombre_tabla;
especificada.
SELECT COUNT(DISTINCT nombre_columna) FROM nombre_tabla;
Se
realizar
la
que
retornar
la
cantidad
de clientes distintos que existen en la tabla Ordenes, que son Alison, Alicia y Brad.
postgres=# SELECT COUNT(DISTINCT cliente) AS numero_de_clientes FROM Ordenes;
numero_de_clientes
-------------------3
(1 fila)
Funcin MAX()
La funcin MAX() retorna el mximo valor de la columna seleccionada.
En SQL la sintaxis utilizada es de la siguiente manera:
SELECT MAX(nombre_columna) FROM nombre_tabla;
Funcin MIN()
La funcin MIN() retorna el mnimo valor de la columna seleccionada.
En SQL la sintaxis utilizada es de la siguiente manera:
SELECT MIN(nombre_columna) FROM nombre_tabla;
Funcin SUM()
La funcin SUM() retorna la suma total de una columna numrica.
En SQL la sintaxis utilizada es de la siguiente manera:
SELECT SUM(nombre_columna) FROM nombre_tabla;
SQL GROUP BY
La instruccin GROUP BY se utiliza en conjuncin con las funciones de agregado para
agrupar el conjunto de resultados de una o ms columnas.
SELECT
nombre_columna,
funcion_de_agregacion(nombre_columna)
nombre_tabla WHERE condicion GROUP BY nombre_columna;
La
siguiente
consulta
utilizar
la
para
FROM
realizar
SQL HAVING
La clusula HAVING se utiliza en SQL, puesto que la palabra clave WHERE no puede
utilizarse con las funciones de agregado en sus condiciones.
En SQL la sintaxis que se utiliza es de la siguiente manera:
SELECT
nombre_columna,
funcion_de_agregacion(nombre_columna)
nombre_tabla
WHERE
condicion
GROUP
BY
nombre_columna
funcion_de_agregacion(nombre_columna) operador valor;
FROM
HAVING
Ahora queremos saber si alguno de los clientes tiene un precio total de ordenes mayor
a 2130.
postgres=# SELECT cliente, SUM(precio_ordenes) FROM Ordenes GROUP BY cliente
HAVING SUM(precio_ordenes)>2130;
cliente | sum
---------+------
Alison | 2220
Alicia | 2150
(2 filas)
WHERE
CREATE TABLE
En forma predeterminada, una columna puede ser NULL. Si se desea no permitir un
valor NULL en una columna, se debe colocar una restriccin en esta columna
especificando que NULL no es ahora un valor permitido.
Forma general:
CREATE TABLE nombreTabla
(atributo1 tipoAtributo NOT NULL,
atributo2 tipoAtributo);
La consulta anterior crea una tabla llamada nombreTabla, con dos atributos. El primero
atributo1 no acepta valores nulos (NULL), esto debido a que es acompaado de la
instruccin NOT NULL, atributo2 puede no tener valores, es decir se puede dar que
atributo2 contenga, en alguna de sus filas, valores desconocidos.
Para ilustrar las particularidades y utilidad de NULL se utilizar el siguiente ejemplo:
Una
tabla
de
clientes
que
almacena
direccin Cliente(rut,nombre,apellido,
el
rut,
apellido,
nombre,
deuda
deuda,direccion) .
CREATE TABLE
INSERT y UPDATE
Los
valores NULL se
pueden
insertar
en
una
columna
si
se
indica
Al insertar los valores del cliente Tom Hofstadter, se almacen el atributo direccin
como NULL, es decir sin valor asignado. Antes de exponer cmo funciona UPDATE, se
agregan nuevos clientes para mostrar de mejor manera las siguientes consultas:
postgres=# INSERT INTO Cliente (rut, nombre, apellido, deuda, direccion)
values
(412,'Greg', 'Hanks',33, 'Cooper'), (132,'Mayim ', 'Bialik',null, 'Barnett
34'),
(823,'Jim', 'Parsons',93, null),(193,'Johnny', 'Galecki',201, 'Helberg 11'),
(453,'Leslie', 'Abbott',303,null), (583,'Hermione', 'Weasley',47, 'Leakey
24'),
(176,'Ron', 'Granger',92,'Connor 891'), (235,'Hannah', 'Winkle',104, null),
(733,'Howard', 'Brown',null, null);
INSERT 0 9
Realizando una consulta SELECT, para ver todos los clientes que se insertaron, se
puede apreciar un espacio vaco en los valores que llevaban NULL al momento de
hacer INSERT. Tal es el caso de la direccin de Tom Hofstadter o la deuda Mayim
Bialik .
postgres=# SELECT * FROM Cliente;
rut | nombre | apellido | deuda | direccion
-----+----------+------------+-------+-----------123 | Tom
| Hofstadter |
456 |
412 | Greg
| Hanks
|
33 | Cooper
132 | Mayim
823 | Jim
193 | Johnny
453 | Leslie
583 | Hermione
176 | Ron
235 | Hannah
733 | Howard
(10 filas)
|
|
|
|
|
|
|
|
Bialik
Parsons
Galecki
Abbott
Weasley
Granger
Winkle
Brown
|
|
|
|
|
|
|
|
93
201
303
47
92
104
|
|
|
|
|
|
|
|
Barnett 34
Helberg 11
Leakey 24
Connor 891
SELECT
Seleccionar atributos NULL
Forma general:
SELECT atributo1 FROM nombreTabla WHERE atributo2 IS NULL
Utilizando el mismo ejemplo, Seleccionar todos los nombres y apellidos de los clientes
donde la direccin es NULL:
postgres=# SELECT nombre,apellido FROM Cliente WHERE direccion IS NULL;
nombre | apellido
--------+-----------Tom
| Hofstadter
Jim
| Parsons
Leslie | Abbott
Hannah | Winkle
Howard | Brown
Greg
| Hanks
(6 filas)
Seleccionar todos los nombres y apellidos de los clientes donde la direccin es distinta
a NULL:
postgres=# SELECT nombre,apellido FROM Cliente WHERE direccion IS NOT NULL;
nombre | apellido
----------+---------Mayim
| Bialik
Johnny
| Galecki
Hermione | Weasley
Ron
| Granger
(4 filas)
Al utilizar la instruccin IS NOT NULL se seleccionan todos los clientes que tienen una
direccin conocida, es decir que poseen algn valor designado en la base de datos.
La siguiente consulta selecciona el nombre y apellido de los clientes que poseen una
deuda mayor a 100 o menor/igual a 100. Se puede apreciar que esta consulta abarcara
a todos los clientes, pues cualquier nmero entero es mayor, menor o igual a 100.
postgres=# SELECT nombre,apellido FROM Cliente WHERE deuda > 100 or deuda
<=100;
nombre | apellido
----------+-----------Tom
| Hofstadter
Jim
| Parsons
Johnny
| Galecki
Leslie
| Abbott
Hermione | Weasley
Ron
| Granger
Hannah
| Winkle
Greg
| Hanks
(8 filas)
Se puede notar que no se incluye a todos los clientes, esto ocurre pues el atributo
deuda admita valores nulos, y como se mencion, un NULL no se puede comparar con
ningn valor, pues arroja un resultado desconocido.
La forma de obtener todos los clientes es la siguiente:
postgres=# SELECT nombre,apellido FROM Cliente WHERE deuda > 100 or deuda
<=100 or deuda IS NULL;
nombre | apellido
----------+-----------Tom
| Hofstadter
Mayim
| Bialik
Jim
| Parsons
Johnny
| Galecki
Leslie
| Abbott
Hermione | Weasley
Ron
| Granger
Hannah
| Winkle
Howard
| Brown
Greg
| Hanks
(10 filas)
postgres=# SELECT (SELECT deuda FROM cliente WHERE rut=132)+( SELECT deuda
FROM cliente WHERE rut=583) as suma;
suma
-----(1 fila)
La sentencia suma la deuda del cliente 132 que es NULL con la deuda del cliente 583
que es 47, NULL + 47 arroja como resultado NULL. Lo mismo ocurre con la resta,
multiplicacin y divisin.
Operadores lgicos
Cuando hay valores NULL en los datos, los operadores lgicos y de comparacin
pueden devolver un tercer resultado UNKNOWN(desconocido) en lugar de
simplemente TRUE (verdadero) o FALSE (falso). Esta necesidad de una lgica de
tres valores es el origen de muchos errores de la aplicacin.
Se insertan algunos valores para la nueva columna actual. Esta columna describe si un
cliente es actual o dej de ser cliente de la compaa.
postgres=#
UPDATE 1
postgres=#
UPDATE 1
postgres=#
UPDATE 1
postgres=#
UPDATE 1
postgres=#
UPDATE 1
postgres=#
UPDATE 1
postgres=#
IS UNKNOWN retorna los valores que no son false ni true. A continuacin se muestra
su uso, seleccionando de la tabla cliente todos los nombres que en su atributo actual,
no poseen valor.
postgres=#
nombre
---------Mayim
Hermione
Ron
Hannah
(4 filas)
IS NOT UNKNOWN funciona de la misma forma solo que retorna los valores que poseen
algn valor asignado, ya sea true o false.
Para los operadores and y or que involucran NULL, de manera general se puede decir:
Curso SQL PostgreSQL
Nota
Para minimizar las Prcticas de mantenimiento y los posibles efectos en las consultas o
informes existentes, debera minimizarse el uso de los valores desconocidos. Es una buena
prctica plantear las consultas e instrucciones de modificacin de datos de forma que los
datos NULLtengan un efecto mnimo.
->
->
->
->
SELECT
INSERT
UPDATE
DELETE
En esta Leccin se vern en profundidad, las operaciones que permiten mantener una
base de datos, es decir, INSERT, UPDATE y DELETE.
INSERT
Para insertar datos, existen al menos dos formas. Una se ha visto desde las primeras
Leccins (INSERT INTO):
INSERT INTO table VALUES (atributo1, atributo2 ...);
Es decir que se insertar en la tabla, los valores correspondientes a sus atributos de la.
Para poder utilizar esta forma, es necesario que la cantidad de valores asociados a los
atributos, sea igual a la cantidad de atributos de la tabla, y que estn en el mismo
orden respecto a los tipos de datos y los datos que se quieran insertar. El ejemplo 1
aclarar posibles dudas:
Contexto
Utilicemos la tabla Student, que ya se ha utilizado en Leccins anteriores:
Student (sID, sName, Average)
y creemos una nueva tabla llamada Student_new, con una estructura similar, pero vaca:
CREATE TABLE Student_new (sID serial, sName VARCHAR(20),
Average INTEGER, PRIMARY KEY(sID));
Es decir, cuenta con 3 atributos, los cuales son: el identificador o sID de carcter entero
y serial, lo cual significa que si no se especifica un valor, tomar un valor entero; el
Ejemplo 1
Supongamos que planilla de estudiantes albergada en la tabla Student ya fue enviada y
no se puede modificar, es por ello que se necesita crear una nueva planilla (otra tabla
student), y agregar a los nuevos alumnos postulantes.
Por lo tanto es posible agregar un estudiante mediante:
INSERT INTO Student_new VALUES (1,'Betty', 78);
es
sid | sname | average
-----+-------+--------1 | Betty |
78
(1 row)
Al utilizar el atributo sID como serial, es posible omitir el valor de este atributo a la hora
de insertar un nuevo estudiante:
INSERT INTO Student_new (sName, Average) VALUES ('Wilma', 81);
Esto se debe a que sID es clave primaria, y serial tiene su propio contador, que parte de
1 (el cual no est ligado necesariamente a los valores de las diversas filas que puedan
existir en la tabla). Hasta este punto, slo se pueden seguir aadiendo alumnos
agregado de forma explcita todos y cada uno de los atributos de la tabla, sin poder
prescindir en este caso de sID y su caracterstica de ser serial, pues la tupla atributovalor (sID)=(1) est bloqueada.
Nota
Es posible eliminar directamente la fila que corresponde a Betty, pero ese paso se reserva
a la subseccin de DELETE, presentada ms adelante en esta Leccin
Ejemplo 2
Es posible modificar la insercin de Betty para que sea similar a la de Wilma.
Nota
A continuacin se usar el comando SQL DROP TABLE, que permite eliminar una tabla
entera.
la salida es:
sid | sname | average
-----+-------+--------1 | Betty |
78
2 | Wilma |
81
(2 rows)
UPDATE
Es posible modificar o actualizar datos a travs del comando UPDATE, cuya sintaxis
es:
UPDATE table SET Attr = Expression
WHERE Condition;
Es decir que se actualiza de la tabla el atributo Attr (el valor anterior, por el valor
Expression), bajo una cierta condicin Condition
Nota
Es importante destacar que la condicin puede variar, puede ser de carcter sumamente
complejo, una sub-consulta, una sentencia que involucre otras tablas. Expression tambin
puede ser un valor que involucre otras tablas, no necesariamente corresponde a un valor de
comparacin directa. Se aplica lo mismo para la condicin.
Ejemplo 3
Bajo el contexto del ejemplo 2, supongamos que la nota de Wilma corresponde a un
91 en lugar de 81. Se desea corregir este error de tipo, a travs del comando UPDATE.
Es necesario recordar que dependiendo de la cantidad de atributos de la tabla, es
posible realizar de muchas formas la actualizacin:
UPDATE Student_new
SET Average = 91
WHERE sName = 'Wilma';
o
UPDATE Student_new
SET Average = 91
WHERE Average = 81;
necesario tener la costumbre de trabajar con atributos que sean nicos, es decir la clave
primaria (en este caso el atributo sID). La razn corresponde a que en caso de haber
ms de una Wilma se cambiara el promedio de ambas, lo mismo para el caso de que
varias personas cuenten con un promedio igual a 81. Por lo tanto la consulta ideal
corresponde a:
UPDATE Student_new
SET Average = 91
WHERE sID = 2;
la salida es:
sid | sname | average
-----+-------+--------1 | Betty |
78
2 | Wilma |
91
Curso SQL PostgreSQL
(2 rows)
DELETE
Es posible eliminar filas de informacin, que cumplan una determinada condicin. Esto
es especialmente til en casos donde se desee borrar filas especficas en lugar de tener
que borrar toda una tabla.
La sintaxis del comando DELETE es:
DELETE FROM table WHERE Condition;
Es decir que de la tabla, se elimine el(los) valor(es) que cumpla(n) con la condicin
Condition.
Nota
Es importante destacar que la condicin puede variar, puede ser de carcter sumamente
complejo, una sub-consulta, una sentencia que involucre otras tablas.
Ejemplo 4
Si nos situamos temporalmente al final del ejemplo 1, con el error:
ERROR: duplicate key value violates unique constraint "student2_pkey"
DETAIL: Key(sid)=(1) already exists.
Si verificamos:
SELECT * FROM Student_new;
la salida es:
sid | sname | average
----+--------+---------
Y verificando:
SELECT * FROM Student_new;
la salida es:
sid | sname | average
----+--------+--------1 | Betty | 78
2 | Wilma | 81
Ejemplo 5
Supongamos que Wilma se enoja por el error de tipo y desea salir del proceso de
postulacin. Es por ello que debe ser eliminada de la nueva planilla de estudiantes:
DELETE FROM Student_new WHERE sID = 2;
RECAPITULACIN
A continuacin se expondr un ejemplo que implique el uso de todos los comandos
aprendidos en esta Leccin.
Ejemplo extra
Tomando en cuenta el ejemplo 5, supongamos que Betty pasa a la etapa de
postulaciones y decide postular a 2 Establecimientos educacionales. Postula a Ciencias
e Ingeniera en Stanford y a Historia Natural en Berkeley, es aceptada en todo lo que ha
postulado. La tabla Apply igual que la tabla Student: ya se haba enviado sin posibilidad
de modificar. Es por ello que se crea la tabla Apply_new, con las mismas caractersticas
que Apply:
CREATE TABLE
Apply_new(sID INTEGER, cName VARCHAR(20), major VARCHAR(30),
decision BOOLEAN,
PRIMARY kEY(sID, cName, major));
INSERT INTO Apply_new (sID, cName, major, decision) VALUES (1, 'Stanford',
Curso SQL PostgreSQL
'science'
, True);
INSERT INTO Apply_new (sID, cName, major, decision) VALUES (1, 'Stanford',
'engineering'
, True);
INSERT INTO Apply_new (sID, cName, major, decision) VALUES (1, 'Berkeley',
'natural history'
, True);
Verificando la salida:
SELECT * FROM Apply_new;
se tiene que:
sid | cname
|
major
| decision
-----+----------+-----------------+---------1 | Stanford | science
| t
1 | Stanford | engineering
| t
1 | Berkeley | natural history | t
(3 rows)
Supongamos ahora que Betty, por suerte, es una persona distrada y debido a sus
enormes ganas de entrar a ciencias no se percata del error. El responsable de error, por
temor a poner en juego su reputacin, decide eliminar el registro de la postulacin, en
lo que considera un plan maestro, pues la tabla Apply_new no cuenta con un contador
serial que pudiese causar algn conflicto.
DELETE FROM Apply_new
WHERE sid = 1 and cname = 'Stanford' and major = 'engineering';
sid | cname
|
major
| decision
-----+----------+-----------------+---------1 | Stanford | science
| t
1 | Berkeley | natural history | t
(2 rows)
Cmo elegir?.
A continuacin se muestra una tabla y luego el detalle de los problemas que presenta:
123 Ann de PAHS (P.A) y GHS (P.A) juega tenis y toca la trompeta y postul a Stanford,
Berkeley y al MIT
Los datos ingresados en la tabla podran ser los que se muestran a continuacin:
123123123..AnnAnnAnn..StanfordBerkeleyBerkeley..PAHSPAHSPAHSGHS
.P.AP.AP.A..tenistenistrompeta..
Redundancia: captura informacin muchas veces como por ejemplo 123 Ann,
PAHS, tenis o MIT.
Estudiante(SSN, sNombre);
Aplicar(SSN, cNombre);
Escuela_secundaria(SSN, HS);
Ubicado(HS, HSciudad);
Aficiones(SSN, hobby);
Ejercicio
Considere la posibilidad de una base de datos que contiene informacin sobre los
cursos tomados por los estudiantes. Los estudiantes tienen un ID nico de estudiante y
nombre; cursos tienen un nmero nico de curso y ttulo, los estudiantes toman un
curso de un ao determinado y reciben una calificacin.
Cul de los siguientes esquemas recomiendan?
a. Tomo(SID, nombre, cursoNum, ttulo, ao, calificacin)
b. Curso(cursoNum, ttulo, ao), Tom(SID, cursoNum, calificacin)
c. Estudiante(SID, nombre), Curso(cursoNum, ttulo), Tomo(SID, cursoNum, ao,
calificacin)
d. Estudiante(SID, nombre), Curso(cursoNum, ttulo), Tomo(nombre, ttulo, ao,
calificacin)
La alternativa correcta es la letra (c), puesto que en el enunciado se dice que existen
estudiantes con un ID nico, que en este caso ser SID y un nombre; los cursos
tienen un ID nico que es cursoNum y un titulo, adems que los estudiantes toman
un curso en un ao determinado ao y reciben una calificacin grado, pero el
atributo cursoNum acta como clave fornea de la tabla Curso con la cual se podr
obtener el titulo del curso y tambin debe poseer una clave primaria para poder
identificar el curso tomado que ser SID.
Descomposicin automtica:
Normalizacin
Proceso que analiza las dependencias entre los atributos de una relacin de tal manera
de combinar los atributos, en entidades y asociaciones menos complejas y ms
pequeas. Consiste en un conjunto de reglas denominadas Formas Normales (FN), las
cuales establecen las propiedades que deben cumplir los datos para alcanzar una
representacin normalizada. En este paso se toma cada relacin, se convierte en una
entidad (relacin o tabla) no normalizada y se aplican las reglas definidas para 1FN,
2FN, 3FN, Boyce Codd y 4FN.
Formas normales
La siguiente imagen muestra los tres principales niveles que se utilizan en el diseo de
esquemas de bases de datos.
Ejemplo
Se dice que una tabla est encuentra en primera forma normal (1FN) si y solo si cada
uno de los campos contiene un nico valor para un registro determinado. Supongamos
que deseamos realizar una tabla para guardar los cursos que estn realizando los
estudiantes de informtica de la USM, podramos considerar el siguiente diseo.
Cdigo123NombrePatriciaMargaritaJoaoCursosEstructura de datosBases de
datos, Teora de sistemasEstructura de datos, Bases de datos
Se puede observar que el registro 1 cumple con la primera forma normal, puesto que
cada campo cumple con la condicin de tener solo un dato, pero esta condicin no se
cumple con el registro 2 y 3, en el campo de Cursos, ya que en ambos existen dos
datos. La solucin a este problema es crear dos tablas del siguiente modo.
Tabla 1
Cdigo123NombrePatriciaMargaritaJoao
Tabla 2
Cdigo12233CursosEstructura de datosBases de datosTeora de
sistemasEstructura de datosBases de datos
Como se puede comprobar, ahora todos los registros de las dos tablas cumplen con la
condicin de tener en todos sus campos un solo dato, por lo tanto la Tabla 1 y Tabla
Ejemplo
La segunda forma normal compara todos y cada uno de los campos de la tabla con la
clave definida. Si todos los campos dependen directamente de la clave se dice que la
tabla est en segunda forma normal.
Se construye una tabla con los aos que cada profesor ha estado trabajando en cada
departamento de la USM.
Cdigo_profesor12342Cdigo_departamento63236NombreJavierLuisCeciliaN
oraLuisDepartamentoElectrnicaElctricaInformticaElctricaElectrnicaAos
_trabajados3158220
La clave de esta tabla est conformada por el Cdigo_profesor y Cdigo_departamento,
adems se puede decir que est en primera forma normal, por lo que ahora la
transformaremos a segunda forma normal.
El
campo Aos_trabajados si
depende
funcionalmente
de
las
Tabla A
Cdigo_profesor1234NombreJavierLuisCeciliaNora
Tabla B
Cdigo_departamento236DepartamentoInformticaElctricaElectrnica
Tabla C
Cdigo_empleado12342Cdigo_departamento63236Aos_trabajados3158220
Se puede observar que la Tabla A tiene como ndice la clave Cdigo_empleado, Tabla
B tiene
como
clave Cdigo_departamento y
laTabla
C que
tiene
como
clave
Ejemplo
Se dice que una tabla est en tercera forma normal si y solo si los campos de la tabla
dependen nicamente de la clave, dicho en otras palabras los campos de las tablas no
dependen unos de otros. Tomando como referencia el ejemplo de la primera forma
normal, un alumno solo puede tomar un curso a la vez y se desea guardar en que sala
se imparte el curso.
Cdigo123NombrePatriciaMargaritaJoaoCursoEstructura de datosTeora de
sistemasBases de datosSalaABC
Veamos las dependencias de cada campo respecto a la clave:
Curso SQL PostgreSQL
Es por este ltimo punto que se dice que la tabla no est en 3FN, pero a continuacin
se muestra la solucin:
Tabla A
Cdigo123NombrePatriciaMargaritaJoaoCursoEstructura de datosTeora de
sistemasBases de datos
Tabla B
CursoEstructura de datosTeora de sistemasBases de datosSalaABC
Ejemplo
Tenga en cuenta la relacin Tomo(SID, nombre, cursoNum, ttulo). Los estudiantes
tienen el carn de estudiante y un nombre nico, los cursos tienen un nmero nico
curso y ttulo. Cada tupla de la relacin codifica el hecho de que un estudiante dado
tom el curso. Cules son todas las dependencias funcionales para la relacin tom?
a. sID cursoNum
b. sID nombre, cursoNum titulo
c. nombre sID, titulo cursoNum
d. cursoNum sID
La respuesta correcta es la alternativa (b), puesto que un id de estudiante que nico
sID, est asignado a solo un estudiante y un id del curso que es nico cursoNum
tiene asignado un ttulo. Las otras alternativas no son porque, la alternativa (a) dice un
estudiante slo puede tomar un curso, la alternativa (c) dice que los nombres de los
estudiantes y los ttulos de los cursos son nicos y la alternativa (d) dice que los cursos
slo pueden ser tomados por un estudiante.
En caso de almacenar cada cName y HS, para obtener una vez un SSN.
Nota
La flecha ->> significa muchos
Ejemplo 1
Tenga en cuenta la relacin Informacion_estudiante(SID, dormitorio, cursoNum). Los
estudiantes suelen vivir en varios dormitorios y tomar muchos cursos en la universidad.
Supongamos que los datos no capta en que dormitorio(s) un estudiante estaba en la
hora de tomar un curso especfico, es decir, todas las combinaciones de cursos
dormitorio se registran para cada estudiante. Cules son todas las dependencias para
la relacin Informacion_estudiante?
a. sID->>dormitorio
b. sID->>cursoNum
c. sID->>dormitorio, sID->>cursoNum
d. sID->>dormitorio, sID->>cursoNum, dormitorio->>cursoNum
La alternativa correcta es (c), puesto que para un estudiante hay muchos dormitorios y
un estudiante puede tomar muchos cursos. La alternativa (a) y (b) ambos omiten una
dependencia, la alternativa (d) dice que todos los estudiantes de cada dormitorio toman
el mismo conjunto de cursos.
Ejemplo 2
Una tabla est en cuarta forma normal si y slo si para cualquier combinacin clavecampo no existen valores duplicados.
Geometra
FiguraCuadradoCuadradoCuadradoCrculoCrculoCrculoColorRojoAzulAzul
BlancoAzulAzulTamaoGrandeGrandeMedianoMedianoPequeoMediano
Vamos a comparar el atributo clave Figura con Tamao, se puede notar que Cuadrado
Grande est repetido; de igual manera Crculo Azul, entre otros registros. Son estas
repeticiones que se deben evitar para tener una tabla en 4FN.
La solucin a la tabla anterior es la siguiente:
Tamao
FiguraCuadradoCuadradoCrculoCrculoTamaoGrandeMedianoMedianoPequ
e o
Color
FiguraCuadradoCuadradoCrculoCrculoColorRojoAzulBlancoAzul
R.AR.B
Por
ejemplo
en
la
relacin
R(Nif,
Nombre,
Direccin),
los
Ejemplo 1:
Estudiante(SSN, sNombre, direccin, HScodigo, HSnombre, HSciudad, GPA, prioridad)
Aplicar(SSN, cNombre, estado, fecha, principal)
Supongamos que la prioridad es determinada por GPA
t,uEstudiante
t.GPA=u.GPAt.priority=u.priority
GPAprioridad
t,uR
t.A=u.At.B=u.B
AB
t,uR
t.[A1,...,An]=u.[A1,...,An]=>t.[B1,...,Bn]=u.[B1,...,Bn]
A1,A2,...,AnB1,B2,...,Bn
AB
Ejemplo 2
Considere la posibilidad de una relacin R (A, B, C, D, E) con dependencias funcionales:
A,BC
C,DE.
Supongamos que hay un mximo de 3 valores diferentes para cada uno de A, B y D.
Cul es el nmero mximo de valores diferentes para la E?
a. 27
b. 9
c. 3
d. 81
La alternativa correcta es (a), puesto que hay a lo sumo 3 * 3 = 9 combinaciones de
valores de A, B, as que por A, B -> C como mximo 9 valores diferentes para C con un
mximo de 3 valores diferentes para D, por C,D -> E hay en la mayora de 9 * 3 = 27
valores diferentes para E.
Las dependencias funcionales para las tablas son:
Student(SSN, sNombre, direccin, HScodigo, HSnombre, HSciudad, GPA, prioridad)
SSNsNombre
SSNdireccin
HScodigoHSnombre,HSciudad
Curso SQL PostgreSQL
HSnombre,HSciudadHScodigo
SSNGPA
GPAprioridad
SSNprioridad
Apply(SSN, cNombre, estado, fecha, principal)
cNombrefecha
SSN,cNombreprincipal
SSNestado
Ejemplo 3
Para la relacin Aplicar(SSN, cNombre, estado, fecha, principal), lo que en el mundo real
es capturado por restriccin SSN,fecha -> cNombre?
a. Un estudiante slo puede aplicar a un colegio.
b. Un estudiante puede aplicar a cada colegio una sola vez.
c. Un estudiante debe aplicar a todos los colegios en la misma fecha.
d. Toda solicitud de un estudiante a un colegio especfico debe estar en la misma
fecha.
La alternativa correcta es (d), puesto que cualquiera de las dos tuplas con el mismo
SSN-cNombre combinacin tambin deben tener la misma fecha. As que si un
estudiante (SSN) se aplica a una universidad (cNombre) ms de una vez, deben estar en
la misma fecha.
ABBA
Dependencia funcional no Trivial
ABBA
ABAB=
Regla de la divisin
AB1,B2,,Bn
AB1AB2
A1,A2,,AnB
A1BA2B
No se puede realizar una divisin a la izquierda
AB1
AB2
AB
ABn
AB1,B2,,Bn
ABBA
ABentoncesAAB
ABentoncesAAB
Regla transitiva
ABBAthenAC
Cierre de atributos
Curso SQL PostgreSQL
Ejemplo 4
Un ejemplo de cierre de atributos es:
Estudiante(SSN, sNombre, direccin, HScodigo, HSnombre, HSciudad, GPA, prioridad)
Clausura y llaves
Ejemplo 5
Tenga en cuenta la relacin R (A, B, C, D, E) y supongamos que tenemos las
dependencias funcionales:
ABC
AED
DB
Ejemplo 6
Consideremos la relacin R (A, B, C, D, E) y el conjunto de dependencias funcionales S1
= {AB
C, AE D, D B}.
B}
S2 = {ABC D, D B}
S2 = {ADE BC}
La alternativa correcta es (c), puesto que el uso de las FDs en S1: {AD}+ = {ABCD}; {AE}+
= {ABCDE}; {ABC}+ = {ABC}; {D}+ = {B}; {ADE}+ = {ABCDE}
Ejemplo
El atributo idCliente de la relacin Cliente es suficiente para distinguir una fila de
un Cliente de las otras. As, idCliente es una superclave. Anlogamente, la combinacin
de nombre y idCliente es una superclave del conjunto de relacin Cliente. El
atributonombre de cliente no es una superclave, porque varias personas podran tener
el mismo nombre.
El concepto de una superclave no es suficiente para lo que aqu se propone, ya que,
como se ha visto, una superclave puede contener atributos innecesarios. Si K es una
superclave, entonces tambin lo es cualquier superconjunto de K. A menudo interesan
las superclaves tales que los subconjuntos propios de ellas no son superclave.
Tales superclaves mnimas se llaman claves candidatas.
Ejemplo
Es posible que conjuntos distintos de atributos pudieran servir como clave candidata.
Supngase que una combinacin de nombre ydireccin es suficiente para distinguir
entre
los
miembros
del
conjunto
de
calle} son
puedan
la
relacin Cliente.
claves
distinguir
candidatas.
las
tuplas
Entonces,
los
Aunque
los
de Cliente,
su
combinacin no forma una clave candidata, ya que el atributo idCliente por s solo es
una clave candidata.
Clave primaria: Una vez que se elige cual de los atributos de la clave candidata
ser el que permitir identificar cada registro en una tabla, dicho atributo se
pasa a llamar llave primaria. Se puede decir que la clave primaria es una clave
candidata, elegida por el diseador de la base de datos, para identificar
unvocamente las tuplas.
Nota
Otro concepto que se utilizar es el de dependencia funcional(DF) que se puede repasar en
la Leccin16
Definicin
Un esquema de relacin R est en FNBC si, para todas las dependencias funcionales de
la forma A->B, donde A y B son subconjuntos de R, se cumplen las siguientes
condiciones:
Un diseo de base de datos est en FNBC si cada miembro del conjunto de esquemas
de relacin que constituye el diseo est en FNBC.
Vale la pena sealar que la definicin FNBC es conceptualmente ms simple que la
definicin anterior de la 3FN, ya que no hace referencias explcitas a la primera y
segunda formas normales como tales, ni al concepto de dependencia transitiva.
Adems, aunque (como ya indicamos) la FNBC es estrictamente ms slida que la 3FN,
se sigue dando el caso que cualquier relacin dada puede descomponerse sin prdida
en una coleccin equivalente de relaciones FNBC.
que
vamos
seguir
es
buscar
un
A1,A2,...,An no
DF
es una
que se muestra a continuacin ilustra cmo los atributos se dividen en dos esquemas
de relacin que se superponen. Uno es de todos los atributos involucrados en la
violacin de DF, y el otro es el lado izquierdo de la DF adems de todos los atributos
que no participan en la DF, es decir, todos los atributos excepto los Bs que no son As.
Ejemplo 1
Pelcula:
ttulo
| ao | duracin | gnero |
director
| actor
--------------+------+----------+--------+-----------------+------------Forrest Gump | 1994 |
142
| Drama | Robert Zemeckis | Tom Hanks
Forrest Gump | 1994 |
142
| Drama | Robert Zemeckis | Robin Wright
Forrest Gump | 1994 |
142
| Drama | Robert Zemeckis | Gary Sinise
The Godfather | 1972 |
175
| Crime | Mario Puzo
| Marlon Brando
Matrix
| 1999 |
136
| Action | Wachowski
| Keanu Reeves
Matrix
| 1999 |
136
| Action | Wachowski
| Laurence
Fishburne
La Relacin Pelculas no es en FNBC. Para ver por qu, primero tenemos que determinar
qu conjuntos de atributos son claves. Nuestra hiptesis ser que {ttulo, ao,
actor} son en conjunto una clave, para demostrar que es una clave en primer lugar,
tenemos que verificar que identifica inequvocamente una tupla. Para ello supongamos
que dos tuplas tienen igual valor en estos tres atributos:{ttulo, ao, actor}. Al ser la
misma pelcula, los otros atributos {duracin, gnero, director} sern iguales tambin.
As, dos tuplas diferentes no pueden concordar en {ttulo, ao, actor} pues en realidad
sera la misma tupla.
Ahora,
debemos
ao,
actor} determina funcionalmente a todos los dems atributos. Primero se observa que el
ttulo y el ao no determinan a actor, porque muchas pelculas tienen ms de un actor.
Por lo tanto, {ttulo, ao} no es una clave. {ao, actor} no es una clave, porque
podramos tener un actor en dos pelculas en el mismo ao, por lo tanto: actor ao -
> ttulo no es un DF. Asimismo, sostenemos que {ttulo, actor} no es una clave,
porque dos pelculas con el mismo ttulo, realizada en diferentes aos, de vez en
cuando tienen un actor en comn.
Como {ttulo, ao, actor} es una clave, cualquier conjunto de atributos que contienen
estos tres es una superclave. Los mismos argumentos anteriores se pueden utilizar
para explicar por qu no existe un conjunto de atributos que no incluya a los tres
atributos{ttulo, ao, actor} que pudiera ser una superclave. Por lo tanto, afirmamos
que {ttulo, ao, actor} es la nica clave para Pelculas.
Sin embargo, tenga en cuenta:
Ejemplo 2
Se tiene un esquema de relacin y sus respectivas dependencias funcionales:
Ejemplo 3
Clases:
ID | asignatura | profesor
----+------------+---------121 | Lenguaje
| Paul
121 | Matemticas| David
345 | Lenguaje
| Paul
567 | Matemticas| Robert
567 | Lenguaje
| Julia
563 | Matemticas| Robert
La tabla est en 3FN pues no posee dependencias transitivas, pero no est en forma de
Boyce - Codd, ya que (ID, asignatura)->profesor y profesor->asignatura.
En este caso la redundancia ocurre por mala seleccin de clave. La redundancia de la
asignatura es completamente evitable. La solucin sera:
ID | profesor
----+---------121 | Paul
121 | David
345 | Paul
567 | Robert
567 | Julia
563 | Robert
asignatura | profesor
-----------+---------Lenguaje
| Paul
Matemticas| David
Matemticas| Robert
Lenguaje
| Julia
En las formas de Boyce-Codd hay que tener cuidado al descomponer ya que se podra
perder informacin por una mala descomposicin.
Ejemplo
Suponga que se tiene informacin acerca de nombres de cursos, profesores y textos. La
tupla indica que dicho curso puede ser enseado por cualquiera de los profesores
descritos y que utiliza como referencias todos los textos especificados. Para un curso
dado, puede existir cualquier nmero de profesores y cualquier cantidad de textos
correspondientes. Los profesores y los textos son independientes entre s; es decir,
independientemente de quin imparta el curso, se utilizan los mismos textos.
curso
| profesor | texto
---------------+----------+---------------------------Base de datos | Ullman | A First Course in Database
Base de datos
Base de datos
Base de datos
Programacin
Programacin
Programacin
|
|
|
|
|
|
Ullman
Widom
Widom
Ullman
Ullman
Ullman
|
|
|
|
|
|
Se puede observar que el ejemplo involucra una buena cantidad de redundancia, la cual
conduce a algunas anomalas de actualizacin. Por ejemplo, para agregar la
informacin que el curso de Base de datos puede ser impartido por un nuevo profesor,
llamado Hetland, es necesario insertar dos nuevas tuplas; una para cada uno de los
textos.
curso
| profesor | texto
---------------+----------+---------------------------Base de datos | Ullman | A First Course in Database
Base de datos | Ullman | Database System Concepts
Base de datos | Widom
| A First Course in Database
Base de datos | Widom
| Database System Concepts
Base de datos | Hetland | A First Course in Database
Base de datos | Hetland | Database System Concepts
Programacin
| Ullman | Rapid GUI Programming
Programacin
| Ullman | Learning Python
Programacin
| Ullman | Python Algorithms
Los problemas en cuestin son generados por el hecho que los profesores y los textos
son completamente independientes entre s.
La existencia de relaciones con la problemtica de la Forma Normal de Boyce-Codd
(FNBC) como la del ejemplo llevaron a presentar la nocin de las dependencias
multivaluadas.
Las dependencias multivaluadas son una generalizacin de las dependencias
funcionales, en el sentido de que toda dependencia funcional(DF) es una dependencia
multivaluada (DMV), aunque lo opuesto no es cierto (es decir, existen DMVs que no son
DFs).
Definicin formal
Sea R una relacin y sean A, B y C subconjuntos de los atributos de R. Entonces decimos
que B es multidependiente de A, si y solamente si en todo valor vlido posible de R, el
conjunto de valores B que coinciden con un determinado par (valor A, valor C) depende
slo del valor de A y es independiente del valor de C.
Definicin
Una relacin est en 4FN si y slo si, en cada dependencia multivaluada A->>B no trivial, A es clave candidata. Una dependencia multivaluada A->->B es
Es otras palabras una relacin est en 4FN si esta en Tercera Forma Normal o en FNBC y
no posee dependencias multivaluadas no triviales. Como se mencion, una relacin
Curso SQL PostgreSQL
Ejemplo 1
Consideremos nuevamente el ejemplo anterior de cursos, profesores y textos. Se
consigue una mejora si se descompusiera en sus dos proyecciones: Profesores
(curso,profesor) y Textos (curso,texto).
Profesores:
curso
| profesor
---------------+---------Base de datos | Ullman
Base de datos | Widom
Programacin
| Ullman
Textos:
curso
| texto
---------------+----------------------------Base de datos | A First Course in Database
Base de datos | Database System Concepts
Programacin
| Rapid GUI Programming
Programacin
| Learning Python
Programacin
| Python Algorithms
Para agregar la informacin que el curso de Base de datos puede ser impartido por un
nuevo profesor, slo tenemos que insertar una tupla en la relacin Profesores:
Profesores:
curso
| profesor
---------------+---------Base de datos | Ullman
Base de datos | Widom
Base de datos | Hetland
Programacin
| Ullman
Ejemplo 2
Se tiene una relacin entre estudiantes, ramo y deporte. Los estudiantes pueden
inscribirse en varios ramos y participar en diversos deportes. Esto quiere decir que el
atributo sid no ser nico, de esta forma la nica clave candidata posible es la
combinacin de los atributos (sid, ramo, deporte). El estudiante 1 tiene los ramos fsica
y programacin, participa en natacin y tenis. El estudiante 2 slo tiene el ramo
matemticas y participa en voleibol.
sid |
ramo
| deporte
----+--------------+-----------1
|
fsica
| natacin
1
| programacin | natacin
1
|
fsica
| tenis
1
| programacin | tenis
2
| matemticas | voleibol
La relacin entre sid y ramo no es una dependencia funcional porque los estudiantes
pueden tener distintos ramos. Un valor nico de sid puede poseer muchos valores de
ramo. Esto tambin se aplica a la relacin entre sid y deporte.
Se puede notar entonces que tal dependencia por atributos es una dependencia
multivaluada. Se aprecia la redundancia en el ejemplo pues el estudiante 1 tiene cuatros
registros. Cada uno de los cuales muestra uno de sus ramos junto con uno de sus
deportes. Si los datos se almacenaran con menos filas: si hubiera slo dos tuplas, uno
para fsica y natacin y uno para programacin y tenis, las implicaciones seran
engaosas. Parecera que el estudiante 1 slo nad cuando tena fsica como ramo y
jug tenis slo cuando tena programacin como ramo. Esa interpretacin no es lgica.
Sus ramos y sus deportes son independientes entre s. Para prevenir tales engaosas
conclusiones se almacenan todas las combinaciones de ramos y deportes.
Si el estudiante 1 decide que quiere inscribirse en ftbol, se deben agregar dos tuplas
con el fin de mantener la consistencia en los datos, se debe agregar una fila para cada
uno de sus ramos, como en se muestra a continuacin:
sid |
ramo
| deporte
----+--------------+-----------1
|
fsica
| ftbol
1
| programacin | ftbol
Curso SQL PostgreSQL
1
1
1
1
2
|
fsica
| natacin
| programacin | natacin
|
fsica
| tenis
| programacin | tenis
| matemticas | voleibol
Esta relacin est en FNBC (2FN porque todo es clave primaria; 3FN porque no tiene
dependencias transitivas; y FNBC porque no tiene determinantes que no son claves). A
pesar de esto se aprecia esta anomala de actualizacin, pues hay que hacer
demasiadas actualizaciones para realizar un cambio en los datos.
Lo mismo ocurre si un estudiante se desea inscribir un nuevo ramo. Tambin existe
anomala si un estudiante des-inscribe un ramo pues se deben eliminar cada uno de los
registros que contienen tal materia. Si participa en cuatro deportes, habr cuatro tuplas
que contengan el ramo que ha dejado y debern borrarse las cuatro tuplas.
Para evitar tales anomalas se construyen dos relaciones, donde cada una almacena
datos para solamente uno de los atributos multivaluados. Las relaciones resultantes no
tienen anomalas:
Ramos:
sid | ramo
----+------------1
| fsica
1
| programacin
2
| matemticas
Deportes:
sid | deporte
----+---------1
| ftbol
1
| natacin
1
| tenis
2
| voleibol
A partir de estas observaciones, se define la 4FN: Una relacin est en 4FN si est en
FNBC y no tiene dependencias multivaluadas.
Ejemplo 3
Se tiene una tabla de Agenda con atributos multivaluados:
Agenda(nombre, telfono, correo)
Se buscan las claves y las dependencias. Las claves candidatas deben identificar de
forma unvoca cada tupla. De modo los tres atributos deben formar la clave candidata.
Pero las dependencias que se tienen son:
nombre ->-> telfono
nombre ->-> correo
Y nombre no es clave candidata de esta relacin, por lo que se debe separar esta
relacin en 2 relaciones:
Telfonos(nombre,telfono)
Correos(nombre,correo)
Ahora en las dos relaciones se cumple la 4FN.
Nota
De manera general una relacin se separa en tantas relaciones como atributos multivaluados
tenga.
Nota
Existen variadas herramientas a la hora de graficar diagramas UML. Algunas de
ellas son: DIA, StarUML o Umbrello entre otras.
Existen 5 conceptos claves en UML:
1. Clases
2. Asociaciones
3. Clases de asociacin
4. Subclases
5. Composiciones y agregaciones
Clases
Las clases se componen de: nombre, atributos y mtodos. Para quienes hayan
experimentado alguna vez con la programacin orientada a objetos probablemente se
sientan algo familiarizados.
Curso SQL PostgreSQL
Ejemplo 1
Retomemos el caso de los Estudiantes y Establecimientos Educacionales. Dibujemos
ambas relaciones como clases en UML:
Asociaciones
Las Asociaciones corresponden a como se relacionan 2 clases.
Ejemplo 2
El ejemplo 1 termin con 2 clases separadas, es decir, Estudiantes y Establecimientos
Educacionales. Sin embargo, y como ya se ha visto en ejemplos de Leccins anteriores,
los estudiantes postulan a estos establecimientos, por lo tanto la relacin es postular:
Multiplicidad
Es necesario determinar cuntas veces un objeto de una clase puede relacionarse con
objetos de otra clase. Supongamos que se han creado las clases C1 y C2, la
multiplicidad apunta a:
"Cada objeto de la clase C1 est asociado (a travs de la relacin A)a al
menos
'm' y a lo ms 'n' objetos de la clase C2"
Ejemplo 3
Supongamos que cada Estudiante debe postular a lo menos a 1 Establecimientos y a lo
ms a 3. Por otro lado, cada establecimiento puede recibir a lo ms 50000
postulaciones.
Ejemplo 4
Con el fin de diversificar y bajo el siguiente contexto, supongamos que tenemos
personas que realizan giros en bancos. Dependiendo del tipo de cuenta, supongamos
que existe una cuenta que permite a lo ms 3 giros por mes. Por su parte, el banco no
tiene restriccin de giros que puede recibir.
Clase de asociacin
Esto se produce cuando la multiplicidad de las relaciones impide definir con exactitud
qu objeto de la clase C1 est asociado a qu objeto de la clase C2.
Ejemplo 5
Supongamos que tenemos a varios Estudiantes que desean postular a diferentes
Establecimientos Educacionales.
Nota
Nota
La clase de asociacin se puede eliminar cuando hay multiplicidad (* - 1..1) o (* - 0..1). De
hecho est pensada para dejar en claro que la asociacin entre objetos en caso de que la
multiplicidad sea m, n o * en ambos lados de la relacin.
Auto asociaciones
Corresponden a asociaciones entre una clase y si misma.
Ejemplo 6
Supongamos que se desea modelar en UML a la Universidad Tcnica Federico Santa
Mara
(UCHILE),
su
Casa
Central
Campus.
Supongamos
que
existen
los
Subclases
Las clases se dividen:
1. Superclase/ Clase Padre: De carcter general, contiene informacin que
heredarn las diversas subclases.
2. Subclases/ Clases Hijas: De carcter especfico, contiene informacin extra a la
que hereda de la superclase.
Estos conceptos nacen de la programacin orientada a objetos.
Ejemplo 7
Supongamos que dentro de la clase Estudiantes, se desea diferenciar a los estudiantes
extranjeros de los estudiantes nacionales. Se podra pensar en crear dos clases nuevas,
llamadas Estudiantes Nacionales y Estudiantes Extranjeros:
Sin embargo, hay atributos que se repiten en ambas, ellos son: sID, sName, Average. Es
por ello que se pueden separar en una superclase llamada Estudiante (la misma
utilizada en las otras Leccins), y crear 2 subclases llamadas Extranjeros y Nacionales.
Como se puede observar, los atributos mencionados son heredados por ambas
subclases. Ambas adems agregan informacin ms especfica, como lo son
el pas y pasaporte en el caso de los Extranjeros; la regin y RUN en el caso de
los Nacionales. Esta tcnica es muy til para la reutilizacin.
Nota
Las Subclases heredan propiedades de las superclases / clase padre, es decir no solo
atributos, sino que tambin asociaciones u operaciones estn disponibles en las subclases /
clases hijas.
Composiciones y Agregaciones
Ambas corresponden a la forma de representar que un objeto tiene como contenido a
otro, esto quiere decir que un objeto de un tipo, puede contener a otro.
Ejemplo 8
Supongamos que un objeto de tipo ciudad tiene una lista de objetos de tipo aeropuerto,
esto quiere decir, que una ciudad, tiene un nmero de aeropuertos.
Nota
Hay que destacar, que la cardinalidad del extremo que lleva el rombo, es siempre uno.
Otro ejemplo puede ser que un medio de transporte tiene varias ruedas.
Nos est diciendo que los objetos rueda forman parte del objeto medio de transporte.
Pero, su ciclo de vida no est atado al del objeto medio de transporte. Es decir, si el
automvil se destruye las ruedas pueden seguir existiendo independientemente.
En la misma linea, la composicin, es una relacin ms fuerte de los objetos, as como
la agregacin, es el hecho de que un objeto posea a otro, la composicin es cuando la
relacin entre ambos objetos es tal, que el primero no tiene sentido solo, y el segundo,
necesita definir al primero para ampliar su significado
Ejemplo 9
El avin tiene sentido por si solo. Est claro que est compuesto de 2 alas, esta relacin
es de mucha fuerza, mucho ms que el caso de los aeropuertos, y est claro, que un
avin siempre tendr sus dos alas, y estas siempre sern del mismo avin.
La composicin corresponde a aquellos objetos de los que depende un objeto para que
este llegue a funcionar, en ste caso el avin no puede funcionar sin las 2 alas.
En siguiente imagen anterior se observa que el lenguaje UML, puede ser traducido en
relaciones (o tablas) de una base de datos.
Clases
Cada clase se convierte en una relacin (o tabla) con su clave primaria
Estudiante(sID,sNombre,GPA)
Universidad(cNombre,estado,inscripcin)
Asociaciones
Relacin con la clave de cada lado.
Se obtendrn las mismas relaciones del ejemplo anterior, pero se agregar una nueva
relacin con las claves primarias de ambas clases.
Aplicado(sID,cNombre)
Claves para las relaciones de asociacin
Depende de la multiplicidad
Multiplicidad 1-1
Multiplicidad 1-n
Por ejemplo:
Ahora al tener una multiplicidad 1-n, se debe agregar la clave primaria Atr1_clase1 de
la Clase1 a la Clase2(que es la que posee la multiplicidad muchos), quedando como
clave fornea de la Clase2.
Finalmente, las relaciones quedan de la siguiente manera:
Clase1(Atr1_clase1,Atr2_clase1)
Clase2(Atr1_clase2,Atr2_clase2,Atr1_clase1)
Si la relacin hubiese sido de 0..1-n, el atributo Atr1_clase1 sera NULL.
Ahora se mostrar otro ejemplo:
Estudiante(sID,sNombre,GPA,cNombre)
Universidad(cNombre,estado,inscripcin)
Al poseer este tipo de multiplicidad (1-n), se agrega a la clase Estudiante (muchos) la
clave primaria cNombrede la clase Universidad.
Multiplicidad n-m
Dicha
tabla
tendr
al
menos
dos
columnas,
cada
una
Ejemplo
Supongamos que tenemos 0..2 en el lado derecho, por lo que los estudiantes pueden
solicitar hasta un mximo de 2 universidades. Existe todava una forma de plegarse
la
relacin
de
asociacin
en
este
caso,
que
tenemos
una
relacin
independiente Aplicado?
Clase de asociacin
Las clases de asociacin permiten aadir atributos, operaciones y otras caractersticas a
las asociaciones.
Estudiante(sID,sNombre,GPA)
Universidad(cNombre,estado,inscripcin)
Aplicado(sID,cNombre,Fecha,Decisin)
Otro ejemplo que detalla ms claramente las clases de asociacin
Curso SQL PostgreSQL
El diagrama permite apreciar que una Persona puede trabajar para una sola Compaa.
Necesitamos conservar la informacin sobre el perodo de tiempo que trabaja cada
empleado para cada Compaa.
Para lograrlo, aadimos un atributo Perodo a la asociacin Empleo.
Subclases
Si la clase A hereda de la clase B, entonces B es la superclase de A. A
es subclase de B. Los objetos de una subclase pueden ser usados en las circunstancias
donde son usados los objetos de la superclase correspondiente. Esto se debe al hecho
que los objetos de la subclase comparten el mismo comportamiento que los objetos de
la superclase.
S(K,A)
S1(K,B)
S2(K,C)
2. Las relaciones de las subclases contienen todos los atributos.
S(K,A)
S1(K,A,B)
S2(K,A,C)
3. Una relacin que contiene todos los atributos de la superclase y la subclase.
S(K,A,B,C)
Ejemplo de subclases
Estudiante(sID,sNombre)
Curso SQL PostgreSQL
Est_extranjeros(sID,Pas)
Est_nacionales(sID,Estado,SS#)
AP_Estudiante(sID)
AP_Curso(Curso#,Titulo)
Tom(sID,Curso#,Ao,Nota)
Composicin y Agregacin
Composicin
La composicin es un tipo de relacin esttica, en donde el tiempo de vida del objeto
incluido est condicionado por el tiempo de vida del que lo incluye (el objeto base se
construye a partir del objeto incluido, es decir, es parte/todo).
Ejemplo
Universidad(cNombre,Estado)
Departamento(dNombre,Edificio,cNombre)
Agregacin
La agregacin es un tipo de relacin dinmica, en donde el tiempo de vida del objeto
incluido es independiente del que lo incluye (el objeto base utiliza al incluido para su
funcionamiento).
Ejemplo
Las relaciones son de la misma manera que el ejemplo anterior pero al poseer una
diferente multiplicidad el valor del atributocNombre de la clase Departamento, puede
tmar el valor NULL.
Nota
El software utilizado en esta Leccin para realizar los diagramas es Umbrello.
Restricciones
Imponen restricciones de datos permitidos, ms all de aquellos impuestos por la
estructura y los tipos de datos en la BD.
Supongamos que estamos bajo el contexto del sistema de seleccin de estudiantes,
visto en algunas Leccins anteriores:
Ejemplo 1
Para que el estudiante sea aceptado, su promedio debe ser mayor a 50:
Average > 50
Ejemplo 2
El establecimiento X no puede tener ms de 45000 alumnos:
Enrollment < 45000
Ejemplo 3
El criterio para la decisin es Verdadero, Falso o NULL:
Decisin: 'T', 'F', **NULL**
triggers
La lgica del trigger es:
"Cuando pasa algo, se chequea una condicin.
Si es cierta se realiza una accin"
Ejemplo 4
Si la capacidad de un Establecimiento X, sobrepasa los 30000, el sistema debe
comenzar a rechazar a los nuevos postulantes:
Enrollment > 30000 -> rechazar nuevos postulantes
Ejemplo 5
Si un alumno tiene promedio mayor a 49.5, queda aceptado:
Student with
restricciones.
Ningn
sistema
implementado
soporta
todas
las
Es decir que cada trigger tiene un nombre que es activado por eventos (antes, durante
o despus). Se toman ciertas variables y por cada fila se revisa una condicin se realiza
una accin.
Contexto
En esta Leccin se utilizar el ejemplo del sistema de Postulacin de Estudiantes a
Establecimientos Educacionales:
Student(sID, sName, Average);
College(cName, State, Enrollment);
Apply(sID, cName, Major, Desicion);
Ejemplo 1
Creemos una tabla de estudiantes, en la cual no se permita tener el campo Average
vaco.
CREATE TABLE Student (sID SERIAL, sName VARCHAR(50)
Average INT NOT NULL, PRIMARY KEY (sID) );
Ejemplo 2
Si probamos utilizando comandos de actualizacin (UPDATE)
Digamos que el promedio de Amy es incorrecto, pero an no se sabe cual es, por lo
que la persona encargada de realizar este trabajo (que no sabe la restriccin que tiene
la tabla), decide poner un valor NULL:
UPDATE Student SET Average = null where sid = 1;
Ejemplo 3
Creemos una tabla de estudiantes (digamos estudiantes2 para no provocar
confusiones), en la cual se declare explcitamente su clave primaria.
CREATE TABLE Student2 (sID INT PRIMARY KEY, sName VARCHAR(50),
Average INT);
Con las primeras dos inserciones no hay problemas, no obstante con la tercera, aparece
el siguiente error:
ERROR: duplicate key value violates unique constraint "student2_pkey"
DETAIL: Key (sid)=(123) already exists.
Esto ocurre dado que, se defini sID como la clave primaria de la tabla.
Ejemplo 4
Similar al caso del Ejemplo 2, si se desea actualizar el valor del atributo sID,
UPDATE Student2 SET sID = 123 where sid = 234;
Cabe destacar que si se desea actualizar un sID que no existe por 123, no aparece
dicho error, pero, no hay actualizacin:
UPDATE Student2 SET sID = 123 where sid = 999;
La salida es:
UPDATE 0
Ejemplo 5
Un caso curioso se da cuando se desea realizar varios cambios a la vez. El estado actual
de la tabla Student2 es:
sid | sname | average
----+-------+-------123 | Amy
| 60
234 | Tim
| 70
La salida es:
UPDATE 2
Es decir no hay problemas. Pero Qu pasa si se desea sumar 111 en lugar de restar?
UPDATE Student2 SET sID = sID + 111;
La salida es:
ERROR: duplicate key value violates unique constraint "student2_pkey"
DETAIL: Key (sid)=(123) already exists.
Ejemplo 6
Por lo general, en SQL slo se permite una clave primaria (de all el nombre), al igual
que varias de sus implementaciones. Esta clave permite realizar un orden rpido y
eficiente.
Nota
Es posible definir ms de un atributo como clave primaria propiamente tal, pero se reserva
el mtodo para el prximo ejemplo.
Supongamos que se desea realizar la tabla Student otra vez, debido a fallas. En lugar de
DROP TABLE Student;
crear otra tabla, se utiliza el comando: En esta nueva tabla se desea que las claves
primarias sean sID y sName.
CREATE TABLE Student (sID INT PRIMARY KEY, sName VARCHAR(50) PRIMARY KEY,
Average INT);
Una forma de evitar este error es utilizar UNIQUE en lugar de PRIMARY KEY, para el
atributo sName.
CREATE TABLE Student (sID INT PRIMARY KEY, sName VARCHAR(50) UNIQUE,
Average INT);
Al utilizar UNIQUE se permite tener incluso todos los atributos, que no son clave
primaria, como clave (no primaria). UNIQUE funciona comparando slo los valores de la
columna en cuestin. Si se repite un valor, a pesar no haber claves conflictos en la clave
primaria, habr error de todos modos:
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
Student
Student
Student
Student
VALUES
VALUES
VALUES
VALUES
(123,'Amy',
(234,'Tim',
(345,'Bob',
(456,'Amy',
60);
70);
55);
90);
Para las primeras 3 inserciones no hay problemas. Si bien en la cuarta no hay conflicto
con la clave primaria:
ERROR: duplicate key value violates unique constraint "student_sname_pkey"
DETAIL: Key (sname)=(Amy) already exists.
Es decir que se comparan slo los valores de la columna/atributo sName. Como Amy
ya est, aparece el error de arriba.
Ejemplo 7
Como se dijo en la nota del ejemplo anterior, es posible definir un grupo de atributos
como clave primaria.
Para variar un poco las cosas, utilicemos la tabla College.
Supongamos que se desea crear la tabla College con 2 atributos como clave
primaria: cName y State.
Por el ejemplo 6 ya sabemos que algo como lo siguiente, no funcionar:
CREATE TABLE College (cName VARCHAR(50) PRIMARY KEY,
State VARCHAR (30) PRIMARY KEY, Enrollment INT);
Pues con UNIQUE en la columna State, no se permitira CA dos veces. No obstante al ser
un clave primaria compuesta, si se permite. En este caso una violacin a la restriccin,
sera el caso de 2 filas que compartan los mismos valores en ambos atributos, es decir
encName y State
Nota
Para el caso de PostgreSQL, en una atributo declarado como UNIQUE, se permite el mltiple
uso de valores NULL. Por otra parte si e desea utilizar NULL en una clave primaria (PK), no
est permitido.
Ejemplo 8
Si creamos la tabla estudiantes 3, cuya caracterstica principal es verficar que, en las
operaciones de insercin y actualizacin, los promedios estn dentro del valor
permitido:
CREATE TABLE Student3 (sID INT, sName VARCHAR(50),
Average INT CHECK(Average>=0 and Average<=100));
INTO
INTO
INTO
INTO
Student3
Student3
Student3
Student3
VALUES
VALUES
VALUES
VALUES
(123,'Amy', 60);
(234,'Tim', 70);
(345,'Bob', -55);
(456,'Clara', 190);
Con las primeras dos inserciones no hay problemas, pero con la tercera y cuarta, el
siguiente error aparece:
ERROR: new row for relation
"student3_average_check"
"student3"
violates
check
constriaint
Ejemplo 9
Es posible adems, restringir cadenas de caracteres, como el caso del atributo sName.
Supongamos que se desea denegar la entrada o actualizacin de nombres groseros o
sin sentido, limitemos el caso a las cadenas: amY y amy :
DROP TABLE Student3;
CREATE TABLE Student3 (sID INT,
sName VARCHAR(50) CHECK(sName <> 'amY' and sName <> 'amy
Average INT CHECK(Average>=0 and Average<=100));
'),
INTO
INTO
INTO
INTO
Student3
Student3
Student3
Student3
VALUES
VALUES
VALUES
VALUES
(123,'amY', 60);
(234,'amy', 70);
(345,'amy ',55);
(454,'Amy',90);
relation
"student3"
violates
check
constraint
Para las segunda y cuarta inserciones, no existe tal error pues, y como se mencion
dentro de las primeras semanas, el nico caso en que SQL es sensible al uso de
maysculas y minsculas es para cadenas de caracteres que estn dentro de comillas
simples (). por lo tanto amY o amy que son las cadenas restringidas difieren de
Amy y de amy.
Nota
Es sumamente importante que si se desea declarar cadenas de caracteres y que adems se
quieran restringir valores especficos (como ocurre en el Ejemplo 9), el largo permitido no
sea ni demasiado largo, como para tener que restringir cada caso especfico, ya sea: amy,
amy , amy ,... o Amy, Amy ... considerando todas las combinaciones posibles; ni
demasiado corto para tener problemas de insercin con datos reales.
Al igual que en los primeros ejemplos, si se desea actualizar los atributos que cuentan
con el tipo de restriccin de este apartado, con valores que estn fuera de rango o
dentro de las restriccin, se obtendr un error de tipo:
ERROR: new row for relation
"**table**_*atribute*_check"
"**table**"
violates
check
constraint
Donde table se refiere a la relacin en cuestin y atribute al atributo que cuenta con la
restriccin del tipo CHECK.
Es posible, adems utilizar este tipo de restriccin para evitar valores NULL, como se
ver en el siguiente ejemplo.
Ejemplo 10
Supongamos que deseamos creamos la tabla de postulacin Apply, pero que el
atributo desicion, de tipo booleano, no admita valores nulos, utilizando restricciones de
atributo y tupla.
CREATE TABLE Apply (sID INT, cName VARCHAR(50), Major VARCHAR(11),
decision BOOL, CHECK(decision IS NOT NULL));
relation
"apply"
violates
check
constraint
check
constraint
relation
"apply"
violates
Ejemplo 11
Restricciones generales
Si bien son formas de restriccin bastante poderosas, no estn soportadas por casi
ningn sistema actual.
Ejemplo 12
Supongamos una Tabla T de atributo A. Deseamos forzar que este atributo sea llave
de T.
CREATE TABLE T (A INT);
CREATE ASSERTION KEY CHECK ((SELECT COUNT (DISTICT A) FROM T)=
(SELECT COUNT(*) FROM T));
La consulta de arriba busca forzar que por cada fila de la tabla T, el atributo A sea
distinto, lo que dejara a A como clave.
No obstante la funcin assertion no est implementada en PostgreSQL:
CREATE ASSERTION is not yet implemented
secundaria)
en
la
atributos
en
las
otras
tablas,
como
es
el
caso
de sID en
la
si
tenemos
integridad
referencial
de
un
atributo A de
una
el
ejemplo
anterior,
podramos
decir
que
tendramos integridad
referencial de la columna sID de Apply, a la columna sID de Student. Del mismo modo
se
tiene
que
la integridad
referencial de
la
la
Del mismo modo podramos tener un sID 1, lo cual es vlido porque tenemos un
estudiante 1 en la tabla Student, pero si 1 se postulas a la universidad PUC y en la
tabla College no se encuentra PUC, de nuevo se tiene una violacin de la integridad
referencial.
Ejemplo
Consideremos dos tablas:
Dorm(name, address) Student(name, dormName, roommateName)
Supongamos
que
algunos
estudiantes
viven
en
habitaciones
individuales
A es clave fornea
Y de hecho, la integridad referencial se refiere a menudo como restricciones de
claves forneas. E incluso en la sintaxis SQL, veremos que la clave externa se
utiliza el trmino.
INSERT INTO R.
DELETE FROM R.
UPDATE R.A.
UPDATE S.B.
Ejemplo
Considere
las
tablas
Dorm(name,
address)
Student(name,
dormName,
1. Student.dormName a Dorm.name
2. Dorm.name a Student.dormName
3. Student.roommateName a Student.name
Cul de las siguientes modificaciones no pueden causar una violacin de la integridad
referencial?
a. Insertion into Student.
b. Deletion from Student.
c. Update Student.roommateName.
d. Todos ellos pueden causar violaciones.
La alternativa correcta es (d), puesto que al insertar un estudiante puede violar las
restricciones (1) y/o (3). Al eliminar un estudiante se pueden violar las restricciones (2)
y/o (3). Al actualizar un compaero de cuarto puede violar la restriccin (3).
En el estndar SQL y en todas las implementaciones, si tenemos una insercin en la
tabla de referencia o una actualizacin de la tabla de referencia que cause una violacin
a la restriccin de integridad, entonces se genera un error, y que la modificacin no es
permitida, al igual que la violacin de otros tipos de restricciones.
Acciones especiales
DELETE FROM S.
Restrict(default):
SET NULL
CASCADE
UPDATE S.B.
Restrict(default)
SET NULL
CASCADE
Hasta ahora, hemos visto modificaciones a la tabla de referencia, pero tambin tenemos
que preocuparnos acerca de las modificaciones de las tablas de referencia.
Por ejemplo, supongamos que tratamos de eliminar de la tabla College, donde
el cName es UCHILE.
DELETE FROM College WHERE cName='UCHILE';
Pero retorna el siguiente error, puesto que el atributo cName posee una referencia al
atributo sName de la tabla Apply, por lo que es imposible borrar esta tupla (o fila).:
ERROR: update or delete on table "college" violates foreign key constraint
"apply_cname_fkey" on table "apply"
DETAIL: Key (cname)=(UCHILE) is still referenced from table "apply".
Retornando el siguiente error, puesto que el atributo sID de la tabla Student posee una
referencia al atributo sID de la tabla Apply.:
ERROR: update or delete on table "student" violates foreign key constraint
"apply_sid_fkey" on table "apply"
DETAIL: Key (sid)=(2) is still referenced from table "apply".
Para la para la restriccin de sID la integridad referencial que vamos a especificar es que
si un estudiante es eliminado, no vamos a establecer ninguna referencia a valores a
null, y lo hacemos con las palabras clave ON DELETE que nos dice qu hacer cuando
hay una eliminacin de la tabla de referencia, se utiliza la opcin SET NULL.
Para el atributo cName la integridad referencial que vamos a especificar es que si la
universidad se actualiza en la tabla College se utilizar la opcin de cascada. Esto
quiere decir que si se modifica el valor de una tupla del atributo cName en la
tabla College, est tambin se modificar automticamente en la tabla Apply.
Se podra haber especificado dos opciones ms que hubiese sido una opcin de
actualizacin para el sID de estudiante y una opcin para borrar el cName, as que
podran haber sido cuatro en total.
Vamos a generar ahora algunas modificaciones (comenzamos las tablas desde cero):
INSERT INTO Student VALUES(1, 'Tom', 3.4, 1000);
INSERT INTO Student VALUES(2, 'Brad', 3.8, 1500);
INSERT INTO Student VALUES(3, 'Lucy', 3.9, 3600);
INTO
INTO
INTO
INTO
INTO
Apply
Apply
Apply
Apply
Apply
VALUES(1,'UCHILE','CS','Y');
VALUES(2,'PUC','biology','N');
VALUES(1,'PUC','CS','Y');
VALUES(3,'UCHILE','history','Y');
VALUES(3,'UCHILE','CS','Y');
1 | Tom
2 | Brad
(2 rows)
| 3.4 |
| 3.8 |
1000
1500
la
restriccin
que
se
detall
en
la
creacin
de
la
Ejemplo CASCADE
Se desea actualizar el cName de la tabla College el valor de UCHILE por USM.
UPDATE College SET cName='USM' WHERE cName='UCHILE';
UPDATE 1
| USM
(5 rows)
| CS
| Y
Observndose en las tablas College y Apply que se actualiz cName = USM, en ambas
tablas.
A continuacin se mostrarn otras caractersticas que no se han visto en los ejemplos
anteriores:
CREATE TABLE T(A INT, B INT, C INT, PRIMARY
REFERENCES T(A,B) ON DELETE CASCADE);
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
T
T
T
T
T
T
T
T
KEY(A,B), FOREIGN
KEY(B,C)
VALUES(1,1,1);
VALUES(2,1,1);
VALUES(3,2,1);
VALUES(4,3,2);
VALUES(5,4,3);
VALUES(6,5,4);
VALUES(7,6,5);
VALUES(8,7,6);
Este ejemplo es para demostrar la integridad referencial dentro de una sola tabla T.
SELECT * FROM T;
a | b | c
---+---+--1 | 1 | 1
2 | 1 | 1
3 | 2 | 1
4 | 3 | 2
5 | 4 | 3
6 | 5 | 4
7 | 6 | 5
8 | 7 | 6
(8 rows)
Podemos observar que al dar la condicin de borrar A=1, se eliminan todos los dems
valores, esto sucede por la definicin que se dio como clave fornea de B y C en la
creacin de la tabla T.
La integracin referencial es muy comn en las implementaciones de las bases de datos
relacionales. La forma natural de disear un esquema relacional suelen tener valores en
columnas de una tabla que se refieren a los valores de las columnas de otra tabla, y el
establecimiento de restricciones de integridad referencial, este sistema controlar la
base de datos y se asegurar de que se mantenga siempre constante.
Definicin
Un Trigger es una orden que el sistema ejecuta de manera automtica como efecto
secundario de alguna modificacin de la base de datos. Entonces los Triggers siguen en
orden
la
secuencia: evento->condicin->accin.
Se
ejecutan
mediante
los
para
Creacin de un disparo
1. Un Trigger se crea con la sentencia CREATE TRIGGER.
2. Despus de que se crea, el Trigger se encuentra a la espera de que se
produzca el evento de activacin.
3. Cuando el evento se produce desencadena una accin.
Forma general:
(1)CREATE TRIGGER nombreTrigger
(2)BEFORE|AFTER|INSTEAD OF AlgnEvento
ON nombreTabla
(3)WHEN (condicin)
(3)Action
Variables especiales
Existen algunas palabras reservadas, que estn disponibles para ser utilizadas por
Triggers. Algunas de estas variables especiales disponibles son las siguientes:
NEW:
Variable
que
contiene
la
nueva
la
antigua
fila
de
la
tabla
para
las
de
la
tabla
para
las
operaciones INSERT/UPDATE.
OLD:
Variable
que
contiene
fila
operaciones UPDATE/DELETE.
TG_NAME: Variable que contiene el nombre del Trigger que est usando la funcin
actualmente.
TG_RELID: identificador de objeto de la tabla que ha activado el Trigger.
Ejemplo :
Nota
El ejemplo a continuacin es para explicar el funcionamiento de un Trigger, si se desea
probar en postgreSQL se debe crear la base de datos y la tabla Employee, ms adelante se
vern un ejemplo prctico que podr copiarse directamente en la consola.
(1) Se crea el Trigger: con las palabras claves CREATE TRIGGER y el nombre del
Trigger salaryTrigger.
(3) (4) y (5) Camino para la condicin: a la tupla antigua (tupla antes de la
actualizacin) se le asigna el nombre OldTupley la nueva tupla (tupla despus de
la actualizacin), se asigna como NewTuple. En la condicin y la accin, estos
nombres se pueden utilizar como si fueran variables declaradas en la
clusula FROM de una consulta SQL.
(6), La frase FOR EACH ROW, expresa la exigencia de que este Trigger se ejecute
una vez por cada tupla actualizada.
(7) Condicin del Trigger: Se dice que slo se realiza la accin cuando el
nuevo salary es menor que el salary antiguo.
(8) (9) y (10) Accin del Trigger Esta accin es una instruccin SQL de
actualizacin que tiene el efecto de restaurar el salarya lo que era antes de la
actualizacin. Tenga en cuenta que, en principio, cada tupla de Employee se
considera para la actualizacin, pero la clusula WHERE de la lnea (10) garantiza
que slo la tupla actualizada (con el correcto cert) se vern afectados.
Funciones
Existe una forma de separar las acciones y las condiciones de un Trigger. Esto se logra
mediante el uso de funciones. Uno de los motivos de utilizar funciones es mantener la
lgica lejos de la aplicacin, con esto se consigue consistencia entre aplicaciones y
reduccin de funcionalidad duplicada. Adems un acceso predefinido a objetos
restringidos.
SQL es un lenguaje declarativo, pero en ocasiones se requiere de otro tipo de lenguajes.
El manejo de funciones permite utilizar distintos de lenguajes, de manera que se puede
escoger la herramienta adecuada a cada caso. Para efecto de este curso se usar
unlenguaje imperativo, llamado PL/pgSQL (Procedural Language/PostgreSQL Structured
Query Language).
Nota
Un Lenguaje imperativo le ordena a la computadora cmo realizar una Prctica siguiendo
una serie de pasos o instrucciones. La ejecucin de estos comandos se realiza, en la mayor
Ejemplo Prctico 1:
Se crea una base de datos y se instala el lenguaje plpgsql.
postgres=# create database trggr2;
CREATE DATABASE
postgres=# \c trggr2
psql (8.4.11)
Ahora est conectado a la base de datos trggr2.
trggr2=# CREATE PROCEDURAL LANGUAGE plpgsql;
CREATE LANGUAGE
Se define una funcin llamada save_data(), que ser la encargada de llenar los datos, al
final del ejemplo se explica detalladamente su funcionamiento:
CREATE OR REPLACE FUNCTION save_data() RETURNS Trigger AS $save_data$
DECLARE
BEGIN
NEW.square := power(NEW.number,2);
NEW.squareroot := sqrt(NEW.number);
RETURN NEW;
END;
$save_data$ LANGUAGE plpgsql;
PostgreSQL retorna:
CREATE FUNCTION
Ahora
ya
se
puede
definir
el
Trigger
que
llamar
la
PostgreSQL retorna:
CREATE TRIGGER
primer INSERT (number = 4), el Trigger save_data llama a la funcin save_data() una
vez.
El
valor
de
la
variable NEW al
empezar
a
La
Para calcular el cuadrado de un nmero se utiliza la instruccin power, que recibe como
parmetros el nmero que se ingrese y el nmero al cual se eleva. Para calcular la raz
cuadrara de un nmero se utiliza la instruccin sqrt que recibe como parmetro el
nuevo nmero.
Ejemplo Prctico 2:
Para este ejemplo se utiliza la misma relacin numbers creada anteriormente, con los
valores ya insertados. La funcin protect_dataes usada para proteger datos en una
tabla. No se permitir el borrado de filas, pues retorna NULL que, como se vio en
Leccins anteriores, es la inexistencia de valor.
CREATE OR REPLACE FUNCTION protect_data() RETURNS Trigger AS $Tprotect$
DECLARE
BEGIN
RETURN NULL;
END;
$Tprotect$ LANGUAGE plpgsql;
Se intenta eliminar todos los datos de la tabla numbers con la siguiente sentencia:
trggr2=# DELETE FROM numbers;
DELETE 0
Sin
embargo
no
es
posible
borrar
datos
pues
el
Trigger
acciona
la
Ejemplo Prctico 3:
Nuevamente se utiliza la relacin numbers, las funciones y los Triggers ya creados.
La funcin que se ver a continuacin busca evitar errores al calcular la raz cuadrada
de un nmero negativo. Observe que ocurre al intentar insertar el valor -4:
trggr2=# INSERT INTO numbers (number) VALUES (-4);
ERROR: cannot take square root of a negative number
CONTEXTO: PL/pgSQL function "save_data" line 5 at assignment
NEW.squareroot := sqrt(NEW.number);
RETURN NEW;
END IF;
END;
$invalid_root$ LANGUAGE plpgsql;
Esta vez no arroja error pues ingresa al IF que restringe valores negativos, y
simplemente no inserta el valor.
Y si se intenta ingresar un numero positivo, se consigue sin problemas:
trggr2=# INSERT INTO numbers (number) VALUES (5);INSERT 0 1
trggr2=# SELECT * FROM numbers;
number | square | squareroot
--------+--------+-----------4 |
16 |
2
9 |
81 |
3
7 |
49 |
2.64575
5 |
25 |
2.23607
(4 filas)
Existen algunos casos que pueden ser manejados de mejor forma con otras tcnicas:
Los Triggers se deberan escribir con sumo cuidado, dado que un error de un Trigger
detectado en tiempo de ejecucin causa el fallo de la instruccin de insercin, borrado
o actualizacin que inici el Trigger. En el peor de los casos esto podra dar lugar a una
cadena infinita de Triggers. Generalmente, los sistemas de bases de datos limitan la
longitud de las cadenas de Triggers.
Leccin
XXV
Introduccin
Transacciones:
concepto
de transacciones est
identificado
por
dos
acepciones
totalmente
independientes.
Uno, tiene que ver con el acceso concurrente de varios clientes a la base de datos; y el
otro, tiene relacin con tener un sistema resistente a los fallos de sistema.
Primero, veremos como funciona la estructura de los sistemas de bases de datos y la
interaccin con los clientes.
En la siguiente imagen podemos observar que los datos son almacenados en el disco,
quien se comunica con el sistema de gestin de base de datos, o DBMS, controlador de
las interacciones con los datos. A menudo hay software adicional por encima del DBMS;
tal vez un servidor de aplicaciones o servidor web, que luego interactan con los que
Curso SQL PostgreSQL
El
DBMS
debe
mantener
la
integridad
de
los
datos,
haciendo
que
concurrente con
UPDATE College SET enrollment = enrollment + 1000 WHERE cName = 'UCHILE';
En el ejemplo anterior se puede observar que tenemos 2 clientes; uno esta emitiendo
una declaracin que aumenta las matriculas deUCHILE en 500, el segundo cliente, en el
mismo instante, est emitiendo una declaracin que aumenta las matriculas en 1000.
El problema que se genera en este caso es que si el primer cliente modifica el valor de
la matricula de la universidad UCHILE en 500 y ahora el segundo cliente va a modificar
el valor de la matricula, sobre lo que ya modific el primer cliente. A la base de datos se
le modific dos veces el valor de la matricula.
Supongamos que el valor de la matricula est en 3000 y estas dos sentencias anteriores
se ejecutan al mismo tiempo, el valor final de la matricula ser 4500 (500 + 1000 +
3000).
concurrente con
UPDATE Apply SET decision = 'Y' WHERE sID = 1;
En este ejemplo, al haber dos clientes que estn realizando una modificacin en una
tupla (o fila) sID = 1; el primero actualizando la especialidad a history y el segundo a
una decision con valor Y. Es posible que se vean ambas modificaciones reflejadas en la
base de datos, pero tambin existe la posibilidad de que slo se visualice una.
concurrente con
UPDATE Student SET GPA = (1.1) * GPA WHERE sizeHS > 2500;
Tenemos el primer cliente trabajando en la tabla Apply, pero las condiciones que se
detallan en la tabla Apply, dependen de la tablaStudent. Mientras tanto el segundo
cliente esta modificando la tabla Student.
As que lo que sucede en la tabla Apply, puede depender de si ocurre antes, despus o
durante la modificacin de la tabla Student.
Entonces los GPA se modifican y luego las aceptaciones se hacen o viceversa.
Objetivo de la Concurrencia
Tenemos mltiples clientes interactuando con la base de datos al mismo tiempo, y si en
realidad los comandos que se ejecutan en la base de datos fuesen intercalados, a
menudo los comandos de actualizacin e incluso los de seleccin, pueden generar un
comportamiento inconsistente o inesperado.
Lo que idealmente se busca es que el cliente ejecute comandos a las bases de datos y
no preocuparse de lo que estn realizando otros clientes en ese mismo instante.
Objetivo Principal
Ejecutar secuencias de instrucciones SQL que parecen estar funcionando de manera
aislada.
Sistema multi-procesador.
Sistema multi-threads
Quizs una gran cantidad de datos de una fuente externa, por ejemplo un conjunto de
archivos. Precisamente en el momento de una carga masiva de datos, tenemos una
cada del sistema o un fallo del sistema.
Esto podra deberse a un fallo de software o hardware, o algo tan simple como la salida
de energa.
Por lo tanto, si se cargaron la mitad de los datos que se deban cargar en la base de
datos
Qu sucede cuando el sistema vuelve?
Se queda en un estado inconsistente bastante desagradable.
Como ejemplo, vamos a suponer que estbamos realizando un montn de cambios en
la base de datos. Entonces los datos que se quieren actualizar son modificados en la
memoria y luego se escriben nuevamente en el disco. As que, suponemos que en
medio de este proceso tenemos una cada del sistema.
Esto volvera a dejar a la base de datos en un estado inconsistente.
As que el objetivo general frente a los fallos del sistema es que cuando queremos
hacer algo en la base de datos es indicarle al sistema que queremos garantizar la
ejecucin de todo o nada para ese conjunto particular de operaciones en la base de
datos independientemente de los fallos que pudieran ocurrir durante la ejecucin.
Estndar SQL:
Leccin
XXVI
Propiedades
Transacciones:
A: Atomicidad.
C: Consistencia.
I: Aislamiento.
D: Durabilidad.
Aislamiento (I)
Esta propiedad asegura que no sean afectadas entre s las transacciones, en otras
palabras esto asegura que la realizacin de dos o ms transacciones sobre la misma
informacin sean independientes y no generen ningn tipo de error [1]
Podemos tener una gran cantidad de clientes que operan en una base de datos (como
se muestra en la imagen), en que cada cliente piensa que est operando por su cuenta.
As como se coment en la Leccin anterior, cada cliente emite en el sistema de base de
datos una secuencia de transacciones. As que un primer cliente podra emitir primero
la transaccin T1, a continuacin, T2, T3, y as sucesivamente. Un segundo cliente
podra emitir una transaccin T9, T10, T11.
Ejemplo
Supongamos cliente C1 emite T1, T2 transacciones y el cliente C2 T3, T4 transacciones
simultneamente. Cuntas ordenes secuenciales equivalentes distintas hay en estas 4
transacciones?
a. 2
b. 4
c. 6
d. 24
La alternativa correcta es (c), puesto que las combinaciones posibles son las
siguientes: T1,T2,T3,T4; T1,T3,T2,T4; T1,T3,T4,T2;T3,T1,T2,T4; T3,T1,T4,T2; T3,T4,T1
,T2.
Ahora, podemos preguntarnos cmo el sistema de base de datos podra garantizar este
nivel de coherencia manteniendo la intercomunicacin de las operaciones. Esto se
logra con la utilizacin de protocolos que se basan en bloquear partes de la base de
datos.
Volveremos a un ejemplo de la Leccin anterior.
UPDATE College SET enrollment = enrollment + 500 WHERE cName = 'UCHILE';
concurrente con
UPDATE College SET enrollment = enrollment + 1000 WHERE cName = 'UCHILE';
concurrente con
UPDATE Apply SET decision = 'Y' WHERE sID = 1;
En este ejemplo, el primer cliente realiz la modificacin de major del estudiante sID =
Durabilidad (D)
Es la propiedad de las transacciones que asegura que una vez finalizada su ejecucin,
sus resultados son permanentes a pesar de otras consecuencias, como por ejemplo, si
falla el disco duro el sistema an ser capaz de recordar todas las transacciones que
han sido realizadas en el sistema [1]
Aqu slo debemos mirar un cliente y lo que est sucediendo.
As que digamos que tenemos a nuestro cliente (siguiente imagen), que est emitiendo
una secuencia de instrucciones (S1, S2, ..., Sn) a la base de datos. Y cada transaccin
(T1, T2, ..., Tn) que realiza el cliente, es una secuencia de instrucciones (S) y que al
finalizar cada instruccin (S) recibe un commit confirmacin.
Entonces, especficamente, si en algn momento esto ocurre, si hay una falla por
cualquier razn, el cliente puede asegurarse que la base de datos ha sido afectada por
la transaccin, y cuando el sistema vuelva a funcionar, los efectos seguirn ah.
Es posible garantizar esto, siendo que los sistemas de base de datos mueven
informacin entre el disco duro y la memoria y una falla puede ocurrir en cualquier
momento?.
Son protocolos no tan complicados que son usados y estn basados en el concepto
de logging.
Atomicidad (A)
Cualquier cambio de estado que produce una transaccin es atmico, es decir, ocurren
todos o no ocurre ninguno. En otras palabras, esta propiedad asegura que todas las
acciones de la transaccin se realizan o ninguna de ellas se lleva a cabo; la atomicidad
requiere que si una transaccin se interrumpe por una falla, sus resultados parciales
deben ser deshechos [1]
De nuevo, slo veremos un cliente que haya dado a conocer una serie de transacciones
a la base de datos. Y vamos a ver la transaccin T2 que a su vez es una secuencia de
instrucciones seguidas por una confirmacin (commit).
El caso que la atomicidad trabaja, es donde existe una falla durante la ejecucin de la
transaccin, despus que se ha sido enviado.
Lo que la propiedad quiere decir que, incluso en presencia de fallos del sistema, cada
transaccin se ejecuta todo o nada en la base de datos.
Tambin se utiliza un mecanismo de log-in, especficamente, cuando el sistema se
recupera de un accidente y hay un proceso por el cual los efectos parciales de las
transacciones
que
se
estaban
ejecutando
al
momento
de
la
falla,
se
deshacen/descartan.
Ejemplo
Considere la posibilidad de una relacin R (A) que contiene {(5), (6)} y dos
transacciones: T1: UPDATE R SET A = A + 1; T2: UPDATE R SET A = 2 * A. Supongamos
que ambas transacciones se presentan bajo la propiedad de aislamiento y atomicidad.
Cul de los siguientes NO es un posible estado final de R?
a. {(10,12)}
b. {(11,13)}
c. {(11,12)}
d. {(12,14)}
La respuesta correcta es (c), puesto que la alternativa (a) se produce si no se completa
T1. La alternativa (b) se produce si T2 se realiza antes que T1. La alternativa (d) se
produce cuando T1 se realiza despus que T2.
Ejemplo
Tenemos la tabla colors, con sus respectivos atributos id y color, pero antes de
comenzar debemos definir algunos conceptos:
savepoint: Con esta sentencia se realiza un commit hasta el punto que se est
seguro que no posee errores. La diferencia concommit es que no se finaliza la
transaccin.
Pero nos damos cuenta nos equivocamos y no era orange el color que desebamos,
entonces volvemos al punto que guardamos anteriormente.
rollback TO b;
4 | green
1 | black
(4 rows)
Consistencia (C)
Esta propiedad establece que solo los valores o datos vlidos sern escritos en la base
de datos; si por algn motivo una transaccin que es ejecutada viola esta propiedad, se
aplicar un rollback a toda transaccin dejando a las bases de datos en su estado de
consistencia anterior. En caso de que la transaccin sea ejecutada con xito, la base de
datos pasar de su estado de consistencia anterior a un nuevo estado de consistencia.
La propiedad de consistencia habla de cmo las transacciones interactan con las
restricciones de integridad que pueden existir en una base de datos.
En concreto, cuando tenemos varios clientes que interactan con la base de datos de
manera concurrente, podemos tener una configuracin en la que cada cliente puede
asumir que cuando comienza a operar sobre una base de datos, satisfaga todas las
restricciones de integridad.
Capa de lgica: la ltima capa es una abstraccin por encima de las relaciones
es lo que se conoce como vistas (views).
Definicin
Una vista es una tabla virtual derivada de las tablas reales de una base de datos. Las
vistas no se almacenan en la base de datos, slo se almacena una definicin de
consulta, es decir una vista contiene la instruccin SELECT necesaria para crearla.
Resultado de la cual se produce una tabla cuyos datos proceden de la base de datos o
de otras vistas. Eso asegura que los datos sean coherentes al utilizar los datos
almacenados en las tablas. Si los datos de las relaciones cambian, los de la vista que
utiliza esos datos tambin cambia. Por todo ello, las vistas gastan muy poco espacio de
disco.
Como una vista se define como una consulta sobre las relaciones, an pertenecen en el
modelo de datos relacional.
Para definir una vista V, se especifica una consulta de Vista en SQL, a travs de un
conjunto de tablas existentes (R1, R2,Rn).
Vista V= ConsultaSQL(R1, R2, , Rn)
La vista V, entonces, se puede pensar como una tabla de los resultados de la consulta.
Ahora supongamos que se desea ejecutar una consulta Q en la base de datos. Esta no
es una consulta de vista, es slo una consulta como las vistas anteriormente en el
curso. La consulta Q hace referencia a V.
V := ViewQuery(R1,R2,,Rn)
Evaluate Q
Lo que realmente hace Q es consultar o editar las relaciones R1, R2,, Rn instanciadas
por V. El DBMS realiza automticamente el proceso de rescritura sobre las relaciones.
Proporcionar tablas con datos especficos: Las vistas permiten ser utilizadas
como tablas que resumen todos los datos, as como tambin permiten ocultar
ciertos datos. Cuando ese se requiere un detalle que no corresponde
precisamente a las relaciones.
Las aplicaciones reales tienden a usar un muchas vistas, por lo que cuanto ms grande
es la aplicacin, ms necesario es que haya modularidad, para facilitar determinadas
consultas o para ocultar los datos. Las vistas entonces son el mecanismo para alcanzar
dichos objetivos.
CREATE VIEW : Define una tabla lgica a partir de una o ms tablas fsicas o de
otras vistas.
DROP VIEW : Elimina una definicin de vista (y cualquier vista definida a partir de
ella).
Vname es el nombre que se le asigna a la vista, A1, A2,, An son los nuevos nombres
de los atributos que tendr la vista.
Ejemplo 1
Se utiliza una base de datos con las siguientes relaciones:
Specie(sName,comName,family)
Esta tabla almacena los datos que caracterizan las especies animales. Almacena el
nombre cientfico en sName , el nombre comn con el que se le conoce es guardado
en comName y la familia family a la que pertenece la especie.
Zoo(zID,zooName,size, budget)
La relacin Zoo almacena los datos de los zoolgicos. Un zID que es la primary key, el
nombre en zooName, size es el tamao en hectreas y presupuesto budget en unidades
monetarias.
CREATE VIEW
Sin embargo la vista no almacena los datos, sino que estos siguen almacenados en la
relacin Animal. Observe que ocurre cuando se insertan ms datos en Animal
INSERT INTO Animal
(zID, sName, aName, country)
VALUES
(4,'Ailuropoda melanoleuca', 'Tony', 'China'),
(3,'Panthera leo', 'Tony', 'China'),
(1,'Loxodonta africana', 'Tony', 'China');
Ejemplo 2
Si se desea renombrar los atributos de una vista, la sentencia debe ser:
CREATE VIEW Viewt(IDzoo,specieName) as
SELECT zID, sName
FROM Animal
WHERE aName = 'Tony' and country = 'China';
PostgreSQL retorna:
CREATE VIEW
La vista Viewt fue definida igual que View1, pero esta vez los atributos que selecciona
son renombrados, zID se despliega como IDzooy sName como specieName
DBviews=# SELECT * FROM Viewt;
idzoo |
speciename
-------+-----------------------5 | Ailuropoda melanoleuca
1 | Panthera leo
3 | Panthera tigris
4 | Ailuropoda melanoleuca
3 | Panthera leo
1 | Loxodonta africana
(6 rows)
Para seleccionar un atributo de Viewt debe hacerse con el nuevo nombre asignado:
DBviews=# SELECT zID FROM viewt;
ERROR: column "zid" does not exist
LNEA 1: select zid from viewt;
DBviews=# SELECT idzoo FROM viewt;
idzoo
------5
1
3
4
3
1
(6 rows)
Ejemplo 3
A pesar que la vista no almacena valores, solo los referencia, se puede trabajar como si
fuera una relacin real. La siguiente consulta selecciona Zoo.zID, zooName y size de la
tabla Zoo y de la vista View1, donde zID de la tabla Zoo sea igual al zID de View1,
recordar
Ailuropoda
melanoleuca
zid | zooname
| size
-----+------------+-----4 | London Zoo |
9
(1 row)
Ejemplo 4
Una vista tambin puede referenciar a otra vista. Para ello se crea una vista
llamada View2 que referencia a la tabla Zoo y a la vista View1.
CREATE view View2 as
SELECT Zoo.zID, zooName, size
FROM Zoo, View1
WHERE Zoo.zID = View1.zID and sName = 'Panthera leo' and
La sentencia crea una vista que almacena datos de Zoo que poseen animales Panthera
leo,
la
bsqueda
la
hace
dentro
de
los
datos
que
posee View1,
adems
el budget de Zoo debe ser mayor a 80. Cabe mencionar que al ejecutar este comando
no muestra el resultado, slo crea la vista.
Luego View2 puede ser utilizada en sentencias SELECT de la misma forma que las
tablas:
DBviews=# SELECT * FROM View2;
zid |
zooname
| size
-----+---------------+-----1 | Metropolitano |
4
3 | San Diego
|
14
(2 rows)
DBviews=# SELECT * FROM View2 WHERE size > 5;
zid | zooname | size
-----+-----------+-----3 | San Diego |
14
(1 row)
Vistas
Por lo general, las tablas son constituidas por un conjunto de definiciones y almacenan
datos fsicos.
Por otra parte las vistas se encuentran en un nivel superior, es decir son constituidas
por un conjunto de definiciones, pero no almacenan datos, pues utilizan los datos que
estn almacenadas en las tablas.
Es por ello que, podemos decir que las vistas son por un conjunto de definiciones, pero
no almacenan datos, pues utilizan los datos que estn almacenadas en las tablas.
Es decir que las vistas se consideran tablas virtuales.
Su sintaxis es:
CREATE VIEW "view_name" AS "sql_instruction";
Donde:
1. view_name : corresponde al nombre de la vista.
2. sql_instruction: corresponde a alguna instruccin SQL vista hasta ahora, es
decir, operaciones de insercin y/o modificacin.
Toda Base de Datos (BD), puede ser vista como un rbol de 3 niveles:
1. La raz, compuesta por la parte fsica de la BD, es decir el(los) disco(s) duro(s).
2. El tronco, compuesto por las relaciones de dentro de la BD, es decir, su
parte conceptual.
3. Las ramas, que corresponde a la parte lgica, se refiere a las relaciones que
nacen desde las relaciones del tronco (tablas) y/o relaciones desde las ramas
(otras vistas).
Realizar modificaciones en una vista no tiene mucho sentido, pues al no almacenar
informacin,estos cambios simplemente se perderan. No obstante, si el objetivo de
estos cambios corresponde a modificar la(s) tabla(s), dicha modificacin adquiere
sentido.
Nota
Por modificacin se entienden operaciones de tipo INSERT, UPDATE y DELETE.
Curso SQL PostgreSQL
Estas modificaciones en las vistas deben ser traducidas a modificaciones que afecten a
las tablas involucradas. Esta Leccin est orientada a profundizar como se automatiza
este proceso.
Reglas
Dentro del estndar de SQL, existen 4 reglas para que una vista sea modificable, es
decir si se modifica la vista en cuestin, se modifica la relacin/tabla desde donde nace
la vista. Estas reglas son:
1. Hacer un SELECT. de una tabla, no de una unin (JOIN). Adems la tabla no
puede ser DISTINCT.
2. Si un atributo no esta en la vista, debe soportar valores NULL o uno por defecto.
3. Si la vista est sobre la relacin/tabla T, las subconsultas no pueden referirse
a T, pero si a otras relaciones/tablas.
4. En una vista, no se puede usar GROUP BY o AGREGGATION.
Contexto
Supongamos que durante el primer semestre de clases, especficamente a un mes de
que se implementara el sistema de postulacin a Establecimientos Educacionales,
postulan 4 estudiantes ms. Es por ello que se decide realizar una mejora utilizando
vistas, debido a sus propiedades y simplificar complejas consultas sobre tablas, ya sea
seleccionando (SELECT.) y/o modificando(INSERT, UPDATE, DELETE) datos.
Adems se utilizarn criterios ms estrictos, pues en la versin del sistema, se permiti
la entrada a alumnos que no tenan promedio arriba de 50: se le denominar sistema
de postulacin 2.0 (BETA).
Es por ello que, para esta Leccin, se utilizar el sistema de Postulacin de Estudiantes
a Establecimientos Educacionales:
CREATE TABLE College(cName VARCHAR(20), state VARCHAR(30),
enrollment INTEGER, PRIMARY KEY(cName));
CREATE TABLE Student(sID SERIAL, sName VARCHAR(20), Average INTEGER,
PRIMARY KEY(sID));
CREATE TABLE
Apply(sID INTEGER, cName VARCHAR(20), major VARCHAR(30),
decision BOOLEAN,
PRIMARY KEY(sID, cName, major));
con los siguientes datos para la tabla College, Student y Apply respectivamente:
4 establecimientos:
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
College
College
College
College
VALUES
VALUES
VALUES
VALUES
('Stanford','CA',15000);
('Berkeley','CA',36000);
('MIT',
'MA',10000);
('Harvard', 'CM',23000);
Nota
Estos datos no son necesariamente reales, ni se hicieron investigaciones para corroborar su
veracidad (estado o capacidad), pues se escapa al alcance de este curso. Slo buscan ser
meras herramientas para el desarrollo de los ejemplos de esta Leccin.
3 estudiantes:
INSERT INTO Student (sName, Average) VALUES ('Clark',
INSERT INTO Student (sName, Average) VALUES ('Marge',
INSERT INTO Student (sName, Average) VALUES ('Homer',
70);
85);
50);
8 postulaciones:
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
Apply
Apply
Apply
Apply
Apply
Apply
Apply
Apply
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
(1,
(1,
(2,
(2,
(2,
(3,
(3,
(3,
'Stanford',
'Berkeley',
'Harvard' ,
'MIT'
,
'Berkeley',
'MIT'
,
'Harvard' ,
'Harvard' ,
'science'
'science'
'science'
'engineering'
'science'
'science'
'engineering'
'natural history'
,
,
,
,
,
,
,
,
True);
False;
False;
True);
True);
True);
True);
True);
Nota
Estos datos no son necesariamente reales, ni se hicieron investigaciones para corroborar su
veracidad (mencin acadmica), pues se escapa al alcance de este curso. Slo buscan ser
meras herramientas para el desarrollo de los ejemplos de esta Leccin.
Esta vista cuenta con las 4 restricciones impuestas por el estndar SQL para que sea
considerada como vista modificable:
su salida es:
sid | cname
----+---------1 | Stanford
2 | Berkeley
3 | MIT
Ejemplo 1
Supongamos que se desea eliminar de la vista al estudiante con sID = 3 (Homer), pues
realiz trampa en esta prueba. La idea es eliminarlo de la vista y a la vez, de la tabla
Apply, para no tener que realizar 2 operaciones:
DELETE FROM scAccepted WHERE sid = 3;
No obstante:
ERROR: you cannot delete from view "scaccepted"
HINT: You need a unconditional ON DELETE DO INSTEAD rule or
INSTEAD OF DELETE trigger.
Ejemplo 2
Supongamos que deseamos crear una vista que contenga a los Estudiantes que
postularon a Ciencias o Ingeniera.
CREATE VIEW sceng as
SELECT sid, cname, major FROM Apply
WHERE major = 'science' or major = 'engineering';
la salida es:
sid | cname
| major
----+----------+------------1 | Stanford | science
1 | Berkeley | science
2 | Harvard | science
2 | MIT
| engineering
2 | Berkeley | science
3 | MIT
| science
3 | Harvard | engineering
No hay problemas, pues cuenta con las 4 reglas de vistas modificables. El ejemplo
funciona en MySQL y en la teora.
Ejemplo 3
Supongamos que deseamos agregar una fila a la vista scAccepted,
INSERT INTO scAccepted VALUES (2, 'MIT');
Si bien podra pensarse que, como la vista contiene valores determinados para el
atributo major y decision, bastara con agregar slo los restantes, es decir sID y cName.
Al momento de seleccionar todos los datos de la vista, no se ver esta nueva fila,
debido a que:
1. El hecho de que la vista cuente con valores de seleccin no quiere decir que ellos
sean de insercin.
Curso SQL PostgreSQL
Ejemplo 4
En los sistemas que se permite el cambio automtico, es posible evitar inconsistencias
como la que se gener en el ejemplo 3, agregando al final de la vista:
CREATE VIEW scAccepted2 as
SELECT sid, sname FROM Apply
WHERE major='science' and decision = true;
WITH CHECK OPTION;
Conclusiones
1. Los cambios automticos slo se pueden realizar a tablas modificables, es
decir que cumplan con las 4 reglas.
2. PostgreSQL no soporta este tipo de modificacin, slo la permite a travs de
reglas y/o triggers.
Leccin
XXIX
materializadas
Vistas:
Vistas
Introduccin
En las Leccins anteriores se vio la vista virtual que es el tipo usual de vista que se
define como una consulta de la base de datos. En esta Leccin se vern las vistas
materializadas, que almacena el resultado de la consulta en una tabla cach real. Es una
solucin muy utilizada en entornos de almacenes de datos (datawarehousing), donde el
acceso frecuente a las tablas bsicas resulta demasiado costoso.
Definicin
Una vista materializada almacena fsicamente los datos resultantes de ejecutar la
consulta definida en la vista. Inicialmente se almacenan los datos de las tablas base al
ejecutar la consulta y se actualiza peridicamente a partir de las tablas originales. Las
vistas materializadas constituyen datos redundantes, en el sentido de que su contenido
se puede deducir de la definicin de la vista y del resto del contenido de la base de
datos.
Se define una vista especificando una consulta de Vista en SQL, a travs de un conjunto
de tablas existentes (R1, R2,Rn).
Vista V= ConsultaSQL(R1, R2, , Rn)
De esta forma se crea en realidad una tabla fsica V con el esquema del resultado de la
consulta. Puede referirse a V como si fuese una relacin, ya que en realidad es una tabla
almacenada en una base de datos.
Ventaja
Poseen las mismas ventajas de visitas virtuales. La diferencia radica en que las vistas
materializadas mejoran el rendimiento de consultas sobre la base de datos, pues
proporciona un acceso mucho ms eficiente. Con la utilizacin de vistas materializadas
se logra aumentar el rendimiento de las consultas SQL adems de ser un mtodo de
optimizacin a nivel fsico en modelos de datos muy complejos y/o con muchos datos.
Desventajas
Posible falta de sincrona, es decir, que los datos de la vista pueden estar
potencialmente desfasados con respecto a los datos reales. Al contener
fsicamente los datos de las tablas base, si cambian los datos de estas tablas no
se reflejarn en la vista materializada.
que
emplea
la
vista.
La
Prctica
de
actualizar
una
vista
se
Sin embargo en esta Leccin se utilizar otro mtodo para tratar las vistas
materializada. Primero se crea la tabla matviews para guardar la informacin de una
vista materializada.
Curso SQL PostgreSQL
Donde:
Ahora se crea una funcin create_matview escrita en PL/pgSQL. Dicha funcin inserta
una fila en la tabla matviews y crea la vista materializada. Recibe el nombre de la vista
materializada, y el nombre de la vista que se basa. Tenga en cuenta que se debe crear
la vista virtual en la que se basa, ms adelante se explica cmo se crea y utiliza esta
vista. Esta funcin ve si una vista materializada con el nombre que recibe ya est
creada. Si es as, se produce una excepcin. De lo contrario, se crea una nueva tabla
con la vista, e inserta una fila en la tabla matviews.
CREATE OR REPLACE FUNCTION create_matview(NAME, NAME)
RETURNS VOID
SECURITY DEFINER
LANGUAGE plpgsql AS '
DECLARE
matview ALIAS FOR $1;
view_name ALIAS FOR $2;
entry matviews%ROWTYPE;
BEGIN
SELECT * INTO entry FROM matviews WHERE mv_name = matview;
IF FOUND THEN
RAISE EXCEPTION ''Materialized view ''''%'''' already exists.'',
matview;
END IF;
EXECUTE ''REVOKE ALL ON '' || view_name || '' FROM PUBLIC'';
EXECUTE ''GRANT SELECT ON '' || view_name || '' TO PUBLIC'';
EXECUTE ''CREATE TABLE '' || matview || '' AS SELECT * FROM '' ||
view_name;
EXECUTE ''REVOKE ALL ON '' || matview || '' FROM PUBLIC'';
EXECUTE ''GRANT SELECT ON '' || matview || '' TO PUBLIC'';
La funcin refresh_matview actualiza las vistas materializadas de manera que los datos
no se convierten en obsoletos. Esta funcin slo necesita el nombre de la matview. Se
utiliza un algoritmo que elimina todas las filas y vuelve a colocarlas en la vista.
CREATE OR REPLACE FUNCTION refresh_matview(name) RETURNS VOID
SECURITY DEFINER
LANGUAGE plpgsql AS '
DECLARE
matview ALIAS FOR $1;
entry matviews%ROWTYPE;
BEGIN
SELECT * INTO entry FROM matviews WHERE mv_name = matview;
IF NOT FOUND THEN
RAISE EXCEPTION ''Materialized view % does not exist.'', matview;
END IF;
Ejemplo
Para este ejemplo se utilizarn las funciones mostradas anteriormente, primero se
instala el lenguaje plpgsql:
viewm=# CREATE PROCEDURAL LANGUAGE plpgsql;
CREATE LANGUAGE
Dado que muchos de los equipos juegan todos los das, y correr la vista es un poco
caro, se decide implementar una vista materializada en player_total_score_v . Para ello
se crea la vista invocando la funcin create_matview pasndole por parmetros el
nombre de la vista materializada player_total_score_mv y el nombre de la vista
virtual player_total_score_v.
viewm=#
SELECT
'player_total_score_v');
create_matview('player_total_score_mv',
create_matview
---------------(1 row)
Al ejecutar un SELECT sobre la vista materializada se observa que est creada y vaca:
viewm=# SELECT * FROM player_total_score_mv;
pname | total_score
-------+------------(0 row)
Esta vez al volver a seleccionar la vista materializada aparecen los valores insertados en
la relacin game_score
viewm=# SELECT * FROM player_total_score_mv;
pname | total_score
-------+------------SW
|
4
UCH
|
2
(2 rows)
sintaxis
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ]
]
vaciamiento:
futuras.
tabla.
tabla: El nombre de una tabla especfica a vaciar. Por defecto se toman todas las
tablas de la base de datos actual.
Ejemplo:
Se ejecuta VACUUM sobre una base de datos existente.
demo=# VACUUM;
VACUUM
Se ejecuta VACUUM con parmetro FULL sobre una base de datos existente
demo=# VACUUM FULL;
VACUUM
En caso de que haya algn problema o accin adicional a realizar, el sistema lo indicar:
demo=# VACUUM;
Reindexacin
Para facilitas la obtencin de informacin de una tabla se utilizan ndices. El ndice de
una tabla permite encontrar datos rpidamente. Sin ndice se debera recorrer
secuencialmente toda la tabla para encontrar un registro. Es muy til para bases de
datos que posee mucha informacin.
Una tabla se indexa por un campo o varios. Es importante identificar el o los datos por
lo que sera til crear un ndice, aquellos campos por los cuales se realizan operaciones
de bsqueda con frecuencia.
Hay distintos tipos de ndice:
unique: crea un ndice para los cuales los valores deben ser nicos y diferentes,
aparece un mensaje de error si intentamos agregar un registro con un valor ya
existente. Permite valores nulos y pueden definirse varios por tabla.
Ejemplo:
Se ejecuta el comando sobre la base de datos utilizada en la Leccin 29:
demo=# reindex
NOTICE: table
NOTICE: table
NOTICE: table
NOTICE: table
NOTICE: table
NOTICE: table
NOTICE: table
database demo;
"pg_class" was reindexed
"pg_type" was reindexed
"pg_statistic" was reindexed
"sql_features" was reindexed
"sql_implementation_info" was reindexed
"sql_languages" was reindexed
"sql_packages" was reindexed
Ficheros de registro
Una buena prctica es mantener archivos de registro de la actividad del servidor, al
menos de los errores que origina. Durante el desarrollo de aplicaciones se puede
disponer de un registro de las consultas efectuadas, aunque disminuye el rendimiento
del gestor en bases de datos de mucha actividad, y puede no ser de mucha utilidad.
De igual modo es conveniente disponer de mecanismos de rotacin de los ficheros de
registro; es decir, que peridicamente se mantenga un respaldo de estos ficheros y se
empiecen unos nuevos, lo que permite tener un historial.
PostgreSQL no proporciona directamente utilidades para realizar esta rotacin, pero en
la mayora de sistemas Unix vienen incluidas utilidades como logrotate que realizan
esta Prctica a partir de una planificacin temporal.
VACUUM
demo=# VACUUM VERBOSE ANALYZE;
INFO: analyzing "pg_catalog.pg_operator"
INFO: "pg_operator": scanned 13 of 13 pages, containing 704 live rows and 0
dead rows; 704 rows in sample, 704 estimated total rows
INFO: vacuuming "pg_catalog.pg_opfamily"
INFO: index "pg_opfamily_am_name_nsp_index" now contains 68 row versions in
2 pages
DETALLE: 0 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
VACUUM
Explain
Este comando muestra el plan de ejecucin que el administrador del sistema gestor de
bases de datos Postgres genera para una consulta dada. El plan de ejecucin muestra la
manera en que sern escaneadas las tablas referenciadas; ya sea escaneo secuencial
plano, escaneo por ndice, etc. En el caso que se referencian varias tablas, los
algoritmos de unin que sern utilizados para agrupar las tuplas requeridas de cada
tabla de entrada.
Sintaxis
EXPLAIN [ VERBOSE ] consulta
La opcin VERBOSE emite la representacin interna completa del plan. Usualmente esta
opcin es til para la correccin de errores de Postgres.
Ejemplo 1.
Se emplea la misma tabla utilizada en la Leccin 29:
demo=# SELECT * FROM game_score;
pname | score
-------+------UCH
|
2
SW
|
4
(2 rows)
Para mostrar un plan de consulta para una consulta simple sobre una tabla con dos
columnas una del tipo INT y la otra VARCHAR :
EXPLAIN SELECT * FROM game_score;
QUERY PLAN
---------------------------------------------------------Seq Scan on game_score (cost=0.00..1.02 rows=2 width=7)
(1 row)
Ejemplo 2.
Se crea una tabla con un ndice INT y se insertan 4 valores:
demo=# CREATE TABLE score (num int);
CREATE TABLE
demo=# INSERT INTO score VALUES(1),(2),(5),(4);
INSERT 0 4
EXPLAIN SELECT * FROM foo WHERE num = 4;
QUERY PLAN
----------------------------------------------------Seq Scan on foo (cost=0.00..40.00 rows=12 width=4)
Filter: (num = 4)
(2 rows)
EXPLAIN es la presentacin del costo estimado de ejecucin de la consulta, que es la
suposicin del planificador sobre el tiempo que tomar correr la consulta (medido en
unidades de captura de pginas de disco). Se Muestra dos nmeros: el tiempo inicial
que toma devolverse la primer tupla, y el tiempo total para devolver todas las tuplas.
Nota
No se considera SELECT, pues no provoca cambios. Recordemos que es una
operacin de seleccin.
Al momento de realizar un respaldo, se guarda el estado en que se encuentra la BD al
momento de realizar dicha operacin de respaldo.
Al momento de realizar la operacin de recuperacin, puede ser de varias formas, ya
sea a travs de las operaciones (en orden) que han dejado la BD en el estado actual u
otras formas.
Servicios en PostgreSQL
De forma nativa PostgreSQL cuenta con las siguientes funciones:
Advertencia
Algunos de los comandos que se vern a continuacin, son ejecutados en terminales bajo
sistemas UNIX. No necesariamente dentro del entorno de PostgreSQL (psql).
SQL Dump
pg_dump
Esta funcin genera un archivo de texto con comandos SQL que, cuando son
reintroducidos (bajo cierto contexto ) al servidor, se deja a la BD en el mismo estado en
el que se encontraba al momento de ejecutar este comando.
Nota
Esto ocurre siempre y cuando la BD est vaca, es decir, en el mismo estado inicial.
pg_dump guarda los comandos introducidos hasta el punto de control. El ejemplo 1
permitir aclarar dudas.
su sintaxis es:
pg_dump dbname > archivo_salida
Ejemplo 1
Supongamos que tenemos una BD llamada lecture31 y dentro de ella una nica tabla
llamada Numbers con atributos Number YName, con datos:
1 One
2 Two
Curso SQL PostgreSQL
3 Three
Es decir:
CREATE DATABASE lecture31;
conectndose:
\c lecture31
CREATE TABLE Numbers(Number INTEGER, Name VARCHAR(20));
INSERT INTO Numbers VALUES (1, 'One' );
INSERT INTO Numbers VALUES (2, 'Two' );
INSERT INTO Numbers VALUES (3, 'Three' );
A travs de un select:
number | name
-------+------1
| One
2
| Two
3
| Three
Para evitar esto, es necesario considerar que el usuario de la BD debe tener permisos de
escritura en la carpeta donde se alojar el archivo.
Nota
Para los usuarios locales, basta con hacer cd en la linea de comandos (como usuario
postgres), para acceder a la carpeta de postgres. Si desea realizar pruebas desde el servidor
dedicado, puede crear BDs desde su sesin y alojar los archivos de respaldo en su capeta
home.
Nota
Es posible cambiar los permisos de Leccin y escritura de las carpetas, dar accesos a
usuarios que no son dueos de las BD. No se profundiza esto, pues escapa a los alcances
de este curso.
La salida es:
number | name
-------+------2
| Two
3
| Three
1
| One
2
| Two
3
| Three
Pero Qu ocurre si utilizamos el atributo number como PK?, es decir modificar slo la
linea (y seguir el resto de los pasos de la misma forma):
CREATE TABLE Numbers(Number INTEGER, Name VARCHAR(20), PRIMARY KEY (Number));
Ejemplo 2
Este ejemplo es muy similar al anterior, slo que, en lugar de trabajar con atributos
INTEGER, se trabajar con atributo serial es decir:
\c lecture31
DROP TABLE Numbers;
CREATE TABLE Numbers2(Number SERIAL, Name VARCHAR(20));
INSERT INTO Numbers2 (name) VALUES ('One' );
INSERT INTO Numbers2 (name) VALUES ('Two' );
INSERT INTO Numbers2 (name) VALUES ('Three' );
Digamos que se agrega la tupla (4, Four) y borra la tupla (3, Three). Despus de
realizar el respaldo:
number | name
-------+------1
| One
2
| Two
4
| Four
Nota
Ntese que en la salida, es posible ver: setval 3
La salida es:
number | name
-------+------1
| One
2
| Two
4
| Four
1
| One
2
| Two
3
| Three
Lo cual es un problema, pues se trabaja con valores seriales. De hecho si en este estado
se agrega la tupla (4, Four) y se revisan los contenidos de la tabla, la salida es:
number | name
-------+------1
| One
2
| Two
4
| Four
1
| One
2
| Two
3
| Three
4
| Four
Ejercicio propuesto
Se deja en manos del lector ver que ocurre en caso de trabajar con atributo serial PK, es
decir:
CREATE TABLE Numbers2(Number SERIAL, Name VARCHAR(20), PRIMARY KEY (number));
y luego seguir los mismos pasos, es decir agregar las tuplas (1, One), (2, Two) y (3,
Three). Luego realizar un respaldo, acceder a la BD, eliminar la ltima tupla, agregar
(4, Four), realizar la restauracin, intentar agregar ms tuplas (conectndose a la BD
primero) y los que desee hacer el lector.
Siga intentando, ver que es posible agregar ms tuplas. Fjese en el valor de la llave
primaria. Cuntas veces tuvo que intentar?
Qu ocurre si en lugar de eliminar la ltima tupla, se elimina la primera?
pg_dumpall
Un pequeo inconveniente con pg_dump es que slo puede hacer respaldos de una BD
a la vez. Adems no respalda informacin acerca de roles de usuario e informacin por
el estilo
Para realizar un respaldo de la BD y el cluster de datos, existe el comando pg_dumpall.
su sintaxis es:
pg_dumpall > archivo_salida
Que trabaja emitiendo las consultas y comandos para recrear roles, tablespaces y Bases
de Datos vacos. Posteriormente se invoca pg_dump por cada BD para corroborar
consistencia interna.
Advertencia
Es posible que el servidor dedicado no le permita restaurar, si se utiliza con el usuario
postgres. Por favor, utilice este comando slo de manera local. Pruebe utilizando su propio
usuario.
2. Cada vez que se realice un respaldo, el servidor debe estar apagado, para que
los cambios se guarden en su totalidad.
Advertencia
La mayor parte de las veces, se necesita acceso root, para poder realizar este tipo de
operacin, pues es necesario configurar archivos de configuracin de postgres. Es de suma
importancia que se realicen de forma correcta, pues ante algn fallo es posible destruir la
base de datos de forma completa. Por lo tanto, no se abordar de forma extensa este
apartado. No obstante es posible obtener informacin en internet.
Rsync
Rsync corresponde a un programa que sincroniza dos directorios a travs de distintos
sistemas de archivos, incluso si estn en distinto computadores, fsicamente hablando.
A travs del uso de SSH o Secure SHell por sus siglas en ingls, se pueden realizar
transferencias seguras y basadas en llaves de autenticacin.
La principal ventaja de utilizar rsync a diferencia de otros comandos similares,
como scp, es que si el archivo que se encuentra en la fuente, es el mismo que, el que se
encuentra en el objetivo, no hay transmisin de datos; si el archivo que se encuentra en
el objetivo difiere del que se encuentra en la fuente, slo aquellas partes que difieren
son transmitidas, en lugar de transmitir todo, por lo que el downtime de la BD, es decir,
el tiempo que debe permanecer apagada, es mucho menor.
Cabe destacar que es de suma importancia realizar una adecuada preparacin de la BD,
para evitar posibles desastres. En [1] se explican con gran nivel de detalle. No obstante,
los cambios realizados son bajo su propio riesgo, y se recomienda fuertemente realizar
pruebas de manera local.
Conclusiones
Para finalizar, por lo general, los respaldos realizados a travs de SQL Dump suelen ser
ms livianos, en tamao, que los realizados a travs de respaldo de archivos, ya que,
por ejemplo en el caso de pg_dump no es necesario copiar ndices de tablas o cosas
por el estilo; sino que slo los comandos que los crean. Es por ello que, generalmente
estos ltimos, son ms rpidos.
o
SELECT n.nspname as "Schema", p.proname as "Name", u.rolname as
"Propietario"
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
Curso SQL PostgreSQL
o
SELECT n.nspname as "Schema", p.proname as "Name", u.rolname as "Prop
ietario"
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
join pg_roles u on u.oid=p.proowner
WHERE pg_catalog.pg_function_is_visible(p.oid)
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND p.prorettype='pg_catalog.trigger'::pg_catalog.regtype
o
SELECT n.nspname as "Schema", c.relname as "Name", pg_catalog.pg_get_u
serbyid(c.relowner) as "propietario"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind ='S'
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~
'^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
select *
from information_schema.domains
where
domain_catalog='basedato'
and domain_schema not like 'pg_%' and
domain_schema<>'information_schema'
not
like
'pg_%'
and
- Obtener ndices.
select * from pg_indexes where
and schemaname<>'information_schema'
schemaname
not
like
'pg_%'
o
SELECT a.attnum,a.attname as campos,
pg_catalog.format_type(a.atttypid, a.atttypmod) as tipo,
(SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
FROM pg_catalog.pg_attrdef d
WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) as
pordefecto,a.attnotnull as NULO
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = (select oid from pg_class where relname='tabla' ) AND
a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
SELECT pg_get_constraintdef(pg_constraint.oid), pg_class.relname AS tabla,
pg_constraint.conname
FROM pg_constraint, pg_class
WHERE ((pg_constraint.contype = 'p'::"char") AND (pg_constraint.conrelid =
pg_class.oid)) and relname='tabla'
SELECT pg_constraint.conname as nombrellave ,
pg_get_constraintdef(pg_constraint.oid) as definicion, pg_class.relname AS
tabla,(select a.relname from pg_class a where a.oid=pg_constraint.confrelid) as
tablaforanea,
case confmatchtype
when 'u' then 'MATCH simple '
when 'f' then 'MATCH full'
when 'p' then 'MATCH partial'
end as tipo,
case confupdtype
when 'a' then 'no action '
when 'r' then 'restrict'
when 'c' the
n 'cascade'
when 'n' then 'set null'
else
'default'
end as onupdate ,
case confdeltype
when 'a' then 'no action '
Curso SQL PostgreSQL
Y
select distinct trigger_name , array_to_string( array (select
event_manipulation::"text"
from information_schema.triggers where trigger_name='cons' and
trigger_schema='public' ),',') a
s evento , event_object_table as tabla, action_orientation
as modo,condition_timing as momento,action_statement as accion from
information_schema.triggers where trigger_name='cons' and
trigger_schema='public'