MYSQL: Campos de varias tablas en la misma query

SELECT DISTINCT tabla1.campo1, tabla2.campo2 as nuevonombre, tabla3.campo3
FROM tabla1, tabla2, tabla3 WHERE tabla1.campo1=tabla3.campo1 ORDER BY
tabla2.campo2

Muchas veces necesitamos seleccionar información de diversas tablas para poder trabajar, pero como nos gusta ahorrar código pasamos de hacer varias querys, si podemos utilizar sólo una.

En el ejemplo de arriba muestro cómo utilizar un select de distintas tablas. Cosas a tener en cuenta:

– Siempre tenemos que indicar antes del nombre del campo, el nombre de la tabla en la que se encuentra, separados por un punto. Ejemplo: tabla1.campo1
– En el FROM deberán estar todas las tablas utilizadas.
– Podemos asignar campos que no tengamos seleccionados para mostrar en el WHERE.
– También podemos ordenar por campos de diversas tablas.
DISTINCT elimina las filas duplicadas, se puede dar el caso al trabajar con varias tablas.
– Si tenemos nombres de campos iguales en diferentes tablas, podemos cambiarles el nombre asignarle un nombre más corto para utilizarlas en nuestra query (no se cambiará en la bbdd) utilizando as. Ejemplo: tabla2.campo2 as nuevonombre

Advierto: Trabajar con muchas tablas y campos en la misma query puede causar problemas de cordura :P

Actualizado 08/01/2009: Mirar los comentarios! Hay más información útil!

  • 7 enero 2010
  • Programación
  • , ,

19 comments on “MYSQL: Campos de varias tablas en la misma query”

  1. Y para facilitarnos (o complicarnos :P ) más la vida, se pueden modificar los nombres de las tablas, para hacer las sentencias más cortas.

    Me explico, en vez de tener que poner en el select el nombre de la tabla antes del campo (SELECT tabla1.campo, tabla2.otrocampo), podemos acortarlo en el FROM, cuando seleccionamos las tablas de las que recogeremos los datos.

    Y para no liarlo más, pongo el mismo ejemplo que el post, pero reducido ;)

    SELECT DISTINCT t1.campo1, t2.campo2 as nuevonombre, t3.campo3
    FROM tabla1 t1, tabla2 t2, tabla3 t3
    WHERE t1.campo1=t3.campo1
    ORDER BY t2.campo2

    Así mejor, ¿no?

  2. Pues si, se pueden renombrar las tablas en el FROM ;)

    Otra cosa, cuando dices: Siempre tenemos que indicar antes del nombre del campo, el nombre de la tabla en la que se encuentra, separados por un punto.
    Eso no es del todo cierto… si los nombres de los campos no coinciden, no es necesario indicar el nombre de la tabla, aunque para una mejor comprension del la sentecia, yo siempre los pongo, eso si, acortados como te decia antes….

    Aunque quizas, si solo estamos trabajando con una tabla, tampoco es necesario. Eso ya queda al gusto del consumidor ;)

  3. Yo me aclaro mejor cuando renombro los campos como
    t1.campo1 as nombre
    sinó termino por liarme.
    La consulta sería equivalente a algo así?

    SELECT DISTINCT t1.campo1, t2.campo2 as nuevonombre
    FROM tabla1 as t1 join tabla2 as t2 on
    t1.campo1 = t2.campo1
    ORDER BY t2.campo2

    Yo es que en el SQL ando un poco pez

  4. Y no solo podemos utilizar la sentencia AS en los nombres de los campos, sino también en los nombres de las tablas. Esto es algo que nos viene igualmente muy bien si el nombre de la tabla es muy largo y/o lioso.

    @Alwaison y @José Rico ya lo han tratado muy bien en el primer caso, pero el segundo no difiere mucho:

    SELECT a.nombre, b.direccion
    FROM nombre_largo_tabla_1 AS a, nombre_largo_tabla_2 AS b
    WHERE a.id=b.id
    ORDER BY a.id

    Y además, si unimos los dos casos nos quedaría:

    SELECT a.nombre AS name, b.direccion AS address
    FROM nombre_largo_tabla_1 AS a, nombre_largo_tabla_2 AS b
    WHERE a.id=b.id
    ORDER BY a.id

  5. Saludos.

    Le comento que existe un error de concepto. No estas cambiando el nombre a ningun campo, solo se esta otorgando un nombre o identificación diferente a nivel de la vista resultante de vuestra consulta.

    Darle un nuevo nombre a una columna de datos solo seria valido si estuvieramos creando una consulta para la creación y alimentación (con data existente en otras tablas) de una nueva tabla.

    Saludos a todos! esta muy buena la pagina.

  6. Buenas, en primer lugar enhorabuena por estos post que son muy buenos, en segundo lugar os expongo un problemilla que tengo, estoy haciendo una consulta en access y cuando genero la sentencia sql:

    “SELECT TABLA_AL.ID, TABLA_AL.NOM_FICH, TABLA_AL.FEC_FIC, TABLA_AL.PROVCORTA, TABLA_AL.NIE, TABLA_AL.CIF, TABLA_AL.NIF, TABLA_CA.ID, TABLA_CA.NOM_FICH, TABLA_CA.FEC_FIC, TABLA_CA.PROVCORTA, TABLA_CA.NIE, TABLA_CA.CIF, TABLA_CA.NIF, TABLA_CO.ID, TABLA_CO.NOM_FICH, TABLA_CO.FEC_FIC, TABLA_CO.PROVCORTA, TABLA_CO.NIE, TABLA_CO.CIF, TABLA_CO.NIF, TABLA_GRA.ID, TABLA_GRA.NOM_FICH, TABLA_GRA.FEC_FIC, TABLA_GRA.PROVCORTA, TABLA_GRA.NIE, TABLA_GRA.CIF, TABLA_GRA.NIF, TABLA_HU.ID, TABLA_HU.NOM_FICH, TABLA_HU.FEC_FIC, TABLA_HU.PROVCORTA, TABLA_HU.NIE, TABLA_HU.CIF, TABLA_HU.NIF, TABLA_JA.ID, TABLA_JA.NOM_FICH, TABLA_JA.FEC_FIC, TABLA_JA.PROVCORTA, TABLA_JA.NIE, TABLA_JA.CIF, TABLA_JA.NIF, TABLA_MA.ID, TABLA_MA.NOM_FICH, TABLA_MA.FEC_FIC, TABLA_MA.PROVCORTA, TABLA_MA.NIE, TABLA_MA.CIF, TABLA_MA.NIF, TABLA_SE.ID, TABLA_SE.NOM_FICH, TABLA_SE.FEC_FIC, TABLA_SE.PROVCORTA, TABLA_SE.NIE, TABLA_SE.CIF, TABLA_SE.NIF
    FROM TABLA_AL, TABLA_CA, TABLA_CO, TABLA_GRA, TABLA_HU, TABLA_JA, TABLA_MA, TABLA_SE ”

    No me muestra los datos de las tablas, son 8 tablas, una por cada provincia de andalucía, y sólo quiero que me muestre 7 campos, los mismos 7 campos de cada una de las tablas. ¿Saben que estoy haciendo mal?
    Gracias por adelantado..

  7. Hola chicos!

    Leonardo gracias por la aclaración, ya está rectificado en el post, si que es verdad que daba a entender que cambiaría el nombre en la base de datos.

    Joaquin, esos campos son los únicos de las tablas? puedes ahorrar código escribiendo * en lugar de los nombres de las tablas para indicar que seleccionas todos los campos. En principio veo la estructura bien, lo que no entiendo es por qué haces una query para 7 tablas juntas cuando no relacionas ningún campo, no podrías hacerlas por separado? No soy muy experta, pero puede que sea por eso por lo que falle, yo de tí iría probando que funcionasen cada una por separado.

    Un saludo!

  8. Hola natali e visto todos tus ejemplos y me han servido de mucho!! pero lo qe no e visto i kieor enocntrar y ade ia!! es como agregar datos de 3 combobox en una tabla al darle click en el boton de agregar me los muestre en una tabla k esta en el mismo archivo que los combobox,,, te agradeceria mucho tu ayuda en verdad me urge estado intentando esto hace dias i ia se a vuelto un dolor de cabeza!! gracias! espreo tu respuesta

  9. Yo evitaría en la medida de lo posible hacer este tipo de consultas, dado que bloquean las tablas en cuestión y evitan poder ser utilizadas por otros usuario o consultas, cuando nos enseñan sql nos lo pintan todo muy bonito pero a la hora de la verdad la cosa cambia bastante.

  10. select
    concat(cl.nombre,’ ‘,cl.apellido1,’ ‘,cl.apellido2) as Nombre ,cl.status,
    concat(p.nombre,’ ‘,p.apellido1, ‘ ‘,p.apellido2) as Ejecutivo, s.nombre as Sucursal
    from 2_cliente cl
    inner join personal p on cl.idejecutivo = p.id
    inner join sucursal s on cl.idsucursal= s.id
    where cl.FAlta between ‘2014/08/01’ and ‘2014/09/11’
    and( s.id = “cl.IDSucursal” and p.id = “cl.Idejecutivo)

  11. Buenas tardes, quiero saber si el siguiente ejemplo esta bien lo que que pasa que tengo evaluación el sábado 25 y la profe me ha pedido unos ejemplos para trabajar EN MYSQL y no soy my bueno en esto. me podrian ayudar…

    CREATE DATABASE Mi familia;
    USE Mi familia;
    CREATE TABLE familiares (
    codigo varchar(6),
    nombre varchar(60),
    PRIMARY KEY (codigo)
    );
    CREATE TABLE nombres (
    nombre varchar(40),
    direccion varchar(80),
    edad decimal(6),
    codciudad varchar(6)
    );
    INSERT INTO familiares VALUES (‘a’, ‘Madre’);
    INSERT INTO familiares VALUES (‘b’, ‘Padre’);
    INSERT INTO familiares VALUES (‘d’, ‘Hermana’);
    INSERT INTO familiares VALUES (‘f’, ‘Hermana’);
    INSERT INTO familiares VALUES (‘h’, ‘Hermano’);

    INSERT INTO personas VALUES (‘Zoraida’, ‘su casa’, 25, ‘a’);
    INSERT INTO personas VALUES (‘Pedro’, ‘su calle’, 23, ‘b’);
    INSERT INTO personas VALUES (‘Hermana’, ‘calle uno’, 22, ‘d’);
    INSERT INTO personas VALUES (‘Dameilis’, ‘calle uno’, 21, ‘f’);
    INSERT INTO personas VALUES (‘Jhon Carlos’, ‘calle uno’, 20, ‘h’);

  12. hola… tengo una duda y espero me puedan ayudar

    en una consulta a multiples tablas se puede ocupar las funciones como COUT o AVG… tengo la siguente query

    SELECT modulo.mo_cod, modulo.mo_nombre, seccion.se_nombre, cliente.count(cl_nom)FROM cliente, matricula, modulo, seccion WHERE cliente.cl_id = matricula.cl_id AND matricula.mo_cod = modulo.mo_cod AND modulo.se_id = seccion.se_id
    AND modulo.per_id = ‘1’

    y por el hecho de poner el count me arroja un error

    espero me puedan ayudar

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *