Outer Join SQL

Embed Size (px)

Citation preview

  • 7/26/2019 Outer Join SQL

    1/12

    Consultas combinadas. JOINS

    Consultas combinadas.

    Habitualmente cuando necesitamos recuperar la informacin de una base de datos nosencontramos con que dicha informacin se encuentra repartida en varias tablas, referenciadas atravs de varios cdigos. De este modo si tuvieramos una tabla de ventas con un campo cliente,dicho campo contendra el cdigo del cliente de la tabla de cliente.

    Sin embargo est forma de almacenar la informacin no resulta muy util a la hora de consultarlos datos. SQLnos proporciona una forma facil de mostrar la informacin repartida en variastablas, las consultas combinadasoJOINS.

    as consultas combinadas pueden ser de tres tipos!

    "ombinacin interna

    "ombinacin e#terna

    $niones

    Combinacin interna.

    a combinacin interna nos permite mostrar los datos de dos o ms tablas a travs de unacondicin WHERE.

    Si recordamos los e%emplos de los capitulos anteriores tenemos una tabla de coches, en la quetenemos referenciada la marca a travs del cdigo de marca. &ara reali'ar la consultacombinada entre estas dos tablas debemos escribir una consulta SELECT en cuyacla(sula FROescribiremos el nombre de las dos tablas, separados por comas, y una

    condicin WHEREque obligue a que el cdigo de marca de la tabla de coches sea igual al cdigode la tabla de marcas.

    o ms sencillo es ver un e%emplo directamente!

    SELECT tCoches.matricula,

    tMarcas.marca,

    tCoches.modelo,

    tCoches.color,tCoches.numero_kilometros,

    tCoches.num_plazasFROM tCoches, tMarcas

    WERE tCoches.marca ! tMarcas.codi"o

    a misma consulta de forma )visual)...

  • 7/26/2019 Outer Join SQL

    2/12

    Dmonos cuenta que hemos antepuesto el nombre decada tabla a el nombre del campo, esto no es obligatoriosi los nombres de campos no se repiten en las tablas,

    pero es aconda%able para evitar con*ictos de nombresentre campos. &or e%emplo, si para referirnos al campo marca no anteponemos el nombre delcampo la base de datos no sabe si queremos el campo marca de la tabla t"oches, que contiene elcdigo de la marca, o el campo marca de la tabla t+arcas, que contiene el nombre de la marca.

    tra opcin es utili'ar la clusula INNER JOIN. Su sinta#is es identica a la de unaconsulta SELECThabitual, con la particularidad de que n la clusula FRO slo aparece unatabla o vista, a-adiendose el resto de tablas a travs de clusulas INNER JOIN.

    SELECT #ALL | DISTINCT $

    %nombre_campo& #',%nombre_campo&($FROM%nombre_tabla&

    #'INNER JOIN %nombre_tabla& ON }]#WHERE%condicion& #'AND)OR%condicion&($$

    #GROUP BY %nombre_campo& #',%nombre_campo&($$

    #HAVING%condicion'AND)OR%condicion&($$

    #ORDER BY%nombre_campo&)%indice_campo& #ASC) DESC$ #',%nombre_campo&)%indice_campo& #ASC) DESC$($$

    l e%emplo anterior escrito utili'ando la clausula INNER JOIN quedaria de la siguiente manera!

    SELECT tCoches.matricula,tMarcas.marca,

    tCoches.modelo,

    tCoches.color,

    tCoches.numero_kilometros,tCoches.num_plazas

    FROM tCoches*++ER O*+ tMarcas O+ tCoches.marca ! tMarcas.codi"o

    a clusula INNER JOINpermite separar completamente las condiciones de combinacin conotros criterios, cuando tenemos consultas que combinan nueve o die' tablas esto realmente seagradece. Sin embargo muchos programadores no son amigos de la clusulaINNER JOIN, lara'n es que uno de los principales gestores de bases de datos, OR!CLE, no la soportaba. Sinuestro porgrama debia traba%ar sobre bases de datos OR!CLEno podiamos utili'ar INNER

    JOIN. ! "artir de la #ersion OR!CLE $i oracle so"orta la cl%usula INNER JOIN.

    Combinacin E&terna

    a combinacin interna es e#cluyente. sto quiere decir que si un registro no cumple lacondicin de combinacin no se incluye en los resultados. De este modo en el e%emplo anterior siun coche no tiene grabada la marca no se devuelve en mi consulta.

  • 7/26/2019 Outer Join SQL

    3/12

    Seg(n la naturale'a de nuestra consulta esto puede ser una venta%a , pero en otros casossigni/ca un serio problema. &ara modi/car este comportamiento S0 pone a nuestra disposicin lacombinacin e#terna. a combinacin e#terna no es e#cluyente.

    a sinta#is es muy parecida a la combinacin interna,

    SELECT #ALL | DISTINCT $ %nombre_campo& #',%nombre_campo&($FROM%nombre_tabla&

    #'LEFT|RIGHTOUTER JOIN %nombre_tabla& ON }]#WHERE%condicion& #'AND)OR%condicion&($$

    #GROUP BY %nombre_campo& #',%nombre_campo&($$

    #HAVING%condicion'AND)OR%condicion&($$

    #ORDER BY%nombre_campo&)%indice_campo& #ASC) DESC$ #',%nombre_campo&)%indice_campo& #ASC) DESC$($$

    a combinacin e#terna puede ser diestra o siniestra, LEFT O'TER JOINo RI(HT O'TERJOIN. "on LEFT O'TER JOINobtenemos todos los registros de en la tabla que situemos a la

    i'quierda de la clusulaJOIN) mientras que con RI(HT O'TER JOINobtenmos el efectocontrario.

    "omo me%or se ve la combinacin e#terna es con un e%emplo.

    SELECT tCoches.matricula,

    tMarcas.marca,

    tCoches.modelo,tCoches.color,

    tCoches.numero_kilometros,tCoches.num_plazas

    FROM tCoches

    LEFT OUTER JOINtMarcas O+ tCoches.marca ! tMarcas.codi"o

    sta consulta devolver todos los registros de la tablat"oches, independientemente de que tengan marca o no. n elcaso de que el coche no tenga marca se devolver elvalor null para los campos de la tabla t+arcas. 1isualmente 2laconsulta devuelve los datos en a'ul3...

    l mismo e%emplo con 456H7 $74 859.

    SELECT tCoches.matricula,

    tMarcas.marca,tCoches.modelo,

    tCoches.color,tCoches.numero_kilometros,

    tCoches.num_plazas

  • 7/26/2019 Outer Join SQL

    4/12

    FROM tCochesRIGHT OUTER JOINtMarcas O+ tCoches.marca ! tMarcas.codi"o

    sta consulta devolver los registros de la tabla t"oches quetengan marca relacionada y todos los registros de la tablat+arcas, tengan alg(n registro en t"oches o no.

    1isualmente 2la consulta devuelve los datos en a'ul3...

    'nion

    a clusula 'NION permite unir dos o ms con%untos de resultados en uno detras del otro comosi se tratase de una (nica tabla. De este modo podemos obtener los registros de mas de una tabla)unidos).

    a sinta#is corresponde a la de varias SELECTunidas a travs de 'NION, como se muestra acontinuacin!

    SELECT #ALL | DISTINCT $

    %nombre_campo& #',%nombre_campo&($

    FROM%nombre_tabla'LEFT|RIGHTOUTER JOIN %nombre_tabla& ON }]

    #WHERE%condicion& #'AND)OR%condicion&($$#GROUP BY %nombre_campo& #',%nombre_campo&($$

    #HAVING%condicion'AND)OR%condicion&($$'

    UNION [ALL | DISTINCT ]SELECT #ALL | DISTINCT $

    %nombre_campo& #',%nombre_campo&($FROM%nombre_tabla&

    #'LEFT|RIGHTOUTER JOIN %nombre_tabla& ON }]#WHERE%condicion& #'AND)OR%condicion&($$

    #GROUP BY %nombre_campo& #',%nombre_campo&($$

    #HAVING%condicion'AND)OR%condicion&($$

    (#ORDER BY%nombre_campo&)%indice_campo& #ASC) DESC$

    #',%nombre_campo&)%indice_campo& #ASC) DESC$($$

    &ara utili'ar la clusula 'NION debemos cumplir una serie de normas.

    as consultas a unir deben tener el mismo n(mero campos, y adems los campos debenser del mismo tipo.

    Slo puede haber una (nica clausula OR*ER +, al /nal de la sentencia SELECT.

    l siguiente e%emplo muestra el uso de 'NION

  • 7/26/2019 Outer Join SQL

    5/12

    SELECT tCoches.matricula,

    tMarcas.marca,tCoches.modelo,

    tCoches.color,

    tCoches.numero_kilometros,

    tCoches.num_plazasFROM tCoches

    INNER JOINtMarcas O+ tCoches.marca ! tMarcas.codi"o-+*O+

    SELECT tMotos.matricula,tMarcas.marca,

    tMotos.modelo,

    tMotos.color,

    tMotos.numero_kilometros,

    FROM tMotosINNER JOINtMarcas O+ tMotos.marca ! tMarcas.codi"o/

    &uede observarse el uso de la constante cero en la segunda lista de seleccin parahacer coincidir el n(mero y tipo decampos que devuelve la consulta $959.

    8oin

    a sentencia-oinenS0permite combinar registrosde dos o ms tablasen unabase de datos relacional. n

    el engua%e de "onsultas structurado 2S03, hay tres tipo deJOIN! interno, e#terno, y cru'ado.

    n casos especiales una tabla puede unirse a s misma, produciendo una auto:combinacin, SELFJOIN.

    +atemticamente,JOINes composicin relacional, la operacin fundamental en el lgebra relacional, y

    generali'ando es una funcin de composicin.

    7ablas de e%emplo

    7odas las e#plicaciones que estn a continuacin usan las siguientes dos tablas para ilustrar el efecto de

    diferentes clases de unionesJOIN.

    Tabla Em"leado

    !"ellido I**e"artamento

    ;ndrade

  • 7/26/2019 Outer Join SQL

    6/12

    5ngeniera

  • 7/26/2019 Outer Join SQL

    7/12

    S"7 "amposG4+ empleado, departamentoIH4 empleado.5DDepartamento departamento.5DDepartamento

    4esultados!

    Em"leado.!"ellido Em"leado.I*de"artamento de"artamento.Nombre*e"artamento de"artamento.I**e"artamento

    ?olano &roduccin

    8ordn

  • 7/26/2019 Outer Join SQL

    8/12

    s una especiali'acin de la combinacin de equivalencia, anteriormente mencionada. n este caso se

    comparan todas las columnas que tengan el mismo nombre en ambas tablas. a tabla resultante contiene

    slo una columna por cada par de columnas con el mismo nombre.

    E.%emplo de combinacin natural!

    S"7 J

    G4+ empleado 9;7$4; 859 departamento

    l resultado es un poco diferente al del e%emplo D, ya que esta ve' la columna 5DDepartamento se muestra

    sola una ve' en la tabla resultante.

    Em"leado.!"ellido I**e"artamento *e"artamento.Nombre*e"artamento

    ?olano &roduccin

    8ordn

  • 7/26/2019 Outer Join SQL

    9/12

    ?olano 1entas

  • 7/26/2019 Outer Join SQL

    10/12

    ; diferencia del resultado presentado en los e%emplos ; y C 2de combinacin interna3 donde no se mostraba

    el empleado cuyo departamento no e#istaB en el siguiente e%emplo se presentarn los empleados con su

    respectivo departamento, e inclusive se presentar el empleado, cuyo departamento no e#iste.

    H.%emplo de tabla izquierdapara la combinacin e#terna!

    S"7 JG4+ empleado G7 $74 859 departamento 9 empleado.5DDepartamento departamento.5DDepartamento

    Em"leado.!"ellido

    Em"leado.I**e"artamento

    *e"artamento.Nombre*e"artamento

    *e"artamento.I**e"artamento

    8ordn

  • 7/26/2019 Outer Join SQL

    11/12

    n este caso el rea de +ercadeo fue presentada en los resultados, aunque a(n no hay empleados

    registrados en dicha rea.

    Combinacin com"leta 0FULL OUTER JOIN1

    sta operacin presenta los resultados de tabla i'quierda y tabla derecha aunque no tengan correspondencia

    en la otra tabla. a tabla combinada contendr, entonces, todos los registros de ambas tablas y presentar

    valores nulos 9$spara registros sin pare%a.

    J.%emplo de combinacin e#terna completa!

    S"7 JG4+ empleado G$ $74 859 departamento

    9 empleado.5DDepartamento departamento.5DDepartamento

    Em"leado.!"ellido

    Em"leado.I**e"artamento

    *e"artamento.Nombre*e"artamento

    *e"artamento.I**e"amento

    ?olano &roduccin

    8ordn

  • 7/26/2019 Outer Join SQL

    12/12

    IH4 empleado.5DDepartamento 5S 9$