12 Lenguaje SQL Consultas multitabla

Hasta ahora todas las consultas que hemos usado se refieren sólo a una tabla, pero también es posible hacer consultas usando varias tablas en la misma sentencia SELECT.

Esto nos permite realizar otras dos operaciones de álgebra relacional que aún no hemos visto: el producto cartesiano y la composición.

Producto cartesiano

Usaremos el ejemplo de las tablas de personas2 y telefonos2 del capítulo 7, e insertaremos algunos datos:

mysql> INSERT INTO personas2 (nombre, fecha) VALUES
    -> ("Fulanito", "1956-12-14"),
    -> ("Menganito", "1975-10-15"),
    -> ("Tulanita", "1985-03-17"),
    -> ("Fusganita", "1976-08-25");
Query OK, 4 rows affected (0.09 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM personas2;
+----+-----------+------------+
| id | nombre    | fecha      |
+----+-----------+------------+
|  1 | Fulanito  | 1956-12-14 |
|  2 | Menganito | 1975-10-15 |
|  3 | Tulanita  | 1985-03-17 |
|  4 | Fusganita | 1976-08-25 |
+----+-----------+------------+
4 rows in set (0.00 sec)

mysql>

Ahora insertaremos datos en la tabla de telefonos2:

mysql> INSERT INTO telefonos2 (id, numero) VALUES
    -> (1, "123456789"),
    -> (1, "145654854"),
    -> (1, "152452545"),
    -> (2, "254254254"),
    -> (4, "456545654"),
    -> (4, "441415414");
Query OK, 6 rows affected (0.06 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM telefonos2;
+-----------+---------+
| numero    | persona |
+-----------+---------+
| 123456789 |       1 |
| 145654854 |       1 |
| 152452545 |       1 |
| 254254254 |       2 |
| 456545654 |       4 |
| 441415414 |       4 |
+-----------+---------+
6 rows in set (0.00 sec)

mysql>

El producto cartesiano de dos tablas son todas las combinaciones de todas las filas de las dos tablas. Usando una sentencia SELECT se hace proyectando todos los atributos de ambas tablas. Los nombres de las tablas se indican en la cláusula FROM separados con comas:

mysql> SELECT * FROM personas2,telefonos2;
+----+-----------+------------+-----------+----+
| id | nombre    | fecha      | numero    | id |
+----+-----------+------------+-----------+----+
|  1 | Fulanito  | 1956-12-14 | 123456789 |  1 |
|  2 | Menganito | 1975-10-15 | 123456789 |  1 |
|  3 | Tulanita  | 1985-03-17 | 123456789 |  1 |
|  4 | Fusganita | 1976-08-25 | 123456789 |  1 |
|  1 | Fulanito  | 1956-12-14 | 145654854 |  1 |
|  2 | Menganito | 1975-10-15 | 145654854 |  1 |
|  3 | Tulanita  | 1985-03-17 | 145654854 |  1 |
|  4 | Fusganita | 1976-08-25 | 145654854 |  1 |
|  1 | Fulanito  | 1956-12-14 | 152452545 |  1 |
|  2 | Menganito | 1975-10-15 | 152452545 |  1 |
|  3 | Tulanita  | 1985-03-17 | 152452545 |  1 |
|  4 | Fusganita | 1976-08-25 | 152452545 |  1 |
|  1 | Fulanito  | 1956-12-14 | 254254254 |  2 |
|  2 | Menganito | 1975-10-15 | 254254254 |  2 |
|  3 | Tulanita  | 1985-03-17 | 254254254 |  2 |
|  4 | Fusganita | 1976-08-25 | 254254254 |  2 |
|  1 | Fulanito  | 1956-12-14 | 456545654 |  4 |
|  2 | Menganito | 1975-10-15 | 456545654 |  4 |
|  3 | Tulanita  | 1985-03-17 | 456545654 |  4 |
|  4 | Fusganita | 1976-08-25 | 456545654 |  4 |
|  1 | Fulanito  | 1956-12-14 | 441415414 |  4 |
|  2 | Menganito | 1975-10-15 | 441415414 |  4 |
|  3 | Tulanita  | 1985-03-17 | 441415414 |  4 |
|  4 | Fusganita | 1976-08-25 | 441415414 |  4 |
+----+-----------+------------+-----------+----+
24 rows in set (0.73 sec)

mysql>

Como se ve, la salida consiste en todas las combinaciones de todas las tuplas de ambas tablas.