PostgreSQL DesarrolladoresBasico
PostgreSQL DesarrolladoresBasico
PostgreSQL DesarrolladoresBasico
Bienvenidos
CURSO DE POSTGRESQL DESARROLLADORES ELEMENTOS BASICOS
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
10
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
Para una conexin a un host local como usuario postgres, las siguientes lneas son equivalentes.
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:
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
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
18
postgres> CREATE DATABASE curso; Query OK, 1 row affected (0.03 sec) postgres>
19
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
29
30
31
33
34
35
37
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.
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
43
44
45
46
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:
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
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
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
65
66
67
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.
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