Aqua: -> (MySQL) -> Inner, outter, left, right join || welches ist es?

Hallo!

Welchem JOIN kommt das da gleich,
bzw.  kommt das überhaupt irgendeinem JOIN gleich?

SELECT d.city FROM datas d, users u WHERE d.id = u.id AND u.user LIKE 'c%';

Kann man das so verwenden oder ist ein JOIN sinnvoller,
und wenn ja welches join?

Ich kann mich da nie entscheiden ob ich
INNER, OUTER, LEFT oder RIGHT   JOIN will....

Danke
Aqua

  1. Hallo Aqua,

    Welchem JOIN kommt das da gleich,
    bzw.  kommt das überhaupt irgendeinem JOIN gleich?

    SELECT d.city FROM datas d, users u WHERE d.id = u.id AND u.user LIKE 'c%';

    Das ist ein INNER JOIN.

    Kann man das so verwenden oder ist ein JOIN sinnvoller,

    Die Syntax ist egal, MySQL behandelt beides gleich.

    Ich kann mich da nie entscheiden ob ich
    INNER, OUTER, LEFT oder RIGHT   JOIN will....

    Ähm, wo genau ist da Dein Problem? Es ist eigentlich klar, wann man das eine und wann man das andere braucht.

    Viele Grüße,
    Christian

    1. Hallo Christian!

      Es ist eigentlich klar, wann man das eine und wann man das andere braucht.

      Naja dass Dir das klar ist glaub ich gern,
      aber mir isses ned so ganz klar.

      Ich habe zwei Tabellen und irgendwie ... ja,
      ok, erklaerst Du's mir mit ein paar Beispielen?

      Oder machen wir's einfacher:
      Kann ich INNER JOIN also meine Variante von oben immer anwenden,
      oder brauch ich manchmal auch  RIGHT, LEFT, OUTER und INNER JOIN ?

      Danke
      Aqua

      1. Hallo,

        Kann ich INNER JOIN also meine Variante von oben immer anwenden,
        oder brauch ich manchmal auch  RIGHT, LEFT, OUTER und INNER JOIN ?

        Fuer eine einfache Verknuepfung reicht Deine Syntax.
        Das Wort JOIN muss darin nicht vorkommen.

        Ein LEFT JOIN braucht man z.B. wenn man schauen will,
        ob gewisse Zeilen der ersten Tabelle keine Zuordnung
        in der zweiten Tabelle haben.

        Ein Beispiel:

        Tabellen:
        tabelle1 - id (primary key), bla, foo
        tabelle2 - tab2id (primary key), tab1id (foreign key), blabla, foofoo

        SELECT tabelle1.* FROM tabelle1
         LEFT JOIN tabelle2
         ON tabelle1.id=tabelle2.tab1id
         WHERE tabelle2.tab2id IS NULL

        Soweit ich das verstehe, funktioniert es etwa so:

        Der JOIN arbeitet mit folgender "Misch-Tabelle".
        tabelle1.id, tabelle1.bla, tabelle1.foo, tabelle2.tab2id, tabelle2.tab1id, tabelle2.blabla, tabelle2.foofoo

        Mit dem "JOIN" werden in dieser "Misch-Tabelle" auch Zeilen
        fuer die fehlenden Kombinationen "erschaffen" ("erfunden").
        In diesen Zeilen ist dann eben tabelle2.tab2id leer, d.h. NULL.

        Die LEFT JOIN Geschichte ist schwer zu verstehen.
        Aber sie funktioniert. ;-)

        Gruesse,

        Thomas

        1. Hallo!

          Also machen wir eine zusammenfassung:

          Wenn ich es in diesem Wortlaut brauche:

          "Selectiere aus der Tabelle "Marmelade" alle "Sorten" wo die
          ID die gleiche ID wie aus der Tabelle "Kunden" von den Kunden,
          deren Name mit "K" anfaengt.

          Komme ich dann mit dem hier absolut zu 100 % durch,
          oder welche Probleme kann ich erwarten?

          SELECT m.sorten FROM marmelade m, kunden k WHERE m.id = k.id AND k.kunden LIKE 'K%';

          Gibt es irgendeinen Grund bei diesem Fall etwas anderes
          als meinen Syntax zu nehmen?

          Danke!
          Aqua

          Zusatzfrage:
          Und was wenn ich 3 Tables verbinden will?

          Danke,
          Aqua

          PS.: Bei deiner Antwort bitte Antworten als würdest
               Du es Deiner Mutter erklaeren =)

          1. Hallo,

            Komme ich dann mit dem hier absolut zu 100 % durch,

            Ja.
            (Einfach genug?)

            SELECT m.sorten FROM marmelade m, kunden k WHERE m.id = k.id AND k.kunden LIKE 'K%';
            Gibt es irgendeinen Grund bei diesem Fall etwas anderes
            als meinen Syntax zu nehmen?

            Ich sehe nicht ein, warum Du (in diesem einfachen Fall)
            "Alias-Namen" fuer die Tabellennamen nimmst.
            Ich wuerde es einfach so schreiben:

            SELECT marmelade.sorten FROM marmelade, kunden WHERE marmelade.id = kunden.id AND kunden.kunden LIKE 'K%';

            Obwohl ich Dein Datenbank-Schema nicht kenne,
            denke ich, dass es nicht sehr sinnvoll ist,
            wenn die Spalte "id" in der Tabelle marmelade
            ein Fremdschluessel (foreign key) ist, der
            mit der Spalte "id" in der Tabelle kunden korreliert.
            Mit anderen Worten: marmelade.id = kunden.id deutet
            darauf hin, dass Du etwas seltsame Spaltennamen hast.

            "Ueblicherweise" ist "id" die erste Spalte einer Tabelle,
            Integer, auto_increment, Unique und Primary Key.

            Aber was soll's - war ja vermutlich bloss ein Beispiel aus dem hohlen Bauch.

            Und was wenn ich 3 Tables verbinden will?

            Genau das gleiche.

            Nach FROM duerfen beliebig viele Tabellennamen stehen.
            Mit der Zeit wird die Sache wohl etwas langsam, das ist alles;-)

            SELECT marmelade.sorten, lieblingssachen.farbe FROM marmelade, lieblingssachen, kunden WHERE marmelade.kundenid = kunden.id AND lieblingssachen.kundenid=kunden.id AND kunden.kunden LIKE 'K%';

            (ungetestet! ;-)

            Gruesse,

            Thomas

            1. Danke Thomas =)
              Vielen lieben Dank!

        2. Hallo,

          Kann ich INNER JOIN also meine Variante von oben immer anwenden,
          oder brauch ich manchmal auch  RIGHT, LEFT, OUTER und INNER JOIN ?

          Man unterscheidet zunächst INNER und OUTER Joins.
          INNER Joins verbinden Felder aus mehreren Tabellen zu Datensatzmengen, wobei nur solche Datensätze aus den Einzeltabellen verbunden werden, die eine innere Verbindung zueinander haben.
          OUTER Joins tun das auch, beziehen aber in die Datensatzmenge auch solche Datensätze aus den Einzeltabellen ein, die eine solche innere Verbindung nicht haben.
          OUTER Joins kann man nochmals unterteien in LEFT OUTER JOIN und RIGHT OUTER JOIN.

          Die LEFT JOIN Geschichte ist schwer zu verstehen.
          Aber sie funktioniert. ;-)

          Naja, schwer ist relativ:
          Dein Beispiel:

          Tabellen:
          tabelle1 - id (primary key), bla, foo
          tabelle2 - tab2id (primary key), tab1id (foreign key), blabla, foofoo

          SELECT tabelle1.id, tabelle1.bla, tabelle2.tab1id, tabelle2.blabla
          FROM tabelle1 INNER JOIN tabelle2 ON tabelle1.id=tabelle2.tab1id

          ergibt eine Datensatzmenge mit den angegebenen Feldern aus beiden Tabellen in jedem Datensatz, die nur solche Datensätze enthält, bei denen gilt tabelle1.id = tabelle2.tab1id.

          SELECT tabelle1.id, tabelle1.bla, tabelle2.tab1id, tabelle2.blabla
          FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.tab1id

          ergibt eine Datensatzmenge mit den angegebenen Feldern aus beiden Tabellen in jedem Datensatz, die alle Datensätze aus tabelle1 (LEFT) und nur solche Datensätze aus tabelle2 enthält, bei denen gilt tabelle1.id = tabelle2.tab1id. Für die zusätzlichen Datensätze aus tabelle1, bei denen es keine Entsprechung tabelle1.id = tabelle2.tab1id gibt, sind die Felder aus tabelle2 mit dem Wert NULL belegt.

          SELECT tabelle1.id, tabelle1.bla, tabelle2.tab1id, tabelle2.blabla
          FROM tabelle1 RIGHT JOIN tabelle2 ON tabelle1.id=tabelle2.tab1id

          ergibt eine Datensatzmenge mit den angegebenen Feldern aus beiden Tabellen in jedem Datensatz, die alle Datensätze aus tabelle2 (RIGHT) und nur solche Datensätze aus tabelle1 enthält, bei denen gilt tabelle1.id = tabelle2.tab1id. Für die zusätzlichen Datensätze aus tabelle2, bei denen es keine Entsprechung tabelle1.id = tabelle2.tab1id gibt, sind die Felder aus tabelle1 mit dem Wert NULL belegt.

          viele Grüße

          Axel

          1. hallo Axel ....

            Ich werd mir das die naechsten 2 Stunden durch den Kopf gehen lassen
            und dann ggf. nochmals was darauf posten ...
            Das ist zuviel auf einmal ...

            bis dann,
            und VIELEN DANK!

            LG
            Aqua

  2. hi Aqua,

    das mit den joins ist am anfang ein wenig kniffelig. aber wenn der groschen mal gefallen ist, dann ist es wie ein geistesblitz. joins beziehen sich immer auf mehrere tabellen. lassen wir sonderfälle mal weg, wo joins auf einer tabelle gebildet werden und nehmen nur zwei verschiedene tabellen. die eine zeigt alle spieler einer fussballmanschaft auf und die zweite listet ihre titel auf.

    tabelle spieler:

    id, vorname, nachname, alter, spielernummer
     1,    Gerd,   Müller,    56,      9
     2,   Franz, Beckenbauer, 57,      2
     3,  Oliver,     Kahn,    33,      1

    tabelle titel:

    spieler_id,        titel, datum
         1    ,  Weltmeister, 1974
         1    ,Europameister, 1972
         2    ,  Weltmeister, 1974

    jetzt kann du einen inner join (oftmnals auch theta join oder equi join genannt) über die zwei tabelen bilden, um herauszubekommen, wer welche titel gewonnen hat. das ergebnis wären drei datensätze, zwei für gerdi und einen für den kaiser. so weit so gut.

    das problem mit dem inner join ist, du kannst damit nicht alles lösen. wenn du zum beispiel nun alle spieler angezeigt haben willst und ihre gewonnen titel, dann würde mit einem inner join (gleicheit) immer der gute kahn wegfallen, da er in der titel tabelle nie vorkommt.

    genau auf diesem problem setzen die outer joins auf. hier kann man nun wörtlich sagen, zeige mir alle spieler in der linken tabelle (left join) an und wenn sie einen titel haben, dann zeige mir auch den an. und somit bekommen wir den guten kahn auch wieder rein in unsere ausgabe. in unserem falle hätten wir dann 4 datensätze, zwei für gerdi, einen für den kaiser und einen für kahni. left join heißt wörtlich ausgedrückt, nimm alle datensätze aus der linken tabelle und schau, ob du einträge dafür in der rechten tabelle findest.

    Ilja