You are on page 1of 8

Aprendiendo SQL con PostgreSQL

Introduccin.
Una base de datos es el corazn de toda empresa, en ella se almacena y se gestiona toda la informacin que se necesita para operar y crecer. Las (buenas) bases de datos se manejan a travs de SQL (Standar Query Lenguage) que es un conjunto de comandos a travs de los cuales podemos insertar, borrar y editar la informacin de la base de datos adems de hacer consultas (queries) sobre la informacin contenida. PostgreSQL (PgSQL) es un excelente y veloz gestor de base de datos de cdigo abierto que posee caractersticas avanzadas como manejo de concurrencia, procedimientos almacenados e integridad referencial. Como en muchos otros casos en el mundo del software libre, uno se sorprende de que algo tan bueno como PostgreSQL pueda ser descargado y usado sin pagar nada.

Creando una nueva base de datos.


Para crear una nueva base de datos solo en necesario teclear el siguiente comando desde el intrprete de comandos (nota: no se debe escribir el signo de pesos, este representa el prompt del intrprete de comandos):
$createdbempresa

Una vez que hemos creado la base de datos podemos acceder a ella con el cliente de PgSQL, escribiendo el comando :
$psqlempresa

Al acceder a la base de datos ver el mensaje de bienvenida de PgSQL, un prompt con el nombre de la base de datos en la que se encuentra, seguido de un signo de igual y un sostenido (o gato):
Bienvenidoapsql8.3.1,laterminalinteractivadePostgreSQL. Digite:\copyrightparaverlostrminosdedistribucin \hparaayudaderdenesSQL \?paraayudaderdenespsql \gopuntoycoma(;)paraejecutarlaconsulta \qparasalir empresa=#

Tablas y campos
Como cualquier otra base de datos, PGSQL guarda los datos en tablas. Si usted ha usado una hoja de clculo como Excel u OpenCalc usted ya posee el concepto de tabla: una serie de columnas y renglones en donde las intersecciones son llamadas celdas. De hecho, una hoja de clculo puede considerarse un tipo de base de datos. La diferencia principal con una verdadera base de datos radica en que cada columna guarda un tipo de

valor especfico (nmeros, decimales, fechas, alfanumricos, etc.) y que en lugar de celdas, el lugar donde se guardan los datos son llamados campos. Por otra parte, a los renglones se les llama registros o tuplas. De este modo, para crear una tabla es necesario definir el tipo de informacin que se almacenar en cada columna. PgSQL posee varios tipos de datos, los ms usados son:

VARCHAR(n) Almacena cadenas de caracteres de longitud variable, de longitud mxima n. CHAR(n). Almacena cadenas de caracteres de longitud fija, de longitud n. INTEGER. Almacena nmeros enteros como 2,33,107,15228, etc. NUMERIC. Almacena nmeros enteros y decimales. FLOAT: Almacena nmeros enteros y decimales de doble palabra. DATE, Almacena fechas. TEXT. Guarda textos largos. SERIAL. Crea una secuencia y la asigna a una columna como llave de la tabla.

Para crear una tabla se usa el comando CREATE TABLE nombre_de_tabla. Por ejemplo, vamos a crear la tabla empleados. Copie las siguientes lineas en psql, tomando en cuenta que los espacios no son necesarios, solo se escriben para dar mayor claridad (Nota: Obviamente no se escribe empresa=#, ya que este es el prompt de psql):
empresa=#CREATETABLEempleados( empresa(#idserial,Indicedelatabla empresa(#nombrevarchar(50),nombredelempleado empresa(#rfcchar(13)UNIQUE,registrodehaciendadelempleado empresa(#fecha_nacdate,fechadenacimientodelempleado empresa(#sucursalvarchar(30),sucursaldondelabora empresa(#sueldonumericNOTNULLSueldo empresa(#);

Al ejecutar la consulta anterior ver un mensaje indicando que se ha creado una tabla, una secuencia para el campo id y un ndice para el campo rfc. Al hacer uso de psql debemos finalizar los comandos con un punto y coma (;) de otro modo, si slo damos enter, el comando no se ejecutar y el prompt cambiar a empresa(#, indicando que psql est en espera de un parntesis que cierra y del punto coma para ejecutar el comando SQL. Por convencin (no slo en PostgreSQL sino en todas las bases de datos) se usan las MAYSCULAS para escribir las palabras SQL en las sentencias, mientras que el nombre de los campos y las tablas se escriben en minsculas, por ejemplo:
empresa=#SELECT*FROMempleados; id|nombre|rfc|fecnac|sucursal|sueldo +++++ (0filas)

Algunos diseadores recomiendan nombrar a los campos de una tabla con el formato nbd_ntb_campo. Donde nbd es el nombre de la base de datos y ntb es el nombre de la tabla. Yo encuentro particularmente fastidioso usar este sistema de nombrado sobre todo en los queries de varias tablas. Sin embargo, es una buena prctica hacerlo si usted esta trabajando con varias personas en un proyecto y desea evitar confusiones.

Dado que usamos el tipo serial al crear la columna id, se crear una secuencia para esta columna. El nombre de las secuencias se crea conjuntando el nombre de la tabla, ms el nombre de la columna, ms el postfijo seq. De modo que en este caso la secuencia se llamar empleados_id_seq. Ya que hemos creado la tabla, teclearemos el comando \dt para visualizarla:
empresa=#\dt; Listadoderelaciones Schema|Nombre|Tipo|Dueo +++ public|empleados|tabla|postgres (1fila)

Este comando \dt (describe tables) muestra las tablas (tambin llamadas relaciones) de la base de datos as como el dueo de la tabla (el usuario postgres). En este caso slo vemos una tabla, la recin creada empleados. Para ver la descripcin de una tabla especfica utilice \d nombre_de_tabla. Por ejemplo:
empresa=#\dempleados; Tablapublic.empleados Columna|Tipo|Modificadores ++ id|integer|notnulldefaultnextval nombre|charactervarying(50)| rfc|charactervarying(20)| fecnac|date| sucursal|charactervarying(30)| sueldo|money|notnull ndices: empleados_rfc_keyUNIQUE,btree(rfc)

De esta manera usted puede recuperar los detalles de una tabla, como el tipo de cada campo. Note, adems que al crear la columna rfc aadimos la indicacin UNIQUE que indica que los valores listados en esa columna deben ser nicos, pues dos empleados no pueden tener el mismo rfc. La indicacin NOT NULL en la columna sueldo indica que al insertar un registro (o rengln) ese campo no puede quedar vaco y forzosamente debe tener un valor. Para visualizar las secuencias escribimos \ds (describe sequences) y para los ndices \di (describe indexes). Ahora insertemos algunos registros a nuestra tabla, para ello usamos el comando INSERT INTO, el cual posee el siguiente formato:
INSERTINTOnombre_tabla(columna1,columna2)VALUES('valoruno','valordos');

Copie las siguientes lneas:


empresa=#INSERTINTOempleados(id,nombre,rfc,fecha_nac,sucursal,sueldo)VALUES (NEXTVAL('empleados_id_seq'),'MarioLopez','MLG598777','11061977','Merida', '9800'); empresa=#INSERTINTOempleados(id,nombre,rfc,fecha_nac,sucursal,sueldo)VALUES (NEXTVAL('empleados_id_seq'),'JorgeMarles','MLG1545487','18071969','Chiapas',

'14500'); empresa=#INSERTINTOempleados(id,nombre,rfc,fecha_nac,sucursal,sueldo)VALUES (NEXTVAL('empleados_id_seq'),'ManuelMontoya','ERT7890','11061977','Toluca', '15900'); empresa=#INSERTINTOempleados(id,nombre,rfc,fecha_nac,sucursal,sueldo)VALUES (NEXTVAL('empleados_id_seq'),'LucianoPerez','JKJ110777','11061977','Guadalajara', '1000');

Los valores de los campos de tipo VARCHAR, DATE y MONEY deben ir entre comillas simples mientras los NUMERIC, FLOAT e INTEGER no las necesitan. Ahora que ya vio como se hace, agregue algunos empleados usted mismo. Como habr notado, la funcin NEXTVAL('secuencia') simplemente agrega el siguiente valor de una secuencia a la columna id, de este modo tendremos un campo en nuestra tabla que nunca se repetir y que (como veremos) es muy til. Observar, adems, que luego de insertar un registro psql le devolver el mensaje INSERT 1 que indica que el registro ha sido agregado con xito. Ahora veamos nuestros registros.

Queries simples
El querie o consulta ms simple es "SELECT * FROM tabla". En nuestro caso:
empresa=#select*fromempleados; id|nombre|rfc|fecha_nac|sucursal|sueldo +++++ 1|MarioLopez|MLG598777|19770611|Merida|9800 2|JorgeMarles|MLG1545487|19690718|Chiapas|14500 3|ManuelMontoya|ERT7890|19770611|Toluca|15900 4|LucianoPerez|JKJ11077|19770611|Guadalajara|1000 (4filas)

El asterisco indica que deseamos ver todas las columnas de la tabla. Podemos revisar slo algunas columnas con:
empresa=#SELECTid,nombreFROMempleados; id|nombre + 1|MarioLopez 2|JorgeMarles 3|ManuelMontoya 4|LucianoPerez (4filas)

Esto slo nos devuelve el campo id y el nombre del empleado. Si hemos creado campos sin la indicacin NOT NULL podemos insertar un nuevo registro dejndolos vacos:
empresa=#INSERTINTOempleados(id,nombre,sueldo)VALUES (NEXTVAL('empleados_id_seq'),'JuliaSanchez','16700');

Ordenar una consulta


Podemos ordenar el resultado de la consulta segn diferentes criterios con el parmetro ORDER BY. Por ejemplo, que ordene nuestra tabla por nombre:
empresa=#SELECT*FROMempleadosORDERBYnombre; id|nombre|rfc|fecnac|sucursal|sueldo +++++ 2|JorgeMarles|MLG1545487|19690718|Chiapas|14.500,00 5|JuliaSanchez||||16.700,00 4|LucianoPerez|JKJ110777|19770611|Guadalajara|1.000,00 3|ManuelMontoya|ERT7890|19770611|Toluca|15.900,00 1|MarioLopez|MLG598777|19770611|Merida|9.800,00 (5filas)

O por el sueldo:
empresa=#SELECT*FROMempleadosORDERBYsueldo; id|nombre|rfc|fecnac|sucursal|sueldo +++++ 4|LucianoPerez|JKJ110777|19770611|Guadalajara|1.000,00 1|MarioLopez|MLG598777|19770611|Merida|9.800,00 2|JorgeMarles|MLG1545487|19690718|Chiapas|14.500,00 3|ManuelMontoya|ERT7890|19770611|Toluca|15.900,00 5|JuliaSanchez||||16.700,00 (5filas)

Podemos ordenar la tabla como ascendente o descendente, por omisin el orden es ascendente ASC (de menor a mayor):
empresa=#SELECT*FROMempleadosORDERBYsueldoDESC; id|nombre|rfc|fecnac|sucursal|sueldo +++++ 5|JuliaSanchez||||16.700,00 3|ManuelMontoya|ERT7890|19770611|Toluca|15.900,00 2|JorgeMarles|MLG1545487|19690718|Chiapas|14.500,00 1|MarioLopez|MLG598777|19770611|Merida|9.800,00 4|LucianoPerez|JKJ110777|19770611|Guadalajara|1.000,00 (5filas) empresa=#SELECT*FROMempleadosORDERBYsueldoASC; id|nombre|rfc|fecnac|sucursal|sueldo +++++ 4|LucianoPerez|JKJ110777|19770611|Guadalajara|1.000,00 1|MarioLopez|MLG598777|19770611|Merida|9.800,00 2|JorgeMarles|MLG1545487|19690718|Chiapas|14.500,00 3|ManuelMontoya|ERT7890|19770611|Toluca|15.900,00 5|JuliaSanchez||||16.700,00 (5filas)

Tambin podemos ordenar por ms de un columna a la vez, ejemplo (se separan los nombre de columna con comas, pero las palabras reservadas ORDER BY no se repiten):
empresa=#empresa=#SELECT*FROMempleadosORDERBYfecha_nacdesc,sueldo; id|nombre|rfc|fecha_nac|sucursal|sueldo +++++ 5|JuliaSanchez|a|||16700 4|LucianoPerez|JKJ11077|19770611|Guadalajara|1000 1|MarioLopez|MLG598777|19770611|Merida|9800 3|ManuelMontoya|ERT7890|19770611|Toluca|15900 2|JorgeMarles|MLG1545487|19690718|Chiapas|14500 (5filas)

Asimismo podemos limitar el nmero de renglones del query con el parmetro LIMIT, por ejemplo si slo deseamos conocer a los dos empleados de mayor sueldo:

empresa=#SELECT*FROMempleadosORDERBYsueldoDESCLIMIT2; id|nombre|rfc|fecha_nac|sucursal|sueldo +++++ 5|JuliaSanchez||||16700 3|ManuelMontoya|ERT7890|19770611|Toluca|15900 (2filas)

El condicional WHERE
Si deseamos conocer al empleado cuya sucursal se encuentra en Chiapas debemos usar el parmetro WHERE. Este parmetro indica que se deben listar slo los registros que cumplen con una condicin especificada:
empresa=#SELECT*FROMempleadosWHEREsucursal='Chiapas'; id|nombre|rfc|fecnac|sucursal|sueldo +++++ 2|JorgeMarles|MLG1545487|19690718|Chiapas|14.500,00 (1fila)

Si deseamos conocer a los empleados cuyo sueldo es mayor a 13,000 pesos:


empresa=#SELECT*FROMempleadosWHEREsueldo>'13000'ORDERBYsueldo; id|nombre|rfc|fecnac|sucursal|sueldo +++++ 2|JorgeMarles|MLG1545487|19690718|Chiapas|14.500,00 3|ManuelMontoya|ERT7890|19770611|Toluca|15.900,00 5|JuliaSanchez||||16.700,00 (3filas)

Si deseamos conocer a los empleados cuya sucursal es Toluca y el sueldo es igual o mayor a 10,000 pesos debemos usar AND para especificar ms de una condicin:
empresa=#SELECT*FROMempleadosWHEREsueldo>='10000'ANDsucursal='Toluca'; id|nombre|rfc|fecnac|sucursal|sueldo +++++ 3|ManuelMontoya|ERT7890|19770611|Toluca|15.900,00 (1fila)

Se pueden colocar tantos AND como queramos:


empresa=#SELECTnombre,fecnacFROMempleadosWHEREsueldo>='10000'ANDsucursal= 'Toluca'ANDid=3ANDrfc='ERT7890'; nombre|fecnac + ManuelMontoya|19770611 (1fila)

Actualizar la tabla
Para modificar los datos de un registro de la tabla usamos el comando UPDATE:
empresa=#UPDATEempleadosSETsueldo='7500',rfc='YURT6734'WHEREid=4; UPDATE1 emplresa=#updateempleadossetrfc='ABCD1234',fecha_nac='19770205',sucursal='Pto progreso'whereid=5; UPDATE1 empresa=#updateempleadossetrfc='WXYZ4321',fecha_nac='19880915'whereid=7; UPDATE0

Borrando datos de una tabla.


Para borrar el rengln de una tabla, usamos la siguiente sentencia:
empresa=#DELETEFROMempleadosWHEREid=5; DELETE1

Ahora est claro para que creamos el campo id? Este campo nos sirve para realizar todas las operaciones sobre una tabla.

Modificar una tabla


Agregar una columna a una tabla:
empresa=#ALTERTABLEempleadosADDCOLUMNcontratoINTEGER; ALTERTABLE

Renombrar la columna de una tabla:

empresa=#ALTERTABLEempleadosRENAMECOLUMNcontratoTOtipo_contrato; ALTERTABLE

Cambiar el tipo de datos de una columna de la tabla:


empresa=#altertableempleadosaltercolumntipo_contratotypevarchar(20); ALTERTABLE

Eliminar una columna a una tabla:


empresa=#ALTERTABLEempleadosDROPCOLUMNtipo_contrato; ALTERTABLE

Borrar una tabla


empresa=#DROPTABLEempleados; DROPTABLE

Nota: Cuidado con esta sentencia, borra la tabla y todo su contenido, sin preguntar nada, as que debe ejecutarse solo si estamos seguros que queremos eliminar la tabla de forma definitiva de la base de datos. Todos estos ejemplos que hemos visto son sobre una sola tabla, sin embargo, la verdadera potencia de SQL se hace patente cuando se hacen consultas y reportes conjuntando varias tablas. Un querie multitabla, largo y bien diseado nos puede dar una completa visin del departamento de ventas o el estado del inventario. Pero eso lo veremos ms adelante.