Composición interna natural
Consiste en una proyección sobre un producto cartesiano restringido. Es decir, sólo elegimos determinadas columnas de ambas tablas, en lugar de seleccionar todas.
Podemos hacer esto a partir de una composición general, eligiendo todas las columnas menos las repetidas:
mysql> SELECT personas2.id,nombre,fecha,numero -> FROM personas2, telefonos2 -> WHERE personas2.id=telefonos2.id; +----+-----------+------------+-----------+ | id | nombre | fecha | numero | +----+-----------+------------+-----------+ | 1 | Fulanito | 1956-12-14 | 123456789 | | 1 | Fulanito | 1956-12-14 | 145654854 | | 1 | Fulanito | 1956-12-14 | 152452545 | | 2 | Menganito | 1975-10-15 | 254254254 | | 4 | Fusganita | 1976-08-25 | 456545654 | | 4 | Fusganita | 1976-08-25 | 441415414 | +----+-----------+------------+-----------+ 6 rows in set (0.00 sec) mysql>
Como la columna id existe en ambas tablas estamos obligados a usar el nombre completo para esta columna. En este caso hemos optado por personas2.id, pero hubiese sido igual usar telefonos2.id.
También podemos definir alias para las tablas, y conseguir una consulta más compacta:
mysql> SELECT t1.id,nombre,fecha,numero -> FROM personas2 AS t1, telefonos2 AS t2 -> WHERE t1.id=t2.id;
Por supuesto, podemos usar JOIN y ON en lugar de la coma y WHERE:
mysql> SELECT t1.id,nombre,fecha,numero -> FROM personas2 AS t1 JOIN telefonos2 AS t2 -> ON t1.id=t2.id;
Pero tenemos una sintaxis alternativa mucho mejor para hacer composiciones internas naturales:
referencia_tabla NATURAL JOIN referencia_tabla
Por ejemplo:
mysql> SELECT * FROM personas2 NATURAL JOIN telefonos2; +----+-----------+------------+-----------+ | id | nombre | fecha | numero | +----+-----------+------------+-----------+ | 1 | Fulanito | 1956-12-14 | 123456789 | | 1 | Fulanito | 1956-12-14 | 145654854 | | 1 | Fulanito | 1956-12-14 | 152452545 | | 2 | Menganito | 1975-10-15 | 254254254 | | 4 | Fusganita | 1976-08-25 | 456545654 | | 4 | Fusganita | 1976-08-25 | 441415414 | +----+-----------+------------+-----------+ 6 rows in set (0.02 sec) mysql>
No hay comentarios:
Publicar un comentario