Está en la página 1de 27

Introduccin

El objetivo de este tutorial es mostrar el uso del programa cliente mysql para crear y
usar una sencilla base de datos. mysql (algunas veces referido como "monitor mysql")
es un programa interactivo que permite conectarnos a un servidor MySQL ejecutar
algunas consultas y ver los resultados. mysql puede ser usado tambi!n en modo
batc"# es decir se pueden colocar toda una serie de consultas en un arc"ivo y
posteriormente decirle a mysql que ejecute dic"as consultas.
Este tutorial asume que mysql est$ instalado en alguna m$quina y que disponemos de
un servidor MySQL al cual podemos conectarnos. Si este no es el caso tenemos que
contactar con nuestro administrador MySQL. (Si nosotros somos los administradores es
necesario consultar la documentaci%n de MySQL que se refieren a la instalaci%n y
configuraci%n del servidor MySQL).
&ara ver la lista de opciones proporcionadas por mysql lo invocamos con la opci%n
''"elp#
shell> mysql --help
( continuaci%n se describe el proceso completo de creaci%n y uso de una base de datos
en MySQL. Si se est$ interesado s%lo en el acceso y uso de una base de datos
e)istente se pueden omitir las secciones que describen como crear la base de datos y
las tablas correspondientes.
&uesto que es imposible que se describan a detalle muc"os de los t%picos cubiertos
aqu* se recomienda que se consulte el manual de MySQL para obtener m$s
informaci%n al respecto.
Conectndose y desconectndose al servidor MySQL
&ara conectarse al servidor usualmente necesitamos de un nombre de usuario (login)
y de una contrase+a (pass,ord) y si el servidor al que nos deseamos conectar est$ en
una m$quina diferente de la nuestra tambi!n necesitamos indicar el nombre o la
direcci%n -& de dic"o servidor. .na ve/ que conocemos estos tres valores podemos
conectarnos de la siguiente manera#
shell> mysql -h NombreDelServidor -u NombreDeUsuario -p
0uando ejecutamos este comando se nos pedir$ que proporcionemos tambi!n la
contrase+a para el nombre de usuario que estamos usando.
Si la cone)i%n al servidor MySQL se pudo establecer de manera satisfactoria
recibiremos el mensaje de bienvenida y estaremos en el prompt de mysql#
shell>mysql -h casita -u root -p
Enter password: ******
Welcome to the yS!" monitor# $ommands end with % or &'#
(our yS!" connection id is ))*+ to server version: +#,+#-.
/ype 0help%0 or 0&h0 1or help# /ype 0&c0 to clear the bu11er#
1
mysql>
Este prompt nos indica que mysql est$ listo para recibir comandos.
(lgunas instalaciones permiten que los usuarios se conecten de manera an%nima al
servidor corriendo en la m$quina local. Si es el caso de nuestra m$quina debemos de
ser capaces de conectarnos al servidor invocando a mysql sin ninguna opci%n#
shell> mysql
1espu!s de que nos "emos conectado de manera satisfactoria podemos
desconectarnos en cualquier momento al escribir "quit" "e)it" o presionar
023452L61.
La mayor*a de los ejemplos siguientes asume que estamos conectados al servidor lo
cual se indica con el prompt de mysql.
Ejecutando algunas consultas
En este momento debimos de "aber podido conectarnos ya al servidor MySQL a7n
cuando no "emos seleccionado alguna base de datos para trabajar. Lo que "aremos a
continuaci%n es escribir algunos comandos para irnos familiari/ando con el
funcionamiento de mysql
mysql> SE"E$/ 2E3S45N678 $U33EN/9D:/E%
;-----------;--------------;
< 2E3S45N67 < $U33EN/9D:/E <
;-----------;--------------;
< +#,+#-. < ,==,-.=-=. <
;-----------;--------------;
. row in set 6=#=+ sec7
mysql>
Esta comando ilustra distintas cosas acerca de mysql#
Un comando normalmente consiste de un sentencia SQL seguida por un punto y coma.
Cuando emitimos un comando, mysl lo manda al servidor para ue lo ejecute, nos muestra los
resultados y regresa el prompt indicando ue est listo para reci!ir ms consultas.
mysl muestra los resultados de la consulta como una ta!la "#ilas y columnas$. La primera #ila
contiene etiuetas para las columnas. Las #ilas siguientes muestran los resultados de la consulta.
%ormalmente las etiuetas de las columnas son los nom!res de los campos de las ta!las ue
estamos usando en alguna consulta. Si lo ue estamos recuperando es el valor de una e&presin
"como en el ejemplo anterior$ las etiuetas en las columnas son la e&presin en s'.
mysl muestra cuntas #ilas #ueron regresadas y cuanto tiempo tard en ejecutarse la consulta, lo
cual puede darnos una idea de la e#iciencia del servidor, aunue estos valores pueden ser un tanto
imprecisos ya ue no se muestra la (ora del C)U, y porue pueden verse a#ectados por otros
#actores, tales como la carga del servidor y la velocidad de comunicacin en una red.
Las pala!ras clave pueden ser escritas usando may*sculas y min*sculas.
Las siguientes consultas son equivalentes#
mysql> SE"E$/ 2E3S45N678 $U33EN/9D:/E%
2
mysql> select version678 current9date%
mysql> Se"e$t vErSi5n678 current9D:/E%
(qu* est$ otra consulta que demuestra como se pueden escribir algunas e)presiones
matem$ticas y trigonom!tricas#
mysql> SE"E$/ S4N6>467?-78 6-;.7*)%
;-------------;---------;
< S4N6>467?-7 < 6-;.7*) <
;-------------;---------;
< =#@=@.=@ < ,) <
;-------------;---------;
(unque "asta este momento se "an escrito sentencias sencillas de una s%la l*nea es
posible escribir m$s de una sentencia por l*nea siempre y cuando est!n separadas por
punto y coma#
mysql> SE"E$/ 2E3S45N67% SE"E$/ N5W67%
;-----------;
< 2E3S45N67 <
;-----------;
< +#,+#-. <
;-----------;
. row in set 6=#=. sec7
;---------------------;
< N5W67 <
;---------------------;
< ,==,-.=-,A .-:,*:=- <
;---------------------;
. row in set 6=#=. sec7
.n comando no necesita ser escrito en una s%la l*nea as* que los comandos que
requieran de varias l*neas no son un problema. mysql determinar$ en donde finali/a la
sentencia cuando encuentre el punto y coma no cuando encuentre el fin de l*nea.
(qu* est$ un ejemplo que muestra un consulta simple escrita en varias l*neas#
mysql> SE"E$/
-> USE3678
-> $U33EN/9D:/E%
;----------------;--------------;
< USE367 < $U33EN/9D:/E <
;----------------;--------------;
< rootBlocalhost < ,==,-=C-.- <
;----------------;--------------;
. row in set 6=#== sec7
mysql>
En este ejemplo debe notarse como cambia el prompt (de mysql8 a '8) cuando se
escribe una consulta en varias l*neas. Esta es la manera en c%mo mysql indica que est$
esperando a que finalice la consulta. Sin embargo si deseamos no terminar de escribir
la consulta podemos "acerlo al escribir 9c como se muestra en el siguiente ejemplo#
3
mysql> SE"E$/
-> USE3678
-> &c
mysql>
1e nuevo se nos regresa el comando el prompt mysql8 que nos indica que mysql est$
listo para una nueva consulta.
En la siguiente tabla se muestran cada uno de los prompts que podemos obtener y una
breve descripci%n de su significado para mysql#
Prompt Significado
mysql8 Listo para una nueva consulta.
'8 Esperando la l*nea siguiente de una consulta multi'l*nea.
:8
Esperando la siguiente l*nea para completar una cadena que comien/a con
una comilla sencilla (:).
"8
Esperando la siguiente l*nea para completar una cadena que comien/a con
una comilla doble (").
Los comandos multi'l*nea com7nmente ocurren por accidente cuando tecleamos
E34E5 pero olvidamos escribir el punto y coma. En este caso mysql se queda
esperando para que finalicemos la consulta#
mysql> SE"E$/ USE367
->
Si esto llega a suceder muy probablemente mysql estar$ esperando por un punto y
coma de manera que si escribimos el punto y coma podremos completar la consulta y
mysql podr$ ejecutarla#
mysql> SE"E$/ USE367
-> %
;----------------;
< USE367 <
;----------------;
< rootBlocalhost <
;----------------;
. row in set 6=#== sec7
mysql>
Los prompts :8 y "8 ocurren durante la escritura de cadenas. En mysql podemos
escribir cadenas utili/ando comillas sencillas o comillas dobles (por ejemplo :"ola: y
""ola") y mysql nos permite escribir cadenas que ocupen multiple l*neas. 1e manera
que cuando veamos el prompt :8 o "8 mysql nos indica que "emos empe/ado a
escribir una cadena pero no la "emos finali/ado con la comilla correspondiente.
(unque esto puede suceder si estamos escribiendo una cadena muy grande es m$s
frecuente que obtengamos alguno de estos prompts si inadvertidamente escribimos
alguna de estas comillas.
&or ejemplo#
4
mysql> SE"E$/ * D35 mi9tabla WEE3E nombre F G"upita :ND edad H +=%
G>
Si escribimos esta consulta SELE04 y entonces presionamos E34E5 para ver el
resultado no suceder$ nada. En lugar de preocuparnos porque la consulta "a tomado
muc"o tiempo debemos notar la pista que nos da mysql cambiando el prompt. Esto
nos indica que mysql est$ esperando que finalicemos la cadena iniciada ("Lupita).
En este caso ;qu! es lo que debemos "acer< . La cosa m$s simple es cancelar la
consulta. Sin embargo no basta con escribir 9c ya que mysql interpreta esto como
parte de la cadena que estamos escribiendo. En lugar de esto debemos escribir antes
la comilla correspondiente y despu!s 9c #
mysql> SE"E$/ * D35 mi9tabla WEE3E nombre F G"upita :ND edad H +=%
G> G &c
mysql>
El prompt cambiar$ de nuevo al ya conocido mysql8 indic$ndonos que mysql est$ listo
para una nueva consulta.
Es sumamente importante conocer lo que significan los prompts :8 y "8 ya que si en
alg7n momento nos aparece alguno de ellos todas la l*neas que escribamos a
continuaci%n ser$n consideradas como parte de la cadena inclusive cuando escribimos
Q.-4. Esto puede ser confuso especialmente si no sabemos que es necesario escribir
la comilla correspondiente para finali/ar la cadena para que podamos escribir despu!s
alg7n otro comando o terminar la consulta que deseamos ejecutar.
Creando y usando una !ase de datos
("ora que conocemos como escribir y ejecutar sentencias es tiempo de accesar a una
base de datos.
Supongamos que tenemos diversas mascotas en casa (nuestro peque+o /ool%gico) y
deseamos tener registros de los datos acerca de ellas. &odemos "acer esto al crear
tablas que guarden esta informaci%n para que posteriormente la consulta de estos
datos sea bastante f$cil y de manera muy pr$ctica. Esta secci%n muestra como crear
una base de datos crear una tabla incorporar datos en una tabla y recuperar datos de
las tablas de diversas maneras.
La base de datos "/ool%gico" ser$ muy simple (deliveradamente) pero no es dif*cil
pensar de situaciones del mundo real en la cual una base de datos similar puede ser
usada.
&rimeramente usaremos la sentencia S=2> para ver cu$les son las bases de datos
e)istentes en el servidor al que estamos conectados#
mysql> SE5W D:/:I:SES%
;----------;
< Database <
;----------;
< mysql <
< test <
;----------;
, rows in set 6=#== sec7
5
mysql>
Es probable que la lista de bases de datos que veamos sea diferente en nuestro caso
pero seguramente las bases de datos "mysql" y "test" estar$n entre ellas. En
particular la base de datos "mysql" es requerida ya que !sta tiene la informaci%n de
los privilegios de los usuarios de MySQL. La base de datos "test" es creada durante la
instalaci%n de MySQL con el prop%sito de servir como $rea de trabajo para los usuarios
que inician en el aprendi/aje de MySQL.
Se debe anotar tambi!n que es posible que no veamos todas las bases de datos si no
tenemos el privilegio S=2> 1(4(?(SES. Se recomienda revisar la secci%n del manual
de MySQL dedicada a los comandos @5(34 y 5EA2BE.
Si la base de datos "test" e)iste "ay que intentar accesar a ella#
mysql> USE test
Database chan'ed
mysql>
2bservar que .SE al igual que Q.-4 no requieren el uso del punto y coma aunque si
se usa !ste no "ay ning7n problema. El comando .SE es especial tambi!n de otra
manera# !ste debe ser usado en una s%la l*nea.
&odr*amos usar la base de datos "test" (si tenemos acceso a ella) para los ejemplos
que vienen a continuaci%n pero cualquier cosa que "agamos puede ser eliminada por
cualquier otro usuario que tenga acceso a esta base de datos. &or esta ra/%n es
recomendable que preguntemos al administrador MySQL acerca de la base de datos
que podemos usar. Supongamos que deseamos tener una base de datos llamada
"/oologico" (n%tese que no se est$ acentuando la palabra) a la cual s%lo nosotros
tengamos acceso para ello el administrador necesita ejecutar un comando como el
siguiente#
mysql> J3:N/ :"" on Koolo'ico#* /5 iNombreUsuarioBi$omputadora
-> 4DEN/4D4ED I( 0i$ontraseLa0%
en donde Mi3ombre.suario es el nombre de usuario asignado dentro del conte)to de
MySQL Mi0omputadora es el nombre o la direcci%n -& de la computadora desde la que
nos conectamos al servidor MySQL y Mi0ontrase+a es la contrase+a que se nos "a
asignado igualmente dentro del ambiente de MySQL e)clusivamente. (mbos nombre
de usuario y contrase+a no tienen nada que ver con el nombre de usuario y contrase+a
manejados por el sistema operativo (si es el caso).
Si el administrador cre% la base de datos al momento de asignar los permisos
podemos "acer uso de ella. 1e otro modo nosotros debemos crearla#
mysql> USE Koolo'ico
E3353 .=-C: UnMnown database 0Koolo'ico0
mysql>
El mensaje anterior indica que la base de datos no "a sido creada por lo tanto
necesitamos crearla.
6
mysql> $3E:/E D:/:I:SE Koolo'ico%
!uery 5N8 . row a11ected 6=#== sec7
mysql> USE Koolo'ico
Database chan'ed
mysql>
?ajo el sistema operativo .ni) los nombres de las bases de datos son sensibles al uso
de may7sculas y min7sculas (no como las palabras clave de SQL) por lo tanto
debemos de tener cuidado de escribir correctamente el nombre de la base de datos.
Esto es cierto tambi!n para los nombres de las tablas.
(l crear una base de datos no se selecciona !sta de manera aut%maticaC debemos
"acerlo de manera e)pl*cita por ello usamos el comando .SE en el ejemplo anterior.
La base de datos se crea s%lo una ve/ pero nosotros debemos seleccionarla cada ve/
que iniciamos una sesi%n con mysql. &or ello es recomendable que se indique la base
de datos sobre la que vamos a trabajar al momento de invocar al monitor de MySQL.
&or ejemplo#
shell>mysql -h casita -u blueman -p Koolo'ico
Enter password: ******
Welcome to the yS!" monitor# $ommands end with % or &'#
(our yS!" connection id is .@ to server version: +#,+#+A-nt
/ype 0help%0 or 0&h0 1or help# /ype 0&c0 to clear the bu11er
mysql>
2bservar que "/oologico" no es la contrase+a que se est$ proporcionando desde la
l*nea de comandos sino el nombre de la base de datos a la que deseamos acceder. Si
deseamos proporcionar la contrase+a en la l*nea de comandos despu!s de la opci%n "'
p" debemos de "acerlo sin dejar espacios (por ejemplo 'p"olaDEF no como 'p
"olaDEF). Sin embargo escribir nuestra contrase+a desde la l*nea de comandos no es
recomendado ya que es bastante inseguro.
Creando una ta!la
0rear la base de datos es la parte m$s f$cil pero en este momento la base de datos
est$ vac*a como lo indica el comando S=2> 4(?LES#
mysql> SE5W /:I"ES%
Empty set 6=#== sec7
La parte un tanto complicada es decidir la estructura que debe tener nuestra base de
datos# qu! tablas se necesitan y qu! columnas estar$n en cada tabla.
En principio necesitamos una tabla que contenga un registro para cada una de
nuestras mascotas. Gsta puede ser una tabla llamada mascotas y debe contener por lo
menos el nombre de cada uno de nuestros animalitos. Ha que el nombre en s* no es
muy interesante la tabla debe contener alguna otra informaci%n. &or ejemplo si m$s
de una persona en nuestra familia tiene una mascota es probable que tengamos que
guardar la informaci%n acerca de quien es el due+o de cada mascota. (s* mismo
7
tambi!n ser*a interesante contar con alguna informaci%n m$s descriptiva tal como la
especie y el se)o de cada mascota.
;H que sucede con la edad<. Esto puede ser tambi!n de inter!s pero no es una buena
idea almacenar este dato en la base de datos. La edad cambia conforme pasa el
tiempo lo cual significa que debemos de actuali/ar los registros frecuentemente. En
ve/ de esto es una mejor idea guardar un valor fijo tal como la fec"a de nacimiento.
Entonces cuando necesitemos la edad la podemos calcular como la diferencia entre la
fec"a actual y la fec"a de nacimiento. MySQL proporciona funciones para "acer
operaciones entre fec"as as* que no "ay ning7n problema.
(l almacenar la fec"a de nacimiento en lugar de la edad tenemos algunas otras
ventajas#
&odemos usar la base de datos para tareas tales como generar recordatorios para cada
cumplea+os pr%)imo de nuestras mascotas. &odemos calcular la edad en relaci%n a
otras fec"as que la fec"a actual. &or ejemplo si almacenamos la fec"a en que muri%
nuestra mascota en la base de datos es f$cil calcular que edad ten*a nuestro animalito
cuando falleci%. Es probable que estemos pensando en otro tipo de informaci%n que
ser*a igualmente 7til en la tabla "mascotas" pero para nosotros ser$ suficiente por
a"ora contar con informaci%n de nombre propietario especie nacimiento y
fallecimiento.
.saremos la sentencia 05E(4E 4(?LE para indicar como estar$n conformados los
registros de nuestras mascotas.
mysql> $3E:/E /:I"E mascotas6
-> nombre 2:3$E:36,=78 propietario 2:3$E:36,=78
-> especie 2:3$E:36,=78 seOo $E:36.78 nacimiento D:/E8
-> 1allecimento D:/E7%
!uery 5N8 = rows a11ected 6=#=, sec7
mysql>
A(50=(5 es una buena elecci%n para los campos nombre propietario y especie ya
que los valores que almacenar$n son de longitud variable. 3o es necesario que la
longitud de estas columnas sea la misma ni tampoco que sea de EI. Se puede
especificar cualquier longitud entre D y EJJ lo que se considere m$s adecuado. Si
resulta que la elecci%n de la longitud de los campos que "emos "ec"o no result%
adecuada MySQL proporciona una sentencia (L4E5 4(?LE que nos puede ayudar a
solventar este problema.
El campo se)o puede ser representado en una variedad de formas por ejemplo "m" y
"f" o tal ve/ "masculino" y "femenino" aunque resulta m$s simple la primera opci%n.
El uso del tipo de dato 1(4E para los campos nacimiento y fallecimento debe de
resultar obvio.
("ora que "emos creado la tabla la sentencia S=2> 4(?LES debe producir algo como#
mysql> SE5W /:I"ES%
;---------------------;
< /ables9in9Koolo'ico <
;---------------------;
8
< mascotas <
;---------------------;
. row in set 6=#== sec7
mysql>
&ara verificar que la tabla fu! creada como nosotros esperabamos usaremos la
sentencia 1ES05-?E#
mysql> DES$34IE mascotas%
;--------------;-------------;------;-----;---------;-------;
< Dield < /ype < Null < Ney < De1ault < EOtra <
;--------------;-------------;------;-----;---------;-------;
< nombre < varchar6,=7 < (ES < < NU"" < <
< propietario < varchar6,=7 < (ES < < NU"" < <
< especie < varchar6,=7 < (ES < < NU"" < <
< seOo < char6.7 < (ES < < NU"" < <
< nacimiento < date < (ES < < NU"" < <
< 1allecimento < date < (ES < < NU"" < <
;--------------;-------------;------;-----;---------;-------;
* rows in set 6=#=. sec7
mysql>
&odemos "acer uso de la sentencia 1ES05-?E en cualquier momento por ejempo si
olvidamos los nombres % el tipo de las columnas en la tabla.
Cargando datos en una ta!la
1espu!s de "aber creado la tabla a"ora podemos incorporar algunos datos en ella
para lo cual "aremos uso de las sentencias -3SE54 y L2(1 1(4(.
Supongamos que los registros de nuestras mascotas pueden ser descritos por los datos
mostrados en la siguiente tabla.
Nombre Propietario Especie Sexo Nacimiento Fallecimento
Kluffy (rnoldo @ato f DLLL'IE'IM
Mau Nuan @ato m DLLO'IF'DP
?uffy (rnoldo &erro f DLLL'IJ'DF
KanKan ?enito &erro m EIII'IO'EP
Baiser 1iana &erro m DLLO'IO'FD DLLP'IP'EL
0"ispa 2mar (ve f DLLO'IL'DD
>ic"o 4om$s (ve EIII'IE'IL
SQim ?enito Serpiente m EIID'IM'EL
1ebemos observar que MySQL espera recibir fec"as en el formato HHHH'MM'11 que
puede ser diferente a lo que nosotros estamos acostumbrados.
Ha que estamos iniciando con una tabla vac*a la manera m$s f$cil de poblarla es crear
un arc"ivo de te)to que contenga un registro por l*nea para cada uno de nuestros
9
animalitos para que posteriormente carguemos el contenido del arc"ivo en la tabla
7nicamente con una sentencia.
&or tanto debemos de crear un arc"ivo de te)to "mascotas.t)t" que contenga un
registro por l*nea con valores separados por tabuladores cuidando que el orden de las
columnas sea el mismo que utili/amos en la sentencia 05E(4E 4(?LE. &ara valores que
no cono/camos podemos usar valores nulos (3.LL). &ara representar estos valores en
nuestro arc"ivo debemos usar 93.
&ara cargar el contenido del arc"ivo en la tabla mascotas usaremos el siguiente
comando#
mysql> "5:D D:/: "5$:" 4ND4"E Gmascotas#tOtG 4N/5 /:I"E mascotas%
La sentencia L2(1 1(4( nos permite especificar cu$l es el separador de columnas y el
separador de registros por default el tabulador es el separador de columnas (campos)
y el salto de l*nea es el separador de registros que en este caso son suficientes para
que la sentencia L2(1 1(4( lea correctamente el arc"ivo "mascotas.t)t".
Si lo que deseamos es a+adir un registro a la ve/ entonces debemos "acer uso de la
sentencia -3SE54. En la manera m$s simple debemos proporcionar un valor para cada
columna en el orden en el cual fueron listados en la sentencia 05E(4E 4(?LE.
Supongamos que nuestra "ermana 1iana compra un nuevo "amster nombrado &elusa.
&odemos usar la sentencia -3SE54 para agregar su registro en nuestra base de datos.
mysql> 4NSE3/ 4N/5 mascotas
-> 2:"UES60>elusa080Diana080Eamster0801080,===-=+-+=08NU""7%
3otar que los valores de cadenas y fec"as deben estar encerrados entre comillas.
4ambi!n con la sentencia -3SE54 podemos insertar el valor 3.LL directamente para
representar un valor nulo un valor que no conocemos. En este caso no se usa 93 como
en el caso de la sentencia L2(1 1(4(.
1e este ejemplo debemos ser capaces de ver que es un poco m$s la tarea que se
tiene que reali/ar si inicialmente cargamos los registros con varias sentencias -3SE54
en lugar de una 7nica sentencia L2(1 1(4(.
+ecuperando in#ormacin de una ta!la
La sentencia SELE04 es usada para obtener la informaci%n guardada en una tabla. La
forma general de esta sentencia es#
SE"E$/ "a4n1ormaciPn!ueDeseamos D35 De!ue/abla WEE3E
$ondiciPn:Satis1acer
(qu* La-nformaci%nQue1eseamos es la informaci%n que queremos ver. Esta puede ser
una lista de columnas o un R para indicar "todas las columnas". 1eQue4abla indica el
nombre de la tabla de la cual vamos a obtener los datos. La cla7sula >=E5E es
opcional. Si est$ presente la 0ondici%n(Satisfacer especifica las condiciones que los
registros deben satisfacer para que puedan ser mostrados.
Seleccionando todos los datos
10
La manera m$s simple de la sentencia SELE04 es cuando se recuperan todos los datos
de una tabla#
mysql> SE"E$/ * D35 mascotas%
;--------;-------------;-----------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;-----------;------;------------;---------------;
< Dlu11y < :rnoldo < Jato < 1 < .CCC-=,-=- < NU"" <
< au < Quan < Jato < m < .CCA-=+-.@ < NU"" <
< Iu11y < :rnoldo < >erro < 1 < .CCC-=)-.+ < NU"" <
< DanDan < Ienito < >erro < m < ,===-=A-,@ < NU"" <
< Naiser < Diana < >erro < m < .CCA-=A-+. < .CC@-=@-,C <
< $hispa < 5mar < :ve < 1 < .CCA-=C-.. < NU"" <
< Wicho < /omRs < :ve < NU"" < ,===-=,-=C < NU"" <
< SMim < Ienito < Serpiente < m < ,==.-=--,C < NU"" <
< >elusa < Diana < Eamster < 1 < ,===-=+-+= < NU"" <
;--------;-------------;-----------;------;------------;---------------;
C rows in set 6=#== sec7
Esta forma del SELE04 es 7til si deseamos ver los datos completos de la tabla por
ejemplo para asegurarnos de que est$n todos los registros despu!s de la carga de un
arc"ivo.
&or ejemplo en este caso que estamos tratando al consultar los registros de la tabla
nos damos cuenta de que "ay un error en el arc"ivo de datos (mascotas.t)t)# parece
que Baiser "a nacido despu!s de que "a fallecidoS. (l revisar un poco el pedigree de
Baiser encontramos que la fec"a correcta de nacimiento es el a+o DLOL no DLLO.
=ay por lo menos un par de maneras de solucionar este problema#
Editar el arc"ivo "mascotas.t)t" para corregir el error eliminar los datos de la tabla
mascotas con la sentencia 1ELE4E y cargar los datos nuevamente con el comando
L2(1 1(4(#
mysql> DE"E/E D35 mascotas%
mysql> "5:D D:/: "5$:" 4ND4"E Gmascotas#tOtG 4N/5 /:I"E mascotas%
Sin embargo si "acemos esto debemos ingresar los datos de &elusa la mascota de
nuestra "ermana 1iana.
La segunda opci%n consiste en corregir s%lo el registro err%neo con una sentencia
.&1(4E#
mysql> U>D:/E mascotas SE/ nacimientoFG.CAC-=A-+.G WEE3E nombreFGNaiserG%
0omo se mostr% anteriormente es muy f$cil recuperar los datos de una tabla
completa. &ero t*picamente no deseamos "acer esto particularmente cuando las
tablas son demasiado grandes. En ve/ de ello estaremos m$s interesados en
responder preguntas particulares en cuyo caso debemos especificar algunas
restricciones para la informaci%n que deseamos ver.
Seleccionando registros particulares
11
&odemos seleccionar s%lo registros particulares de una tabla. &or ejemplo si deseamos
verificar el cambio que "icimos a la fec"a de nacimiento de Baiser seleccionamos s%lo
el registro de Baiser de la siguiente manera#
mysql> SE"E$/ * D35 mascotas WEE3E nombreFGNaiserG%
;--------;-------------;---------;------;------------;--------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimento <
;--------;-------------;---------;------;------------;--------------;
< Naiser < Diana < >erro < m < .CAC-=A-+. < .CC@-=@-,C <
;--------;-------------;---------;------;------------;--------------;
. row in set 6=#== sec7
La salida mostrada confirma que el a+o "a sido corregido de DLLO a DLOL.
La comparaci%n de cadenas es normalmente no sensitiva as* que podemos especificar
el nombre como "Qaiser" "B(-SE5" etc. El resultado de la consulta ser$ el mismo.
&odemos adem$s especificar condiciones sobre cualquier columna no s%lo el
"nombre". &or ejemplo si deseamos conocer qu! mascotas nacieron despu!s del EIII
tendr*amos que usar la columna "nacimiento"#
mysql> SE"E$/ * D35 mascotas WEE3E nacimiento >F G,===-.-.G%
;--------;-------------;-----------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;-----------;------;------------;---------------;
< DanDan < Ienito < >erro < m < ,===-=A-,@ < NU"" <
< Wicho < /omRs < :ve < NU"" < ,===-=,-=C < NU"" <
< SMim < Ienito < Serpiente < m < ,==.-=--,C < NU"" <
< >elusa < Diana < Eamster < 1 < ,===-=+-+= < NU"" <
;--------;-------------;-----------;------;------------;---------------;
- rows in set 6=#== sec7
&odemos tambi!n combinar condiciones por ejemplo para locali/ar a los perros
"embras#
mysql> SE"E$/ * D35 mascotas WEE3E especieFG>erroG :ND seOoFG1G%
;--------;-------------;---------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;---------;------;------------;---------------;
< Iu11y < :rnoldo < >erro < 1 < .CCC-=)-.+ < NU"" <
;--------;-------------;---------;------;------------;---------------;
. row in set 6=#== sec7
La consulta anterior usa el operador l%gico (31. =ay tambi!n un operador l%gico 25#
mysql> SE"E$/ * D35 mascotas WEE3E especie F G:veG 53 especie F GJatoG%
;--------;-------------;---------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;---------;------;------------;---------------;
< Dlu11y < :rnoldo < Jato < 1 < .CCC-=,-=- < NU"" <
< au < Quan < Jato < m < .CCA-=+-.@ < NU"" <
< $hispa < 5mar < :ve < 1 < .CCA-=C-.. < NU"" <
< Wicho < /omRs < :ve < NU"" < ,===-=,-=C < NU"" <
;--------;-------------;---------;------;------------;---------------;
12
- rows in set 6=#== sec7
El operador (31 y el operador 25 pueden ser intercambiados. Si "acemos esto es
buena idea usar par!ntesis para indicar como deben ser agrupadas las condiciones#
mysql> SE"E$/ * D35 mascotas WEE3E 6especie F GJatoG :ND seOo F GmG7
-> 53 6especie F G>erroG :ND seOo F G1G7%
;--------;-------------;---------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;---------;------;------------;---------------;
< au < Quan < Jato < m < .CCA-=+-.@ < NU"" <
< Iu11y < :rnoldo < >erro < 1 < .CCC-=)-.+ < NU"" <
;--------;-------------;---------;------;------------;---------------;
, rows in set 6=#== sec7
Seleccionando columnas particulares
Si no deseamos ver los registros completos de una tabla entonces tenemos que usar
los nombres de las columnas en las que estamos interesados separ$ndolas por coma.
&or ejemplo si deseamos conocer la fec"a de nacimiento de nuestras mascotas
debemos seleccionar la columna "nombre" y "nacimiento"#
mysql> SE"E$/ nombre8 nacimiento D35 mascotas%
;--------;------------;
< nombre < nacimiento <
;--------;------------;
< Dlu11y < .CCC-=,-=- <
< au < .CCA-=+-.@ <
< Iu11y < .CCC-=)-.+ <
< DanDan < ,===-=A-,@ <
< Naiser < .CAC-=A-+. <
< $hispa < .CCA-=C-.. <
< Wicho < ,===-=,-=C <
< SMim < ,==.-=--,C <
< >elusa < ,===-=+-+= <
;--------;------------;
C rows in set 6=#== sec7
&ara conocer qui!n tiene alguna mascota usaremos la siguiente consulta#
mysql> SE"E$/ propietario D35 mascotas%
;-------------;
< propietario <
;-------------;
< :rnoldo <
< Quan <
< :rnoldo <
< Ienito <
< Diana <
< 5mar <
< /omRs <
< Ienito <
< Diana <
;-------------;
C rows in set 6=#== sec7
13
Sin embargo debemos notar que la consulta recupera el nombre del propietario de
cada mascota y algunos de ellos aparecen m$s de una ve/. &ara minimi/ar la salida
agregaremos la palabra clave 1-S4-304#
mysql> SE"E$/ D4S/4N$/ propietario D35 mascotas%
;-------------;
< propietario <
;-------------;
< :rnoldo <
< Quan <
< Ienito <
< Diana <
< 5mar <
< /omRs <
;-------------;
* rows in set 6=#=+ sec7
Se puede usar tambi!n una cla7sula >=E5E para combinar selecci%n de filas con
selecci%n de columnas. &or ejemplo para obtener la fec"a de nacimiento de los
perritos y los gatitos usaremos la siguiente consulta#
mysql> SE"E$/ nombre8 especie8 nacimiento D35 mascotas
-> WEE3E especie F GperroG 53 especie F G'atoG%
;--------;---------;------------;
< nombre < especie < nacimiento <
;--------;---------;------------;
< Dlu11y < Jato < .CCC-=,-=- <
< au < Jato < .CCA-=+-.@ <
< Iu11y < >erro < .CCC-=)-.+ <
< DanDan < >erro < ,===-=A-,@ <
< Naiser < >erro < .CAC-=A-+. <
;--------;---------;------------;
) rows in set 6=#== sec7
,rdenando registros
Se debe notar en los ejemplos anteriores que las filas regresadas son mostradas sin
ning7n orden en particular. Sin embargo frecuentemente es m$s f$cil e)aminar la
salida de una consulta cuando las filas son ordenadas en alguna forma 7til. &ara
ordenar los resultados tenemos que usar una cl$usula 251E5 ?H.
(qu* aparecen algunos datos ordenados por fec"a de nacimiento#
mysql> SE"E$/ nombre8 nacimiento D35 mascotas 53DE3 I( nacimiento%
;--------;------------;
< nombre < nacimiento <
;--------;------------;
< Naiser < .CAC-=A-+. <
< au < .CCA-=+-.@ <
< $hispa < .CCA-=C-.. <
< Dlu11y < .CCC-=,-=- <
< Iu11y < .CCC-=)-.+ <
< Wicho < ,===-=,-=C <
< >elusa < ,===-=+-+= <
< DanDan < ,===-=A-,@ <
14
< SMim < ,==.-=--,C <
;--------;------------;
C rows in set 6=#== sec7
En las columnas de tipo caracter el ordenamiento es ejecutado normalmente de forma
no sensitiva es decir no "ay diferencia entre may7sculas y min7sculas. Sin embargo
se puede for/ar un ordenamiento sensitivo al usar el operador ?-3(5H.
&ara ordenar en orden inverso debemos agregar la palabra clave 1ES0 al nombre de
la columna que estamos usando en el ordenamiento#
mysql> SE"E$/ nombre8 nacimiento D35 mascotas 53DE3 I(
-> nacimiento DES$%
;--------;------------;
< nombre < nacimiento <
;--------;------------;
< SMim < ,==.-=--,C <
< DanDan < ,===-=A-,@ <
< >elusa < ,===-=+-+= <
< Wicho < ,===-=,-=C <
< Iu11y < .CCC-=)-.+ <
< Dlu11y < .CCC-=,-=- <
< $hispa < .CCA-=C-.. <
< au < .CCA-=+-.@ <
< Naiser < .CAC-=A-+. <
;--------;------------;
C rows in set 6=#== sec7
&odemos ordenar m7ltiples columnas. &or ejemplo para ordenar por tipo de animal y
poner al inicio los animalitos m$s peque+os de edad usaremos la siguiente consulta#
mysql> SE"E$/ nombre8 especie8 nacimiento D35 mascotas
-> 53DE3 I( especie8 nacimiento DES$%
;--------;-----------;------------;
< nombre < especie < nacimiento <
;--------;-----------;------------;
< Wicho < :ve < ,===-=,-=C <
< $hispa < :ve < .CCA-=C-.. <
< Dlu11y < Jato < .CCC-=,-=- <
< au < Jato < .CCA-=+-.@ <
< >elusa < Eamster < ,===-=+-+= <
< DanDan < >erro < ,===-=A-,@ <
< Iu11y < >erro < .CCC-=)-.+ <
< Naiser < >erro < .CAC-=A-+. <
< SMim < Serpiente < ,==.-=--,C <
;--------;-----------;------------;
C rows in set 6=#== sec7
3otar que la palabra clave 1ES0 aplica s%lo a la columna nombrada que le precede.
Clculos con #ec(as
MySQL proporciona diversas funciones que se pueden usar para efectuar c$lculos sobre
fec"as por ejemplo para calcular edades o e)traer partes de una fec"a (d*a mes a+o
etc).
15
&ara determinar la edad de cada una de nuestras mascotas tenemos que calcular la
diferencia de a+os de la fec"a actual y la fec"a de nacimiento y entonces substraer
uno si la fec"a actual ocurre antes en el calendario que la fec"a de nacimiento. Las
siguientes consultas muestran la fec"a actual la fec"a de nacimiento y la edad para
cada mascota.
mysql> SE"E$/ nombre8 nacimiento8 $U33EN/9D:/E8
-> 6(E:36$U33EN/9D:/E7 - (E:36nacimiento77
-> - 634JE/6$U33EN/9D:/E8)7 H 34JE/6nacimiento8)77 :S edad D35
mascotas%
;--------;------------;--------------;------;
< nombre < nacimiento < $U33EN/9D:/E < edad <
;--------;------------;--------------;------;
< Dlu11y < .CCC-=,-=- < ,==,-.,-,+ < + <
< au < .CCA-=+-.@ < ,==,-.,-,+ < - <
< Iu11y < .CCC-=)-.+ < ,==,-.,-,+ < + <
< DanDan < ,===-=A-,@ < ,==,-.,-,+ < , <
< Naiser < .CAC-=A-+. < ,==,-.,-,+ < .+ <
< $hispa < .CCA-=C-.. < ,==,-.,-,+ < - <
< Wicho < ,===-=,-=C < ,==,-.,-,+ < , <
< SMim < ,==.-=--,C < ,==,-.,-,+ < . <
< >elusa < ,===-=+-+= < ,==,-.,-,+ < , <
;--------;------------;--------------;------;
C rows in set 6=#=. sec7
(qu* HE(5( ) obtiene 7nicamente el a+o y 5-@=4( ) obtiene los cinco caracteres m$s a
la derec"a de cada una de las fec"as que representan el mes y el d*a (MM'11). La
parte de la e)presi%n que compara los valores MM'11 se eval7a a D o I y permite
ajustar el valor de la edad en el caso de que el valor MM'11 de la fec"a actual ocurra
antes del valor MM'11 de la fec"a de nacimiento.
1ado que la e)presi%n en s* es bastante fea se "a usado un alias (edad) que es el que
aparece como etiqueta en la columna que muestra el resultado de la consulta.
Esta consulta debe trabajar bien pero el resultado puede ser de alguna manera m$s
7til si las filas son presentadas en alg7n orden. &ara ello "aremos uso de la cl$usula
251E5 ?H.
&or ejemplo para ordenar por nombre usaremos la siguiente consulta#
mysql> SE"E$/ nombre8 nacimiento8 $U33EN/9D:/E8
-> 6(E:36$U33EN/9D:/E7 - (E:36nacimiento77
-> - 634JE/6$U33EN/9D:/E8)7 H 34JE/6nacimiento8)77
-> :S edad D35 mascotas 53DE3 I( nombre%
;--------;------------;--------------;------;
< nombre < nacimiento < $U33EN/9D:/E < edad <
;--------;------------;--------------;------;
< Iu11y < .CCC-=)-.+ < ,==,-.,-,+ < + <
< $hispa < .CCA-=C-.. < ,==,-.,-,+ < - <
< DanDan < ,===-=A-,@ < ,==,-.,-,+ < , <
< Dlu11y < .CCC-=,-=- < ,==,-.,-,+ < + <
< Naiser < .CAC-=A-+. < ,==,-.,-,+ < .+ <
< au < .CCA-=+-.@ < ,==,-.,-,+ < - <
< >elusa < ,===-=+-+= < ,==,-.,-,+ < , <
< SMim < ,==.-=--,C < ,==,-.,-,+ < . <
16
< Wicho < ,===-=,-=C < ,==,-.,-,+ < , <
;--------;------------;--------------;------;
C rows in set 6=#== sec7
&ara ordenar por edad en lugar de nombre 7nicamente tenemos que usar una cl$usula
251E5 ?H diferente#
mysql> SE"E$/ nombre8 nacimiento8 $U33EN/9D:/E8
-> 6(E:36$U33EN/9D:/E7 - (E:36nacimiento77
-> - 634JE/6$U33EN/9D:/E8)7 H 34JE/6nacimiento8)77
-> :S edad D35 mascotas 53DE3 I( edad%
;--------;------------;--------------;------;
< nombre < nacimiento < $U33EN/9D:/E < edad <
;--------;------------;--------------;------;
< SMim < ,==.-=--,C < ,==,-.,-,+ < . <
< DanDan < ,===-=A-,@ < ,==,-.,-,+ < , <
< Wicho < ,===-=,-=C < ,==,-.,-,+ < , <
< >elusa < ,===-=+-+= < ,==,-.,-,+ < , <
< Dlu11y < .CCC-=,-=- < ,==,-.,-,+ < + <
< Iu11y < .CCC-=)-.+ < ,==,-.,-,+ < + <
< au < .CCA-=+-.@ < ,==,-.,-,+ < - <
< $hispa < .CCA-=C-.. < ,==,-.,-,+ < - <
< Naiser < .CAC-=A-+. < ,==,-.,-,+ < .+ <
;--------;------------;--------------;------;
C rows in set 6=#=. sec7
.na consulta similar puede ser usada para determinar la edad que ten*a una mascota
cuando falleci%. &ara determinar que animalitos ya fallecieron la condici%n es que el
valor en el campo fallecimiento no sea nulo (3.LL). Entonces para los registros con
valor no'nulo calculamos la diferencia entre los valores fallecimiento y nacimiento.
mysql> SE"E$/ nombre8 nacimiento8 1allecimiento8
-> 6(E:361allecimiento7 - (E:36nacimiento77
-> - 634JE/61allecimiento8)7 H 34JE/6nacimiento8)77
-> :S edad D35 mascotas WEE3E 1allecimiento 4S N5/ NU""%
;--------;------------;---------------;------;
< nombre < nacimiento < 1allecimiento < edad <
;--------;------------;---------------;------;
< Naiser < .CAC-=A-+. < .CC@-=@-,C < @ <
;--------;------------;---------------;------;
. row in set 6=#=. sec7
La consulta usa fallecimiento -S 324 3.LL en ve/ de falleciimiento T 8 3.LL porque
3.LL es una valor especial. Esto ser$ e)plicando m$s a detalle posteriormente.
;Qu! sucede si deseamos conocer cu$les de nuestras mascotas cumplen a+os el
pr%)imo mes< &ara este tipo de c$lculos el a+o y el d*a son irrelevantesC simplemente
tenemos que e)traer el valor del mes en la columna nacimiento. 0omo se mencion%
anteriormente MySQL proporciona diversas funciones para trabajar y manipular
fec"as en este caso "aremos uso de la funci%n M234=( ). &ara ver como trabaja
vamos a ejecutar una consulta muy simple que muestra tanto el valor de una fec"a
como el valor que regresa la funci%n M234=( ).
mysql> SE"E$/ nombre8 nacimiento8 5N/E6nacimiento7 D35 mascotas%
;--------;------------;-------------------;
17
< nombre < nacimiento < 5N/E6nacimiento7 <
;--------;------------;-------------------;
< Dlu11y < .CCC-=,-=- < , <
< au < .CCA-=+-.@ < + <
< Iu11y < .CCC-=)-.+ < ) <
< DanDan < ,===-=A-,@ < A <
< Naiser < .CAC-=A-+. < A <
< $hispa < .CCA-=C-.. < C <
< Wicho < ,===-=,-=C < , <
< SMim < ,==.-=--,C < - <
< >elusa < ,===-=+-+= < + <
;--------;------------;-------------------;
C rows in set 6=#== sec7
Encontrar los animalitos cuyo cumplea+os es el pr%)imo mes es muy sencillo.
Suponiendo que el mes actual es (bril (valor M) entonces tenemos que buscar los
registros cuyo valor de mes sea J (Mayo).
mysql> SE"E$/ nombre8 nacimiento D35 mascotas WEE3E 5N/E6nacimiento7 F
)%
;--------;------------;
< nombre < nacimiento <
;--------;------------;
< Iu11y < .CCC-=)-.+ <
;--------;------------;
. row in set 6=#== sec7
(qu* "abr$ por supuesto una complicaci%n si el mes actual es 1iciembre. 3o podemos
simplemente agregar uno al n7mero del mes (DE) y buscar los registros cuyo mes de
nacimiento sea DF porque dic"o mes no e)iste. En ve/ de esto tenemos que buscar los
animalitos que nacieron en Enero (mes D).
Sin embargo lo mejor es que podemos escribir una consulta que funcione no
importando cu$l sea el mes actual. La funci%n 1(4EU(11( ) nos permite agregar un
intervalo de tiempo a una fec"a dada. Si agregamos un mes al valor regresado por la
funci%n 32>( ) y entonces e)traemos el valor del mes con la funci%n M234=( ) el
resultado es que siempre obtendremos el mes siguiente.
La consulta que resuelve nuestro problema queda as*#
mysql> SE"E$/ nombre8 nacimiento D35 mascotas
-> WEE3E 5N/E6nacimiento7 F 5N/E6D:/E9:DD6N5W678 4N/E32:" .
5N/E77%
-ra!ajando con valores nulos
El valor 3.LL puede sorprendermos mientras no "ayamos trabajado con !l.
0onceptualmente 3.LL significa un valor que "ace falta o un valor desconocido y es
tratado de una manera diferente a otros valores. &ara verificar si un valor es 3.LL no
podemos usar los operadores de comparaci%n tales como V 8 o T.
&ara probar esto ejecutemos la siguiente consulta#
mysql> SE"E$/ . F NU""8 . H> NU""8 . H NU""8 . > NU""%
18
;----------;-----------;----------;----------;
< . F NU"" < . H> NU"" < . H NU"" < . > NU"" <
;----------;-----------;----------;----------;
< NU"" < NU"" < NU"" < NU"" <
;----------;-----------;----------;----------;
. row in set 6=#== sec7
0laramente observamos que no obtenemos resultados con alg7n significado con estos
operadores. Es por ello que tenemos que usar los operadores -S 3.LL e -S 324 3.LL#
mysql> SE"E$/ . 4S NU""8 . 4S N5/ NU""%
;-----------;---------------;
< . 4S NU"" < . 4S N5/ NU"" <
;-----------;---------------;
< = < . <
;-----------;---------------;
. row in set 6=#== sec7
En MySQL I o 3.LL significan falso y cualquier otro valor significa verdadero. El valor
que se considera verdadero por default es D.
0uando se usa un 251E5 ?H los valores 3.LL son siempre ordenados primero a7n
cuando se use la cl$usula 1ES0.
Coincidencia de patrones
MySQL proporciona m!todos de coincidencia de patrones basados en SQL est$ndar as*
como tambi!n basados en e)presiones regulares de manera similar a las utiler*as de
.ni) tales como vi grep y sed.
La coincidencia de patrones basada en SQL nos permite usar U (gui%n bajo) para un
solo caracter y W para un arbitrario n7mero de caracteres. En MySQL los patrones SQL
no son sensibles al uso de may7sculas y min7sculas.
Es importante notar que no se usan los operadores V T o 8 cuando se usan los
patrones SQLC en su lugar se usan los operadores L-BE y 324 L-BE.
( continuaci%n se presentan algunos ejemplos.
&ara encontrar los nombres que comien/an con b#
mysql> SE"E$/ * D35 mascotas WEE3E nombre "4NE GbSG%
;--------;-------------;---------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;---------;------;------------;---------------;
< Iu11y < :rnoldo < >erro < 1 < .CCC-=)-.+ < NU"" <
;--------;-------------;---------;------;------------;---------------;
. row in set 6=#== sec7
19
&ara encontrar los nombres que finali/an con fy#
mysql> SE"E$/ * D35 mascotas WEE3E nombre "4NE GS1yG%
;--------;-------------;---------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;---------;------;------------;---------------;
< Dlu11y < :rnoldo < Jato < 1 < .CCC-=,-=- < NU"" <
< Iu11y < :rnoldo < >erro < 1 < .CCC-=)-.+ < NU"" <
;--------;-------------;---------;------;------------;---------------;
, rows in set 6=#== sec7
&ara encontrar nombres que contienen una s#
mysql> SE"E$/ * D35 mascotas WEE3E nombre "4NE GSsSG%
;--------;-------------;-----------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;-----------;------;------------;---------------;
< Naiser < Diana < >erro < m < .CAC-=A-+. < .CC@-=@-,C <
< $hispa < 5mar < :ve < 1 < .CCA-=C-.. < NU"" <
< SMim < Ienito < Serpiente < m < ,==.-=--,C < NU"" <
< >elusa < Diana < Eamster < 1 < ,===-=+-+= < NU"" <
;--------;-------------;-----------;------;------------;---------------;
- rows in set 6=#=. sec7
El otro tipo de coincidencia de patrones proporcionado por MySQL "ace uso de
e)presiones regulares. &ara "acer uso de estos tipos de patrones se tienen que usar los
operadores 5E@EX& y 324 5E@EX& ( o 5L-BE y 324 5L-BE los cu$les son sin%nimos).
(lgunas caracter*sticas de las e)presiones regulares son#
El caracter punto ".$ coincide con cualuier caracter.
Una clase de caracteres ..../ coincide con cualuier caracter dentro de los par0ntesis cuadrados. )or
ejemplo, .a!c/ coincide con a, ! o c. )ara nom!rar un rango de caracteres, se usa el guin. .a12/
coincide con cualuier letra min*scula, mientras ue .314/ coincide con cualuier digito.
El caracter asterisco "5$ coincide con cero o ms instancias de lo ue le preceda. )or ejemplo, &5
coincide con cualuier n*mero de caracteres &, .314/5 coincide con cualuier n*mero de digitos, y .5
"punto asterisco$ coincide con cualuier cosa.
El patrn coincide si 0ste ocurre en cualuier parte del valor ue est siendo evaluado. "Los patrones
SQL coinciden *nicamente en los valores completos.$
)ara indicar el inicio o el #inal de un valor ue est siendo evaluado se usan los caracteres 6 y 7
respectivamente.
&ara demostrar como se usan las e)presiones regulares se van a mostrar los ejemplos
presentados anteriormente con el operador L-BE a"ora con el operador 5E@EX&.
&ara encontrar los nombre que inician con b#
mysql> SE"E$/ * D35 mascotas WEE3E nombre 3EJET> GUbG%
;--------;-------------;---------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;---------;------;------------;---------------;
< Iu11y < :rnoldo < >erro < 1 < .CCC-=)-.+ < NU"" <
;--------;-------------;---------;------;------------;---------------;
. row in set 6=#=. sec7
20
(ntes de la versi%n F.EF.M de MySQL el operador 5E@EX& era sensible al uso de
may7sculas y min7sculas as* que dependiendo de la versi%n de MySQL con la que se
est$ trabajando puede que obtengamos o no alg7n resultado en la consulta anterior.
Se puede usar tambi!n la siguiente consulta para buscar los nombres que inician con la
letra b no importando si es may7scula o min7scula.
mysql> SE"E$/ * D35 mascotas WEE3E nombre 3EJET> GUVbIWG%
;--------;-------------;---------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;---------;------;------------;---------------;
< Iu11y < :rnoldo < >erro < 1 < .CCC-=)-.+ < NU"" <
;--------;-------------;---------;------;------------;---------------;
. row in set 6=#== sec7
1esde la versi%n F.EF.M para for/ar que el operador 5E@EX& sea sensible al uso de
may7sculas y min7sculas se tiene que usar la palabra clave ?-3(5H para "acer de una
de las cadenas una cadena binaria. 2bservar los resultados de la siguientes consultas.
mysql> SE"E$/ * D35 mascotas WEE3E nombre 3EJET> I4N:3( GUbG%
Empty set 6=#== sec7
mysql> SE"E$/ * D35 mascotas WEE3E nombre 3EJET> I4N:3( GUIG%
;--------;-------------;---------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;---------;------;------------;---------------;
< Iu11y < :rnoldo < >erro < 1 < .CCC-=)-.+ < NU"" <
;--------;-------------;---------;------;------------;---------------;
. row in set 6=#=. sec7
&ara encontrar los nombres que finali/an con la palabra fy "aremos uso del caracter Y.
mysql> SE"E$/ * D35 mascotas WEE3E nombre 3EJET> G1yXG%
;--------;-------------;---------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;---------;------;------------;---------------;
< Dlu11y < :rnoldo < Jato < 1 < .CCC-=,-=- < NU"" <
< Iu11y < :rnoldo < >erro < 1 < .CCC-=)-.+ < NU"" <
;--------;-------------;---------;------;------------;---------------;
, rows in set 6=#== sec7
&ara encontrar los nombres que contienen una letra s la consulta ser*a#
mysql> SE"E$/ * D35 mascotas WEE3E nombre 3EJET> GsG%
;--------;-------------;-----------;------;------------;---------------;
< nombre < propietario < especie < seOo < nacimiento < 1allecimiento <
;--------;-------------;-----------;------;------------;---------------;
< Naiser < Diana < >erro < m < .CAC-=A-+. < .CC@-=@-,C <
< $hispa < 5mar < :ve < 1 < .CCA-=C-.. < NU"" <
< SMim < Ienito < Serpiente < m < ,==.-=--,C < NU"" <
< >elusa < Diana < Eamster < 1 < ,===-=+-+= < NU"" <
;--------;-------------;-----------;------;------------;---------------;
- rows in set 6=#== sec7
Conteo de #ilas
21
Las bases de datos son usadas frecuentemente para responder una pregunta ";0on
qu! frecuencia ocurre un cierto tipo de dato en una tabla<". &or ejemplo tal ve/
queremos conocer cu$ntas mascotas tenemos o cu$ntas mascotas tiene cada uno de
los propietarios.
0ontar el n7mero total de animalitos que tenemos es lo mismo que "acer la siguiente
pregunta ";0u$ntas filas "ay en la tabla mascotas<" ya que "ay un registro por
mascota. La funci%n 02.34( ) es la que nos ayuda en esta situaci%n.
mysql> SE"E$/ $5UN/6*7 D35 mascotas%
;----------;
< $5UN/6*7 <
;----------;
< C <
;----------;
. row in set 6=#== sec7
Si deseamos conocer cu$ntas mascotas tiene cada uno de los propietarios la consulta
es la siguiente#
mysql> SE"E$/ propietario8 $5UN/6*7 D35 mascotas J35U> I( propietario %
;-------------;----------;
< propietario < $5UN/6*7 <
;-------------;----------;
< :rnoldo < , <
< Ienito < , <
< Diana < , <
< Quan < . <
< 5mar < . <
< /omRs < . <
;-------------;----------;
* rows in set 6=#== sec7
Se debe notar que se "a usado una cl$usula @52.& ?H para agrupar todos los registros
de cada propietario. Si no "acemos esto obtendremos un mensaje de error#
mysql> SE"E$/ propietario8 $5UN/6*7 D35 mascotas%
E3353 ..-=: iOin' o1 J35U> columns 64N678:T678$5UN/67###7 with no
J35U> columns is ille'al i1 there is no J35U> I( clause
En efecto el uso de la funci%n 02.34( ) en conjunto con la cl$usula @52.& ?H es muy
7til en diversas situaciones. ( continuaci%n se muestran algunos ejemplos.
El n7mero de animalitos por especie#
mysql> SE"E$/ especie8 $5UN/6*7 D35 mascotas J35U> I( especie %
;-----------;----------;
< especie < $5UN/6*7 <
;-----------;----------;
< :ve < , <
< Jato < , <
< Eamster < . <
< >erro < + <
< Serpiente < . <
22
;-----------;----------;
) rows in set 6=#== sec7
El n7mero de animalitos por se)o#
mysql> SE"E$/ seOo8 $5UN/6*7 D35 mascotas J35U> I( seOo:
;------;----------;
< seOo < $5UN/6*7 <
;------;----------;
< NU"" < . <
< 1 < - <
< m < - <
;------;----------;
+ rows in set 6=#=. sec7
El n7mero de animalitos por combinaci%n de especie y se)o#
mysql> SE"E$/ especie8 seOo8 $5UN/6*7 D35 mascotas J35U> I( especie8
seOo %
;-----------;------;----------;
< especie < seOo < $5UN/6*7 <
;-----------;------;----------;
< :ve < NU"" < . <
< :ve < 1 < . <
< Jato < 1 < . <
< Jato < m < . <
< Eamster < 1 < . <
< >erro < 1 < . <
< >erro < m < , <
< Serpiente < m < . <
;-----------;------;----------;
A rows in set 6=#== sec7
3o es necesario que se obtengan todos los datos de una tabla cuando se usa la funci%n
02.34( ). &or ejemplo en la consulta anterior para ver 7nicamente los datos de
perritos y gatitos la consulta queda de la siguiente manera#
mysql> SE"E$/ especie8 seOo8 $5UN/6*7 D35 mascotas
-> WEE3E especieFG>erroG 53 especieFGJatoG
-> J35U> I( especie8 seOo%
;---------;------;----------;
< especie < seOo < $5UN/6*7 <
;---------;------;----------;
< Jato < 1 < . <
< Jato < m < . <
< >erro < 1 < . <
< >erro < m < , <
;---------;------;----------;
- rows in set 6=#== sec7
2 bien si deseamos el n7mero de animalitos por se)o y cuyo se)o es conocido#
mysql> SE"E$/ especie8 seOo8 $5UN/6*7 D35 mascotas
-> WEE3E seOo 4S N5/ NU""
-> J35U> I( especie8 seOo %
23
;-----------;------;----------;
< especie < seOo < $5UN/6*7 <
;-----------;------;----------;
< :ve < 1 < . <
< Jato < 1 < . <
< Jato < m < . <
< Eamster < 1 < . <
< >erro < 1 < . <
< >erro < m < , <
< Serpiente < m < . <
;-----------;------;----------;
@ rows in set 6=#== sec7
Usando ms de una ta!la
La tabla mascotas nos "a servido "asta este momento para tener guardados los datos
acerca de los animalitos que tenemos. Si deseamos guardar alg7n otro tipo de
informaci%n acerca de ellos tal como los eventos en sus vidas 'visitas al veterinario
nacimientos de una camada etc' necesitaremos de otra tabla. ;0%mo deber$ estar
conformada esta tabla<. Lo que necesitamos es#
El nom!re de la mascota para sa!er a cul de ellas se re#iere el evento.
Una #ec(a para sa!er cuando ocurri el evento.
Una descripcin del evento.
Un campo ue indiue el tipo de evento, si deseamos categori2arlos.
1adas estas condiciones la sentencia para crear la tabla eventos queda de la siguiente
manera#
mysql> $3E:/E /:I"E eventos6nombre varchar6,=78 1echa date8
-> tipo varchar6.)78 descripcion varchar6,))77%
!uery 5N8 = rows a11ected 6=#=+ sec7
1e manera similar a la tabla mascotas es m$s f$cil cargar los datos de los registros
iniciales al crear un arc"ivo de te)to delimitado por tabuladores en el que se tenga la
siguiente informaci%n# nombre fec"a tipo descripci%n
Dlu11y ,==.-=)-.) camada - 'atitos8 + hembras8 . macho
Iu11y ,==.-=*-,+ camada ) perritos8 , hembras8 + machos
Iu11y ,==,-=*-.C camada , perritos8 . hembra8 . macho
$hispa ,===-=+-,. veterinario Una pata lastimada
DanDan ,==.-=A-,@ cumpleaLos >rimera veK que se en1ermo de la panKa
DanDan ,==,-=A-=+ veterinario Dolor de panKa
Whicho ,==.-=,-=C cumpleaLos 3emodelaciPn de casa
0argamos los datos en este arc"ivo con la siguiente sentencia#
mysql> "5:D D:/: "5$:" 4ND4"E Geventos#tOtG 4N/5 /:I"E eventos%
!uery 5N8 @ rows a11ected 6=#=, sec7
3ecords: @ Deleted: = SMipped: = Warnin's: =
4omando en cuenta lo que "emos aprendido en la ejecuci%n de consultas sobre la tabla
mascotas debemos de ser capaces de recuperar algunos datos de la tabla eventosC los
24
principios son los mismos. Sin embargo puede suceder que la tabla eventos por s*
misma sea insuficiente para darnos las respuestas que necesitamos.
Supongamos que desemos conocer la edad de cada mascota cuando tuvieron una
camada. La tabla eventos indica cuando ocurri% dic"o evento pero para calcular la
edad de la madre necesitamos sin duda su fec"a de nacimiento. 1ado que este dato
est$ almacenado en la tabla mascotas necesitamos de ambas tablas para reali/ar esta
consulta.
mysql> SE"E$/ mascotas#nombre8
-> 6/59D:(S61echa7 - /59D:(S6nacimiento77?+*) :S edad8
-> descripcion D35 mascotas8 eventos
-> WEE3E mascotas#nombreFeventos#nombre
-> :ND tipoF0camada0%
;--------;------;---------------------------------;
< nombre < edad < descripcion <
;--------;------;---------------------------------;
< Dlu11y < ,#,A < - 'atitos8 + hembras8 . macho <
< Iu11y < ,#., < ) perritos8 , hembras8 + machos <
< Iu11y < +#.= < , perritos8 . hembra8 . macho <
;--------;------;---------------------------------;
+ rows in set 6=#=) sec7
=ay diversas cosas que notar acerca de esta consulta#
La clusula 8+,M lista dos ta!las dado ue la consulta necesita in#ormacin ue se encuentra en
am!as ta!las.
Cuando se com!ina "junta$ in#ormacin de m*ltiples ta!las, es necesario especi#icar los registros de
una ta!la ue pueden coincidir con los registros en la otra ta!la. En nuestro caso, am!as columnas
tienen una columna 9nom!re9. La consulta usa la clusula :;E+E para o!tener los registros cuyo
valor en dic(a columna es el mismo en am!as ta!las.
<ado ue la columna 9nom!re9 ocurre en am!as ta!las, de!emos de especi#icar a cul de las
columnas nos re#erimos. Esto se (ace al anteponer el nom!re de la ta!la al nom!re de la columna.
Nota: La funci%n 42U1(HS( ) regresa el n7mero de d*as transcurridos desde el a+o I
"asta la fec"a dada.
3o es necesario que se tengan dos tablas diferentes para que se puedan juntar.
(lgunas veces es 7til juntar una tabla consigo misma si se desean comparar registros
de la misma tabla. &or ejemplo para encontrar las posibles parejas entre nuestras
mascotas de acuerdo a la especie la consulta ser*a la siguiente#
mysql> SE"E$/ m.#nombre8 m.#seOo8 m,#nombre8 m,#seOo8 m.#especie
-> D35 mascotas :S m.8 mascotas :S m,
-> WEE3E m.#especieFm,#especie :ND m.#seOoFG1G :ND m,#seOoFGmG%
;--------;------;--------;------;---------;
< nombre < seOo < nombre < seOo < especie <
;--------;------;--------;------;---------;
< Dlu11y < 1 < au < m < Jato <
< Iu11y < 1 < DanDan < m < >erro <
< Iu11y < 1 < Naiser < m < >erro <
;--------;------;--------;------;---------;
+ rows in set 6=#== sec7
25
En esta consulta se "a especificado un alias para el nombre de la tabla y es !ste el
que se utili/a para referirse a las columnas.
Usando mysl en modo !atc(
En todos los ejemplos mostrados anteriormente, (emos usado mysl de manera interactiva para ejecutar
algunas consultas y ver los resultados. Sin em!argo, es posi!le usar mysl en modo !atc(. )ara (acer esto
tenemos ue poner los comandos ue deseamos ejecutar dentro de un arc(ivo, y entonces decirle a mysl
ue lea los comandos de dic(o arc(ivo=
shell> mysql H archivo-batch
Si se usa mysl de esta manera, se est creando un peue>o script, y posteriormente se est ejecutando
dic(o script. ?l ejecutar las sentencias y comandos ue se encuentran en el script, es posi!le ue suceda
alg*n error. Si se desea ue se continuen ejecutando las dems sentencias, a pesar de ue (aya ocurrido un
error, se tiene ue usar la opcin 11#orce
shell> mysql --1orce H archivo-batch
:sY mismo8 es posible especi1icar los parRmetros de coneOiPn desde la
lYnea de comandos# >or eZemplo:
s(ell@ mysl 1( casita 1u !lueman 1p A arc(ivo1!atc(
;&or qu! usar un script<
(qu* "ay algunas cuantas ra/ones#
Si se ejecutan un cierto n*mero de consultas #recuentemente "cada d'a, o cada semana$, al (acer un
script nos evitamos tener ue volver a teclear cada una de las consultas.
Se pueden generar nuevas consultas ue sean similares a las e&istentes al copiar y editar estos
scripts.
?l escri!ir consultas de varias l'neas, los scripts ayudan !astante para ue no se tengan ue escri!ir
todas las l'neas nuevamente si se comete alg*n error.
Si se estn ejecutando consultas ue producen una gran cantidad de datos, es posi!le usar un
paginador para e&aminar los resultados de una mejor manera.
shell> mysql H archivo-batch < less
Se puede guardar la salida en un arc(ivo para revisarla posteriormente.
shell> mysql H archivo-batch > salida-del-script#tOt
Se pueden distri!uir los scripts a otras personas para ue puedan ejecutar tam!i0n nuestros
comandos y sentencias.
En algunas situaciones no se permite el uso interactivo de mysl. )or ejemplo cuando se ejecuta un
cron. En este caso, es indispensa!le usar el modo !atc(.
0abe mencionar que el formato de la salida es diferente (m$s conciso) cuando se
ejecuta mysql en modo batc" que cuando se usa de manera interactiva.
Aer el siguiente ejemplo.
La consulta es# SELE04 1-S4-304 especie K52M mascotas.
Si se ejecuta en modo interactivo#
mysql> SE"E$/ D4S/4N$/ especie D35 mascotas%
;-----------;
26
< especie <
;-----------;
< Jato <
< >erro <
< :ve <
< Serpiente <
;-----------;
- rows in set 6=#== sec7
Si se ejecuta en modo batc"#
shell> mysql -h casita -u blueman -p H especies-distintas#sql
Enter password: ******
especie
Jato
>erro
:ve
Serpiente
1onde el fic"ero especies'distintas.sql contiene la consulta a ejecutar. Si se desea
obtener la salida que proporciona el modo interactivo se tiene que usar la opci%n 't.
shell> mysql -t -h casita -u blueman -p H especies-distintas#sql
Enter password: ******
;-----------;
< especie <
;-----------;
< Jato <
< >erro <
< :ve <
< Serpiente <
;-----------;
27

También podría gustarte