"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

mysql: unterschied zw. where/having und order by/group by

kleinerChemiker 08.10.2003 - 18:28 9070 3
Posts

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282
Code:
SELECT [STRAIGHT_JOIN]
       [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
       [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
       [DISTINCT | DISTINCTROW | ALL]
    select_expression,...
    [INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
    [FROM table_references
      [WHERE where_definition]
      [GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...
      [HAVING where_definition]
      [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
      [LIMIT [offset,] rows]
      [PROCEDURE procedure_name]
      [FOR UPDATE | LOCK IN SHARE MODE]]

das ist ein ausschnitt aus der mysql doku. aber worin besteht nun der unterschied in where und having bzw. in group by und order by? bisher benutze ich eigentlich nur where und order by, aber mich würds interessieren wofür das andere zu benutzen ist, bzw. ob ich da nicht vielleicht eh was bisi falsch mach.:confused:

tia

MIK

Guest

Deleted User
Registered: n/a
Location:
Posts: n/a
"order by" sortiert nur die reihenfolge der rows bei der ausgabe

"group by" fasst dir bereiche zusammen - hilft zB beim zählen von records.
beispiel:

select name, count(id) as anzahl from einwohner group by name
bringt bei der entsprechenden anzahl an datensätzen mit name="huber", "müller" usw als ergebnis:

name anzahl
huber 5
müller 2
reithofer 1



"where" und "having" unterscheidet sich nur im praktischen einsatz - in manchen fällen kannst kein "where" mehr machen, weil du schon datensätze gefiltert hast oder eine berechnete spalte hast, dann nimmst einfach das "having".

beispiel (im zusammenhang mit "group by"):

select name, count(id) as anzahl from einwohner group by name having anzahl > 1

bringt aus der gleichen tabelle wie oben

name anzahl
huber 5
müller 2

und keinen reithofer, der hat ja kein "anzahl > 1"

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
man kann sich das so vorstellen, wie eine abfrage von der datenbank abgearbeitet wird:

a) datenbank erstellt das kartesische produkt aller tabellen (jedes element einer tabelle wird mit jedem element der anderen tabelle verknuepft; bsp: tab1 {a,b,c}, tab2 {1,2}, kartesisches produkt: {a1,a2,b1,b2,c1,c2}
b) wähle alle datensätze, die der where klausel entsprechen, verwerfe alle anderen
c) gruppiere anhand der group-klausel
d) wähle anhand der having-klausel
e) sortiere anhand der sort-by klausel

dadurch ist es zb möglich in der having-klausel auswahlen zu treffen, die erst durch das gruppieren entstanden sind.

(natürlich versucht die datenbank vorab zu optimieren und arbeitet daher ganz anders, weil das kartesische produkt zweier 1000 datensätze großer tabellen, bereits eine million einträge fassen würde)

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282
thx

wieder was gelernt :)

MIK
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz