Publicado el 10 de Mayo del 2017
1.523 visualizaciones desde el 10 de Mayo del 2017
133,0 KB
13 paginas
Creado hace 16a (30/09/2008)
Lenguaje SQL
Joins
Utilizando cláusulas SQL es posible recuperar datos combinados de
varias tablas, uniéndolas entre sí de dos en dos.
En Oracle existen dos formas de hacer una unión entre tablas, la
clásica, que está disponible en todas las versiones, pero no cumple
con los estandares ANSI y la estándar, que se puede usar a partir de
Oracle 9i y cumple con la regulación SQL:1999
Clásica
Unión de Igualdad
(Equijoin)
Unión de no igualdad (Non-
Equijoin)
Unión externa (Outer Join)
Autounión (Self Join)
Estándar
Cross Joins
Natural Joins
Cláusula USING
Full Outer Joins
Outer Joins con condiciones
arbitrarias
Producto Cartesiano
Cuando se intenta unir dos tablas y la condición no es válida o no
existe, se produce un producto cartesiano, que consiste en una
combinación de las filas de las dos tablas independientemente de si
están relacionadas o no.
Para evitar este tipo de operaciones, que son tremendamente
costosas para el servidor y ofrecen informaciones que en muy raras
ocasiones son relevantes, no se debe omitir la cláusula WHERE y una
condición válida al unir tablas entre sí.
SELECT *
FROM pais, lugar;
ID_ P
AIS
NO M
BRE
CON TIN
E NTE
ID_ L
UG A
R
ID_
P AI
S
1
1
1
1
1
1
1
1
1
España
Europa
España
Europa
España
España
España
Europa
Europa
Europa
España
Europa
España
Europa
España
Europa
España
Europa
18
19
83
84
85
20
21
22
23
3
3
3
3
3
4
4
4
4
NO M
BRE
Capri
Nápoles
Pisa
Venecia
Córcega
París
Marsella
Euro
Disney
Versalles
TIP O_
L UG A
R
H AB
IT A
NT E
S
CL IM
A
3
5
1
1
5
1
3
6
1
12200
-
-
Mediterráneo
88363
268934
281000
2153600
820900
-
85726
-
-
-
Semicontinen
tal
-
-
-
(...)
La consulta devolvería un registro de la tabla lugar por cada registro
de la tabla país, aunque no haya relación entre ellos.
I.Unión de tablas con Sintaxis Oracle (Clásica)
SELECT tabla1.columna1, tabla2.columna2
FROM tabla1, tabla2
WHERE tabla1.columna1 = tabla2.columna2;
Para unir tablas utilizando la sintáxis propia de Oracle, se deben
especificar en el FROM las tablas implicadas en la unión y en el
WHERE la condición o condiciones de unión entre ellas.
En la cláusula SELECT es recomendable especificar el nombre
cualificado de las columnas recuperadas, es decir, se debe especificar
el nombre de la columna, precedido por el de la tabla propietaria de
la misma. En caso de que la columna tenga el mismo nombre en
varias tablas, los nombres cualificados son obligatorios.
Si se quiere unir varias tablas, es necesario relacionarlas todas entre
sí, es decir, que cada tabla aparezca al menos en alguna de las
condiciones de unión.
Unión de Igualdad (Equijoin)
Este tipo de unión implica que los valores de las columnas utilizadas
en la condición de unión deben ser iguales.
Es el tipo de unión que se suele producir entre tablas relacionadas
por una clave primaria y una clave ajena.
SELECT lugar.nombre AS "Nombre del lugar",
FROM pais, lugar
WHERE pais.id_pais = lugar.id_pais;
pais.nombre as "Nombre del País", pais.continente
No mb re Del Lug a r No mb re De l Pa ís CONT I NENT E
Capri
Nápoles
Pisa
Venecia
Córcega
París
Marsella
Euro Disney
Versalles
Londres
Italia
Italia
Italia
Italia
Italia
Francia
Francia
Francia
Francia
Reino Unido
Europa
Europa
Europa
Europa
Europa
Europa
Europa
Europa
Europa
Europa
En la cláusula SELECT se especifican las columnas, alias y/o
expresiones, cualificadas con el nombre de la tabla correspondiente.
En la cláusula FROM se especifican las tablas implicadas, separadas
por comas.
En la cláusula WHERE se especifica la condición o condiciones de
unión entre las tablas, con los nombres de las columnas implicadas
también cualificados.
Es posible especificar tantas cláusulas de restricción en el WHERE
como se necesite, utilizando las cláusulas tipo AND y OR.
pais.nombre as "Nombre del País", pais.continente
SELECT lugar.nombre AS "Nombre del lugar",
FROM pais, lugar
WHERE pais.id_pais = lugar.id_pais
AND continente IN ('América del Norte','Oceanía');
No mb re Del Lug a r No mb re De l Pa ís CONT I NENT E
Los Ángeles
Yosemite
Yucatán
Sídney
Melbourne
Cairns
Darwin
Ayers Rock
Kings Canyon
Yellowstone
Estados Unidos
Estados Unidos
Méjico
Australia
Australia
Australia
Australia
Australia
Australia
América del Norte
América del Norte
América del Norte
Oceanía
Oceanía
Oceanía
Oceanía
Oceanía
Oceanía
Estados Unidos
América del Norte
Es posible simplificar la sintaxis de las consuiltas Join utilizando alias
para las tablas implicadas, de forma que no es necesario escribir el
nombre de la tabla para cualificar sus columnas, basta con especificar
el alias.
SELECT l.nombre AS "Nombre del lugar",
FROM pais p, lugar l
WHERE p.id_pais = l.id_pais
AND p.continente IN ('América del Norte','Oceanía');
p.nombre as "Nombre del País", p.continente
No mb re Del Lug a r No mb re De l Pa ís CONT I NENT E
Los Ángeles
Yosemite
Yucatán
Sídney
Melbourne
Cairns
Darwin
Ayers Rock
Kings Canyon
Yellowstone
Estados Unidos
Estados Unidos
Méjico
Australia
Australia
Australia
Australia
Australia
Australia
América del Norte
América del Norte
América del Norte
Oceanía
Oceanía
Oceanía
Oceanía
Oceanía
Oceanía
Estados Unidos
América del Norte
Una vez que se especifica el alias para la tabla, no puede usarse el
nombre original en esa consulta, debe utilizarse siempre el alias
asignado.
Los alias pueden tener hasta 30 caracteres de largo, pero se
recomienda utilizar nombres lo mas cortos y descriptivos posible.
Cuando se asigna un alias a una tabla para una SELECT, el alcance de
dicho alias se restringe a la cláusula SELECT concreta, si se hace una
nueva consulta, el alias no sería válido.
Unión de más de dos tablas.
Para unir un número n de tablas, es necesario tener, por lo menos n-
1 condiciones de unión entre ellas.
SELECT v.nombre, v.apellidos, vi.fecha, lu.nombre
FROM viajero v, viaje vi, lugar lu
WHERE v.id_viajero = vi.id_viajero
AND vi.id_lugar = lu.id_lugar
ORDER BY fecha;
NOM B RE APELL IDO S
FECH A NOM B RE
Lorena
Diana
Antonio
Beatriz
Roberto
Damián
María
Julián
Sofia
Jose Luís
Hernández
Menéndez
Domínguez
González
Fernández
Rodríguez
Muñoz
Rodríguez
Martínez
Suárez
15/11/01
17/11/01
12/12/01
28/12/01
15/01/02
20/01/02
27/01/02
22/02/02
23/02/02
08/03/02
Kings Canyon
Florencia
Segovia
Picos de Europa
Euro Disney
Vladivostok
Rabat
Boston
Sídney
Granada
Unión de no igualdad (Non-Equijoin)
Son un tipo de unión no muy utilizado, que une dos tablas por una
condición diferente a la de igualdad
SELECT v.nombre, v.apellidos, vi.numero_dias, t.nombre
FROM viajero v, viaje vi, tipo_estancia t
WHERE v.id_viajero = vi.id_viajero
AND vi.numero_dias BETWEEN t.dia_desde AND t.dia_hasta
ORDER BY fecha;
NOMB RE APELL IDO S NUM ERO_ DIA S NOM B RE
Lorena
Diana
Antonio
Beatriz
Roberto
Damián
María
Julián
Sofia
Jose Luís
Hernández
Menéndez
Domínguez
González
Fernández
Rodríguez
Muñoz
Rodríguez
Martínez
Suárez
12
4
6
3
9
6
6
13
9
9
Vacaciones
Puente
Viaje
Puente
Vacaciones
Viaje
Viaje
Vacaciones
Vacaciones
Vacaciones
Uniones Externas (Outer Join)
Los registros que no cumplen las condiciones de unión entre las
tablas, no aparecen en los resultados de las consultas, sin embargo,
es posible mostrar estos registros utilizando las uniones externas.
Estas uniones muestran tanto los registros que cumplen las
condiciones como los que no las cumplen, mostrando la información
que falta como valores nulos.
SELECT tabla1.columna1, tabla2.columna2
FROM tabla1, tabla2
WHERE tabla1.columna1(+) = tabla2.columna2;
SELECT tabla1.columna1, tabla2.columna2
FROM tabla1, tabla2
WHERE tabla1.columna1 = tabla2.columna2(+);
El operador que marca la unión externa en el modo SQL clásico de
oracle es el (+), que se coloca junto a la condición de unión que tiene
información insuficiente, es decir junto a la columna de la tabla débil.
SELECT p.nombre AS "País", l.nombre AS "Lugar"
FROM pais p, lugar l
WHERE p.id_pais = l.id_pais(+)
ORDER BY l.id_pais DESC;
Pa ís
L ug a r
Nueva Zelanda
Ecuador
Argelia
Uruguay
Alemania
Hungría
Hungría
-
-
-
-
-
Szeged
Budapest
República Checa
Brno
República Checa
Praga
Tailandia
Bangkok
El operador de unión externa (+) solamente puede aparecer en un
lado de la igualdad y no puede utilizarse con operadores IN ni
condiciones OR.
SELECT p.nombre AS "País", l.nombre AS "Lugar"
FROM pais p, lugar l
WHERE p.id_pais = l.id_pais(+)
OR p.nombre = 'Ecuador'
ORDER BY l.id_pais DESC;
ORA-01719: operador de unión externa (+) no permitido en operando OR ni IN
Autouniones (Self Join)
En ocasiones puede ser necesario unir una tabla consigo misma para
obtener un resultado determinado, para ello, se debe instar la tabla
dos veces en la cláusula FROM, asignándole un alias diferente.
Por ejemplo, para obtener todos los viajeros del mismo perfil que
Beatriz González, deberemos unir la tabla viajeros consigo misma:
SELECT v1.nombre, v1.apellidos, v1.perfil_viajero
FROM viajero v1, viajero v2
WHERE v1.perfil_viajero = v2.perfil_viajero
AND v2.nombre = 'Beatriz'
AND v2.apellidos = 'González';
NOM B RE APELL IDO S
P ERF IL_ V IAJ ERO
Alberto
Marcos
Lorena
Beatriz
Margarita
Carmen
Natalia
Oriol
Olg
Comentarios de: Lenguaje SQL - Joins (0)
No hay comentarios