Aprende más allá de este tutorial en los Cursos de Bases de Datos de Platzi.
Muchas veces es necesario consultar a mas de una tabla y debemos aprender a poder obtener los resultados correctos de la manera mas eficiente y sencilla, para lo cual vamos a usar las siguientes tablas, sacadas de un sistema de gestión de bodegas que estamos preparando para la logística en islas claber
Tablas que usaremos
Usaremos 3 tablas en este ejemplo donde la tabla us2bod nos servirá para relacionar las tablas bodegas y usuarios varios a varios
Creando las consultas
Conozco 2 formas de usar JOIN deben existir otras mas pero hasta ahora con estas me basta, uso INNER JOIN cuando quiero que solo lo resultados incluidos en el JOIN aparezcan en los resultados y LEFT JOIN cuando quiero que todos los resultados aparezcan independiente de si están o no incluidos en el JOIN, ahora vamos a hacernos algunas preguntas para poder poner en practica estos conceptos.
Consejo importante :
Atento a la forma abreviada de poner alias a las tablas
Consulta con uso de INNER JOIN:
Primero vamos a ver quien tiene acceso a que bodega con el uso de INNER JOIN
Código :
SELECT u.us_nombre usuario, b.bod_nombre bodega FROM us2bod ub INNER JOIN usuarios u ON ub.us_id = u.us_id INNER JOIN bodegas b ON ub.bod_id = b.bod_id
Esto dará como resultado
Consulta con uso de LEFT JOIN:
Ahora vamos a ver a los usuarios que NO tienen bodegas asociadas, para lo cual preguntaremos que usuarios no se pudo asociar a alguna bodega
Código :
SELECT u.us_nombre usuario FROM usuarios u LEFT JOIN us2bod ub ON u.us_id = ub.us_id WHERE ub.u2b_id IS NULL
Lo cual nos dará:
Espero que esto les sirva y les saque de mas un apuro (o lo metas en mas de uno si van a la bodega que tengo en casa).
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Freddie el 30 de Agosto de 2009
Por jpcw el 30 de Agosto de 2009
Por diego el 30 de Agosto de 2009
Me gustó el tutorial. No sé si van a publicar mi comentario (ya que están acostumbrados a no hacerlo).
Por eldervaz el 30 de Agosto de 2009
lo del * mas q traer muchos datos, probablemente innecesarios, es que el motor de DB antes de hacer el query hace una validación de lista de campos (SHOW COLUMNS) que internamente ya hace una validación de tipo de data. Todo esto nos da más procesos que como bien dice Inyaka es fatal
Por daz_angie el 30 de Agosto de 2009
Así que desde el principio hagan bien las DB.
Por eldervaz el 30 de Agosto de 2009
daz_angie-blog :
Así que desde el principio hagan bien las DB.
mmm, eso depende, si es simples tablas llamadas asi a lo bruto, pues si esta mal.
Sin embargo, dependiendo de la estructura y la tecnología a usar, por ejemplo, la creación de Cubos en Business intelligence te obliga a crear una copia de, por ejemplo 300 tablas normalizadas para ser unida en un cubo (hay otros como estrellas, copo de nieve, et. pero me gusta mas los cubos) para ser utilizado en un Datawarehouse. Esto logra tener una copia, casi siempre actualizable por las noches, que te permite búsquedas muy pero muy rápidas ya que es una única "tabla" de quizás 300 o 1000 campos. Esto es usado por entidades del estado o transnacionales con gran presupuesto. Hacer consultas a varias tablas normalizadas y con muchos join y muchas peticiones por segundos, es un desastre.
Usualmente, el curso en las universidades de Datawarehouse, dataMart y Business intelligence son en el último semestre despues de toda una vida de normalización jeje
Lastimosamente yo solo lo hice con Microsoft y ORACLE, y nunca pude encontrar una solución para php y mysql. Aunque ahora con que php puede correr en un server microsoft, quien sabe
Por Mauricio el 31 de Agosto de 2009
Me gusta la nomenclatura que utilizan para nombrar tablas y atributos (prefijo_nombre por ej), necesito encontrar información o referencia de esto para mi trabajo de titulo pero no he podido encontrar ninguna información.
Si Cristalab se guía por una forma de nomenclatura supongo que alguien podría darme esa información.
Gracias
Por Inyaka el 31 de Agosto de 2009
si encuentras información al respecto escribe un tip
Por Chekelin el 31 de Agosto de 2009
Estos ultimos joins solo que se aplican a datos que no tienen correspondencia con otras tablas, por eso de 'izquierda' y 'derecha'.
Sabía que la Inteligencia de Negocios se usa para obtener información de todo el conjunto de datos en la BD, pero eso que acabas de poner la verdad ni en cuenta, buen dato
Por NEO_JP el 04 de Septiembre de 2009
Por wariodiaz el 20 de Septiembre de 2009
en cuanto a la nomenclaturas, no existe un convenio real para aplicar nombres a bases de datos tablas etc. como menciona es sentido comun. casi siempre se hace una convención de nombres en un proyecto en el cual se define en BD por ejemplo que caracteristicas deve de tener un tabla que caracteristicas deve de tener el nombre de la BD. etc esto aplica para los lenguajes de programacion que en la convención se define como se le llamara a una clase, a un metodo, variables, costantes, como se redactara la documentacion etc.
siempre es bueno tener un convención costante en los trabajos, pero no hay ni un estandar hay algunas convenciónes donde se coiciden pero no es un estadar o algo que estemos obligados a seguir mas inembargo es una de las mejores practicas que podemos llevar a cabo.
Por ELIOMAR el 11 de Noviembre de 2009
Por maria el 23 de Noviembre de 2009
Por Inyaka el 22 de Abril de 2010
Por Juan Pablo el 23 de Mayo de 2010
u.us_nombre usuario
no entiendo que viene siendo u. porq lo demas me imagino q es el nombre del campo y seguido como queremos el encabezado, al poner (usuario) al frente, o no es asi?
a mi me sale error porque me dice:
"Unknown column 'a.modelo' in 'field list'" el campo se llama modelo pero no se lo de antes como utilizarlo, espero me haya hecho entender y gracias...
Por aristorp el 26 de Agosto de 2010
Por Inyaka el 26 de Septiembre de 2010
Por vania el 16 de Noviembre de 2010
Por leoenelnarciso@hotma el 11 de Mayo de 2011
Por macto el 28 de Julio de 2011
Por fived2 el 25 de Agosto de 2011
Gracias!
Por Lary el 05 de Octubre de 2011
Por Irving el 07 de Octubre de 2011
Por tales que tales el 26 de Diciembre de 2011
SELECT u.Nombre AS name, g.Nombre
FROM usuarios u, grupos g
WHERE g.Id_usuario = u.Id AND u.Id = '$id_usuario'
LIMIT 1
Por Inyaka el 03 de Enero de 2012
Por martina el 25 de Abril de 2012
Por Flowers el 26 de Julio de 2012
Por Pako el 27 de Julio de 2012
Por Ricardo el 30 de Agosto de 2012
Por jesus matos el 29 de Enero de 2013
Por oscarlosan el 21 de Marzo de 2013
lo anterior:
----------------
usuarios (id, …)
bodegas(id, …)
us2bod(id, idUsuario, idBodega).
más 2 tablas(pq es una relación n:m al igual que la anterior):
-------------------------------------------------------------------
idiomas(id,…)
us2idi(id, idUsuario, iIdioma)
Los usuarios pueden hablar más de un idioma y lógicamente un determinado idioma puede ser hablado por varios usuarios.
Entonces sin necesitamos saber los usuario con sus bodegas e idiomas, habría que:
1) realizarlo en la misma consulta (1 consulta en total)
2) realizar otra consulta idéntica a la anterior (es decir dos consultas en total)
que es más productivo para una aplicación en PHP? es decir con cual gano más velocidad.
En el caso de que se pudiera hacer en una una sola consulta, ¿como sería la consulta en SQL?
un saludo y gracias.
Por maicol el 07 de Mayo de 2013
tengo bastantes campos de diferentes tablas
Por Inyaka el 09 de Mayo de 2013
maicol-blog :
tengo bastantes campos de diferentes tablas
Código :
Por ivxn25 el 02 de Agosto de 2013
Por yahaira el 10 de Agosto de 2013
se puede hacer eso?
Por EMMI el 14 de Septiembre de 2013
Por Miguel el 27 de Septiembre de 2013
aun tengan varias
Por Daniel el 07 de Diciembre de 2013
Por Andre el 19 de Diciembre de 2013
Por Adrita el 17 de Julio de 2014
Por Gloria el 27 de Julio de 2014
Por German el 22 de Agosto de 2014
Por PlasticDoll el 26 de Agosto de 2014
Por DanyFelz el 15 de Septiembre de 2014
Por sofia el 02 de Noviembre de 2014
$query = "SELECT venta.fecha, cliente.username, cliente.email, producto.nombre, ventaprod.precio_compra, ventaprod.precio_venta,ventaprod.cantidad,venta.total
FROM cliente, venta, ventaprod, producto
inner join venta on cliente.id = venta.id_cliente
inner join ventaprod on venta.id = ventaprod.id_venta
inner join ventaprod on producto.id = ventaprod.id_producto "."";
y me marca error, dice Not unique table/alias: 'venta'.En que la estoy regando?. Gracias
Por Luis Balogh el 28 de Diciembre de 2014
Se puede hacer la misma consulta, pero que solo se repita UNA vez el nombre ? me explico:
XK | Medicamentos
Freddie | Materiales
null | Medicamentos
siddarta | Drogas y alcohol
Inyaka |Alimentos
null |Materiales
null |Medicamentos
null |Drogas y Alcohol
-- Si no se puede en consulta sql, como hacer que en mi reporte en php solo aparesca una vez el nombre?
de ante mano muchas gracias
Por Inyaka el 29 de Diciembre de 2014
Por Erickson el 08 de Febrero de 2015
Por Adrian el 28 de Febrero de 2015
Gracias
Por Gadriv el 06 de Mayo de 2015
gracias de antemano.
Por Inyaka el 07 de Mayo de 2015
http://www.w3schools.com/sql/sql_insert_into_select.asp
para el resto usa la imaginación
Por nancy benitez romero el 01 de Junio de 2015
Por chaneysi el 01 de Junio de 2015
gracias mis tiernas guapuritas los quiero mil besos y abrazos.
Por ReckD el 14 de Junio de 2015
Por No me sitrvio de nad el 21 de Junio de 2015
Por nelson el 03 de Julio de 2015
Por swarez el 29 de Julio de 2015
Por Edwin el 02 de Septiembre de 2015
Por Cristobal el 14 de Noviembre de 2015
Por GRACIAS el 14 de Noviembre de 2015
Por el 05 de Febrero de 2016
Saludos!!!
Por clemente el 13 de Febrero de 2016
Por David el 01 de Marzo de 2016
Por Inyaka el 02 de Marzo de 2016
Por La monda el 17 de Marzo de 2016
Por hola el 02 de Mayo de 2016
Por raulito el 15 de Junio de 2016
Por juancho el 12 de Agosto de 2016
IN EN TEN DI BLE
Eso que se como hacer JOIN CROSS DB que ASCO
Por Juan el 26 de Octubre de 2016
Por JM el 01 de Diciembre de 2016
Por Marc el 22 de Diciembre de 2016
Por anzon el 29 de Diciembre de 2016
Gracias por el aporte
Por Julius el 21 de Enero de 2018
Por Eddy el 22 de Mayo de 2018