~mysql/mysql-server/mysql-6.0

« back to all changes in this revision

Viewing changes to Docs/Tutorial-MySQL-final.txt

  • Committer: bk at mysql
  • Date: 2000-07-31 19:29:14 UTC
  • Revision ID: sp1r-bk@work.mysql.com-20000731192914-08846
Import changeset

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
8 Tutorial MySQL
 
2
=======================
 
3
 
 
4
Este cap��tulo ofrece un tutorial de introducci��n a MySQL, mostrando c��mo usar el programa cliente
 
5
mysql para crear y usar una simple base de datos. mysql (al que algunas veces nos referimos como
 
6
"monitor terminal" o simplemente "monitor") es un programa interactivo que te permite conectarte a
 
7
un servidor MySQL, ejecutar consultas y observar los resultados. mysql puede ser usado tambi��n en
 
8
modo batch: escribes tus consultas en un fichero de texto, para despu��s pedirle a mysql que
 
9
ejecute el contenido del fichero. Se cubren aqu�� esas dos formas de usar de usar mysql.
 
10
 
 
11
Para ver una lista de opciones proporcionadas por mysql, l��nzalo con las opci��n --help :
 
12
 
 
13
    shell>  mysql --help
 
14
 
 
15
Este cap��tulo asume que mysql est�� instalado en tu m��quina, y que hay disponible un servidor al que
 
16
te puedes conectar. Si esto no es as��, contacta con tu administrador MySQL. (Si el administrador
 
17
eres t��, necesitar��s consultar otra secci��n de este manual).
 
18
 
 
19
El cap��tulo describe el proceso completo de configurar y usar una base de datos. Si est��s interesado
 
20
s��lo en acceder una base de datos ya existente, querr��s saltar las secciones que describen c��mo
 
21
crear la base de datos y las tablas que la contienen.
 
22
 
 
23
Dado que este cap��tulo es un tutorial b��sico, se dejar��n en el tintero muchos
 
24
detalles. Consulta las secciones relevantes del manual para m��s informaci��n sobre los temas
 
25
aqu�� cubiertos.
 
26
 
 
27
 
 
28
8.1 Conectando y desconectando del servidor
 
29
=============================================
 
30
 
 
31
 
 
32
Para conectarse al servidor, generalmente necesitar��s facilitar un nombre de usuario MySQL cuando
 
33
lances el cliente mysql y, lo m��s probable, tambi��n un password. Si el servidor se est�� ejecutando
 
34
en una m��quina distinta a la que est��s conectado, necesitar��s especificar tambi��n un nombre de
 
35
host. Contacta con tu administrador para averiguar qu�� par��metros de conexi��n necesitas usar para
 
36
conectar (es decir, qu�� host, nombre de usuario y password usar). Una vez que conozcas los
 
37
par��metros adecuados, deber��s ser capaz de conectar de la siguiente forma:
 
38
 
 
39
shell> mysql -h host -u user -p
 
40
Enter password: *******
 
41
Welcome to the MySQL monitor. Commands end with ; or \g.
 
42
Your MySQL connection id is 459 to server version: 3.22.20a-log
 
43
 
 
44
Type 'help' for help.
 
45
 
 
46
mysql> 
 
47
 
 
48
El prompt te indica que mysql ya est�� listo para la introducci��n de comandos.
 
49
 
 
50
Algunas instalaciones MySQL permiten a los usuarios conectarse como usuarios "anonymous" (sin
 
51
nombre) al servidor ejecut��ndose en el host local. Si este es el caso en tu m��quina, deber��as ser
 
52
capaz de conectar a ese servidor invocando mysql sin ninguna opci��n:
 
53
 
 
54
shell> mysql
 
55
 
 
56
Una vez que hayas conectado con ��xito, puedes desconectarte en cualquier momento tecleando QUIT en
 
57
el prompt mysql>  :
 
58
 
 
59
mysql> QUIT
 
60
Bye
 
61
 
 
62
Tambi��n puedes desconectar tecleando control-D.
 
63
 
 
64
La mayor parte de los ejemplos en las siguientes secciones asumen que est��s conectado al
 
65
servidor. Lo indicar��n por el prompt mysql>
 
66
 
 
67
 
 
68
8.2 Haciendo consultas
 
69
========================
 
70
 
 
71
Aseg��rate de que est��s conectado al servidor, como se ha discutido en secciones anteriores. El
 
72
hacerlo no implica que tengas seleccionada ninguna base de datos con la que trabajar, pero est��
 
73
bien. En este punto, es m��s importante averiguar un poco sobre c��mo lanzar consultas que lanzarse
 
74
directamente a la creaci��n de tablas, cargar datos en ellas y recuperar los datos de las
 
75
mismas. Esta secci��n describe los principios b��sicos de la entrada de comandos, usando varias
 
76
consultas que puedes probar para familiarizarte con la forma de trabajo de mysql.
 
77
 
 
78
Aqu�� presentamos un comando simple que pide al servidor que nos diga su n��mero de versi��n y fecha
 
79
actual. Tecl��alo como se muestra a continuaci��n siguiendo el prompt mysql> y pulsa la tecla RETURN:
 
80
 
 
81
 
 
82
mysql> SELECT VERSION(), CURRENT_DATE;
 
83
+-----------+--------------+
 
84
| version() | CURRENT_DATE |
 
85
+-----------+--------------+
 
86
| 3.22.23b  | 2000-01-05   |
 
87
+-----------+--------------+
 
88
1 row in set (0.06 sec)
 
89
 
 
90
mysql> 
 
91
 
 
92
Esta consulta ilustra muchas cosas sobre mysql:
 
93
 
 
94
* Un comando consiste normalmente de una sentencia SQL seguida por un punto y coma. (Existen algunas
 
95
  excepciones donde no es necesario el punto y coma. QUIT, mencionado m��s adelante, es una de
 
96
  ellas. Conoceremos otras m��s adelante.)
 
97
 
 
98
* Cuando lanzas un comando, mysql lo env��a al servidor para su ejecuci��n y muestra los resultados,
 
99
  despu��s imprime otro mysql> para indicar que est�� listo para otro comando.
 
100
 
 
101
* mysql muestra la salida de una consulta como una tabla (filas y columnas). La primera fila
 
102
  contiene etiquetas para las columnas. Las siguientes filas son el resultado de la
 
103
  consulta. Normalmente, las etiquetas de las columnas son los nombres de las columnas que has
 
104
  obtenido de la base de datos. Si pides el valor de una expresi��n en vez de una columna de una
 
105
  tabla (como en el ejemplo anterior), mysql etiqueta la columna usando la propia expresi��n.
 
106
 
 
107
* mysql muestra el n��mero de filas que se han dado como resultado, y cu��nto tiempo llev�� la
 
108
  ejecuci��n de la consulta, lo que te da una idea aproximada del rendimiento del servidor. Estos
 
109
  valores son imprecisos porque representan tiempo real (no tiempo de CPU o m��quina), y porque est��n
 
110
  afectados por factores como la carga del servidor y la latencia de la red. (Por cuestiones de
 
111
  brevedad, la l��nea "rows in set" no se mostrar�� en los ejemplos posteriores de este cap��tulo.)
 
112
 
 
113
Las palabras clave pueden ser tecleadas en cualquier combinaci��n may��scula/min��scula. Las siguientes
 
114
consultas son equivalentes:
 
115
 
 
116
mysql> SELECT VERSION(), CURRENT_DATE;
 
117
mysql> select version(), current_date;
 
118
mysql> SeLeCt vErSiOn(), current_DATE;
 
119
 
 
120
He aqu�� otra consulta. Demuestra que puedes usar mysql como una calculadora sencilla:
 
121
 
 
122
mysql> SELECT SIN(PI()/4), (4+1)*5;
 
123
+-------------+---------+
 
124
| SIN(PI()/4) | (4+1)*5 |
 
125
+-------------+---------+
 
126
|    0.707107 |      25 |
 
127
+-------------+---------+
 
128
 
 
129
Los comandos vistos hasta aqu�� han sido relativamente cortos, sentencias de una sola l��nea. Tambi��n puedes
 
130
insertar m��ltiples sentencias en una sola l��nea. Simplemente, termina cada una con un punto y coma:
 
131
 
 
132
mysql> SELECT VERSION(); SELECT NOW();
 
133
 
 
134
+-----------+
 
135
| version() |
 
136
+-----------+
 
137
| 3.22.23b  |
 
138
+-----------+
 
139
 
 
140
+---------------------+
 
141
| NOW()               |
 
142
+---------------------+
 
143
| 2000-01-05 17:33:16 |
 
144
+---------------------+
 
145
 
 
146
Un comando no necesita ser dado todo en una s��la l��nea, as�� pues, los comandos largos que requieran
 
147
varias lineas no son un problema. mysql determina cuando termina tu sentencia buscando el punto y
 
148
coma final, no buscando el final de la l��nea de entrada. (En otras palabras, mysql acepta entrada de
 
149
libre formato: recoleta las l��neas de entrada pero no las ejecutahasta que vea el punto y coma.)
 
150
 
 
151
Aqu�� tenemos un simple ejemplo de m��ltiples l��neas:
 
152
 
 
153
mysql> SELECT
 
154
    -> USER()
 
155
    -> ,
 
156
    -> CURRENT_DATE;
 
157
+----------------+--------------+
 
158
| USER()         | CURRENT_DATE |
 
159
+----------------+--------------+
 
160
| root@localhost | 2000-01-05   |
 
161
+----------------+--------------+
 
162
 
 
163
En este ejemplo, observa como cambia el prompt de mysql> a -> una vez que has insertado la primera
 
164
l��nea de una consulta multi-l��nea. Esta es la forma en que mysql indica que no ha encontrado una
 
165
sentencia completa y que est�� esperando por el resto. El prompt es tu amigo, dado que ofrece una
 
166
retroalimentaci��n (feedback) significativa. Si usas ese feedback, siempre sabr��s a qu�� est��
 
167
esperando mysql.
 
168
 
 
169
Si decides que no quieres ejecutar un comando que est�� en proceso de introducci��n, puedes cancelarlo
 
170
tecleando \c :
 
171
 
 
172
mysql> SELECT
 
173
    -> USER
 
174
    -> \c
 
175
mysql> 
 
176
 
 
177
Observa aqu�� tambi��n el prompt. Ha vuelto a mysql> tras haber tecleado \c, ofreciendo un feedback
 
178
que indica que mysql est�� listo para un nuevo comando.
 
179
 
 
180
La siguiente tabla muestra cada uno de los prompts que puedes ver y resume qu�� es lo que significan
 
181
y el estado en el que se encontrar�� mysql:
 
182
 
 
183
Prompt         Significado
 
184
mysql>         Listo para un nuevo comando
 
185
    ->         Esperando una nueva l��nea de una consulta multi-l��nea
 
186
    '>         Esperando la siguiente l��nea, se ha insertado una l��nea que comienza con (')
 
187
    ">         Esperando la siguiente l��nea, se ha insertado una l��nea que comienza con (")
 
188
 
 
189
Las sentencias multi-l��nea ocurren com��nmente "por accidente" cuando intentas lanzar un comando en
 
190
una ��nica l��nea, pero olvidas el punto y coma del final. En este caso, mysql espera m��s entrada:
 
191
 
 
192
mysql> SELECT USER()
 
193
    ->
 
194
 
 
195
Si esto es lo que te ocurre (crees que has introducido una sentencia pero la ��nica respuesta es un
 
196
prompt como ->), lo m��s probable es que mysql est�� esperando por el punto y coma. Si no observas qu��
 
197
es lo que te dice el prompt, podr��as quedarte esperando un buen rato antes de enterarte de qu�� es lo
 
198
que sucede. Introduce un punto y coma para completar la sentencia, y mysql la ejecutar��:
 
199
 
 
200
mysql> SELECT USER()
 
201
    -> ;
 
202
+----------------+
 
203
| USER()         |
 
204
+----------------+
 
205
| root@localhost |
 
206
+----------------+
 
207
 
 
208
Los prompts '> y "> ocurren durante la recogida de strings. En MySQL, puedes escribir strings
 
209
encerrados por comillas simples (') o dobles (") (por ejemplo, 'hola' o "adios"), y mysql te permite
 
210
introducir tambi��n strings que se cortan en m��ltiples l��neas. Cuando veas un prompt como '> �� ">,
 
211
significa que has introducido una l��nea que conten��a un string que comenzaba por (') o ("), pero que
 
212
no has introducido a��n la comilla (simple o doble) de cierre. Esto est�� bien si realmente estabas
 
213
introduciendo un string multi-l��nea, pero no es lo m��s normal. Lo que s�� es m��s normal, es que los
 
214
prompts '> �� "> indiquen que te has olvidado del caracter de cierre " �� '. Por ejemplo:
 
215
 
 
216
mysql> SELECT * FROM mi_tabla WHERE nombre ="Garc��a AND edad < 30;
 
217
    ">  
 
218
 
 
219
Si tecleas esta sentencia SELECT, despu��s pulsas ENTER y esperas por el resultado, no suceder��
 
220
nada. En lugar de preocuparte, "��por qu�� tarda tanto esta consulta?", observa la pista que te ofrece
 
221
el prompt "> . Esto te indica que mysql espera ver el resto de un string que a��n no ha
 
222
terminado. (��Ves el error en la sentencia? La cadena "Garc��a ha perdido las comillas de cierre.)
 
223
 
 
224
Llegados a este punto, ��qu�� puedes hacer?. Lo m��s f��cil es cancelar el comando. Sin embargo, no
 
225
puedes teclear simplemente \c en este ejemplo,  dado que mysql ��lo interpretar�� como parte del string
 
226
que est�� leyendo! En vez de eso, introduce las comillas de cierre (para que mysql sepa que ya has
 
227
terminado de introducir el string), y despu��s teclea \c :
 
228
 
 
229
mysql> SELECT * FROM mi_tabla WHERE nombre ="Garc��a AND edad < 30;
 
230
    "> "\c
 
231
mysql> 
 
232
 
 
233
El prompt vuelve a cambiar a mysql>, indicando que mysql est�� listo para un nuevo comando.
 
234
 
 
235
Es importante saber qu�� significan los prompts '> y ">, dado que si introduces por error un string
 
236
sin cerrar, cualquier otra l��nea que introduzcas ser��n ignoradas por mysql - ��incluyendo una l��nea
 
237
que contenga QUIT! Esto puede ser bastante confuso, especialmente si no sabes que debes introducir
 
238
la comilla de cierre antes de poder cancelar el comando actual.
 
239
 
 
240
8.3 Creando y usando una base de datos
 
241
==========================================
 
242
 
 
243
Ahora que sabes como introducir comandos, es hora de acceder a la base de datos.
 
244
 
 
245
Supon que tienes varias mascotas en tu casa (tu peque��o "zoo") y que te gustar��a llevar un control
 
246
de varios tipos de informaci��n sobre estos animales. Puedes hacerlo creando tablas que guarden tus
 
247
datos y cargandolas con la informaci��n deseada. Despu��s puedes responder a diferentes series de
 
248
preguntas sobre tus animales extrayendo los datos de las tablas. Esta secci��n explica c��mo hacer
 
249
todo esto:
 
250
 
 
251
* C��mo crear una base de datos
 
252
* C��mo crear una tabla
 
253
* C��mo cargar los datos en la tabla
 
254
* C��mo extraer informaci��n de la tabla de varias maneras
 
255
* C��mo usar m��ltiples tablas
 
256
 
 
257
La base de datos del zoo ser�� simple (deliberadamente), pero no es dif��cil pensar en situaciones del
 
258
mundo real en las que se pudiera utilizar una base de datos similar. Por ejemplo, se podr��a usar una base
 
259
de datos como ��sta en una granja para llevar un control del ganado, o por un veterinario para
 
260
controlar el historial de sus pacientes.
 
261
 
 
262
Usa la sentencia SHOW para averiguar qu�� bases de datos existen actualmente en el servidor:
 
263
 
 
264
mysql> SHOW DATABASES;
 
265
+----------+
 
266
| Database |
 
267
+----------+
 
268
| mysql    |
 
269
| test     |
 
270
+----------+
 
271
 
 
272
Probablemente, la lista de las bases de datos ser�� diferente en tu m��quina, pero las bases de datos
 
273
mysql y test es probable que se encuentren en esa lista. Se requiere la base de datos mysql pues
 
274
describe los privilegios de acceso de los usuarios. La base de datos test se ofrece como campo de
 
275
pruebas para que los usuarios prueben ah�� sus teor��as.
 
276
 
 
277
Si la base de datos test existe, intenta acceder a ella:
 
278
 
 
279
mysql> USE test
 
280
Database changed
 
281
 
 
282
Observa que USE, como QUIT, no requiere un punto y coma. (Puedes terminar este tipo de sentencias
 
283
con un punto y coma si quieres, pero no es necesario.) La sentencia USE es especial en otro sentido,
 
284
tambi��n: debe ser tecleada en una sola l��nea.
 
285
 
 
286
Puedes usar la base de datos test (si tienes acceso a ella) para los ejemplos que siguen, pero
 
287
cualquier cosa que crees en dicha base de datos puede ser eliminada por cualquiera que tenga acceso
 
288
a ella. Por esta raz��n, deber��as pedir a tu administrador MySQL permisos para usar una base de datos
 
289
propia. Suponte que le quieres llamar zoo. El administrador necesitar�� ejecutar entonces la
 
290
siguiente orden:
 
291
 
 
292
mysql> GRANT ALL ON zoo.* TO tu_nombre;
 
293
 
 
294
donde tu_nombre es el nombre de usuario MySQL que tengas asignado.
 
295
 
 
296
ejemplo:
 
297
 
 
298
mysql> GRANT ALL ON zoo.* TO chessy@localhost;
 
299
Query OK, 0 rows affected (0.08 sec)
 
300
 
 
301
 
 
302
8.3.1 Creando y seleccionando una base de datos
 
303
==================================================
 
304
 
 
305
Si el administrador cre�� la base de datos para t�� cuando te configur�� los permisos, puedes comenzar
 
306
a usarla. En otro caso, deber��s crearla t�� mismo:
 
307
 
 
308
[chessy@bishito chessy]$ mysql -u chessy
 
309
Welcome to the MySQL monitor.  Commands end with ; or \g.
 
310
Your MySQL connection id is 6 to server version: 3.22.23b
 
311
 
 
312
Type 'help' for help.
 
313
 
 
314
mysql> CREATE DATABASE zoo;
 
315
Query OK, 1 row affected (0.02 sec)
 
316
 
 
317
 
 
318
Bajo Unix, los nombres de bases de datos son sensibles a las may��sculas/min��sculas (a diferencia de
 
319
los comandos SQL), as�� que deber��s referirte siempre a tu base de datos con el nombre zoo, no como
 
320
Zoo, ZOO o cualquier otra variante. Es es as�� tambi��n para las tablas. (Bajo Windows, esta
 
321
restricci��n desaparece, aunque deber��as referirte a las bases de datos y a las tablas usando la
 
322
misma sintaxis en tus consultas.)
 
323
 
 
324
Crear una base de datos no la selecciona para su uso, debes hacerlo expl��citamente. Para hacer que
 
325
la base de datos zoo sea tu base de datos de trabajo, usa el comando:
 
326
 
 
327
mysql> USE zoo;
 
328
Database changed
 
329
 
 
330
Tu base de datos s��lo necesita ser creada una vez, pero debes seleccionarla para usarla cada vez que
 
331
comiences una sesi��n mysql. Puedes hacerlo lanzando un comando USE como se ha visto en el
 
332
ejemplo. Alternativamente, puedes seleccionar la base de datos desde la l��nea de comandos cuando
 
333
lanzas mysql. Simplemente especifica su nombre tras los par��metros de conexi��n que hayas
 
334
escrito. Por ejemplo:
 
335
 
 
336
shell> mysql -h host -u user -p zoo
 
337
Enter password: ********
 
338
 
 
339
Observa que en la l��nea de comandos del ejemplo, zoo no es tu password. Si quieres introducir tu
 
340
password como par��metro en la l��nea de comandos tras la opci��n -p, debes hacerlo sin teclear un
 
341
espacio en blanco intermedio (es decir, como -pmi_password, no como -p mi_password). Sin embargo, no
 
342
es recomendable poner tu password en la l��nea de comandos, pues hacerlo lo expone a posibles
 
343
miradas de otros usuarios conectados a tu m��quina.
 
344
 
 
345
8.3.2 Creando una tabla
 
346
============================
 
347
 
 
348
Crear una tabla es la parte f��cil, pero hasta este momento est�� vac��a, como te dice la orden SHOW
 
349
TABLES:
 
350
 
 
351
mysql> SHOW TABLES;
 
352
Empty set (0.00 sec)
 
353
 
 
354
La parte m��s dura consiste en decidir cual va a ser la estructura de tu base de datos: qu�� tablas
 
355
necesitar��s, y qu�� columnas tendr�� cada una de ellas.
 
356
 
 
357
Querr��s seguramente una tabla que contenga un registro por cada una de tus mascotas. Esta tabla
 
358
puede llamarse mascotas, y deber��a contener, como m��nimo, el nombre de cada animal. Dado que el
 
359
nombre por s�� solo no es muy interesante, la tabla deber��a contener otra informaci��n. Por ejemplo,
 
360
si m��s de una persona de tu familia tiene mascotas, probablemente quieras listar el propietario de
 
361
cada animal. Tambi��n querr��s guardar informaci��n descriptiva b��sica como puede ser la especie y el
 
362
sexo de cada mascota.
 
363
 
 
364
��Qu�� pasa con la edad? Podr��a ser de inter��s, pero no es una buena cosa a guardar en una base de
 
365
datos. La edad cambia a medida que pasa el tiempo, lo que significa que tendr��s que actualizar tus
 
366
registros a menudo. En vez de eso, es mejor almacenar un valor fijo como la edad de
 
367
nacimiento. Despu��s, cada vez que necesites saber la edad, puedes calcularla como la diferencia
 
368
entre la fecha actual y la fecha de nacimiento. MySQL ofrece funciones para realizar c��lculos
 
369
aritm��ticos entre fechas, por lo que esto no es dif��cil. Almacenar la fecha de nacimiento en lugar
 
370
de la edad tiene tambi��n otras ventajas:
 
371
 
 
372
* Puedes usar la base de datos para generar recordatorios de cumplea��os de mascotas. (Si crees que
 
373
  este tipo de consulta es algo tonta, observa que es la misma pregunta que necesitar��s hacer en el
 
374
  contexto de una base de datos de un negocio para identificar clientes a los que pronto necesitar��s
 
375
  mandar un saludo por su cumplea��os, para ese toque personal asistido por ordenador :-)
 
376
 
 
377
* Puedes calcular la edad en relaci��n a fechas distintas a la fecha actual. Por ejemplo, si
 
378
  almacenas la fecha de muerte en la base de datos, puedes calcular f��cilmente lo vieja que era una
 
379
  mascota cuando muri��.
 
380
 
 
381
Seguramente puedas pensar en otros tipos de informaci��n que ser��a ��til en la tabla mascota, pero los
 
382
identificados hasta ahora son suficientes por el momento: nombre, propietarios, especie, sexo, fecha
 
383
de nacimiento y muerte.
 
384
 
 
385
Usa una sentencia CREATE TABLE para especificar la estructura de tu tabla:
 
386
 
 
387
mysql> CREATE TABLE mascota (nombre VARCHAR(20), propietario VARCHAR(20),
 
388
    -> especie VARCHAR(20), sexo CHAR(1), nacimiento DATE, muerte DATE);
 
389
 
 
390
VARCHAR es una buena elecci��n para las columnas nombre, propietario y especie dado que los valores
 
391
de estas columnas variar��n su longitud. Las longitudes de estas columnas no necesitan ser iguales, y
 
392
no necesitan ser 20. Puedes elegir cualquier longitud entre 1 y 255, cualquiera que te parezca
 
393
razonable. (Si realizar una elecci��n pobre y resulta que m��s adelante necesitas un campo mayor,
 
394
MySQL ofrece una sentencia ALTER TABLE.)
 
395
 
 
396
El sexo del animal puede ser representado en una variedad de formas, por ejemplo, "m" y "f", o
 
397
quiz��s "masculino" y "femenino". Es m��s simple usar un ��nico caracter, "m" �� "f".
 
398
 
 
399
El uso del tipo de datos DATE para las columnas de nacimiento y muerte es una opci��n bastante
 
400
obvia. 
 
401
 
 
402
Ahora que ya has creado una tabla, SHOW TABLES deber��a producir alguna salida:
 
403
 
 
404
mysql> SHOW TABLES;
 
405
+---------------+
 
406
| Tables in zoo |
 
407
+---------------+
 
408
| mascota       |
 
409
+---------------+
 
410
 
 
411
Para verificar que tu tabla fue creada de la forma que esperabas, usa una sentencia DESCRIBE:
 
412
 
 
413
mysql> DESCRIBE mascota;
 
414
+-------------+-------------+------+-----+---------+-------+
 
415
| Field       | Type        | Null | Key | Default | Extra |
 
416
+-------------+-------------+------+-----+---------+-------+
 
417
| nombre      | varchar(20) | YES  |     | NULL    |       |
 
418
| propietario | varchar(20) | YES  |     | NULL    |       |
 
419
| especie     | varchar(20) | YES  |     | NULL    |       |
 
420
| sexo        | char(1)     | YES  |     | NULL    |       |
 
421
| nacimiento  | date        | YES  |     | NULL    |       |
 
422
| muerte      | date        | YES  |     | NULL    |       |
 
423
+-------------+-------------+------+-----+---------+-------+
 
424
 
 
425
Puedes usar DESCRIBE en cualquier momento, por ejemplo, si olvidas los nombres de las columnas de tu
 
426
tabla o a qu�� tipo de datos pertenecen.
 
427
 
 
428
8.3.3 Cargando datos en una tabla
 
429
=====================================
 
430
 
 
431
Una vez creada tu tabla, necesitas poblarla. Las sentencias LOAD DATA e INSERT son ��tiles para esto.
 
432
 
 
433
Suponte que tus registros de mascotas pueden ser descritos como se muestra m��s abajo. (Observa que
 
434
MySQL espera que las fechas se introduzcan en formato AAAA-MM-DD; esto podr��a ser diferente a lo que
 
435
est��s acostumbrado.)
 
436
 
 
437
nombre   propietario    especie         sexo    nacimiento      muerte
 
438
Fluffy   Harold         gato            f       1993-02-04              
 
439
Claws    Gwen           gato            m       1994-03-17
 
440
Buffy    Harold         perro           f       1989-05-13
 
441
Fang     Benny          perro           m       1990-08-27
 
442
Bowser   Diane          perro           m       1998-08-31      1995-07-29
 
443
Chirpy   Gwen           p��jaro         f       1998-09-11
 
444
Whistler Gwen           p��jaro                 1997-12-09
 
445
Slim     Benny          serpiente       m       1996-04-29
 
446
 
 
447
Dado que est��s comenzando con una tabla vac��a, una forma sencilla de poblarla consiste en crear un
 
448
fichero de texto conteniendo una fila para cada uno de tus animales, y despu��s cargar el contenido del
 
449
fichero en la tabla con una sola sentencia.
 
450
 
 
451
Puedes crear un fichero de texto "mascota.txt" conteniendo un registro por l��nea, con valores separados
 
452
por tabuladores, y dados en el orden en el que las columnas fueron listadas en la sentencia CREATE
 
453
TABLE. Para valores perdidos (como sexos desconocidos, o fechas de muerte de animales que a��n est��n
 
454
vivos), puedes usar valores NULL. Para representar estos en tu fichero de texto, use \N. Por
 
455
ejemplo, el registro para Whistler el p��jaro ser��a algo como esto (donde el espacio en blanco entre
 
456
valores es un simple caracter de tabulaci��n):
 
457
 
 
458
Whistler   Gwen      p��jaro     \N     1997-12-09      \N
 
459
 
 
460
Para cargar el fichero de texto "mascota.txt" en la tabla mascota, usa este comando:
 
461
 
 
462
mysql> LOAD DATA LOCAL INFILE "mascota.txt" INTO TABLE mascota;
 
463
 
 
464
Puedes especificar el valor de separaci��n de columna y el marcador de final de l��nea expl��citamente
 
465
en la sentencia LOAD DATA si lo deseas, pero por defecto equivalen a TAB y LF (intro). Estos valores
 
466
por defecto son suficientes para que la sentencia que lee el fichero "mascota.txt" funcione
 
467
correctamente.
 
468
 
 
469
Cuando quieras a��adir nuevos registros uno a uno, la sentencia INSERT es muy ��til. En su forma m��s
 
470
simple, ofreces valores para cada columna, en el orden en el que las columnas fueron listadas en la
 
471
sentencia CREATE TABLE. Sup��n que Diane consige un nuevo hamster llamado Puffball. Podr��as a��adir un
 
472
nuevo registro usando una sentencia INSERT como esta:
 
473
 
 
474
mysql> INSERT INTO mascota
 
475
    -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
 
476
 
 
477
Observa que los valores string y fecha se espefican encerrados entre comillas. Observa tambi��n que,
 
478
con INSERT, puedes insertar NULL directamente para representar un valor perdido. No usamos \N como
 
479
hac��amos con LOAD DATA.
 
480
 
 
481
De este ejemplo, deber��as ser capaz de ver que hubiera dido mucho m��s costoso teclear todos los
 
482
datos necesarios en la tabla mascota con sentencias INSERT que hacerlo como lo hemos hecho con una
 
483
��nica sentencia LOAD DATA.
 
484
 
 
485
 
 
486
8.3.4 Extrayendo informaci��n de una tabla
 
487
===============================================
 
488
 
 
489
 
 
490
La sentencia SELECT se usa para recabar informaci��n de una tabla. La forma
 
491
general de la sentencia es:
 
492
 
 
493
SELECT qu��_seleccionar
 
494
FROM de_qu��_tabla
 
495
WHERE condiciones_a_satisfacer
 
496
 
 
497
qu��_seleccionar indica qu�� es lo que quieres seleccionar. Puede ser una lista de
 
498
columnas, o * para indicar "todas las columnas". de_qu��_tabla indica la tabla de
 
499
la que quieres extraer datos. La cla��sula WHERE es opcional. Si est�� presente,
 
500
condiciones_a_satisfacer especifica las codiciones que las filas deben cumplir
 
501
para estar presentes en el resultado de la selecci��n.
 
502
 
 
503
8.3.4.1 Seleccionando todos los datos
 
504
=======================================
 
505
 
 
506
La forma m��s simplede SELECT recoge toda la informaci��n de una tabla:
 
507
 
 
508
mysql> SELECT * FROM mascota;
 
509
+----------+-------------+-----------+------+------------+------------+
 
510
| nombre   | propietario | especie   | sexo | nacimiento | muerte     |
 
511
+----------+-------------+-----------+------+------------+------------+
 
512
| Bluffy   |  Harold     | gato      | f    | 1993-02-04 | NULL       |
 
513
| Claws    |  Gwen       | gato      | m    | 1994-03-17 | NULL       |
 
514
| Buffy    |  Harold     | perro     | f    | 1989-05-13 | NULL       |
 
515
| Fang     |  Benny      | perro     | m    | 1990-08-27 | NULL       |
 
516
| Bowser   |  Diane      | perro     | m    | 1998-08-31 | 1995-07-29 |
 
517
| Chirpy   |  Gwen       | p��jaro    | f    | 1998-09-11 | NULL       |
 
518
| Whistler |  Gwen       | p��jaro    | NULL | 1997-12-09 | NULL       |
 
519
| Slim     |  Benny      | serpiente | m    | 1996-04-29 | NULL       |
 
520
| Puffball |  Diane      | hamster   | f    | 1999-03-30 | NULL       |
 
521
+----------+-------------+-----------+------+------------+------------+
 
522
 
 
523
Esta forma de SELECT es ��til si quieres revisar tu tabla al completo, por
 
524
ejemplo, tras haberla cargado con tu conjunto inicial de datos. Como suele
 
525
suceder, la salida ya muestra un error en tu fichero de datos: Bowser ��parece
 
526
haber nacido tras su muerte! Consultando tus papeles originales sobre el
 
527
pedigree del perro, descubres que la fecha correcta de nacimiento es 1989, no
 
528
1998.
 
529
 
 
530
Existen al menos un par de maneras de arreglar esto:
 
531
 
 
532
* Edita el fichero "mascota.txt" para corregir el error, despu��s vac��a la tabla
 
533
  y vuelve a cargarla usando DELETE y LOAD DATA:
 
534
 
 
535
mysql> DELETE from mascota;
 
536
mysql> LOAD DATA LOCAL INFILE "mascota.txt" INTO TABLE mascota;
 
537
 
 
538
Sin embargo, si haces esto, debes re-escribir el registro para Puffball.
 
539
 
 
540
* Arreglar s��lo el registro err��neo con la sentencia UPDATE:
 
541
 
 
542
mysql> UPDATE mascota SET nacimiento="1989-08-31" WHERE nombre="Bowser";
 
543
 
 
544
Como se muestra m��s arriba, es f��cil recuperar el cuerpo de una data. Pero
 
545
t��picamente no querr��s hacer eso, en particular cuando la tabla sea muy
 
546
larga. Generalmente, estar��s m��s interesado en responder a una pregunta en
 
547
particular, en cuyo caso deber��s especificar algunas restricciones en la
 
548
informaci��n que deseas. Veamos algunas consultas de selecci��n en t��rminos de
 
549
preguntas sobre tus mascotas que se deben responder.
 
550
 
 
551
8.3.4.2 Seleccionando filas en particular
 
552
=============================================
 
553
 
 
554
Puedes seleccionar s��lo filas en particular de tu tabla. Por ejemplo, si quieres
 
555
verificar el cambio que has realizado a la fecha de nacimiento de Bowser,
 
556
selecciona el registro de Bowser de la siguiente forma:
 
557
 
 
558
mysql> SELECT * FROM mascota WHERE nombre="Bowser";
 
559
+--------+-------------+---------+------+------------+------------+
 
560
| nombre | propietario | especie | sexo | nacimiento | muerte     |
 
561
+--------+-------------+---------+------+------------+------------+
 
562
| Bowser |  Diane      | perro   | m    | 1989-08-31 | 1995-07-29 |
 
563
+--------+-------------+---------+------+------------+------------+
 
564
 
 
565
La salida confirma que el a��o est�� correctamente registrado como 1989, no 1998.
 
566
 
 
567
Las comparaciones de cadenas de texto son normalmente insensibles a las
 
568
may��sculas/min��sculas, por lo que puedes especificar el nombre como "bowser",
 
569
"BOWSER", etc. El resultado de la consulta ser�� el mismo.
 
570
 
 
571
Puedes especificar condiciones en cualquier columna, no s��lo el nombre. Por
 
572
ejemplo, si quisieras saber qu�� animales nacieron a partir de 1998, examina la
 
573
columna nacimiento:
 
574
 
 
575
mysql> SELECT * FROM mascota WHERE nacimiento >= "1998-1-1";
 
576
+----------+-------------+---------+------+------------+--------+
 
577
| nombre   | propietario | especie | sexo | nacimiento | muerte |
 
578
+----------+-------------+---------+------+------------+--------+
 
579
| Chirpy   |  Gwen       | p��jaro  | f    | 1998-09-11 | NULL   |
 
580
| Puffball | Diane       | hamster | f    | 1999-03-30 | NULL   |
 
581
+----------+-------------+---------+------+------------+--------+
 
582
 
 
583
Puedes combinar condiciones, por ejemplo, para localizar los perros hembra:
 
584
 
 
585
mysql> SELECT * FROM mascota WHERE especie="perro" AND sexo="f";
 
586
+--------+-------------+---------+------+------------+--------+
 
587
| nombre | propietario | especie | sexo | nacimiento | muerte |
 
588
+--------+-------------+---------+------+------------+--------+
 
589
| Buffy  |  Harold     | perro   | f    | 1989-05-13 | NULL   |
 
590
+--------+-------------+---------+------+------------+--------+
 
591
 
 
592
La consulta anterior usa el operador l��gico AND. Existe tambi��n un operador OR:
 
593
 
 
594
mysql> SELECT * FROM mascota WHERE especie="serpiente" OR especie="p��jaro";
 
595
+----------+-------------+-----------+------+------------+--------+
 
596
| nombre   | propietario | especie   | sexo | nacimiento | muerte |
 
597
+----------+-------------+-----------+------+------------+--------+
 
598
| Chirpy   |  Gwen       | p��jaro    | f    | 1998-09-11 | NULL   |
 
599
| Whistler |  Gwen       | p��jaro    | NULL | 1997-12-09 | NULL   |
 
600
| Slim     |  Benny      | serpiente | m    | 1996-04-29 | NULL   |
 
601
+----------+-------------+-----------+------+------------+--------+
 
602
 
 
603
AND y OR pueden entremezclarse. Si lo haces, es una buena idea el utilizar
 
604
par��ntesis para indicar c��mo deber��an agruparse las condiciones:
 
605
 
 
606
mysql> SELECT * FROM mascota WHERE (especie="gato" AND sexo="m") 
 
607
    -> OR (especie="perro" AND sexo="f");
 
608
+--------+-------------+---------+------+------------+--------+
 
609
| nombre | propietario | especie | sexo | nacimiento | muerte |
 
610
+--------+-------------+---------+------+------------+--------+
 
611
| Claws  |  Gwen       | gato    | m    | 1994-03-17 | NULL   |
 
612
| Buffy  |  Harold     | perro   | f    | 1989-05-13 | NULL   |
 
613
+--------+-------------+---------+------+------------+--------+
 
614
 
 
615
8.3.4.3 Seleccionando columnas en particular
 
616
===================================================
 
617
 
 
618
Si no quieres ver filas completas de tu tabla, simplemente nombra las columnas
 
619
en las cuales est��s interesado, separadas por comas. Por ejemplo, si quieres
 
620
saber cu��ndo nacieron tus animales, selecciona las columnas nombre y nacimiento:
 
621
 
 
622
mysql> SELECT nombre, nacimiento FROM mascota;
 
623
+----------+------------+
 
624
| nombre   | nacimiento |
 
625
+----------+------------+
 
626
| Bluffy   | 1993-02-04 |
 
627
| Claws    | 1994-03-17 |
 
628
| Buffy    | 1989-05-13 |
 
629
| Fang     | 1990-08-27 |
 
630
| Bowser   | 1989-08-31 |
 
631
| Chirpy   | 1998-09-11 |
 
632
| Whistler | 1997-12-09 |
 
633
| Slim     | 1996-04-29 |
 
634
| Puffball | 1999-03-30 |
 
635
+----------+------------+
 
636
 
 
637
Para averiguar qui��n posee mascotas, usa esta consulta:
 
638
 
 
639
mysql> SELECT propietario FROM mascota;                         
 
640
+-------------+
 
641
| propietario |
 
642
+-------------+
 
643
|  Harold     |
 
644
|  Gwen       |
 
645
|  Harold     |
 
646
|  Benny      |
 
647
|  Diane      |
 
648
|  Gwen       |
 
649
|  Gwen       |
 
650
|  Benny      |
 
651
|  Diane      |
 
652
+-------------+
 
653
 
 
654
Sin embargo, observa que la consulta simplemente obtiene el campo propietario de
 
655
cada registro, y algunos de ellos aparecen m��s de una vez. Para minimizar la
 
656
salida, obt��n cada registro de salida ��nico una sola vez a��adiendo la palabra
 
657
reservada DISTINCT:
 
658
 
 
659
mysql> SELECT DISTINCT propietario FROM mascota;
 
660
+-------------+
 
661
| propietario |
 
662
+-------------+
 
663
|  Benny      |
 
664
|  Diane      |
 
665
|  Gwen       |
 
666
|  Harold     |
 
667
+-------------+
 
668
 
 
669
Puedes usar una cla��sula WHERE para combinar la selecci��n de filas con la
 
670
selecci��n de columnas. Por ejemplo, para conseguir s��lo las fechas de nacimiento
 
671
de perros y gatos, usa esta consulta:
 
672
 
 
673
mysql> SELECT nombre, especie, nacimiento FROM mascota
 
674
    -> WHERE especie = "perro" OR especie = "gato";
 
675
+--------+---------+------------+
 
676
| nombre | especie | nacimiento |
 
677
+--------+---------+------------+
 
678
| Bluffy | gato    | 1993-02-04 |
 
679
| Claws  | gato    | 1994-03-17 |
 
680
| Buffy  | perro   | 1989-05-13 |
 
681
| Fang   | perro   | 1990-08-27 |
 
682
| Bowser | perro   | 1989-08-31 |
 
683
+--------+---------+------------+
 
684
 
 
685
8.3.4.4 Ordenando filas
 
686
===========================
 
687
 
 
688
Tal vez hayas observado que en los ejemplos anteriores las filas del resultado
 
689
se muestran sin ning��n tipo de orden en particular. Sin embargo, a menudo es m��s
 
690
f��cil de examinar la salida de una consulta cuando las filas est��n ordenadas de
 
691
alguna manera en particular. Para ordenar un resultado, usa la cla��sula ORDER
 
692
BY.
 
693
 
 
694
Aqu�� mostramos las fechas de nacimiento de los animales, ordenadas por fecha:
 
695
 
 
696
mysql> SELECT nombre, nacimiento FROM mascota ORDER BY nacimiento;
 
697
+----------+------------+
 
698
| nombre   | nacimiento |
 
699
+----------+------------+
 
700
| Buffy    | 1989-05-13 |
 
701
| Bowser   | 1989-08-31 |
 
702
| Fang     | 1990-08-27 |
 
703
| Bluffy   | 1993-02-04 |
 
704
| Claws    | 1994-03-17 |
 
705
| Slim     | 1996-04-29 |
 
706
| Whistler | 1997-12-09 |
 
707
| Chirpy   | 1998-09-11 |
 
708
| Puffball | 1999-03-30 |
 
709
+----------+------------+
 
710
 
 
711
Para ordenar de forma inversa, a��ade la palabra reservada DESC (descendente) al
 
712
nombre de la columna por la que est��s ordenando:
 
713
 
 
714
mysql> SELECT nombre, nacimiento FROM mascota ORDER BY nacimiento DESC;
 
715
+----------+------------+
 
716
| nombre   | nacimiento |
 
717
+----------+------------+
 
718
| Puffball | 1999-03-30 |
 
719
| Chirpy   | 1998-09-11 |
 
720
| Whistler | 1997-12-09 |
 
721
| Slim     | 1996-04-29 |
 
722
| Claws    | 1994-03-17 |
 
723
| Bluffy   | 1993-02-04 |
 
724
| Fang     | 1990-08-27 |
 
725
| Bowser   | 1989-08-31 |
 
726
| Buffy    | 1989-05-13 |
 
727
+----------+------------+
 
728
 
 
729
Puedes ordenar por m��ltiples columnas. Por ejemplo, para ordenar por tipo de
 
730
animal, despu��s por fecha de nacimiento dentro del mismo tipo de animal estando
 
731
los animales m��s j��venes primero, usa la siguiente consulta:
 
732
 
 
733
mysql> SELECT nombre, especie, nacimiento FROM mascota ORDER BY especie, nacimiento DESC;
 
734
+----------+-----------+------------+
 
735
| nombre   | especie   | nacimiento |
 
736
+----------+-----------+------------+
 
737
| Claws    | gato      | 1994-03-17 |
 
738
| Bluffy   | gato      | 1993-02-04 |
 
739
| Puffball | hamster   | 1999-03-30 |
 
740
| Chirpy   | p��jaro    | 1998-09-11 |
 
741
| Whistler | p��jaro    | 1997-12-09 |
 
742
| Fang     | perro     | 1990-08-27 |
 
743
| Bowser   | perro     | 1989-08-31 |
 
744
| Buffy    | perro     | 1989-05-13 |
 
745
| Slim     | serpiente | 1996-04-29 |
 
746
+----------+-----------+------------+
 
747
 
 
748
Observa que la palabra reservada DESC se aplica s��lo al nombre de columna que
 
749
preceda a la palabra reservada (nacimiento); los valores especie siguen siendo
 
750
ordenados en forma ascendente.
 
751
 
 
752
8.3.4.5 C��lculos de fecha
 
753
============================
 
754
 
 
755
MySQL ofrece muchas funciones que puedes usar para realizar c��lculos con fechas,
 
756
por ejemplo, para calcular edades o extraer partes de fechas.
 
757
 
 
758
Para determinar cuantos a��os tiene cada una de tus mascotas, puedes calcular la
 
759
edad como la diferencia entre la fecha de nacimiento y la fecha actual. Puedes
 
760
hacerlo convirtiendo las dos fechas a dias, coge la diferencia, y div��dela por
 
761
365 (el n��mero de dias en un a��o):
 
762
 
 
763
mysql> select nombre, (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 FROM mascota;
 
764
+----------+------------------------------------------+
 
765
| nombre   | (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 |
 
766
+----------+------------------------------------------+
 
767
| Bluffy   |                                     6.94 |
 
768
| Claws    |                                     5.83 |
 
769
| Buffy    |                                    10.68 |
 
770
| Fang     |                                     9.39 |
 
771
| Bowser   |                                    10.38 |
 
772
| Chirpy   |                                     1.34 |
 
773
| Whistler |                                     2.10 |
 
774
| Slim     |                                     3.71 |
 
775
| Puffball |                                     0.79 |
 
776
+----------+------------------------------------------+
 
777
 
 
778
Aunque la consulta funcione, existen algunos puntos que podr��an ser
 
779
mejorados. Primero, el resultado podr��a ser revisado m��s f��cilmente si las filas
 
780
se presentaran ordenadas de alguna manera. Segundo, la cabecera de la columna
 
781
edad no es muy significativa.
 
782
 
 
783
El primer problema puede ser solucionado a��adiendo una cl��usula ORDER BY nombre
 
784
para ordenar la salida por nombre. Para arreglar el tema del encabezamiento de
 
785
columna, puedes darle un nombre a dicha columna de tal forma que aparezca una
 
786
etiqueta diferente en la salida (esto es lo que se llama un alias de columna):
 
787
 
 
788
mysql> select nombre, (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 AS edad         
 
789
    -> FROM mascota ORDER BY nombre;
 
790
+----------+-------+
 
791
| nombre   | edad  |
 
792
+----------+-------+
 
793
| Bluffy   |  6.94 |
 
794
| Bowser   | 10.38 |
 
795
| Buffy    | 10.68 |
 
796
| Chirpy   |  1.34 |
 
797
| Claws    |  5.83 |
 
798
| Fang     |  9.39 |
 
799
| Puffball |  0.79 |
 
800
| Slim     |  3.71 |
 
801
| Whistler |  2.10 |
 
802
+----------+-------+
 
803
 
 
804
Para ordenar la salida por edad en lugar de por nombre, puedes hacerlo usando
 
805
s��mplemente una cl��usula ORDER BY diferente:
 
806
 
 
807
mysql> select nombre, (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 AS edad
 
808
    -> FROM mascota ORDER BY edad;
 
809
+----------+-------+
 
810
| nombre   | edad  |
 
811
+----------+-------+
 
812
| Puffball |  0.79 |
 
813
| Chirpy   |  1.34 |
 
814
| Whistler |  2.10 |
 
815
| Slim     |  3.71 |
 
816
| Claws    |  5.83 |
 
817
| Bluffy   |  6.94 |
 
818
| Fang     |  9.39 |
 
819
| Bowser   | 10.38 |
 
820
| Buffy    | 10.68 |
 
821
+----------+-------+
 
822
 
 
823
Puede usarse una consulta similar para determinar la edad de la muerte para los
 
824
animales que hayan muerto. Puedes determinar qu�� animales son estos comprobando
 
825
si el valor muerte es NULL o no. Despu��s, para aquellos que no tengan un valor
 
826
NULL, calcular la diferencia entre los valores muerte y nacimiento:
 
827
 
 
828
mysql> select nombre, nacimiento, muerte,
 
829
    -> (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 AS edad
 
830
    -> FROM mascota WHERE muerte IS NOT NULL ORDER BY edad;
 
831
+--------+------------+------------+-------+
 
832
| nombre | nacimiento | muerte     | edad  |
 
833
+--------+------------+------------+-------+
 
834
| Bowser | 1989-08-31 | 1995-07-29 | 10.38 |
 
835
+--------+------------+------------+-------+
 
836
 
 
837
La consulta usa muerte IS NOT NULL en lugar de muerte != NULL dado que NULL es
 
838
un valor especial. Esto se explica m��s adelante. [Puedes consultar la secci��n
 
839
[Working with NULL] del manual de MySQL.
 
840
 
 
841
��Qu�� har��as si quisieras saber qu�� animales cumplen a��os el mes que viene? Para
 
842
este tipo de c��lculos, a��o y d��a son irrelevantes, simplemente querr��s extraer
 
843
la parte mes de la columna nacimiento. MySQL ofrece muchas funciones de
 
844
extracci��n de parte-de-fecha, como YEAR(),MONTH() y DAY(). La funci��n apropiada
 
845
para nuestro problema es MONTH(). Para ver c��mo funciona, ejecuta una consulta
 
846
r��pida que muestre el valor de la fecha de nacimiento y el mes de nacimiento
 
847
(MONTH(nacimiento)):
 
848
 
 
849
mysql> SELECT nombre, nacimiento, MONTH(nacimiento) FROM mascota;
 
850
+----------+------------+-------------------+
 
851
| nombre   | nacimiento | MONTH(nacimiento) |
 
852
+----------+------------+-------------------+
 
853
| Bluffy   | 1993-02-04 |                 2 |
 
854
| Claws    | 1994-03-17 |                 3 |
 
855
| Buffy    | 1989-05-13 |                 5 |
 
856
| Fang     | 1990-08-27 |                 8 |
 
857
| Bowser   | 1989-08-31 |                 8 |
 
858
| Chirpy   | 1998-09-11 |                 9 |
 
859
| Whistler | 1997-12-09 |                12 |
 
860
| Slim     | 1996-04-29 |                 4 |
 
861
| Puffball | 1999-03-30 |                 3 |
 
862
+----------+------------+-------------------+
 
863
 
 
864
Buscar animales que hayan nacido en el mes pr��ximo es tambi��n sencillo de
 
865
realizar. Suponte que Abril es el mes actual. Entonces el valor del mes es 4 y
 
866
lo que buscas son animales nacidos en Mayo (mes 5):
 
867
 
 
868
mysql> SELECT nombre, nacimiento FROM mascota WHERE MONTH(nacimiento) = 5;
 
869
+--------+------------+
 
870
| nombre | nacimiento |
 
871
+--------+------------+
 
872
| Buffy  | 1989-05-13 |
 
873
+--------+------------+
 
874
 
 
875
Existe una peque��a complicaci��n si el mes actual es Diciembre, por supuesto. No
 
876
puedes a��adir simplemente uno al n��mero de mes (12) y buscar animales nacidos en
 
877
el mes 13, dado que no existe tal mes. En lugar de eso, debes buscar animales
 
878
nacidos en Enero (mes 1).
 
879
 
 
880
Puedes escribir la consulta de tal forma que funcione independientemente del mes
 
881
en el que estemos. De esa forma no tendr��s que usar un n��mero de mes en
 
882
particular en la consulta. DATE_ADD() te permite a��adir un intervalo de tiempo a
 
883
una fecha dada. Si a��ades un mes al valor de NOW(), y despu��s extraes la parte
 
884
del mes con MONTH(), el resultado produce el mes del cumplea��os que buscamos:
 
885
 
 
886
 
 
887
mysql> select NOW();
 
888
+---------------------+
 
889
| NOW()               |
 
890
+---------------------+
 
891
| 2000-01-13 18:13:09 |
 
892
+---------------------+
 
893
 
 
894
mysql> SELECT nombre, nacimiento FROM mascota
 
895
    -> WHERE MONTH(nacimiento) = MONTH(DATE_ADD(NOW(),INTERVAL 1 MONTH));
 
896
+--------+------------+
 
897
| nombre | nacimiento |
 
898
+--------+------------+
 
899
| Bluffy | 1993-02-04 |
 
900
+--------+------------+
 
901
 
 
902
Una manera difente de conseguir los mismos resultados es a��adir 1 al mes actual
 
903
para conseguir el mes siguiente (tras usar la funci��n m��dulo (MOD) para
 
904
convertir el valor de mes actual en 0 si estamos en Diciembre (mes 12)):
 
905
 
 
906
mysql> SELECT nombre, nacimiento FROM mascota
 
907
    -> WHERE MONTH(nacimiento) = MOD(MONTH(NOW()),12) +1;
 
908
+--------+------------+
 
909
| nombre | nacimiento |
 
910
+--------+------------+
 
911
| Bluffy | 1993-02-04 |
 
912
+--------+------------+
 
913
 
 
914
 
 
915
8.3.4.6 Trabajando con valores NULL
 
916
=======================================
 
917
 
 
918
Los valores NULL pueden ser sorprenderte hasta que te acostumbras a
 
919
usarlos. Conceptualmente, NULL significa "valor perdido" o "valor desconocido" y
 
920
se trata de forma diferente que otros valores. Para realizar comparaciones
 
921
respecto a NULL, no puedes utilizar los operadores de comparaci��n aritm��ticos
 
922
como =, < o != . Puedes realizar una demostraci��n de esto, prueba la siguiente consulta:
 
923
 
 
924
mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
 
925
+----------+-----------+----------+----------+
 
926
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
 
927
+----------+-----------+----------+----------+
 
928
|     NULL |      NULL |     NULL |     NULL |
 
929
+----------+-----------+----------+----------+
 
930
 
 
931
Ciertamente, de estas comparaciones no se pueden extraer resultados
 
932
significativos. Para conseguirlo, usa los operadores IS NULL y IS NOT NULL:
 
933
 
 
934
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
 
935
+-----------+---------------+
 
936
| 1 IS NULL | 1 IS NOT NULL |
 
937
+-----------+---------------+
 
938
|         0 |             1 |
 
939
+-----------+---------------+
 
940
 
 
941
En MySQL, 0 significa falso y 1 significa VERDADERO.
 
942
 
 
943
Este tratamiento especial de NULL fue la causa de que en la secci��n anterior
 
944
fuera necesario determinar qu�� animales ya no viv��an usando "muerte IS NOT NULL"
 
945
en lugar de "muerte != NULL".
 
946
 
 
947
8.3.4.7 Asociaci��n/Coincidencia de patrones (PATTERN MATCHING)
 
948
================================================================
 
949
 
 
950
MySQL ofrece las caracter��sticas de asociaci��n de patrones est��ndar as�� como
 
951
una forma de coincidencia de patrones basadas en expresiones regulares
 
952
extendidas similares a las usadas por utilidades UNIX como vi, grep y sed.
 
953
 
 
954
La asociaci��n de patrones SQL te permite usar '_' para asociar cualquier
 
955
caracter simple, y '%' para asociar un n��mero arbitrario de caracteres
 
956
(incluyendo cero caracteres). Los patrones SQL no toman en cuenta las
 
957
diferencias entre may��sculas y min��sculas. Se muestran debajo algunos
 
958
ejemplos. Observa que no se utiliza = o != en el trabajo con patrones SQL; 
 
959
utiliza en su lugar los operadores de comparaci��n LIKE o NOT LIKE.
 
960
 
 
961
Para buscar nombres que comienzan por "b":
 
962
 
 
963
mysql> SELECT * FROM mascota WHERE nombre LIKE "b%";
 
964
+--------+-------------+---------+------+------------+------------+
 
965
| nombre | propietario | especie | sexo | nacimiento | muerte     |
 
966
+--------+-------------+---------+------+------------+------------+
 
967
| Bluffy |  Harold     | gato    | f    | 1993-02-04 | NULL       |
 
968
| Buffy  |  Harold     | perro   | f    | 1989-05-13 | NULL       |
 
969
| Bowser |  Diane      | perro   | m    | 1989-08-31 | 1995-07-29 |
 
970
+--------+-------------+---------+------+------------+------------+
 
971
 
 
972
Para buscar nombres que terminen por "fy":
 
973
 
 
974
mysql> SELECT * FROM mascota WHERE nombre LIKE "%fy";
 
975
+--------+-------------+---------+------+------------+--------+
 
976
| nombre | propietario | especie | sexo | nacimiento | muerte |
 
977
+--------+-------------+---------+------+------------+--------+
 
978
| Bluffy |  Harold     | gato    | f    | 1993-02-04 | NULL   |
 
979
| Buffy  |  Harold     | perro   | f    | 1989-05-13 | NULL   |
 
980
+--------+-------------+---------+------+------------+--------+
 
981
 
 
982
Para buscar nombres que contengan una "w":
 
983
 
 
984
mysql> SELECT * FROM mascota WHERE nombre LIKE "%w%";
 
985
+----------+-------------+---------+------+------------+------------+
 
986
| nombre   | propietario | especie | sexo | nacimiento | muerte     |
 
987
+----------+-------------+---------+------+------------+------------+
 
988
| Claws    |  Gwen       | gato    | m    | 1994-03-17 | NULL       |
 
989
| Bowser   |  Diane      | perro   | m    | 1989-08-31 | 1995-07-29 |
 
990
| Whistler |  Gwen       | p��jaro  | NULL | 1997-12-09 | NULL       |
 
991
+----------+-------------+---------+------+------------+------------+
 
992
 
 
993
Para buscar nombres de longitud cinco caracteres, usa el patr��n "_" :
 
994
 
 
995
mysql> SELECT * FROM mascota WHERE nombre LIKE "_____";
 
996
+--------+-------------+---------+------+------------+--------+
 
997
| nombre | propietario | especie | sexo | nacimiento | muerte |
 
998
+--------+-------------+---------+------+------------+--------+
 
999
| Claws  |  Gwen       | gato    | m    | 1994-03-17 | NULL   |
 
1000
| Buffy  |  Harold     | perro   | f    | 1989-05-13 | NULL   |
 
1001
+--------+-------------+---------+------+------------+--------+
 
1002
 
 
1003
El otro tipo de asociaci��n de patrones ofrecido por MySQL utiliza expresiones
 
1004
regulares extendidas. Cuando se realiza una comprobaci��n buscando una coincidencia
 
1005
para este tipo de patr��n, se deben usar los operadores REGEXP y NOT REGEXP (o
 
1006
RLIKE y NOT RLIKE, dado que son sin��nimos).
 
1007
 
 
1008
Algunas caracter��sticas de las expresiones regulares extendidas son:
 
1009
 
 
1010
* `.' se asocia con cualquier caracter (pero s��lo uno)
 
1011
 
 
1012
* Una clase de caracteres `[...]' se asocia con culquier caracter contenido
 
1013
  dentro de los corchetes. Por ejemplo, `[abc]' se asocia con 'a', 'b' ��
 
1014
 
 
1015
* 'c'. Para nombrar un rango de caracteres, usa un gui��n. `[a-z]' se asocia con
 
1016
cualquier letra en min��scula, donde '[0-9]' se asocia con cualquier d��gito.
 
1017
 
 
1018
* '*' se asocia con 0 o m��s instancias de lo que preceda al asterisco. Por
 
1019
  ejemplo,'a*' coincide con cualquier n��mero de a's,'[0-9]*' se asocia con
 
1020
  cualquier n��mero de d��gitos, y '.*' se asocia con cualquier cosa.
 
1021
 
 
1022
* Las expresiones regulares son sensibles a las may��sculas/min��sculas, pero
 
1023
  puedes utilizar una clase caracter para asociar ambos casos si los deseas. Por
 
1024
  ejemplo, '[aA]' coincide tanto con la letra a min��scula como con la letra A
 
1025
  may��scula y '[a-zA-Z]' coincide con cualquier letra en cualquier modo
 
1026
  may��scula/min��scula.
 
1027
 
 
1028
* El patr��n se asocia si ocurre en cualquier lugar dentro del valor a ser
 
1029
  probado (los patrones SQL coinciden s��lo si se asocian con el valor
 
1030
  completo). 
 
1031
 
 
1032
* Para anclar un patr��n de manera que se busque la coincidencia bien al comienzo
 
1033
  o bien al final del valor a ser comprobado, usa '^' al comienzo del patr��n o
 
1034
  '$' al final del patr��n, respectivamente.
 
1035
 
 
1036
Para demostrar c��mo funcionan las expresiones regulares, las consultas LIKE
 
1037
mostradas antes son reescritas debajo para usar REGEXP:
 
1038
 
 
1039
Para buscar nombres que comiencen por "b", usa '^' para buscar la coincidencia
 
1040
al comienzo del nombre y '[bB]' para buscar la asociaci��n tanto con la b
 
1041
min��scula como con la b may��scula:
 
1042
 
 
1043
mysql> SELECT * FROM mascota WHERE nombre REGEXP "^[bB]";
 
1044
+--------+-------------+---------+------+------------+------------+
 
1045
| nombre | propietario | especie | sexo | nacimiento | muerte     |
 
1046
+--------+-------------+---------+------+------------+------------+
 
1047
| Bluffy |  Harold     | gato    | f    | 1993-02-04 | NULL       |
 
1048
| Buffy  |  Harold     | perro   | f    | 1989-05-13 | NULL       |
 
1049
| Bowser |  Diane      | perro   | m    | 1989-08-31 | 1995-07-29 |
 
1050
+--------+-------------+---------+------+------------+------------+
 
1051
 
 
1052
Para buscar nombres que terminen por "fy", usa "$" para buscar la coincidencia
 
1053
al final del nombre:
 
1054
 
 
1055
mysql> SELECT * FROM mascota WHERE nombre REGEXP "fy$";
 
1056
+--------+-------------+---------+------+------------+--------+
 
1057
| nombre | propietario | especie | sexo | nacimiento | muerte |
 
1058
+--------+-------------+---------+------+------------+--------+
 
1059
| Bluffy |  Harold     | gato    | f    | 1993-02-04 | NULL   |
 
1060
| Buffy  |  Harold     | perro   | f    | 1989-05-13 | NULL   |
 
1061
+--------+-------------+---------+------+------------+--------+
 
1062
 
 
1063
Para buscar nombres que contengan una "w", utiliza "[wW]" para buscar la
 
1064
asociaci��n tanto en may��sculas como min��sculas:
 
1065
 
 
1066
 mysql> SELECT * FROM mascota WHERE nombre REGEXP "[wW]";
 
1067
+----------+-------------+---------+------+------------+------------+
 
1068
| nombre   | propietario | especie | sexo | nacimiento | muerte     |
 
1069
+----------+-------------+---------+------+------------+------------+
 
1070
| Claws    |  Gwen       | gato    | m    | 1994-03-17 | NULL       |
 
1071
| Bowser   |  Diane      | perro   | m    | 1989-08-31 | 1995-07-29 |
 
1072
| Whistler |  Gwen       | p��jaro  | NULL | 1997-12-09 | NULL       |
 
1073
+----------+-------------+---------+------+------------+------------+
 
1074
 
 
1075
Dado que un patr��n de una expresi��n regular se asocia si ocurre en cualquier
 
1076
lugar del valor, no es necesario poner un caracter comod��n en ning��n lado del
 
1077
patr��n para conseguir que se asocie con el valor completo como har��as si usaras
 
1078
un patr��n SQL.
 
1079
 
 
1080
Para buscar nombres conteniendo exactamente cinco caracteres, usa "^" y "$" para
 
1081
asociar el comienzo y el final de un nombre, y cinco instancias de "." entre
 
1082
ellos:
 
1083
 
 
1084
mysql> SELECT * FROM mascota WHERE nombre REGEXP "^.....$";
 
1085
+--------+-------------+---------+------+------------+--------+
 
1086
| nombre | propietario | especie | sexo | nacimiento | muerte |
 
1087
+--------+-------------+---------+------+------------+--------+
 
1088
| Claws  |  Gwen       | gato    | m    | 1994-03-17 | NULL   |
 
1089
| Buffy  |  Harold     | perro   | f    | 1989-05-13 | NULL   |
 
1090
+--------+-------------+---------+------+------------+--------+
 
1091
 
 
1092
Tambi��n podr��as haber escrito la consulta anterior usando el operador '{n}'
 
1093
"repetir n veces":
 
1094
 
 
1095
mysql> SELECT * FROM mascota WHERE nombre REGEXP "^.{5}$";
 
1096
+--------+-------------+---------+------+------------+--------+
 
1097
| nombre | propietario | especie | sexo | nacimiento | muerte |
 
1098
+--------+-------------+---------+------+------------+--------+
 
1099
| Claws  |  Gwen       | gato    | m    | 1994-03-17 | NULL   |
 
1100
| Buffy  |  Harold     | perro   | f    | 1989-05-13 | NULL   |
 
1101
+--------+-------------+---------+------+------------+--------+
 
1102
 
 
1103
 
 
1104
8.3.4.8 Contando filas
 
1105
=======================
 
1106
 
 
1107
Las bases de datos son usadas a menudo para responder a la pregunta, "��cuantas
 
1108
veces aparece un determinado tipo de datos en una tabla?". Por ejemplo, podr��as
 
1109
querer saber cu��ntas mascotas tienes, o cu��ntas mascotas tiene cada propietario,
 
1110
o podr��as querer realizar varios tipos de censos respecto a tus animales.
 
1111
 
 
1112
Contar el n��mero total de animales que tienes es lo mismo que preguntar
 
1113
"��cu��ntas filas hay en la tabla mascota?", dado que hay s��lo una fila por
 
1114
mascota. La funci��n COUNT() cuenta el n��mero de resultados no-NULL , as�� pues, 
 
1115
la consulta a realizar para contar el n��mero de animales tiene la siguiente forma:
 
1116
 
 
1117
mysql> SELECT COUNT(*) FROM mascota;
 
1118
+----------+
 
1119
| COUNT(*) |
 
1120
+----------+
 
1121
|        9 |
 
1122
+----------+
 
1123
 
 
1124
Antes, conseguiste los nombres de las personas que poseen una mascota. Puedes
 
1125
usar COUNT() para averiguar cu��ntas mascotas tiene cada propietario:
 
1126
 
 
1127
mysql> SELECT propietario, COUNT(*) FROM mascota GROUP BY propietario;
 
1128
+-------------+----------+
 
1129
| propietario | COUNT(*) |
 
1130
+-------------+----------+
 
1131
|  Benny      |        2 |
 
1132
|  Diane      |        2 |
 
1133
|  Gwen       |        3 |
 
1134
|  Harold     |        2 |
 
1135
+-------------+----------+
 
1136
 
 
1137
Observa el uso de GROUP BY para agrupar todos los registros de cada
 
1138
propietario. Si no lo hubi��ramos puesto, todo lo que conseguirias ser��a un
 
1139
mensaje de error:
 
1140
 
 
1141
mysql> SELECT propietario, COUNT(propietario) FROM mascota;
 
1142
ERROR 1140: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP
 
1143
columns is illegal if there is no GROUP BY clause
 
1144
 
 
1145
COUNT() y GROUP BY son ��tiles para la caracterizaci��n de tus datos de varias
 
1146
formas. Los siguientes ejemplos muestran difentes maneras para realizar
 
1147
operaciones de censo animal.
 
1148
 
 
1149
N��mero de animales por especies:
 
1150
 
 
1151
mysql> SELECT especie, COUNT(*) FROM mascota GROUP BY especie;
 
1152
+-----------+----------+
 
1153
| especie   | COUNT(*) |
 
1154
+-----------+----------+
 
1155
| gato      |        2 |
 
1156
| hamster   |        1 |
 
1157
| p��jaro    |        2 |
 
1158
| perro     |        3 |
 
1159
| serpiente |        1 |
 
1160
+-----------+----------+
 
1161
 
 
1162
N��mero de animales por sexo:
 
1163
 
 
1164
mysql> SELECT sexo , COUNT(*) FROM mascota GROUP BY sexo;
 
1165
+------+----------+
 
1166
| sexo | COUNT(*) |
 
1167
+------+----------+
 
1168
| NULL |        1 |
 
1169
| f    |        4 |
 
1170
| m    |        4 |
 
1171
+------+----------+
 
1172
 
 
1173
(En este resultado, NULL indica "sexo desconocido")
 
1174
 
 
1175
El n��mero de animales por combinaci��n de especies y sexo:
 
1176
 
 
1177
mysql> SELECT especie , sexo, COUNT(*) FROM mascota GROUP BY especie, sexo;
 
1178
+-----------+------+----------+
 
1179
| especie   | sexo | COUNT(*) |
 
1180
+-----------+------+----------+
 
1181
| gato      | f    |        1 |
 
1182
| gato      | m    |        1 |
 
1183
| hamster   | f    |        1 |
 
1184
| p��jaro    | NULL |        1 |
 
1185
| p��jaro    | f    |        1 |
 
1186
| perro     | f    |        1 |
 
1187
| perro     | m    |        2 |
 
1188
| serpiente | m    |        1 |
 
1189
+-----------+------+----------+
 
1190
 
 
1191
No necesitas recuperar una tabla completa cuando uses COUNT(). Por ejemplo, la
 
1192
consulta anterior, cuando se realiza s��lo sobre perros y gatos, se escribe as��:
 
1193
 
 
1194
mysql> SELECT especie , sexo, COUNT(*) FROM mascota                        
 
1195
    -> WHERE especie = "perro" OR especie = "gato"
 
1196
    -> GROUP BY especie, sexo;
 
1197
+---------+------+----------+
 
1198
| especie | sexo | COUNT(*) |
 
1199
+---------+------+----------+
 
1200
| gato    | f    |        1 |
 
1201
| gato    | m    |        1 |
 
1202
| perro   | f    |        1 |
 
1203
| perro   | m    |        2 |
 
1204
+---------+------+----------+
 
1205
 
 
1206
O, si quieres conocer el n��mero de animales por sexo s��lo para animales de sexo
 
1207
conocido:
 
1208
 
 
1209
mysql> SELECT especie , sexo, COUNT(*) FROM mascota
 
1210
    -> WHERE sexo IS NOT NULL                     
 
1211
    -> GROUP BY especie, sexo;
 
1212
+-----------+------+----------+
 
1213
| especie   | sexo | COUNT(*) |
 
1214
+-----------+------+----------+
 
1215
| gato      | f    |        1 |
 
1216
| gato      | m    |        1 |
 
1217
| hamster   | f    |        1 |
 
1218
| p��jaro    | f    |        1 |
 
1219
| perro     | f    |        1 |
 
1220
| perro     | m    |        2 |
 
1221
| serpiente | m    |        1 |
 
1222
+-----------+------+----------+
 
1223
 
 
1224
 
 
1225
8.3.5 Usando m��s de una tabla
 
1226
===============================
 
1227
 
 
1228
La tabla mascota guarda datos sobre las mascotas que posees. Si quieres guardar
 
1229
otra informaci��n sobre ellos, como eventos en sus vidas, visitas al veterinario
 
1230
o cu��ndo han tenido hermanos, necesitas otra tabla. ��C��mo deber��a ser esta otra
 
1231
tabla?
 
1232
 
 
1233
* Deber�� contener el nombre de la mascota de tal forma que pudieras saber a qu��
 
1234
  animal corresponde cada evento almacenado en la misma.
 
1235
 
 
1236
* Necesitar�� una fecha para conocer cu��ndo ocurri�� el evento.
 
1237
 
 
1238
* Necesitar�� un campo para describir el evento
 
1239
 
 
1240
* Si quieres ser capaz de categorizar los eventos, ser��a ��til tener un campo de
 
1241
  tipo evento.
 
1242
 
 
1243
Dadas estas consideraciones, la sentencia CREATE TABLE para la tabla "evento" se
 
1244
parecer��a a esto:
 
1245
 
 
1246
mysql> CREATE TABLE evento (nombre VARCHAR(20), fecha DATE,
 
1247
    -> tipo VARCHAR(15), anotaci��n VARCHAR(255));
 
1248
 
 
1249
Como ocurr��a con la tabla mascota, es m��s f��cil cargar los registros iniciales
 
1250
creando un fichero de texto delimitado por tabuladores conteniendo la
 
1251
informaci��n:
 
1252
 
 
1253
Fluffy          1995-05-15      parto           4 cachorros, 3 hembras, 1 macho
 
1254
Buffy           1993-06-23      parto           5 cachorros, 2 hembras, 3 machos
 
1255
Buffy           1994-06-19      parto           3 cachorros, 3 hembras
 
1256
Chirpy          1999-03-21      veterinario     necesit�� enderezamiento de pico
 
1257
Slim            1997-08-03      veterinario     costilla rota
 
1258
Bowser          1991-10-12      perrera
 
1259
Fang            1991-10-12      perrera 
 
1260
Fang            1998-08-28      cumplea��os     Se le regala un nuevo juguete de goma
 
1261
Claws           1998-03-17      cumplea��os     Se le regala un nuevo collar de pulgas
 
1262
Whistler        1998-12-09      cumplea��os     Primer cumplea��os
 
1263
 
 
1264
 
 
1265
Carga los registros as��:
 
1266
 
 
1267
mysql> LOAD DATA LOCAL INFILE "evento.txt" INTO TABLE evento;
 
1268
 
 
1269
Bas��ndote en lo que has aprendido de las consultas que has ejecutado em la tabla
 
1270
mascota, deber��as ser capaz de realizar recuperaciones de datos en los registros
 
1271
de la tabla "evento"; los principios son los mismos. ��Pero qu�� hacer cuando la
 
1272
tabla evento no sea suficiente por s�� sola de responder a cuestiones que
 
1273
podr��as llegar a realizar?
 
1274
 
 
1275
Sup��n que quisieras averiguar las edades de cada mascota al tener cachorros. La
 
1276
tabla evento indica cu��ndo ha ocurrido esto, pero para calcular la edad de la
 
1277
madre, necesitas su fecha de nacimiento. Dado que eso est�� almacenado en la
 
1278
tabla mascota, necesitas ambas tablas para la consulta:
 
1279
 
 
1280
mysql> SELECT mascota.nombre , (TO_DAYS(fecha) - TO_DAYS(nacimiento))/365 AS edad, anotaci��n
 
1281
    -> FROM mascota, evento
 
1282
    -> WHERE mascota.nombre = evento.nombre AND tipo = "parto";
 
1283
+--------+------+----------------------------------+
 
1284
| nombre | edad | anotaci��n                        |
 
1285
+--------+------+----------------------------------+
 
1286
| Fluffy | 2.27 | 4 cachorros, 3 hembras, 1 macho  |
 
1287
| Buffy  | 4.12 | 5 cachorros, 2 hembras, 3 machos |
 
1288
| Buffy  | 5.10 | 3 cachorros, 3 hembras           |
 
1289
+--------+------+----------------------------------+
 
1290
 
 
1291
Existen varios puntos que anotar sobre esta consulta:
 
1292
 
 
1293
* La cl��usula FROM lista dos tablas dado que la consulta necesita extraer
 
1294
  informaci��n de las dos.
 
1295
 
 
1296
* Cuando se combina la informaci��n de m��ltiples tablas, necesitas especificar
 
1297
  c��mo pueden ser asociados los registros de una tabla con los registros de la
 
1298
  otra. Esto es f��cil dado que ambas tienen una columna nombre (N.T.: nombre es
 
1299
  una clave extranjera). La consulta usa la cl��usula WHERE para combinar los
 
1300
  registros de las dos tablas bas��ndose en los valores de nombre.
 
1301
 
 
1302
* Dado que la columna nombre aparece en ambas tablas, debes ser espec��fico sobre
 
1303
  a qu�� tabla te refieres cuando est��s hablando de esa columna. Esto se realiza
 
1304
  poniendo el nombre de la tabla como prefijo de la columna.
 
1305
 
 
1306
No necesitas tener dos tablas diferentes para realizar un join. En algunas 
 
1307
ocasiones es ��til realizar un join de una tabla consigo misma, si quieres comparar 
 
1308
registros de una tabla con otros registros en la misma tabla. Por ejemplo, para buscar
 
1309
parejas de sexos entre tus mascotas, puedes enlazar la tabla mascota consigo
 
1310
mismo para emaparejar machos y hembras de las mismas especies:
 
1311
 
 
1312
mysql> SELECT p1.nombre, p1.sexo, p2.nombre, p2.sexo, p1.especie
 
1313
    -> FROM mascota AS p1, mascota AS p2
 
1314
    -> WHERE p1.especie = p2.especie AND p1.sexo = "f" AND p2.sexo = "m";
 
1315
+--------+------+--------+------+---------+
 
1316
| nombre | sexo | nombre | sexo | especie |
 
1317
+--------+------+--------+------+---------+
 
1318
| Fluffy | f    | Claws  | m    | gato    |
 
1319
| Buffy  | f    | Fang   | m    | perro   |
 
1320
| Buffy  | f    | Bowser | m    | perro   |
 
1321
+--------+------+--------+------+---------+
 
1322
 
 
1323
 
 
1324
En esta consulta, especificamos un par de alias para el nombre de las tablas
 
1325
y ser capaces as�� de referirnos a las columnas y saber en todo momento a qu��
 
1326
instancia de qu�� tabla se asocia cada referencia de columna.
 
1327
 
 
1328
8.4 Obtener informaci��n sobre bases de datos y tablas
 
1329
================================================================
 
1330
 
 
1331
��Qu�� ocurre si olvidas el nombre de una base de datos o de una tabla, o cu��l es
 
1332
la estructura de una tabla dada (ejm. : ��c��mo se llaman sus columnas?) MySQL
 
1333
soluciona este problema a trav��s de numerosas sentencias que ofrecen informaci��n
 
1334
sobre las bases de datos y las tablas que soporta.
 
1335
 
 
1336
Ya hemos visto SHOW DATABASES, que lista las bases de datos gestionadas por el
 
1337
servidor. Para averiguar qu�� base de datos est�� actualmente seleccionada, usa la
 
1338
funci��n DATABASE():
 
1339
 
 
1340
mysql> SELECT DATABASE();
 
1341
+------------+
 
1342
| DATABASE() |
 
1343
+------------+
 
1344
| zoo        |
 
1345
+------------+
 
1346
 
 
1347
Si a��n no has seleccionado ninguna base de datos, el resultado estar�� en blanco.
 
1348
 
 
1349
Para averiguar qu�� tablas contiene la base de datos actual (por ejemplo, cuando
 
1350
no est��s seguro sobre el nombre de una tabla), usa este comando:
 
1351
 
 
1352
mysql> SHOW TABLES;
 
1353
+---------------+
 
1354
| Tables in zoo |
 
1355
+---------------+
 
1356
| evento        |
 
1357
| mascota       |
 
1358
+---------------+
 
1359
 
 
1360
Si quieres averiguar la estructura de una tabla, el comando DESCRIBE te ser��
 
1361
��til; muestra informaci��n sobre cada columna de una tabla:
 
1362
 
 
1363
mysql> DESCRIBE mascota;
 
1364
+-------------+-------------+------+-----+---------+-------+
 
1365
| Field       | Type        | Null | Key | Default | Extra |
 
1366
+-------------+-------------+------+-----+---------+-------+
 
1367
| nombre      | varchar(20) | YES  |     | NULL    |       |
 
1368
| propietario | varchar(20) | YES  |     | NULL    |       |
 
1369
| especie     | varchar(20) | YES  |     | NULL    |       |
 
1370
| sexo        | char(1)     | YES  |     | NULL    |       |
 
1371
| nacimiento  | date        | YES  |     | NULL    |       |
 
1372
| muerte      | date        | YES  |     | NULL    |       |
 
1373
+-------------+-------------+------+-----+---------+-------+
 
1374
 
 
1375
Field indica el nombre de la columna, Type es el tipo de datos para la columna,
 
1376
Null indica si la columna puede contener o no valores NULL, Key indica si la
 
1377
columna est�� indexada o no, y Default especifica el valor por defecto para la
 
1378
columna.
 
1379
 
 
1380
Si tienes ��ndices en una tabla, SHOW INDEX FROM nombre_tabla te mostrar��
 
1381
informaci��n sobre ellos.
 
1382
 
 
1383
8.5 Usando mysql en modo batch 
 
1384
=================================
 
1385
 
 
1386
En las secciones previas, hemos usado mysql interactivamente para introducir
 
1387
consultas y observar los resultados. Tambi��n puedes ejecutar mysql en modo
 
1388
batch. Para realizarlo, escribe los comandos que quieras ejecutar en un fichero,
 
1389
despu��s p��dele a mysql que lea su entrada desde el fichero:
 
1390
 
 
1391
shell> mysql < fichero-batch
 
1392
 
 
1393
(N.T.: en ocasiones se traduce como fichero por lotes)
 
1394
 
 
1395
Si necesitas especificar par��metros de conexi��n en la l��nea de comandos, el
 
1396
comando podr��a parecerse a esto:
 
1397
 
 
1398
shell> mysql -h host -u user -p < fichero-batch
 
1399
Enter password: ********
 
1400
 
 
1401
Cuando usas MySQL de esta manera, est��s creando un fichero script (de gui��n), y
 
1402
despu��s ejecutando el script.
 
1403
 
 
1404
��Por qu�� usar un script? He aqu�� algunas razones:
 
1405
 
 
1406
* Si ejecutas una consulta repetidamente (digamos, cada d��a o cada semana), el
 
1407
  construir un script con esta consulta te permite evitar volver a teclearla
 
1408
  cada vez que la ejecutes.
 
1409
 
 
1410
* Puedes generar nuevas consultas a partir de consultas ya existentes similares
 
1411
  simplemente copiando y editando los ficheros script.
 
1412
 
 
1413
* El modo batch puede ser tambi��n muy ��til cuando est��s desarrollando una
 
1414
  consulta, particularmente para comandos multi-l��nea o m��ltiples secuencias de
 
1415
  comandos de m��ltiples sentencias. Si cometes un error, no necesitas reescribir
 
1416
  todo. S��mplemente edita el script para corregir el error, y despu��s p��dele a
 
1417
  mysql que lo vuelva a ejecutar.
 
1418
 
 
1419
* Si tienes una consulta que produce resultados muy largos, puedes usar un
 
1420
  paginador para filtrar esta salida en lugar de ver c��mo se desplaza fuera del
 
1421
  alcance de tu pantalla:
 
1422
 
 
1423
 
 
1424
shell> mysql < fichero_batch | more
 
1425
 
 
1426
* Puedes redirigir la salida a un fichero para un procesamiento posterior:
 
1427
 
 
1428
shell> mysql < fichero_batch > mysql.out
 
1429
 
 
1430
* Puedes distribuir tu script a otras personas para que puedan ejecutar tambi��n
 
1431
  tus comandos.
 
1432
 
 
1433
* Algunas situaciones no permiten un uso interactivo, por ejemplo, cuando
 
1434
  ejecutas una consulta como una tarea de cron. (N.T.: cron es un comando UNIX
 
1435
  que sirve para planificar y ejecutar comandos UNIX en el tiempo). En este
 
1436
  caso, debes usar el procesamiento por lotes.
 
1437
 
 
1438
El formato de salida por defecto es diferente (m��s conciso) cuando ejecutas
 
1439
mysql en modo batch que cuando lo usas de manera interactiva. Por ejemplo, la
 
1440
salida de SELECT DISTINCT especie FROM mascota   es la siguiente cuando se
 
1441
ejecuta de manera interactiva:
 
1442
 
 
1443
mysql> SELECT DISTINCT especie FROM mascota;
 
1444
+-----------+
 
1445
| especie   |
 
1446
+-----------+
 
1447
| gato      |
 
1448
| hamster   |
 
1449
| p��jaro    |
 
1450
| perro     |
 
1451
| serpiente |
 
1452
+-----------+
 
1453
 
 
1454
Y la siguiente si se ejecuta en modo batch:
 
1455
 
 
1456
especie
 
1457
gato
 
1458
hamster
 
1459
p��jaro
 
1460
perro
 
1461
serpiente
 
1462
 
 
1463
Si quieres obtener el formato de salida del modo interactivo tambi��n en modo
 
1464
batch, usa mysql -t. Para redirigir a salida est��ndar los comandos que se est��n
 
1465
ejecutando, usa mysql -vvv.
 
1466
 
 
1467
 
 
1468
 
 
1469
8.6 Consultas del proyecto gemelos
 
1470
 
 
1471
En Analytikerna y Lentus, hemos estado realizando el trabajo de campo y sistemas para
 
1472
un gran proyecto de investigaci��n. Este proyecto es una colaboraci��n entre el Instituto de
 
1473
Medicina Medioambiental en el Karolinska Institutet Stockholm y la Secci��n en Investigaci��n
 
1474
Cl��nica en Envejecimiento y Psicolog��a en la Universidad del Sur de California.
 
1475
 
 
1476
El proyecto consisti�� en una parte de selecci��n donde todos los gemelos en Suecia mayores de
 
1477
65 a��os eran entrevistados por tel��fono. Los gemelos que reun��an ciertos criterios pasaban a la
 
1478
siguiente fase. En esta fase posterior, los gemelos que quer��an participar eran visitados por
 
1479
un equipo doctor/enfermera. Algunos de los ex��menes inclu��an ex��menes f��sicos y neuropsicol��gicos,
 
1480
pruebas de laboratorio, neuroim��genes, valoraci��n del estado psicol��gico, y recopilaci��n de la
 
1481
historia familiar. Adem��s, se recogieron datos sobre los factores de riesgo m��dicos y
 
1482
medioambientales.
 
1483
 
 
1484
Puede encontrarse m��s informaci��n sobre los estudios de gemelos en :
 
1485
 
 
1486
      http://www.imm.ki.se/TWIN/TWINUKW.HTM
 
1487
 
 
1488
La ��ltima parte del proyecto se administra con un interfaz web escrito usando Perl y MySQL.
 
1489
Cada noche, todos los datos de las entrevistas son movidos a una base de datos MySQL.
 
1490
 
 
1491
8.6.1 Buscar todos los gemelos no-distribuidos
 
1492
 
 
1493
La siguiente consulta se usa para determinar qui��n pasa a la segunda parte del proyecto:
 
1494
 
 
1495
 select
 
1496
             concat(p1.id, p1.tvab) + 0 as tvid,
 
1497
             concat(p1.christian_name, " ", p1.surname) as Name,
 
1498
             p1.postal_code as Code,
 
1499
             p1.city as City,
 
1500
             pg.abrev as Area,
 
1501
             if(td.participation = "Aborted", "A", " ") as A,
 
1502
             p1.dead as dead1,
 
1503
             l.event as event1,
 
1504
             td.suspect as tsuspect1,
 
1505
             id.suspect as isuspect1,
 
1506
             td.severe as tsevere1,
 
1507
             id.severe as isevere1,
 
1508
             p2.dead as dead2,
 
1509
             l2.event as event2,
 
1510
             h2.nurse as nurse2,
 
1511
             h2.doctor as doctor2,
 
1512
             td2.suspect as tsuspect2,
 
1513
             id2.suspect as isuspect2,
 
1514
             td2.severe as tsevere2,
 
1515
             id2.severe as isevere2,
 
1516
             l.finish_date
 
1517
     from
 
1518
             twin_project as tp
 
1519
             /* For Twin 1 */
 
1520
             left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab
 
1521
             left join informant_data as id on tp.id = id.id and tp.tvab = id.tvab
 
1522
             left join harmony as h on tp.id = h.id and tp.tvab = h.tvab
 
1523
             left join lentus as l on tp.id = l.id and tp.tvab = l.tvab
 
1524
             /* For Twin 2 */
 
1525
             left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab             left join informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab
 
1526
             left join harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab
 
1527
             left join lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab,
 
1528
             person_data as p1,
 
1529
             person_data as p2,
 
1530
             postal_groups as pg
 
1531
     where
 
1532
             /* p1 gets main twin and p2 gets his/her twin. */
 
1533
             /* ptvab is a field inverted from tvab */
 
1534
             p1.id = tp.id and p1.tvab = tp.tvab and
 
1535
             p2.id = p1.id and p2.ptvab = p1.tvab and
 
1536
             /* Just the sceening survey */
 
1537
             tp.survey_no = 5 and
 
1538
             /* Skip if partner died before 65 but allow emigration (dead=9) */
 
1539
             (p2.dead = 0 or p2.dead = 9 or
 
1540
              (p2.dead = 1 and
 
1541
               (p2.death_date = 0 or
 
1542
                (((to_days(p2.death_date) - to_days(p2.birthday)) / 365)
 
1543
                 >= 65))))
 
1544
             and
 
1545
             (
 
1546
             /* Twin is suspect */
 
1547
             (td.future_contact = 'Yes' and td.suspect = 2) or
 
1548
             /* Twin is suspect - Informant is Blessed */
 
1549
             (td.future_contact = 'Yes' and td.suspect = 1 and id.suspect = 1) o
 
1550
             /* No twin - Informant is Blessed */
 
1551
             (ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = 'Yes') or
 
1552
             /* Twin broken off - Informant is Blessed */
 
1553
             (td.participation = 'Aborted'
 
1554
              and id.suspect = 1 and id.future_contact = 'Yes') or
 
1555
             /* Twin broken off - No inform - Have partner */
 
1556
             (td.participation = 'Aborted' and ISNULL(id.suspect) and p2.dead = 0))
 
1557
             and
 
1558
             l.event = 'Finished'
 
1559
             /* Get at area code */
 
1560
             and substring(p1.postal_code, 1, 2) = pg.code
 
1561
             /* Not already distributed */
 
1562
             and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
 
1563
             /* Has not refused or been aborted */
 
1564
             and not (h.status = 'Refused' or h.status = 'Aborted'
 
1565
             or h.status = 'Died' or h.status = 'Other')
 
1566
     order by
 
1567
             tvid;
 
1568
 
 
1569
Algunas explicaciones:
 
1570
 
 
1571
`concat(p1.id, p1.tvab) + 0 as tvid'
 
1572
     Queremos ordenar por la concatenaci��n de `id' y `tvab' en orden num��rico.
 
1573
     A��adiendo `0' al resultado provocamos que *MySQL* trate el resultado como 
 
1574
     un n��mero.
 
1575
 
 
1576
column `id'
 
1577
     Esto identifica un par de gemelos. Es una clave en todas las tablas.
 
1578
 
 
1579
column `tvab'
 
1580
     Esto identifica un gemelo de una pareja. Tiene un valor de `1' �� `2'
 
1581
 
 
1582
column `ptvab'
 
1583
     Esto es la inversa de `tvab'. Cuando `tvab' es `1' esto es `2', y
 
1584
     vice versa. Esto existe para ahorrarnos teclear y para hacer m��s f��cil
 
1585
     la optimizaci��n de la consulta a MySQL. 
 
1586
 
 
1587
 
 
1588
Esta consulta demuestra, entre otras cosas, c��mo realizar b��squedas en una tabla
 
1589
enlazada con la misma tabla a trav��s de un join (p1 y p2). En el ejemplo, ��sto
 
1590
se usa para comprobar cu��ndo un gemelo de una pareja muri�� antes de cumplir 65. 
 
1591
En caso afirmativo, la fila no es devuelta.
 
1592
 
 
1593
Todo lo anterior existe en todas las tablas con informaci��n relacionada con los gemelos.
 
1594
Tenemos una clave tanto en id, tvab (todas las tablas) como en id,ptvab (person_data) para
 
1595
construir consultas m��s r��pidas.
 
1596
 
 
1597
En nuestra m��quina de producci��n (una UltraSPARC 200MHz), esta consulta devuelve alrededor
 
1598
de 150-200 filas y tarda menos de un segundo.
 
1599
 
 
1600
El n��mero actual de registros en las tablas usadas arriba:
 
1601
 
 
1602
Tabla               Filas
 
1603
 
 
1604
person_data          71074                                
 
1605
lentus               5291                                 
 
1606
twin_project         5286                                 
 
1607
twin_data            2012                                 
 
1608
informant_data       663                                  
 
1609
harmony              381                                  
 
1610
postal_groups        100     
 
1611
 
 
1612
 
 
1613
 
 
1614
 
 
1615
8.6.2 Mostrar una tabla con el estado de la pareja de gemelos.
 
1616
 
 
1617
Cada entrevista finaliza con un c��digo de estado llamado event. La consulta mostrada
 
1618
debajo se usa para imprimir una tabla sobre todas las parejas de gemelos combinadas por evento.
 
1619
Esto indica en cu��ntas parejas ambos gemelos han finalizado, en cu��ntas parejas
 
1620
ha finalizado un gemelo y el otro se rechaz��, etc.
 
1621
 
 
1622
  select
 
1623
             t1.event,
 
1624
             t2.event,
 
1625
             count(*)
 
1626
     from
 
1627
             lentus as t1,
 
1628
             lentus as t2,
 
1629
             twin_project as tp
 
1630
     where
 
1631
             /* We are looking at one pair at a time */
 
1632
             t1.id = tp.id
 
1633
             and t1.tvab=tp.tvab
 
1634
             and t1.id = t2.id
 
1635
             /* Just the sceening survey */
 
1636
             and tp.survey_no = 5
 
1637
             /* This makes each pair only appear once */
 
1638
             and t1.tvab='1' and t2.tvab='2'
 
1639
     group by
 
1640
             t1.event, t2.event;
 
1641
 
 
1642
 
 
1643