post icon

Diagrama de Venn implementado en SQL

Si queremos aplicar operaciones de conjuntos en el lenguaje SQL tenemos un par de formas de hacerlo, el modo más elegante de hacerlo es utilizar las sentencias diseñadas para este efecto. Los ejemplos que pondre se aplican a SQL Server y Firebird, esto también se puede hacer en Oracle, pero de un modo un tanto distinto, que lo veremos más adelante.

  • UNION Soportados por todas las versiones de SQL Server, y Firebird
  • EXCEPT Soportado por SQL Server 2005 en adelante, no soportado por Firebird 1.5 ni 2
  • INTERSECT Soportado por SQL Server 2005 en adelante, no soportado por Firebird 1.5 ni 2

Para poder utilizar estas sentencias solo debemos cumplir con dos condiciones:

  1. Todos los conjuntos de datos deben tener la misma cantidad de columnas, del mismo tipo de datos.
  2. Sólo se puede aplicar una sentencia ORDER BY, en el ultimo SELECT.

Los siguientes ejemplos trabajaremos con las entidades PROFESORES y ALUMNOS.

UNION

Devuelve la union de 2 o mas conjuntos de datos. En este caso obtendremos un listado de todos los alumnos y profesores, en caso que una persona sea alumno y profesor al mismo tiempo, solo se vera un registro

1
2
3
4
5
6
/* ejemplo UNION */
SELECT Nombre, ApellidoPaterno , ApellidoMaterno, NroDocumento, FechaNacimiento
FROM PROFESORES
UNION
SELECT Nombre, ApellidoPaterno , ApellidoMaterno, NroDocumento, FechaNacimiento
FROM ALUMNOS

Al usar solo UNION, también se ejecuta implícitamente el DISTINCT, si queremos devolver todas la filas podemos acompañarlo con ALL. En este caso obtendremos un listado de todos los alumnos y profesores, en caso que una persona sea alumno y profesor al mismo tiempo, se vera un registro por cada caso:

1
2
3
4
5
6
/* ejemplo UNION ALL */
SELECT Nombre, ApellidoPaterno , ApellidoMaterno, NroDocumento, FechaNacimiento
FROM PROFESORES
UNION ALL
SELECT Nombre, ApellidoPaterno , ApellidoMaterno, NroDocumento, FechaNacimiento
FROM ALUMNOS

EXCEPT

Esto devuelve la resto o diferencia entre 2 o mas conjuntos de datos. En este caso devolverá todos los profesores que no son alumnos:

1
2
3
4
5
6
/* ejemplo EXCEPT */
SELECT Nombre, ApellidoPaterno , ApellidoMaterno, NroDocumento, FechaNacimiento
FROM PROFESORES
EXCEPT
SELECT Nombre, ApellidoPaterno , ApellidoMaterno, NroDocumento, FechaNacimiento
FROM ALUMNOS

Con respecto al rendimiento y velocidad de ejecución, el uso de EXCEPT es mucho mas rápido que las condiciones NOT IN o EXISTS en la clausula WHERE

INTERSECT

Con esto obtendremos la intersección de 2 o mas conjuntos de datos, basado en nuestro ejemplo, nos devolverá todos los profesores que son alumnos al mismo tiempo, pero que no los que cumplan un solo rol.

1
2
3
4
5
6
/* ejemplo INTERSECT */
SELECT Nombre, ApellidoPaterno , ApellidoMaterno, NroDocumento, FechaNacimiento
FROM PROFESORES
INTERSECT
SELECT Nombre, ApellidoPaterno , ApellidoMaterno, NroDocumento, FechaNacimiento
FROM ALUMNOS

Comentarios desde Facebook:

  1. avatar
    :) PARAGUAY Mozilla Firefox Windows
    10 agosto 2010 at 06:37 #

    Venn, no <del>Ven</del>

    • avatar
      GeekZero PARAGUAY Google Chrome Windows
      10 agosto 2010 at 07:00 #

      De donde salen estos escritores, no tienen vergüenza!

      Gracias por la correción 🙂

Responder