Uniones

También es posible realizar la operación de álgebra relacional unión entre varias tablas o proyecciones de tablas.

Para hacerlo se usa la sentencia UNION que permite combinar varias sentencias SELECT para crear una única tabla de salida.

Las condiciones para que se pueda crear una unión son las mismas que vimos al estudiar el álgebra relacional: las relaciones a unir deben tener el mismo número de atributos, y además deben ser de dominios compatibles.

Veamos un ejemplo:

mysql> CREATE TABLE stock1 (
    -> id INT NOT NULL,
    -> nombre VARCHAR(30),
    -> cantidad INT,
    -> PRIMARY KEY (id));
Query OK, 0 rows affected (0.08 sec)

mysql> CREATE TABLE stock2 (
    -> id INT NOT NULL,
    -> nombre VARCHAR(40),
    -> cantidad SMALLINT,
    -> PRIMARY KEY (id));
Query OK, 0 rows affected (0.16 sec)

mysql> CREATE TABLE stock3 (
    -> id INT NOT NULL,
    -> nombre VARCHAR(35),
    -> numero MEDIUMINT,
    -> PRIMARY KEY (id));
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO stock1 VALUES
    -> (1, "tornillo M3x12", 100),
    -> (2, "tornillo M3x15", 120),
    -> (3, "tornillo M4x25", 120),
    -> (4, "tornillo M5x30", 200);
Query OK, 4 rows affected (0.03 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO stock2 VALUES
    -> (10, "tuerca M4", 120),
    -> (11, "tuerca M3", 100),
    -> (12, "tuerca M5", 87);
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO stock3 VALUES
    -> (20, "varilla 10", 23),
    -> (1, "tornillo M3x12", 22),
    -> (21, "varilla 12", 32),
    -> (11, "tuerca M3", 22);
Query OK, 4 rows affected (0.03 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql>

Podemos crear una unión de las tres tablas, a pesar de que los nombres y tamaños de algunas columnas sean diferentes:

mysql> SELECT * FROM stock1 UNION
    -> SELECT * FROM stock2 UNION
    -> SELECT * FROM stock3;
+----+----------------+----------+
| id | nombre         | cantidad |
+----+----------------+----------+
|  1 | tornillo M3x12 |      100 |
|  2 | tornillo M3x15 |      120 |
|  3 | tornillo M4x25 |      120 |
|  4 | tornillo M5x30 |      200 |
| 10 | tuerca M4      |      120 |
| 11 | tuerca M3      |      100 |
| 12 | tuerca M5      |       87 |
|  1 | tornillo M3x12 |       22 |
| 11 | tuerca M3      |       22 |
| 20 | varilla 10     |       23 |
| 21 | varilla 12     |       32 |
+----+----------------+----------+
11 rows in set (0.00 sec)

mysql>

El resultado se puede ordenar usando ORDER BY y también podemos seleccionar un número limitado de filas mediante LIMIT:

mysql> (SELECT * FROM stock1) UNION
    -> (SELECT * FROM stock2) UNION
    -> (SELECT * FROM stock3) ORDER BY id LIMIT 6;
+----+----------------+----------+
| id | nombre         | cantidad |
+----+----------------+----------+
|  1 | tornillo M3x12 |      100 |
|  1 | tornillo M3x12 |       22 |
|  2 | tornillo M3x15 |      120 |
|  3 | tornillo M4x25 |      120 |
|  4 | tornillo M5x30 |      200 |
| 10 | tuerca M4      |      120 |
+----+----------------+----------+
6 rows in set (0.00 sec)

mysql>

Dentro de cada sentencia SELECT se aplican todas las cláusulas, proyecciones y selecciones que se quiera, como en cualquier SELECT normal.

La sintaxis completa incluye dos modificadores:

SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
  [UNION [ALL | DISTINCT]
   SELECT ...]

Los modificadores ALL y DISTINCT son opcionales, y si no se usa ninguno el comportamiento es el mismo que si se usa DISTINCT.

Con ALL se muestran todas las filas, aunque estén repetidas, con DISTINCT sólo se muestra una copia de cada fila:

mysql> SELECT id,nombre FROM stock1 UNION
    -> SELECT id,nombre FROM stock2 UNION
    -> SELECT id,nombre FROM stock3;
+----+----------------+
| id | nombre         |
+----+----------------+
|  1 | tornillo M3x12 |
|  2 | tornillo M3x15 |
|  3 | tornillo M4x25 |
|  4 | tornillo M5x30 |
| 10 | tuerca M4      |
| 11 | tuerca M3      |
| 12 | tuerca M5      |
| 20 | varilla 10     |
| 21 | varilla 12     |
+----+----------------+
9 rows in set (0.00 sec)

mysql> SELECT id,nombre FROM stock1 UNION ALL
    -> SELECT id,nombre FROM stock2 UNION ALL
    -> SELECT id,nombre FROM stock3;
+----+----------------+
| id | nombre         |
+----+----------------+
|  1 | tornillo M3x12 |
|  2 | tornillo M3x15 |
|  3 | tornillo M4x25 |
|  4 | tornillo M5x30 |
| 10 | tuerca M4      |
| 11 | tuerca M3      |
| 12 | tuerca M5      |
|  1 | tornillo M3x12 |
| 11 | tuerca M3      |
| 20 | varilla 10     |
| 21 | varilla 12     |
+----+----------------+
11 rows in set (0.00 sec)

mysql>

Sobre el resultado final no se pueden aplicar otras cláusulas como GROUP BY.

Comentarios de los usuarios (1)

jean carlos sánchez
2011-07-19 13:17:53

exelente material didactico, me estoy estudiando el curso completo sin embargo hay mucho espacios en que le falta texto, alparecer hay frases y/o simbolos que no han sido reconocidos y queda un hueco.. x ejemplo

"También es posible realizar la operación de álgebra relacional entre varias tablas o de tablas."

->Despues de operacion debe ir que operacion es esa pero no aparece,= sucede despues de tablas o.. :-(

->de igual forma en la siguiente cita, despues de sentencia hay un dato perdido:

"Para hacerlo se usa la sentencia que permite combinar varias sentencias para crear una única tabla de salida."

x todo lo demas muchas gracias.

un saludo desde la ciudad de Guadalupe-La Libertad-Perú