Re: Mensaje inicial

From: La Mancha de la Calabaza que Ladra <mancha(at)galois(dot)baras(dot)ml(dot)org>
To: pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
Subject: Re: Mensaje inicial
Date: 1998-09-29 01:24:08
Message-ID: 199809290124.UAA00459@galois.dgst.ddf.gob.mx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Hola, acabo de ver el mensaje de respuesta a la pregunta de Gilberto
Becerril y bueno, yo tambin ando empezando en esto del PostgreSQL y
las notas que he hecho las tex para poder usarlas el da que pierda
la memoria por completo.

Las anexo y espero que sean de utilidad a la comunidad y si alguien
tiene sugerencias o le hace aadiduras, agradecer que manden copia de
regreso. Saludos.

(Para imprimirlo hace falta una instalacin completa de TeX, como la
que viene con RedHat:

latex archivo.tex; latex archivo.tex; dvips archivo.dvi

)

==============================================================================

\documentclass{article}

\usepackage[spanish]{babel}
\usepackage{isolatin1}
\usepackage[dvips,spanish,all,light]{draftcopy}
\usepackage{algorithmic}
\usepackage{algorithm}

\setlength{\textheight}{9in}
\setlength{\textwidth}{6.5in}
\setlength{\topmargin}{-0.5in}
\setlength{\oddsidemargin}{0in}
\setlength{\evensidemargin}{0in}
\renewcommand{\listalgorithmname}{Lista de algoritmos}
\floatname{algorithm}{Algoritmo}

\def\fecha{\number\day\space de\space \ifcase\month\or
enero\or febrero\or marzo\or abril\or mayo\or junio\or
julio\or agosto\or septiembre\or octubre\or noviembre\or diciembre\fi
\space de \space\number\year}

\font\chirris=cmtt10 at 6pt

\title{Pequeo manual de algunas de las tripas de PostgreSQL\\ o de
cmo fui aprendiendo a lidiar con la bestia.}

\author{Por La Mancha de la Calabaza que Ladra\thanks{\tt mancha(at)breogan(dot)iimas(dot)unam(dot)mx}}

\date{\fecha}

\makeindex

\begin{document}

\maketitle

\tableofcontents
\listofalgorithms

\section{Introduccin}

A quin va dirigido? Digamos que est dirigido para el annimo fulano
X que estudi matemticas, comenz a jugar con computadoras y acaba de
descubrir que hay un fulano Y con harta lana que est dispuesto a
desperdiciarla en la coleccin de CDs del fulano X, hroe de la
historia, a cambio de que ste le masaje unas bases de datos.

Esto es algo as como un diario de las cosas que he ido aprendiendo de
las tripas de PostgreSQL. Estar escrito en desorden hasta que me
siente con calma a darle un poco ms de estructura.

El meollo del asunto es saber usar el \verb+select+. Ese es tu mejor
amigo en las bases de datos relacionales con \verb+SQL+\footnote{Que,
por cierto, es un estndar para platicar con los bichos conocidos como
Bases de Datos. Si leiste esta nota al pie esperando una gran
explicacin, es que vas mal... Si tan slo la leiste porque siempre
lees las notas al pie, pues no andas tan perdido.}. De momento,
digamos que basta con tener un poco de sentido comn para aprender de
que se trata el asunto, pero si crees que necesitas saber un poco ms
de lo que describir por aqu, la mejor referencia es \cite{Bowman} y
nunca, pero realmente \underline{nunca} \cite{Trimble}, que es con el
que aprend.

\section{Si no ests en la compaa de un adulto...}

En la siguiente seccin veremos como usar el cliente de la
base de datos, pero para esto es necesario tener unas bases de
datos. Aquellos que ya tienen acceso a una base de datos se pueden
pasar a la siguiente seccin. Si no tienes, hay dos opciones: a) ir
con un nio mayor y que te cree una; b) aprender a hacerlo.

En primer lugar, para poder crear una base de datos o incluso
para hacer consultas en una existente, es necesario haber sido creado
como usuario del manejador. Esto lo hace el fulano que es conocido en
el medio como el DBA\footnote{En realidad son muchos fulanos y con
suerte hay uno cerca de t.}: {\em Database Administrator}, el
administrador de las bases de datos. Es como el superusuario de UNIX,
pero no puede leer tu correo ni matar tus conexiones a sitios porno,
slo crear usuarios y realizar las operaciones de administracin de
las bases y el manejador\footnote{Hummmm... quiz de ah venga el
nombre.}.

Como de seguro eres de aquella clase de personas que no se
quedan impasibles ante una figura de autoridad, ah va el secreto: el
DBA correr en el {\em shell\/} el programa \verb+createuser+ para
darte de alta. J! Ya no es un mago, no puede engaarte, pero an as
no lo hagas enojar.

\verb+createuser+ es un programa que si no se le pasan
argumentos se pone en modo interactivo preguntando el nombre de la
cuenta del usuario ---que puede no ser la misma que en el sistema---,
el user ID ---que tiene que ser necesariamente la misma que en el
sistema---, si puede crear bases de datos y si puede aadir
usuarios. Pese a que el nombre del usuario es independiente del de el
sistema, si uno trata de asignar otro nombre al mismo usuario, no lo
permite\footnote{Este es un momento histrico, acabo de descubrir que
esto pasa.}.

En el siguiente ejemplo, tratamos de crear con otro nombre a
un usuario que ya existe. Luego del fracaso, creamos un usuario nuevo
con un nombre diferente al de su cuenta, y sin permiso para crear
bases de datos, as que seguir dependiendo del DBA para que le cree
una. Por supuesto que tiene sentido que un usuario exista para el
manejador de la base de datos sin que pueda crear una bases de datos,
ya que con esto podr consultar e incluso modificar o desgraciar una
existente si el DBA se descuida.

\begin{verbatim}

postgres(at)caserola:psql$ createuser %$
Enter name of user to add ---> lola
Enter user's postgres ID -> 500

createuser: 500 already belongs to mancha , pick another
Enter user's postgres ID -> 518
Is user ``lola''allowed to create databases (y/n) n
Is user ``lola''allowed to add users? (y/n) n
createuser: lola was successfully added
don't forget to create a database for lola

\end{verbatim}

Independientemente de si el DBA te d permisos o no para crear
bases de datos\index{bases de datos|crear}, siempre es bueno saber
como se hace\footnote{Sobre todo por si un da el muy estpido deja a
la mano una sesin abierta.}. \verb+createdb+, as se
hace. \verb+createdb nombre+ crea la base con nombre \verb+nombre+. No
hay ms que decir.

\section{De los tipos de datos}

\subsection{Los que tiene}

En la tabla~\ref{tab:tipos}, robada vilmente del manual, con algunas
aadiduras se incluyen los tipos de datos que tiene construidos
internamente Postgres95 hasta la versin 6.2.3.

\begin{table}[t]
\begin{center}
\begin{tabular}{|l|l|p{8cm}|}
\hline\hline{\bf Postgres}&{\bf SQL92}&{\bf Descripcin}\\\hline\hline
bool & boolean & Booleano, verdadero o falso. A la entrada puede
recibir los valores: (TRUE,'t','true','y','yes','1') que produce 't' o
(FALSE,'f','false','n','no','0') que produce 'f'\\\hline
box & N/A & Caja rectangular en un plano de dos dimensiones\\\hline
char($n$) & character($n$) & Cadena de $n$ carcteres de tamao fijo\\\hline
circle & N/A & Crculo en un plano de dos dimensiones\\\hline
date & date & Fecha sin hora\\\hline
float4 & float($p$) & Nmero de punto flotante con precisin $p$\\\hline
float8 & real, double precision & Nmero de punto flotante con doble
precisin\\\hline
int2 & smallint & Entero de dos bytes con signo\\\hline
int4 & int, integer & Entero de cuatro bytes con signo\\\hline
int4 & decimal($p$, $s$) & Entero preciso para $p \le 9$, $s = 0$\\\hline
int4 & numeric($p$, $s$) & Entero preciso para $p = 9$, $s = 0$\\\hline
line & N/A & Lnea infinita en un plano de dos dimensiones\\\hline
lseg & N/A & Segmento de lnea en un plano de dos dimensiones\\\hline
money & decimal($9$, $2$) & Lana, marmaja, dinero en formato \$1,234.56\\\hline
path & N/A & Recorrido abierto o cerrado en un plano de dos dimensiones\\\hline
point & N/A & Punto en un plano de dos dimensiones\\\hline
polygon & N/A & Recorrido cerrado en un plano de dos dimensiones (un
polgono tal cual)\\\hline
time & time & Hora en formato $hh:mm:ss$ \\\hline
timespan & interval & Intervalo de tiempo de propsito general\\\hline
varchar($n$) & character varying($n$) & Cadena de carcteres con
tamao mximo de $n$ carcteres\\\hline
\hline\hline
\end{tabular}
\caption{Descripcin de tipos de datos de Postgres.}
\label{tab:tipos}
\end{center}
\end{table}

\section{Algunos trucos}

\subsection{Quiero copiar slo unos campos de una tabla a otra...}

Supongamos que tenemos una tabla y queremos crear una segunda que
tenga slo algunos de los campos que estn en la primera, y adems que
no me repita registros:

\begin{verbatim}

INSERT INTO nomfec SELECT DISTINCT nombre,apepat,apemat,fecnac FROM licencias;

\end{verbatim}

\subsection{Quiero borrar un determinado registro}

Una opcin es dar un calificador que defina de manera nica al
registro, pero cuando no se puede, est es la solucin:

\begin{verbatim}

SELECT nombre,oid FROM nomfec;
DELETE FROM nomfec WHERE OID=1223744;

\end{verbatim}

\noindent dnde \verb+OID+ es el {\em Object ID\/} de cada registro, y
seleccionamos el de aqul que queremos borrar (o hacerle cualquier
otra cosa).

\subsection{Quiero tener un campo que sea un nmero secuencial automtico}

Bien, la transa es esta: tenemos una tabla donde queremos que uno de
los campos tenga un nmero secuencial nico y que adems se actualiza
automticamente. Fcil, creamos una secuencia\footnote{S, postgres
tiene una forma automtica de hacerlo.}:

\begin{verbatim}

foo=> CREATE SEQUENCE misec INCREMENT 1 START 0 MINVAL 0 MAXVAL 999999;

\end{verbatim}

\noindent crea la secuencia {\tt misec} que comienza en cero, se
incrementa de uno en uno y tiene como valor mximo $999,999$. En
realidad, salvo por los valores mnimo y mximo, el resto es el
default. Ahora, cmo se usa. Lo que queremos es que cada vez que
inserto un registro, el valor de un campo sea un nmero secuencial que
se incrementa con respecto al ltimo valor insertado, que pudo haber
sido usado hace meses. Esto se consigue as de fcil:

\begin{verbatim}

INSERT INTO mitabla VALUES ('un valorcillo textual', nextval('misec'))

\end{verbatim}

Si lo que queremos es saber el valor actual de la secuencia:
\verb+SELECT currval('misec')+

El empleo de estas bestias es una buena idea para el caso en que uno
quiera automatizar el uso de tablas auxiliares. Por ejemplo, digamos
que tenemos una tabla con $N$ registros y los valores que puede tomar
uno de los campos est en un dominio con un orden mucho menor a
$N$. De lo que estamos hablando es de normalizar la tabla. Bien, el
asunto es que para cada registro, vamos a tomar el campo en particular
que vamos a guardar en la tabla anexa y en su lugar almacenaremos un
identificador nico para el valor que tiene esa instancia, el
algoritmo rpido y mal hecho se describe en~\ref{alg1}, mientras que
el algoritmo detallado para hacer la creacin del identificador y la
insercin en la tabla anexa, se d en el algoritmo~\ref{alg2}.

\begin{algorithm}
\caption{Para la substitucin de valores por un identificador
obtenido de una tabla anexa.}
\label{alg1}
\begin{algorithmic}[1]
\WHILE{queden registros}
\STATE trae el siguiente registro
\IF{el valor existe en la tabla auxiliar}
\STATE asigna al campo el identificador asociado al valor
\ELSE
\STATE asocia al valor un identificador nuevo y nico
\STATE inserta en la tabla auxiliar el valor
\ENDIF
\ENDWHILE
\end{algorithmic}
\end{algorithm}

\begin{algorithm}
\caption{Para la creacin del identificador en la tabla anexa.}
\label{alg2}
\begin{algorithmic}[1]
\STATE SELECT idval FROM latabla WHERE campo = valor;
\IF{$ntuples > 0$}
\STATE return idval;
\ELSE
\STATE INSERT INTO $val$ VALUES ($valor$, NEXTVAL('secuencia'));
\STATE return CURRVAL('secuencia');
\ENDIF
\end{algorithmic}
\end{algorithm}

\section{La papa: cmo saber de las tripas en cuanto a bases, tablas,
campos y dems yerbas}

Para saber que bases de datos hay en el sistema:

\begin{verbatim}

SELECT * FROM pg_database;

\end{verbatim}

Para saber que tablas tengo en la base de datos actual:

\begin{verbatim}

SELECT * FROM pg_class;

\end{verbatim}

Lo mismo, pero solo las mias, excluyendo las del sistema:

\begin{verbatim}

SELECT * FROM pg_class WHERE relname !~~ 'pg%';

\end{verbatim}

Si slo quiero saber cuantos registros tiene una tabla, basta con
preguntar:

\begin{verbatim}

SELECT relname,reltuples FROM pg_class WHERE relname='mechitos';

\end{verbatim}

\noindent donde {\tt mechitos} es el nombre de la tabla de la cual me
interesa saber el nmero de registros.

A continuacin, la sopa de como extraer info de las tablas de la base
de datos. El asunto es el siguiente: \verb+pg_database+ tiene las
bases de datos, \verb+pg_class+ tiene las tablas, y
\verb+pg_attribute+ tiene los campos. Agarra uno y si lo que quiere
saber es el nmero de registros en una tabla determinada, pues basta
con preguntar lo siguiente, conociendo la tabla, con el plus de que
adems se obtiene cuales son los campos. Para, adems, saber los tipos
de los campos, habra que hacer un {\em query\/} a \verb+pg_type+ con
los \verb+oids+ de los campos, pero eso creo que ya es mucho rollo.

\begin{verbatim}

SELECT relname,reltuples,attname,attnum
FROM pg_class,pg_attribute
WHERE pg_class.relname='centel'
AND pg_attribute.attrelid=pg_class.oid
AND attnum > 0
ORDER BY attnum;

\end{verbatim}

Si lo quiero saber todo de todas las tablas de la base que no sean del
sistema, sino mias, por supuesto ordenadas por \verb+oid+, se hace lo
siguiente, pero con el problema de que incluye los indices:

\begin{verbatim}

SELECT pg_class.oid,relname,reltuples,attname
FROM pg_class,pg_attribute
WHERE pg_class.relname !~~ '%pg%'
AND pg_attribute.attrelid=pg_class.oid
AND attnum > 0
ORDER BY pg_class.oid;

\end{verbatim}

En el caso de que uno quiera saber cuales son los campos de
todas las tablas que se tienen en una base de datos, esta lindura de
{\em query\/} lo soluciona\footnote{Y adems dice cuntos registros
tiene cada tabla. Claro que lo repite para cada campo, pero bueno, SQL
no fue hecho para formatear datos.}.

\begin{verbatim}

SELECT pg_class.relname,pg_attribute.attname,pg_class.reltuples,pg_type.typname
FROM pg_attribute
WHERE attrelid = pg_class.oid
AND attnum > 0
AND atttypid=pg_type.oid
AND pg_class.oid IN
(SELECT oid FROM pg_class WHERE relname !~~ 'pg%')
AND pg_type.oid IN (SELECT oid FROM pg_type);

\end{verbatim}

Fin... de momento

\section{La base no est en esta mquina, sino en la otra}

Y cmo se conecta uno a una base que no es local? Bueno, el
asunto es fcil. Si el operetas del otro sistema configur bien el
asunto, y da acceso validando al usuario, entonces basta con usar la
bandera \verb+-h+:

\begin{verbatim}

psql -h maquina

\end{verbatim}

\noindent donde, por supuesto, \verb+maquina+ es la otra mquina.

\section{Algunas tablillas pachangueras y cochinas}

Las tablas que se ponen a continuacin, son para referencia y aparecen
mencionadas en varias partes del texto.

%\chirris

\vspace{2pc}

\begin{table}[ht]
\begin{center}
\begin{tabular}{|l|l|}
\hline\hline
{\bf Nombre del catlogo}& {\bf Descripcin}\\\hline\hline
pg$\_$database & Bases de datos\\\hline
pg$\_$class & Clases o tablas\\\hline
pg$\_$attribute & Atributos o campos de la clase o tabla\\\hline
pg$\_$index & ndices secundarios\\\hline
pg$\_$proc & Procedimientos (en C y en SQL)\\\hline
pg$\_$type & Tipos de datos (del sistema y definidos por el usuario)\\\hline
pg$\_$operator & Operadores (del sistema y definidos por el usuario)\\\hline
pg$\_$aggregate & Agregados y funciones agregadas\\\hline
pg$\_$am & Mtodos de acceso\\\hline
pg$\_$amop & Operadores de mtodos de acceso\\\hline
pg$\_$amproc & Funciones de soporte para mtodos de acceso\\\hline
pg$\_$opclass & Clases de operadores de mtodos de acceso\\\hline
\\\hline\hline
\end{tabular}
\caption{Catalogo del sistema PostgreSQL. Cada base de datos tiene
estas mismas tablas, salvo por la primera que es nica, que almacenan
cada una de las partes que componen la base de
datos.}\label{tab:catalogo}
\end{center}
\end{table}

\vspace{2pc}

\begin{table}[ht]
\begin{center}
\begin{tabular}{|l|l|r|p{18pc}|}
\hline\hline
\multicolumn{4}{|c|}{\bf Table = pg$\_$database}\\\hline\hline
\bf Field&\bf Type&\bf Length&\bf Description\\\hline
datname&name&32&Nombre de la tabla\\
datdba&int4&4&Uid del dababase admin\\
datpath&text&var&El path para llegar hasta la tabla\\\hline\hline
\end{tabular}
\caption{Tabla que contiene todas las bases de datos que existen en el
sistema. Vale la pena consultarla en aplicaciones que impliquen
explorar diversos aspectos.}\label{tab:database}
\end{center}
\end{table}

\begin{table}[ht]
\begin{center}
\begin{tabular}{|l|l|r|p{18pc}|}
\hline\hline
\multicolumn{4}{|c|}{\bf Table = pg$\_$class}\\\hline\hline
\bf Field&\bf Type&\bf Length&\bf Description\\\hline
relname&name&32&Nombre de la tabla\\
reltype&oid&4&Eso, el Object Id de la tabla\\
relowner&oid&4&El UID (postgres) del dueo de la tabla\\
relam&oid&4&\\
relpages&int4&4&\\
reltuples&int4&4&\\
relhasindex&bool&1&\\
relisshared&bool&1&\\
relkind&char&1&\\
relnatts&int2&2&\\
relchecks&int2&2&\\
reltriggers&int2&2&\\
relhasrules&bool&1&\\
relacl&aclitem[]&var&\\\hline\hline
\end{tabular}
\caption{Tabla que contiene todas las bases de datos que existen en el
sistema. Vale la pena consultarla en aplicaciones que impliquen
explorar diversos aspectos.}\label{tab:class}
\end{center}
\end{table}

\begin{table}
\begin{center}
\begin{tabular}{|l|l|r|p{18pc}|}
\hline\hline
\multicolumn{4}{|c|}{\bf Table = pg$\_$attribute}\\\hline\hline
\bf Field&\bf Type&\bf Length&\bf Description\\\hline
attrelid&oid&4&OID del campo\\
attname&name&32&Nombre del campo\\
atttypid&oid&4&\\
attdisbursion&float4&4&\\
attlen&int2&2&\\
attnum&int2&2&\\
attnelems&int4&4&\\
attcacheoff&int4&4&\\
atttypmod&int2&2&\\
attbyval&bool&1&\\
attisset&bool&1&\\
attalign&char&1&\\
attnotnull&bool&1&\\
atthasdef&bool&1&\\\hline\hline
\end{tabular}
\caption{Tabla que contiene todos los campos de todas las bases de
datos que existen en el sistema. Vale la pena consultarla en
aplicaciones que impliquen explorar diversos
aspectos.}\label{tab:attribute}
\end{center}
\end{table}

\begin{thebibliography}{Bowman}

\bibitem[Bowman]{Bowman} {\bf The Practical SQL Handbook}, Judity
Bowman, Sandra Emerson, and Marcy Damovsky, ISBN: 0-201-44787-8,
Addisson-Wesley, 1997.

\bibitem[Trimble]{Trimble} {\bf A Visual Introduction to SQL},
J. Harvey Trimble Jr., and David Chappell, ISBN: 0-471-61684-2, John
Wiley \& Sons, Inc.

\end{thebibliography}

\end{document}

==============================================================================

PD. Gil, mndame un mensaje porque perd tu direccin. Saludos.

--
La Mancha, http://breogan.iimas.unam.mx/~mancha
casa://AvRevolucion.1761.depto.5/~mancha
ring://550-2547.df.telmex.com.mx/~pedir.por.mancha
chamba://cubo-320.iimas.unam.cu/~mancha
rechamba://533-3035.df.telmex.com.mx/~pedir.por.el.director
--------- Pie de mensaje -------------------------------------------
Archivo historico: http://tlali.iztacala.unam.mx/maillist/pgsql-ayuda
Cancelar inscripcion:
mail to: majordomo(at)tlali(dot)iztacala(dot)unam(dot)mx
text : cancelacion pgsql-ayuda

In response to

Responses

  • Orientacion at 1998-09-29 06:15:11 from Antonio Varela Lizardi

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Antonio Varela Lizardi 1998-09-29 06:15:11 Orientacion
Previous Message Gerardo Quiroz Velazquez 1998-09-28 22:52:00 saludos...