Breve Introducción al SQL
1. Introducción
1.1 Componentes del SQL
1.2 Comandos
1.3 Cláusulas
1.4 Operadores Lógicos
1.5 Operadores de Comparación
1.6 Funciones de Agregado
2. Consultas de Selección
2.1 Consultas Básicas
2.2 Ordenar los Registros
2.3 Consultas con Predicado
2.4 Alias
2.5 Bases de Datos Externas
3. Criterios de Selección
3.1 Operadores Lógicos
3.2 Intervalos de Valores
3.3 El Operrador Like
3.4 El Operador In
3.5 La cláusula WHERE
4. Agrupamiento de Registros y Funciones Agregadas
4.1 El cláusula GROUP BY
4.2 AVG (Media Aritmética)
4.3 Count (Contar Registros)
4.4 Max y Min (Valores Máximos y Mínimos)
4.5 StDev y StDevP (Desviación Estándar)
4.6 Sum (Sumar Valores)
4.7 Var y VarP (Varianza)
5. Consultas de Actualización
5.1 Consultas de Eliminación
5.2 Consultas de Datos Añadidos
5.3 Consultas de Actualización
6. Tipos de Datos
7. SubConsultas
8. Consultas de Referencias Cruzadas
9. Consultas de Unión Internas
10. Consultas de Unión Externas
11. Estructuras de las Tablas
11.1 Creación de Tablas
11.2 La cláusula CONSTRAINT
11.3 Creación de Indices
11.4 Eliminar y Añadir Campos e Indices
12. Consultas con Parámetros
13. Acceso a Bases de Datos Externas
14. Omitir los Permisos de Ejecución
15. La cláusula Procedure
16. Anexos
16.1 Resolución de Problemas
16.1.1 Información Duplicada
16.1.2 Registros no Relacionados
16.2 Utilizar SQL desde Visual Basic
16.3 Funciones utilizables
16.4 La función iif
16.5 Manual de Estilo
Breve Historia del SQL
La historia de SQL (que se pronuncia deletreando en inglés las letras que lo componen, es decir
"ese-cu-ele" y no "siquel" como se oye a menudo) empieza en 1974 con la definición, por parte de Donald
Chamberlin y de otras personas que trabajaban en los laboratorios de investigación de IBM, de un
lenguaje para la especificación de las características de las bases de datos que adoptaban el modelo
relacional. Este lenguaje se llamaba SEQUEL (Structured English Query Language) y se implementó
en un prototipo llamado SEQUEL-XRM entre 1974 y 1975. Las experimentaciones con ese prototipo
condujeron, entre 1976 y 1977, a una revisión del lenguaje (SEQUEL/2), que a partir de ese momento
cambió de nombre por motivos legales, convirtiéndose en SQL. El prototipo (System R), basado en
este lenguaje, se adoptó y utilizó internamente en IBM y lo adoptaron algunos de sus clientes elegidos.
Gracias al éxito de este sistema, que no estaba todavía comercializado, tmabién otras compañías
empezaron a desarrollar sus productos relacionales basados en SQL. A partir de 1981, IBM comenzó a
entregar sus productos relacionales y en 1983 empezó a vender DB2. En el curso de los años ochenta,
numerosas compañías (por ejemplo Oracle y Sybase, sólo por citar algunos) comercializaron productos
basados en SQL, que se convierte en el Estándar industrial de hecho por lo que respecta a las bases de
datos relacionales.
En 1986, el ANSI adoptó SQL (sustancialmente adoptó el dialecto SQL de IBM) como Estándar para
los lenguajes relacionales y en 1987 se transfomó en Estándar ISO. Esta versión del Estándar va con el
nombre de SQL/86. En los años siguientes, éste ha sufrido diversas revisiones que han conducido
primero a la versión SQL/89 y, posteriormente, a la actual SQL/92.
El hecho de tener un Estándar definido por un lenguaje para bases de datos relacionales abre
potencialmente el camino a la intercomunicabilidad entre todos los productos que se basan en él. Desde
el punto de vista práctico, por desgracia las cosas fueron de otro modo. Efectivamente, en general cada
productor adopta e implementa en la propia base de datos sólo el corazón del lenguaje SQL (el así
llamado Entry level o al máximo el Intermediate level), extendiéndolo de manera individual según la
propia visión que cada cual tenga del mundo de las bases de datos.
Actualmente, está en marcha un proceso de revisión del lenguaje por parte de los comités ANSI e ISO,
que debería terminar en la definición de lo que en este momento se conoce como SQL3. Las
características principales de esta nueva encarnación de SQL deberían ser su transformación en un
lenguaje stand-alone (mientras ahora se usa como lenguaje hospedado en otros lenguajes) y la
introducción de nuevos tipos de datos más complejos que permitan, por ejemplo, el tratamiento de
datos multimediales.
INTRODUCCIÓN
Cuenta de administrador "postgres"
La cuenta de administrador es la más importante de su sistema y se merece una atención especial para
evitarnos problemas de seguridad. Un fallo en la configuración de la misma pone la integridad de
nuestro sistema en peligro.
Por defecto PostgreSQL instala una cuenta de administrador llamada 'postgres'. La información de esta
cuenta y lo que puede hacer se puede acceder en los catálogos de sistema,
pg_authid,
pg_roles, pg_shadow
y
pg_users
. Más información sobre estos catálogos se encuentra
disponible en el
Capítulo 44. System Catalogs
de la documentación oficial.
Por defecto, después de instalar postgreSQL, la cuenta "postgres" no tiene definida ninguna clave de
acceso y cualquier usuario que tenga acceso a la máquina que este ejecutando PostgreSQL, podrá
acceder a todas las bases de datos como usuario "postgres" via sockets.
Esto lo comprueba viendo la información definida en
pg_shadow
y en
pg_hba.conf
(Más
información sobre
pg_hba.conf
y
postgresql.conf
en
Configuración básica de PostgreSQL
)
[postgres@server]~$ psqlWelcome to psql 8.3.7, the PostgreSQL interactive terminal. Type: \copyright for distribution terms
\h for help with SQL commands \? for help with psql commands
\g or terminate with semicolon to execute query \q to quit
postgres=# SELECT * from pg_shadow;
usename | usesysid | usecreatedb | usesuper | usecatupd | passwd | valuntil | useconfig ---+--- postgres | 10 | t | t | t | | | (1 rows) postgres=# \q
[postgres@server]~$ grep postgres /var/pgsql/data/pg_hba.conf local all postgres trust
Esta configuración por defecto puede ser un gran problema de seguridad en una máquina en la que
muchos usuarios tengan acceso y se tengan bases de datos en producción o con datos confidenciales.
Cualquier usuario con acceso a la máquina en cuestión podría acceder a PostgreSQL como usuario
"postgres" y tener privilegios de administrador para hacer lo que quiera con las bases de datos:
usuario@server:~$ psql -U postgresType: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands
\g or terminate with semicolon to execute query \q to quit
Existen diferentes maneras de asegurar nuestra cuenta de administrador en PostgreSQL y nuestras
bases de datos. A continuación, se presenta una manera de hacerlo que según experiencia es una de las
mejores y más seguras. Implementaremos las siguientes medidas:
1. Tener una cuenta de sistema (postgres) en el sistema operativo sin clave definida. Habrá que ser
root y utilizar
su - postgres
para convertirse en el usuario "postgres". No será posible
acceder directamente al sistema como "postgres" via tcp/ip
2. El acceso mediante sockets será usado solamente por la cuenta de administrador "postgres". El
resto de usuarios utilizarán el protocolo tcp/ip.
3. Cambiar los permisos del socket utilizado por PostgreSQL
4. Utilizar el método de autentificación 'ident' para la cuenta "postgres" en nuestro gestor de base
de datos. De esta manera solamente el usuario postgres del sistema operativo podrá acceder a
PostgreSQL como el usuario "postgres" de la base de datos
Para implementar estas medidas tendremos que cambiar la configuración por defecto siguiendo estos
pasos:
1. Para convertir la cuenta postgres del sistema operativo en una cuenta sin clave definida ejecutar
como root:
passwd -d postgres
2. Comprobar que no tiene una definición en pg_hba.conf para usuarios normales usando sockets
(local) en el tipo de conexión. Si tiene usuarios usando sockets, cambiar el tipo de conexión a
host y usar 127.0.0.1/255.255.255.255 (localhost) como IP de acceso. Con psql tiene que
utilizar
psql -h localhost -U usuario
para acceder al sistema.
3. Cambiar en el fichero de configuración
postgresql.conf
las siguientes lineas:
listen_addresses = 'localhost'unix_socket_permissions = 0700
Si las bases de datos van a ser accedidas desde otras máquinas externas, tiene que definir
también en
listen_addresses
la IP del servidor postgreSQL.
4. Actualizar el fichero
pg_ident.conf
con la siguiente linea:
administrador postgres postgresY comprobar que la única linea en
pg_hba.conf
con información sobre el usuario "postgres"
es la siguiente:
local all postgres ident administrador
No olvidar ejecutar un restart de PostgreSQL para que los cambios se instalen.
Como se ve en el siguiente ejemplo, ni siendo administrador root en su sistema operativo podra acceder
como usuario "postgres" a su sistema de bases de datos PostgreSQL. Primero tiene que convertirse en
usuario postgres en su sistema operativo.
[usuario@server:~] $ psql -U postgres
psql: could not connect to server: Permission denied Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"? [usuario@server:~] $ psql -h localhost -U postgres
psql: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "postgres", database "postgres", SSL off
[root@server:~] # psql
psql: FATAL: no pg_hba.conf entry for host "[local]", user "root", database "root", SSL off
[root@server:~] # psql -U postgres
psql: FATAL: Ident authentication failed for user "postgres" [root@server:~] # su - postgres
[postgres@server:~] $ psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal. Type: \copyright for distribution terms
\h for help with SQL commands \? for help with psql commands
\g or terminate with semicolon to execute query \q to quit
postgres=#
Sólo queda comentar que en sistemas en producción y con datos importantes, debe restringir a un
mínimo el número de personas con acceso a la cuenta "postgres" del sistema. Solamente los
administradores, que sepan que es lo que están haciendo, deben tener este acceso.
Para crear usuarios, usar el comando CREATE USER, que tiene la siguiente sintaxis:
CREATE USER username[ WITH
[ SYSID uid ]
[ PASSWORD 'password' ] ]
[ CREATEDB | NOCREATEDB ] [ CREATEUSER | NOCREATEUSER ] [ IN GROUP groupname [, ...] ]
[ VALID UNTIL 'abstime' ]
Entonces, crear un usuario llamado david:
postgres=# CREATE USER david postgres-# WITH PASSWORD 'd3st0' postgres-# NOCREATEDBpostgres-# NOCREATEUSER postgres-# ;
CREATE USER postgres=#
Ya tiene a david en su base de datos.
postgres=# DROP USER david; DROP USER
Crear el usuario vendedor y su clave mediante la sentencia: CREATE USER vendedor WITH PASSWORD 'patito';
Crear el usuario vendedor, su clave y fecha de expiración de cuenta; CREATE USER vendedor WITH PASSWORD 'patito' VALID UNTIL '2011/31/12'; Crear un usuario como super usuario,
CREATE USER vendedor CREATEUSER CREATEDB;
En PostgreSQL, al igual que en otros gestores de base de datos, puede gestionar usuario utilizando la primera letra de la opción correspondiente, como:
CREATEUSER -U vendedor -D -A nuevousuario; Incluso, puede utilizar el formato interactivo: CREATEUSER
Enter name of user to add:
Shall the new user be allowed to create new database(y/n)? Shall the new user be allowed to create more new user(y/n)? para resetear la clave del usuario vendedor, utilizar: ALTER USER vendedor WITH PASSWORD 'PO123!_1';