Postgres Tutorial
Postgres Tutorial
Editado por
Thomas Lockhart
Tutorial de PostgreSQL
por El equipo de desarrollo de PostgreSQL
PostgreSQL
es marca registrada © 1996-9 por el Postgres Global Development Group.
Tabla de contenidos
Sumario........................................................................................................................... i
1. Introduction................................................................................................................1
1.1. ¿Qué es Postgres? .............................................................................................1
1.2. Breve historia de Postgres.................................................................................2
1.2.1. El proyecto Postgres de Berkeley ..........................................................2
1.2.2. Postgres95 ..............................................................................................3
1.2.3. PostgreSQL ............................................................................................4
1.3. Acerca de esta versión ......................................................................................5
1.4. Recursos............................................................................................................6
1.5. Terminología .....................................................................................................8
1.6. Notación............................................................................................................9
1.7. Y2K Statement (Informe sobre el efecto 2000)..............................................10
1.8. Copyrights y Marcas Registradas ...................................................................11
2. SQL .............................................................................................................................1
2.1. El Modelo de Datos Relacional ........................................................................2
2.2. Formalidades del Modelo Relacional de Datos ................................................3
2.2.1. Dominios contra Tipos de Datos............................................................4
2.3. Operaciones en el Modelo de Datos Relacional ...............................................5
2.3.1. Álgebra Relacional.................................................................................6
2.3.2. Cálculo Relacional .................................................................................9
2.3.3. Cálculo Relacional de Tuplas ..............................................................10
2.3.4. Álgebra Relacional contra Cálculo Relacional ....................................10
2.4. El Lenguaje SQL.............................................................................................11
2.4.1. Select....................................................................................................11
2.4.1.1. Select sencillas ..........................................................................12
2.4.1.2. Joins (Cruces)............................................................................14
2.4.1.3. Operadores Agregados..............................................................15
2.4.1.4. Agregación por Grupos.............................................................16
2.4.1.5. Having.......................................................................................18
2.4.1.6. Subconsultas .............................................................................19
2.4.1.7. Unión, Intersección, Excepción ................................................20
3
2.4.2. Definición de Datos..............................................................................22
2.4.2.1. Create Table ..............................................................................22
2.4.2.2. Tipos de Datos en SQL .............................................................22
2.4.2.3. Create Index ..............................................................................23
2.4.2.4. Create View...............................................................................24
2.4.2.5. Drop Table, Drop Index, Drop View.........................................26
2.4.3. Manipulación de Datos ........................................................................26
2.4.3.1. Insert Into ..................................................................................27
2.4.3.2. Update .......................................................................................27
2.4.3.3. Delete ........................................................................................28
2.4.4. System Catalogs...................................................................................29
2.4.5. SQL Embebido.....................................................................................29
3. Arquitectura .............................................................................................................31
3.1. Postgres Conceptos de arquitectura ................................................................31
4. Empezando ...............................................................................................................33
4.1. Configurando el entorno .................................................................................33
4.2. Ejecución del Monitor Interactivo (psql) ........................................................34
4.3. Administrando una Base de datos...................................................................35
4.3.1. Creación de una base de datos .............................................................36
4.3.2. Acceder a una base de datos ................................................................36
4.3.3. Eliminando bases de datos ...................................................................38
5. El Lenguaje de consultas .........................................................................................39
5.1. Monitor interactivo .........................................................................................39
5.2. Conceptos........................................................................................................40
5.3. Creación de una nueva clase ...........................................................................40
5.4. Llenando una clase con instancias ..................................................................41
5.5. Consutar a una clase........................................................................................42
5.6. Redireccionamiento de consultas SELECT ....................................................43
5.7. Joins (uniones) entre clases.............................................................................44
5.8. Actualizaciones ...............................................................................................45
5.9. Borrados..........................................................................................................45
5.10. Uso de funciones de conjunto .......................................................................46
6. Características Avanzadas de SQL en Postgres ....................................................49
4
6.1. Herencia ..........................................................................................................49
6.2. Valores No-Atómicos......................................................................................51
6.2.1. Vectores................................................................................................51
6.3. Time Travel (Viaje en el tiempo) ....................................................................53
6.4. Más características avanzadas.........................................................................55
Bibliografía ...................................................................................................................56
5
Tabla de figuras
3-1. Como se establece una conexión ............................................................................31
Tabla de ejemplos
2-1. La Base de Datos de Proveedores y Artículos..........................................................2
2-3. Una consulta utilizando Álgebra Relacional ............................................................9
2-4. Query sencilla con cualificación.............................................................................12
2-5. Aggregates ..............................................................................................................15
2-6. Agregados ...............................................................................................................16
2-7. Having ....................................................................................................................18
2-8. Subselect.................................................................................................................19
2-9. Union, Intersect, Except .........................................................................................20
2-10. Creación de una tabla ...........................................................................................22
2-11. Create Index..........................................................................................................23
1
Sumario
Postgres, desarrollada originalmente en el Departamento de Ciencias de la
Computación de la Universidad de California en Berkeley, fue pionera en muchos de
los conceptos de bases de datos relacionales orientadas a objetos que ahora empiezan a
estar disponibles en algunas bases de datos comerciales. Ofrece suporte al lenguaje
SQL92/SQL3, integridad de transacciones, y extensibilidad de tipos de datos.
PostgreSQL es un descendiente de dominio público y código abierto del código
original de Berkeley.
1
Capítulo 1. Introduction
Este documento es el manual de usuario del sistema de mantenimiento de bases de
datos PostgreSQL (http://postgresql.org/) , originariamente desarrollado en la
Universidad de California en Berkeley. PostgreSQL está basada en Postgres release 4.2
(http://s2k-ftp.CS.Berkeley.EDU:8000/postgres/postgres.html). El proyecto Postgres ,
liderado por el Porfesor Michael Stonebraker, fue esponsorizado por diversos
organismos oficiales u oficiosos de los EEUU: la Agencia de Proyectos de Investigación
Avanzada de la Defensa de los EEUU (DARPA), la Oficina de Investigación de la
Armada (ARO), la Fundación Nacional para la Ciencia (NSF), y ESL, Inc.
clases
herencia
tipos
funciones
Otras características aportan potencia y flexibilidad adicional:
1
Capítulo 1. Introduction
Restricciones (Constraints)
Disparadores (triggers)
Reglas (rules)
Integridad transaccional
2
Capítulo 1. Introduction
Postgres ha pasado por varias revisiones importantes desde entonces. El primer sistema
de pruebas fue operacional en 1987 y fue mostrado en la Conferencia ACM-SIGMOD
de 1988. Lanzamos la Versión 1, descrita en The Implementation of Postgres, a unos
pocos usuarios externos en Junio de 1989. En respuesta a una crítica del primer sistema
de reglas (A Commentary on the Postgres Rules System), éste fue rediseñado (On Rules,
Procedures, Caching and Views in Database Systems) y la Versión 2, que salió en Junio
de 1990, lo incorporaba. La Versión 3 apareció en 1991 y añadió una implementación
para múltiples gestores de almacenamiento, un ejecutor de consultas mejorado y un
sistema de reescritura de reglas nuevo. En su mayor parte, las siguientes versiones hasta
el lanzamiento de Postgres95 (ver más abajo) se centraron en mejorar la portabilidad y
la fiabilidad.
Postgres forma parte de la implementación de muchas aplicaciones de investigación y
producción. Entre ellas: un sistema de análisis de datos financieros, un paquete de
monitorización de rendimiento de motores a reacción, una base de datos de
seguimiento de asteroides y varios sistemas de información geográfica. También se ha
utilizado como una herramienta educativa en varias universidades. Finalmente, Illustra
Information Technologies (http://www.illustra.com/) (posteriormente absorbida por
Informix (http://www.informix.com/)) tomó el código y lo comercializó. Postgres llegó
a ser el principal gestor de datos para el proyecto científico de computación Sequoia
2000 (http://www.sdsc.edu/0/Parts_Collabs/S2K/s2k_home.html) a finales de 1992.
El tamaño de la comunidad de usuarios externos casi se duplicó durante 1993. Pronto
se hizo obvio que el mantenimiento del código y las tareas de soporte estaban
ocupando tiempo que debía dedicarse a la investigación. En un esfuerzo por reducir
esta carga, el proyecto terminó oficialmente con la Versión 4.2.
1.2.2. Postgres95
En 1994, Andrew Yu (mailto:[email protected]) y Jolly Chen
(http://http.cs.berkeley.edu/~jolly/) añadieron un intérprete de lenguage SQL a
Postgres. Postgres95 fue publicado a continuación en la Web para que encontrara su
propio hueco en el mundo como un descendiente de dominio público y código abierto
del código original Postgres de Berkeley.
3
Capítulo 1. Introduction
4
Capítulo 1. Introduction
1.2.3. PostgreSQL
En 1996, se hizo evidente que el nombre “Postgres95” no resistiría el paso del tiempo.
Elegimos un nuevo nombre, PostgreSQL, para reflejar la relación entre el Postgres
original y las versiones más recientes con capacidades SQL. Al mismo tiempo, hicimos
que los números de versión partieran de la 6.0, volviendo a la secuencia seguida
originalmente por el proyecto Postgres.
Durante el desarrollo de Postgres95 se hizo hincapié en identificar y entender los
problemas en el código del motor de datos. Con PostgreSQL, el énfasis ha pasado a
aumentar características y capacidades, aunque el trabajo continúa en todas las áreas.
Las principales mejoras en PostgreSQL incluyen:
5
Capítulo 1. Introduction
1.4. Recursos
Este manual está organizado en diferentes partes:
Tutorial
Introduccion para nuevos usuarios. No cubre características avanzadas.
6
Capítulo 1. Introduction
Manual de Referencia
Información detallada sobre los comandos. Actualmente incluído en la Guia del
Usuario.
Ademas de éste manual, hay otros recursos que le servirán de ayuda para la instalacion
y el uso de Postgres:
man pages
Las páginas de manual(man pages) contienen mas información sobre los
comandos.
FAQs(Preguntas Frequentes)
La sección de Preguntas Frequentes(FAQ) contiene respuestas a preguntas
generales y otros asuntos que tienen que ver con la plataforma en que se desarrolle.
LEAME(READMEs)
Los archivos llamados LEAME(README) estan disponibles para algunas
contribuciones.
Web Site
El sitio web de Postgres (postgresql.org) contiene información que algunas
distribuciones no incluyen. Hay un catálogo llamado mhonarc que contiene el
histórico de las listas de correo electrónico. Aquí podrá encontrar bastante
información.
Listas de Correo
La lista de correo pgsql-general (mailto:[email protected]) (archive
(http://www.PostgreSQL.ORG/mhonarc/pgsql-general/)) es un buen lugar para
contestar sus preguntas.
7
Capítulo 1. Introduction
Usted!
Postgres es un producto de código abierto . Como tal, depende de la comunidad
de usuarios para su soporte. A medida que empieze a usar Postgres, empezará a
depender de otros para que le ayuden, ya sea por medio de documentación o en las
listas de correo. Considere contribuir lo que aprenda. Si aprende o descubre algo
que no esté documentado, escríbalo y contribuya. Si añade nuevas características
al código, hágalas saber.
Aun aquellos con poca o ninguna experiencia pueden proporcionar correcciones y
cambios menores a la documentación, lo que es una buena forma de empezar. El
pgsql-docs (mailto:[email protected]) (archivo
(http://www.PostgreSQL.ORG/mhonarc/pgsql-docs/)) de la lista de correos es un
buen lugar para comenzar sus pesquisas.
1.5. Terminología
En la documentación siguiente, sitio (o site) se puede interpretar como la máquina en la
que está instalada Postgres. Dado que es posible instalar más de un conjunto de bases
de datos Postgres en una misma máquina, este término denota, de forma más precisa,
cualquier conjunto concreto de programas binarios y bases de datos de Postgres
instalados.
El superusuario de Postgres es el usuario llamado postgres que es dueño de los
ficheros de la bases de datos y binarios de Postgres. Como superusuario de la base de
datos, no le es aplicable ninguno de los mecanismos de protección y puede acceder a
cualquiera de los datos de forma arbitraria. Además, al superusuario de Postgres se le
permite ejecutar programas de soporte que generalmente no están disponibles para
todos los usuarios. Tenga en cuenta que el superusuario de Postgres no es el mismo que
el superusuario de Unix (que es conocido como root). El superusuario debería tener un
identificador de usuario (UID) distinto de cero por razones de seguridad.
El administrador de la base de datos (database administrator) o DBA, es la persona
8
Capítulo 1. Introduction
responsable de instalar Postgres con mecanismos para hacer cumplir una política de
seguridad para un site. El DBA puede añadir nuevos usuarios por el método descrito
más adelante y mantener un conjunto de bases de datos plantilla para usar concreatedb.
El postmaster es el proceso que actúa como una puerta de control (clearing-house) para
las peticiones al sistema Postgres. Las aplicaciones frontend se conectan al postmaster,
que mantiene registros de los errores del sistema y de la comunicación entre los
procesos backend. El postmaster puede aceptar varios argumentos desde la línea de
órdenes para poner a punto su comportamiento. Sin embargo, el proporcionar
argumentos es necesario sólo si se intenta trabajar con varios sitios o con uno que no se
ejecuta a la manera por defecto.
El backend de Postgres (el programa ejecutable postgres real) lo puede ejecutar el
superusuario directamente desde el intérprete de órdenes de usuario de Postgres (con el
nombre de la base de datos como un argumento). Sin embargo, hacer esto elimina el
buffer pool compartido y bloquea la tabla asociada con un postmaster/sitio, por ello
esto no está recomendado en un sitio multiusuario.
1.6. Notación
“...” o /usr/local/pgsql/ delante de un nombre de fichero se usa para representar
el camino (path) al directorio home del superusuario de Postgres.
En la sinopsis, los corchetes (“[” y “]”) indican una expresión o palabra clave opcional.
Cualquier cosa entre llaves (“{” y “}”) y que contenga barras verticales (“|”) indica que
debe elegir una de las opciones que separan las barras verticales.
En los ejemplos, los paréntesis (“(” y “)”) se usan para agrupar expresiones booleanas.
“|” es el operador booleano OR.
Los ejemplos mostrarán órdenes ejecutadas desde varias cuentas y programas. Las
órdenes ejecutadas desde la cuenta del root estarán precedidas por “>”. Las órdenes
ejecutadas desde la cuenta del superusuario de Postgres estarán precedidas por “%”,
mientras que las órdenes ejecutadas desde la cuenta de un usuario sin privilegios
estarán precedidas por “$”. Las órdenes de SQL estarán precedidas por “=>” o no
9
Capítulo 1. Introduction
10
Capítulo 1. Introduction
• Por lo que el autor sabe, las suposiciones que Postgres hace sobre las fechas que se
escriben usando dos números para el año están documentadas en la Guía del Usuario
(http://www.postgresql.org/docs/user/datatype.htm) en el capítulo de los tipos de
datos. Para años escritos con dos números, la transición significativa es 1970, no el
año 2000; ej. “70-01-01” se interpreta como “1970-01-01”, mientras que “69-01-01”
se interpreta como “2069-01-01”.
• Los problemas relativos al efecto 2000 en el SO (sistema operativo) sobre el que
esté instalado Postgres relacionados con la obtención de "la fecha actual" se pueden
propagar y llegar a parecer problemas sobre el efecto 2000 producidos por Postgres.
Diríjase a The Gnu Project (http://www.gnu.org/software/year2000.html) y a The Perl
Institute (http://language.perl.com/news/y2k.html) para leer una discusión más
profunda sobre el asunto del efecto 2000, particularmente en lo que tiene que ver con el
open source o código abierto, código por el que no hay que pagar.
11
Capítulo 1. Introduction
12
Capítulo 2. SQL
Este capítulo apareció originariamente como parte de la tesis doctoral de Stefan
Simkovics. (Simkovics, 1998).
1
Capítulo 2. SQL
Los comités ISO y ANSI han estado trabajando durante muchos años en la definición
de una versión muy ampliada del estándar original, llamado informalmente SQL2 o
SQL/92. Esta versión se convirtió en un estándar ratificado durante 1992: International
Standard ISO/IEC 9075:1992, Database Language SQL. SQL/92 es la versión a la que
normalmente la gente se refiere cuando habla de «SQL estándar». Se da una
descripción detallada de SQL/92 en Date and Darwen, 1997. En el momento de
escribir este documento, se está desarrollando un nuevo estándar denominado
informalmente como SQL3. Se plantea hacer de SQL un lenguaje de alcance completo
(e Turing-complete language), es decir, serán posibles todas las consultas computables,
(por ejemplo consultas recursivas). Esta es una tarea muy compleja y por ello no se
debe esperar la finalización del nuevo estándar antes de 1999.
2
Capítulo 2. SQL
Las tablas PART y SUPPLIER se pueden ver como entidades y SELLS se puede ver
como una relación entre un artículo particular y un proveedor particular.
Como veremos más tarde, SQL opera en las tablas tal como han sido definidas, pero
antes de ello estudiaremos la teoría del modelo relacional.
3
Capítulo 2. SQL
4
Capítulo 2. SQL
5
Capítulo 2. SQL
• SELECT (σ): extrae tuplas a partir de una relación que satisfagan una restricción
dada. Sea R una tabla que contiene un atributo A. σ A=a(R) = {t ∈ R | t(A) = a} donde
t denota una tupla de R y t(A) denota el valor del atributo A de la tupla t.
• PROJECT (π): extrae atributos (columnas) específicos de una relación. Sea R una
relación que contiene un atributo X. π X(R) = {t(X) | t ∈ R}, donde t(X) denota el
valor del atributo X de la tupla t.
• PRODUCT (×): construye el producto cartesiano de dos relaciones. Sea R una tabla
de rango (arity) k1 y sea S una tabla con rango (arity) k2. R × S es el conjunto de las
k1 + k2-tuplas cuyos primeros k1 componentes forman una tupla en R y cuyos últimos
k2 componentes forman una tupla en S.
• UNION (∪): supone la unión de la teoría de conjuntos de dos tablas. Dadas las
tablas R y S (y ambas deben ser del mismo rango), la unión R ∪ S es el conjunto de
las tuplas que están en R S o en las dos.
• INTERSECT (∩): Construye la intersección de la teoría de conjuntos de dos tablas.
Dadas las tablas R y S, R ∪ S es el conjunto de las tuplas que están en R y en S>. De
nuevo requiere que R y S tengan el mismo rango.
• DIFFERENCE (- or r): supone el conjunto diferencia de dos tablas. Sean R y S de
nuevo dos tablas con el mismo rango. R - S Es el conjunto de las tuplas que están en
R pero no en S.
Q
• JOIN ( ): conecta dos tablas por sus atributos comunes. Sea R una tabla con los
atributos A,B y C y sea S una tabla con los atributos C,D y E. Hay un atributo común
Q
para ambas relaciones, el atributo C. R S = π R.A,R.B,R.C,S.D,S.E(σ R.C=S.C(R × S)). ¿Qué
estamos haciendo aquí? Primero calculamos el producto cartesiano R × S. Entonces
6
Capítulo 2. SQL
seleccionamos las tuplas cuyos valores para el atributo común C sea igual (σ R.C = S.C).
Ahora tenemos una tabla que contiene el atributo C dos veces y lo corregimos
eliminando la columna duplicada.
Veamos las tablas que se han producido evaluando los pasos necesarios para una
join. Sean las siguientes tablas dadas:
R A | B | C S C | D | E
--+--+-- --+--+--
1 | 2 | 3 3 | a | b
4 | 5 | 6 6 | c | d
7 | 8 | 9
R x S A | B | R.C | S.C | D | E
--+--+---+---+--+--
1 | 2 | 3 | 3 | a | b
1 | 2 | 3 | 6 | c | d
4 | 5 | 6 | 3 | a | b
4 | 5 | 6 | 6 | c | d
7 | 8 | 9 | 3 | a | b
7 | 8 | 9 | 6 | c | d
7
Capítulo 2. SQL
• DIVIDE (÷): Sea R una tabla con los atributos A, B, C, y D y sea S una tabla con
los atributos C y D. Definimos la división como: R ÷ S = {t | ∀ ts ∈ S ∃ tr ∈ R tal que
tr(A,B)=t∧tr(C,D)=ts} donde tr(x,y) denota una tupla de la tabla R que consiste sólo
en los componentes x y y. Nótese que la tupla t consiste sólo en los componentes A
y B de la relación R.
Dadas las siguientes tablas
R A | B | C | D S C | D
--+--+--+-- --+--
a | b | c | d c | d
a | b | e | f e | f
b | c | e | f
e | d | c | d
e | d | e | f
a | b | d | e
R ÷ S se deriva como
A | B
--+--
a | b
e | d
8
Capítulo 2. SQL
Para una descripción y definición más detallada del Álgebra Relacional diríjanse a
[Ullman, 1988] o [Date, 1994].
Recalcar que hemos formulado todos estos operadores relacionales como capaces de
recuperar datos de la base de datos. Volvamos a nuestro ejemplo de la sección previa
(Operaciones en el Modelo de Datos Relacional) donde alguien quería conocer los
nombres de todos los proveedores que venden el artículo Tornillos. Esta pregunta se
responde utilizando el álgebra relacional con la siguiente operación:
Q Q
π SUPPLIER.SNAME(σ PART.PNAME=’Tornillos’(SUPPLIER SELLS PART))
9
Capítulo 2. SQL
• El Cálculo Relacional de Tuplas The Tuple Relational Calculus (TRC), donde las
variables esperan tuplas.
10
Capítulo 2. SQL
11
Capítulo 2. SQL
2.4.1. Select
El comando más usado en SQL es la instrucción SELECT, que se utiliza para recuperar
datos. La sintaxis es:
SELECT [ALL|DISTINCT]
{ * | expr_1 [AS c_alias_1] [, ...
[, expr_k [AS c_alias_k]]]}
FROM table_name_1 [t_alias_1]
[, ... [, table_name_n [t_alias_n]]]
[WHERE condition]
[GROUP BY name_of_attr_i
[,... [, name_of_attr_j]] [HAVING condition]]
[{UNION [ALL] | INTERSECT | EXCEPT} SELECT ...]
[ORDER BY name_of_attr_i [ASC|DESC]
[, ... [, name_of_attr_j [ASC|DESC]]]];
Para recuperar todas las tuplas de la tabla PART donde el atributo PRICE es mayor que
10, formularemos la siguiente consulta:
SELECT * FROM PART
WHERE PRICE > 10;
y obtenemos la siguiente tabla:
PNO | PNAME | PRICE
12
Capítulo 2. SQL
---+---------+-----
3 | Cerrojos | 15
4 | Levas | 25
Utilizando "*" en la instrucción SELECT solicitaremos todos los atributos de la tabla.
Si queremos recuperar sólo los atributos PNAME y PRICE de la tabla PART
utilizaremos la instrucción:
SELECT PNAME, PRICE
FROM PART
WHERE PRICE > 10;
En este caso el resultado es:
PNAME | PRICE
--------+-----
Cerrojos | 15
Levas | 25
Nótese que la SELECT SQL corresponde a la "proyección" en álgebra relaciona, no a
la "selección" (vea Álgebra Relacional para más detalles).
Las cualificaciones en la clausula WHERE pueden también conectarse lógicamente
utilizando las palabras claves OR, AND, y NOT:
SELECT PNAME, PRICE
FROM PART
WHERE PNAME = ’Cerrojos’ AND
(PRICE = 0 OR PRICE < 15);
dará como resultado:
PNAME | PRICE
--------+-----
Cerrojos | 15
Las operaciones aritméticas se pueden utilizar en la lista de objetivos y en la clausula
WHERE. Por ejemplo, si queremos conocer cuanto cuestan si tomamos dos piezas de
un artículo, podríamos utilizar la siguiente consulta:
SELECT PNAME, PRICE * 2 AS DOUBLE
FROM PART
WHERE PRICE * 2 < 50;
y obtenemos:
13
Capítulo 2. SQL
PNAME | DOUBLE
--------+------
Tornillos | 20
Tuercas | 16
Cerrojos | 30
Nótese que la palabra DOBLE tras la palabra clave AS es el nuevo título de la segunda
columna. Esta técnica puede utilizarse para cada elemento de la lista objetivo para
asignar un nuevo título a la columna resultante. Este nuevo título recibe el calificativo
de "un alias". El alias no puede utilizarse en todo el resto de la consulta.
SNAME | PNAME
-----+-----
Smith | Tornillos
Smith | Tuercas
Jones | Levas
Adams | Tornillos
Adams | Cerrojos
Blake | Tuercas
14
Capítulo 2. SQL
Blake | Cerrojos
Blake | Levas
En la clausula FROM hemos introducido un alias al nombre para cada relación porque
hay atributos con nombre común (SNO y PNO) en las relaciones. Ahora podemos
distinguir entre los atributos con nombre común simplificando la adicción de un prefijo
al nombre del atributo con el nombre del alias seguido de un punto. La join se calcula
de la misma forma, tal como se muestra en Una Inner Join (Una Join Interna). Primero
el producto cartesiano: SUPPLIER × PART × SELLS Ahora seleccionamos
únicamente aquellas tuplas que satisfagan las condiciones dadas en la clausula
WHERE (es decir, los atributos con nombre común deben ser iguales). Finalmente
eliminamos las columnas repetidas (S.SNAME, P.PNAME).
15
Capítulo 2. SQL
Si queremos conocer cuántos artículos han sido vendidos por cada proveedor
formularemos la consulta:
SELECT S.SNO, S.SNAME, COUNT(SE.PNO)
FROM SUPPLIER S, SELLS SE
WHERE S.SNO = SE.SNO
GROUP BY S.SNO, S.SNAME;
16
Capítulo 2. SQL
y obtendremos:
SNO | SNAME | COUNT
---+-----+-----
1 | Smith | 2
2 | Jones | 1
3 | Adams | 2
4 | Blake | 3
Demos ahora una mirada a lo que está ocurriendo aquí. Primero, la join de las tablas
SUPPLIER y SELLS:
S.SNO | S.SNAME | SE.PNO
-----+------+-----
1 | Smith | 1
1 | Smith | 2
2 | Jones | 4
3 | Adams | 1
3 | Adams | 3
4 | Blake | 2
4 | Blake | 3
4 | Blake | 4
Ahora particionamos las tuplas en grupos reuniendo todas las tuplas que tiene el mismo
atributo en S.SNO y S.SNAME:
S.SNO | S.SNAME | SE.PNO
-----+------+-----
1 | Smith | 1
| 2
-----------------
2 | Jones | 4
-----------------
3 | Adams | 1
| 3
-----------------
4 | Blake | 2
| 3
| 4
17
Capítulo 2. SQL
2.4.1.5. Having
La clausula HAVING trabaja de forma muy parecida a la clausula WHERE, y se utiliza
para considerar sólo aquellos grupos que satisfagan la cualificación dada en la misma.
Las expresiones permitidas en la clausula HAVING deben involucrar funcionen
agregadas. Cada expresión que utilice sólo atributos planos deberá recogerse en la
clausula WHERE. Por otro lado, toda expresión que involucre funciones agregadas
debe aparecer en la clausula HAVING.
18
Capítulo 2. SQL
1 | Smith | 2
3 | Adams | 2
4 | Blake | 3
2.4.1.6. Subconsultas
En las clausulas WHERE y HAVING se permite el uso de subconsultas (subselects) en
cualquier lugar donde se espere un valor. En este caso, el valor debe derivar de la
evaluación previa de la subconsulta. El uso de subconsultas amplía el poder expresivo
de SQL.
Si queremos conocer los artículos que tienen mayor precio que el artículo llamado
’Tornillos’, utilizaremos la consulta:
SELECT *
FROM PART
WHERE PRICE > (SELECT PRICE FROM PART
WHERE PNAME=’Tornillos’);
El resultado será:
PNO | PNAME | PRICE
---+---------+-----
3 | Cerrojos | 15
4 | Levas | 25
Cuando revisamos la consulta anterior, podemos ver la palabra clave SELECT dos
veces. La primera al principio de la consulta - a la que nos referiremos como la
SELECT externa - y la segunda en la clausula WHERE, donde empieza una consulta
anidada - nos referiremos a ella como la SELECT interna. Para cada tupla de la
SELECT externa, la SELECT interna deberá ser evaluada. Tras cada evaluación,
19
Capítulo 2. SQL
20
Capítulo 2. SQL
Dará el resultado:
SNO | SNAME | CITY
---+-----+-----
2 | Jones | Paris
3 | Adams | Vienna
Aquí tenemos un ejemplo para INTERSECT:
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 1
INTERSECT
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 2;
que dará como resultado:
SNO | SNAME | CITY
---+-----+-----
2 | Jones | Paris
La única tupla devuelta por ambas partes de la consulta es la úni-
ca que tiene $SNO=2$.
Finalmente, un ejemplo de EXCEPT:
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 1
EXCEPT
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 3;
que dará como resultado:
SNO | SNAME | CITY
---+-----+-----
2 | Jones | Paris
3 | Adams | Vienna
21
Capítulo 2. SQL
22
Capítulo 2. SQL
• INTEGER: entero binario con signo de palabra completa (31 bits de precisión).
• SMALLINT: entero binario con signo de media palabra (15 bits de precisión).
• DECIMAL (p[,q]): número decimal con signo de p dígitos de precisión, asumiendo
q a la derecha para el punto decimal. (15 ≥ p ≥ qq ≥ 0). Si q se omite, se asume
que vale 0.
• FLOAT: numérico con signo de doble palabra y coma flotante.
• CHAR(n): cadena de caracteres de longitud fija, de longitud n.
• VARCHAR(n): cadena de caracteres de longitud variable, de longitud máxima n.
23
Capítulo 2. SQL
El índice creado se mantiene automáticamente. es decir, cada vez que una nueva tupla
se inserte en la relación SUPPLIER, se adaptará el índice I. Nótese que el único cambio
que un usuario puede percibir cuando se crea un índice es un incremento en la
velocidad.
24
Capítulo 2. SQL
SELECT *
FROM London_Suppliers
WHERE P.PNAME = ’Tornillos’;
SNAME | PNAME
-----+-------
Smith | Tornillos
25
Capítulo 2. SQL
26
Capítulo 2. SQL
27
Capítulo 2. SQL
2.4.3.2. Update
Para cambiar uno o más valores de atributos de tuplas en una relación, se utiliza el
comando UPDATE. La sintaxis es:
UPDATE table_name
SET name_of_attr_1 = value_1
[, ... [, name_of_attr_k = value_k]]
WHERE condition;
Para cambiar el valor del atributo PRICE en el artículo ’Tornillos’ de la relación PART,
utilizamos:
UPDATE PART
SET PRICE = 15
WHERE PNAME = ’Tornillos’;
El nuevo valor del atributo PRICE de la tupla cuyo nombre es ’Tornillos’ es ahora 15.
2.4.3.3. Delete
Para borrar una tupla de una tabla particular, utilizamos el comando DELETE FROM.
La sintaxis es:
28
Capítulo 2. SQL
• Hay consultas que no se pueden formular utilizando SQL puro (por ejemplo, las
consultas recursivas). Para ser capaz de realizar esas consultas necesitamos un
lenguaje de host de mayor poder expresivo que SQL.
• Simplemente queremos acceder a una base de datos desde una aplicación que está
escrita en el lenguaje del host (p.e. un sistema de reserva de billetes con una interface
29
Capítulo 2. SQL
gráfica escrita en C, y la información sobre los billetes está almacenada en una base
de datos que puede accederse utilizando SQL embebido).
30
Capítulo 3. Arquitectura
31
Capítulo 3. Arquitectura
32
Capítulo 4. Empezando
¿Cómo empezar a trabajar con Postgres?
Algunos de los pasos necesarios para usar Postgres pueden ser realizados por cualquier
usuario, y algunos los deberá realizar el administrador de la base de datos. Este
administrador es la persona que instaló el software, creó los directorios de las bases de
datos e inició el proceso postmaster. Esta persona no tiene que ser el superusuario Unix
(“root”) o el administrador del sistema. Una persona puede instalar y usar Postgres sin
tener una cuenta especial o privilegiada
Si está instalando Postgres, consulte las instrucciones de instalación en la Guía de
Administración y regrese a esta guía cuando haya concluido la instalación.
Mientras lee este manual, cualquier ejemplo que vea que comience con el carácter “%”
son órdenes que se escribirán en el la línea de órdenes de Unix. Los ejemplos que
comienzan con el caracter “*” son órdenes en el lenguaje de consulta Postgres,
Postgres SQL.
33
Capítulo 4. Empezando
ruta de órdenes. Si usa una variante del C shell de Berkeley, tal como tcsh o csh, deberá
añadir
en el archivo .login de su directorio personal. Si usa una variante del Bourne shell, tal
como sh, ksh o bash entonces deberá añadir
% PATH=/usr/local/pgsql/bin:$PATH
% export PATH
34
Capítulo 4. Empezando
% psql template1
Connection to database ’postgres’ failed.
connectDB() failed: Is the postmaster running and accepting connections
at ’UNIX Socket’ on port ’5432’?
35
Capítulo 4. Empezando
% createdb mydb
Si no cuenta con los privilegios requeridos para crear bases de datos, verá lo siguiente:
% createdb mydb
NOTICE:user "su nombre de usuario" is not allowed to create/destroy database
createdb: database creation failed on mydb.
36
Capítulo 4. Empezando
% psql mydb
mydb=>
Este prompt indica que el monitor está listo y puede escribir sus consultas SQL dentro
de un espacio de trabajo mantenido por el monitor. El programa psql responde a los
códigos de escape que empiezan por el carácter “\”. Por ejemplo, puede obtener la
ayuda acerca de la sintaxis de varias órdenes SQL Postgres escribiendo:
mydb=> \h
37
Capítulo 4. Empezando
Una vez que haya terminado de introducir consultas, puede pasar el contenido del
espacio de trabajo al servidor Postgres escribiendo:
mydb=> \g
Esto le dice al servidor que procese la consulta. Si termina su consulta con un punto y
coma, la “\g” no es necesaria. psql procesará automáticamente las consultas terminadas
con punto y coma. Para leer consultas desde un archivo, digamos myFile, en lugar de
introducirlas interactivamente, escriba:
mydb=> \i nombreDelFichero
mydb=> \q
y psql terminará y volverá a la línea de órdenes. (Para conocer más códigos de escape,
escriba \h en el prompt del monitor). Se pueden utilizar espacios en blanco (por
ejemplo espacios, tabulador y el carácter de nueva línea) en las consultas SQL. Las
líneas simples comentadas comienzan por “–”. Lo que haya después de los guiones
hasta el final de línea será ignorado. Los comentarios múltiples y los que ocupan más
de una línea se señalan con “/* ... */”
% dropdb mydb
Esta acción elimina físicamente todos los archivos Unix asociados a la base de datos y
no pueden recuperarse, así que deberá hacerse con precaución.
38
Capítulo 5. El Lenguaje de consultas
El lenguaje de consultas de Postgres Postgres es una variante del estándar SQL3 Tiene
muchas extensiones, tales como tipos de sistema extensibles, herencia, reglas de
producción y funciones. Estas son características tomadas del lenguaje de consultas
original de Postgres (PostQuel). Ésta sección proporciona un primer vistazo de cómo
usar Postgres SQL para realizar operaciones sencillas. La intención de este manual es
simplemente la de proporcionarle una idea de nuestra versión de SQL y no es de
ningún modo un completo tutorial acerca de SQL. Se han escrito numerosos libros
sobre SQL, incluyendo [MELT93] and [DATE97]. Tenga en cuenta que algunas
características del lenguaje son extensiones del estándar ANSI.
% cd /usr/local/pgsql/src/tutorial
% psql -s mydb
Welcome to the POSTGRESQL interactive sql monitor:
Please read the file COPYRIGHT for copyright terms of POSTGRESQL
mydb=> \i basics.sql
39
Capítulo 5. El Lenguaje de consultas
5.2. Conceptos
La noción fundamental en Postgres es la de clase, que es una colección de instancias de
un objeto. Cada instancia tiene la misma colección de atributos y cada atributo es de un
tipo específico. Más aún, cada instancia tiene un identificador de objeto (OID)
permanente, que es único a lo largo de toda la instalación. Ya que la sintaxis SQL hace
referencia a tablas, usaremos los términos tabla y clase indistintamente. Asimismo ,una
filaSQL es una instancia y las columnas SQL son atributos. Como ya se dijo
anteriormente, las clases se agrupan en bases de datos y una colección de bases de
datos gestionada por un único proceso postmaster constituye una instalación o sitio.
40
Capítulo 5. El Lenguaje de consultas
Tenga en cuenta que las palabras clave y los identificadores son sensibles a las
mayúsculas y minúsculas. Los identificadores pueden llegar a ser sensibles a
mayúsculas o minúsculas si se les pone entre dobles comillas, tal como lo permite
SQL92. Postgres SQL soporta los tipos habituales de SQL como: int, float, real,
smallint, char(N), varchar(N), date, time, y timestamp, así como otros de tipo general y
otros con un rico conjunto de tipos geométricos. Tal como veremos más tarde, Postgres
puede ser configurado con un número arbitrario de tipos de datos definidos por el
usuario. Consecuentemente, los nombres de tipo no son sintácticamente palabras clave,
excepto donde se requiera para soportar casos especiales en el estándar SQL92 . Yendo
más lejos, el comando Postgres CREATEes idéntico al comando usado para crear una
tabla en el sistema relacional de siempre . Sin embargo, veremos que las clases tienen
propiedades que son extensiones del modelo relacional.
También puede usar el comando copy para cargar grandes cantidades de datos desde
ficheros (ASCII) . Generalmente esto suele ser más rápido porque los datos son leídos
(o escritos) como una única transacción directamente a o desde la tabla destino. Un
ejemplo sería:
41
Capítulo 5. El Lenguaje de consultas
donde el path del fichero origen debe ser accesible al servidor backend , no al cliente,
ya que el servidor lee el fichero directamente
+---------+------+------+----+--------+
|city | temp_lo | temp_hi | prcp | date |
+---------+------+------+----+--------+
|San Francisco | 46 | 50 | 0.25 | 11-27-1994 |
+---------+------+------+----+--------+
|San Francisco | 43 | 57 | 0 | 11-29-1994 |
+---------+------+------+----+--------+
|Hayward | 37 | 54 | | 11-29-1994 |
+---------+------+------+----+--------+
Puede especificar cualquier expresión en la lista de destino. Por ejemplo, puede hacer:
42
Capítulo 5. El Lenguaje de consultas
da como resultado:
+---------+------+------+----+--------+
|city | temp_lo | temp_hi | prcp | date |
+---------+------+------+----+--------+
|San Francisco | 46 | 50 | 0.25 | 11-27-1994 |
+---------+------+------+----+--------+
Como apunte final, puede especificar que los resultados de un select puedan ser
devueltos de manera ordenada o quitando las instancias duplicadas.
Esto forma de manera implícita un comando create, creándose una nueva clase temp
con el atributo names y types especificados en la lista destino del comando select into.
43
Capítulo 5. El Lenguaje de consultas
+---------+---+----+----------+---+----+
|city | low | high | city | low | high |
+---------+---+----+----------+---+----+
|San Francisco | 43 | 57 | San Francisco | 46 | 50 |
+---------+---+----+----------+---+----+
|San Francisco | 37 | 54 | San Francisco | 46 | 50 |
+---------+---+----+----------+---+----+
44
Capítulo 5. El Lenguaje de consultas
Nota: : Los matices de este join están en que la cualificación es una expresión
verdadera definida por el producto cartesiano de las clases indicadas en la
consulta. Para estas instancias en el producto cartesiano cuya cualificación sea
verdadera, Postgres calcula y devuelve los valores especificados en la lista de
destino. Postgres SQL no da ningún significado a los valores duplicados en este
tipo de expresiones. Esto significa que Postgres en ocasiones recalcula la misma
lista de destino varias veces. Esto ocurre frecuentemente cuando las expresiones
booleanas se conectan con un "or". Para eliminar estos duplicados, debe usar la
declaración select distinct .
En este caso, tanto W1 como W2 son sustituidos por una instancia de la clase weather y
se extienden por todas las instancias de la clase. (En la terminología de la mayoría de
los sistemas de bases de datos W1 y W2 se conocen como range variables (variables
de rango).) Una consulta puede contener un número arbitrario de nombres de clases y
sustituciones.
5.8. Actualizaciones
Puede actualizar instancias existentes usando el comando update. Suponga que
descubre que la lectura de las temperaturas el 28 de Noviembre fue 2 grados superior a
la temperatura real. Puede actualizar los datos de esta manera:
UPDATE weather
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
WHERE date > ’11/28/1994’;
45
Capítulo 5. El Lenguaje de consultas
5.9. Borrados
Los borrados se hacen usando el comando delete:
Todos los registros de weather pertenecientes a Hayward son borrados. Debería ser
precavido con las consultas de la forma
Sin una cualificación, delete simplemente borrará todas las instancias de la clase dada,
dejándola vacía. El sistema no pedirá confirmación antes de hacer esto.
46
Capítulo 5. El Lenguaje de consultas
Si queremos saber qué ciudad o ciudades donde se dieron estas temperaturas, podemos
probar
pero no funcionará debido a que la función max() no puede ser usada en where. Sin
embargo, podemos replantar la consulta para llevar a cabo lo que buscamos. En este
caso usando una subseleccion:
SELECT city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weat-
her);
que nos devuelve una fila por ciudad. Podemos filtrar estas filas agrupadas usando
having:
47
Capítulo 5. El Lenguaje de consultas
que nos da los mismos resultados, pero de ciudades con temperaturas bajo cero.
Finalmente, si sólo nos interesan las ciudades cuyos nombres empiecen por ’P’,
deberíamos hacer :
Tenga en cuenta que podemos aplicar la restricción del nombre de ciudad en where, ya
que no necesita funciones de conjunto. Esto es más eficaz que añadir la restricción a
having,debido a que evitamos hacer los cálculos de grupo para todas las filas que no
pasan el filtro de where .
48
Capítulo 6. Características Avanzadas
de SQL en Postgres
Habiendo cubierto los aspectos básicos de Postgre SQLpara acceder a los datos,
discutiremos ahora aquellas características de Postgres que los distinguen de los
gestores de bases de datos convecionales. Estas características incluyen herencia, time
travel (viaje en el tiempo) y valores no-atómicos de datos (atributos basados en
vectores y conjuntos). Los ejemplos de esta sección pueden encontrarse también en
advance.sql en el directorio del tutorial. (Consulte el Capítulo 5 para ver la forma de
utilizarlo).
6.1. Herencia
Creemos dos clases. La clase capitals contiene las capitales de los estados, las cuales
son también ciudades. Naturalmente, la clase capitals debería heredar de cities.
En este caso, una instancia de capitals hereda todos los atributos (name, population y
altitude) de su padre, cities. El tipo del atributo name (nombre) es text, un tipo nativo
de Postgres para cadenas ASCII de longitud variable. El tipo del atributo population
(población) es float, un tipo de datos, también nativo de Postgres , para números de
punto flotante de doble precisión. Las clase capitals tiene un atributo extra, state, que
muestra a qué estado pertenecen. En Postgres, una clase puede heredar de ninguna o
49
Capítulo 6. Características Avanzadas de SQL en Postgres
varias otras clases, y una consulta puede hacer referencia tanto a todas las instancias de
una clase como a todas las instancias de una clase y sus descendientes.
+-------+-------+
|name | altitude |
+-------+-------+
|Las Vegas | 2174 |
+-------+-------+
|Mariposa | 1953 |
+-------+-------+
Por otro lado, para encontrar los nombres de todas las ciudades, incluídas las capitales
estatales, que estén situadas a una altitud de 500 o más pies, la consulta es:
which returns:
+-------+-------+
|name | altitude |
+-------+-------+
|Las Vegas | 2174 |
+-------+-------+
50
Capítulo 6. Características Avanzadas de SQL en Postgres
|Mariposa | 1953 |
+-------+-------+
|Madison | 845 |
+-------+-------+
Aquí el “*” después de cities indica que la consulta debe realizarse sobre cities y todas
las clases que estén por debajo de ella en la jerarquía de la herencia. Muchos de los
comandos que ya hemos discutido (select, and>upand> and delete) brindan soporte a
esta notación de “*” al igual que otros como alter.
6.2.1. Vectores
Postgres permite que los atributos de una instancia sean definidos como vectores
multidimensionales de longitud fija o variable. Puede crear vectores de cualquiera de
los tipos base o de tipos definidos por el usuario. Para ilustrar su uso, creemos primero
una clase con vectores de tipos base.
51
Capítulo 6. Características Avanzadas de SQL en Postgres
La consulta de arriba creará una clase llamada SAL_EMP con una cadena del tipo text
(name),un vector unidimensional del tipo int4 (pay_by_quarter), el cual representa el
salario trimestral del empleado y un vector bidimensional del tipo text (schedule), que
representa la agenda semanal del empleado. Ahora realizamos algunos INSERTSs; note
que cuando agregamos valores a un vector, encerramos los valores entre llaves y los
separamos mediante comas. Si usted conoce C, esto no es distinto a la sintaxis para
inicializar estructuras.
SELECT name
FROM SAL_EMP
WHERE SAL_EMP.pay_by_quarter[1] <>
SAL_EMP.pay_by_quarter[2];
+----+
|name |
+----+
|Carol |
+----+
52
Capítulo 6. Características Avanzadas de SQL en Postgres
La siguiente consulta recupera el pago del tercer trimestre de todos los empleados:
+----------+
|pay_by_quarter |
+----------+
|10000 |
+----------+
|25000 |
+----------+
SELECT SAL_EMP.schedule[1:2][1:1]
FROM SAL_EMP
WHERE SAL_EMP.name = ’Bill’;
+-------------+
|schedule |
+-------------+
|{{"meeting"},{""}} |
+-------------+
53
Capítulo 6. Características Avanzadas de SQL en Postgres
Postgres soporta la idea del viaje en el tiempo. Esto permite a un usuario correr
consultas históricas. Por ejemplo, para encontrar la población actual de la ciudad de
Mariposa, usted debería realizar la siguiente consulta:
+------+--------+-------+
|name | population | altitude |
+------+--------+-------+
|Mariposa | 1320 | 1953 |
+------+--------+-------+
54
Capítulo 6. Características Avanzadas de SQL en Postgres
+------+--------+
|name | population |
+------+--------+
|Mariposa | 1200 |
+------+--------+
|Mariposa | 1320 |
+------+--------+
El valor predeterminado para el comienzo del intervalo de tiempo es el menor valor que
pueda representar el sistema, mientras que el valor predeterminado para el final del
intervalo es la hora actual. Por lo tanto, el intervalo de tiempo utilizado en la consulta
anterior podría haberse abreviado como “[,].”
55
Bibliografía
Selección de referencias y lecturas sobre SQL y Postgres.
A Guide to the SQL Standard , Date and Darwen, 1997 , A user’s guide to the
standard database language SQL , 4, C. J. Date y Hugh Darwen, 0-201-96426-0,
1997, Addison-Wesley, 1997.
Understanding the New SQL , Melton and Simon, 1993 , A complete guide, Jim
Melton y Alan R. Simon, 1-55860-245-3, 1993, Morgan Kaufmann, 1993.
Abstract
Accessible reference for SQL features.
56
Bibliografía
The PostgreSQL Developer’s Guide , The Developer’s Guide , Editado por Thomas
Lockhart, 1998-10-01, The PostgreSQL Global Development Group.
The PostgreSQL Tutorial Introduction , The Tutorial , Editado por Thomas Lockhart,
1998-10-01, The PostgreSQL Global Development Group.
The PostgreSQL User’s Guide , The User’s Guide , Editado por Thomas Lockhart,
1998-10-01, The PostgreSQL Global Development Group.
The Postgres95 User Manual , Yu and Chen, 1995 , A. Yu y J. Chen, The POSTGRES
Group , Sept. 5, 1995, University of California, Berkeley CA.
57
Bibliografía
Procedimientos y Articulos
Partial indexing in POSTGRES: research project , Olson, 1993 , Nels Olson, 1993,
UCB Engin T7.49.1993 O676, University of California, Berkeley CA.
The Postgres Data Model , Rowe and Stonebraker, 1987 , L. Rowe y M. Stonebraker,
Sept. 1987, VLDB Conference, Brighton, England, 1987.
The Design of the Postgres Rules System, Stonebraker, Hanson, Hong, 1987 , M.
Stonebraker, E. Hanson, y C. H. Hong, Feb. 1987, Conference on Data
Engineering, Los Angeles, CA, IEEE, 1987.
The Postgres Storage System , Stonebraker, 1987 , M. Stonebraker, Sept. 1987, VLDB
Conference, Brighton, England, 1987.
58
Bibliografía
59