SQL | DIVISIÓN

La división generalmente se requiere cuando desea encontrar entidades que interactúan con todas las entidades de un conjunto de diferentes tipos de entidades.
El operador de división se usa cuando tenemos que evaluar consultas que contienen la palabra clave ‘todos’.

Algunos casos en los que se utiliza el operador de división son:

  • ¿Qué persona tiene cuenta en todos los bancos de una determinada ciudad?
  • ¿Qué estudiantes han tomado todos los cursos requeridos para graduarse?

En todas estas consultas, la descripción después de la palabra clave ‘todos’ define un conjunto que contiene algunos elementos y el resultado final contiene aquellas unidades que satisfacen estos requisitos.

Importante: las implementaciones de SQL no admiten la división. Sin embargo, se puede representar usando otras operaciones (como unión cruzada, Excepto, En)

Implementación SQL de División

Dadas dos relaciones(tablas): R(x,y) , S(y).
R y S : tablas
x e y : columna de R
y : columna de S

R(x,y) div S(y) significa que da todos los valores distintos de x de R que están asociados con todos los valores de y en S.
Cálculo de la división: R(x,y) div S(y)
Pasos:

  • Averigüe todas las combinaciones posibles de S(y) con R(x) calculando R(x) x(unión cruzada) S(y), digamos r1
  • Reste R(x,y) real de r1, digamos r2
  • x en r2 son aquellos que no están asociados con cada valor en S(y); por lo tanto, R(x)-r2(x) nos da x
    que están asociados con todos los valores en S

Consultas

  1. Implementación 1:
    SELECT * FROM R 
    WHERE x not in ( SELECT x FROM (
    (SELECT x , y FROM (select y from S ) as p cross join 
    (select distinct x from R) as sp)
    EXCEPT
    (SELECT x , y FROM R) ) AS r ); 
    
    
  2. Implementación 2: uso de subconsulta correlacionada
    SELECT * FROM R as sx
    WHERE NOT EXISTS (
    (SELECT p.y FROM S as p )
    EXCEPT
    (SELECT sp.y FROM  R as sp WHERE sp.x = sx.x ) );
    
    

álgebra relacional

Using steps which is mention above:
All possible combinations
r1 ← πx(R) x S
x values with “incomplete combinations”,
r2x ← πx(r1-R)
and 
result ← πx(R)-r2x

 R div S = πx(R)- πx((πx(R) x S) – R) 

Ejemplos

Esquema de suministro

Aquí sid significa ID de proveedor y pid significa ID de piezas .
Tablas: proveedores (sid, pid), partes (pid)

1. Encuentre proveedores que suministren todas las piezas.

Respuesta 1: Usando la implementación 1

SELECT * FROM suppliers
WHERE sid not in ( SELECT sid FROM ( (SELECT sid, pid FROM (select pid from parts) as p 
cross join 
(select distinct sid from supplies) as sp)
EXCEPT
(SELECT sid, pid FROM supplies)) AS r ); 

Respuesta 2: Usando la implementación 2

SELECT * FROM suppliers as s
WHERE NOT EXISTS (( SELECT p.pid FROM parts as p )
EXCEPT
 (SELECT sp.pid FROM supplies sp WHERE sp.sid = s.sid ) );

esquema de empresa

2. Enumere los empleados que trabajan en todos los proyectos controlados por dno=4.

Respuesta 1. Usando la implementación 1

SELECT * FROM employee AS e
WHERE ssn NOT IN (
SELECT essn FROM (
(SELECT essn, pno FROM (select pno from project where dno=4)
as p cross join (select distinct essn from works_on) as w)
EXCEPT (SELECT essn, pno FROM works_on)) AS r ); 

Respuesta 2. Usando la implementación 2

SELECT * FROM employee AS e
WHERE NOT EXISTS (
 (SELECT pno FROM project WHERE dno = 4)
 EXCEPT
 (SELECT pno FROM works_on WHERE essn = e.ssn) );


Importante:
para la consulta correlacionada de división, parece más simple de escribir pero puede ser costosa de ejecutar.

    Algunos ejemplos más .

  1. Lista de proveedores que suministran todas las piezas ‘rojas’ (esquema de suministro)
  2. Recuperar los nombres de los empleados que trabajan en todos los proyectos en los que trabaja ‘John Smith’ (esquema de la empresa)

Este artículo es una contribución de Kadam Patel . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *