Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Frage zu Unions

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Kampfgummibaerlie, 5 März 2018.

  1. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Ich würde heute gerne noch fragen, was es mit Union überhaupt auf sich hat?

    Mir ist bewusst, dass Union irgendeine Art ist um mehrere Tabellen miteinander zu verbinden, habe jedoch keine Ahnung, was Union im absoluten tut.

    Ich kenne die Verbindung zwischen Tabellen jetzt schon mittels Foreign Keys (Abhängigkeit), und aber auch bei Selects mittels Joins.
    Ich denke, union wird etwas ähnliches sein wie Joins(?), sprich nicht in die Datenbank programmierbar, sondern nur bei einzelnt abfragbaren Querys.

    Bin natürlich, wie immer, sehr dankbar, wenn ich heute Abend nach meiner World of Warcraft Runde eine Erklärung, womöglich auch passende Links zur PostgreSQL-Doku, und natürlich ein Beispiel habe ;)

    Und, damit ich es nicht vergesse:
    Denkt ihr, ich könnte ein relativ einfaches, natürlich sich steigerndes, umfangreiches Tutorial über SQL machen?
    Ich denke, der Meinung zu sein, etwas perfekt können zu müssen, um mich vor peinlichen Fehlern, oder etwa Gelächter zu schützen, aber irgendwann muss ich das Thema auch überwinden ;)

    Habe, um ehrlich zu sein, im Hinterkopf auch vor, einen Fragebogen in PostgreSQL zu gestalten, was mir relativ einfach erscheint, wenn ich ehrlich sein darf, aber irgendwie auch noch nicht entstanden ist. (Eine Tabelle Fragen (ID Serial Primary Key, Frage text), eine Tabelle Antworten (ID Serial Primary Key, Frage integer references Fragen(id), Antwort text), und die zwei einfach hübsch quer durcheinander selecten, und schon wäre das Ganze fertig ;)

    Wenn ich diese 2 Punkte kombiniere, könnte ich ja gleich Lehrer werden, lol
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Allllso:

    Code:
    test=# select * from generate_series(1,10) s union all select * from generate_series(5,15) t;
     s  
    ----
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
    (21 Zeilen)
    
    UNION ALL verbindet alles zusammen, inklusive doppelter Zeilen (5-10). Aber es gibt auch:

    Code:
    test=*# select * from generate_series(1,10) s union  select * from generate_series(5,15) t;
     s  
    ----
     10
     15
      8
      6
      7
     11
     12
      2
     13
      5
      4
      1
      3
     14
      9
    (15 Zeilen)
    
    hier bekommst nur die Unikate. Der Preis: es ist unsortiert. Warum auch nicht, Du hast kein ORDER BY genannt.

    Code:
    test=*# select * from generate_series(1,10) s union  select * from generate_series(5,15) t order by s;
     s  
    ----
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
    (15 Zeilen)
    
    test=*# 
    
    Merke:

    • UNION ohne ALL liefert nur unikate Rows
    • mit ALL kommen alle Rows
    • beide Tabellen müssen gleich aufgebaut sein (gleiche Anzahl Spalten, gleichen Typen)
    • UNION ohne ALL ist unsortiert (einträge aus beiden Tabellen vermischt), solange Du es nicht expliziet verlangst

    Grund für den letzten Punkt ist übrigens, daß PG das intern via Hashes regelt und die Sortierung nicht macht, wenn nicht verlangt. Optimierung halt. Generell: ohne ORDER BY kann IMMER das Result unsortiert sein. NIEMALS NIE auf eine impliziete Sortierung verlassen.
     
    Kampfgummibaerlie gefällt das.
  3. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Wie soll ich das mit impliziete Sortierung verstehen?
    Wenn ich nachdenke (und ein wenig nach wörterbuch implizit google), wäre das eine Sortierung nach einer Spalte, die ich garnicht selecte?

    EDIT: Anbei würde mich auch interessieren, wo man das im effektivem in einem Betrieb brauchen könnte?

    Oder kann man auf beiden Seiten auch Joins selecten, und damit wiederum mehrere Spalten selecten, wobei die nur mittels einer ID miteinander verknüpft sind (Foreign Key)?
     
    Zuletzt bearbeitet: 5 März 2018
  4. akretschmer

    akretschmer Datenbank-Guru

    Datenbanken arbeiten mengenorientiert. Ein Haufen Sand ist auch eine Menge, die Körner nicht nach Größe, Farbe oder Gewicht sortiert.

    Ein UNION liefert per Definition (SQL-Spec) eine unikate Menge aus den beteiligten Tabellen, doppelte Einträge darf/soll es da nicht geben. Um das zu erreichen, wird sortiert. Das erfolgt allerdings nach einem Hash-Verfahren, daher 'fallen' die Rows da eher unsortiert raus.
     
  5. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Kaum schaut man in der Doku nach, wird einem das Ganze deutlich klarer :D

    Union, Intersect und Except sind unter dem Punkt "Combining Querys" aufgeführt, und mit Except Querys habe ich mich ja schon auseinandergesetzt ;)

    Warum ich hier keinen Link der Doku reinstelle? Damit ich mich nicht wieder schimpfen lasse, "Die Doku ist alt, unterlass also bitte sowas", oder so.

    Was eine Intersect Combining-Query machen würde, weiß ich noch nicht, aber ich denke (hoffe), dass mich jemand *den Elephanten anstups* über das Thema dementsprechend und angemessen aufklärt.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    INTERSECT returns all rows that are both in the result of query1 and in the result of query2. Duplicate rows are eliminated unless INTERSECT ALL is used.

    PostgreSQL: Documentation: 10: 7.4. Combining Queries
    (beachte das current im Link, damit triffst Du in der PostgreSQL-Doku immer die Doku der aktuellen Version, ist also nie alt ;-)
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden