Guía 9 PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 17

1

Guía N.º 9

Curso
Administración de Base de Datos

Tema
Unión de Tablas en Oracle

La presente guía tiene por objetivo desarrollar la capacidad de


manejar eficientemente las operaciones de administración de Base
Sumilla de Datos Oracle. Obtendrá informes sobre esquemas creados, así
como también establecerá restricciones de acceso sobre los datos
integrando los procesos de enseñanza – aprendizaje con la
investigación aplicada y se presentan en un blog.
ii

Tabla de Contenidos

Unión de Tablas en Oracle ...................................................................................................... 3

1. Introducción a Unión......................................................................................................... 3

2. Uniones ............................................................................................................................. 4

2.1 Duplicados en la uniones ............................................................................................ 4

3. Intersecciones .................................................................................................................... 5

4. Diferencias ........................................................................................................................ 5

5. Combinaciones de Operaciones ........................................................................................ 6

6. Ordenación de Consultas Combinadas.............................................................................. 6

7. Taller Unión ..................................................................................................................... 9

7.1 Taller unión intersección .......................................................................................... 11

7.2. Taller unión minus ................................................................................................... 14

Referencias.............................................................................................................................. 17
3

Unión de Tablas en Oracle

Se usan cuando los datos que se quieren obtener pertenecen a distintas tablas y no se

puede acceder a ellos con una sola consulta. Es necesario que las tablas referenciadas tengan

tipos de datos similares, la misma cantidad de campos y el mismo orden de campos en la lista

de selección de cada consulta. (Oracle Ya, 2020)

1. Introducción a Unión

Estas consultas utilizan al menos dos SELECT cuyos resultados se pueden combinar

para formar una única consulta. Se basan en los operadores matemáticos de conjuntos (unión,

intersección y diferencia).

Figura 1. Uniones de Tablas.


(https://jorgesanchez.net/manuales/sql/select-conjuntos-sql2016.html)

El funcionamiento es el mismo que con los conjuntos. Lo más importante a tener en

cuenta es que en estas operaciones: el número de columnas, el tipo y el orden de dichas

columnas debe de ser el mismo en todas las consultas que se combinan. Por ejemplo:

SELECT nombre FROM personas

UNION

SELECT edad FROM personas;


4

Este código daría lugar a un error, ya que las columnas nombre (normalmente de tipo

VARCHAR2) y edad (normalmente de tipo NUMBER) no son del mismo tipo, lo que

provocaría un error.

En este otro código:

SELECT nombre,edad FROM clientes

UNION

SELECT edad,nombre FROM socios;

Aunque ambas consultas a unir tienen las mismas columnas y del mismo tipo, no

están el mismo orden por lo que tendremos un nuevo error. (Sanchez, 2020)

2. Uniones

La palabra UNION permite añadir el resultado de un SELECT a otro SELECT. Para

ello ambas instrucciones tienen que utilizar el mismo número y tipo de columnas. Ejemplo:

SELECT nombre FROM provincias

UNION

SELECT nombre FROM comunidades

El resultado es una tabla que contendrá nombres de provincia y de comunidades. Es

decir, UNION, retorna una consulta en la que el resultado son las filas de ambas consultas.

(Sanchez, 2020)

2.1 Duplicados en la uniones

El operador UNION une los resultados de varios SELECT. Pero si hay datos

duplicados en ellos, elimina los mismos. Ejemplo:

SELECT nif, nombre,apellido1,apellido2

FROM clientes

UNION

SELECT nif, nombre,apellido1,apellido2


5

FROM socios;

Si hay alguna persona que es cliente y socio a la vez solo aparecería una vez.

Por ello SQL aporta otro operador, UNION ALL:

SELECT nif, nombre,apellido1,apellido2

FROM clientes

UNION ALL

SELECT nif, nombre,apellido1,apellido2

FROM socios;

El funcionamiento y uso es similar, pero UNION ALL no elimina los datos repetidos.

3. Intersecciones

De la misma forma, la palabra INTERSECT permite unir dos consultas SELECT de

modo que el resultado serán las filas que estén presentes en ambas consultas.

Ejemplo; tipos y modelos de piezas que se encuentren sólo en los almacenes 1 y 2:

SELECT tipo,modelo FROM existencias

WHERE n_almacen=1

INTERSECT

SELECT tipo,modelo FROM existencias

WHERE n_almacen=2

4. Diferencias

Con MINUS también se combinan dos consultas SELECT de forma que aparecerán

los registros del primer SELECT que no estén presentes en el segundo.

Ejemplo; tipos y modelos de piezas que se encuentren el almacén 1 y no en el 2

SELECT tipo,modelo FROM existencias

WHERE n_almacen=1

MINUS
6

SELECT tipo,modelo FROM existencias

WHERE n_almacen=2; (Sanchez, 2020)

5. Combinaciones de Operaciones

Se pueden hacer varias combinaciones anidadas, lo que permite realizar consultas

muy complejas. Para aclarar qué operaciones deseamos realizar primero es conveniente

utilizar paréntesis. Ejemplo:

(SELECT tipo,modelo FROM existencias

WHERE n_almacen=1

INTERSECT

SELECT tipo,modelo FROM existencias

WHERE n_almacen=2)

MINUS

SELECT tipo,modelo FROM existencias

WHERE n_almacen=3;

Este código devuelve los tipos y modelos de piezas que están en los almacenes 1 y 2,

pero no en el almacén número 3. (Sanchez, 2020)

6. Ordenación de Consultas Combinadas

Si deseamos que el resultado de las operaciones UNION, INTERSECT o MINUS

salga ordenado, hay que tener en cuenta que la cláusula ORDER BY se debe indicar al final

de la instrucción. El problema es que el nombre de la columna puede ser distinto en los

diferentes SELECT que usa la consulta, como en:

SELECT apellido1

FROM alumnos

UNION

SELECT apellido2
7

FROM alumnos;

La solución es utilizar el nombre dado a las columnas en el primer SELECT de la

instrucción. Ejemplo:

SELECT apellido1

FROM alumnos

UNION

SELECT apellido2

FROM alumnos

ORDER BY apellido1;

No funcionaría este otro código:

SELECT apellido1

FROM alumnos

UNION

SELECT apellido2

FROM alumnos

ORDER BY apellido2; //error

También, como siempre, podemos indicar el número de la columna por la que

deseamos ordenar:

SELECT apellido1

FROM alumnos

UNION

SELECT apellido2

FROM alumnos

ORDER BY 1;
8

Además, hay que tener muy en cuente que la cláusula ORDER BY solo se puede

utilizar al final de todos los SELECT que se han combinado. Es incorrecto el código:

SELECT nif, nombre,apellido1,apellido2

FROM clientes

ORDER BY apellido1,apellido2,nombre --Error

UNION ALL

SELECT nif, nombre,apellido1,apellido2

FROM socios;

También lo es:

SELECT nif, nombre,apellido1,apellido2

FROM clientes

ORDER BY apellido1,apellido2,nombre --Error

UNION ALL

SELECT nif, nombre,apellido1,apellido2

FROM socios

ORDER BY apellido1,apellido2,nombre;

Solo es correcto:

SELECT nif, nombre,apellido1,apellido2

FROM clientes

UNION ALL

SELECT nif, nombre,apellido1,apellido2

FROM socios

ORDER BY apellido1,apellido2,nombre; (Sanchez, 2020)


9

7. Taller Unión

Una clínica almacena los datos de los médicos en una tabla llamada "medicos" y los

datos de los pacientes en otra denominada "pacientes".

reamos las tablas:

create table medicos(

legajo number(3),

documento varchar2(8) not null,

nombre varchar2(30),

domicilio varchar2(30),

especialidad varchar2(30),

primary key(legajo)

);

create table pacientes(

documento varchar2(8) not null,

nombre varchar2(30),

domicilio varchar2(30),

obrasocial varchar2(20),

primary key(documento)

);

Ingresamos algunos registros:

insert into medicos values(1,'20111222','Ana Acosta','Avellaneda 111','clinica');

insert into medicos values(2,'21222333','Betina Bustos','Bulnes 222','clinica');

insert into medicos values(3,'22333444','Carlos Caseros','Colon 333','pediatria');


10

insert into medicos values(4,'23444555','Daniel Duarte','Duarte Quiros

444','oculista');

insert into medicos values(5,'24555666','Estela Esper','Esmeralda 555','alergia');

insert into pacientes values('24555666','Estela Esper','Esmeralda 555','IPAM');

insert into pacientes values('23444555','Daniel Duarte','Duarte Quiros 444','OSDOP');

insert into pacientes values('30111222','Fabiana Fuentes','Famatina 666','PAMI');

insert into pacientes values('31222333','Gaston Gonzalez','Guemes 777','PAMI');

La clínica necesita el nombre y domicilio de médicos y pacientes para enviarles una

tarjeta de invitación a la inauguración de un nuevo establecimiento. Emplee el operador

"union" para obtener dicha información de ambas tablas (7 registros)

Note que existen dos médicos que también están presentes en la tabla "pacientes";

tales registros aparecen una sola vez en el resultado de "union".

select nombre, domicilio from medicos

union

select nombre, domicilio from pacientes

Realice la misma consulta anterior pero esta vez, incluya los registros duplicados.

Emplee "union all" (9 registros)

select nombre, domicilio from medicos

union all

select nombre, domicilio from pacientes;

Realice la misma consulta anterior y esta vez ordene el resultado por nombre (9

registros)

select nombre, domicilio from medicos


11

union all

select nombre, domicilio from pacientes

order by nombre;

Agregue una columna extra a la consulta con el encabezado "condicion" en la que

aparezca el literal "médico" o "paciente" según si la persona es uno u otro (9 registros)

select nombre, domicilio, 'médico' as condicion from medicos

union

select nombre, domicilio,'paciente' from pacientes

order by condicion; (Oracle Ya, 2020)

7.1 Taller unión intersección

Caso: Una academia de enseñanza de idiomas da clases de inglés, frances y portugues;

almacena los datos de los alumnos que estudian inglés en una tabla llamada "ingles", los que

están inscriptos en "francés" en una tabla denominada "frances" y los que cursan portugues

en la tabla "portugues".

Creamos las tablas:

create table ingles(

documento varchar2(8) not null,

nombre varchar2(30),

domicilio varchar2(30),

primary key(documento)

);

create table frances(

documento varchar2(8) not null,

nombre varchar2(30),

domicilio varchar2(30),
12

primary key(documento) );

create table portugues(

documento varchar2(8) not null,

nombre varchar2(30),

domicilio varchar2(30),

primary key(documento) );

Ingresamos algunos registros:

insert into ingles values('20111222','Ana Acosta','Avellaneda 111');

insert into ingles values('21222333','Betina Bustos','Bulnes 222');

insert into ingles values('22333444','Carlos Caseros','Colon 333');

insert into ingles values('23444555','Daniel Duarte','Duarte Quiros 444');

insert into ingles values('24555666','Estela Esper','Esmeralda 555');

insert into frances values('23444555','Daniel Duarte','Duarte Quiros 444');

insert into frances values('24555666','Estela Esper','Esmeralda 555');

insert into frances values('30111222','Fabiana Fuentes','Famatina 666');

insert into frances values('30222333','Gaston Gonzalez','Guemes 777');

insert into portugues values('23444555','Daniel Duarte','Duarte Quiros 444');

insert into portugues values('22333444','Carlos Caseros','Colon 333');

insert into portugues values('30222333','Gaston Gonzalez','Guemes 777');

insert into portugues values('31222333','Hector Huerta','Homero 888');

insert into portugues values('32333444','Ines Ilara','Inglaterra 999');

La academia necesita el nombre y domicilio de todos los alumnos que cursan los tres

idiomas para enviarles una tarjeta de descuento. Obtenemos los datos necesarios de las tres

tablas en una sola consulta realizando una intersección entre ellas:

select nombre, domicilio from ingles


13

intersect

select nombre, domicilio from frances

intersect

select nombre, domicilio from portugues;

Aparece solamente un registro, correspondiente a "Daniel Duarte", que está en las tres

tablas. Note que los alumnos que solamente asisten a una clase o solamente a dos, no

aparecen en el resultado.

Si queremos los registros que están presentes en más de dos tablas podemos realizar

una consulta combinando los operadores de intersección y de unión:

select nombre, domicilio from ingles

intersect

select nombre, domicilio from frances

union

(select nombre, domicilio from ingles

intersect

select nombre, domicilio from portugues)

union

(select nombre, domicilio from frances

intersect

select nombre, domicilio from portugues);

En la consulta anterior, la primera intersección (inglés con francés) retorna 2 registros

(Esper y Duarte); la segunda intersección (inglés y portugues) retorna 2 registros (Caseros y

Duarte); unimos estos dos resultados con "union" y obtenemos 3 registros (Caseros, Duarte y

Esper); la tercera intersección (francés y portugués) retorna 2 registros (Duarte y Gozalez)

que al "unirlos" al resultado de la primera unión (Caseros, Duarte y Esper) nos devuelve 4
14

registros. Note que algunas consultas se encierran entre paréntesis para especificar que la

operación se realiza entre las tablas incluidas en ellos. (Oracle Ya, 2020)

7.2. Taller unión minus

Caso. Una academia de enseñanza de idiomas da clases de inglés y frances; almacena

los datos de los alumnos que estudian inglés en una tabla llamada "ingles" y los que están

inscriptos en "francés" en una tabla denominada "frances".

Creamos las tablas:

create table ingles(

documento varchar2(8) not null,

nombre varchar2(30),

domicilio varchar2(30),

primary key(documento) );

create table frances(

documento varchar2(8) not null,

nombre varchar2(30),

domicilio varchar2(30),

primary key(documento) );

Ingresamos algunos registros:

insert into ingles values('20111222','Ana Acosta','Avellaneda 111');

insert into ingles values('21222333','Betina Bustos','Bulnes 222');

insert into ingles values('22333444','Carlos Caseros','Colon 333');

insert into ingles values('23444555','Daniel Duarte','Duarte Quiros 444');

insert into ingles values('24555666','Estela Esper','Esmeralda 555');

insert into frances values('23444555','Daniel Duarte','Duarte Quiros 444');


15

insert into frances values('24555666','Estela Esper','Esmeralda 555');

insert into frances values('30111222','Fabiana Fuentes','Famatina 666');

insert into frances values('30222333','Gaston Gonzalez','Guemes 777');

La academia necesita el nombre y domicilio de todos los alumnos que cursan

solamente inglés (no presentes en la tabla "frances") para enviarles publicidad referida al

curso de francés. Empleamos el operador "minus" para obtener dicha información:

select nombre, domicilio from ingles

minus

select nombre,domicilio from frances;

El resultado muestra los registros de la primera consulta que NO coinciden con

ningún registro de la segunda consulta. Los registros presentes en ambas tablas (Daniel

Duarte y Estela Esper), no aparecen en el resultado final. La academia necesita el nombre y

domicilio de todos los alumnos que cursan solamente francés (no presentes en la tabla

"ingles") para enviarles publicidad referida al curso de inglés. Empleamos el operador

"minus" para obtener dicha información:

select nombre, domicilio from frances

minus

select nombre,domicilio from ingles;

El resultado muestra los registros de la primera consulta que NO coinciden con

ningún registro de la segunda consulta. Los registros presentes en ambas tablas (Daniel

Duarte y Estela Esper), no aparecen en el resultado final. Si queremos los alumnos que cursan

un solo idioma (registros de "ingles" y de "frances" que no coinciden), podemos unir ambas

tablas y luego restarle la intersección:

select nombre from ingles

union
16

select nombre from frances

minus

(select nombre from ingles

intersect

select nombre from frances);

Podemos obtener el mismo resultado anterior con la siguiente consulta en la cual se

buscan los registros de "ingles" que no coinciden con "frances" y los registros de "frances"

que no coinciden con "ingles" y luego se unen ambos resultados:

select nombre from ingles

minus

select nombre from frances

union

(select nombre from frances

minus

select nombre from ingles); (Oracle Ya, 2020)


17

Referencias

Oracle Ya (2020). Unión. Recuperado de

https://www.tutorialesprogramacionya.com/oracleya/temarios/descripcion.php?cod=2

23&punto=65&inicio=

Sánchez J. (2020). Introducción. Recuperado de

https://jorgesanchez.net/manuales/sql/select-conjuntos-sql2016.html

También podría gustarte