logo

Razlika med WHERE in HAVING

Stavka WHERE in HAVING sta podrobno obravnavana v tem članku. Uporabljajo se tudi za filtriranje zapisov v poizvedbah SQL. Razlika med stavkoma WHERE in HAVING je najpogostejše vprašanje, zastavljeno med intervjujem. Glavna razlika med njima je v tem, da se klavzula WHERE uporablja za določitev pogoja za filtriranje zapisov, preden se izvedejo kakršna koli združevanja, medtem ko se klavzula HAVING uporablja za določitev pogoja za filtriranje vrednosti iz skupine. Pred primerjavo se bomo najprej seznanili s temi SQL klavzule.

KJE proti IMETI

Klavzula WHERE

Klavzula WHERE v MySQL se uporablja z SELECT, VSTAVI , NADGRADNJA , in IZBRIŠI poizvedbe za filtriranje podatkov iz tabele ali relacije. Opisuje poseben pogoj pri pridobivanju zapisov iz ene tabele ali več tabel z uporabo člena JOIN. Če je podani pogoj izpolnjen, vrne določeno vrednost iz tabele. Klavzula WHERE postavi pogoje na izbrane stolpce.

Klavzula WHERE v MySQL lahko tudi izvajati logične povezovalnike IN , ALI , in NE. Znani so kot logični pogoj, ki mora biti prav za pridobitev podatkov. Logični povezovalni izrazi uporabljajo primerjalne operatorje kot svoje operande<, ,>=, = in . Primerjalni operatorji se običajno uporabljajo za primerjavo nizov in aritmetičnih izrazov.

Naslednja sintaksa ponazarja uporabo stavka WHERE:

 SELECT column_lists, FROM table_name WHERE conditions GROUP BY column_lists; 

Vzemimo primer, da bomo razumeli to klavzulo. Recimo, da imamo tabelo z imenom zaposlenih ki vsebuje naslednje podatke:

KJE proti IMETI

Če želimo pridobiti podrobnosti o zaposlenem, katerega delovni čas je daljši od 9 , potem lahko izjavo uporabimo na naslednji način:

primerek java
 mysql&gt; SELECT * FROM employees WHERE working_hour &gt; 9; 

Dobili bomo spodnji rezultat, kjer lahko vidimo podrobnosti zaposlenih, katerih delovni čas je daljši od 9:

java povezljivost
KJE proti IMETI

Če uporabimo zgornjo poizvedbo z ZDRUŽI PO klavzule, bomo dobili drugačen rezultat:

 mysql&gt; SELECT * FROM employees WHERE working_hour &gt; 9 GROUP BY name; 

Tukaj je rezultat:

KJE proti IMETI

IMETI klavzulo

Klavzula HAVING v MySQL uporablja se v povezavi z GROUP BY klavzula nam omogoča, da določimo pogoje, ki filtrirajo, kateri rezultati skupine so prikazani v rezultatu. Iz skupin v končnem rezultatu vrne le tiste vrednosti, ki izpolnjujejo določene pogoje. Pri izbiri lahko skupaj uporabimo tudi stavek WHERE in HAVING. V tem primeru klavzula WHERE najprej filtrira posamezne vrstice, nato se vrstice združijo, izvedejo agregatne izračune in nazadnje klavzula HAVING filtrira skupine.

Ta člen postavlja pogoje za skupine, ustvarjene s členom GROUP BY. Obnaša se kot stavek WHERE, ko stavek SQL ne uporablja ključne besede GROUP BY. Uporabljamo lahko agregatne (skupinske) funkcije, kot so SUM, MIN, MAX, AVG in ŠTEJTE samo z dvema stavkoma: SELECT in HAVING.

Naslednja sintaksa ponazarja uporabo klavzule HAVING:

 SELECT column_lists, aggregate_function (expression) FROM table_name WHERE conditions GROUP BY column_lists HAVING condition; 

Vzemimo primer, da bomo razumeli to klavzulo. Tukaj razmišljamo o isti tabeli zaposlenih za demonstracijo.

Če želimo da bi dobili skupni delovni čas za vsakega zaposlenega, katerega delovni čas je daljši od 6 ur , potem lahko izjavo uporabimo na naslednji način:

 mysql&gt; SELECT name, SUM(working_hour) AS &apos;Total working hours&apos; FROM employees GROUP BY name HAVING SUM(working_hour) &gt; 6; 

Dobili bomo spodnji rezultat, kjer lahko vidimo skupno število delovnih ur vsakega zaposlenega:

KJE proti IMETI

Ključne razlike med klavzulo WHERE in HAVING

Naslednje točke pojasnjujejo glavne razlike med bazo podatkov in shemo:

  • Klavzula WHERE filtrira posamezne vrstice, medtem ko klavzula HAVING filtrira skupine namesto ene vrstice naenkrat.
  • Klavzule WHERE ne moremo uporabiti z združevalnimi funkcijami, ker deluje za filtriranje posameznih vrstic. V nasprotju s tem HAVING lahko deluje z združevalnimi funkcijami, ker se uporablja za filtriranje skupin.
  • Operacije vrstic obravnava stavek WHERE, medtem ko stavek HAVING obravnava operacije stolpcev za povzete vrstice ali skupine.
  • WHERE je pred GROUP BY, kar pomeni vrstice filtriranja stavka WHERE pred izvajanjem skupnih izračunov. HAVING pride za GROUP BY, kar pomeni, da klavzula HAVING filtrira vrstice po izvedbi skupnih izračunov. Posledično je HAVING počasnejši od WHERE v smislu učinkovitosti in se mu je treba izogibati, kjer koli je to mogoče.
  • Stavka WHERE in HAVING lahko združimo skupaj v poizvedbi SELECT. V tem primeru se za filtriranje posameznih vrstic najprej uporabi stavek WHERE. Vrstice se nato združijo, izvedejo seštevne izračune in na koncu se za filtriranje skupin uporabi klavzula HAVING.
  • Klavzula WHERE pridobi želene podatke na podlagi podanega pogoja. Po drugi strani klavzula HAVING najprej pridobi celotne podatke, nato pa se izvede ločitev na podlagi podanega pogoja.
  • Brez stavka SELECT ne moremo uporabiti stavka HAVING. Nasprotno pa lahko uporabimo WHERE s stavki SELECT, UPDATE in DELETE.
  • Klavzula WHERE je predfilter, klavzula HAVING pa naknadni filter.

Primerjalna tabela WHERE in HAVING

Naslednja primerjalna tabela na hitro razloži njihove glavne razlike:

Osnova primerjave Klavzula WHERE IMETI klavzulo
Opredelitev Uporablja se za izvedbo filtracije posameznih vrstic. Uporablja se za izvajanje filtracije skupin.
Osnovno Izvaja se v operacijah vrstic. Izvaja se v operacijah stolpcev.
Pridobivanje podatkov Klavzula WHERE pridobi specifične podatke iz določenih vrstic na podlagi podanega pogoja Klavzula HAVING najprej pridobi celotne podatke. Nato jih loči glede na dano stanje.
Agregatne funkcije Klavzula WHERE ne dovoljuje dela z agregatnimi funkcijami. Klavzula HAVING lahko deluje z agregatnimi funkcijami.
Obnašaj se kot Klavzula WHERE deluje kot predfilter. Klavzula HAVING deluje kot naknadni filter.
Uporablja se z Klavzulo WHERE lahko uporabimo s stavki SELECT, UPDATE in DELETE. Klavzulo HAVING lahko uporabljate samo s stavkom SELECT.
ZDRUŽI PO Klavzula GROUP BY je za klavzulo WHERE. Klavzula GROUP BY je pred klavzulo HAVING.

Zaključek

V tem članku smo naredili primerjavo med klavzulo WHERE in HAVING. Tukaj sklepamo, da oba stavka delujeta na enak način pri filtriranju podatkov, le da zaradi nekaterih dodatnih funkcij je stavek HAVING bolj priljubljen. Z agregatnimi funkcijami lahko učinkovito delamo v klavzuli HAVING, medtem ko WHERE ne dovoljuje agregatnih funkcij.

mylivecricket za kriket v živo