Recuperando información de una tabla

La sentencia SELECT es usada para obtener la información guardada en una tabla. La forma general de esta sentencia es:

SELECT LaInformaciónQueDeseamos FROM DeQueTabla WHERE CondiciónASatisfacerAquí, LaInformaciónQueDeseamos es la información que queremos ver. Esta puede ser una lista de columnas, o un * para indicar "todas las columnas". DeQueTabla indica el nombre de la tabla de la cual vamos a obtener los datos. La claúsula WHERE es opcional. Si está presente, la CondiciónASatisfacer especifica las condiciones que los registros deben satisfacer para que puedan ser mostrados.

Seleccionando todos los datos

La manera más simple de la sentencia SELECT es cuando se recuperan todos los datos de una tabla:

mysql> SELECT * FROM mascotas;
+——–+————-+———–+——+————+—————+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+——–+————-+———–+——+————+—————+
| Fluffy | Arnoldo | Gato | f | 1999-02-04 | NULL |
| Mau | Juan | Gato | m | 1998-03-17 | NULL |
| Buffy | Arnoldo | Perro | f | 1999-05-13 | NULL |
| FanFan | Benito | Perro | m | 2000-08-27 | NULL |
| Kaiser | Diana | Perro | m | 1998-08-31 | 1997-07-29 |
| Chispa | Omar | Ave | f | 1998-09-11 | NULL |
| Wicho | Tomás | Ave | NULL | 2000-02-09 | NULL |
| Skim | Benito | Serpiente | m | 2001-04-29 | NULL |
| Pelusa | Diana | Hamster | f | 2000-03-30 | NULL |
+——–+————-+———–+——+————+—————+
9 rows in set (0.00 sec)Esta forma del SELECT es útil 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 archivo.

Por ejemplo, en este caso que estamos tratando, al consultar los registros de la tabla, nos damos cuenta de que hay un error en el archivo de datos (mascotas.txt): parece que Kaiser ha nacido después de que ha fallecido!. Al revisar un poco el pedigree de Kaiser encontramos que la fecha correcta de nacimiento es el año 1989, no 1998.

Hay por lo menos un par de maneras de solucionar este problema:

Editar el archivo "mascotas.txt" para corregir el error, eliminar los datos de la tabla mascotas con la sentencia DELETE, y cargar los datos nuevamente con el comando LOAD DATA:

mysql> DELETE FROM mascotas;
mysql> LOAD DATA LOCAL INFILE "mascotas.txt" INTO TABLE mascotas;Sin embargo, si hacemos esto, debemos ingresar los datos de Pelusa, la mascota de nuestra hermana Diana.

La segunda opción consiste en corregir sólo el registro erróneo con una sentencia UPDATE:

mysql> UPDATE mascotas SET nacimiento="1989-08-31" WHERE nombre="Kaiser";Como se mostró anteriormente, es muy fácil recuperar los datos de una tabla completa. Pero típicamente no deseamos hacer esto, particularmente cuando las tablas son demasiado grandes. En vez 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

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

mysql> SELECT * FROM mascotas WHERE nombre="Kaiser";
+——–+————-+———+——+————+————–+
| nombre | propietario | especie | sexo | nacimiento | fallecimento |
+——–+————-+———+——+————+————–+
| Kaiser | Diana | Perro | m | 1989-08-31 | 1997-07-29 |
+——–+————-+———+——+————+————–+
1 row in set (0.00 sec)La salida mostrada confirma que el año ha sido corregido de 1998 a 1989.

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

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

mysql> SELECT * FROM mascotas WHERE nacimiento >= "2000-1-1";
+——–+————-+———–+——+————+—————+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+——–+————-+———–+——+————+—————+
| FanFan | Benito | Perro | m | 2000-08-27 | NULL |
| Wicho | Tomás | Ave | NULL | 2000-02-09 | NULL |
| Skim | Benito | Serpiente | m | 2001-04-29 | NULL |
| Pelusa | Diana | Hamster | f | 2000-03-30 | NULL |
+——–+————-+———–+——+————+—————+
4 rows in set (0.00 sec)Podemos también combinar condiciones, por ejemplo, para localizar a los perros hembras:

mysql> SELECT * FROM mascotas WHERE especie="Perro" AND sexo="f";
+——–+————-+———+——+————+—————+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+——–+————-+———+——+————+—————+
| Buffy | Arnoldo | Perro | f | 1999-05-13 | NULL |
+——–+————-+———+——+————+—————+
1 row in set (0.00 sec)La consulta anterior usa el operador lógico AND. Hay también un operador lógico OR:

mysql> SELECT * FROM mascotas WHERE especie = "Ave" OR especie = "Gato";
+——–+————-+———+——+————+—————+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+——–+————-+———+——+————+—————+
| Fluffy | Arnoldo | Gato | f | 1999-02-04 | NULL |
| Mau | Juan | Gato | m | 1998-03-17 | NULL |
| Chispa | Omar | Ave | f | 1998-09-11 | NULL |
| Wicho | Tomás | Ave | NULL | 2000-02-09 | NULL |
+——–+————-+———+——+————+—————+
4 rows in set (0.00 sec)El operador AND y el operador OR pueden ser intercambiados. Si hacemos esto, es buena idea usar paréntesis para indicar como deben ser agrupadas las condiciones:

mysql> SELECT * FROM mascotas WHERE (especie = "Gato" AND sexo = "m")
-> OR (especie = "Perro" AND sexo = "f");
+——–+————-+———+——+————+—————+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+——–+————-+———+——+————+—————+
| Mau | Juan | Gato | m | 1998-03-17 | NULL |
| Buffy | Arnoldo | Perro | f | 1999-05-13 | NULL |
+——–+————-+———+——+————+—————+
2 rows in set (0.00 sec)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. Por ejemplo, si deseamos conocer la fecha de nacimiento de nuestras mascotas, debemos seleccionar la columna "nombre" y "nacimiento":

mysql> SELECT nombre, nacimiento FROM mascotas;
+——–+————+
| nombre | nacimiento |
+——–+————+
| Fluffy | 1999-02-04 |
| Mau | 1998-03-17 |
| Buffy | 1999-05-13 |
| FanFan | 2000-08-27 |
| Kaiser | 1989-08-31 |
| Chispa | 1998-09-11 |
| Wicho | 2000-02-09 |
| Skim | 2001-04-29 |
| Pelusa | 2000-03-30 |
+——–+————+
9 rows in set (0.00 sec)Para conocer quién tiene alguna mascota, usaremos la siguiente consulta:

mysql> SELECT propietario FROM mascotas;
+————-+
| propietario |
+————-+
| Arnoldo |
| Juan |
| Arnoldo |
| Benito |
| Diana |
| Omar |
| Tomás |
| Benito |
| Diana |
+————-+
9 rows in set (0.00 sec)Sin embargo, debemos notar que la consulta recupera el nombre del propietario de cada mascota, y algunos de ellos aparecen más de una vez. Para minimizar la salida, agregaremos la palabra clave DISTINCT:

mysql> SELECT DISTINCT propietario FROM mascotas;
+————-+
| propietario |
+————-+
| Arnoldo |
| Juan |
| Benito |
| Diana |
| Omar |
| Tomás |
+————-+
6 rows in set (0.03 sec)Se puede usar también una claúsula WHERE para combinar selección de filas con selección de columnas. Por ejemplo, para obtener la fecha de nacimiento de los perritos y los gatitos, usaremos la siguiente consulta:

mysql> SELECT nombre, especie, nacimiento FROM mascotas
-> WHERE especie = "perro" OR especie = "gato";
+——–+———+————+
| nombre | especie | nacimiento |
+——–+———+————+
| Fluffy | Gato | 1999-02-04 |
| Mau | Gato | 1998-03-17 |
| Buffy | Perro | 1999-05-13 |
| FanFan | Perro | 2000-08-27 |
| Kaiser | Perro | 1989-08-31 |
+——–+———+————+
5 rows in set (0.00 sec)