Taller SQL Postgresql

29
Taller de SQL utilizando el SGBD Postgres ISAAC BERNARDO CAICEDO CASTRO Ingeniero informático, Universidad Pontificia Bolivariana Montería, Colombia Magíster en Ingeniería - Área: Sistemas y Computación, Universidad de los Andes Bogotá, Colombia Profesor adscrito a la facultad de ciencias básicas e ingeniería, Universidad de Córdoba Montería, Colombia Montería - 2009

Transcript of Taller SQL Postgresql

Page 1: Taller SQL Postgresql

Taller de SQL utilizando el SGBDPostgres

ISAAC BERNARDO CAICEDO CASTRO

Ingeniero informático,Universidad Pontificia Bolivariana

Montería, Colombia

Magíster en Ingeniería - Área: Sistemas y Computación,Universidad de los Andes

Bogotá, Colombia

Profesor adscrito a la facultad de ciencias básicas e ingeniería,Universidad de Córdoba

Montería, Colombia

Montería - 2009

Page 2: Taller SQL Postgresql
Page 3: Taller SQL Postgresql

Índice de figuras

3.1. Resultado de la primera aproximación para determinar los territo-rios vecinos a otro determinado . . . . . . . . . . . . . . . . . . . 17

3.2. Yoloma no es adyacente a Sonoma . . . . . . . . . . . . . . . . . 183.3. Proveedores del servicio de la Internet . . . . . . . . . . . . . . . 19

I

Page 4: Taller SQL Postgresql

II ÍNDICE DE FIGURAS

Page 5: Taller SQL Postgresql

Índice de cuadros

2.1. Listado de bases de datos . . . . . . . . . . . . . . . . . . . . . . 52.2. Listado de tablas . . . . . . . . . . . . . . . . . . . . . . . . . . 6

3.1. Listado de la tabla clima . . . . . . . . . . . . . . . . . . . . . . 93.2. Proyección extendida en SQL . . . . . . . . . . . . . . . . . . . . 103.3. Uso de la cláusula WHERE en SQL . . . . . . . . . . . . . . . . . 103.4. Ordenación de datos en SQL . . . . . . . . . . . . . . . . . . . . 113.5. Ordenación de datos en SQL por varias columnas . . . . . . . . . 113.6. Resultado de una consulta con filas repetidas . . . . . . . . . . . . 123.7. Uso del comando distinct . . . . . . . . . . . . . . . . . . . . . . 123.8. Uso de la función COUNT . . . . . . . . . . . . . . . . . . . . . . 123.9. Uso de la función COUNT . . . . . . . . . . . . . . . . . . . . . . 133.10. Uso de la función MAX . . . . . . . . . . . . . . . . . . . . . . . 133.11. Uso de la función MAX en una subconsulta . . . . . . . . . . . . 143.12. Uso de la función MAX con agrupaciones . . . . . . . . . . . . . 143.13. Uso de HAVING . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.14. Determinación del territorio donde reside un punto . . . . . . . . 153.15. Determinación del territorio donde reside un punto . . . . . . . . 153.16. Primera aproximación de una consulta para determinar qué territo-

rios son vecinos . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.17. Consulta para determinar qué territorios son vecinos . . . . . . . . 17

III

Page 6: Taller SQL Postgresql

IV ÍNDICE DE CUADROS

Page 7: Taller SQL Postgresql

Índice general

1. Objetivos 1

2. Creando una base de datos 32.1. Creación de una base de datos . . . . . . . . . . . . . . . . . . . 42.2. Creación de las tablas de una base de datos . . . . . . . . . . . . 42.3. Poblando una base de datos . . . . . . . . . . . . . . . . . . . . . 6

3. Consultas 93.1. Primeros pasos . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.2. Funciones agregadas . . . . . . . . . . . . . . . . . . . . . . . . 123.3. SQL y las bases de datos espaciales . . . . . . . . . . . . . . . . 14

3.3.1. Identificar el territorio geográfico en el que se encuentra unpunto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.3.2. Consultado qué polígonos son vecinos de otro . . . . . . . 16

V

Page 8: Taller SQL Postgresql

VI ÍNDICE GENERAL

Page 9: Taller SQL Postgresql

Capítulo 1

Objetivos

Los objetivos del presente taller consisten en aprehender:

A crear y gestionar bases de datos con el SGBD denominado Postgres.

El lenguaje SQL.

1

Page 10: Taller SQL Postgresql

2 CAPÍTULO 1. OBJETIVOS

Page 11: Taller SQL Postgresql

Capítulo 2

Creando una base de datos

Después de instalar el SGBD Postgres, se tiene a disposición el usuario post-gres y la base de datos del mismo nombre.

El SGBD Postgres tiene una arquitectura cliente / servidor, como la WWW,donde los navegadores son los clientes que solicitan páginas HTML y otros ob-jetos, a programas de computadoras conocidos como servidores Web, donde talessolicitudes y objetos se transmiten a través de una red de computadoras basada enel paquete de protocolos TCP/IP, particularmente la Internet.

Tomando en cuenta la anterior analogía, el cliente en este caso se llama psql ynos permite comunicarnos con un servidor postgres de la siguiente manera:

$>PSQL -H <DIRECCIÓN IP O NOMBRE DEL SERVIDOR><BASE DE DATOS><USUARIO>En el siguiente ejemplo, se establece una conexión con el servidor de base de

datos local, correspondiente con la la dirección IP 127.0.0.1 (localhost), y con labase de datos postgres a través del usuario del mismo nombre. La primera respues-ta del servidor es una solicitud de la contraseña correspondiente con el usuario encuestión, y si se le envía al servidor la que es correcta, éste le responde con in-formación inicial que le es útil al usuario y/o administrador de la base de datos,concluyendo con una interfaz de entrada de declaraciones SQL, compuesta porel nombre la base datos y seguido por los símbolos =#, como se puede apreciar:POSTGRES=#, esto indica que el cliente está conectado a la base datos denominadapostgres.

\$>psql -h 127.0.0.1 postgres postgresContraseña para usuario postgres:Bienvenido a psql 8.3.3, la terminalinteractiva de PostgreSQL.

Digite: \copyright para ver los términos de distribución

3

Page 12: Taller SQL Postgresql

4 CAPÍTULO 2. CREANDO UNA BASE DE DATOS

\h para ayuda de órdenes SQL\? para ayuda de órdenes psql\g o punto y coma («;») para ejecutar la consulta\q para salir

Precaución: El código de página de la consola (850)difiere del código de página deWindows (1252).Los caracteres de 8 bits puedenfuncionar incorrectamente. Vea lapágina de referencia depsql «Notes for Windows users»para obtener más detalles.

postgres=#

2.1. Creación de una base de datos

Para crear una base de datos se utiliza la declaración: CREATE DATABASE <BA-SE DE DATOS> y con el comando \C <BASE DE DATOS> se establece la conexióncon dicha base de datos, como en el ejemplo siguiente, en el cual se crea una basede datos denominada MYDB y luego se realiza una conexión con ésta.

postgres=# create database mydb;CREATE DATABASEpostgres=# \c mydb;Ahora está conectado a la base de datos «mydb».mydb=#

Adicionalmente, si se desea conocer las bases de datos creadas y administradaspor el SGBD Postgres, se debe utilizar el comando \l, con el cual se desplegaría enla consola del cliente psql un resultado similar al del cuadro 2.1.

2.2. Creación de las tablas de una base de datos

Una vez creada la base de datos se pueden crear las tablas o relaciones de éstacon el comando CREATE TABLE. El siguiente código se debe copiar en un ficherodenominado MYDB.SQL.

-- mydb.sql

Page 13: Taller SQL Postgresql

2.2. CREACIÓN DE LAS TABLAS DE UNA BASE DE DATOS 5

Nombre Dueño CodificaciónagendaDB sadoc WIN1252mydb postgres WIN1252postgis postgres WIN1252postgres postgres WIN1252template_postgis postgres WIN1252template0 postgres WIN1252tiendavirtual melquisedec WIN1252

Cuadro 2.1: Listado de bases de datos generado por el comando \l.

create table ciudades (ciudad varchar(80) not null,ubicacion point not null,primary key (ciudad)

);

create table clima (ciudad varchar(80) not null,fecha date not null,temperaturaMinima integer,temperaturaMaxima integer,precipitacion double precision,primary key (ciudad, fecha),foreign key (ciudad)references ciudades(ciudad)on delete cascadeon update cascade

);

El fichero MYDB.SQL se debe mandar a ejecutar en el servidor así:

mydb=# \i mydb.sqlpsql:mydb.sql:5: NOTICE:CREATE TABLE / PRIMARY KEY crearáel índice implícito «ciudades_pkey»para la tabla «ciudades»

Page 14: Taller SQL Postgresql

6 CAPÍTULO 2. CREANDO UNA BASE DE DATOS

CREATE TABLEpsql:mydb.sql:18: NOTICE:CREATE TABLE / PRIMARY KEY crearáel índice implícito «clima_pkey»para la tabla «clima»CREATE TABLEmydb=#

Para verificar la creación de las tablas se debe utilizar el comando \dt cuyoresultado aparece en el cuadro 2.2.

Esquema Nombre Tipo Dueñopublic ciudades tabla postgrespublic clima tabla postgres

Cuadro 2.2: Listado de tablas generado por el comando \dt.

2.3. Poblando una base de datos

Para llenar o poblar una base de datos se utiliza la declaración INSERT INTO

<TABLA>. Las siguientes declaraciones deben escribirse en un fichero denominadoPOBLARMYDB.SQL.

-- poblarmydb.sql

insert into ciudades(ciudad,ubicacion)

values (’San Francisco’,’(-194.0, 53.0)’);

insert into ciudades(ciudad,ubicacion)

values (’Hayward’,’(-93.2, 43.6)’);

insert into clima(ciudad,temperaturaMinima,

Page 15: Taller SQL Postgresql

2.3. POBLANDO UNA BASE DE DATOS 7

temperaturaMaxima,precipitacion,fecha)

values (’San Francisco’,46, 50, 0.25,’1994-11-27’);

insert into clima(ciudad,temperaturaMinima,temperaturaMaxima,precipitacion,fecha)

values (’San Francisco’,43, 57, 0.0,’1994-11-29’);

insert into clima(ciudad,temperaturaMinima,temperaturaMaxima,fecha)

values (’Hayward’, 54, 37,’1994-11-29’);

Al ejecutar el fichero POBLARMYDB.SQL con el comando \i se obtiene:

mydb=# \i poblarmydb.sqlINSERT 0 1INSERT 0 1INSERT 0 1INSERT 0 1INSERT 0 1

Hasta esta parte se ha expuesto el lenguaje de definición de datos de SQL, enla siguiente sección se abordarán las declaraciones para consultar datos.

Page 16: Taller SQL Postgresql

8 CAPÍTULO 2. CREANDO UNA BASE DE DATOS

Page 17: Taller SQL Postgresql

Capítulo 3

Consultas

El lenguaje SQL está basado en el álgebra relacional y por esto las palabras re-servadas del lenguaje: SELECT, FROM y WHERE corresponden con las operaciones(de dicha álgebra) proyección, producto cartesiano y selección respectivamente.

3.1. Primeros pasos

Si se desea, por ejemplo, consultar la tabla CLIMA, basta con escribir en lainterfaz de comando la siguiente declaración:

SELECT * FROM CLIMA;El resultado se aprecia en el cuadro ??.

ciudad fecha temperaturaminima temperaturamaxima precipitacionSan Francisco 1994-11-27 46 50 0.25San Francisco 1994-11-29 43 57 0Hayward 1994-11-29 54 37

Cuadro 3.1: Listado de la tabla clima.

La anterior consulta es equivalente a:

select ciudad, fecha, temperaturaMinima,temperaturaMaxima, precipitacion

from clima;

También es posible hacer proyecciones con sobre columnas con base en cálculos,por ejemplo, una consulta interesante sería obtener el promedio de temperaturas en

9

Page 18: Taller SQL Postgresql

10 CAPÍTULO 3. CONSULTAS

cada ciudad, lo cual se realiza con la siguiente consulta y el resultado se visualizaen el cuadro 3.2.

select ciudad,(temperaturaMaxima + temperaturaMinima) / 2as temperaturaPromedio, fecha

from clima;

ciudad temperaturapromedio fechaSan Francisco 48 1994-11-27San Francisco 50 1994-11-29Hayward 45 1994-11-29

Cuadro 3.2: Cálculo en la proyección de un atributo.

Una consulta puede incluir condiciones en la declaración WHERE, de la mismamanera que la selección en el álgebra relacional, en ese orden de ideas, la conjun-ción, la disyunción y la negación se expresan mediante los operadores AND, OR yNOT en SQL. Por ejemplo, si se deseara obtener los estados climáticos de la ciu-dad de San Francisco con una precipitación superior a 0.0, la consulta sería así (elresultado se aprecia en el cuadro 3.3):

select *from climawhere ciudad = ’San Francisco’ and precipitacion > 0.0;

ciudad fecha temperaturaminima temperaturamaxima precipitacionSan Francisco 1994-11-27 46 50 0.25

Cuadro 3.3: Estados climáticos de la ciudad de San Francisco con precipitaciónsuperior a cero.

También, en SQL es posible obtener los datos ordenados por determinadascolumnas, por ejemplo, en la siguiente consulta se ordenan los datos por la columnaciudad (el resultado se aprecia en el cuadro 3.4):

select *from climaorder by ciudad;

Page 19: Taller SQL Postgresql

3.1. PRIMEROS PASOS 11

ciudad fecha temperaturaminima temperaturamaxima precipitacionHayward 1994-11-29 54 37San Francisco 1994-11-27 46 50 0.25San Francisco 1994-11-29 43 57 0

Cuadro 3.4: Listado de la tabla clima ordenado por la columna ciudad.

Las columnas se pueden ordenar por varias columnas, por ejemplo, por las co-lumnas CIUDAD y TEMPERATURAMAXIMA, tal y como se muestra a continuación(el resultado se aprecia en el cuadro 3.5):

select *from climaorder by ciudad, tempertauraMaxima;

ciudad fecha temperaturaminima temperaturamaxima precipitacionHayward 1994-11-29 54 37San Francisco 1994-11-29 43 57 0San Francisco 1994-11-27 46 50 0.25

Cuadro 3.5: Listado de la tabla climaordenado por las columnas CIUDAD y TEM-PERATURAMAXIMA.

Por otro lado, cuando el resultado de una consulta tiene filas o tuplas repetidasson mostradas todas, a pesar de que en la teoría el resultado es un conjunto, el cualcomo cualquier otro, no debería tener elementos repetidos, sin embargo, si no sedesean repeticiones en un listado se debe utilizar la palabra reservada en SQL paradicha función, la cual se llama DISTINCT. Para aclarar lo anterior tómese en cuentala siguiente consulta cuyo resultado aparece en el cuadro 3.6.

select ciudadfrom clima;

Si se utiliza la palabra reservada DISTINCT, como se ejemplariza a continua-ción, no se muestran en los resultados filas duplicadas (ver cuadro 3.7.

select distinct ciudadfrom clima;

Page 20: Taller SQL Postgresql

12 CAPÍTULO 3. CONSULTAS

ciudadSan FranciscoSan FranciscoHayward

Cuadro 3.6: Cuando se consultan las ciudades que se encuentran en la tabla CLIMA

la primera y segunda fila repiten el valor de San Francisco.

ciudadHaywardSan Francisco

Cuadro 3.7: Cuando se consultan las ciudades que se encuentran en la tabla CLIMA

utilizando el comando DISTINCT se evitan las repeticiones mostradas en el cuadro3.6.

3.2. Funciones agregadas

Las funciones agregadas a SQL son: COUNT, SUM, MAX, MIN y AVG y permi-ten realizar los cómputos de conteo, sumatoria, máximo, mínimo y media aritmé-tica respectivamente.

Por ejemplo, si se deseara contar todas las ciudades de la tabla del mismonombre la consulta apropiada sería la siguiente (el resultado aparece en el cuadro3.8):

select count(*)from ciudades;

count2

Cuadro 3.8: Uso de la función COUNT para contar las ciudades que están registra-das en la tabla del mismo nombre.

El ejemplo previo hizo un conteo de filas en la tabla ciudades y así determinóel número de éstas, pero si se desea hacer el mismo conteo en la tabla clima, esnecesario hacer uso del comando DISTINCT como se muestra a continuación (elresultado se muestra en el cuadro 3.9):

Page 21: Taller SQL Postgresql

3.2. FUNCIONES AGREGADAS 13

select count(distinct ciudad)from clima;

count2

Cuadro 3.9: Uso de la función COUNT para contar las ciudades que están registra-das en la tabla del mismo nombre.

Otra consulta interesante sería obtener la temperatura mínima más alta regis-trada en la base de datos, la declaración en SQL luciría así (el resultado aparece enel cuadro 3.10):

select max(temperaturaMinima)from clima;

max54

Cuadro 3.10: Uso de la función MAX para obtener la temperatura mínima más altaregistrada en la base de datos.

Pero si se desea saber en qué ciudad se registró la temperatura mínima másalta (ver cuadro 3.11) la consulta debe hacerse como se muestra a continuación, através de una subconsulta:

select ciudadfrom climawhere temperaturaMinima = (

select max(temperaturaMinima)from clima

);

Es importante agregar que estas funciones pueden utilizarse en combinacióncon la declaración GROUP BY. Por ejemplo, se puede visualizar la temperaturamínima más baja observada en cada ciudad, el resultado de esta consulta se observaen el cuadro 3.13.

Page 22: Taller SQL Postgresql

14 CAPÍTULO 3. CONSULTAS

ciudadHayward

Cuadro 3.11: Uso de la función MAX en una subconsulta para saber qué ciudad seregistró la temperatura mínima más alta.

ciudad maxHayward 54San Francisco 46

Cuadro 3.12: Uso de la función MAX con el comando de agrupación GROUP BY.

select ciudad, max(temperaturaMinima)from climagroup by ciudad;

De otra parte, las funciones agregadas a SQL no pueden utilizarse en la con-dición de declaración WHERE, sino en otra conocida como HAVING. Para aclararesto, tome en cuenta la siguiente consulta, cuyo resultado se aprecia en el cuadro??.

select ciudad, max(temperaturaMinima)FROM climaWHERE ciudad LIKE ’S\%’group by ciudadhaving max(temperaturaMinima) > 40;

ciudad maxSan Francisco 46

Cuadro 3.13: El resultado de esta consulta es filtrado por dos condiciones, unaexpuesta en una declaración WHERE y otra en la declaración HAVING.

3.3. SQL y las bases de datos espaciales

En la presente sección se explorará las funcionalidades de la base de datosespacial denominada POSTGIS. Primero se abordarán las consultas que permiten

Page 23: Taller SQL Postgresql

3.3. SQL Y LAS BASES DE DATOS ESPACIALES 15

determinar en qué territorio se encuentra un punto específico, y luego, se concluirácon la exposición consultas que permiten determinar los polígonos vecinos a unterritorio geográfico.

3.3.1. Identificar el territorio geográfico en el que se encuentra unpunto

Este ejemplo toma un punto, el (46.20N, 122.18W), para encontrar territoriogeográfico que lo contiene. La consulta que realiza lo anterior es la siguiente (suresultado se aprecia en el cuadro 3.14):

select countyfrom countyp020where distance(the_geom, ’point(-122.18 46.20)’) = 0;

countySkamania County

Cuadro 3.14: El resultado de la consulta muestra que el punto (46.20N, 122.18W)se encuentra en Skamania County.

Si se utiliza una función LINESTRING en vez de point, se puede determinar losterritorios que son interceptados por una línea, la cual en términos de geografíapodría coincidir con un río o una carretera. Tómese en cuenta la siguiente consulta(el resultado se muestra en el cuadro 3.15:

select countyfrom countyp020where distance(the_geom, ’linestring(-122.18 46.20, -122.00 45.00)’) = 0;

countySkamania CountyMultnomah CountyClackamas County

Cuadro 3.15: El resultado de la consulta muestra que el punto (46.20N, 122.18W)se encuentra en Skamania County.

Page 24: Taller SQL Postgresql

16 CAPÍTULO 3. CONSULTAS

3.3.2. Consultado qué polígonos son vecinos de otro

Las formas dentro de una tabla con datos espaciales pueden ser comparadasunas con otras. Para ello se utilizará la técnica de renombramiento de tablas pa-ra comparar una tabla consigo misma. Para ejemplarizar este tipo de consultas,suponiendo que se desea conocer los territorios geográficos vecinos Sonoma, unaprimera aproximación sería (el resultado de esta consulta se muestra en el cuadro3.17):

select a.countyfrom countyp020 a, countyp020 bwhere b.county like ’Sonoma County’ and a.the_geom && b.the_geom;

countyMendocino CountyLake CountyYolo CountyNapa CountySonoma CountyMarin CountySolano County

Cuadro 3.16: En el resultado de esta consulta se aprecian los territorios vecinos aSonoma, incluyendo a este mismo territorio y a Yolo que no es adyacente a éste,como se aprecia en las figura 3.1 y 3.2.

La consulta definitiva debe verificar que la distancia entre los territorios geo-gráficos sean cero para determinar que verdaderamente son vecinos, esta se apreciaa continuación y su resultado se muestra en el cuadro 3.17 y la figura 3.3.

select a.countyfrom countyp020 a, countyp020 bwhere b.county like ’Sonoma County’ and

a.the_geom && b.the_geom anddistance(a.the_geom, b.the_geom) = 0;

Page 25: Taller SQL Postgresql

3.3. SQL Y LAS BASES DE DATOS ESPACIALES 17

Figura 3.1: En el resultado de esta consulta se aprecian los territorios vecinos aSonoma, incluyendo a este mismo territorio y a Yolo que no es adyacente a éste

countyMendocino CountyLake CountyNapa CountySonoma CountyMarin CountySolano County

Cuadro 3.17: En el resultado de esta consulta se aprecian los territorios vecinosa Sonoma, incluyendo a este mismo territorio pero excluyendo a Yolo que no esadyacente a éste, como se aprecia en la figura 3.3.

Page 26: Taller SQL Postgresql

18 CAPÍTULO 3. CONSULTAS

Figura 3.2: Yoloma no es adyacente a Sonoma pero aparece en el resultado de laconsulta previa.

Page 27: Taller SQL Postgresql

3.3. SQL Y LAS BASES DE DATOS ESPACIALES 19

Figura 3.3: En el resultado de esta consulta se aprecian los territorios vecinos aSonoma incluyendo a este mismo territorio pero excluyendo a Yolo.

Page 28: Taller SQL Postgresql

20 CAPÍTULO 3. CONSULTAS

Page 29: Taller SQL Postgresql

Bibliografía

[1] Silberschatz, A., Korth, H., Sudarshan, S., Database system concepts, 4a Ed.,Wiley Publishing Inc., 2006.

[2] Powell, G., Beginning Database Design, 1a Ed., Wiley Publishing Inc, 2006.

[3] Neil, M., Stones, R., Beginning Databases with PostgreSQL: From Novice toProfessional, 2a Ed., Apress, 2005.

21