sábado, 14 de mayo de 2016

Select en MySQL (Maria DB) Parte III - Uso de SubConsultas

Buenas noches queridos lectores, continuaremos con el tema del SELECT en MySQL (Maria DB), ya vimos algunos usos sobre la sentencia y también vimos como realizar consultas utilizando INNER JOIN, LEFT JOIN y RIGHT JOIN, en esta ocasión veremos como crear subconsultas, ustedes puedes encontrarle utilidad en su caso, la verdad en muchas ocasiones, un JOIN es más eficiente, pero como les digo, cada quien le encontrará la utilidad, pero veamo algunos ejemplos con la base de datos de prueba que les puse.



Cuando se encuentran subconsultas en una consulta, la base de datos primero realiza la subconsulta y la guarda en memoria, y despues ejecuta la consulta, de manera que si existes varias subconsultas en una consulta en una base de datos muy grande, el rendimiento se verá mermado, pero también nos facilita encontrar información sin ejecutar una segunda consulta, se que se lee un poco revoltoso, pero consideremos el siguiente ejercicio:

Ejercicio 1

Ejecutar una consulta que nos muestre los partidos del torneo de “Clausura 2016” utilizando subconsultas

select * from partidos
where idtorneo in
(select idtorneo
from torneos

            where nombre = 'Clausura 2016');

Vamos a analizar línea por línea, ya que al ejecutar esta consulta, nos arroja el siguiente resultado:


La línea nueva, que no habíamos visto ni explicado es la clausula IN, junto con la subconsulta 

in
(select idtorneo
from torneos

            where nombre = 'Clausura 2016');

La clausula IN funciona de manera similar a la clausula OR, lo que nos indica es que nos mostrará los partidos que cuyo idtorneo sea... luego viene la subconsula que nos indica que nos seleccione el idtorneo de la tabla TORNEOS cuyo nombre sea 'Clausura 2016', como les comenté en un principio, la base de datos primero realiza las subconsultas, las guarda en memoria y después ejecuta las consultas, así que el idtorneo del Clausura 2016 es el 11, ese 11, lo guardará en memoria y ejecutara el query completo, que traducido quedaría:

select * from partidos
where idtorneo in
(11);

La utilidad de la subconsulta en este caso, es que no sabemos el id del torneo, pero si sabemos el nombre del mismo 'Clausura 2016', así que empleamos las subconsultas para obtener ese id, mediante el nombre, sin tener que realizar dos consutas por separado, aprovecho para abundar en el ejemplo de la clausula IN. ¿Que pasa si ademas de torneo 11, quiero también el 12?. Pues fácil agrego una coma (,), y le pongo el otro id que quiero:

select * from partidos
where idtorneo in
(11, 12);

select * from partidos
where idtorneo = 11
or idtorneo = 12

Estas dos consultas funcionan de manera exactamente igual, la diferencia es que la clausula IN, nos ahorrará algunas líneas de código.

Pero veamos otro ejemplo de subconsultas.

Ejercicio 2:
Mostrar el nombre del equipo, el nombre del estadio, la capacidad y la ciudad en que esta ubicados, nos interesa saber esos datos de los equipos mexicanos que sean de Liga

select eq.idequipo, eq.abreviacion, eq.nombre, e.nombre as NombreEstadio, e.ciudad, e.capacidad
from equipos eq
inner join (select idestadio,nombre, ciudad, capacidad from estadios) e
on e.idestadio=eq.idestadio
and eq.codigopais='MX'
and eq.tipo=1

order by e.capacidad desc;

Como pueden ver, las subconsultas se pueden realizar tambien dentro del INNER JOIN, aunque como les comentaba líneas arriba, primero realiza las subconsultas y despues la consulta, en una base de datos grande, las consultas puden tardar demasiado tiempo. Al ejecutar esta consulta, obtenemos el siguiente resultado.






















Esta consulta sería equialente a esta:


select eq.idequipo, eq.abreviacion, eq.nombre, e.nombre as NombreEstadio, e.ciudad, e.capacidad
from equipos eq
inner join estadios e
on e.idestadio=eq.idestadio
and eq.codigopais='MX'
and eq.tipo=1

order by e.capacidad desc;

Hasta aquí el post de hoy, espero les sea de utilidad, y haya sido de su agrado, les pido compartan, comenten, den +1, o clic en algún anuncio de su interes

Banderas de Visitantes

Flag Counter