Usando más de una tabla
La tabla mascotas nos ha servido
hasta este momento para tener guardados los datos
acerca de los animalitos que tenemos. Si deseamos
guardar algún otro tipo de información
acerca de ellos, tal como los eventos en sus vidas
-visitas al veterinario, nacimientos de una camada,
etc-
necesitaremos de otra tabla. ¿Cómo
deberá estar conformada esta tabla?. Lo que
necesitamos es:
|
El nombre de la mascota para saber a cuál
de ellas se refiere el evento.
Una fecha para saber cuando ocurrió el evento.
Una descripción del evento.
Un campo que indique el tipo de evento, si deseamos categorizarlos.
Dadas estas condiciones, la sentencia para crear la tabla
eventos queda de la siguiente manera:
mysql> CREATE TABLE eventos(nombre varchar(20),
fecha date,
-> tipo varchar(15), descripcion varchar(255));
Query OK, 0 rows affected (0.03 sec)De manera similar
a la tabla mascotas, es más fácil cargar
los datos de los registros iniciales al crear un archivo
de texto delimitado por tabuladores en el que se tenga
la siguiente información: nombre fecha tipo descripción
Fluffy 2001-05-15 camada 4 gatitos, 3 hembras,
1 macho
Buffy 2001-06-23 camada 5 perritos, 2 hembras, 3 machos
Buffy 2002-06-19 camada 2 perritos, 1 hembra, 1 macho
Chispa 2000-03-21 veterinario Una pata lastimada
FanFan 2001-08-27 cumpleaños Primera vez que se
enfermo de la panza
FanFan 2002-08-03 veterinario Dolor de panza
Whicho 2001-02-09 cumpleaños Remodelación
de casaCargamos los datos en este archivo con la siguiente
sentencia:
mysql> LOAD DATA LOCAL INFILE "eventos.txt"
INTO TABLE eventos;
Query OK, 7 rows affected (0.02 sec)
Records: 7 Deleted: 0 Skipped: 0 Warnings: 0Tomando en
cuenta lo que hemos aprendido en la ejecución de
consultas sobre la tabla mascotas, debemos de ser capaces
de recuperar algunos datos de la tabla eventos; los principios
son los mismos. Sin embargo puede suceder que la tabla
eventos por sí misma sea insuficiente para darnos
las respuestas que necesitamos.
Supongamos que desemos conocer la edad
de cada mascota cuando tuvieron una camada. La tabla eventos
indica cuando ocurrió dicho evento, pero para calcular
la edad de la madre, necesitamos sin duda su fecha de
nacimiento. Dado que este dato está almacenado
en la tabla mascotas, necesitamos de ambas tablas para
realizar esta consulta.
mysql> SELECT mascotas.nombre,
-> (TO_DAYS(fecha) - TO_DAYS(nacimiento))/365 AS edad,
-> descripcion FROM mascotas, eventos
-> WHERE mascotas.nombre=eventos.nombre
-> AND tipo='camada';
+--------+------+---------------------------------+
| nombre | edad | descripcion |
+--------+------+---------------------------------+
| Fluffy | 2.28 | 4 gatitos, 3 hembras, 1 macho |
| Buffy | 2.12 | 5 perritos, 2 hembras, 3 machos |
| Buffy | 3.10 | 2 perritos, 1 hembra, 1 macho |
+--------+------+---------------------------------+
3 rows in set (0.05 sec)Hay diversas cosas que notar acerca
de esta consulta:
La cláusula FROM lista dos tablas
dado que la consulta necesita información que se
encuentra en ambas tablas.
Cuando se combina (junta) información de múltiples
tablas, es necesario especificar los registros de una
tabla que pueden coincidir con los registros en la otra
tabla. En nuestro caso, ambas columnas tienen una columna
"nombre". La consulta usa la cláusula
WHERE para obtener los registros cuyo valor en dicha columna
es el mismo en ambas tablas.
Dado que la columna "nombre" ocurre en ambas
tablas, debemos de especificar a cuál de las columnas
nos referimos. Esto se hace al anteponer el nombre de
la tabla al nombre de la columna.
Nota: La función TO_DAYS( ) regresa el número
de días transcurridos desde el año 0 hasta
la fecha dada.
No es necesario que se tengan dos tablas
diferentes para que se puedan juntar. Algunas veces es
útil juntar una tabla consigo misma si se desean
comparar registros de la misma tabla. Por ejemplo, para
encontrar las posibles parejas entre nuestras mascotas
de acuerdo a la especie, la consulta sería la siguiente:
mysql> SELECT m1.nombre, m1.sexo, m2.nombre,
m2.sexo, m1.especie
-> FROM mascotas AS m1, mascotas AS m2
-> WHERE m1.especie=m2.especie AND m1.sexo="f"
AND m2.sexo="m";
+--------+------+--------+------+---------+
| nombre | sexo | nombre | sexo | especie |
+--------+------+--------+------+---------+
| Fluffy | f | Mau | m | Gato |
| Buffy | f | FanFan | m | Perro |
| Buffy | f | Kaiser | m | Perro |
+--------+------+--------+------+---------+
3 rows in set (0.00 sec)En esta consulta se ha especificado
un alias para el nombre de la tabla, y es éste
el que se utiliza para referirse a las columnas.
|