Florian Langer: Unterschied LEFT JOIN + LEFT OUTER JOIN & RIGHT

Liebes Selfforum!

Da ich in diesem Forum eben einige MySQL-Frage entdeckte,
schätze ich daß meine Frage hier wider meiner Vermutung doch gut aufgehoben sein könnte.

Da ich zu früh aufwachte, nahm ich mir ein Herz und lernte JOIN's von MySQL.

Diese drei Join-Arten habe ich verstanden:
      INNER JOIN   -    RIGHT JOIN     -   LEFT JOIN

Nicht verstanden habe ich hingegen diese Join-Arten:
      RIGHT OUTER JOIN    -   LEFT OUTER JOIN

Falls jemand weiß, was ein RIGHT OUTER JOIN und ein LEFT OUTER JOIN macht,
dann bitte antworten, ich würde mich sehr freuen.

INNER JOIN,  RIGHT JOIN  und LEFT join verstehe ich schon.

Die ganze Frage bezieht sich auf MySQL !!

Besten Dank ans Selfforum,
Florian Langer

  1. Hello,

    LEFT JOIN kannst Du auch mit einem WHERE-Statement schreiben.
    Es wird das karthesische Produkt beider Tabellen gebildet (wenn Du zwei verbindest)
    und dann darauf die Filterbedingung angewendet.

    Es bleiben daher nur die Zeilen übrig, bei denen die Vergleichswerte in beiden Tabellen vorhanden sind.

    Wenn Du nun ein LEFT OUTER JOIN aufbaust, wird die Linke Tabelle vollständig wiedergegeben und durch die Daten der Rechten Tabelle ergänzt, sofern diese welche beisteuern kann. Die Ergebnismenge geht anschließend noch durch ein ggf. vorhandes "Where-Filter"

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hello,

      LEFT JOIN kannst Du auch mit einem WHERE-Statement schreiben.
      Es wird das karthesische Produkt beider Tabellen gebildet (wenn Du zwei verbindest)
      und dann darauf die Filterbedingung angewendet.

      Nein.

      Es bleiben daher nur die Zeilen übrig, bei denen die Vergleichswerte in beiden Tabellen vorhanden sind.

      Nein. Das ist der INNER JOIN.

      Wenn Du nun ein LEFT OUTER JOIN aufbaust, wird die Linke Tabelle vollständig wiedergegeben und durch die Daten der Rechten Tabelle ergänzt, sofern diese welche beisteuern kann. Die Ergebnismenge geht anschließend noch durch ein ggf. vorhandes "Where-Filter"

      Ja, genauso wie beim LEFT  JOIN.

      Gruss Daniela

      1. Hello,

        Es bleiben daher nur die Zeilen übrig, bei denen die Vergleichswerte in beiden Tabellen vorhanden sind.

        Nein. Das ist der INNER JOIN.

        Danke für's Aufpassen ;-)

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. echo $begrueszung;

          Danke für's Aufpassen ;-)

          Apropos... Darf ich dich freundlich darauf aufmerksam machen, dass kartesisch nicht von Kart_h_ago kommt sondern sich auf Renatus Cartesius (Rene Descartes) bezieht?

          echo "$verabschiedung $name";

          1. Hello,

            Apropos... Darf ich dich freundlich darauf aufmerksam machen, dass kartesisch nicht von Kart_h_ago kommt sondern sich auf Renatus Cartesius (Rene Descartes) bezieht?

            Also heute gebt Ihr es mir aber wieder :-)

            Wieviele Dimensionen darf denn ein kartesisches Produkt haben?

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. echo $begrueszung;

              Wieviele Dimensionen darf denn ein kartesisches Produkt haben?

              Ich vermute mal beliebig viele?

              Alles weiß ich auch nicht. Ich hab ja nicht studiert :-)

              echo "$verabschiedung $name";

  2. Hi Florian

    Diese drei Join-Arten habe ich verstanden:
          INNER JOIN   -    RIGHT JOIN     -   LEFT JOIN

    Nicht verstanden habe ich hingegen diese Join-Arten:
          RIGHT OUTER JOIN    -   LEFT OUTER JOIN

    Doch, hast du. Das OUTER ist einfach nur optional. Was noch fehlt ist der FULL OUTER JOIN. Da werden einfach beide Seiten falls nötig mit NULL ergänzt und nicht nur eine wie bei LEFT/RIGHT.

    Gruss Daniela

    1. Liebe Daniela,  Liebes Selfforum!

      Deine Antwort erfreut mich,
      schön dass LEFT JOIN und LEFT OUTER JOIN bzw. RIGHT JOIN und RIGHT OUTER JOIN Synonyme sind!

      Eine Frage drängt sich mir nätürlich noch auf:
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      Was passiert, wenn im CREATE TABLE Syntax die Spalten
      als NOT NULL definiert wurden,  und der RIGHT/LEFT OUTER JOIN
      ein nicht vorhandenes Feld mit NULL auffüllen versucht?

      ++++++++++++++++++++++++++++++++++++++++++++++

      Weiters:
      Wie schaut ein FULL OUTER JOIN aus?

      Ich habe 2 MySQL-Tabellen angelegt,
      und ich dachte mir falls Dir dazu ein Example einfällt
      wie ein FULL OUTER JOIN dazu aussieht,
      könntest Du es mir ja vielleicht sagen.
      Wäre ganz lieb :o)

      Konstantin lebt in einer Stadt mit einer ID die es nicht gibt.
      Und in München lebt gar keiner.
      Reicht das um einen FULL OUTER JOIN zu veranschaulichen?

      Besten Dank liebe Daniela bzw. an alle anderen Leser
      Florian Langer

      mysql> SELECT * FROM schueler;
      +----+-----------------+-------+
      | id | name            | wo_id |
      +----+-----------------+-------+
      |  1 | Philipp         |    1  |
      |  2 | Richard         |    1  |
      |  3 | Katharina       |    2  |
      |  4 | Konstantin      |    4  |
      +----+-----------------+-------+
      4 rows in set (0.00 sec)

      mysql> SELECT * FROM wohnort;
      +----+-----------+
      | id | stadt     |
      +----+-----------+
      |  1 | Frankfurt |
      |  2 | Rammstein |
      |  3 | München   |
      +----+-----------+
      3 rows in set (0.00 sec)

      1. Hallo,

        Eine Frage drängt sich mir nätürlich noch auf:
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        Was passiert, wenn im CREATE TABLE Syntax die Spalten
        als NOT NULL definiert wurden,  und der RIGHT/LEFT OUTER JOIN
        ein nicht vorhandenes Feld mit NULL auffüllen versucht?

        Was sollte passieren?
        Die Inhalte der Felder im SELECT-Resultset haben keine Rückwirkung auf den wirklichen Tabelleninhalt. Sie werden nur aus der Tabelle _gelesen_. Ein SELECT wird aber _nie_ etwas in eine Tabelle _schreiben_. Wozu brauchte man sonst INSERT und UPDATE?

        Deine Frage wäre ähnlich wie diese:
        Wo wird bei
        SELECT betrag*1.16 as bruttobetrag FROM tabelle
        der Bruttobetrag gespeichert?
        Antwort:
        Nirgends. Er steht nur temporär im Resultset des SELECTS im Aliasfeld "bruttobetrag".

        Stell Dir
        SELECT name, vorname FROM tabelle
        einfach immer als
        SELECT name as name, vorname as vorname FROM tabelle
        vor.

        Weiters:
        Wie schaut ein FULL OUTER JOIN aus?

        In MySQL gar nicht, oder welches MySQL kann einen FULL OUTER JOIN?

        Konstantin lebt in einer Stadt mit einer ID die es nicht gibt.
        Und in München lebt gar keiner.
        Reicht das um einen FULL OUTER JOIN zu veranschaulichen?

        Ja, um diese Datensätze alle zu erreichen, wäre ein FULL OUTER JOIN nötig. An diesem Beispiel siehst Du aber schon, dass in der Praxis ein FULL OUTER JOIN selten nötig ist. Die "ID die es nicht gibt" sollte es auch nicht geben ;-))

        viele Grüße

        Axel