Está en la página 1de 86

Centro de Estudios Tecnolgicos Avanzados

Bienvenidos
CURSO DE POSTGRESQL DESARROLLADORES ELEMENTOS BASICOS

Euclides Figueroa efigueroah@gmail.com


1

Contenido Programtico

Arquitectura de PostgreSQL Instalacin de PostgreSQL (Linux/Windows) Iniciando, Deteniendo y Configurando Programas Clientes de PostgreSQL phppgadmin (apache,php,Postgresql) psql El programa psql

Contenido Programtico

Creando Bases de Datos Creando tablas definicin de columnas valores nulos indices claves primarias claves secundarias show tables valores nulos Insertando datos insert Reemplazando Valores (replace y update) Eliminando registros

Contenido Programtico

Consultando Registros La sentencia select inner, left, right - join alias consultas multitablas agrupando y sumarizando Operadores de PostgreSQL Funciones de PostgreSQL Usuarios y privilegios

Arquitectura de PostgreSQL
PostgreSQL Server: El Demonio Servidor propiamente Postmaster que es el encargado de manejar directamente las bases de datos y tablas. Binarios - Fuentes Programas Clientes: Son aquellos programas que se comunican con el servidor enviando solicitudes a travs de una conexin de red, el servidor acta sobre cada solicitud y enva la respuesta al programa cliente. psql - pgadminIII - phppgadmin Utilitarios No-Clientes: Aquellos programas de propositos especiales que no actuan como clientes con el servidor. initdb inicia el area de datos de Postgresql

Arquitectura de PostgreSQL
PostgreSQL Interfases: Son usadas por programas de terceros, permiten la conexin al servidor de programas del usuario, a travs de varios protocolos. API C Interfase - PostgreSQL Connector/OBDC - PgSQL Connector/J - PgSQL Connector/NET Protocolos utilizados: Dependiendo del modo de conexin al Servidor (Local o Remota) permiten la comunicacin de los clientes con el Servidor Protocolo TCP/IP Unix socket file Named pipe Tipo de conexin Local, remota Solo Local Solo Local Sistema Operativo Todos Solo Unix Solo Windows

Arquitectura de PostgreSQL
COMO PostgreSQL UTILIZA EL ESPACIO EN DISCO Directorio de Datos (/var/lib/pgsql/data) Cada Base de datos tiene su propio directorio, sin importar el tipo de tablas que se creen, por ejemplo un directorio: /var/lib/pgsql/data

Instalacin y Archivos de Configuracin de PostgreSQL


OBTENER PostgreSQL

INSTALACION EN LINUX Y WINDOWS

EL ARCHIVO pg_hba.conf y postgresql.conf Opciones de Instalacin y arranque Evaluacin de un archivo ejemplo

Instalacin y Archivos de Configuracin de PostgreSQL


OBTENER PostgresSQL Para obtener a postgreSQL, lo descargamos de la pagina www.postgresql.org Alli podemos descargar las versiones especificas para cada sistema operativo: linux windows o los programas fuentes para su compilacion posterior.
9

Instalacin y Archivos de Configuracin de PostgreSQL


INSTALACION EN LINUX Y WINDOWS Para la instalacin en el sistema operativo linux, se recomienda utilizar el que viene acompaando a su distribucion de linux. De manera standar el sistema instalara los programas en las siguientes localidades: /usr/sbin/postgres <--- demonio principal inicia al servicio postgreSQL /usr/bin/psql <--- programa de gestion interactivo de SQL

10

Programas Clientes para el Usuario


PROGRAMAS DE ADMINISTRACION Y MONITOREO

ADMINISTRACION psql pgadminIII

OTROS PROGRAMAS phppgadmin otros

11

Conectarse a PostgreSQL
Uso del monitor PSQL PSQL es un programa que se ejecuta desde el prompt del sistema, que permite conectarse a un servidor PostgreSQL para enviarle consultas y comandos, y ver los resultados. Este comando permite:

Consultar informacin de las bases de datos y tablas Crear bases de datos y tablas Eliminar bases de datos y tablas. Asignar y revocar privilegios. Consultar, insertar, actualizar y eliminar registros de una tabla.

12

Conectarse a PostgreSQL - ejemplo

Sintaxis del comando psql

$shell> psql [-h hostname] [-U usuario] [-w] [base de datos]

Para una conexin a un host local como usuario postgres, las siguientes lneas son equivalentes.

# psql # psql -U postgres # psql -h localhost -U postgres

13

Conectarse a PostgreSQL
Si se puede establecer la conexin a postgreSQL, se obtiene un mensaje de bienvenida, y se cambia el prompt, indicando que se pueden enviar consultas al servidor. # psql psql (8.4.2) Digite help para obtener ayuda. postgres=# help Est usando psql, la interfaz de lnea de rdenes de PostgreSQL. Digite: \copyright para ver los trminos de distribucin \h para ayuda de rdenes SQL \? para ayuda de rdenes psql \g o punto y coma (;) para ejecutar la consulta \q para salir postgres=#

14

Conectarse a postgreSQL
La siguiente tabla muestra cada uno de los indicadores que podr ver y sintetiza lo que dicen acerca del estado en que se encuentra postgresql:

postgres=#Listo para un nuevo comando.


-> Esperando la siguiente lnea en un comando de mltiples lneas. '> Esperando la siguiente lnea, se encuentra abierta una cadena que comienza con apostrofo ('''). "> Esperando la siguiente lnea, se encuentra abierta una cadena que comienza con comillas dobles ('"').

15

Conectarse a postgreSQL
La siguiente tabla muestra cada uno de los indicadores que podr ver y sintetiza lo que dicen acerca del estado en que se encuentra Postgresql:
`> Esperando la siguiente lnea, se encuentra abierta una cadena que comienza con tilde ('`'). /*> Esperando la siguiente lnea, se encuentra abierto un comentario que comienza con /*.

16

los Comandos bases del psql


Informativo

opciones: S = desplegar objectos de sistema, + = agregar ms detalle) \l[+] listar bases de datos

\dv[S+] [PATRN] listar vistas \dt[S+] [PATRN] listar tablas \di[S+] [PATRN] listar ndices \d[S+] NOMBRE describir tabla, ndice, secuencia o vista \dv[S+] [PATRN] listar vistas \du[+] [PATTERN] list roles (users)

17

Creando Bases de Datos


A nivel terico, existen dos lenguajes para el manejo de bases de datos: DDL (Data Definition Language) Lenguaje de definicin de datos. Es el lenguaje que se usa para crear bases de datos y tablas, y para modificar sus estructuras, as como los permisos y privilegios. Este lenguaje trabaja sobre unas tablas especiales llamadas diccionario de datos. DML (Data Manipulation Language) lenguaje de manipulacin de datos. Es el que se usa para modificar y obtener datos desde las bases de datos. SQL engloba ambos lenguajes DDL+DML, y los estudiaremos juntos, ya que ambos forman parte del conjunto de sentencias de SQL.

18

Creando Bases de Datos


Crear una base de datos es una tarea muy simple. Claro que, en el momento de crearla, la base de datos estar vaca, es decir, no contendr ninguna tabla. Para empezar, crearemos una base de datos para nosotros solos, y la llamaremos "curso". Para crear una base de datos se usa una sentencia CREATE DATABASE:

postgres> CREATE DATABASE curso; Query OK, 1 row affected (0.03 sec) postgres>

19

Creando Bases de Datos


Podemos averiguar cuntas bases de datos existen en nuestro sistema usando la sentencia \l :
postgres=# \l Nombre | Dueo | Privilegios -----------+----------+--------------+-------------+------------+----------------------postgres | postgres | UTF8 | es_ES.UTF-8 | es_ES.UTF-8 | template0 | postgres | UTF8 | es_ES.UTF-8 | es_ES.UTF-8 | =c/postgres : postgres=CTc/postgres template1 | postgres | UTF8 | es_ES.UTF-8 | es_ES.UTF-8 | =c/postgres : postgres=CTc/postgres (4 filas) Listado de base de datos | Codificacin | Collation | Ctype

20

Creando Tablas
Veamos ahora la sentencia CREATE TABLE que sirve para crear tablas. La sintaxis de esta sentencia es muy compleja, ya que existen muchas opciones y tenemos muchas posibilidades diferentes a la hora de crear una tabla. Las iremos viendo paso a paso, y en poco tiempo sabremos usar muchas de sus posibilidades. En su forma ms simple, la sentencia CREATE TABLE crear una tabla con las columnas que indiquemos. Crearemos, como ejemplo, una tabla que nos permitir almacenar nombres de personas y sus fechas de nacimiento. Deberemos indicar el nombre de la tabla y los nombres y tipos de las columnas:

21

Creando Tablas
postgres=# \c curso psql (8.4.2) Ahora est conectado a la base de datos curso. curso=# CREATE TABLE gente (nombre VARCHAR(40), fecha DATE); CREATE TABLE Hemos creado una tabla llamada "gente" con dos columnas: "nombre" que puede contener cadenas de hasta 40 caracteres y "fecha" de tipo fecha.
22

Creando Tablas
Podemos consultar cuntas tablas y qu nombres tienen en una base de datos, usando la sentencia: \dt curso=# \dt Listado de relaciones Esquema | Nombre | Tipo | Dueo ---------+--------+-------+---------public | gente | table | postgres (1 fila) curso=#

23

Definicin de columnas
Pero tenemos muchas ms opciones a la hora de definir columnas. Adems del tipo y el nombre, podemos definir valores por defecto, permitir o no que contengan valores nulos, crear una clave primaria, indexar... La sintaxis para definir columnas es: nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] [[PRIMARY] KEY] [definicin_referencia]

24

Definicin de columnas
El tipo de dato especifica el tipo de informacin que puede guardar un campo: caracteres, nmeros, etc. Estos son algunos tipos de datos bsicos de PostgreSQL (posteriormente veremos otros): varchar: se usa para almacenar cadenas de caracteres. Una cadena es una secuencia de caracteres. Se coloca entre comillas (simples); ejemplo: 'Hola', 'Juan Perez'.

25

Definicin de columnas
El tipo "varchar" define una cadena de longitud variable en la cual determinamos el mximo de caracteres entre parntesis. Puede guardar hasta 10485760 caracteres. Por ejemplo, para almacenar cadenas de hasta 30 caracteres, definimos un campo de tipo varchar(30), es decir, entre parntesis, junto al nombre del campo colocamos la longitud. Si asignamos una cadena de caracteres de mayor longitud que la definida, la cadena no se carga, aparece un mensaje indicando tal situacin y la sentencia no se ejecuta (ERROR: value too long for type character varying(30)).

26

Definicin de columnas
integer: se usa para guardar valores numricos enteros, de -2000000000 a 2000000000 aprox. Definimos campos de este tipo cuando queremos representar, por ejemplo, cantidades.

float: se usa para almacenar valores numricos con decimales. Se utiliza como separador el punto (.). Definimos campos de este tipo para precios, por ejemplo

27

Valores Nulos
Al definir cada columna podemos decidir si podr o no contener valores nulos. La opcin por defecto es que se permitan valores nulos, NULL, y para que no se permitan, se usa NOT NULL. Por ejemplo: curso=# CREATE TABLE ciudad1 ( curso(# nombre CHAR(20) NOT NULL, curso(# poblacion INT NULL curso(# ); CREATE TABLE

28

Indices Claves primarias


Tambin se puede definir una clave primaria sobre una columna, usando la palabra clave KEY o PRIMARY KEY. Slo puede existir una clave primaria en cada tabla, y la columna sobre la que se define una clave primaria no puede tener valores NULL. Si esto no se especifica de forma explcita, PostgreSQL lo har de forma automtica.

29

Indices Claves primarias


curso=# CREATE TABLE ciudad3 ( curso(# id INTEGER PRIMARY KEY, curso(# nombre CHAR(20) NOT NULL, curso(# poblacion INT NULL curso(# ); NOTICE: CREATE TABLE / PRIMARY KEY crear el ndice implcito ciudad3_pkey para la tabla ciudad3 CREATE TABLE

30

Indices Claves primarias


curso=# CREATE TABLE ciudad2 ( curso(# id serial PRIMARY KEY, curso(# nombre CHAR(20) NOT NULL, curso(# poblacion INT NULL curso(# ); NOTICE: CREATE TABLE crear una secuencia implcita ciudad2_id_seq para la columna serial ciudad2.id NOTICE: CREATE TABLE / PRIMARY KEY crear el ndice implcito ciudad2_pkey para la tabla ciudad2 CREATE TABLE

31

Indices Claves nicas


El tercero permite definir ndices con claves nicas, tambin sobre una columna, sobre varias o sobre partes de columnas. Para definir ndices con claves nicas se usa la opcin UNIQUE. La diferencia entre un ndice nico y uno normal es que en los nicos no se permite la insercin de filas con claves repetidas. La excepcin es el valor NULL, que s se puede repetir.
curso=# CREATE TABLE mitabla2 ( curso(# id INT, curso(# nombre CHAR(19), curso(# unique (nombre)); NOTICE: CREATE TABLE / UNIQUE crear el ndice implcito mitabla2_nombre_key para la tabla mitabla2 CREATE TABLE
32

Indices Claves Forneas


Hemos visto que una de las alternativas que PostgreSQL ofrece para asegurar la integridad de datos es el uso de restricciones (constraints). Aprendimos que las restricciones se establecen en tablas y campos asegurando que los datos sean vlidos y que las relaciones entre las tablas se mantengan. Con la restriccin "foreign key" se define un campo (o varios) cuyos valores coinciden con la clave primaria de la misma tabla o de otra, es decir, se define una referencia a un campo con una restriccin "primary key" o "unique" de la misma tabla o de otra.

33

Indices Claves Forneas


La integridad referencial asegura que se mantengan las referencias entre las claves primarias y las externas. Por ejemplo, controla que si se agrega un cdigo de editorial en la tabla "libros", tal cdigo exista en la tabla "editoriales". Tambin controla que no pueda eliminarse un registro de una tabla ni modificar la clave primaria si una clave externa hace referencia al registro. Por ejemplo, que no se pueda eliminar o modificar un cdigo de "editoriales" si existen libros con dicho cdigo.

34

Indices Claves Forneas


La siguiente es la sintaxis parcial general para agregar una restriccin "foreign key": alter table NOMBRETABLA1 add constraint NOMBRERESTRICCION foreign key (CAMPOCLAVEFORANEA) references NOMBRETABLA2 (CAMPOCLAVEPRIMARIA); Analicmosla: - NOMBRETABLA1 referencia el nombre de la tabla a la cual le aplicamos la restriccin, - NOMBRERESTRICCION es el nombre que le damos a la misma,

35

Indices Claves Forneas


La siguiente es la sintaxis parcial general para agregar una restriccin "foreign key": alter table NOMBRETABLA1 add constraint NOMBRERESTRICCION foreign key (CAMPOCLAVEFORANEA) references NOMBRETABLA2 (CAMPOCLAVEPRIMARIA); - luego de "foreign key", entre parntesis se coloca el campo de la tabla a la que le aplicamos la restriccin que ser establecida como clave fornea, - luego de "references" indicamos el nombre de la tabla referenciada y el campo que es clave primaria en la misma, a la cual hace referencia la clave fornea. La tabla referenciada debe tener definida una restriccin "primary key" o "unique"; si no la tiene, aparece un mensaje de error.
36

Indices Claves Forneas


Hasta el momento hemos agregado restricciones a tablas existentes con "alter table" (manera aconsejada), tambin pueden establecerse al momento de crear una tabla (en la instruccin "create table"). En el siguiente ejemplo creamos la tabla "libros" con la restriccin respectiva: create table editoriales( codigo serial, nombre varchar(20), primary key (codigo) ); create table libros( codigo serial, titulo varchar(40), autor varchar(30), codigoeditorial smallint references editoriales(codigo), primary key(codigo) );

37

Indices Claves Forneas


Si intentamos eliminar un registro de la tabla referenciada por una restriccin "foreign key" cuyo valor de clave primaria existe referenciada en la tabla que tiene dicha restriccin, la accin no se ejecuta y aparece un mensaje de error. Esto sucede porque, por defecto, para eliminaciones, la opcin de la restriccin "foreign key" es "no action". Lo mismo sucede si intentamos actualizar un valor de clave primaria de una tabla referenciada por una "foreign key" existente en la tabla principal. La restriccin "foreign key" tiene las clusulas "on delete" y "on update" que son opcionales. Estas clusulas especifican cmo debe actuar PostgreSQL frente a eliminaciones y modificaciones de las tablas referenciadas en la restriccin.
38

Restricciones Claves Foraneas


Las opciones para estas clusulas son las siguientes: - "no action": indica que si intentamos eliminar o actualizar un valor de la clave primaria de la tabla referenciada (TABLA2) que tengan referencia en la tabla principal (TABLA1), se genere un error y la accin no se realice; es la opcin predeterminada. - "cascade": indica que si eliminamos o actualizamos un valor de la clave primaria en la tabla referenciada (TABLA2), los registros coincidentes en la tabla principal (TABLA1), tambin se eliminen o modifiquen; es decir, si eliminamos o modificamos un valor de campo definido con una restriccin "primary key" o "unique", dicho cambio se extiende al valor de clave externa de la otra tabla (integridad referencial en cascada). - "set null": Establece con el valor null en el campo de la clave fornea. - "set default": Establece el valor por defecto en el campo de la clave fornea.
39

Restricciones Claves Foraneas


La sintaxis completa para agregar esta restriccin a una tabla es la siguiente: alter table TABLA1 add constraint NOMBRERESTRICCION foreign key (CAMPOCLAVEFORANEA) references TABLA2(CAMPOCLAVEPRIMARIA) on delete OPCION on update OPCION; Veamos un ejemplo. Definimos una restriccin "foreign key" a la tabla "libros" estableciendo el campo "codigoeditorial" como clave fornea que referencia al campo "codigo" de la tabla "editoriales". La tabla "editoriales" tiene como clave primaria el campo "codigo". Especificamos la accin en cascada para las actualizaciones y eliminaciones: alter table libros add constraint FK_libros_codigoeditorial foreign key (codigoeditorial) references editoriales(codigo) on update cascade on delete cascade;
40

Eliminando Tablas
A veces es necesario eliminar una tabla, ya sea porque es ms sencillo crearla de nuevo que modificarla, o porque ya no es necesaria. Para eliminar una tabla se usa la sentencia DROP TABLE.

curso=# DROP TABLE ciudad6; curso=#

41

Eliminando Tablas

borrame=# \dt Listado de relaciones Esquema | Nombre | Tipo | Dueo ---------+---------+-------+---------public | borrame | table | postgres (1 fila) borrame=# DROP TABLE borrame; DROP TABLE

42

Eliminando Bases de Datos


De modo parecido, se pueden eliminar bases de datos completas, usando la sentencia DROP_DATABASE. La sintaxis tambin es muy simple: DROP DATABASE [IF EXISTS] db_name Hay que tener cuidado, ya que al borrar cualquier base de datos se elimina tambin cualquier tabla que contenga.

43

Eliminando Bases de Datos


postgres=# CREATE DATABASE borrame; CREATE DATABASE postgres=# \c borrame psql (8.4.2) Ahora est conectado a la base de datos borrame. borrame=# CREATE TABLE borrame(id int, nombre char(40)); CREATE TABLE borrame=# \dt Listado de relaciones Esquema | Nombre | Tipo | Dueo ---------+---------+-------+---------public | borrame | table | postgres (1 fila)

44

Eliminando Bases de Datos


borrame=# \l Listado de base de datos Nombre | Dueo | Codificacin | Collation |... -----------+----------+--------------+------------borrame | postgres | UTF8 | es_ES.UTF-8 |... curso | postgres | UTF8 | es_ES.UTF-8 |... euclides | postgres | UTF8 | es_ES.UTF-8 |... postgres | postgres | UTF8 | es_ES.UTF-8 |... template0 | postgres | UTF8 | es_ES.UTF-8 |... template1 | postgres | UTF8 | es_ES.UTF-8 |... (6 filas) borrame=# \c postgres psql (8.4.2) Ahora est conectado a la base de datos postgres. postgres=# DROP DATABASE borrame; DROP DATABASE

45

Insertando Registros (registros)


La forma ms directa de insertar una fila nueva en una tabla es mediante una sentencia INSERT. En la forma ms simple de esta sentencia debemos indicar la tabla a la que queremos aadir filas, y los valores de cada columna. Las columnas de tipo cadena o fechas deben estar entre comillas sencillas o dobles, para las columnas numricas esto no es imprescindible, aunque tambin pueden estar entrecomilladas.
La sintaxis bsica y general es la siguiente: insert into NOMBRETABLA (NOMBRECAMPO1, ..., NOMBRECAMPOn) values (VALORCAMPO1, ..., VALORCAMPOn);

46

Insertando Registros (registros)


Para agregar un registro a la tabla escribimos: insert into usuarios (nombre, clave) values ('Mariano','payaso'); Note que los datos ingresados, como corresponden a cadenas de caracteres se colocan entre comillas simples. Para ver los registros de una tabla usamos "select": select * from usuarios; El comando "select" recupera los registros de una tabla. Con el asterisco indicamos que muestre todos los campos de la tabla "usuarios".
47

Actualizando registros
Podemos modificar valores de las filas de una tabla usando la sentencia UPDATE. En su forma ms simple, los cambios se aplican a todas las filas, y a las columnas que especifiquemos. Por ejemplo, podemos aumentar en un 10% la poblacin de todas las ciudades de la tabla ciudad3 usando esta sentencia:
curso=# UPDATE ciudad3 SET poblacion=poblacion*1.10; UPDATE 1 curso=# SELECT * from ciudad3; curso id | nombre | poblacion -------+----------------------+----------80000 | Roma | (1 fila) curso=# UPDATE ciudad3 SET poblacion=poblacion*1.10; UPDATE 1 curso=# SELECT * from ciudad3;
48

Actualizando registros
Pero no tenemos por qu actualizar todas las filas de la tabla. Podemos limitar el nmero de filas afectadas de varias formas. La primera es mediante la clusula WHERE. Usando esta clusula podemos establecer una condicin. Slo las filas que cumplan esa condicin sern actualizadas:
UPDATE ciudad5 SET poblacion=poblacion*1.03 WHERE nombre='Roma';

49

Eliminando registros
Para eliminar filas se usa la sentencia DELETE. La sintaxis es muy parecida a la de UPDATE:

DELETE FROM ciudad3;

De este modo se eliminan todas las filas de la tabla.

50

Eliminando registros
Pero es ms frecuente que slo queramos eliminar ciertas filas que cumplan determinadas condiciones. La forma ms normal de hacer esto es usar la clusula WHERE:
DELETE FROM ciudad5 WHERE clave=2; SELECT * FROM ciudad5;

51

Vaciando una Tabla


Cuando queremos eliminar todas la filas de una tabla, vimos en el punto anterior que podamos usar una sentencia DELETE sin condiciones. Sin embargo, existe una sentencia alternativa, TRUNCATE, que realiza la misma tarea de una forma mucho ms rpida.
TRUNCATE ciudad5;

La diferencia es que DELETE hace un borrado secuencial de la tabla, fila a fila. Pero TRUNCATE borra la tabla y la vuelve a crear vaca, lo que es mucho ms eficiente.

52

Consultas con PostgreSQL La sentencia SELECT


Ya disponemos de bases de datos, y sabemos cmo aadir y modificar datos. Ahora aprenderemos a extraer datos de una base de datos. Para ello volveremos a usar la sentencia SELECT. La sintaxis de SELECT es compleja, no explicaremos todas sus opciones. Una forma ms general consiste en la siguiente sintaxis:
SELECT [ALL | DISTINCT | DISTINCTROW] expresion_select,... FROM referencias_de_tablas WHERE condiciones [GROUP BY {nombre_col | expresion | posicion} [ASC | DESC], ... [WITH ROLLUP]] [HAVING condiciones] [ORDER BY {nombre_col | expresion | posicion} [ASC | DESC] ,...] [LIMIT {[desplazamiento,] contador | contador OFFSET desplazamiento}]
53

La sentencia SELECT
Tambin podemos aplicar funciones sobre columnas de tablas, y usar esas columnas en expresiones para generar nuevas columnas:
curso=# SELECT id, nombre , CURRENT_DATE FROM ciudad3; curso id | nombre | date -------+----------------------+-----------80000 | Roma | 2010-06-03 (1 fila)

54

La sentencia SELECT

Alias
Aprovechemos la ocasin para mencionar que tambin es posible asignar un alias a cualquiera de las expresiones select. Esto se puede hacer usando la palabra AS, aunque esta palabra es opcional:
curso=# SELECT id AS codigo, nombre , CURRENT_DATE FROM codigo ciudad3; curso codigo | nombre | date --------+----------------------+-----------80000 | Roma | 2010-06-03 (1 fila)

55

La sentencia SELECT

Where
Lo que es ms til de una base de datos es la posibilidad de hacer consultas en funcin de ciertas condiciones. Generalmente nos interesar saber qu filas se ajustan a determinados parmetros. Por supuesto, SELECT permite usar condiciones como parte de su sintaxis, es decir, para hacer selecciones. Concretamente mediante la clusula WHERE, veamos algunos ejemplos:e
curso=# SELECT id AS codigo, nombre , CURRENT_DATE FROM ciudad3 WHERE id=80000; curso codigo | nombre | date --------+----------------------+-----------80000 | Roma | 2010-06-03 (1 fila) curso=#

56

La sentencia SELECT

Where
curso=# SELECT id AS codigo, nombre , CURRENT_DATE FROM ciudad3 WHERE id>80 AND id<100000; curso codigo | nombre | date --------+----------------------+-----------80000 | Roma | 2010-06-03 (1 fila) curso=#

En una clusula WHERE se puede usar cualquier funcin disponible en PostgreSQL, excluyendo slo las de resumen o reunin, que veremos en el siguiente punto. Esas funciones estn diseadas especficamente para usarse en clusulas GROUP BY. Tambin se puede aplicar lgica booleana para crear expresiones complejas. Disponemos de los operadores AND, OR, XOR y NOT.
57

La sentencia SELECT

Group by
Es posible agrupar filas en la salida de una sentencia SELECT segn los distintos valores de una columna, usando la clusula GROUP BY. Esto, en principio, puede parecer redundante, ya que podamos hacer lo mismo usando la opcin DISTINCT. Sin embargo, la clusula GROUP BY es ms potente:
curso=# SELECT fecha FROM gente GROUP BY fecha; curso fecha -----------2010-12-20 2009-11-20 2010-11-20 2008-01-12 (5 filas) curso=#
58

La sentencia SELECT

Group by
Pero la diferencia principal es que el uso de la clusula GROUP BY permite usar funciones de resumen o reunin. Por ejemplo, la funcin COUNT(), que sirve para contar las filas de cada grupo:
curso=# SELECT fecha, COUNT(*) AS cuenta FROM gente GROUP BY fecha; curso fecha | cuenta ------------+-------| 1 2010-12-20 | 1 2009-11-20 | 1 2010-11-20 | 1 2008-01-12 | 2 (5 filas) curso=#
59

La sentencia SELECT
Existen otras funciones de resumen o reunin, como MAX(), MIN(), SUM(), AVG(), STD(), VARIANCE()... Estas funciones tambin se pueden usar sin la clusula GROUP BY siempre que no se proyecten otras columnas:
curso=# SELECT MAX(nombre) FROM gente; curso max -------Centec (1 fila) curso=#

Pruebe el uso y resultado de estas funciones MAX(), MIN(), SUM(), AVG(), STD(), VARIANCE()
60

La sentencia SELECT
Adems, podemos aadir una clusula de orden ORDER BY para obtener resultados ordenados por la columna que queramos. Existe una opcin para esta clusula para elegir el orden, ascendente o descendente. Se puede aadir a continuacin ASC o DESC, respectivamente. Por defecto se usa el orden ascendente.
curso=# SELECT * FROM gente ORDER BY fecha; curso=# SELECT * FROM gente ORDER BY fecha DESC; curso=# SELECT * FROM gente ORDER BY fecha ASC; curso=#

61

La sentencia SELECT
Las clusulas "limit" y "offset" se usan para restringir los registros que se retornan en una consulta "select". La clusula limit recibe un argumento numrico positivo que indica el nmero mximo de registros a retornar; la clusula offset indica el nmero del primer registro a retornar. El nmero de registro inicial es 0 (no 1). Si el limit supera la cantidad de registros de la tabla, se limita hasta el ltimo registro. Ejemplo: select * from libros limit 4 offset 0; Muestra los primeros 4 registros, 0,1,2 y 3.
62

La sentencia SELECT
Si escribimos: select * from libros limit 4 offset 5; recuperamos 4 registros, desde el 5 al 8. Si se coloca solo la clusula limit retorna tantos registros como el valor indicado, comenzando desde 0. Ejemplo: select * from libros limit 8; Muestra los primeros 8 registros.

63

La sentencia SELECT
Es conveniente utilizar la clusula order by cuando utilizamos limit y offset, por ejemplo: select * from libros order by codigo limit 8;

64

Consultas Multitablas con PostgreSQL


Hasta ahora todas las consultas que hemos usado se refieren slo a una tabla, pero tambin es posible hacer consultas usando varias tablas en la misma sentencia SELECT. Esto nos permite realizar otras dos operaciones de lgebra relacional:

el producto cartesiano y la composicin.

65

Consultas Multitablas con PostgreSQL El producto cartesiano


El producto cartesiano de dos tablas son todas las combinaciones de todas las filas de las dos tablas. Usando una sentencia SELECT se hace proyectando todos los atributos de ambas tablas. Los nombres de las tablas se indican en la clusula FROM separados con comas:
curso=# SELECT * FROM personas2,telefonos2;

66

Consultas Multitablas con PostgreSQL Composiciones JOIN


Se trata de un producto cartesiano restringido, las tuplas que se emparejan deben cumplir una determinada condicin. En el ejemplo anterior tenemos 24 tuplas procedentes del producto cartesiano de las tablas personas2 y telfonos2. Si la condicin para la composicin es que personas2.id=telefonos2.id, tendremos que eliminar todas las tuplas en que la condicin no se cumpla.
curso=# SELECT * FROM personas2, telefonos2 -> WHERE personas2.id=telefonos2.id; curso=#

67

Consultas Multitablas con PostgreSQL Composiciones JOIN


curso=# SELECT * FROM personas2, telefonos2 -> WHERE personas2.id=telefonos2.id;

Esta consulta es equivalente a estas otras:


curso=# SELECT * FROM personas2 JOIN telefonos2 -> ON (personas2.id = telefonos2.id); curso=# SELECT * FROM personas2 JOIN telefonos2 -> WHERE (personas2.id = telefonos2.id); curso=# SELECT * FROM personas2 INNER JOIN telefonos2 -> ON (personas2.id = telefonos2.id); curso=# SELECT * FROM personas2 CROSS JOIN telefonos2 -> ON (personas2.id = telefonos2.id); curso=# SELECT * FROM personas2 JOIN telefonos2 USING(id);
68

Consultas Multitablas con PostgreSQL Composiciones JOIN


Al contrario que con las composiciones internas, las externas no proceden de un producto cartesiano. Por lo tanto, en estas pueden aparecer tuplas que no aparecen en el producto cartesiano. Para hacer una composicin externa se toman las tuplas de una de las tablas una a una y se combinan con las tuplas de la otra.
curso=# SELECT * FROM personas2 LEFT JOIN telefonos2 USING(id); curso=# SELECT * FROM tabla1 RIGHT JOIN tabla2 USING(id);

69

Operadores de PostgreSQL
Los operadores relacionales (o de comparacin) nos permiten comparar dos expresiones, que pueden ser variables, valores de campos, etc. Hemos aprendido a especificar condiciones de igualdad para seleccionar registros de una tabla; por ejemplo: select * from libros where autor='Borges'; Utilizamos el operador relacional de igualdad. Los operadores relacionales vinculan un campo con un valor para que PostgreSQL compare cada registro (el campo especificado) con el valor dado.

70

Operadores de PostgreSQL
Los operadores relacionales son los siguientes: = <> > < >= <= igual distinto mayor menor mayor o igual menor o igual

71

Funciones de PostgreSQL
Funciones de control de flujo

IF IFNULL NULLIF

Eleccin en funcin de una expresin booleana Eleccin en funcin de si el valor de una expresin es NULL Devuelve NULL en funcin del valor de una expresind

72

Funciones Texto

Funciones de PostgreSQL

PostgreSQL tiene algunas funciones para trabajar con cadenas de caracteres. Estas son algunas: char_length(string): Retorna la longitud del texto. upper(string): Retorna el texto convertido a maysculas. lower(string): Retorna el texto convertido a minsculas. position(string in string): Retorna la posicin de un string dentro de otro. Si no est contenido retorna un 0. substring(string [from int] [for int]): Retorna un substring, le indicamos la posicin inicial y la cantidad de caracteres a extraer desde dicha posicin.
73

Funciones Texto

Funciones de PostgreSQL

trim([leading|trailing|both] [string] from string): Elimina caracteres del principio o o final de un string. Por defecto elimina los espacios en blanco si no indicamos el caracter o string. ltrim(string,string): Elimina los caracteres de la izquierda segn el dato del segundo parmetro de la funcin. rtrim(string,string): Elimina los caracteres de la derecha segn el dato del segundo parmetro de la funcin.

74

Funciones Texto

Funciones de PostgreSQL

substr(text,int[,int]): Retorna una subcadena a partir de la posicin que le indicamos en el segundo parmetro hasta la posicin indicada en el tercer parmetro. lpad(text,int,text): Rellena de caracteres por la izquierda. El tamao total de campo es indicado por el segundo parmetro y el texto a insertar se indica en el tercero. rpad(text,int,text): Rellena de caracteres por la derecha. El tamao total de campo es indicado por el segundo parmetro y el texto a insertar se indica en el tercero.

75

Usuarios y Privilegios
Hasta ahora hemos usado slo el usuario 'postgres', que es el administrador, y que dispone de todos los privilegios disponibles en PostgreSQL. Sin embargo, normalmente no ser una buena prctica dejar que todos los usuario con acceso al servidor tengan todos los privilegios. Para conservar la integridad de los datos y de las estructuras ser conveniente que slo algunos usuarios puedan realizar determinadas tareas, y que otras, que requieren mayor conocimiento sobre las estructuras de bases de datos y tablas, slo puedan realizarse por un nmero limitado y controlado de usuarios.

76

Usuarios y Privilegios
Los conceptos de usuarios y privilegios estn ntimamente relacionados. No se pueden crear usuarios sin asignarle al mismo tiempo privilegios. De hecho, la necesidad de crear usuarios est ligada a la necesidad de limitar las acciones que tales usuarios pueden llevar a cabo. PostgreSQL permite definir diferentes usuarios, y adems, asignar a cada uno determinados privilegios en distintos niveles o categoras de ellos.

77

Usuarios y Privilegios
En PostgreSQL existen niveles distintos de privilegios: Globales: se aplican al conjunto de todas las bases de datos en un servidor. Es el nivel ms alto de privilegio, en el sentido de que su mbito es el ms general. De base de datos: se refieren a bases de datos individuales, y por extensin, a todos los objetos que contiene cada base de datos. De tabla: se aplican a tablas individuales, y por lo tanto, a todas las columnas de esas tabla

78

Usuarios y Privilegios
Un usuario 'anonimo' podr abrir una sesin PostgreSQL mediante una orden: shell> psql -h localhost -U anonimo -d curso -W Contrasea para usuario anonimo: Pero no podr hacer mucho ms, ya que no tiene privilegios. No tendr, por ejemplo, oportunidad de hacer selecciones de datos, de crear bases de datos o tablas, insertar datos, etc.

79

Usuarios y Privilegios
Para que un usuario pueda hacer algo ms que consultar algunas variables del sistema debe tener algn privilegio. Lo ms simple es conceder el privilegio para seleccionar datos de una tabla concreta. Esto se hara as: La misma sentencia GRANT se usa para aadir privilegios a un usuario existente. curso=# GRANT SELECT ON public.curso TO anonimo; GRANT

Esta sentencia concede al usuario 'anonimo' el privilegio de ejecutar sentencias SELECT sobre la tabla 'curso' del esquema 'public'.

80

Usuarios y Privilegios
Sintaxis: GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] nombre_tabla [, ...] TO { nombre_usuario | GROUP nombre_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE nombre_bd [, ...] TO { nomnbre_usuario | GROUP nombre_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION nombre_funcin ( [ [ modo_arg ] [ nombre_arg ] tipo_arg [, ...] ] ) [, ...] TO { nombre_usuario | GROUP nombre_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ]

81

Usuarios y Privilegios
Se pueden conceder varios privilegios en una nica sentencia. Por ejemplo: curso=# GRANT SELECT, UPDATE ON public.curso TO anonimo ; GRANT

82

Usuarios y Privilegios
Podemos ver qu privilegios se han concedido a un usuario mediante la sentencia \z. Por ejemplo:
curso=> \z Privilegios para base de datos curso Schema | Nombre | Tipo | Privilegios --------+---------------------------+-----------+ ------------------------------------------------public | cursantes | tabla | public | cursantes_id_cursante_seq | secuencia | public | curso | tabla | {postgres=arwdRxt/postgres,anonimo=r/postgres} public | curso_id_curso_seq | secuencia | public | curso_sl | tabla | {postgres=arwdRxt/postgres,anonimo=rd/postgres} (5 filas)

83

Usuarios y Privilegios
Para eliminar usuarios se usa la sentencia DROP USER.

curso=# drop user anonimo; DROP ROLE

84

Usuarios y Privilegios
Para eliminar los privilegios de un rol o grupo hay usar la sentencia REVOKE
Sintaxis: REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] nombre_tabla [, ...] FROM { nombre_usuario | GROUP nombre_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE nombre_bd [, ...] FROM { nombre_usuario | GROUP nombre_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION nombre_funcin ( [ [ modo_arg ] [ nombre_arg ] tipo_arg [, ...] ] ) [, ...] FROM { nombre_usuario | GROUP nombre_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
85

Centro de Estudios Tecnolgicos Avanzados


CURSO DE POSTGRESQL DESARROLLADORES ELEMENTOS BASICOS

Gracias por tu Participacin

Euclides Figueroa efigueroah@gmail.com


86