# MySQL - Probleme mit einer Aufgabe !



## James123 (1. Mrz 2016)

Aufgabe : Geben Sie die verschieden Paare von PLZ und Ort der Kundentabelle aus ! 

Mein Lösungsansatz : SELECT DISTINCT `PLZ`,`Ort` FROM `t_kunden`  

bin mir aber nicht sicher ....


----------



## Thallius (1. Mrz 2016)

Ich würde es eher mit GROUP BY lösen

SELECT ´PLZ´, `Ort` FROM `t_kunden` GROUP BY `PLZ`

Gruß

Claus


----------



## kneitzel (1. Mrz 2016)

Sollte dann im GROUP BY nicht PLZ und Ort aufgeführt werden? Ansonsten dürfte die Query nach meinem aktuellen Verständnis auch nicht laufen, denn ohne Aggregate Funktion darf doch kein weiteres Feld aufgeführt werden.

Die Datenbanken sollten erkennen, dass ein Group BY ohne jegliche Aggregate Funktion eben wie ein DISTINCT bearbeitet werden kann so dass die Execution Plans identisch sein dürften. SQL Server und Oracle ist dies wohl der Fall.


----------



## Thallius (1. Mrz 2016)

mySQL macht da auch keine Probleme. Aber stimmt, theoretisch korrekter wäre ein GROUP BY PLZ, Ort

Gruß

Claus


----------



## Meniskusschaden (1. Mrz 2016)

Die Varianten von James123 und kneitzel liefern meines Erachtens identische Ergebnisse. Die Variante von Thallius kann abweichende Ergebnisse liefern, falls dieselbe Postleitzahl mit unterschiedlichen Ortsbezeichnungen gespeichert ist. Bei Thallius würde so eine Postleitzahl nur einmal auftauchen, in den beiden anderen Varianten einmal pro Ortsbezeichnung.


----------



## kneitzel (1. Mrz 2016)

MySQL erlaubt die Nennung von Feldern, die nicht im Group by aufgeführt sind und keine Aggregate Funktion besitzen?
SQL Server ist da auf jeden Fall sehr genau und meckert da dann:

Column 'Ort' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


----------



## Meniskusschaden (1. Mrz 2016)

kneitzel hat gesagt.:


> MySQL erlaubt die Nennung von Feldern, die nicht im Group by aufgeführt sind und keine Aggregate Funktion besitzen?


Habe es ausprobiert. MySQL akzeptiert das.


----------



## kneitzel (1. Mrz 2016)

Ok, das ist gut zu wissen. Danke für die Info.


----------



## Meniskusschaden (1. Mrz 2016)

Ich finde das Verhalten von MySQL ziemlich inkonsequent und sehe es eigentlich als fehlerhaft an. Habe deshalb noch etwas weiter gesucht und hier http://stackoverflow.com/questions/3168042/can-i-use-non-aggregate-columns-with-group-by folgenden Hinweis gefunden:

"MySQL (and SQLite) decided in their infinite wisdom that they would go against spec, and allow queries to accept GROUP BY clauses missing columns quoted in the SELECT - it effectively makes these queries not portable."


----------



## Thallius (1. Mrz 2016)

Hm, ich dachte es ist kein Problem mehr zu selecten als zu groupen (Wäre ja sonst auch verdammt mühsam). Das sollte doch auch SQL können oder nicht. Was in SQL nicht geht ist das ich nach etwas Groupe das ich nicht selecte. Oder bin ich da jetzt komplett auf dem falschen Dampfer?

Gruß

Claus


----------



## Meniskusschaden (1. Mrz 2016)

Aber wenn man für die nicht gruppierten Spalten keine Aggregationsfunktion angibt, ist ja nicht definiert, wie das Ergebnis aussehen soll. Im Beispiel oben entscheidet dann der SQL-Server, welches die "richtige" Ortsbezeichnung ist. Das darf meines Erachtens nicht sein.


----------



## Thallius (1. Mrz 2016)

stimmt hast recht


----------



## kneitzel (1. Mrz 2016)

Also was man selektiert ist dem GROUP By ja egal. So ein Query wird ja in einzelnen Schritten angearbeitet wenn man so will und was wie selektiert wird kommt relativ spät. Fakt ist, dass er intern erst einmal gruppiert, aber was dann Ausgegeben wird oder nicht ist dem SQL Server ja erst einmal beim abarbeiten egal.


----------

