Você está na página 1de 12

16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

eamexicano +
Consultas en ms de una tabla I Consultas
Anidadas
Hasta ahora hemos consultado datos que se encuentran almacenados en una sola tabla.
Tambin sabemos que es posible encontrar datos relacionados almacenados en distintas
tablas.

1. Qu podemos hacer cuando queremos obtener datos relacionados a un registro que


estn almacenados en otra tabla?
Ej. Si conozco el nombre o correo de un usuario cmo puedo obtener las
publicaciones que ha escrito?
En este contexto nos interesa obtener solo los datos que se encuentran almacenados
en una tabla publicaciones sin necesidad de presentar los datos relacionados.

2. Cmo podemos obtener y presentar datos que estn almacenados en distintas


tablas?
Ej. Quiero mostrar el nombre del usuario junto con las publicaciones que ha escrito.
En este contexto nos interesa obtener los datos que estn en distintas tablas.

Las opciones que podemos utilizar son:


Consultas anidadas subconsultas o JOIN.

Antes de comenzar con las consultas anidadas muestro el esquema de la base de datos -
tutoriales -. La puedes descargar aqu.

http://blog.eamexicano.com/mysql/consultas-anidadas/ 1/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

eamexicano +

Referencia para importar la Base de Datos con PHPMyAdmin


http://www.youtube.com/watch?v=M6IbthUJjg0 -.

Importar base de datos a MySQL utilizando PHPMyAdmin

Es probable que la interfaz de PHPMyAdmin sea distinta porque ya tiene algunos aos el
video.

http://blog.eamexicano.com/mysql/consultas-anidadas/ 2/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

El esquema de la Base de Datos nos sirve para visualizar tablas, campos con su tipo de
eamexicano
dato, y relaciones entre tablas la estructura de la Base de Datos. En este caso que vamos
+
a comenzar con consultas anidadas nos sirve para saber dnde estn almacenados los
datos. Con esto vamos a poder de nir la(s) consulta(s) que tenemos que realizar a partir de
los datos que tenemos para obtener los datos que necesitemos.

Consultas Anidadas Subconsultas

Las consultas anidadas o subconsultas son dos o ms consultas donde el resultado de una
consulta se utiliza como parmetro valor para realizar la siguiente consulta.

Las consultas anidadas se componen de dos partes.

Consulta interior o subconsulta.


Es la primer consulta que se realiza. De esta consulta obtenemos el valor o los valores
necesarios para que se realice la consulta exterior.

Consulta exterior.
Esta consulta utiliza el resultado de la consulta interior como parmetro y muestra el
resultado que queremos obtener.

Pueden existir cualquier nmero de consultas anidadas. Las consultas se realizan del interior
al exterior.

Ejemplo:
Si queremos mostrar el ttulo de las publicaciones que tienen asignado el nivel con nombre
fcil haramos el siguiente proceso:

-- Primero tenemos que obtener el id del nivel que estamos buscando

SELECT id FROM niveles WHERE nombre = "fcil";

-- "Guardamos el id" - ya sea en el lenguaje de programacin,


-- en un archivo de texto o lo memorizamos para realizar la siguiente consulta.

-- Despus filtramos las publicaciones que tengan como valor asignado


-- en la columna nivel_id el id que obtuvimos.

SELECT titulo FROM publicaciones WHERE nivel_id = 'utilizar el id guardado';

http://blog.eamexicano.com/mysql/consultas-anidadas/ 3/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

Si queremos realizar las consultas anteriores como consultas anidadas.


eamexicano +
Revisamos en el esquema cmo estn relacionadas las publicaciones con los niveles. En
este caso es una relacin 1:M donde un nivel tiene muchas publicaciones y una publicacin
pertenece a un nivel -. En la tabla de niveles no hay referencia de las publicaciones, pero en
la tabla de publicaciones hay una columna nivel_id que hace referencia a la columna id
de la tabla niveles.

-- Con los datos que tenemos - el nombre de nivel

-- - sabemos que necesitamos obtener el id para,


-- despus utilizarlo y filtrar las publicaciones

-- que en la columna nivel_id tengan ese valor.

SELECT id FROM niveles WHERE nombre = "fcil";

-- Despus definimos la consulta siguiente consulta

-- - obtener las publicaciones que en la columna nivel_id


-- tengan el valor que se obtuvo de la consulta anterior -

-- pero, en lugar de asignar directamente el valor,


-- utilizamos un parntesis.

SELECT titulo FROM publicaciones WHERE nivel_id = ( );

-- Dentro de los parntesis utilizamos la consulta interna,


-- la - primer - consulta que nos va a devolver el resultado que necesita

-- la consulta externa - la segunda consulta - para funcionar.

SELECT titulo FROM publicaciones WHERE nivel_id = (

SELECT id FROM niveles WHERE nombre = "fcil"


);

http://blog.eamexicano.com/mysql/consultas-anidadas/ 4/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

eamexicano +

Es posible utilizar los distintos operadores de comparacin que hemos visto para ltrar los
resultados obtenidos de las consultas anidadas.

Recuerdas AND y OR y para qu se utilizaban? Si adems mostrar el ttulo de las


publicaciones que tienen asignado el nivel con nombre fcil queremos mostrar nicamente
las publicaciones tengan el trmino html en el ttulo, adems de ltrar por el nivel id,
tendramos que agregar la condicin para ltrar por ttulo.

SELECT titulo FROM publicaciones WHERE nivel_id = (

SELECT id FROM niveles WHERE nombre = "fcil"


) AND titulo LIKE "%html%";

http://blog.eamexicano.com/mysql/consultas-anidadas/ 5/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

eamexicano +

Algunos aspectos a considerar cuando trabajemos con consultas anidadas:

1. Las consultas anidadas deben devolver el valor correspondiente a una columna.


2. Si el resultado arroja ms de un registro utilizar el operador apropiado en la consulta
exterior IN / NOT IN en lugar de igual -.
3. Cada consulta se ejecuta de manera individual. Si se utilizan muchas consultas
internas afecta el desempeo.
Si queremos obtener el ttulo de las publicaciones que ha escrito Eileen (no tenemos el
nombre completo) con el nivel fcil quedara una consulta como la siguiente:

SELECT titulo FROM publicaciones WHERE nivel_id IN (

SELECT id FROM niveles WHERE nombre LIKE "%facil%"

) AND usuario_id IN (
SELECT id FROM usuarios WHERE nombre LIKE "%Eileen%"

);

http://blog.eamexicano.com/mysql/consultas-anidadas/ 6/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

eamexicano +

Misma consulta anterior pero ltrando los resultados para mostrar las publicaciones que
tengan en el ttulo el trmino css.

SELECT titulo FROM publicaciones WHERE nivel_id IN (


SELECT id FROM niveles WHERE nombre LIKE "%facil%"

) AND usuario_id IN (

SELECT id FROM usuarios WHERE nombre LIKE "%Eileen%"

) AND titulo LIKE "%css%";

http://blog.eamexicano.com/mysql/consultas-anidadas/ 7/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

eamexicano +

eamexicano

Finalmente cmo podemos obtener el ttulo de las publicaciones que tienen la etiqueta
html?
En este caso es una relacin M:M donde una etiqueta puede clasi car muchas publicaciones
y una publicacin puede estar clasi cada por muchas etiquetas.

Si recordamos, para este tipo de relaciones se crea una tabla de unin JOIN TABLE
donde se encuentran las llaves primarias de las tablas que est uniendo.

El proceso a realizar sera:

1. Obtener el id de la etiqueta que tiene el nombre html.


2. Con el id de la etiqueta tenemos que obtener las llaves primarias de las publicaciones
en la tabla de unin.
3. Con las llaves primarias de las publicaciones obtener el ttulo de las mismas.

http://blog.eamexicano.com/mysql/consultas-anidadas/ 8/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

--
eamexicano
Obtener el id de la etiqueta que tiene el nombre html.
+
-- Vamos a nombrar esta consulta como "consulta_1"

SELECT id FROM etiquetas WHERE nombre LIKE "%html%";

-- Con el id de la etiqueta tenemos que obtener

-- las llaves primarias de las publicaciones en la tabla de unin.

-- Vamos a nombrar esta consulta como consulta_2

SELECT publicacion_id

FROM etiquetas_publicaciones

WHERE etiqueta_id = ( "consulta_1" );

-- Con las llaves primarias de las publicaciones obtener el ttulo de las mismas.

-- Vamos a nombrar esta consulta como consulta_3

SELECT titulo

FROM publicaciones

WHERE id IN ("consulta_2");

-- Preparamos la sintaxis de la consulta

-- anidada con las consultas 1 y 2

SELECT publicacion_id
FROM etiquetas_publicaciones

WHERE etiqueta_id = (

SELECT id FROM etiquetas WHERE nombre LIKE "%html%"

);

-- Preparamos la sintaxis de la consulta

-- anidada con las consultas 2 y3

SELECT titulo

FROM publicaciones

WHERE id IN (

SELECT publicacion_id
FROM etiquetas_publicaciones

WHERE etiqueta_id = (

"consulta_1 "

)
);

-- Ahora si, hacemos la consulta anidada

http://blog.eamexicano.com/mysql/consultas-anidadas/ 9/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

-- con las consultas 1,2 y 3


eamexicano +
SELECT titulo

FROM publicaciones

WHERE id IN (

SELECT publicacion_id
FROM etiquetas_publicaciones

WHERE etiqueta_id IN (

SELECT id FROM etiquetas WHERE nombre LIKE "%html%"

)
);

Aunque el desempeo se puede ver afectado por factores como el nmero de registros en
las tablas involucradas, el tipo de relacin a ltrar y los ltros adicionales a la relacin y al

http://blog.eamexicano.com/mysql/consultas-anidadas/ 10/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

principio pueden parecer complicadas, las consultas anidadas nos pueden ayudar en el
eamexicano
primer caso que se plante:
+

Qu podemos hacer cuando queremos obtener datos relacionados a un registro que estn
almacenados en otra tabla?

Para poderlas utilizar es conveniente:

1. Revisar los datos con los que contamos.


2. De nir los datos que nos interesa obtener.
3. Analizar la manera en cmo estn relacionadas las tablas donde estn los datos de
esto depende la cantidad de consultas -.
4. Ir haciendo las consultas de manera individual.
5. Una vez que estn hechas y que se obtenga el resultado, reescribir las consultas
individuales en una consulta anidada.
Te preguntars, si ya hice las consultas para qu convertirlas en una consulta anidada? Para
tener la estructura de la consulta y nicamente sustituyas valores cuando necesites que el
trmino de bsqueda sea distinto.

Ej.

Si en lugar de querer el ttulo de las publicaciones que tienen el nivel fcil quieres las que
tienen el valor difcil, lo nico que tienes que hacer es cambiar el trmino.

Comprtelo:

Twitter Facebook Google LinkedIn Pocket Reddit Tumblr

Esta entrada fue publicada en MySQL el 24/08/2015 [http://blog.eamexicano.com/mysql/consultas-


anidadas/] .

http://blog.eamexicano.com/mysql/consultas-anidadas/ 11/12
16/8/2017 Consultas en ms de una tabla I - Consultas Anidadas - eamexicano

0 Comments
eamexicano
eamexicano
+
1 Login

ordenar por el mejor


Recomendar Compartir

Comienza la discusin...

INICIAR SESIN CON

O REGISTRARSE CON DISQUS ?

Name

S el primero en comentar.

TAMBIN EN EAMEXICANO

lepet.js XMLHttpRequest
2 comments hace 2 aos 1 comment hace 2 aos
eamexicano Hola Albin. Desde mi Juan Cuellar excelente aporte
punto de vista el uso de los atributos data
dentro del HTML puede terminar como el
uso de las etiquetas style para modificar
Mapbox Habilitar Apache en Yosemite
1 comment hace 2 aos 1 comment hace 2 aos
James Albert Wesker Hola, sabes Jorge Hola! Realice todos estos paso y
como se hace para delimitar los estados funcion hasta cuando abr en safari
de mexico mediante match id para no http://localhost/, con lo cual abrir "It

http://blog.eamexicano.com/mysql/consultas-anidadas/ 12/12