PDF de programación - Lecciones SQL - T11 Conjuntos

Imágen de pdf Lecciones SQL - T11 Conjuntos

Lecciones SQL - T11 Conjuntosgráfica de visualizaciones

Publicado el 22 de Junio del 2017
1.272 visualizaciones desde el 22 de Junio del 2017
79,5 KB
10 paginas
Creado hace 10a (17/05/2013)
https://sites.google.com/site/fbddocs/practicas-sql-espanol/conjuntos?...

Lecciones SQL >

T11 Conjuntos

Operaciones de conjuntos y MySQL

Contenidos

Un operador sobre conjuntos combina el resultado de dos sentencias

select en un único resultado. Dependiendo del tipo de operación

esas sentencias deberán cumplir unos requisitos en cuanto al

resultado que dan.

Los operadores de conjuntos definidos para el álgebra relacional,

base sobre la que se cimenta SQL, son la unión, intersección,

diferencia, producto cartesiano y división. En otros motores de base

de datos se dispone de algunos operadores como UNION,

INTERSECT y MINUS.

1 Operaciones de conjuntos y MySQL

2 Unión
3 Intersección

4 Diferencia
5 Producto cartesiano

6 Concatenación natural
7 División

7.1 La división del álgebra relacional con
EXISTS

7.2 Otros usos
7.3 Alternativas

7.4 Eficiencia

En MySQL solo está disponible el operador UNION, aunque la

operativa de los otros puede simularse con otros operadores de los que ya hemos visto unos cuantos.

Unión

Al utilizar el operador UNION entre dos sentencias select, el resultado final estará compuesto por todas

aquellas filas que aparecen en el resultado de como mínimo una de las select. El operador UNION elimina filas

duplicadas en el resultado final. El operador UNION ALL opera de igual modo que el operador UNION, pero no

elimina filas duplicadas en el resultado final.

Supongamos que queremos saber el nombre de los profesores que son ASO6 o imparten asignaturas de 6 créditos.

Veamos primero el resultado de cada consulta por separado.

1) Nombre de los profesores cuya categoría es ASO6.

select nombre from profesores where categoria='ASO6';

2) Nombre de los profesores que imparten asignaturas de 6 créditos.

select nombre

from profesores p, imparte i, asignaturas

where p.dni=i.dni and asignatura=codigo and creditos=6;

Nombre de los profesores que son ASO6 o imparten asignaturas de 6 créditos.

1 de 10

17/05/2013 14:00

https://sites.google.com/site/fbddocs/practicas-sql-espanol/conjuntos?...

select nombre from profesores where categoria='ASO6'

UNION

select nombre

from profesores p, imparte i, asignaturas

where p.dni=i.dni and asignatura=codigo and creditos=6;

nombre
RAFAEL ROMERO
EVA GOMEZ

La misma consulta pero solucionada con UNION ALL

select nombre from profesores where categoria='ASO6'

UNION ALL

select nombre

from profesores p, imparte i, asignaturas

where p.dni=i.dni and asignatura=codigo and creditos=6;

nombre
RAFAEL ROMERO
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO

Intersección

Aunque no existe tal operador en MySQL, normalmente se puede sustituir por consultas ya conocidas.

DNI de los profesores que imparten y preparan.

IMPARTE[dni]



(COORDINADORES[dni])

Lo que debería solucionarse como

select dni from imparte

INTERSECT

select dni from prepara;

en realidad, en MySQL, debemos expresarlo como:

select distinct i.dni

2 de 10

17/05/2013 14:00

https://sites.google.com/site/fbddocs/practicas-sql-espanol/conjuntos?...

from imparte i, prepara pp

where pp.dni=i.dni;

dni
21111222
21333444

Se usa el modificador distinct para que la expresión sustituya realmente la operativa de la intersección: las

operaciones de conjuntos no devuelven duplicados (al igual que union all es una extensión para que se

puedan resolver cierto tipo de consultas que sí necesitan los duplicados). No obstante, lo usaremos o no

dependiendo de si lo necesitamos o no.

Diferencia

El operador MINUS tampoco está implementado en MySQL pero es fácilmente sustituible por expresiones NOT

IN. En todo caso, el resultado final estará compuesto sólo por aquellas filas que aparecen en el resultado de la

primera select y no aparecen en el resultado de la segunda.

Nombre de los profesores que son TEU y no imparten asignaturas de 6 créditos.

PROFESORES donde categoría='TEU' [nombre]

-

(PROFESORES x IMPARTE x ASIGNATURA
donde (PROFESORES.dni = IMPARTE.dni y codigo=asignatura y créditos=6)

[nombre])

Lo que debería solucionarse como

select nombre from profesores where categoria='TEU'

MINUS

select nombre

from profesores p, imparte i, asignaturas

where p.dni=i.dni and asignatura=codigo and creditos=6;

se soluciona así:

select nombre from profesores where categoria='TEU'

and nombre NOT IN

(select nombre

from profesores p, imparte i, asignaturas

where p.dni=i.dni and asignatura=codigo and creditos=6);

3 de 10

17/05/2013 14:00

https://sites.google.com/site/fbddocs/practicas-sql-espanol/conjuntos?...

nombre

MANUEL PALOMAR

Esta sería la consulta exactamente equivalente a la diferencia de conjuntos tal y como está definida en el

álgebra relacional, con relaciones compatibles, pero esto es SQL, podemos simplificar la consulta y obtendremos

el mismo resultado:

select nombre from profesores

where categoria='TEU'

and dni NOT IN

(select dni

from imparte i, asignaturas

where asignatura=codigo and creditos=6);

Producto cartesiano

En SQL, y como ya se ha dicho anteriormente, el producto cartesiano se realiza con una select "sin where".

select dni, codigo

from profesores, asignaturas

codigo

dni
21111222 DGBD
21222333 DGBD
21333444 DGBD
21111222 FBD
21222333 FBD
21333444 FBD
21111222 FP
21222333 FP
21333444 FP
21111222 HI
21222333 HI
21333444 HI
21111222 PC
21222333 PC
21333444 PC

No obstante, el producto cartesiano, como cualquier otro tipo de consulta, puede filtrar las filas resultado a

nuestra conveniencia.

Dni de los profesores que imparten 2 o más asignaturas

select distinct i1.dni

from imparte i1, imparte i2

where i1.dni = i2.dni

4 de 10

17/05/2013 14:00

https://sites.google.com/site/fbddocs/practicas-sql-espanol/conjuntos?...

and i1.asignatura != i2.asignatura;

Del producto cartesiano de una tabla por sí misma solo nos interesan las filas en las que el profesor "de la

izquierda" es el mismo que el "de la derecha"; sí, además, las asignaturas son diferentes, la conclusión no puede

ser otra que ese profesor cumple con la condición.

Aunque para el ejemplo que hemos propuesto hay una forma más amigable de solucionar este enunciado, la que

mostramos a continuación, el producto cartesiano es una opción que podemos utilizar cuando creamos

conveniente

select dni from imparte group by dni having count(*) >= 2;

Nombre de los profesores que imparten asignaturas de 6 créditos y no son TEU.

PROFESORES x IMPARTE x ASIGNATURA
donde (PROFESORES.dni = IMPARTE.dni y codigo=asignatura y créditos=6)

[nombre]

-

(PROFESORES donde categoría='TEU' [nombre])

select nombre

from profesores p, imparte i, asignaturas

where p.dni=i.dni and asignatura=codigo and creditos=6

and nombre NOT IN

(select nombre from profesores where categoria='TEU');

nombre

RAFAEL ROMERO

Concatenación natural

Este operador está implementado en MySQL y Oracle Database pero no es seguro que otros SGBD lo tengan

implementado igualmente. Igual que en álgebra relacional, este operador asume que hay columnas comunes en

dos tablas diferentes (en principio, que se llamen igual) y automatiza la reunión (join) en base a la igualdad de

valores en estas columnas comunes. Dicho de otra forma:

Todos los datos de profesores que imparten alguna asignatura y códigos de esas asignaturas.

select p.dni, p.nombre, p.categoria, p.ingreso, i.asignatura

from profesores p, imparte i

where p.dni=i.dni;

obtiene el mismo resultado que

5 de 10

17/05/2013 14:00

https://sites.google.com/site/fbddocs/practicas-sql-espanol/conjuntos?...

select * from profesores NATURAL JOIN imparte;

En ambos casos la salida es la que se muestra a continuación. Nótese que solo se muestra una columna de "dni"

(concretamente la de PROFESORES, la tabla a la izquierda del operador).

dni

nombre

categoria ingreso

asignatura

21111222 EVA GOMEZ

21111222 EVA GOMEZ

TEU

TEU

1993-10-01 DGBD

1993-10-01 FBD

21333444 RAFAEL ROMERO ASO6

1992-06-16 PC

Su expresión en álgebra relacional sería:

PROFESORES ∞ IMPARTE

A pesar de la posible comodidad de uso de este operador hay que tener mucho cuidado, si no existen columnas

comunes se devolverá un producto cartesiano. Otra fuente de resultados no esperados es que haya más

columnas con idéntico nombre de las deseadas.

División

La división como operador definido en el álgebra relacional nos da como resultado "algo que se relaciona con

todos los que cumplen una condición". Por ejemplo,

IMPARTE[asignatura, dni] ÷ (PROFESORES[dni])

Esta expresión daría como resultado los códigos de las asignaturas que son impartidas por todos los profesores de

mi base de datos. No existe, la división, como tal operador en SQL por lo que debemos simularlo con exists.

Exists es un operador de un único argumento y cuyo resultado es un valor de verdad, informa de la presencia o

no de tuplas en una tabla.

[NOT] EXISTS (orden select)

El operador exists nos informa de si una subconsulta ha obtenido algún resultado: devuelve verdadero si hay al

menos una tupla en la relación derivada y falso si la relación derivada es vacía.

La división del álgebra relacional con EXISTS

Uno de los posibles usos, aunque ciertamente confuso al principio, es el de resolver consultas del tipo "x hace

algo con todos los y de nuestra base de datos".

Supongamos una tabla adicional en nuestra BD Ejemplo, PREPARA, que es una relación muchos a muchos entre

6 de 10

17/05/2013 14:00

https://sites.google.com/site/fbddocs/practicas-sql-espanol/conjuntos?...

asignaturas y profesores, y que podría representar qué profesores intervienen en la preparación de cada

asignatura. Su contenido es el que se muestra a continuación:

Profesores que preparan todas las asignaturas.

select nombre from profesores p

where not exists

(select codigo from asignaturas a

where not exists

(select asignatura from prepara pp

where pp.asignatura=a.codigo and p.dni=pp.dni)

)

nombre
RAFAEL ROMERO

Vamos a reformular la consulta siguiendo las apariciones del operador exists dentro de las sucesivas órdenes

select:

"Nombr
  • Links de descarga
http://lwp-l.com/pdf4579

Comentarios de: Lecciones SQL - T11 Conjuntos (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad