Primeros pasos en mysql


Este capítulo le brinda una introducción de aprendizaje a MySQL, a través del
uso de mysql, el programa cliente de MySQL para
crear y utilizar una base de datos simple. mysql
(a veces denominado ?monitor de terminal? o solamente
?monitor?) es un programa interactivo que le permite
conectarse a un servidor de bases de datos MySQL, ejecutar consultas, y ver los
resultados. mysql puede usarse también en modo
por lotes: se colocan las consultas en un archivo previamente armado, y se le
dice a mysql que ejecute el contenido del
archivo. En este capítulo se tratan ambas formas de uso.


Para ver una lista de las opciones utilizadas con
mysql
, ejecútelo con la opción --help:


shell> mysql --help


Este capítulo asume que mysql está instalado
en el ordenador y que está disponible un servidor MySQL al cual conectarse. Si
no es así, consulte con su administrador MySQL. (Si
Usted
es el administrador, necesitará consultar otras secciones
de este manual).


Se describe el proceso de configurar y utilizar una base de datos. Si sólo le
interesa acceder a una base de datos existente, es posible que quiera omitir las
secciones que muestran cómo crear una base de datos y las tablas que contiene.


Dado que este capítulo es una guía de aprendizaje, muchos detalles son
necesariam200.43.119.173ente omitidos. Para información detallada sobre los
temas que se tratan, consulte las secciones relevantes del manual.






3.1. Conectarse al y
desconectarse del servidor









Para conectarse al servidor, generalmente se le porporcionará a
mysql un nombre de usuario y una
contraseña. Si el servidor se está ejecutando en un ordenador distinto a
donde está estableciendo la conexión, también se deberá especificar el
nombre de host. Consulte con su administrador para saber los parámetros de
conexión (nombre de usuario, contraseña y host) que debe emplear. Una vez
que conozca los parámetros apropiados, debería poder conectarse de este
modo:


shell> mysql -h host -u user -p

Enter password: ********

host y user
representan el nombre del ordenador donde se está ejecutando el servidor de
bases de datos MySQL y el nombre de usuario de la cuenta que se usará para
conectarse. Reemplácelos por los valores apropiados para elcaso. Los
asteriscos (********) representan la
contraseña, debe ingresarse cuando mysql
muestra Enter password:.


Si todo funciona bien, se verá una información de ingreso seguida por el
prompt mysql>:


shell> mysql -h host -u user -p

Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 25338 to server version: 5.0.9-beta-standard

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

mysql>

El prompt anuncia que mysql está listo
para procesar comandos.


Algunas instalaciones de MySQL permiten conectarse como usuario anónimo
(sin nombre) si el servidor se está ejecutando en el ordenador local. Si
esto sucede en su caso, deberia poder conectarse al servidor ejecutando
mysql sin ningún parámetro:


shell> mysql


Después de haberse conectado, puede desconectarse en cualquier momento
escribiendo QUIT (o \q)
en el prompt mysql>:


mysql> QUIT

Bye

En Unix, también puede desconectarse presionando Control-D.


La mayoría de los ejemplos en las secciones siguientes asumen que ya se
ha conectado al servidor. Por eso muestran el prompt
mysql>
.






3.2. Entrar consultas








Cerciórese de haberse conectado al servidor, tal como se describe en la
sección anterior. Esto en sí mismo no selecciona ninguna base de datos para
trabajar. En este punto es más importante aprender un poco más acerca de
cómo realizar consultas que ir directamente a crear tablas, cargar datos, y
recuperarlos. Esta sección describe los principios básicos del ingreso de
comandos, empleando varias consultas que puede realizar para familiarizarse
con la forma en que funciona mysql.


Aquí tiene un comando simple que ordena al servidor que muestre su número
de versión y la fecha actual. Ingréselo a continuación del prompt
mysql> y presione Enter:


mysql> SELECT VERSION(), CURRENT_DATE;

+----------------+--------------+
| VERSION() | CURRENT_DATE |
+----------------+--------------+
| 5.0.7-beta-Max | 2005-07-11 |
+----------------+--------------+
1 row in set (0.01 sec)
mysql>

Esta consulta le muestra varias cosas acerca de
mysql
:




  • Un comando normalmente consiste en una sentencia SQL seguida de
    punto y coma. (Hay excepciones donde el punto y coma puede omitirse.
    QUIT, mencionado anteriormente, es una
    de ellas. Luego conocerá otras.)
  • Cuando ingresa un comando, mysql
    lo envía al servidor para ser ejecutado e imprime los resultados. A
    continuación muestra de nuevo el prompt mysql>
    para informarle que está listo para otro comando.
  • mysql imprime los resultados de
    la consulta en forma tabulada (filas y columnas). La primera fila
    contiene etiquetas para las columnas. Las filas siguientes son los
    resultados de la consulta. Generalmente, el nombre de cada columna
    es el nombre del campo que trae desde la base de datos. Si está
    trayendo el valor de una expresión, en lugar del contenido de un
    campo o columna de una tabla (como en el ejemplo anterior),
    mysql etiqueta la columna usando el
    texto de la expresión.
  • mysql informa cuántas filas
    fueron devueltas y cuánto tiempo le tomó ejecutarse a la consulta,
    lo cual da una idea aproximada del rendimiento del servidor. Estos
    valores son imprecisos porque representan tiempo de reloj corriente
    (no tiempo de CPU), y además porque están afectados por factores
    como la carga del servidor o la latencia de red. (Para simplificar
    los ejemplos de este capitulo, a partir de ahora no se mostrará la
    línea ?rows in set?.)


Las palabras clave pueden ingresarse en cualquier combinación de
minúsculas y mayúsculas. Las siguientes consultas son equivalentes:


mysql> SELECT VERSION(), CURRENT_DATE;

mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

Aqui tiene otra consulta que demuestra que mysql
puede usarse como calculadora:


mysql> SELECT SIN(PI()/4), (4+1)*5;

+------------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 | 25 |
+------------------+---------+
1 row in set (0.02 sec)

Las consultas mostradas hasta ahora han sido relativamente cortas,
sentencias de una sola línea. Se puede inclusive ingresar múltiples
sentencias en una misma línea. Solamente deben separarse con punto y coma:


mysql> SELECT VERSION(); SELECT NOW();

+----------------+
| VERSION() |
+----------------+
| 5.0.7-beta-Max |
+----------------+
1 row in set (0.00 sec)

+---------------------+
| NOW() |
+---------------------+
| 2005-07-11 17:59:36 |
+---------------------+
1 row in set (0.00 sec)

No es necesario que un comando sea ingresado en una sola línea, de ese
modo, comandos extensos que requieren varias lineas no son un problema.
mysql determina cuando una sentencia ha
llegado a l final observando si termina en un punto y coma, no si se llegó
al final de la línea física. (En otras palabras,
mysql
acepta un formato libre para las entradas: recolecta lineas
pero no las ejecuta hasta que encuentra el punto y coma.)


Aqui tiene una sentencia de múltiples líneas:


mysql> SELECT

-> USER()
-> ,
-> CURRENT_DATE;
+---------------+--------------+
| USER() | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2005-07-11 |
+---------------+--------------+
1 row in set (0.00 sec)

Observe en este ejemplo que el prompt cambia de
mysql>
a -> después que se ha ingresado
la primera línea de una consulta de múltiples líneas. Esta es la forma en
que mysql advierte que no se ha completado
la sentencia y aún espera por el resto. El prompt es un aliado, puesto que
suministra información valiosa. Si se emplea, siempre se sabrá lo que
mysql está esperando.


Si durante el ingreso de un comando decide que no quiere ejecutarlo,
cancélelo tipeando \c:


mysql> SELECT

-> USER()
-> \c
mysql>

Una vez más observe el prompt. Cambia a mysql>
después de que ingresa \c, informándole que
mysql está listo para un nuevo comando.


La siguiente tabla muestra cada uno de los indicadores que podrá ver y
sintetiza lo que dicen acerca del estado en que se encuentra
mysql:




Prompt Significado
mysql> Listo para un nuevo comando.
    -> Esperando la siguiente línea en un comando de múltiples
líneas.
    '> Esperando la siguiente línea, se encuentra abierta una
cadena que comienza con apostrofo (''').
    "> Esperando la siguiente línea, se encuentra abierta una
cadena que comienza con comillas dobles ('"').
    `> Esperando la siguiente línea, se encuentra abierta una
cadena que comienza con tilde ('`').
   /*> Esperando la siguiente línea, se encuentra abierto un
comentario que comienza con /*.


El prompt /*> fue introducido en la serie
5.0 a partir de MySQL 5.0.6.


Es frecuente que se origine una sentencia de múltiples lineas cuando
accidentalmente le da entrada a un comando de una sola línea pero olvida
terminarlo con punto y coma. En ese caso, mysql
aguarda por más caracteres:


mysql> SELECT USER()

->

Si esto le ocurre (considera que ha ingresado una sentencia completa pero
solamente obtiene un prompt ->), la mayoría de
las veces es porque mysql está esperando
por el punto y coma. Si no advierte lo que el indicador trata de decirle,
podría demorar un buen tiempo en hacer lo que necesita. Ingrese un punto y
coma para completar la sentencia, y mysql
la ejecutará:


mysql> SELECT USER()

-> ;
+--------------------+
| USER() |
+--------------------+
| joesmith@localhost |
+--------------------+

Los prompts '> y ">
aparecen durante el ingreso de cadenas. Puede escribir cadenas delimitadas
por ''' o '"' (por
ejemplo, 'hola' o "adios"),
y mysql le permite ingresar cadenas
divididas en múltiples líneas. Cuando ve un prompt '>
o "> significa que ha comenzado a ingresar una
cadena comenzando con ''' o '"'
pero no ha ingresado el correspondiente caracter de terminación. A menudo
esto significa que inadvertidamente omitió este carácter. Por ejemplo:


mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;

'>

Si ingresa esta sentencia SELECT, presiona
ENTER y espera por el resultado, nada ocurrirá. En lugar de asombrarse por
el tiempo que consume la consulta, note lo que el prompt
'> le está diciendo. Indica que
mysql espera por el final de una cadena
inconclusa. (¿Ve el error en la sentencia? La cadena
'Smith
no tiene el apóstrofo de cierre.)


¿Qué hacer llegado a este punto? Lo más simple es cancelar el comando. No
obstante, no puede simplemente tipear \c en
este caso, ¡porque mysql interpretará que
es parte de la cadena que está ingresando!. En lugar de eso, tipee el
caracter de cierre que falta y entonces ingrese \c.>:


mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;

'> '\c
mysql>

El prompt cambia de nuevo a mysql>,
informando que mysql está listo para un
nuevo comando.


El prompt `> es similar a
'> y "> , pero
informa que está pendiente de completar un identificador delimitado por
tildes.


Es importante conocer el significado de estos indicadores, ya que si por
error se ingresa una cadena incompleta, todo lo que se ingrese
posteriormente será aparentemente ignorado por mysql
? incluyendo el comando QUIT. Esto puede ser
sumamente desconcertante, en particular si no se conoce lo que debe hacer
para terminar la línea y cancelar el comando.






3.3. Crear y utilizar una
base de datos









Una vez que se sabe la forma de ingresar comandos, es el momento de
acceder a una base de datos.


Suponga que en su hogar posee varias mascotas y desea registrar distintos
tipos de información sobre ellas. Puede hacerlo si crea tablas para
almacenar sus datos e introduce en ellas la información deseada. Entonces,
podrá responder una variedad de preguntas acerca de sus mascotas recuperando
datos desde las tablas. Esta sección le muestra como:




  • Crear una base de datos
  • Crear una tabla
  • Introducir datos en la tabla
  • Recuperar datos desde la tabla de varias maneras
  • Emplear múltiples tablas


La base de datos menagerie (en inglés significa "colección de animales")
se ha hecho deliberadamente simple, pero no es difícil imaginar situaciones
del mundo real donde podría usarse un tipo similar de base de datos. Por
ejemplo, para un granjero que desee hacer el seguimiento de su hacienda, o
para los registros de los pacientes de un veterinario. En el sitio web de
MySQL pueden descargarse archivos de texto con datos de ejemplo y algunas de
las sentencias empleadas en las siguientes secciones. Se encuentran
disponibles en formato tar (http://www.mysql.com/Downloads/Contrib/Examples/menagerie.tar.gz)
y Zip (http://www.mysql.com/Downloads/Contrib/Examples/menagerie.zip).


Mediante la sentencia SHOW se encuentran las
bases de datos que existen actualmente en el servidor:


mysql> SHOW DATABASES;

+----------+
| Database |
+----------+
| mysql |
| test |
| tmp |
+----------+

Probablemente la lista obtenida sea distinta en su ordenador, pero es
casi seguro que tendrá las bases de datos mysql
y test. La base de datos
mysql
es necesaria porque es la que describe los privilegios de
acceso de los usuarios. La base de datos test
se provee para que los usuarios hagan pruebas.


Tenga en cuenta que si no tiene el privilegio SHOW
DATABASES
, no podrá ver todas las bases de datos que hay en el
servidor. Consulte

Sección 13.5.1.3, ?Sintaxis de GRANT y
REVOKE?
.


Si la base de datos test existe, intente
acceder a ella:


mysql> USE test

Database changed

Advierta que, al igual que QUIT,
USE no necesita que ponga un punto y coma al
final (aunque puede hacerlo si lo desea). La sentencia
USE
tiene otra particularidad: debe escribirse en una sola linea.


Puede colocar los ejemplos siguientes en la base de datos
test, si tiene acceso a ella, pero si trabaja
en un ambiente compartido, lo que deposite allí puede ser fácilmente borrado
por alguien más que tenga el acceso. Por este motivo, debería pedirle a su
administrador permiso para usar una base de datos propia. Suponga que quiere
llamarla menagerie. El administrador necesitará
ejecutar un comando como este:


mysql> GRANT ALL ON menagerie.* TO 'su_nombre_mysql'@'su_host_cliente';


Donde su_nombre_mysql es el nombre de
usuario que se le asignó, y su_host_cliente es
el host u ordenador desde donde se conectará.






3.3.1. Crear y seleccionar una base de
datos







Si el administrador crea su base de datos en el mismo momento que le
otorga privilegios, puede comenzar a utilizarla, de lo contrario
necesitará crearla:


mysql> CREATE DATABASE menagerie;


En ambientes Unix, los nombres de las bases de datos son case
sensitive (al contrario que las palabras clave), de modo que siempre
debe referirse a su base de datos como menagerie,
y no Menagerie,
MENAGERIE
, o una variante similar. Esto también se aplica a los
nombres de tablas. Esta restricción no existe en Windows, aunque puede
utilizar el mismo esquema de mayúsculas cuando se refiera a bases de
datos y tablas en una consulta dada.


Al crear una base de datos, ésta no se selecciona para su uso, debe
hacerlo explicitamente. Para convertir a menagerie
en la base de datos actual, use este comando:


mysql> USE menagerie

Database changed

Las bases de datos sólo necesitan ser creadas una sola vez, pero
deben ser seleccionadas cada vez que se inicia una sesión de
mysql. Puede hacerse a través del
comando USE como se muestra en el ejemplo,
o puede indicar la base de datos en la linea de comandos al ejecutar
mysql. Simplemente debe indicar el
nombre de la base de datos a continuación de los parámetros que necesite
ingresar. Por ejemplo:


shell> mysql -h host -u user -p menagerie

Enter password: ********

Advierta en el comando anterior que menagerie
no es la contraseña. Si se
quisiera suministrar la contraseña en la linea de comandos, después de
la opción -p, debe hacerse sin dejar
espacios en blanco (por ejemplo, -pmypassword,
no -p mypassword). De todos modos, colocar
la contraseña en la linea de comandos no es recomendable porque lo
expone a la vista de otros usuarios.






3.3.2. Crear una tabla







La creación de la base de datos ha sido una tarea sencilla, pero
hasta ahora permanece vacía, como le muestra SHOW
TABLES
:


mysql> SHOW TABLES;

Empty set (0.00 sec)

La parte difícil es decidir cómo debería ser la estructura de su base
de datos: qué tablas necesitará, y qué columnas habrá en cada tabla.


Querrá una tabla para contener un registro por cada mascota. Esta
tabla puede llamarse pet, y debería
contener, como mínimo, el nombre de cada animal. Dado que el nombre no
es muy relevante por sí mismo, tendría que tener más información. Por
ejemplo, si más de una persona en su familia tendrá mascotas, querrá
listar también el dueño de cada animal. Y algunos otros datos
descriptivos básicos, como especie y sexo.


¿Qué hacer con la edad? Podría ser de interés, pero no es un buen
dato para almacenar en una base de datos. La edad cambia a medida que
pasa el tiempo, lo cual significa que debería actualizar la base de
datos a menudo. En lugar de esto, es mejor almacenar un valor fijo, como
la fecha de nacimiento. De este modo, cada vez que requiera saber la
edad, podrá calcularla como la diferencia entre la fecha de nacimiento y
la fecha actual. MySQL provee funciones para realizar cálculos con
fechas, por lo que no es dificultoso. Almacenar la fecha de nacimiento
en lugar de la edad tiene otras ventajas:




  • Puede usar la base de datos para tareas como generar
    recordatorios para los próximos cumpleaños de mascotas. (Si
    piensa que este tipo de consultas no es importante, considere
    que es lo mismo que haría en un contexto de base de datos de
    negocios para identificar aquellos clientes a los que habrá que
    enviar una tarjeta por su cumpleaños, para conseguir ese toque
    personal con la asistencia del ordenador).
  • Puede calcular edades en relación a otras fechas además de
    la actual. Por ejemplo, almacenar la fecha de muerte de una
    mascota le posibilita calcular la edad que tenía a ese momento.



Probablemente pensará en otros tipos de información que resultarían
útiles dentro de la tabla pet pero los
identificados hasta ahora son suficientes: name (nombre), owner
(propietario), species (especie), sex (sexo), birth (nacimiento) y death
(muerte).


Debe usar la sentencia CREATE TABLE para
especificar la estructura de una tabla:


mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),

-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

El tipo de dato VARCHAR es una buena
elección para las columnas name,
owner, y species
porque los datos que allí se almacenan no son de longitud uniforme. En
realidad no es necesario que todas estas columnas tengan la misma
longitud ni que ésta sea 20. En MySQL 5.0.3
y versiones posteriores, normalmente se puede adoptar cualquier longitud
entre 1 y 65535,
según lo que se crea más razonable. (Nota:
Anteriormente a MySQL 5.0.3, el límite de longitud era 255.) Si en el
futuro debiera aumentar la longitud de estos campos, MySQL tiene la
sentencia ALTER TABLE.


Hay varios tipos de datos que podrían usarse para representar el sexo
en los registros de animales, tal como 'm'
y 'f', o 'male'
(masculino) y 'female' (femenino). Lo más
simple es usar los caracteres 'm' y
'f'.


Es obvio el uso del tipo de dato DATE
para las columnas birth y
death.


Luego de crear una tabla, SHOW TABLES
debería producir una salida:


mysql> SHOW TABLES;

+---------------------+
| Tables in menagerie |
+---------------------+
| pet |
+---------------------+

Para verificar que la tabla ha sido creada en la forma esperada,
utilice la sentencia DESCRIBE:


mysql> DESCRIBE pet;

+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| species | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+

DESCRIBE puede ser utilizada en
cualquier momento, por ejemplo, si olvida los nombres o el tipo de dato
de las columnas de la tabla.






3.3.3. Cargar datos en una tabla








Luego de crear la tabla, necesitará completarla con datos. Para esto,
le serán de utilidad las sentencias LOAD DATA
e INSERT.


Suponga que los registros de mascotas fueran como los mostrados a
continuación. (Observe que MySQL espera que las fechas tengan el formato
'AAAA-MM-DD', esto puede ser diferente a lo
que acostumbra utilizar).



name owner species sex birth death
Fluffy Harold cat f 1993-02-04  
Claws Gwen cat m 1994-03-17  
Buffy Harold dog f 1989-05-13  
Fang Benny dog m 1990-08-27  
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11  
Whistler Gwen bird   1997-12-09  
Slim Benny snake m 1996-04-29  


Dado que está comenzando con una tabla vacía, una forma fácil de
completarla es creando un fichero de texto que contenga una línea por
cada animal, y luego insertando el contenido del fichero en la tabla
mediante una sola sentencia.


Para esto, debería crear un fichero de texto llamado
pet.txt, conteniendo un registro por
linea, con cada valor separado por un carácter de tabulación, y
dispuestos en el orden en el cual se especificaron las columnas en la
sentencia CREATE TABLE. Para valores
ausentes (como sexo desconocido o fechas de muerte de animales con
vida), puede usar valores NULL. Para
representar estos valores en el archivo de texto, utilice
\N (barra diagonal y N mayúscula). Por
ejemplo, el registro de Whistler se vería del modo siguiente (el espacio
en blanco entre cada valor es un solo carácter de tabulación):



name owner species sex birth death
Whistler Gwen bird \N 1997-12-09 \N


Para cargar el fichero pet.txt dentro
de la tabla pet, utilice este comando:


mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;


Si trabaja en Windows, con un editor que emplea
\r\n
(retorno de carro + nueva linea) como caracteres de fin de
línea, debería usar:


mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet

-> LINES TERMINATED BY '\r\n';

(En un ordenador Apple bajo OS X, probablemente quiera utilizar
LINES TERMINATED BY '\r'.)


Opcionalmente puede especificar en la sentencia
LOAD DATA
los caracteres que actuarán como separador de campo y
fin de línea, pero los valores por defecto son tabulación y nueva línea.
Estos son suficientes para que la sentencia lea correctamente el fichero
pet.txt


Si ocurre un error al ejecutar la sentencia, probablemente se deba a
que su instalación de MySQL no tiene habilitada por defecto la capacidad
de manejar archivos locales. Consulte

Sección 5.5.4, ?Cuestiones relacionadas con la seguridad y
LOAD DATA LOCAL?
para obtener
información sobre cómo cambiar esto.


Cuando lo que desea es agregar nuevos registros de a uno por vez, la
sentencia INSERT resulta de utilidad. De
esta sencilla manera, se suministran valores para cada columna,
dispuestos en el orden en el cual se especificaron las columnas en la
sentencia CREATE TABLE statement. Suponga
que Diane obtiene un nuevo hamster llamado "Puffball". Se podría agregar
un nuevo registro, usando la sentencia INSERT
de este modo:


mysql> INSERT INTO pet

-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);

Observe que las cadenas alfanuméricas y las fechas son representados
como cadenas delimitadas por apóstrofos. También, con
INSERT, se pueden insertar valores
NULL directamente, para indicar un valor
ausente. No se debe utilizar \N como se
hace con LOAD DATA.


A partir de este ejemplo queda demostrado que lleva mucho más trabajo
realizar una carga inicial de registros empleando varias sentencias
INSERT que si se hace mediante la sentencia
LOAD DATA.






3.3.4. Extraer información de una tabla










La sentencia SELECT es utilizada para
traer información desde una tabla. La sintaxis general de esta sentencia
es:


SELECT seleccionar_Esto

FROM desde_tabla
WHERE condiciones;

seleccionar_esto es lo que
se quiere ver. Puede ser una lista de columnas, o
*
para indicar ?todas las columnas.?
desde_tablaindica la tabla
donde están los datos a recuperar. La cláusula
WHERE
clause is optional. es opcional. Si está presente,
condiciones representa las
condiciones que cada registro debe cumplir para retornar como resultado.






3.3.4.1. Seleccionar todos los datos





La forma más simple de SELECT
recupera todo lo que hay en la tabla:


mysql> SELECT * FROM pet;

+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+--------+---------+------+------------+------------+

Esta forma de SELECT es útil si se
quiere revisar la tabla completa, por ejemplo, despues de haberla
cargado con un conjunto de datos inicial. Por ejemplo, puede ocurrir
que la fecha de nacimiento de Bowser no parezca correcta.
Consultando los papeles de pedigri, se descubre que el año correcto
de nacimiento es 1989, no 1979.


Existen al menos dos formas de solucionarlo:




  • Editando el fichero pet.txt
    para corregir el error, vaciando la tabla y volviendola a
    llenar con los datos. Para esto se usan las sentencias
    DELETE y
    LOAD DATA
    :
    mysql> DELETE FROM pet;
    
    mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;

    No obstante, si opta por esto, deberá volver a cargar el
    registro de Puffball.


  • Corrigiendo únicamente el registro erróneo. Para esto se
    usa la sentencia UPDATE:
    mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
    

    UPDATE modifica solo el
    registro en cuestión y no requiere que se vuelva a llenar la
    tabla.









3.3.4.2. Seleccionar registros
específicos







Como se ha visto en la sección anterior, es fácil recuperar una
tabla en su totalidad. Sólo debe omitir la cláusula
WHERE en la sentencia
SELECT. Pero, generalmente, no se desea
ver la tabla completa, especialmente cuando alcanza un gran tamaño.
En cambio, usualmente, se tiene interés en obtener una respuesta
para una consulta en particular, en cuyo caso se especifican algunas
restricciones para la información que se traerá. A continuación se
verán algunas consultas que responden preguntas acerca de las
mascotas.


Se pueden seleccionar sólo algunos registros de la tabla. Por
ejemplo, si quisiera verificar los cambios realizados sobre la fecha
de nacimiento de Bowser, seleccione el registro de Bowser de esta
manera:


mysql> SELECT * FROM pet WHERE name = 'Bowser';

+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+

La salida confirma que el año fue correctamente registrado como
1989, ya no es 1979.


Normalmente, las comparaciones de cadenas no son case sensitive,
por eso puede escribir el nombre como 'bowser',
'BOWSER', etc. El resultado de la
consulta será el mismo.


Se pueden indicar condiciones a cumplir por cualquier columna, no
solamente por name. Por ejemplo, si
quisiera saber qué animales han nacido luego de 1998, necesita
evaluar la columnabirth:


mysql> SELECT * FROM pet WHERE birth > '1998-1-1';

+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+

Se pueden combinar condiciones, por ejemplo para localizar perros
hembra:


mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';

+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

La consulta anterior emplea el operador lógico
AND. También existe el operador
OR:


mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';

+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+-------+---------+------+------------+-------+

AND and OR
pueden ser combinadas, si bien AND
tiene mayor precedencia que OR. Si
utiliza ambos operadores, es buena idea emplear paréntesis para
indicar explicitamente la forma en que las condiciones deben
agruparse:


mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')

-> OR (species = 'dog' AND sex = 'f');
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+






3.3.4.3. Seleccionar columnas
concretas







Si no se quieren ver filas completas, solo hace falta indicar las
columnas en las que se está interesado, separadas por comas. Por
ejemplo, si desea saber cuándo nació cada animal, seleccione las
columnas name y
birth
:


mysql> SELECT name, birth FROM pet;

+----------+------------+
| name | birth |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+

Para saber quien posee mascotas, utilice esta consulta:


mysql> SELECT owner FROM pet;

+--------+
| owner |
+--------+
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Gwen |
| Benny |
| Diane |
+--------+


Observe que esta sentencia retorna el campo
owner
de cada registro, y algunos de ellos aparecen más de
una vez. Para reducir la salida, recupere solamente una vez cada
registro repetido, agregando la palabra clave
DISTINCT
:


mysql> SELECT DISTINCT owner FROM pet;

+--------+
| owner |
+--------+
| Benny |
| Diane |
| Gwen |
| Harold |
+--------+

Puede emplearse una clásula WHERE
para combinar la selección de ciertas filas y de ciertas columnas.
Por ejemplo, para obtener únicamente la fecha de nacimiento de
perros y gatos, ejecute esta consulta:


mysql> SELECT name, species, birth FROM pet

-> WHERE species = 'dog' OR species = 'cat';
+--------+---------+------------+
| name | species | birth |
+--------+---------+------------+
| Fluffy | cat | 1993-02-04 |
| Claws | cat | 1994-03-17 |
| Buffy | dog | 1989-05-13 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
+--------+---------+------------+






3.3.4.4. Ordenar registros










Quizá advirtió, en los ejemplos anteriores, que las filas
resultantes se mostraron sin ningún orden en particular. A menudo es
más fácil examinar la salida de una consulta cuando las filas se
ordenan de algún modo significativo. Para ordenar un resultado, se
usa la clásula ORDER BY.


Aqui tiene las fechas de cumpleaños de los animales, ordenadas
por fecha:


mysql> SELECT name, birth FROM pet ORDER BY birth;

+----------+------------+
| name | birth |
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+

Por lo general, cuando se trata de columnas de tipo carácter, la
ordenación, ? al igual que otras operaciones de comparación ? no es
case-sensitive. Significa que el orden permanece indefinido para las
columnas que son idénticas excepto por sus mayúsculas y minúsculas.
Puede no obstante forzar a que una columna se ordene en forma
sensible a mayúsculas empleando el modificador
BINARY
: ORDER BY BINARY columna.


El sentido de ordenación, por defecto, es ascendente, con los
valores más pequeños primero. Para ordenar en sentido inverso
(descendente), agregue la palabra clave DESC
luego del nombre de la columna por la que ordena:


mysql> SELECT name, birth FROM pet ORDER BY birth DESC;

+----------+------------+
| name | birth |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+

Puede ordenar basándose en varias columnas, y cada columna en un
sentido diferente. Por ejemplo, para ordenar por tipo de animal en
sentido ascendente y, dentro de cada tipo, ordenar por nacimiento en
sentido descendente (los animales más jóvenes primero) utilice la
siguiente consulta:


mysql> SELECT name, species, birth FROM pet

-> ORDER BY species, birth DESC;
+----------+---------+------------+
| name | species | birth |
+----------+---------+------------+
| Chirpy | bird | 1998-09-11 |
| Whistler | bird | 1997-12-09 |
| Claws | cat | 1994-03-17 |
| Fluffy | cat | 1993-02-04 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
| Buffy | dog | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim | snake | 1996-04-29 |
+----------+---------+------------+

Advierta que la palabra clave DESC
se aplica sobre la columna inmediatamente anterior (birth);
no afecta el sentido de ordenación de la columna
species.






3.3.4.5. Cálculos sobre fechas









MySQL provee varias funciones que se aplican a cálculos entre
fechas, por ejemplo, para calcular edades u obtener partes de una
fecha.


Para determinar cuántos años de edad tiene cada mascota, hay que
calcular la diferencia entre el año de la fecha actual y el de la
fecha de nacimiento, y luego restar 1 al resultado si el dia y mes
actuales son anteriores al día y mes indicados por la fecha de
nacimiento. La siguiente consulta devuelve, para cada mascota, el
nombre, la fecha de nacimiento, la fecha actual, y la edad en años.


mysql> SELECT name, birth, CURDATE(),

-> (YEAR(CURDATE())-YEAR(birth))
-> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
-> AS age
-> FROM pet;
+----------+------------+------------+------+
| name | birth | CURDATE() | age |
+----------+------------+------------+------+
| Fluffy | 1993-02-04 | 2003-08-19 | 10 |
| Claws | 1994-03-17 | 2003-08-19 | 9 |
| Buffy | 1989-05-13 | 2003-08-19 | 14 |
| Fang | 1990-08-27 | 2003-08-19 | 12 |
| Bowser | 1989-08-31 | 2003-08-19 | 13 |
| Chirpy | 1998-09-11 | 2003-08-19 | 4 |
| Whistler | 1997-12-09 | 2003-08-19 | 5 |
| Slim | 1996-04-29 | 2003-08-19 | 7 |
| Puffball | 1999-03-30 | 2003-08-19 | 4 |
+----------+------------+------------+------+

En el ejemplo anterior, YEAR() trae
la parte correspondiente al año de una fecha, y
RIGHT() trae los 5 primeros caracteres
contando desde la derecha, que representan la parte
MM-DD de la fecha. La porción de la
expresión que compara los valores MM-DD
devuelve 1 o 0, lo cual se corresponde con la diferencia de 1 año a
restar de la edad si el dia de la fecha devuelto por
CURDATE() ocurre antes que la fecha de
nacimiento birth. La expresión completa
es un tanto confusa para usar como encabezado, por lo que se emplea
un alias (age)
para que el encabezado sea más comprensible.


La consulta funciona bien, pero los resultados podrían revisarse
más fácilmente si las filas se presentaran en algún orden. Esto
puede hacerse agregando la cláusula ORDER BY
name
para ordenar por nombre la salida:


mysql> SELECT name, birth, CURDATE(),

-> (YEAR(CURDATE())-YEAR(birth))
-> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
-> AS age
-> FROM pet ORDER BY name;
+----------+------------+------------+------+
| name | birth | CURDATE() | age |
+----------+------------+------------+------+
| Bowser | 1989-08-31 | 2003-08-19 | 13 |
| Buffy | 1989-05-13 | 2003-08-19 | 14 |
| Chirpy | 1998-09-11 | 2003-08-19 | 4 |
| Claws | 1994-03-17 | 2003-08-19 | 9 |
| Fang | 1990-08-27 | 2003-08-19 | 12 |
| Fluffy | 1993-02-04 | 2003-08-19 | 10 |
| Puffball | 1999-03-30 | 2003-08-19 | 4 |
| Slim | 1996-04-29 | 2003-08-19 | 7 |
| Whistler | 1997-12-09 | 2003-08-19 | 5 |
+----------+------------+------------+------+

Para ordenar la salida por edad (age)
en lugar de por nombre (name), solo hay
que utilizar una cláusula ORDER BY
diferente:


mysql> SELECT name, birth, CURDATE(),

-> (YEAR(CURDATE())-YEAR(birth))
-> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
-> AS age
-> FROM pet ORDER BY age;
+----------+------------+------------+------+
| name | birth | CURDATE() | age |
+----------+------------+------------+------+
| Chirpy | 1998-09-11 | 2003-08-19 | 4 |
| Puffball | 1999-03-30 | 2003-08-19 | 4 |
| Whistler | 1997-12-09 | 2003-08-19 | 5 |
| Slim | 1996-04-29 | 2003-08-19 | 7 |
| Claws | 1994-03-17 | 2003-08-19 | 9 |
| Fluffy | 1993-02-04 | 2003-08-19 | 10 |
| Fang | 1990-08-27 | 2003-08-19 | 12 |
| Bowser | 1989-08-31 | 2003-08-19 | 13 |
| Buffy | 1989-05-13 | 2003-08-19 | 14 |
+----------+------------+------------+------+

Una consulta similar se utiliza para determinar la edad a la
fecha de muerte de los animales. Se determinan los animales que han
muerto verificando si el valor de la columna
death
es NULL. Entonces, para
todos los valores no NULL calcula la
diferencia entre las fechas de muerte (death)
y nacimiento (birth):


mysql> SELECT name, birth, death,

-> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))
-> AS age
-> FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name | birth | death | age |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5 |
+--------+------------+------------+------+

La consulta utiliza la expresión death IS
NOT NULL
en lugar de death <> NULL
porque NULL es un valor especial, que
no puede ser comparado mediante los operadores lógicos habituales.
Este tema se trata más extensamente más adelante. Consultar

Sección 3.3.4.6, ?Trabajar con valores NULL?
.


¿Qué tal si se quisiera saber qué animales cumplen años el
próximo mes? Para esta clase de cálculos, el año y el día son
irrelevantes; simplemente se desea extraer de la columna
birth la parte correspondiente al mes.
MySQL cuenta con varias funciones para extraer partes de fechas,
como YEAR(),
MONTH()
, y DAYOFMONTH().
MONTH() es la función apropiada para
este caso. Para verla en funcionamiento, ejecute una consulta que
muestra tanto el valor de birth como el

  • 29 Пользователи нашли это полезным
Помог ли вам данный ответ?

Связанные статьи

Variables de sistema del servidor mysql 5x

El servidor mantiene varias variables de sistema que indican cómo está configurado. Todas ellas...

Variables de estado del servidor

El servidor mantiene muchas variables de estado que proveen de información sobre sus...

Los ficheros de registro (log) de MySQL

MySQL tiene varios archivos de registro diferentes que pueden ayudarle a encontrar lo que...

Conexiones mysql remotas lentas, unauthenticated user

Una vez comprobadas las conexiones, son correctas entre la maquina cliente y servidor, observamos...