Debe introducir al menos 3 caracteres en el buscador.
Inicio / Wikis / Tutoriales / Introducción al SQL. Instalación de PostgreSQL - Primer Paso

Introducción al SQL. Instalación de PostgreSQL - Primer Paso

 ----- 
Creative Commons Tutorial de Manuel Soriano - 08 de Noviembre de 2005
2. Primer Paso
Vamos a ilustrar con datos lo que antes he explicado, así que vamos a crear 3 tablas (o ficheros) :

Fichero: paises.sql
create table paises (cod_pais integer, nombre varchar(30));
insert into paises values (1, 'pais 1');
insert into paises values (2, 'pais 2');
insert into paises values (3, 'pais 3');
commit work;
Fichero: provincias.sql
create table provincias (cod_provincia int,
cod_pais int,
nom_provincia varchar(30));
insert into provincias values (1, 1, 'Provincia 1, Pais 1');
insert into provincias values (2, 1, 'Provincia 2, Pais 1');
insert into provincias values (1, 2, 'Provincia 1, Pais 2');
insert into provincias values (2, 2, 'Provincia 2, Pais 2');
insert into provincias values (1, 3, 'Provincia 1, Pais 3');
insert into provincias values (2, 3, 'Provincia 2, Pais 3');
commit work;
Fichero: municipios.sql
create table municipios (cod_pais int,
cod_provincia int,
cod_municipio int,
nombre_municipio varchar(60));
insert into municipios values (1, 1, 1, 'Municipio 1, Provincia 1, Pais 1');
insert into municipios values (2, 1, 1, 'Municipio 2, Provincia 1, Pais 1');
insert into municipios values (3, 1, 1, 'Municipio 3, Provincia 1, Pais 1');
insert into municipios values (1, 2, 1, 'Municipio 1, Provincia 2, Pais 1');
insert into municipios values (2, 2, 1, 'Municipio 2, Provincia 2, Pais 1');
insert into municipios values (3, 2, 1, 'Municipio 3, Provincia 2, Pais 1');
insert into municipios values (1, 3, 1, 'Municipio 1, Provincia 3, Pais 1');
insert into municipios values (2, 3, 1, 'Municipio 2, Provincia 3, Pais 1');
insert into municipios values (3, 3, 1, 'Municipio 3, Provincia 3, Pais 1');
insert into municipios values (1, 1, 2, 'Municipio 1, Provincia 1, Pais 2');
insert into municipios values (2, 1, 2, 'Municipio 2, Provincia 1, Pais 2');
insert into municipios values (3, 1, 2, 'Municipio 3, Provincia 1, Pais 2');
insert into municipios values (1, 2, 2, 'Municipio 1, Provincia 2, Pais 2');
insert into municipios values (2, 2, 2, 'Municipio 2, Provincia 2, Pais 2');
insert into municipios values (3, 2, 2, 'Municipio 3, Provincia 2, Pais 2');
insert into municipios values (1, 3, 2, 'Municipio 1, Provincia 3, Pais 2');
insert into municipios values (2, 3, 2, 'Municipio 2, Provincia 3, Pais 2');
insert into municipios values (3, 3, 2, 'Municipio 3, Provincia 3, Pais 2');
insert into municipios values (1, 1, 3, 'Municipio 1, Provincia 1, Pais 3');
insert into municipios values (2, 1, 3, 'Municipio 2, Provincia 1, Pais 3');
insert into municipios values (3, 1, 3, 'Municipio 3, Provincia 1, Pais 3');
insert into municipios values (1, 2, 3, 'Municipio 1, Provincia 2, Pais 3');
insert into municipios values (2, 2, 3, 'Municipio 2, Provincia 2, Pais 3');
insert into municipios values (3, 2, 3, 'Municipio 3, Provincia 2, Pais 3');
insert into municipios values (1, 3, 3, 'Municipio 1, Provincia 3, Pais 3');
insert into municipios values (2, 3, 3, 'Municipio 2, Provincia 3, Pais 3');
insert into municipios values (3, 3, 3, 'Municipio 3, Provincia 3, Pais 3');
commit work;


Para ejecutar dentro del psql unos comandos sql de un fichero, hacer :

\i nombre_del_fichero

Tambén podemos hacer un cortar y pegar desde estas páginas.

Vamos a ver qué municipios tenemos :

select * from municipios;
cod_pais|cod_provincia|cod_municipio|nombre_municpio
+
+
+
1|1|1|Municipio 1, Provincia 1, Pais 1
2|1|1|Municipio 2, Provincia 1, Pais 1
3|1|1|Municipio 3, Provincia 1, Pais 1
1|2|1|Municipio 1, Provincia 2, Pais 1
2|2|1|Municipio 2, Provincia 2, Pais 1
3|2|1|Municipio 3, Provincia 2, Pais 1
1|3|1|Municipio 1, Provincia 3, Pais 1
2|3|1|Municipio 2, Provincia 3, Pais 1
3|3|1|Municipio 3, Provincia 3, Pais 1
1|1|2|Municipio 1, Provincia 1, Pais 2
2|1|2|Municipio 2, Provincia 1, Pais 2
3|1|2|Municipio 3, Provincia 1, Pais 2
1|2|2|Municipio 1, Provincia 2, Pais 2
2|2|2|Municipio 2, Provincia 2, Pais 2
3|2|2|Municipio 3, Provincia 2, Pais 2
1|3|2|Municipio 1, Provincia 3, Pais 2
2|3|2|Municipio 2, Provincia 3, Pais 2
3|3|2|Municipio 3, Provincia 3, Pais 2
1|1|3|Municipio 1, Provincia 1, Pais 3
2|1|3|Municipio 2, Provincia 1, Pais 3
3|1|3|Municipio 3, Provincia 1, Pais 3
1|2|3|Municipio 1, Provincia 2, Pais 3
2|2|3|Municipio 2, Provincia 2, Pais 3
3|2|3|Municipio 3, Provincia 2, Pais 3
1|3|3|Municipio 1, Provincia 3, Pais 3
2|3|3|Municipio 2, Provincia 3, Pais 3
3|3|3|Municipio 3, Provincia 3, Pais 3
(27 rows)
prueba=>

Bien tenemos 27 tuplas y el pgsql está esperando otro comando, vamos a ver este :

select * from paises, municipios
cod_pais|nombre|cod_provincia|cod_pais|nom_provincia
+
+
+
+
1|pais 1|1| 1|Provincia 1, Pais 1
2|pais 2|1| 1|Provincia 1, Pais 1
3|pais 3|1| 1|Provincia 1, Pais 1
1|pais 1|2| 1|Provincia 2, Pais 1
2|pais 2|2| 1|Provincia 2, Pais 1
3|pais 3|2| 1|Provincia 2, Pais 1
1|pais 1|1| 2|Provincia 1, Pais 2
2|pais 2|1| 2|Provincia 1, Pais 2
3|pais 3|1| 2|Provincia 1, Pais 2
1|pais 1|2| 2|Provincia 2, Pais 2
2|pais 2|2| 2|Provincia 2, Pais 2
3|pais 3|2| 2|Provincia 2, Pais 2
1|pais 1|1| 3|Provincia 1, Pais 3
2|pais 2|1| 3|Provincia 1, Pais 3
3|pais 3|1| 3|Provincia 1, Pais 3
1|pais 1|2| 3|Provincia 2, Pais 3
2|pais 2|2| 3|Provincia 2, Pais 3
3|pais 3|2| 3|Provincia 2, Pais 3
(18 rows)

¿¿¿18 tuplas ??? Vamos a ver, hemos insertado 3 países, y 6 provincias, todas ellas identificadas en un país. ¿Cómo es posible que nos saque 18 tuplas?

En este último comando hemos, realizado una unión de dos tablas, hemos relacionado la tabla de países con la de municipios, como no le hemos dado ninguna regla de unión, nos ha devuelto TODAS las tuplas de países relacionadas con TODAS las tuplas de provincias, es decir 3 tuplas de países por 6 de provincias total 18 tuplas, este resultado es totalmente ilógico e inútil, ahora mejor hacer:

select * from paises, provincias
where paises.cod_pais = provincias.cod_pais;
cod_pais|nombre|cod_provincia|cod_pais|nom_provincia
+
+
+
+
1|pais 1|1| 1|Provincia 1, Pais 1
1|pais 1|2| 1|Provincia 2, Pais 1
2|pais 2|1| 2|Provincia 1, Pais 2
2|pais 2|2| 2|Provincia 2, Pais 2
3|pais 3|1| 3|Provincia 1, Pais 3
3|pais 3|2| 3|Provincia 2, Pais 3
(6 rows)

Bueno, esto ya empieza a ser más razonable. ¿Seis tuplas, correcto?

Si tenemos seis municipios y cada municipio está en un país. Es normal que me dé un número de tuplas igual al de municipios, dado que países es un calificativo de municipios. Acabamos de relacionar la tabla de países con la tabla de provincias mediante el código de país. Recordemos que países tiene código y que provincias tiene el código país al que pertenece.

¿Porqué paises.cod_pais = provincias.cod_pais ?

Código de país en la tabla de países se llama cod_pais y en la tabla de provincias también, entonces:

cod_pais = cod_pais


es ilógico, el interprete nunca sabría como manejar eso y nos daría un error:

select * from paises, provincias
where cod_pais = cod_pais;
ERROR: Column cod_pais is ambiguous

Esto ahora podemos dar alias a las columnas :

select * from paises a, provincias b
where a.cod_pais = b.cod_pais;
cod_pais|nombre|cod_provincia|cod_pais|nom_provincia
+
+
+
+
1|pais 1|1| 1|Provincia 1, Pais 1
1|pais 1|2| 1|Provincia 2, Pais 1
2|pais 2|1| 2|Provincia 1, Pais 2
2|pais 2|2| 2|Provincia 2, Pais 2
3|pais 3|1| 3|Provincia 1, Pais 3
3|pais 3|2| 3|Provincia 2, Pais 3
(6 rows)

¿Qué nos devuelve el gestor?: cod_pais, nombre, cod_provincia, cod_pais y nom_provincia.

Como hemos pedido "select * from países, provincias", el * es un comodín que indica que queremos TODO, por eso nos devuelve las dos columnas de países y las 3 de provincias, ahora queremos algo más explícito

select a.cod_pais, cod_provincia, nombre, nom_provincia
from paises a, provincias b
where a.cod_pais = b.cod_pais;
cod_pais|cod_provincia|nombre|nom_provincia
+
+
+
1|1|pais 1|Provincia 1, Pais 1
1|2|pais 1|Provincia 2, Pais 1
2|1|pais 2|Provincia 1, Pais 2
2|2|pais 2|Provincia 2, Pais 2
3|1|pais 3|Provincia 1, Pais 3
3|2|pais 3|Provincia 2, Pais 3
(6 rows)

En este comando hemos especificado que queremos, concretamente el código del país, el código de la provincia, el nombre del país y el nombre de la provincia. Fijaros que ciertos nombres de columna están cualificados (a.cod_pais) mientras que otros no (nom_provincia), esto es debido a que cod_pais está repetido en ambas tablas mientras que nom_provincia sólo se encuentra en provincias. Los nombres de columnas únicos no hace falta cualificarlos.

Complicamos un poco más:

select a.cod_pais, cod_provincia, nombre, nom_provincia
from paises a, provincias b
where a.cod_pais = b.cod_pais
and a.cod_pais = 3;
cod_pais|cod_provincia|nombre|nom_provincia
+
+
+
3|1|pais 3|Provincia 1, Pais 3
3|2|pais 3|Provincia 2, Pais 3
(2 rows)

Esta vez hemos limitado la busqueda a los que sólo tienen como código país el 3.
Tabla de contenidos
Autor y licencia de 'Introducción al SQL. Instalación de PostgreSQL - Primer Paso'
Manuel Soriano Extraído de: http://www.mononeurona.org/index.php?idp=426

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Wikis relacionados con 'Introducción al SQL. Instalación de PostgreSQL - Primer Paso'

La base de datos es el corazón de toda empresa, en ella se almacena y... Más »
Este curso contiene cuatro actividades. Publico la primera actividad.
Este artículo intenta comentar la conexión entre la filosofía existencialista de Sartre y aquellos temas... Más »
La mayoría de los historiadores de la cultura del XVIII español están de acuerdo en... Más »
Completo y fácil curso de Photoshop para principiantes. Todo lo necesario para trabajar con imágenes. Más »
¿Estás seguro de que deseas eliminar este capítulo?