44 - Combinación interna (inner join) |
Una librería almacena la información de sus libros para la venta en dos tablas, "libros" y "editoriales".
Creamos las tablas:
create table libros( codigo serial, titulo varchar(40), autor varchar(30) default 'Desconocido', codigoeditorial smallint not null, precio decimal(5,2), primary key(codigo) ); create table editoriales( codigo serial, nombre varchar(20), primary key (codigo) );
Ingresamos algunos registros en ambas tablas:
insert into editoriales(nombre) values('Planeta'); insert into editoriales(nombre) values('Emece'); insert into editoriales(nombre) values('Siglo XXI'); insert into libros(titulo,autor,codigoeditorial,precio) values('El aleph','Borges',2,20); insert into libros(titulo,autor,codigoeditorial,precio) values('Martin Fierro','Jose Hernandez',1,30); insert into libros(titulo,autor,codigoeditorial,precio) values('Aprenda PHP','Mario Molina',3,50); insert into libros(titulo,autor,codigoeditorial,precio) values('Java en 10 minutos',default,3,45);
Recuperamos los datos de libros:
select* from libros;
vemos que en el campo "editorial" aparece el código, pero no sabemos el nombre de la editorial.
Realizamos un join para obtener datos de ambas tablas (titulo, autor y nombre de la editorial):
select titulo, autor, nombre from libros join editoriales on codigoeditorial=editoriales.codigo;
Mostramos el código del libro, título, autor, nombre de la editorial y el precio realizando un join y empleando alias:
select l.codigo,titulo,autor,nombre,precio from libros as l join editoriales as e on codigoeditorial=e.codigo;
Note que al listar el campo "codigo" especificamos a qué tabla pertenece; si no lo hacemos PostgreSQL no sabrá si nos referimos al de la tabla "libros" o "editoriales". Los demás campos no tienen referencia a la tabla porque tienen nombres que no se repiten.
Realizamos la misma consulta anterior agregando un "where" para obtener solamente los libros de la editorial "Siglo XXI":
select l.codigo,titulo,autor,nombre,precio from libros as l join editoriales as e on codigoeditorial=e.codigo where e.nombre='Siglo XXI';
Obtenemos título, autor y nombre de la editorial, esta vez ordenados por título:
select titulo,autor,nombre from libros as l join editoriales as e on codigoeditorial=e.codigo order by titulo;