Bienvenidos sean a este post, hoy ampliaremos un poco mas sobre EXPLAIN comentando las opciones del titulo.
Antes de comenzar la explicacion vamos a crear dos nuevas tablas, en caso de venir de posts anteriores lo haremos dentro de la base1 que hemos generado en otra oportunidad, de lo contrario pueden usar cualquier base pero si deben generar las siguientes dos tablas:
MariaDB [base1]> create table empresaA (
-> id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> nombre varchar(20) NOT NULL,
-> apellido varchar(20) NOT NULL,
-> correo varchar(100) DEFAULT 'No Informado',
-> nacimiento DATE NOT NULL,
-> seccion varchar(20) DEFAULT 'IT');
La primera se llamara empresaA y en ella almacenaremos una columna que sera el id de nuestro empleado, que sera la clave primaria y se autogenerara a medida que ingresemos personal, luego contendra el nombre, apellido, correo (opcional), fecha de nacimiento y seccion (con un valor predeterminado) para cada empleado, con esto tenemos la primera tabla, luego crearemos esta:
MariaDB [base1]> create table empresaB (
-> id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> nombre varchar(20) NOT NULL,
-> apellido varchar(20) NOT NULL,
-> correo varchar(100) DEFAULT 'No Informado',
-> nacimiento DATE NOT NULL,
-> seccion varchar(20) DEFAULT 'IT');
Como pueden ver es exactamente lo mismo pero variamos el nombre de la tabla para diferenciarlo de la anterior, con esto podemos proceder a agregar los empleados, comencemos con la tabla empresaA:
insert into empresaA set nombre='Martin', apellido='Miranda', correo='tinchicus@gmail.com', nacimiento='1976-10-22', seccion='Presidente';
insert into empresaA set nombre='Ariel', apellido='Polizzi', correo='eltiopoli@tinchicus.com', nacimiento='1973-12-01', seccion='Jefatura';
nsert into empresaA set nombre='Juan', apellido='Militello', correo='juanete@tinchicus.com', nacimiento='1979-11-16', seccion='Contabilidad';
insert into empresaA set nombre='Raul', apellido='Picos', correo='eltiorulo@tinchicus.com', nacimiento='1970-09-07', seccion='Laboratorio';
Estos son datos que sugiero cargar pero si quieren cargar otros quedan a su criterio, con esto procedamos a cargar los empleados de la empresaB:
insert into empresaB set nombre='Enzo', apellido='Tortore', correo='elgary@bogusoft.com', nacimiento='1986-03-24', seccion='Presidente';
insert into empresaB set nombre='DarkZero', apellido='Aleman', correo='eldarkie@bogusoft.com', nacimiento='1988-10-24', seccion='Jefatura';
insert into empresaB set nombre='Javier', apellido='Marcuzzi', correo='kavito@bogusoft.com', nacimiento='1974-07-19', seccion='Contabilidad';
insert into empresaB set nombre='Gaston', apellido='Salazar', correo='elpendex@bogusoft.com', nacimiento='1980-07-08', seccion='Laboratorio';
Al igual que en el caso anterior pueden usar otra informacion o simplemente agregar estos para poder trabajar con lo que resta del post, una vez realizado todo esto podemos pasar a nuestro primer tema.
UNION
La opcion UNION sirve para unir varios queries de SELECT en un solo conjunto de resultados, su sintaxis basica es:
SELECT ... UNION [ALL | DISTINCT] SELECT ... [ORDER BY] [LIMIT]
Siendo bastante simple porque primero tendremos nuestro primer SELECT seguido de UNION que puede puede usar las opciones ALL o DISTINCT, seguido por el otro SELECT que deseamos unir, podemos repetir la operacion las veces que sea necesario y por ultimo podemos utilizar a ORDER BY y LIMIT para definir mejor a nuestro query, cuando trabajamos con EXPLAIN veremos que cada SELECT de una operacion UNION (o varias) sera optimizada de forma separada, para entender el concepto vamos a realizar el siguiente ejemplo:
MariaDB [base1]> (select nombre, apellido, correo
-> from empresaA where apellido like 'M%')
-> UNION
-> (select nombre, apellido, correo from empresaB
-> where nombre like 'E%');
+--------+-----------+-----------------------+
| nombre | apellido | correo |
+--------+-----------+-----------------------+
| Martin | Miranda | tinchicus@gmail.com |
| Juan | Militello | juanete@tinchicus.com |
| Enzo | Tortore | elgary@bogusoft.com |
+--------+-----------+-----------------------+
3 rows in set (0.003 sec)
MariaDB [base1]>
En este caso primero ejecutamos un query donde nos devuelve todos los apellidos que comiencen con la letra M, luego unido tenemos un query que nos devuelve todas las personas cuyo nombre comienzan con E, el resultado final es la suma de las dos consultas (queries), vamos a tomar este mismo ejemplo y vamos a aplicar el EXPLAIN para ver su salida:
MariaDB [base1]> EXPLAIN (select nombre, apellido, correo from empresaA where apellido like 'M%') UNION (select nombre, apellido, correo from empresaB where nombre like 'E%');
+------+--------------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------+------------+------+---------------+------+---------+------+------+-------------+
| 1 | PRIMARY | empresaA | ALL | NULL | NULL | NULL | NULL | 4 | Using where |
| 2 | UNION | empresaB | ALL | NULL | NULL | NULL | NULL | 4 | Using where |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | |
+------+--------------+------------+------+---------------+------+---------+------+------+-------------+
3 rows in set (0.001 sec)
MariaDB [base1]>
Nota: Lo muestro de esta forma para que quede mejor visulizado
Observemos como la primer linea nos informa cual es la tabla primaria (PRIMARY), luego cual fue la unida (UNION) y por ultimo tenemos una tercer linea con la union de ambas, en esta caso no mostro ninguna clave, nos informo la cantidad de lineas de cada tabla y por ultimo en Extra nos dijo el motivo de como se filtro (Using where), tambien podemos ver como en type nos devolvio el ALL porque es el valor predeterminado de UNION, en caso de usar DISTINCT anulara al ALL, pasemos al siguiente tema.
BETWEEN
La opcion BETWEEN es de las que podemos usar en un SELECT de la misma forma que podemos usar a LIKE pero esta nos servira para establecer un rango, por ejemplo de las tablas anteriores vamos a realizar el siguiente ejemplo:
MariaDB [base1]> select nombre, apellido, seccion
-> from empresaA
-> where nacimiento between '1972-01-01' and '1979-01-01';
+--------+----------+------------+
| nombre | apellido | seccion |
+--------+----------+------------+
| Martin | Miranda | Presidente |
| Ariel | Polizzi | Jefatura |
+--------+----------+------------+
2 rows in set (0.004 sec)
MariaDB [base1]>
En este caso lo utilizamos para establecer que la consulta nos devuelva todas las entradas que se encuentren dentro del rango establecido, estan simple como se ve en el ejemplo, tomemos este mismo ejemplo y apliquemos el EXPLAIN:
MariaDB [base1]> explain select nombre, apellido, seccion from empresaA where nacimiento between '1972-01-01' and '1979-01-01'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: empresaA
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra: Using where
1 row in set (0.000 sec)
MariaDB [base1]>
Al igual que si trabajaramos con un SELECT ordinario pero si tuvieramos algun indice vinculado al rango que establecimos en type deberia aparecer range en lugar de ALL, pasemos al siguiente tema.
JOIN
Al igual como sucede con BETWEEN, la opcion JOIN nos permite trabajar con el SELECT pero a diferencia no es parte del condicional WHERE sino que nos permite reemplazarlo, tenemos cuatro tipos de JOIN:
- INNER JOIN, nos devuelve un resultado que cumplen la condicion solicitada
- CROSS JOIN, nos produce un resultado donde cada linea de una tabla se une a la linea de otra tabla
- LEFT JOIN, nos devuelve un resultado de la tabla «a la izquierda» siempre y cuando sus columnas conicidan con la de la tabla a la derecha
- RIGHT JOIN, idem al anterior pero con la tabla»a la derecha»
Para entender este concepto, veamos un par de ejemplos, el primer caso sera para INNER JOIN:
select * from empresaA inner join empresaB on empresaB.seccion = 'Presidente';
Nos dara como resultado lo siguiente:
+----+--------+-----------+-------------------------+------------+--------------+----+--------+----------+---------------------+------------+------------+
| id | nombre | apellido | correo | nacimiento | seccion | id | nombre | apellido | correo | nacimiento | seccion |
+----+--------+-----------+-------------------------+------------+--------------+----+--------+----------+---------------------+------------+------------+
| 1 | Martin | Miranda | tinchicus@gmail.com | 1976-10-22 | Presidente | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
| 3 | Juan | Militello | juanete@tinchicus.com | 1979-11-16 | Contabilidad | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
| 4 | Raul | Picos | eltiorulo@tinchicus.com | 1970-09-07 | Laboratorio | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
+----+--------+-----------+-------------------------+------------+--------------+----+--------+----------+---------------------+------------+------------+
4 rows in set (0.003 sec)
Si observan nos unio a las dos tablas, en este caso al no haber una condicion para la primera tabla (empresaA) nos trajo todas las entradas pero para la segunda tabla solo nos trajo la coincidente con la condicion, veamos el siguiente caso:
MariaDB [base1]> select * from empresaA
-> cross join empresaB;
+----+--------+-----------+-------------------------+------------+--------------+----+----------+----------+-----------------------+------------+--------------+
| id | nombre | apellido | correo | nacimiento | seccion | id | nombre | apellido | correo | nacimiento | seccion |
+----+--------+-----------+-------------------------+------------+--------------+----+----------+----------+-----------------------+------------+--------------+
| 1 | Martin | Miranda | tinchicus@gmail.com | 1976-10-22 | Presidente | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
| 3 | Juan | Militello | juanete@tinchicus.com | 1979-11-16 | Contabilidad | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
| 4 | Raul | Picos | eltiorulo@tinchicus.com | 1970-09-07 | Laboratorio | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
| 1 | Martin | Miranda | tinchicus@gmail.com | 1976-10-22 | Presidente | 2 | DarkZero | Aleman | eldarkie@bogusoft.com | 1988-10-24 | Jefatura |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 2 | DarkZero | Aleman | eldarkie@bogusoft.com | 1988-10-24 | Jefatura |
| 3 | Juan | Militello | juanete@tinchicus.com | 1979-11-16 | Contabilidad | 2 | DarkZero | Aleman | eldarkie@bogusoft.com | 1988-10-24 | Jefatura |
| 4 | Raul | Picos | eltiorulo@tinchicus.com | 1970-09-07 | Laboratorio | 2 | DarkZero | Aleman | eldarkie@bogusoft.com | 1988-10-24 | Jefatura |
| 1 | Martin | Miranda | tinchicus@gmail.com | 1976-10-22 | Presidente | 3 | Javier | Marcuzzi | kavito@bogusoft.com | 1974-07-19 | Contabilidad |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 3 | Javier | Marcuzzi | kavito@bogusoft.com | 1974-07-19 | Contabilidad |
| 3 | Juan | Militello | juanete@tinchicus.com | 1979-11-16 | Contabilidad | 3 | Javier | Marcuzzi | kavito@bogusoft.com | 1974-07-19 | Contabilidad |
| 4 | Raul | Picos | eltiorulo@tinchicus.com | 1970-09-07 | Laboratorio | 3 | Javier | Marcuzzi | kavito@bogusoft.com | 1974-07-19 | Contabilidad |
| 1 | Martin | Miranda | tinchicus@gmail.com | 1976-10-22 | Presidente | 4 | Gaston | Salazar | elpendex@bogusoft.com | 1980-07-08 | Laboratorio |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 4 | Gaston | Salazar | elpendex@bogusoft.com | 1980-07-08 | Laboratorio |
| 3 | Juan | Militello | juanete@tinchicus.com | 1979-11-16 | Contabilidad | 4 | Gaston | Salazar | elpendex@bogusoft.com | 1980-07-08 | Laboratorio |
| 4 | Raul | Picos | eltiorulo@tinchicus.com | 1970-09-07 | Laboratorio | 4 | Gaston | Salazar | elpendex@bogusoft.com | 1980-07-08 | Laboratorio |
+----+--------+-----------+-------------------------+------------+--------------+----+----------+----------+-----------------------+------------+--------------+
16 rows in set (0.003 sec)
En este caso por cada cuatro elemento de la tabla empresaA unio uno de la otra tabla, veamos el sigueinte caso:
MariaDB [base1]> select * from empresaA
-> left join empresaB
-> on empresaA.nombre = 'Ariel';
+----+--------+-----------+-------------------------+------------+--------------+------+----------+----------+-----------------------+------------+--------------+
| id | nombre | apellido | correo | nacimiento | seccion | id | nombre | apellido | correo | nacimiento | seccion |
+----+--------+-----------+-------------------------+------------+--------------+------+----------+----------+-----------------------+------------+--------------+
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 2 | DarkZero | Aleman | eldarkie@bogusoft.com | 1988-10-24 | Jefatura |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 3 | Javier | Marcuzzi | kavito@bogusoft.com | 1974-07-19 | Contabilidad |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 4 | Gaston | Salazar | elpendex@bogusoft.com | 1980-07-08 | Laboratorio |
| 1 | Martin | Miranda | tinchicus@gmail.com | 1976-10-22 | Presidente | NULL | NULL | NULL | NULL | NULL | NULL |
| 3 | Juan | Militello | juanete@tinchicus.com | 1979-11-16 | Contabilidad | NULL | NULL | NULL | NULL | NULL | NULL |
| 4 | Raul | Picos | eltiorulo@tinchicus.com | 1970-09-07 | Laboratorio | NULL | NULL | NULL | NULL | NULL | NULL |
+----+--------+-----------+-------------------------+------------+--------------+------+----------+----------+-----------------------+------------+--------------+
7 rows in set (0.004 sec)
Si observan nos repitio la coincidencia del condicional del left join y la unio a las entradas en la tabla de la derecha, el resto lo mostro como NULL porque no cumplio las condiciones, veamos el mismo caso pero con el RIGHT JOIN:
MariaDB [base1]> select * from empresaA
-> right join
-> empresaB on empresaA.nombre = 'Ariel';
+------+--------+----------+-------------------------+------------+----------+----+----------+----------+-----------------------+------------+--------------+
| id | nombre | apellido | correo | nacimiento | seccion | id | nombre | apellido | correo | nacimiento | seccion |
+------+--------+----------+-------------------------+------------+----------+----+----------+----------+-----------------------+------------+--------------+
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 1 | Enzo | Tortore | elgary@bogusoft.com | 1986-03-24 | Presidente |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 2 | DarkZero | Aleman | eldarkie@bogusoft.com | 1988-10-24 | Jefatura |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 3 | Javier | Marcuzzi | kavito@bogusoft.com | 1974-07-19 | Contabilidad |
| 2 | Ariel | Polizzi | eltiopoli@tinchicus.com | 1973-12-01 | Jefatura | 4 | Gaston | Salazar | elpendex@bogusoft.com | 1980-07-08 | Laboratorio |
+------+--------+----------+-------------------------+------------+----------+----+----------+----------+-----------------------+------------+--------------+
4 rows in set (0.004 sec)
En este caso ignoro los otros valores que no cumplen la condicion en la tabla de la izquierda y dejo unicamente los valores de la tabla a la derecha y su correspondiente coincidencia.
En resumen, hoy hemos visto tres elementos que nos pueden ser muy utiles, el primero es una manera practica de poder unir varios queries para obtener un resultado en concreto sin tener que estar haciendo varias consultas innecesarias, la segunda opcion nos permite definir un rango de valores para poder filtrar de manera mas practica, los datos y el ultimo nos permite tambien unir pero no queries o consultas sino dos tablas para obtener un resultado dependiendo de nuestra necesidad, 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
