Inicio‎ > ‎SQL‎ > ‎Lecciones SQL‎ > ‎

P04 Uso de varias tablas

Uso de más de una tabla

Para la resolución de la mayoría de consultas es necesario trabajar con información que se obtiene de relacionar varias tablas. La forma de especificar qué tablas vamos a consultar es construir una lista de nombres de tablas en la cláusula from.

Si seleccionamos la BD Ejemplo, podemos preguntar por el

Nombre de los profesores y la descripción de las asignaturas que imparten

¿Dónde está la información solicitada? Consultando el esquema de la base de datos Ejemplo:

nombre (del profesor) se encuentra en la tabla PROFESORES 
descripción (de la asignatura) en ASIGNATURAS.

Si no lo pensamos mucho podríamos ejecutar la siguiente orden confiando en el todopoderoso SGBD:

select nombre, descripcion 
from asignaturas, profesores

nombre descripcion
EVA GOMEZ DISEÑO Y GESTION DE BASES DE DATOS
MANUEL PALOMAR DISEÑO Y GESTION DE BASES DE DATOS
RAFAEL ROMERO DISEÑO Y GESTION DE BASES DE DATOS
EVA GOMEZ FUNDAMENTOS DE LAS BASES DE DATOS
MANUEL PALOMAR FUNDAMENTOS DE LAS BASES DE DATOS
RAFAEL ROMERO FUNDAMENTOS DE LAS BASES DE DATOS
EVA GOMEZ FUNDAMENTOS DE LA PROGRAMACION
MANUEL PALOMAR FUNDAMENTOS DE LA PROGRAMACION
RAFAEL ROMERO FUNDAMENTOS DE LA PROGRAMACION
EVA GOMEZ HISTORIA DE LA INFORMATICA
MANUEL PALOMAR HISTORIA DE LA INFORMATICA
RAFAEL ROMERO HISTORIA DE LA INFORMATICA
EVA GOMEZ PROGRAMACION CONCURRENTE
MANUEL PALOMAR PROGRAMACION CONCURRENTE
RAFAEL ROMERO PROGRAMACION CONCURRENTE


Obviamente, el resultado anterior no se corresponde con la información solicitada, hemos hecho un producto cartesiano entre dos conjuntos, la combinación de todos los nombres de profesor con todas las descripciones de asignatura.

En este caso, la relación entre profesores y asignaturas se encuentra en IMPARTE que tiene 2 claves ajenas, una está asociada a la clave primaria de profesor y la otra a la clave primaria de asignaturas. XXXX

dni

asignatura

21111222

DGBD

21111222

FBD

21333444

PC


Pensemos en IMPARTE como un "puente" que nos permite enlazar la información de la primera tabla con la segunda: de PROFESORES pasamos a IMPARTE mediante el dni, y de IMPARTE a ASIGNATURAS mediante el código de la asignatura.

PROFESORES  dni=dni  IMPARTE  asignatura=codigo  ASIGNATURAS


Necesitamos, por tanto, incluir la tabla IMPARTE en el from, y especificar en el where las condiciones para concatenar las tuplas deseadas.

Nombre de los profesores y descripción de las asignaturas que imparten
(lo que debemos mostar): select nombre, descripcion 
(donde está la información necesaria): from asignaturas, profesores, imparte 
(igualando claves ajenas y claves primarias): where imparte.dni = profesores.dni and asignatura = codigo

nombre descripcion
EVA GOMEZ DISEÑO Y GESTION DE BASES DE DATOS
EVA GOMEZ FUNDAMENTOS DE LAS BASES DE DATOS
RAFAEL ROMERO PROGRAMACION CONCURRENTE



Para entender mejor cómo se obtienen los resultados de una consulta podemos pensar que el orden de ejecución es

from asignaturas, profesores, imparte (producto cartesiano)
where profesores.dni = imparte.dni and asignatura = codigo (selección)
select nombre, descripcion (proyección)
1. 
select * from asignaturas, profesores, imparte

codigo descripcion creditos creditosp dni nombre categoria ingreso dni asignatura
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21111222 EVA GOMEZ TEU 1993-10-01 21111222 DGBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 DGBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 DGBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21111222 EVA GOMEZ TEU 1993-10-01 21111222 FBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 FBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 FBD
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21111222 EVA GOMEZ TEU 1993-10-01 21333444 PC
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21222333 MANUEL PALOMAR TEU 1989-06-16 21333444 PC
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21333444 RAFAEL ROMERO ASO6 1992-06-16 21333444 PC
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01 21111222 DGBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 DGBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 DGBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01 21111222 FBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 FBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 FBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01 21333444 PC
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21222333 MANUEL PALOMAR TEU 1989-06-16 21333444 PC
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21333444 PC
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21111222 EVA GOMEZ TEU 1993-10-01 21111222 DGBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 DGBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 DGBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21111222 EVA GOMEZ TEU 1993-10-01 21111222 FBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 FBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 FBD
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21111222 EVA GOMEZ TEU 1993-10-01 21333444 PC
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21222333 MANUEL PALOMAR TEU 1989-06-16 21333444 PC
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21333444 PC
HI HISTORIA DE LA INFORMATICA 4.5
21111222 EVA GOMEZ TEU 1993-10-01 21111222 DGBD
HI HISTORIA DE LA INFORMATICA 4.5
21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 DGBD
HI HISTORIA DE LA INFORMATICA 4.5
21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 DGBD
HI HISTORIA DE LA INFORMATICA 4.5
21111222 EVA GOMEZ TEU 1993-10-01 21111222 FBD
HI HISTORIA DE LA INFORMATICA 4.5
21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 FBD
HI HISTORIA DE LA INFORMATICA 4.5
21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 FBD
HI HISTORIA DE LA INFORMATICA 4.5
21111222 EVA GOMEZ TEU 1993-10-01 21333444 PC
HI HISTORIA DE LA INFORMATICA 4.5
21222333 MANUEL PALOMAR TEU 1989-06-16 21333444 PC
HI HISTORIA DE LA INFORMATICA 4.5
21333444 RAFAEL ROMERO ASO6 1992-06-16 21333444 PC
PC PROGRAMACION CONCURRENTE 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01 21111222 DGBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 DGBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 DGBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01 21111222 FBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21222333 MANUEL PALOMAR TEU 1989-06-16 21111222 FBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21111222 FBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01 21333444 PC
PC PROGRAMACION CONCURRENTE 6.0 1.5 21222333 MANUEL PALOMAR TEU 1989-06-16 21333444 PC
PC PROGRAMACION CONCURRENTE 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21333444 PC


2. 
select * from asignaturas, profesores, imparte 
where profesores.dni = imparte.dni and asignatura = codigo

codigo descripcion creditos creditosp dni nombre categoria ingreso dni asignatura
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0 21111222 EVA GOMEZ TEU 1993-10-01 21111222 DGBD
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5 21111222 EVA GOMEZ TEU 1993-10-01 21111222 FBD
PC PROGRAMACION CONCURRENTE 6.0 1.5 21333444 RAFAEL ROMERO ASO6 1992-06-16 21333444 PC


3. 
select nombre, descripcion 
from asignaturas, profesores, imparte where profesores.dni=imparte.dni 
and asignatura=codigo

nombre descripcion
EVA GOMEZ DISEÑO Y GESTION DE BASES DE DATOS
EVA GOMEZ FUNDAMENTOS DE LAS BASES DE DATOS
RAFAEL ROMERO PROGRAMACION CONCURRENTE

Resumiendo, podemos decir que

  1. from establece la fuente de datos,
  2. where la información objetivo en bruto, y
  3. select la extracción de la información deseada. 

IMPORTANTE: Esto no es necesariamente realuna de las ventajas de utilizar un SGBD es que las consultas se procesan de manera eficiente y de forma totalmente transparente para el usuario. Es sólo una forma de comprender las acciones básicas que representa cada parámetro de la orden select.



Nombres cualificados de atributo

Un nombre cualificado de atributo es el que especifica el nombre de la tabla a la que pertenece la columna:

profesores.dni
asignaturas.descripción

Es obligatorio utilizar nombres cualificados de atributo si hay ambigüedad, si varias tablas de la select tienen columnas que se llaman igual:

profesores.dni
imparte.dni

En cualquier otro caso no es necesario.

DNI y nombre de los profesores que imparten alguna asignatura

select profesores.dni, nombre 
from profesores, imparte 
where profesores.dni = imparte.dni

dni nombre
21111222 EVA GOMEZ
21111222 EVA GOMEZ
21333444 RAFAEL ROMERO

Igual que el anterior pero no cualificando el dni de la proyección

select dni, nombre
from profesores, imparte 
where profesores.dni = imparte.dni

Error at Command Line:3 Column:0
Error report:
SQL Error: Column 'dni' in field list is ambiguous

También es útil cuando, a partir de varias tablas, se quieren todas las columnas de una y sólo alguna de las otras

select profesores.*, descripcion
from profesores, asignaturas, imparte
where profesores.dni = imparte.dni
and codigo = asignatura 

dni nombre categoria ingreso descripcion
21111222 EVA GOMEZ TEU 1993-10-01 DISEÑO Y GESTION DE BASES DE DATOS
21111222 EVA GOMEZ TEU 1993-10-01 FUNDAMENTOS DE LAS BASES DE DATOS
21333444 RAFAEL ROMERO ASO6 1992-06-16 PROGRAMACION CONCURRENTE


Sinónimos temporales de tabla

select * from tabla alias

Una cadena de caracteres a continuación del nombre de la tabla en el from, es un alias temporal, un nombre sustitutivo.
Es recomendable para simplificar la escritura de la orden select o para hacerla más legible.
Es obligatorio para un producto cartesiano de una tabla por si misma: select p1.nombre, p2.nombre
from profesores p1, profesores p2
where p1.nombre <> p2.nombre

nombre nombre
MANUEL PALOMAR EVA GOMEZ
RAFAEL ROMERO EVA GOMEZ
EVA GOMEZ MANUEL PALOMAR
RAFAEL ROMERO MANUEL PALOMAR
EVA GOMEZ RAFAEL ROMERO
MANUEL PALOMAR RAFAEL ROMERO



Cuando se define el sinónimo en el from, sustituye totalmente al nombre de la tabla (no se permite utilizar los dos simultáneamente en el select o el where)
Por otro lado, no es necesario definir sinónimos para todas las tablas del from.

DNI y nombre de los profesores que imparten alguna asignatura (utilizando sinónimos temporales de tabla)

select p.dni, nombre
from profesores p, imparte i
where p.dni = i.dni 

dni nombre
21111222 EVA GOMEZ
21111222 EVA GOMEZ
21333444 RAFAEL ROMERO