Base de datos

Clasificado en Informática

Escrito el en español con un tamaño de 14,27 KB

Si el administrador creó la base de datos al momento de asignar los permisos, podemos hacer uso de ella. De otro modo, nosotros debemos crearla:

mysql> USE zoologico
ERROR 1049: Unknown database 'zoologico'
mysql>

El mensaje anterior indica que la base de datos no ha sido creada, por lo tanto necesitamos crearla.

mysql> CREATE DATABASE zoologico;
Query OK, 1 row affected (0.00 sec)

mysql> USE zoologico
Database changed
mysql>

Bajo el sistema operativo Unix, los nombres de las bases de datos son sensibles al uso de mayúsculas y minúsculas (no como las palabras clave de SQL), por lo tanto debemos de tener cuidado de escribir correctamente el nombre de la base de datos. Esto es cierto también para los nombres de las tablas.

Al crear una base de datos no se selecciona ésta de manera autómatica; debemos hacerlo de manera explícita, por ello usamos el comando USE en el ejemplo anterior.

La base de datos se crea sólo una vez, pero nosotros debemos seleccionarla cada vez que iniciamos una sesión con mysql. Por ello es recomendable que se indique la base de datos sobre la que vamos a trabajar al momento de invocar al monitor de MySQL. Por ejemplo:

shell>mysql -h casita -u blueman -p zoologico

Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17 to server version: 3.23.38-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>

Observar que "zoologico" no es la contraseña que se está proporcionando desde la línea de comandos, sino el nombre de la base de datos a la que deseamos acceder. Si deseamos proporcionar la contraseña en la línea de comandos después de la opción "-p", debemos de hacerlo sin dejar espacios (por ejemplo, -phola123, no como -p hola123). Sin embargo, escribir nuestra contraseña desde la línea de comandos no es recomendado, ya que es bastante inseguro.

Crear la base de datos es la parte más fácil, pero en este momento la base de datos está vacía, como lo indica el comando SHOW TABLES:

mysql> SHOW TABLES;
Empty set (0.00 sec)

La parte un tanto complicada es decidir la estructura que debe tener nuestra base de datos: qué tablas se necesitan y qué columnas estarán en cada tabla.

En principio, necesitamos una tabla que contenga un registro para cada una de nuestras mascotas. Ésta puede ser una tabla llamada mascotas, y debe contener por lo menos el nombre de cada uno de nuestros animalitos. Ya que el nombre en sí no es muy interesante, la tabla debe contener alguna otra información. Por ejemplo, si más de una persona en nuestra familia tiene una mascota, es probable que tengamos que guardar la información acerca de quien es el dueño de cada mascota. Así mismo, también sería interesante contar con alguna información más descriptiva tal como la especie, y el sexo de cada mascota.

¿Y que sucede con la edad?. Esto puede ser también de interés, pero no es una buena idea almacenar este dato en la base de datos. La edad cambia conforme pasa el tiempo, lo cual significa que debemos de actualizar los registros frecuentemente. En vez de esto, es una mejor idea guardar un valor fijo, tal como la fecha de nacimiento. Entonces, cuando necesitemos la edad, la podemos calcular como la diferencia entre la fecha actual y la fecha de nacimiento. MySQL proporciona funciones para hacer operaciones entre fechas, así que no hay ningún problema.

Al almacenar la fecha de nacimiento en lugar de la edad tenemos algunas otras ventajas:

Podemos usar la base de datos para tareas tales como generar recordatorios para cada cumpleaños próximo de nuestras mascotas. Podemos calcular la edad en relación a otras fechas que la fecha actual. Por ejemplo, si almacenamos la fecha en que murió nuestra mascota en la base de datos, es fácil calcular que edad tenía nuestro animalito cuando falleció. Es probable que estemos pensando en otro tipo de información que sería igualmente útil en la tabla "mascotas", pero para nosotros será suficiente por ahora contar con información de nombre, propietario, especie, nacimiento y fallecimiento.

Usaremos la sentencia CREATE TABLE para indicar como estarán conformados los registros de nuestras mascotas.

mysql> CREATE TABLE mascotas( 
    -> nombre VARCHAR(20), propietario VARCHAR(20),
    -> especie VARCHAR(20), sexo CHAR(1), nacimiento DATE,
    -> fallecimento DATE);
Query OK, 0 rows affected (0.02 sec)

mysql>

VARCHAR es una buena elección para los campos nombre, propietario, y especie, ya que los valores que almacenarán son de longitud variable. No es necesario que la longitud de estas columnas sea la misma, ni tampoco que sea de 20. Se puede especificar cualquier longitud entre 1 y 255, lo que se considere más adecuado. Si resulta que la elección de la longitud de los campos que hemos hecho no resultó adecuada, MySQL proporciona una sentencia ALTER TABLE que nos puede ayudar a solventar este problema.

El campo sexo puede ser representado en una variedad de formas, por ejemplo, "m" y "f", o tal vez "masculino" y "femenino", aunque resulta más simple la primera opción.

El uso del tipo de dato DATE para los campos nacimiento y fallecimento debe de resultar obvio.

Ahora que hemos creado la tabla, la sentencia SHOW TABLES debe producir algo como:

mysql> SHOW TABLES;
+---------------------+
| Tables_in_zoologico |
+---------------------+
| mascotas            |
+---------------------+
1 row in set (0.00 sec)

mysql>

Para verificar que la tabla fué creada como nosotros esperabamos, usaremos la sentencia DESCRIBE:

mysql> DESCRIBE mascotas;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| nombre       | varchar(20) | YES  |     | NULL    |       |
| propietario  | varchar(20) | YES  |     | NULL    |       |
| especie      | varchar(20) | YES  |     | NULL    |       |
| sexo         | char(1)     | YES  |     | NULL    |       |
| nacimiento   | date        | YES  |     | NULL    |       |
| fallecimento | date        | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

mysql>

Podemos hacer uso de la sentencia DESCRIBE en cualquier momento, por ejempo, si olvidamos los nombres ó el tipo de las columnas en la tabla.

Cargar datos en una tabla

Por MySQL-Hispano.org.

Después de haber creado la tabla, ahora podemos incorporar algunos datos en ella, para lo cual haremos uso de las sentencias INSERT y LOAD DATA.

Supongamos que los registros de nuestras mascotas pueden ser descritos por los datos mostrados en la siguiente tabla.

NombrePropietarioEspecieSexoNacimientoFallecimento
FluffyArnoldoGatof1999-02-04 
MauJuanGatom1998-03-17 
BuffyArnoldoPerrof1999-05-13 
FanFanBenitoPerrom2000-08-27 
KaiserDianaPerrom1998-08-311997-07-29
ChispaOmarAvef1998-09-11 
WichoTomásAve2000-02-09 
SkimBenitoSerpientem2001-04-29 

Debemos observar que MySQL espera recibir fechas en el formato YYYY-MM-DD, que puede ser diferente a lo que nosotros estamos acostumbrados.

Ya que estamos iniciando con una tabla vacía, la manera más fácil de poblarla es crear un archivo de texto que contenga un registro por línea para cada uno de nuestros animalitos para que posteriormente carguemos el contenido del archivo en la tabla únicamente con una sentencia.

Por tanto, debemos de crear un archivo de texto "mascotas.txt" que contenga un registro por línea con valores separados por tabuladores, cuidando que el orden de las columnas sea el mismo que utilizamos en la sentencia CREATE TABLE. Para valores que no conozcamos podemos usar valores nulos (NULL). Para representar estos valores en nuestro archivo debemos usar \N.

El archivo mascotas.txt

Para cargar el contenido del archivo en la tabla mascotas, usaremos el siguiente comando:

mysql> LOAD DATA LOCAL INFILE "mascotas.txt" INTO TABLE mascotas;

La sentencia LOAD DATA nos permite especificar cuál es el separador de columnas, y el separador de registros, por default el tabulador es el separador de columnas (campos), y el salto de línea es el separador de registros, que en este caso son suficientes para que la sentencia LOAD DATA lea correctamente el archivo "mascotas.txt".

Si lo que deseamos es añadir un registro a la vez, entonces debemos hacer uso de la sentencia INSERT. En la manera más simple, debemos proporcionar un valor para cada columna en el orden en el cual fueron listados en la sentencia CREATE TABLE. Supongamos que nuestra hermana Diana compra un nuevo hamster nombrado Pelusa. Podemos usar la sentencia INSERT para agregar su registro en nuestra base de datos.

mysql> INSERT INTO mascotas
    -> VALUES('Pelusa','Diana','Hamster','f','2000-03-30',NULL);

Notar que los valores de cadenas y fechas deben estar encerrados entre comillas. También, con la sentencia INSERT podemos insertar el valor NULL directamente para representar un valor nulo, un valor que no conocemos. En este caso no se usa \N como en el caso de la sentencia LOAD DATA.

De este ejemplo, debemos ser capaces de ver que es un poco más la tarea que se tiene que realizar si inicialmente cargamos los registros con varias sentencias INSERT en lugar de una única sentencia LOAD DATA.


Podemos seleccionar sólo registros particulares de una tabla. Por ejemplo, si deseamos verificar el cambio que hicimos a la fecha de nacimiento de Kaiser, seleccionamos sólo el registro de Kaiser de la siguiente manera:

mysql> SELECT * FROM mascotas WHERE nombre="Kaiser";
+--------+-------------+---------+------+------------+--------------+
| nombre | propietario | especie | sexo | nacimiento | fallecimento |
+--------+-------------+---------+------+------------+--------------+
| Kaiser | Diana       | Perro   | m    | 1989-08-31 | 1997-07-29   |
+--------+-------------+---------+------+------------+--------------+
1 row in set (0.00 sec)

La salida mostrada confirma que el año ha sido corregido de 1998 a 1989.

La comparación de cadenas es normalmente no sensitiva, así que podemos especificar el nombre como "kaiser", "KAISER", etc. El resultado de la consulta será el mismo.

Podemos además especificar condiciones sobre cualquier columna, no sólo el "nombre". Por ejemplo, si deseamos conocer qué mascotas nacieron después del 2000, tendríamos que usar la columna "nacimiento":

mysql> SELECT * FROM mascotas WHERE nacimiento >= "2000-1-1";
+--------+-------------+-----------+------+------------+---------------+
| nombre | propietario | especie   | sexo | nacimiento | fallecimiento |
+--------+-------------+-----------+------+------------+---------------+
| FanFan | Benito      | Perro     | m    | 2000-08-27 | NULL          |
| Wicho  | Tomás       | Ave       | NULL | 2000-02-09 | NULL          |
| Skim   | Benito      | Serpiente | m    | 2001-04-29 | NULL          |
| Pelusa | Diana       | Hamster   | f    | 2000-03-30 | NULL          |
+--------+-------------+-----------+------+------------+---------------+
4 rows in set (0.00 sec)

Podemos también combinar condiciones, por ejemplo, para localizar a los perros hembras:

mysql> SELECT * FROM mascotas WHERE especie="Perro" AND sexo="f";
+--------+-------------+---------+------+------------+---------------+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+--------+-------------+---------+------+------------+---------------+
| Buffy  | Arnoldo     | Perro   | f    | 1999-05-13 | NULL          |
+--------+-------------+---------+------+------------+---------------+
1 row in set (0.00 sec)

La consulta anterior usa el operador lógico AND. Hay también un operador lógico OR:

mysql> SELECT * FROM mascotas WHERE especie = "Ave" OR especie = "Gato";
+--------+-------------+---------+------+------------+---------------+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+--------+-------------+---------+------+------------+---------------+
| Fluffy | Arnoldo     | Gato    | f    | 1999-02-04 | NULL          |
| Mau    | Juan        | Gato    | m    | 1998-03-17 | NULL          |
| Chispa | Omar        | Ave     | f    | 1998-09-11 | NULL          |
| Wicho  | Tomás       | Ave     | NULL | 2000-02-09 | NULL          |
+--------+-------------+---------+------+------------+---------------+
4 rows in set (0.00 sec)

El operador AND y el operador OR pueden ser intercambiados. Si hacemos esto, es buena idea usar paréntesis para indicar como deben ser agrupadas las condiciones:

mysql> SELECT * FROM mascotas WHERE (especie = "Gato" AND sexo = "m")
    -> OR (especie = "Perro" AND sexo = "f");
+--------+-------------+---------+------+------------+---------------+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+--------+-------------+---------+------+------------+---------------+
| Mau    | Juan        | Gato    | m    | 1998-03-17 | NULL          |
| Buffy  | Arnoldo     | Perro   | f    | 1999-05-13 | NULL          |
+--------+-------------+---------+------+------------+---------------+
2 rows in set (0.00 sec)

Entradas relacionadas: