2
=======================
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.
11
Para ver una lista de opciones proporcionadas por mysql, l��nzalo con las opci��n --help :
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).
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.
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
28
8.1 Conectando y desconectando del servidor
29
=============================================
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:
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
48
El prompt te indica que mysql ya est�� listo para la introducci��n de comandos.
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:
56
Una vez que hayas conectado con ��xito, puedes desconectarte en cualquier momento tecleando QUIT en
62
Tambi��n puedes desconectar tecleando control-D.
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>
68
8.2 Haciendo consultas
69
========================
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.
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:
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)
92
Esta consulta ilustra muchas cosas sobre mysql:
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.)
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.
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.
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.)
113
Las palabras clave pueden ser tecleadas en cualquier combinaci��n may��scula/min��scula. Las siguientes
114
consultas son equivalentes:
116
mysql> SELECT VERSION(), CURRENT_DATE;
117
mysql> select version(), current_date;
118
mysql> SeLeCt vErSiOn(), current_DATE;
120
He aqu�� otra consulta. Demuestra que puedes usar mysql como una calculadora sencilla:
122
mysql> SELECT SIN(PI()/4), (4+1)*5;
123
+-------------+---------+
124
| SIN(PI()/4) | (4+1)*5 |
125
+-------------+---------+
127
+-------------+---------+
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:
132
mysql> SELECT VERSION(); SELECT NOW();
140
+---------------------+
142
+---------------------+
143
| 2000-01-05 17:33:16 |
144
+---------------------+
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.)
151
Aqu�� tenemos un simple ejemplo de m��ltiples l��neas:
157
+----------------+--------------+
158
| USER() | CURRENT_DATE |
159
+----------------+--------------+
160
| root@localhost | 2000-01-05 |
161
+----------------+--------------+
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��
169
Si decides que no quieres ejecutar un comando que est�� en proceso de introducci��n, puedes cancelarlo
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.
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:
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 (")
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:
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��:
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:
216
mysql> SELECT * FROM mi_tabla WHERE nombre ="Garc��a AND edad < 30;
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.)
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 :
229
mysql> SELECT * FROM mi_tabla WHERE nombre ="Garc��a AND edad < 30;
233
El prompt vuelve a cambiar a mysql>, indicando que mysql est�� listo para un nuevo comando.
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.
240
8.3 Creando y usando una base de datos
241
==========================================
243
Ahora que sabes como introducir comandos, es hora de acceder a la base de datos.
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
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
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.
262
Usa la sentencia SHOW para averiguar qu�� bases de datos existen actualmente en el servidor:
264
mysql> SHOW DATABASES;
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.
277
Si la base de datos test existe, intenta acceder a ella:
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.
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
292
mysql> GRANT ALL ON zoo.* TO tu_nombre;
294
donde tu_nombre es el nombre de usuario MySQL que tengas asignado.
298
mysql> GRANT ALL ON zoo.* TO chessy@localhost;
299
Query OK, 0 rows affected (0.08 sec)
302
8.3.1 Creando y seleccionando una base de datos
303
==================================================
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:
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
312
Type 'help' for help.
314
mysql> CREATE DATABASE zoo;
315
Query OK, 1 row affected (0.02 sec)
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.)
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:
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:
336
shell> mysql -h host -u user -p zoo
337
Enter password: ********
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.
345
8.3.2 Creando una tabla
346
============================
348
Crear una tabla es la parte f��cil, pero hasta este momento est�� vac��a, como te dice la orden SHOW
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.
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.
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:
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 :-)
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��.
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.
385
Usa una sentencia CREATE TABLE para especificar la estructura de tu tabla:
387
mysql> CREATE TABLE mascota (nombre VARCHAR(20), propietario VARCHAR(20),
388
-> especie VARCHAR(20), sexo CHAR(1), nacimiento DATE, muerte DATE);
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.)
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".
399
El uso del tipo de datos DATE para las columnas de nacimiento y muerte es una opci��n bastante
402
Ahora que ya has creado una tabla, SHOW TABLES deber��a producir alguna salida:
411
Para verificar que tu tabla fue creada de la forma que esperabas, usa una sentencia DESCRIBE:
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
+-------------+-------------+------+-----+---------+-------+
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.
428
8.3.3 Cargando datos en una tabla
429
=====================================
431
Una vez creada tu tabla, necesitas poblarla. Las sentencias LOAD DATA e INSERT son ��tiles para esto.
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.)
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
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.
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):
458
Whistler Gwen p��jaro \N 1997-12-09 \N
460
Para cargar el fichero de texto "mascota.txt" en la tabla mascota, usa este comando:
462
mysql> LOAD DATA LOCAL INFILE "mascota.txt" INTO TABLE mascota;
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
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:
474
mysql> INSERT INTO mascota
475
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
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.
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.
486
8.3.4 Extrayendo informaci��n de una tabla
487
===============================================
490
La sentencia SELECT se usa para recabar informaci��n de una tabla. La forma
491
general de la sentencia es:
493
SELECT qu��_seleccionar
495
WHERE condiciones_a_satisfacer
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.
503
8.3.4.1 Seleccionando todos los datos
504
=======================================
506
La forma m��s simplede SELECT recoge toda la informaci��n de una tabla:
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
+----------+-------------+-----------+------+------------+------------+
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
530
Existen al menos un par de maneras de arreglar esto:
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:
535
mysql> DELETE from mascota;
536
mysql> LOAD DATA LOCAL INFILE "mascota.txt" INTO TABLE mascota;
538
Sin embargo, si haces esto, debes re-escribir el registro para Puffball.
540
* Arreglar s��lo el registro err��neo con la sentencia UPDATE:
542
mysql> UPDATE mascota SET nacimiento="1989-08-31" WHERE nombre="Bowser";
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.
551
8.3.4.2 Seleccionando filas en particular
552
=============================================
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:
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
+--------+-------------+---------+------+------------+------------+
565
La salida confirma que el a��o est�� correctamente registrado como 1989, no 1998.
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.
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
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
+----------+-------------+---------+------+------------+--------+
583
Puedes combinar condiciones, por ejemplo, para localizar los perros hembra:
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
+--------+-------------+---------+------+------------+--------+
592
La consulta anterior usa el operador l��gico AND. Existe tambi��n un operador OR:
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
+----------+-------------+-----------+------+------------+--------+
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:
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
+--------+-------------+---------+------+------------+--------+
615
8.3.4.3 Seleccionando columnas en particular
616
===================================================
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:
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
+----------+------------+
637
Para averiguar qui��n posee mascotas, usa esta consulta:
639
mysql> SELECT propietario FROM mascota;
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
659
mysql> SELECT DISTINCT propietario FROM mascota;
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:
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
+--------+---------+------------+
685
8.3.4.4 Ordenando filas
686
===========================
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
694
Aqu�� mostramos las fechas de nacimiento de los animales, ordenadas por fecha:
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
+----------+------------+
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:
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
+----------+------------+
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:
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
+----------+-----------+------------+
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.
752
8.3.4.5 C��lculos de fecha
753
============================
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.
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):
763
mysql> select nombre, (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 FROM mascota;
764
+----------+------------------------------------------+
765
| nombre | (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 |
766
+----------+------------------------------------------+
776
+----------+------------------------------------------+
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.
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):
788
mysql> select nombre, (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 AS edad
789
-> FROM mascota ORDER BY nombre;
804
Para ordenar la salida por edad en lugar de por nombre, puedes hacerlo usando
805
s��mplemente una cl��usula ORDER BY diferente:
807
mysql> select nombre, (TO_DAYS(NOW())-TO_DAYS(nacimiento))/365 AS edad
808
-> FROM mascota ORDER BY edad;
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:
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
+--------+------------+------------+-------+
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.
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
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
+----------+------------+-------------------+
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):
868
mysql> SELECT nombre, nacimiento FROM mascota WHERE MONTH(nacimiento) = 5;
869
+--------+------------+
870
| nombre | nacimiento |
871
+--------+------------+
872
| Buffy | 1989-05-13 |
873
+--------+------------+
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).
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:
888
+---------------------+
890
+---------------------+
891
| 2000-01-13 18:13:09 |
892
+---------------------+
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
+--------+------------+
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)):
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
+--------+------------+
915
8.3.4.6 Trabajando con valores NULL
916
=======================================
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:
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
+----------+-----------+----------+----------+
931
Ciertamente, de estas comparaciones no se pueden extraer resultados
932
significativos. Para conseguirlo, usa los operadores IS NULL y IS NOT NULL:
934
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
935
+-----------+---------------+
936
| 1 IS NULL | 1 IS NOT NULL |
937
+-----------+---------------+
939
+-----------+---------------+
941
En MySQL, 0 significa falso y 1 significa VERDADERO.
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".
947
8.3.4.7 Asociaci��n/Coincidencia de patrones (PATTERN MATCHING)
948
================================================================
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.
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.
961
Para buscar nombres que comienzan por "b":
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
+--------+-------------+---------+------+------------+------------+
972
Para buscar nombres que terminen por "fy":
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
+--------+-------------+---------+------+------------+--------+
982
Para buscar nombres que contengan una "w":
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
+----------+-------------+---------+------+------------+------------+
993
Para buscar nombres de longitud cinco caracteres, usa el patr��n "_" :
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
+--------+-------------+---------+------+------------+--------+
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).
1008
Algunas caracter��sticas de las expresiones regulares extendidas son:
1010
* `.' se asocia con cualquier caracter (pero s��lo uno)
1012
* Una clase de caracteres `[...]' se asocia con culquier caracter contenido
1013
dentro de los corchetes. Por ejemplo, `[abc]' se asocia con 'a', 'b' ��
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.
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.
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.
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
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.
1036
Para demostrar c��mo funcionan las expresiones regulares, las consultas LIKE
1037
mostradas antes son reescritas debajo para usar REGEXP:
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:
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
+--------+-------------+---------+------+------------+------------+
1052
Para buscar nombres que terminen por "fy", usa "$" para buscar la coincidencia
1053
al final del nombre:
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
+--------+-------------+---------+------+------------+--------+
1063
Para buscar nombres que contengan una "w", utiliza "[wW]" para buscar la
1064
asociaci��n tanto en may��sculas como min��sculas:
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
+----------+-------------+---------+------+------------+------------+
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
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
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
+--------+-------------+---------+------+------------+--------+
1092
Tambi��n podr��as haber escrito la consulta anterior usando el operador '{n}'
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
+--------+-------------+---------+------+------------+--------+
1104
8.3.4.8 Contando filas
1105
=======================
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.
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:
1117
mysql> SELECT COUNT(*) FROM mascota;
1124
Antes, conseguiste los nombres de las personas que poseen una mascota. Puedes
1125
usar COUNT() para averiguar cu��ntas mascotas tiene cada propietario:
1127
mysql> SELECT propietario, COUNT(*) FROM mascota GROUP BY propietario;
1128
+-------------+----------+
1129
| propietario | COUNT(*) |
1130
+-------------+----------+
1135
+-------------+----------+
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
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
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.
1149
N��mero de animales por especies:
1151
mysql> SELECT especie, COUNT(*) FROM mascota GROUP BY especie;
1152
+-----------+----------+
1153
| especie | COUNT(*) |
1154
+-----------+----------+
1160
+-----------+----------+
1162
N��mero de animales por sexo:
1164
mysql> SELECT sexo , COUNT(*) FROM mascota GROUP BY sexo;
1173
(En este resultado, NULL indica "sexo desconocido")
1175
El n��mero de animales por combinaci��n de especies y sexo:
1177
mysql> SELECT especie , sexo, COUNT(*) FROM mascota GROUP BY especie, sexo;
1178
+-----------+------+----------+
1179
| especie | sexo | COUNT(*) |
1180
+-----------+------+----------+
1184
| p��jaro | NULL | 1 |
1188
| serpiente | m | 1 |
1189
+-----------+------+----------+
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��:
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
+---------+------+----------+
1204
+---------+------+----------+
1206
O, si quieres conocer el n��mero de animales por sexo s��lo para animales de sexo
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
+-----------+------+----------+
1221
| serpiente | m | 1 |
1222
+-----------+------+----------+
1225
8.3.5 Usando m��s de una tabla
1226
===============================
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
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.
1236
* Necesitar�� una fecha para conocer cu��ndo ocurri�� el evento.
1238
* Necesitar�� un campo para describir el evento
1240
* Si quieres ser capaz de categorizar los eventos, ser��a ��til tener un campo de
1243
Dadas estas consideraciones, la sentencia CREATE TABLE para la tabla "evento" se
1246
mysql> CREATE TABLE evento (nombre VARCHAR(20), fecha DATE,
1247
-> tipo VARCHAR(15), anotaci��n VARCHAR(255));
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
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
1265
Carga los registros as��:
1267
mysql> LOAD DATA LOCAL INFILE "evento.txt" INTO TABLE evento;
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?
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:
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
+--------+------+----------------------------------+
1291
Existen varios puntos que anotar sobre esta consulta:
1293
* La cl��usula FROM lista dos tablas dado que la consulta necesita extraer
1294
informaci��n de las dos.
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.
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.
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:
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
+--------+------+--------+------+---------+
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.
1328
8.4 Obtener informaci��n sobre bases de datos y tablas
1329
================================================================
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.
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():
1340
mysql> SELECT DATABASE();
1347
Si a��n no has seleccionado ninguna base de datos, el resultado estar�� en blanco.
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:
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:
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
+-------------+-------------+------+-----+---------+-------+
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
1380
Si tienes ��ndices en una tabla, SHOW INDEX FROM nombre_tabla te mostrar��
1381
informaci��n sobre ellos.
1383
8.5 Usando mysql en modo batch
1384
=================================
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:
1391
shell> mysql < fichero-batch
1393
(N.T.: en ocasiones se traduce como fichero por lotes)
1395
Si necesitas especificar par��metros de conexi��n en la l��nea de comandos, el
1396
comando podr��a parecerse a esto:
1398
shell> mysql -h host -u user -p < fichero-batch
1399
Enter password: ********
1401
Cuando usas MySQL de esta manera, est��s creando un fichero script (de gui��n), y
1402
despu��s ejecutando el script.
1404
��Por qu�� usar un script? He aqu�� algunas razones:
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.
1410
* Puedes generar nuevas consultas a partir de consultas ya existentes similares
1411
simplemente copiando y editando los ficheros script.
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.
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:
1424
shell> mysql < fichero_batch | more
1426
* Puedes redirigir la salida a un fichero para un procesamiento posterior:
1428
shell> mysql < fichero_batch > mysql.out
1430
* Puedes distribuir tu script a otras personas para que puedan ejecutar tambi��n
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.
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:
1443
mysql> SELECT DISTINCT especie FROM mascota;
1454
Y la siguiente si se ejecuta en modo batch:
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.
1469
8.6 Consultas del proyecto gemelos
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.
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
1484
Puede encontrarse m��s informaci��n sobre los estudios de gemelos en :
1486
http://www.imm.ki.se/TWIN/TWINUKW.HTM
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.
1491
8.6.1 Buscar todos los gemelos no-distribuidos
1493
La siguiente consulta se usa para determinar qui��n pasa a la segunda parte del proyecto:
1496
concat(p1.id, p1.tvab) + 0 as tvid,
1497
concat(p1.christian_name, " ", p1.surname) as Name,
1498
p1.postal_code as Code,
1501
if(td.participation = "Aborted", "A", " ") as A,
1504
td.suspect as tsuspect1,
1505
id.suspect as isuspect1,
1506
td.severe as tsevere1,
1507
id.severe as isevere1,
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,
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
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,
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
1541
(p2.death_date = 0 or
1542
(((to_days(p2.death_date) - to_days(p2.birthday)) / 365)
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))
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')
1569
Algunas explicaciones:
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
1577
Esto identifica un par de gemelos. Es una clave en todas las tablas.
1580
Esto identifica un gemelo de una pareja. Tiene un valor de `1' �� `2'
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.
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.
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.
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.
1600
El n��mero actual de registros en las tablas usadas arriba:
1615
8.6.2 Mostrar una tabla con el estado de la pareja de gemelos.
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.
1631
/* We are looking at one pair at a time */
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'