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 y
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
- from establece la fuente de datos,
- where la información objetivo en bruto, y
- select la extracción de la información deseada.
IMPORTANTE: Esto no es necesariamente real, una 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 |