Die Mathe-Redaktion - 29.03.2020 20:31 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps für den MP

Werbung

Bücher zu Naturwissenschaft und Technik bei amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 536 Gäste und 22 Mitglieder online

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matroid
Informatik » Datenbanken » Sinn von GROUP BY - Kommt man auch ohne aus?
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule Sinn von GROUP BY - Kommt man auch ohne aus?
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1051
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-02-26


Hallo allerseits,
habe eine Tabelle tab_c angelegt mit den 3 Spalten s1,s2,s3
und den Werten:
1   2     3
1   20    30
1   200   300

Ob ich jetzt
SELECT s1, count(s1) FROM `tab_c` GROUP by s1

oder
SELECT s1, count(s1) FROM `tab_c`

anfrage. Ds Ergebnis ist das Gleiche:
s1   count(s1)
1    3

Was ist also der Sinn von GROUP BY ?


mfg
cx







  Profil  Quote  Link auf diesen Beitrag Link
Diophant
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.01.2019
Mitteilungen: 3081
Aus: Rosenfeld, BW
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-02-26


Hallo carlox,

count(Spalte) ist ja eine sog. Aggregatsfunktion. In deinem Beispiel tut sie nichts weiter, als die Anzahl der Datensätze der Tabelle tab_c zu zählen.

Die GROUP BY-Klausel hat eine andere Wirkung. Man kann damit eine Tabelle sozusagen in mehrere Teiltabellen zerlegen oder eben kurz: gruppieren.

Wenn du dir den Unterschied an Hand deines Beispiels klarmachen möchtest, dann trage in die Tabelle noch weitere Datensätze ein und achte darauf, dass in der Spalte s1 auch noch Werte ungleich 1 vorkommen.

In der Praxis wird GROUP BY schon oft im Zusammenhang mit Aggregatsfunktionen eingesetzt. Hier wird es ganz gut erklärt.


Gruß, Diophant  



  Profil  Quote  Link auf diesen Beitrag Link
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1051
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2020-02-26


2020-02-26 12:56 - Diophant in Beitrag No. 1 schreibt:
Hallo carlox,

count(Spalte) ist ja eine sog. Aggregatsfunktion. In deinem Beispiel tut sie nichts weiter, als die Anzahl der Datensätze der Tabelle tab_c zu zählen.

Die GROUP BY-Klausel hat eine andere Wirkung. Man kann damit eine Tabelle sozusagen in mehrere Teiltabellen zerlegen oder eben kurz: gruppieren.

Wenn du dir den Unterschied an Hand deines Beispiels klarmachen möchtest, dann trage in die Tabelle noch weitere Datensätze ein und achte darauf, dass in der Spalte s1 auch noch Werte ungleich 1 vorkommen.

In der Praxis wird GROUP BY schon oft im Zusammenhang mit Aggregatsfunktionen eingesetzt. Hier wird es ganz gut erklärt.


Gruß, Diophant  

Hallo Diophant,
Danke für deine Infos.

In deinem Link steht:

=====================================
SELECT <Aggregatfunktion-1(Spaltenname-A1) As Ausgabename-1,>
<Aggregatfunktion-2(Spaltenname-A2) As Ausgabename-2,>
...
<Aggregatfunktion-n(Spaltenname-An) As Ausgabename-n>,
Spaltenname-1,
Spaltenname-2,
...
Spaltenname-m

FROM ...
[WHERE ...]
GROUP BY Spaltenname-1,
Spaltenname-2,
...
Spaltenname-m
[HAVING ...]
=====================================

Ist das richtig ?
In der Liste nach SELECT können doch auch weniger Atribute vorkommen als in der Liste nach GROUP BY:

=====================================
SELECT <Aggregatfunktion-1(Spaltenname-A1) As Ausgabename-1,>
<Aggregatfunktion-2(Spaltenname-A2) As Ausgabename-2,>
...
<Aggregatfunktion-n(Spaltenname-An) As Ausgabename-n>,
Spaltenname-1,
Spaltenname-2,
...
Spaltenname-k

FROM ...
[WHERE ...]
GROUP BY Spaltenname-1,
Spaltenname-2,
...
Spaltenname-m
[HAVING ...]



 wobei k<=m
oder ist das falsch ?
=====================================

mfg
cx






  Profil  Quote  Link auf diesen Beitrag Link
Diophant
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.01.2019
Mitteilungen: 3081
Aus: Rosenfeld, BW
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2020-02-26


Hallo carlox,

das sind doch nur weitere Syntax-Beispiele für unterschiedliche Fragestellungen. [Außerdem sind die Klauseln in eckigen Klammern optional] ;-)

Welche Frage hättest du da jetzt genau?

Wie gesagt, mache doch mal folgendes: trage in deine Tabelle noch einige Datensätze ein mit dem Wert 2 in Spalte s1 und solche mit dem Wert 3.

Und jetzt lasse beide Abfragen nochmal auf die nun angefülltere Tabelle los. Dann solltest du die Wirkung von GROUP BY sehen.

Experte bin ich auf dem Gebiet nicht. Wenn ich die Informationen auf der verlinkten Seite richtig verstanden habe, wird das GROUP BY auf jeden Fall vor dem count ausgeführt. Das ist vielleicht zum Verständnis nicht ganz unwichtig.


Gruß, Diophant



  Profil  Quote  Link auf diesen Beitrag Link
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1051
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2020-02-26


2020-02-26 14:31 - Diophant in Beitrag No. 3 schreibt:
Welche Frage hättest du da jetzt genau?

Habe ein paar Experimente gemacht:
Inhalt von tab_c :
s1    s2   s3
1     2    121
1     2    122
1     3    13
2     1    211
2     1    212
3     1    311
3     1    312

Die Abfrage:
select s1,s2,s3, sum(s1), sum(s2), sum(s3) from tab_c group by s1,s2
ergibt:
s1    s2   s3    sum(s1)    sum(s2)    sum(s3)
1     2    121   2          4          243
1     3    13    1          3          13
2     1    211   4          2          423
3     1    311   6          2          623

Frage:
Wie werden die Werte in den Spalten sum(s1) und sum(s2) berechnet ?

mfg
cx
 



 



  Profil  Quote  Link auf diesen Beitrag Link
Diophant
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.01.2019
Mitteilungen: 3081
Aus: Rosenfeld, BW
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2020-02-26


Hallo carlox,

ich pack das mal in Quelltextbereiche, damit man es besser lesen kann.

2020-02-26 16:34 - carlox in Beitrag No. 4 schreibt:
Habe ein paar Experimente gemacht:
Inhalt von tab_c :
Tabelle "tab_c"
s1    s2   s3
1     2    121 
1     2    122
1     3    13
2     1    211
2     1    212
3     1    311
3     1    312

Die Abfrage:
SQL
SELECT s1,s2,s3, SUM(s1), SUM(s2), SUM(s3) FROM tab_c GROUP BY s1,s2
ergibt:
Ergebnis Abfrage
s1    s2   s3    sum(s1)    sum(s2)    sum(s3)
1     2    121   2          4          243
1     3    13    1          3          13
2     1    211   4          2          423
3     1    311   6          2          623

Frage:
Wie werden die Werte in den Spalten sum(s1) und sum(s2) berechnet ?

Also, da passiert theoretisch folgendes: zuerst wirkt die Klausel GROUP BY und gruppiert die Daten zuerst nach den Werten in Spalte s1. Danach dann nach den Daten in Spalte 2. Nur passiert jetzt allerdings hier in diesem Fall überhaupt nichts, da die Daten nach Spalte 1 in aufsteigender Reihenfolge sortiert sind und innerhalb des jeweiligen Bereichs eines Wertes in Spalte s1 gilt das auch für die Spalte s2.

Du könntest zu Testzwecken in beiden Spalten noch ein wenig Durcheinander anrichten, um die Wirkung sehen zu können. Dann machst du mal noch eine dritte Abfrage, die nur die GROUP BY-Klausel enthält aber nicht die Aggregatsfunktionen (in dem Fall die Zähler).

Wenn jetzt die Gruppierung abgeschlossen ist, dann werden innherhalb der Gruppen die Datensätze mit gleichen Werten aufsummiert. Es gibt bspw. zwei Datensätze mit einer 1 in Spalte s1 und einer 2 in Spalte 2. Also werden diese beiden Datensätze durch Summenbildung "aggregiert", wie man sagt. Von den ursprünglichen Daten wird dabei jeweils der erste Datensatz angezeigt.

Die nächste Kombination von Werten ist 1 in s1 und 3 in s2. Die gibt es nur einmal, also wird dieser Datensatz unverändert übernommen. Die Kombinationen s1=2, s2=1 und s1=3, s2=1 werden wieder aggregiert wie das erste Paar.

So kommt man auf die insgesamt vier Datensätze im Ergebnis der Abfrage.


Gruß, Diophant



  Profil  Quote  Link auf diesen Beitrag Link
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1051
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2020-02-27


2020-02-26 16:58 - Diophant in Beitrag No. 5 schreibt:
Also, da passiert theoretisch folgendes: zuerst wirkt die Klausel GROUP BY und gruppiert die Daten zuerst nach den Werten in Spalte s1. Danach dann nach den Daten in Spalte 2. Nur passiert jetzt allerdings hier in diesem Fall überhaupt nichts, da die Daten nach Spalte 1 in aufsteigender Reihenfolge sortiert sind und innerhalb des jeweiligen Bereichs eines Wertes in Spalte s1 gilt das auch für die Spalte s2.

Hallo Diophant,
danke für deine Antwort.

Wie wird eigentlich gruppiert?
"gruppiert die Daten zuerst nach den Werten in Spalte s1"
Ist das eine Sortierung?
s1  s2
1    1
kommt also vor
1    2

Bei INTEGER ist das klar: 1 kommt vor 2
Aber wie ist das bei anderen Datentypen, wie z.B. STRING?

mfg
cx






  Profil  Quote  Link auf diesen Beitrag Link
Diophant
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.01.2019
Mitteilungen: 3081
Aus: Rosenfeld, BW
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2020-02-27


Hallo carlox,

2020-02-27 07:20 - carlox in Beitrag No. 6 schreibt:
Wie wird eigentlich gruppiert?
"gruppiert die Daten zuerst nach den Werten in Spalte s1"
Ist das eine Sortierung?

Nein, das kann man so nicht sagen. Es ist eine Gruppierung nach gleichen Merkmalen. Und für die Domänen- bzw. Aggregatsfunktionen wirkt sich das eben so aus, dass die ganze Tabelle nicht mehr ein einziges Aggregat ist, sondern jede Gruppe bildet ein Aggregat für sich, über das dann gezählt oder summiert wird (oder was man da sonst noch so tun kann).

2020-02-27 07:20 - carlox in Beitrag No. 6 schreibt:
s1  s2
1    1
kommt also vor
1    2

Das ist hier nur deshalb so, weil du die Daten in dieser Reihenfolge eingegeben hast. Zur Sortierung von Daten steht die ORDER BY-Klausel zur Verfügung.

2020-02-27 07:20 - carlox in Beitrag No. 6 schreibt:
Bei INTEGER ist das klar: 1 kommt vor 2
Aber wie ist das bei anderen Datentypen, wie z.B. STRING?

Strings werden theoretisch nach den ASCII- bzw. Unicode-Nummern ihrer Zeichen sortiert (was dann automatisch eine alphanumerische Sortierung bewirkt, weil diese Codes so angelegt sind). Aber in deinem Fall ist es vermutlich so, dass bereits beim Anlegen der Tabelle ein Primärschlüssel angelegt wurde, das ist in der Regel ein 32- oder 64-bit Integer-Feld, welches mit jedem neuen Datensatz inkrementiert wird. Wenn keine anderen Sortierkriterien vorliegen, dann wird nach dem Primärschlüssel sortiert und der stellt eine chronologische Sortierung der Datensätze dar.

Nochmal mein Rat: fülle deine Tabelle noch weiter. Achte darauf, dass in den Spalten, nach denen du gruppieren möchtest, Werte mehrfach auftreten aber dass sie nicht sortiert vorliegen.

Dann mach das mit der dritten Abfrage, die nur die GROUP BY-Klausel enthält.

Und dann lässt du mal alle drei Abfragen auf deine Tabelle los und studierst die Ergebnisse. Dann sollten sich die Zusammenhänge eigentlich klären.


Gruß, Diophant



  Profil  Quote  Link auf diesen Beitrag Link
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1051
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2020-02-27


2020-02-27 09:57 - Diophant in Beitrag No. 7 schreibt:
Aber in deinem Fall ist es vermutlich so, dass bereits beim Anlegen der Tabelle ein Primärschlüssel angelegt wurde, das ist in der Regel ein 32- oder 64-bit Integer-Feld, welches mit jedem neuen Datensatz inkrementiert wird. Wenn keine anderen Sortierkriterien vorliegen, dann wird nach dem Primärschlüssel sortiert und der stellt eine chronologische Sortierung der Datensätze dar.

Hallo Diophant,
Habe mit MySQL (XAMPP) aber _explizit_ keinen Primärschlüssel erzeugt.
Durch GROUP BY wird ja eine Gruppierung erzeugt.
Diese braucht dann intern eine Möglichkeit, wie Datensätze verglichen werden.
Da
3         1         312
chronologisch vor
3         1         311
eingegeben wurde, kommt also bei einem Vergleich von
3         1         312
und
3         1         311
damit
3         1         312
vor
3         1         311
Siehe unten.


Nochmal mein Rat: fülle deine Tabelle noch weiter. Achte darauf, dass in den Spalten, nach denen du gruppieren möchtest, Werte mehrfach auftreten aber dass sie nicht sortiert vorliegen.

habe mit XAMPP eine neue Tabelle angelegt:

s1      s2      s3
3       1       12
3       1       311
2       1       212
2       1       211
1       3       13
1       2       12
1       2       122

Die Abfrage:
SELECT s1,s2,s3,sum(s1), sum(s2), sum(s3) FROM `tab_c` group by s1,s2

ergibt das Ergebnis:

s1      s2      s3      sum(s1) sum(s2) sum(s3)
1       2       12      2       4       134
1       3       13      1       3       13
2       1       212     4       2       423
3       1       312     6       2       623


mfg
cx


















  Profil  Quote  Link auf diesen Beitrag Link
Diophant
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.01.2019
Mitteilungen: 3081
Aus: Rosenfeld, BW
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2020-02-27


Hallo carlox,

2020-02-27 17:02 - carlox in Beitrag No. 8 schreibt:
Habe mit MySQL (XAMPP) aber _explizit_ keinen Primärschlüssel erzeugt.

Ok. Dann ist es einfach die Eingabereihenfolge. Ich kenne mich aber mit MySQL ehrlich gesagt nicht aus, ich kann das ein wenig, weil ich viel mit Microsoft Access mache (wo man zwar einen Abfrage-Editor hat, aber manches eben doch nur per SQL funktioniert).

2020-02-27 17:02 - carlox in Beitrag No. 8 schreibt:
Durch GROUP BY wird ja eine Gruppierung erzeugt.
Diese braucht dann intern eine Möglichkeit, wie Datensätze verglichen werden.
Da
3         1         312
chronologisch vor
3         1         311
eingegeben wurde, kommt also bei einem Vergleich von
3         1         312
und
3         1         311
damit
3         1         312
vor
3         1         311
Siehe unten.

Hier verstehe ich jetzt nicht so ganz, was du meinst.

2020-02-27 17:02 - carlox in Beitrag No. 8 schreibt:
habe mit XAMPP eine neue Tabelle angelegt:
Tabelle
s1      s2      s3 	
3       1       12
3       1       311
2       1       212
2       1       211
1       3       13
1       2       12
1       2       122

Die Abfrage:
SELECT s1,s2,s3,sum(s1), sum(s2), sum(s3) FROM `tab_c` group by s1,s2

ergibt das Ergebnis:
Abfrage
s1      s2      s3      sum(s1) sum(s2) sum(s3) 	
1       2       12      2       4       134
1       3       13      1       3       13
2       1       212     4       2       423
3       1       312     6       2       623


Ok. Dann hat GROUP BY offensichtlich nebenbei den Effekt, dass die einzelnen Gruppen nach den Spalten, nach denen gruppiert wird, auch sortiert werden. Das wusste ich nicht mehr. Macht aber ja eigentlich hochgradig Sinn.

Ist dir jetzt aber ansonsten die Wirkung von GROUP BY klargeworden?


Gruß, Diophant



  Profil  Quote  Link auf diesen Beitrag Link
Creasy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2019
Mitteilungen: 493
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, eingetragen 2020-02-27


Hallo,

Ehrlich gesagt überrascht es mich etwas, dass  ohr keine Fehlermeldungen bekommt. Ihr gruppiert nämlich nach s1,s2 aber nicht nach s3 aber gebt trotzdem s3 aus.
Ich zitiere auch aus diophants Link:
"Wenn Sie eine Spalte ausgeben, über diese jedoch weder aggregieren noch sie in der GROUP-BY-Klausel erwähnen, so erhalten Sie eine typische Fehlermeldung: 'Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'A_NR' nicht als Teil der Aggregatfunktion einschließt' (Beispiel Access)"

Edit: Ich korrigiere mich. Da ihr über s3 aggregiert sagt dieses Zitat nichts darüber aus ob es einen Fehler geben soll. Ich würde aber behaupten, die Spalte s3 auszugeben ist wenig sinnvoll.

Grüße CreasY

[Die Antwort wurde vor Beitrag No.1 begonnen.]


-----------------
Smile (:



  Profil  Quote  Link auf diesen Beitrag Link
Diophant
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.01.2019
Mitteilungen: 3081
Aus: Rosenfeld, BW
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, eingetragen 2020-02-27


@Creasy:
2020-02-27 17:28 - Creasy in Beitrag No. 10 schreibt:
Ehrlich gesagt überrascht es mich etwas, dass  ohr keine Fehlermeldungen bekommt. Ihr gruppiert nämlich nach s1,s2 aber nicht nach s3 aber gebt trotzdem s3 aus.
Ich zitiere auch aus diophants Link:
"Wenn Sie eine Spalte ausgeben, über diese jedoch weder aggregieren noch sie in der GROUP-BY-Klausel erwähnen, so erhalten Sie eine typische Fehlermeldung: 'Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'A_NR' nicht als Teil der Aggregatfunktion einschließt' (Beispiel Access)"

Es wurden ja von carlox von vornherein alle drei Spalten aggregiert.

2020-02-27 17:28 - Creasy in Beitrag No. 10 schreibt:
Edit: Ich korrigiere mich. Da ihr über s3 aggregiert sagt dieses Zitat nichts darüber aus ob es einen Fehler geben soll. Ich würde aber behaupten, die Spalte s3 auszugeben ist wenig sinnvoll.

Ja, das ist schon klar. Aber es ging ja hier darum, dass die Wirkung der GROUP BY-Klausel unklar war und im ersten Beispiel für carlox nicht ersichtlich, da sie dort keine Wirkung hatte (mangels ausreichender Daten).


Gruß, Diophant



  Profil  Quote  Link auf diesen Beitrag Link
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1051
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, vom Themenstarter, eingetragen 2020-02-28


2020-02-27 17:28 - Creasy in Beitrag No. 10 schreibt:

Ehrlich gesagt überrascht es mich etwas, dass  ohr keine Fehlermeldungen bekommt. Ihr gruppiert nämlich nach s1,s2 aber nicht nach s3 aber gebt trotzdem s3 aus.
Ich zitiere auch aus diophants Link:
"Wenn Sie eine Spalte ausgeben, über diese jedoch weder aggregieren noch sie in der GROUP-BY-Klausel erwähnen, so erhalten Sie eine typische Fehlermeldung: 'Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'A_NR' nicht als Teil der Aggregatfunktion einschließt' (Beispiel Access)"

Hallo CreasY,
"Wenn Sie eine Spalte ausgeben, über diese jedoch weder aggregieren noch sie in der GROUP-BY-Klausel erwähnen, so erhalten Sie eine typische Fehlermeldung:..."

Betrachte folgende Abfrage:
SELECT s1,s2,s3,sum(s1), sum(s2) FROM `tab_c` group by s1,s2

Hier wird Spalte s3 ausgegeben. Über diese wird aber weder aggregiert noch wird sie in der GROUP BY Klausel erwähnt.

Ich bekomme keine Fehlermeldung, sondern das Ergebnis:
s1         s2         s3         sum(s1)         sum(s2)
1         2         12         2         4
1         3         13         1         3
2         1         212         4         2
3         1         312         6         2

Warum ist das so ?

mfg
cx



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 933
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, eingetragen 2020-02-28


2020-02-28 08:51 - carlox in Beitrag No. 12 schreibt:
Warum ist das so ?

Weil du ein DBMS benutzt, dass es mit den SQL-Standards nicht so genau nimmt. Siehe z.B. hier.



  Profil  Quote  Link auf diesen Beitrag Link
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 3407
Aus: Harz
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, eingetragen 2020-02-28


Hallo zusammen!

Dort steht auch, dass man entsprechend konfigurieren kann:

"Also, MySQL has an SQL mode to make it behave per the standard: ONLY_FULL_GROUP_BY"

Es wäre entsprechend sauberer, in solchen Fällen immer explizit mit GROUP BY zu gruppieren, und wenn man eine Reihenfolge der Ergebnisse benötigt, diese mit SORT herzustellen. Dann ist auch dokumentiert, wie die Sortierung erfolgt zB bei Zeichenketten und den notorischen Unklarheiten bezüglich Gross/Kleinschreibung, Umlauten etc. Darauf, dass der physikalisch zuerst gespeicherte Datensatz zuerst gefunden wird, sollte man sich nicht verlassen, da es eben keine dokumentierte Eigenschaft ist, sondern sich mehr oder wenig "zufällig" so ergibt, also spätestens mit neueren Versionen des Datenbanksystems auch anders sein könnte.

Grüsse aus dem - aktuell verschneiten - Harz
Gerhard/Gonz



  Profil  Quote  Link auf diesen Beitrag Link
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1051
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.15, vom Themenstarter, eingetragen 2020-02-28


2020-02-28 09:27 - gonz in Beitrag No. 14 schreibt:
Dort steht auch, dass man entsprechend konfigurieren kann:
"Also, MySQL has an SQL mode to make it behave per the standard: ONLY_FULL_GROUP_BY"
Es wäre entsprechend sauberer, in solchen Fällen immer explizit mit GROUP BY zu gruppieren, und wenn man eine Reihenfolge der Ergebnisse benötigt, diese mit SORT herzustellen. Dann ist auch dokumentiert, wie die Sortierung erfolgt zB bei Zeichenketten und den notorischen Unklarheiten bezüglich Gross/Kleinschreibung, Umlauten etc. Darauf, dass der physikalisch zuerst gespeicherte Datensatz zuerst gefunden wird, sollte man sich nicht verlassen, da es eben keine dokumentierte Eigenschaft ist, sondern sich mehr oder wenig "zufällig" so ergibt, also spätestens mit neueren Versionen des Datenbanksystems auch anders sein könnte.
Gerhard/Gonz

In meinem Beitrag 8 habe ich Folgendes gemacht:

Die Abfrage:
SELECT s1,s2,s3,sum(s1), sum(s2), sum(s3) FROM `tab_c` group by s1,s2

ergibt das Ergebnis:

s1      s2      s3      sum(s1) sum(s2) sum(s3)
1       2       12      2       4       134
1       3       13      1       3       13
2       1       212     4       2       423
3       1       312     6       2       623

1)
Bedeutet das, dass mit einer "neueren Versionen des Datenbanksystems"
die 4 Zeilen bei der obigen Ausgabe theoretisch in einer anderen (beliebigen) Reihenfolge ausgegeben werden könnten, also die Reihenfolge von der Version des Datenbanksystems abhängig ist ?

2)
Um also sicher zu gehen, dass die Reihenfolge nicht von der Version des
Datenbanksystems abhängig ist, müßte ich  also zusätzlich zu GROUP BY immer noch SORT verwenden.
Stimmt das ?

mfg
cx





  Profil  Quote  Link auf diesen Beitrag Link
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 3407
Aus: Harz
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.16, eingetragen 2020-02-28


Im Referenzhandbuch heisst es:

"You may have noticed in the preceding examples that the result rows are displayed in no particular order."

und weiter:

"To sort a result, use an ORDER BY clause."

( siehe hier: dev.mysql.com/doc/refman/8.0/en/sorting-rows.html )






  Profil  Quote  Link auf diesen Beitrag Link
carlox hat die Antworten auf ihre/seine Frage gesehen.
carlox wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]