Bienvenidos sean a este post, hoy hablaremos sobre el comando mas utilizado por todas las bases de datos.
Este comando es el encargado de hacer la busqueda en nuestras tabla y mostranos la informacion recolectada, en su forma mas basica se utiliza de la siguiente forma:
select * from nombre_tabla;
Siempre ira primero el comando seguido del comodin que lo usaremos para que traiga todos los campos de la tabla luego ira el from seguido del nombre de la tabla que deseamos recuperar, veamos un ejemplo y su salida:
MariaDB [base1]> select * from tabla3;
+----+----------+----------+----------------------+------+------------+
| id | nombre | apellido | correo | edad | ciudad |
+----+----------+----------+----------------------+------+------------+
| 5 | Martin | Miranda | tinchicus@gmail.com | 45 | Dunwich |
| 6 | Enzo | Tortore | elgary@tinchicus.com | 33 | Dunwich |
| 7 | DarkZero | Aleman | darkie@tinchicus.com | 32 | Miskatonic |
| 8 | Ariel | Polizzi | eltio@tinchicus.com | 47 | Arkham |
+----+----------+----------+----------------------+------+------------+
4 rows in set (0.001 sec)
MariaDB [base1]>
Pero nosotros podemos no necesitar todas las columnas sino simplemente algunas, para ello podemos hacer lo siguiente:
select nombre, apellido from tabla3;
En este comando le decimos que nos devuelva unicamente el nombre y apellido de la tabla, si lo ejecutamos veremos la siguiente salida:
MariaDB [base1]> select nombre, apellido from tabla3;
+----------+----------+
| nombre | apellido |
+----------+----------+
| Martin | Miranda |
| Enzo | Tortore |
| DarkZero | Aleman |
| Ariel | Polizzi |
+----------+----------+
4 rows in set (0.000 sec)
MariaDB [base1]>
Y tambien podemos condicionar nuestra salida con un condicional, veamos un ejemplo:
select * from tabla3 where edad < 40;
En este caso le pedimos que nos devuelva todos los valores pero cuya edad sea menor a 40, si lo ejecutamos veremos la siguiente salida:
MariaDB [base1]> select * from tabla3 where edad < 40;
+----+----------+----------+----------------------+------+------------+
| id | nombre | apellido | correo | edad | ciudad |
+----+----------+----------+----------------------+------+------------+
| 6 | Enzo | Tortore | elgary@tinchicus.com | 33 | Dunwich |
| 7 | DarkZero | Aleman | darkie@tinchicus.com | 32 | Miskatonic |
+----+----------+----------+----------------------+------+------------+
2 rows in set (0.001 sec)
MariaDB [base1]>
Como pueden ver solo nos trajo los valores que coincidan con la condicion, pasemos a ver la siguiente opcion que disponemos:
MariaDB [base1]> select correo, nombre, apellido
-> from tabla3
-> order by edad asc;
En este ejemplo le diremos que devuelva tres campos (correo, nombre y apellido) pero le pedimos que ordene los campos por medio de la edad, veamos su salida:
MariaDB [base1]> select correo, nombre, apellido
-> from tabla3
-> order by edad asc;
+----------------------+----------+----------+
| correo | nombre | apellido |
+----------------------+----------+----------+
| darkie@tinchicus.com | DarkZero | Aleman |
| elgary@tinchicus.com | Enzo | Tortore |
| tinchicus@gmail.com | Martin | Miranda |
| eltio@tinchicus.com | Ariel | Polizzi |
+----------------------+----------+----------+
4 rows in set (0.001 sec)
MariaDB [base1]>
Esto nos sirve para comentar un tema, los campos que mostramos no tienen nada que ver con el condicional o el que usamos para ordenar, por lo tanto podemos usarlo pero no necesariamente buscarlos, por ultimo veamos el siguiente ejemplo:
select * from tabla3 order by edad asc limit 3;
Para este ejemplo agregamos la opcion de limit que establecera la cantidad de lineas que deseamos mostrar, para este caso usamos 3, veamos su salida:
MariaDB [base1]> select * from tabla3 order by edad asc limit 3;
+----+----------+----------+----------------------+------+------------+
| id | nombre | apellido | correo | edad | ciudad |
+----+----------+----------+----------------------+------+------------+
| 7 | DarkZero | Aleman | darkie@tinchicus.com | 32 | Miskatonic |
| 6 | Enzo | Tortore | elgary@tinchicus.com | 33 | Dunwich |
| 5 | Martin | Miranda | tinchicus@gmail.com | 45 | Dunwich |
+----+----------+----------+----------------------+------+------------+
3 rows in set (0.002 sec)
MariaDB [base1]>
Con todo esto comentado podemos ver como es la sintaxis final de este comando:
SELECT {* | columnas } FROM tabla
[WHERE condicion]
[ORDER BY campo {ASC | DESC}]
[LIMIT numero];
Como vimos al principio los unicos campos obligatorios son SELECT y FROM, todo el resto son opcionales pero nos ayudan a ajustar mucho nuestras busquedas pero esta no es la unica opcion de trabajo sino que tenemos algunas mas, por ejemplo podemos unir un par de campos y obtener un resultado, veamos un ejemplo:
MariaDB [base1]> select correo, concat(apellido,", ",nombre)
-> from tabla3
-> order by correo desc;
En este caso usamos a concat y dentro pasamos todos los elementos que vamos a concatenar, en este caso primero el apellido seguido de un espacio con coma y el nombre, el resto es como vimos anteriormente pasemos a ver su salida:
MariaDB [base1]> select correo, concat(apellido,", ",nombre)
-> from tabla3
-> order by correo desc;
+----------------------+------------------------------+
| correo | concat(apellido,", ",nombre) |
+----------------------+------------------------------+
| tinchicus@gmail.com | Miranda, Martin |
| eltio@tinchicus.com | Polizzi, Ariel |
| elgary@tinchicus.com | Tortore, Enzo |
| darkie@tinchicus.com | Aleman, DarkZero |
+----------------------+------------------------------+
4 rows in set (0.001 sec)
MariaDB [base1]>
Observen como podemos ordenar el resultado que devuelve nuestra consulta pero esto se puede mejorar aun mas, para ello tomaremos el ejemplo anterior y lo modificaremos de la siguiente manera:
MariaDB [base1]> select
-> correo as "E-Mail",
-> concat(apellido,", ",nombre) as "Nombre completo"
-> from tabla3
-> order by edad asc;
Para este ejemplo agregamos la palabra as que nos permite asignar una etiqueta a como se devolvera el dato, en este caso para correo le asignamos a «E-Mail» para ver como trabaja aunque no era necesario pero en el segundo caso usamos la etiqueta «Nombre completo» para mejorar la estetica de la consulta, veamos su salida:
MariaDB [base1]> select
-> correo as "E-Mail",
-> concat(apellido,", ",nombre) as "Nombre completo"
-> from tabla3
-> order by edad asc;
+----------------------+------------------+
| E-Mail | Nombre completo |
+----------------------+------------------+
| darkie@tinchicus.com | Aleman, DarkZero |
| elgary@tinchicus.com | Tortore, Enzo |
| tinchicus@gmail.com | Miranda, Martin |
| eltio@tinchicus.com | Polizzi, Ariel |
+----------------------+------------------+
4 rows in set (0.000 sec)
MariaDB [base1]>
Por ultimo vamos a trabajar con una opcion mas complicada pero util tambien como es la capacidad de obtener datos de varias tablas, vamos a ver el siguiente ejemplo:
MariaDB [(none)]> select
-> base1.tabla3.correo as "Correo electronico",
-> concat(base1.tabla3.nombre," ",base1.tabla3.apellido) as "Nombre",
-> base2.fotos.archivo as "Foto",
-> base3.telefonos.telefono as "Telefono"
-> from base1.tabla3, base2.fotos, base3.telefonos
-> where base2.fotos.correo = base1.tabla3.correo and
-> base3.telefonos.correo = base1.tabla3.correo;
Este es un query mucho mas complejo pero una vez que le tomen la mano pueden hacer cosas completamente geniales sin necesidad de caer en multiples busquedas, para este caso vamos a tener tres bases distintas cada una con una tabla donde el unico dato que tienen en comun es el correo y despues tenemos una para la foto de la persona y otra para el telefono, veamos la primera tabla:
MariaDB [(none)]> select * from base2.fotos;
+----------------------+---------------+
| correo | archivo |
+----------------------+---------------+
| tinchicus@gmail.com | tinchicus.png |
| elgary@tinchicus.com | elgary.png |
| darkie@tinchicus.com | dark.png |
| eltio@tinchicus.com | polizzia.png |
+----------------------+---------------+
4 rows in set (0.001 sec)
MariaDB [(none)]>
Y pasemos a ver la segunda tabla:
MariaDB [(none)]> select * from base3.telefonos;
+----------------------+----------+
| correo | telefono |
+----------------------+----------+
| tinchicus@gmail.com | 55446677 |
| elgary@tinchicus.com | 44335566 |
| darkie@tinchicus.com | 55112299 |
| eltio@tinchicus.com | 56229011 |
+----------------------+----------+
4 rows in set (0.001 sec)
MariaDB [(none)]>
Como pueden observar con respecto a la tabla que estuvimos trabajando hasta ahora el unico valor que los une es la columna de correo, con esto aclarado veamos la parte de las columnas de nuestro query principal:
-> base1.tabla3.correo as "Correo electronico",
-> concat(base1.tabla3.nombre," ",base1.tabla3.apellido) as "Nombre",
-> base2.fotos.archivo as "Foto",
-> base3.telefonos.telefono as "Telefono"
Observen que primero busco el correo de la tabla3 que vinimos viendo hasta ahora, la etiqueto como Correo electronico, luego hago una concatenacion de los nombre y apellido de la misma tabla y la etiqueto como Nombre, para luego tomar el campo archivo y lo llamare Foto y por ultimo hago lo mismo con la ultima tabla para obtener el valor de telefono, con esto tenemos los cuatro datos que mostraremos, como son distintas tablas en el FROM debemos hacer lo siguiente:
from base1.tabla3, base2.fotos, base3.telefonos
En este caso pasaremos todas las tablas que necesitamos para obtener los datos solicitados anteriormente, si nos olvidamos alguna nos devolvera un error porque no la encontrara y por ultimo usaremos el siguiente condicional:
-> where base2.fotos.correo = base1.tabla3.correo and
-> base3.telefonos.correo = base1.tabla3.correo;
Aqui le diremos que lo filtre donde el valor de correo de fotos es igual al de la tabla3 y la misma igualdad entre el valor de correo de la tabla3 y el de telefonos, es decir que lo traiga solo si cumplen estas condiciones, la salida sera algo semejante a esto:
MariaDB [(none)]> select
-> base1.tabla3.correo as "Correo electronico",
-> concat(base1.tabla3.nombre," ",base1.tabla3.apellido) as "Nombre",
-> base2.fotos.archivo as "Foto",
-> base3.telefonos.telefono as "Telefono"
-> from base1.tabla3, base2.fotos, base3.telefonos
-> where base2.fotos.correo = base1.tabla3.correo and
-> base3.telefonos.correo = base1.tabla3.correo;
+----------------------+-----------------+---------------+----------+
| Correo electronico | Nombre | Foto | Telefono |
+----------------------+-----------------+---------------+----------+
| tinchicus@gmail.com | Martin Miranda | tinchicus.png | 55446677 |
| elgary@tinchicus.com | Enzo Tortore | elgary.png | 44335566 |
| darkie@tinchicus.com | DarkZero Aleman | dark.png | 55112299 |
| eltio@tinchicus.com | Ariel Polizzi | polizzia.png | 56229011 |
+----------------------+-----------------+---------------+----------+
4 rows in set (0.004 sec)
MariaDB [(none)]>
Observen como pudimos armar todos los valores del usuario en base a la direccion de correo que nos funciona como nexo, por lo tanto la sintaxis para buscar en distintas tablas sera:
SELECT {* | Tabla.campo, Tabla.campo, ...}
FROM base.nombre_tabla, base.nombre_tabla, ...
[WHERE condicion]
[ORDER BY tabla.campo]
[LIMIT numero];
En este caso el comodin es muy poco recomendable pero se puede utilizar aunque deberan especificar cada campo que deben recuperar anteponiendo el nombre de la tabla y/o tambien el nombre de la base como vimos en el ejemplo dado que teniamos tres tablas en tres bases distintas, y recuerden que en el FROM deben pasar todas las tablas donde se debe buscar informacion y por ultimo los mismos opcionales que antes de la condicion, aunque este sera fundamental para lograr un buen filtro de lo contrario puede ser imposible el resultado, el ORDER BY tambien funciona pero deben anteponer el nombre de la tabla del campo que se ordenara, y LIMIT funciona de la misma forma.
Para ir finalizando tenemos una palabra clave que es muy util para realizar un filtrado rapido, supongamos la siguiente situacion nosotros necesitamos obtener unicamente las ciudades cargadas en la tabla de los usuarios:
MariaDB [base1]> select ciudad from tabla3;
+------------+
| ciudad |
+------------+
| Dunwich |
| Dunwich |
| Miskatonic |
| Arkham |
+------------+
4 rows in set (0.004 sec)
MariaDB [base1]>
Hacemos un query rapido pero resulta que tenemos un valor repetido y necesitamos obtener solamente las ciudades cargadas porque debemos usarlas en un menu, como podemos filtrarlas? De una manera muy simple con la palabra DISTINCT:
MariaDB [base1]> select distinct ciudad from tabla3;
+------------+
| ciudad |
+------------+
| Dunwich |
| Miskatonic |
| Arkham |
+------------+
3 rows in set (0.000 sec)
MariaDB [base1]>
Esta palabra va adelante de los campos y lo que realiza es un filtrado de todas las entradas duplicadas dejando solamente un valor de cada una de ellas, esto es ideal cuando necesitamos solo los valores de cada posible elemento cargado en una columna, como por ejemplo el menu que citamos anteriormente.
Por ultimo tenemos una opcion muy interesante como es el conteo de los elementos de una tabla, para ello se utiliza la palabra COUNT, veamos un ejemplo:
select count(*) from tabla3;
En este caso le dijimos que cuente todos los elementos de la tabla, si lo ejecutamos nos devolvera la siguiente salida:
MariaDB [base1]> select count(*) from tabla3;
+----------+
| count(*) |
+----------+
| 4 |
+----------+
1 row in set (0.000 sec)
MariaDB [base1]>
En este caso nos devuelve la cantidad de filas que posee la tabla pero en el COUNT podemos pasar el campo que necesitemos contar, por ejemplo:
MariaDB [base1]> select count(ciudad) from tabla3;
+---------------+
| count(ciudad) |
+---------------+
| 4 |
+---------------+
1 row in set (0.000 sec)
MariaDB [base1]>
En este caso nos devolvio 4 porque cuenta todos los campos que no sean nulos (NULL) pero nosotros podemos obtener el verdadero valor por medio de DISTINCT usandolo de la siguiente forma:
MariaDB [base1]> select count(distinct ciudad) from tabla3;
+------------------------+
| count(distinct ciudad) |
+------------------------+
| 3 |
+------------------------+
1 row in set (0.001 sec)
MariaDB [base1]>
En este caso omite todos los valores repetidos por lo tanto nos devuelve el valor verdadero y por ultimo tambien se le puede aplicar la palabra as para etiquetarlo, veamos el siguiente ejemplo:
MariaDB [base1]> select
-> count(distinct ciudad) as "Total de ciudades"
-> from tabla3;
+-------------------+
| Total de ciudades |
+-------------------+
| 3 |
+-------------------+
1 row in set (0.003 sec)
MariaDB [base1]>
Con esto tenemos una base mas que importante para trabajar con SELECT pero existen muchos mas opciones para trabajar con este comando pero les recomiendo visitar el siguiente post donde lo explico a fondo:
MySQL / Comando SELECT
Bienevenidos sean a este post, hoy veremos todas las opciones que permite el comando SELECT, tambien como hacer consultas complejas, como formatearlas, estructurarlas y delimitarlas. Como vimos en los posts anteriores al comando SELECT lo utilizamos para obtener la informacion de la tablas que tenemos cargadas en la bases. Por ejemplo la instruccion mas basica…
Keep readingEn resumen, hoy hemos visto como es el comando mas usado en base de datos, como se compone desde su forma mas basica hasta la mas compleja y necesaria, despues vimos algunas formas mas de usarlo, ya sea con varias herramientas asi como multiples tablas, tambien un par de opciones que nos pueden ser utiles, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
