coge la información y corre

INNER JOIN para unir Tablas

15 de marzo del 2006 Escrito por Alex Barros

Ver también: Explicación visual de los SQL Join
Ver también: Hacer Múltiples Join en una sola Sentencia

Muy bien, aprendices del Sql, hoy hablaremos de la instrucción INNER JOIN. Muy útil para casos concretos.

Primero de todo vamos a crear una situación hipotética:

Imaginemos que tenemos que hacer una web que contiene unos artículos en referencia a comentarios de novelas, y que son doce escritores de prestigio los que van introduciendo esas críticas.

Lo normal y más básico para un programador sería pensar en base de datos y lenguaje dinámico. Una buena elección podría ser trabajar con PHP y MySql (aunque para lo que voy a decir basta con una base de datos de tipo Sql).

Lo primero que nos viene a la mente es: haré una tabla, llamémosla criticas. En ella almacenaríamos cada artículo. Los campos básicos serían ID, Libro, Escritor (del libro, nunca confundir con el autor de la crítica), Editorial, año … y Autor de la crítica.

Pero y si quisiéramos, como es normal, poner en la misma crítica una referencia al autor de la critica, aúnque sólo sea un pequeño texto biográfico? Tendríamos que repetir un mismo texto repetidas veces en la base (la biografia de doce autores en, pongamos 150 registros) y si quisieramos modificarlo y hubiera 70 entradas con ese autor… eso sería un desastre.

http://modulos.zumbe.net/imagenes/inner_join_criticas.gif

Entonces queda claro que hay que hacer una referencia a otra tabla que contenga a los autores, con sus respectivos datos. La tabla autores. Cada autor tendría su ID, su nombre y su biografía, además de otros datos como webpage, e-mail, bibliografía…

Algunos dirían: pues fácil, haces dos querys a la base. en uno le dices

  1. SELECT * FROM criticas WHERE ID =’37′

y en otra

  1. SELECT * FROM autores WHERE

where qué? tendrías que sacar una variable de sql a php, otra vez a sql…
Nada! Si alguien sugiere eso desconfiad de él y de su familia (es broma ;D) existe un método sencillo y eficaz: el INNER JOIN

Tan sencilla es la sentencia como:

  1. SELECT * FROM criticas INNER JOIN autores ON criticas.autor = autores.id WHERE criticas.id=’7′

De esta forma estamos uniendo las dos tablas, cada vez que en criticas el autor sea n, en autores se unirá su correspondiente fila, con id=n.

Traduciendo al español la sentencia dice exactamente:

SELECCIONA TODOS LOS CAMPOS UNIENDO criticas CON autores DONDE el campo autor de la tabla criticas SEA IGUAL A el campo id de la tabla autores EN EL REGISTRO EN QUE el id de criticas sea 7

En definitiva, el inner join une dos tablas, donde encajan un campo de una con el mismo de la otra.

A partir de ahora las tablas se hacen más manejables y flexibles.

Y recordad!:

  • Para seleccionar campos de cada tabla : tabla.campo universal en sql, dato importante.
  • Estructura del inner join: SELECT campos FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
  • Antes de hacer barbaridades con vuestras bases de datos documentaos un poco, lo digo por experiencia ;)

Categorias: Código, HOWTO/CóMO, MySQL |

En la ca-lle-lle veinticua-tro-tro, han escri-to-to un comenta-rio-rio

Hay 30 comentarios, pero nos falta el tuyo

Hacker Ha dicho:

Está muy bien, pero yo necesito como unir más de dos tablas, espero que puedan ayudarme… gracias

McGregor Ha dicho:

Hola, he estado leyendo tu artículo, y quería preguntarte a cerca de un INNER JOIN distinto al que tienes aqui. Estoy intentando juntar los datos de dos DB distintas, pero que son iguales (en estructura, nombres de las tablas y relaciones). El problema es que tienen una autonumérico como clave primaria y además hay valores que existen en las dos tablas (con el mismo autonumérico). El problema está en que quiero coger lo que hay en una DB y lo que no esté en la otra quiero añadirlo.

Gracias por tu tiempo

Un saludo

endre Ha dicho:

buenos dias necesito que me saquen de una duda. tengo varias tablas y necesito enviarlas todas a una sola hoja para lograr imprimir esta. el problema esta en que no se como hacer por favor ayudenme!!!! es urgente enviaeme la resp a mi correo por favorrr

Alex Barros Ha dicho:

Hola endre, no me gustar ser descortés; pero como tu lo has sido, yo tamién lo sere:

Aqui no somos criados de nadie. Si tienes una duda y podemos ayudarte, lo haremos con mucho gusto, pero tómate la molestia de hacerlo respetuosamente, y explicando mejor el problema. Si tienes prisa no es nuestro problema.

thelookus Ha dicho:

Hola Alex, excelentes explicaciones, tanto este artículo como el de explicación visual…
Te comento que tengo una base de datos con 5 tablas (libros, autor, editorial, cat, subcat), la tabla “libros” contiene los id de las otras tablas. Lo que necesito es devolver en una consulta todos los datos de libros, algunos albergados en dicha tabla y otros en el resto de las tablas (ej. nombreEditorial, nombreAutor, nombreCat, etc…). Ante todo, muchas gracias por el tiempo, y mis disculpas por lo básico de mi pregunta, mi nivel es inicial. Gracias. Lucas.

juan jose Ha dicho:

Que tal, he estado buscando por mucho una respuesta a una duda y creo que estoy cerca. podrias ayudarme a decifrar esto: tengo tres tablas y necesito unir dos a una con el mismo campo.

Alex Barros Ha dicho:

Supongo que un Inner Join podría ser una buena solución.

Si lees este tutorial los INNER JOIN te serán muy sencillos.

DarkMelvinn Ha dicho:

Necesito la forma de trabajar con el INNER JOIN para programar en oracle.net, he encontrado varias formas de trabajarla pero todas son muy confuzas, no se si tienen una que sea más explicita, que no tenga muchas cosas inutiles, que sea directa y entendible.. gracias…

ruben Ha dicho:

Hay otras formas que son mas standard, que se pueden utilizar en oracle, sql, sybase, entre otras: Seria así y segun la info que necesitemos:

Para cualquier base de datos así funciona
SELECT a.libro,a.escritor,a.critica,b.autor,b.biografia
FROM criticas a,autores b
where a.autor = b.id
and b.id=‘7′

Si mal no me recuerdo en SQL también se puede realizar de la siguiente manera:
SELECT a.*,b.autor,b.biografia
FROM criticas a,autores b
where a.autor = b.id
and b.id=‘7′

Espero poder ayudarlos. Saludos

ricardo Ha dicho:

si me podrias ayudar..
tengo 2 tablas iguales en campos, en una tabla(tbinfoant) tengo registros:
CREATE TABLE [dbo].[TBInfoant] (
[BD] [varchar] (50) NULL ,
[propietario] [char] (10) ,
[name] [varchar] (100) ,
[tipo] [char] (2) ,
[fecha] [datetime] NULL
) ON [PRIMARY]

insert into tbinfo (bd,propietario,name,tipo,fecha)values(‘perfunlab’,'dbo’,'buscarobjetos’,'p’,’22/03/2009′)
insert into tbinfo (bd,propietario,name,tipo,fecha)values(‘perfunlab’,'dbo’,'tabla1′,’p',’24/03/2009′)

y en mi2da tabla(tbinfo)
CREATE TABLE [dbo].[TBInfoant] (
[BD] [varchar] (50) NULL ,
[propietario] [char] (10) ,
[name] [varchar] (100) ,
[tipo] [char] (2) ,
[fecha] [datetime] NULL
) ON [PRIMARY]

insert into tbinfo (bd,propietario,name,tipo,fecha)values(‘perfunlab’,'dbo’,'buscarobjetos’,'p’,’24/03/2009′)
insert into tbinfo (bd,propietario,name,tipo,fecha)values(‘perfunlab’,'dbo’,'curcursos’,'p’,’24/03/2009′)
insert into tbinfo (bd,propietario,name,tipo,fecha)values(‘perfunlab’,'dbo’,'tabla1′,’p',’24/03/2009′)
insert into tbinfo (bd,propietario,name,tipo,fecha)values(‘perfunlab’,'dbo’,'buscartabla’,'p’,’24/03/2009′)

si yo hago esta consulta
select distinct tbinfo.bd,tbinfo.propietario,tbinfo.name,tbinfo.tipo,tbinfo.fecha
from tbinfo
inner join tbinfoant on
tbinfoant.bd=tbinfo.bd and tbinfoant.name=tbinfo.name and tbinfoant.tipo=tbinfo.tipo

me saldria como resultado 2 registros con name: tabla1, name:buscarobjetos.

…??? lo que yo quiero es que me salga los datos que no coincidan osea
kiero una consulta que genere(como hay 2 registros que se repite , quiero que reporte los otros 2 registros que no se repiten(ene ste caso kiero reportar que aparesca name: curcurso y name:buscartabla.

si me peudes ayudar…gracias

alfonso Ha dicho:

hola buenas tardes.

he podido establecer la union de mis dos tablas, aparecen los nombres de los campos, pero no me aparecen datos, solicito de tu valiosa ayuda y sobre todo de tu tiempo, que puedo hacer?

kike Ha dicho:

hacker puedes unir varias tablas utilizando recursivamente en inner join ;)

Alejandro Ha dicho:

Hola Amigo, buena por no decir excelente tu explicacion, tambien la explicación visual, muchas veces los profesores dejan que decir con sus explicaciones q lo unico que hacen es confundir y tenemos q investigar para seguir aprendiendo del conocimiento, pero tu explicacion me quedo claricimo a algo q le tenia miendo cada vez q tenia que hacer un inner join. Seguire abansando para poderte preguntar.

gaby Ha dicho:

hola tengo un problema con las uniones, necesito realizar una consulta donde uno de los campos toma distintos nombres (para mostrarlo)con condicion diferente….al realizar la consulta me trae los valores pero no su alias

Allariz Ha dicho:

Hola, tengo una problemilla. Necesito unir varias tablas de oracle, y en una de las uniones hay un campo que puede contener el valor null en ambos extremos:

select *
from tabla1 a
INNER JOIN tabla2 b (a.CAMPO1=b.CAMPO ….)

a.CAMPO1=b.CAMPO equivale a NULL=NULL, los valores son =, pero no me devuelve ninguna consulta.

¿Que puedo hacer para que obtenga datos?

Muchas Gracias!

Boozox » Múltiples join y solución al encadenar LEFT JOINS Ha dicho:

[...] que publiqué el artículo de Inner Join para unir tablas y más especialmente el de Explicación visual de los SQL Join – Unir tablas con SQL me han [...]

jhofrank Ha dicho:

gracias por los ejemplos ^_^

loryto Ha dicho:

necesito unir tres tablas FOTO, TIPO y ALBUM

ruba Ha dicho:

Loryto, pasa más info. Que campos necesitas visualizar en la tabla, cuales son los campos que tiene cada una de tus tablas, etc etc.

Rikei Ha dicho:

hola que tal… tengo una tabla registro articulo con un id articulo y quiero que el id articulo de otra tabla llamada vehiculos sea el mismo que el de registro artuculo… les agradeceria su ayuda…gracias

manuel Ha dicho:

Gracias a vos lo entendi el inner join.Buenisima Explicacion

felipe Ha dicho:

compa muy buen ejemplo… no puede estar mejor explicado te felicito por ese gran aporte, me salvaste la vida.

Jask Ha dicho:

Muy buen artículo y muy bien explicado. No quedan muchas webs que te lo expliquen así de bien :)

Seguí así !!

Un saludo !!

Diego Ha dicho:

Muy buen artículo. Y el ejemplo con Autores y Criticas aporta mucha claridad.

Les comparto otro ejemplo práctico con INNER JOIN en php y mysql basado en Empresas y Servicios.

Ojalá les sirva de utilidad para sus aplicaciones.
Un saludo.-

El Polvo Ha dicho:

Gracias! Me salvaste de una grande!
Saludos!!!

Nikolas Ha dicho:

Muchisimas Gracias, exactamente lo que andaba buscando.

Daniel Ha dicho:

Muchas gracias…he quedado muy claro …ahora entiendo como puedo insertar datos en una tabla NaN .utilizando INSERT INTO , select + inner join. muchas gracias nuavamente.

resultados quiniela Ha dicho:

Muchas gracias

blass Ha dicho:

mi duda es
hasta cuantas tablas se pueden llegar a cruzar sin que el sistema no comience a repetir los datos?
espero puedan aclarar mi duda

Javier Ha dicho:

Es indiferente solo tienes que tomar en cuenta el orden de tus relaciones y tener mucho cuidado al usar las sentencias de agrupacion como SUM COUNT etc, el orden de los joins tambien influye en la cantidad de resultados ojo con eso

del.icio.us meneame.net RSS

Search:

Bicivalencia Localiza las estaciones de Valenbisi, servicio público de bicicletas en Valencia, España. Ver más Gpsia Descubre y comparte rutas por todo el mundo, tomadas con GPS. Ver más Imaset Edita tus imágenes de Wordpress con este sencillo plugin. Ver más

¡Mi música es tuya!

Digo yo que...

Mis fotos de Flickr

Entradas recientes

Meta:

Respeta el copyleft

,