Matze: UNION Verständnisproblem

Hallo!

Könnte mir bitte jemand verständlich erklären wie genau UNION in MySQL funktioniert?
Aus dem Handbuch werde ich nicht so ganz schlau.

Ich versteh die Abfrage über 2 "identische" Tabellen nicht.
Nehmen wir an, ich habe 2 Tabellen mit Angaben über Kommunen. (rein fiktiv)
Also die Spalten wären gleich:

z.B. Kommune1 und Kommune2
Einwohnerzahl, Fläche, eingenommene Steuern, Timestamp

Verstehe ich es richtig, dass ich z.B. abfragen kann

  
(SELECT MAX(Einwohnerzahl) FROM Kommune1 WHERE Timestamp < NOW -1 MONTH) UNION (SELECT MAX(Einwohnerzahl) FROM Kommune2 WHERE Timestamp < NOW -5 MONTHS)

Also zum einen eine Abfrage über 2 Tabellen und zum anderen mit verschiedenen Suchkriterien. Versteh ich UNION da richtig?

Grüße, Matze

  1. 你好 Matze,

    Aus Mengenlehrenblickwinkel: UNION fügt im Wesentlichen einfach nur zwei Mengen zusammen. Mehr nicht. Damit das aber technisch funktioniert, muss man die gleiche Anzahl Felder benutzen. Ein SELECT id,content FROM tabelle UNION SELECT feld2,feld3 FROM tabelle2 ginge also genau so wie dein Beispiel auch.

    再见,
     克里斯蒂安

    --
    http://wwwtech.de/
    WWWTech.de | Wayne Revived
    Microsoft: Where do you want to go today?
    Linux: Where do you want to go tomorrow?
    FreeBSD: Are you guys coming, or what?
  2. Hello,

    z.B. Kommune1 und Kommune2
    Einwohnerzahl, Fläche, eingenommene Steuern, Timestamp

    zusätzlich zu dem was Christian gesagt hat: bitte sag mir, dass das nur ein Beispiel ist. Gleichartige Daten gehörem in die selbe Tabelle, zwei Kommunen haben nicht zwei Tabellen...

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    There's no such thing as a free lunch  --  Milton Friedman
    1. z.B. Kommune1 und Kommune2
      Einwohnerzahl, Fläche, eingenommene Steuern, Timestamp
      zusätzlich zu dem was Christian gesagt hat: bitte sag mir, dass das nur ein Beispiel ist.

      Du zitierst das "z.B." doch sogar noch. Ja klar, es war nur ein Beispiel.

      Dank und Gruß, Matze

  3. yo,

    wie bereits erwähnt, basieren rdbms auf der basis der mengenlehre. du kannst es dir so vorstellen, dass eine Tabelle eben eine dieser mengen darstellt und als deren elemente die jeweiligen Datensätze.

    nun will man bestimmte dinge mit diesen mengen(tabellen) und deren inhalten tun können. ein einfacherer fall wäre zum beispiel, zeige mir aus einer tabelle nur bestimmte datensätze an. dann wieder ein wenig komplexer, verbinde zwei oder mehr mengen(tabellen) miteinander, das können zum beispiel INNER JOINS sein, aber eben auch ein UNION.

    UNION verbindet also in aller regel zwei mengen(tabellen) miteinander und zwar auf eine ganz bestimmte art und weise, indem es die Mengen aneinander "klebt". damit man sie aneinander kleben kann, müssen die jeweiligen Mengen bestimmte kriterien erfüllen, zum beispiel die gleiche anzahl an spalten haben, aber auch den gleichen Datentyp aufweisen.

    und es gibt noch eine besonderheit, die gerne übersehen wird. ich bin nicht ganz fit in der mathematik und der mengenlehre, aber wenn ich nicht ganz falsch liege, müssen die elemente einer menge immer eindeutig sein, sprich genau gleiche tupel(datensätze) können in einer menge nicht vorkommen. und verbindet man zwei mengen miteinander, so kommt wieder eine menge raus, die auch wieder eindeutige elemente besitzen muss. deswegen filtert der UNION operator auch gleiche datensätze raus und zeigt nur einen davon an, so dass die tupel der neuen mengen wieder eindeutig sind.

    die gleichheit zweier datensätze bezieht sich auf alle spalten, die du anzeigen willst, sprich hast du drei spalten, die ausgegeben werden sollen, dann sind sie nur gleich, wenn sie sich auch über alle drei spalten die gleichen werte besitzen.

    (SELECT MAX(Einwohnerzahl) FROM Kommune1 WHERE Timestamp < NOW -1 MONTH) UNION (SELECT MAX(Einwohnerzahl) FROM Kommune2 WHERE Timestamp < NOW -5 MONTHS)

      
    bezogen auf deine abfrage bedeutet das, dass du je nach abhängigkeit der jeweiligen ergebnise von MAX(Einwohnerzahl) zwei datensätze als ergebnis zurück bekommen kannst, wenn die werte unterschiedlich sind. oder aber nur einen datensatz, wenn die werte genau gleich sind.  
      
    dieses vorgehen ist bei rdbms nicht immer erwünscht. deshalb hat man entgegen der Mengenlehre in der Mathematik noch einen zusätzlichen Operator eingeführt, nämlich UNION ALL.  
      
    UNION ALL macht das gleiche wie UNION, nur mit dem unterschied, dass er eben nicht nach genau gleichen werten sucht, die es dann nur einmal anzeigt. mit UNION ALL würde also deine abfrage IMMER zwei datensätze zurück liefern, egal ob die werte gleich sind oder nicht und ist somit auch weniger arbeit für das dbms. also je nach bedarf, sollte man UNION oder UNION ALL verwerden.  
      
    Ilja  
      
    
    
    1. Hey!

      (SELECT MAX(Einwohnerzahl) FROM Kommune1 WHERE Timestamp < NOW -1 MONTH) UNION (SELECT MAX(Einwohnerzahl) FROM Kommune2 WHERE Timestamp < NOW -5 MONTHS)

      
      >   
      > bezogen auf deine abfrage bedeutet das, dass du je nach abhängigkeit der jeweiligen ergebnise von MAX(Einwohnerzahl) zwei datensätze als ergebnis zurück bekommen kannst, wenn die werte unterschiedlich sind. oder aber nur einen datensatz, wenn die werte genau gleich sind.  
      > UNION ALL macht das gleiche wie UNION, nur mit dem unterschied, dass er eben nicht nach genau gleichen werten sucht, die es dann nur einmal anzeigt. mit UNION ALL würde also deine abfrage IMMER zwei datensätze zurück liefern, egal ob die werte gleich sind oder nicht und ist somit auch weniger arbeit für das dbms. also je nach bedarf, sollte man UNION oder UNION ALL verwerden.  
        
      Danke für deine ausführliche Erklärung!  
      Also ich bräuchte schon 2 Datensätze, auch wenn sie identisch sind.  
      Bzw könnte ich mir den fehlenden Datensatz auch selbst basteln indem ich feststelle ob nur 1 zurück gegeben wurde und daraus dann schlussfolgern, dass der andere den selben Inhalt hätte. Oder ich benutze UNION ALL.  
        
      Nochmals Danke!  
        
      Gruß, Matze