Tillstånd efter att ha kört sql med en fråga. HA SQL: beskrivning, syntax, exempel


Slutligen är det sista avsnittet som används för att utvärdera tabelluttrycket HAR(om närvarande).

Kapitel HAR kan meningsfullt visas i ett tabelluttryck endast om det finns ett avsnitt i det GRUPP AV... Sökvillkoret för det här avsnittet anger ett villkor för en grupp rader i den grupperade tabellen. Formellt avsnitt HAR kan också finnas i ett tabelluttryck som inte innehåller GRUPP AV. I det här fallet antas det att resultatet av beräkningen av de föregående avsnitten är en grupperad tabell som består av en grupp utan de valda grupperingskolumnerna.

Sektionssökningsvillkor HARär byggd enligt samma syntaxregler som villkoret för sektionssökning VAR, och kan innehålla samma predikat. Det finns dock särskilda syntaktiska begränsningar för användningen av sökvillkoret för tabellkolumnspecifikationer från avsnittet FRÅN givet tabelluttryck. Dessa begränsningar följer av att avsnittet sökterm HAR anger villkoret på hela gruppen, inte på enskilda rader.

Därför, i de aritmetiska uttrycken av predikaten som ingår i urvalsvillkoret för avsnittet HAR, kan du direkt använda endast specifikationerna för de kolumner som anges som grupperingskolumner i avsnittet GRUPP AV... Resten av kolumnerna kan endast specificeras inom specifikationerna för aggregerade funktioner ANTAL, SUMMA, AVG, MIN och MAX, beräknar i detta fall något aggregerat värde för hela gruppen av rader. Situationen är liknande med underfrågorna som ingår i predikaten för sektionsvalsvillkoret HAR: om en egenskap hos den aktuella gruppen används i en underfråga, kan den endast specificeras genom att referera till grupperingskolumnerna.

Resultatet av att köra avsnittet HARär en grupperad tabell som endast innehåller de grupper av rader för vilka resultatet av utvärderingen av sökvillkoret är SANN. I synnerhet om avsnittet HAR finns i ett tabelluttryck som inte innehåller GRUPP AV, då blir resultatet av dess exekvering antingen en tom tabell eller resultatet av exekvering av föregående avsnitt av tabelluttrycket, betraktad som en grupp utan att gruppera kolumner.

HA RÄKNING

Välj koder för varor köpta av mer än en kund:

VÄLJ stock FRÅN ordrea GRUPP AV stock HAR RÄKNA(*) > 1;

HAR MIN

Skaffa lägsta och högsta lönevärden för tjänstemän i varje avdelning där den lägsta lönen är mindre än 1 000 $:

VÄLJ avd, MIN(sal), MAX(sal) FRÅN emp VAR jobb = 'CLERK' GRUPP AV avd.nr HAR MIN(sal)

Exempel 2. Databasen och tabellen är desamma som i exempel 1.

Med operatorerna SQL HAVING och GROUP BY måste du visa kategorier i vilken del som helst där det minsta antalet inskickade annonser inte överstiger 100. För att göra detta, skriv följande fråga:

VÄLJ Kategori, Enheter, MIN (Enheter) SOM Minimum FRÅN Annonser GRUPP EFTER Kategori ATT HAR MIN (Enheter)

Exempel 3. Databasen och tabellen är desamma som i de tidigare exemplen.

Med hjälp av SQL HAVING- och GROUP BY-satserna vill du visa annonskategorier som har mer än två delar. Vi skriver följande begäran:

VÄLJ Kategori, Del FRÅN Annonser GRUPP EFTER Kategori ATT HAR ANTAL (*)> 2

Resultatet blir följande tabell:

KategoriDel
FritidBöcker
Fritidmusik
FritidSpel
FastighetLägenheter
FastighetStugor
FastighetHus

Gör ditt eget arbete med Personaltabellen i företagets databas. Den har kolumner Namn (efternamn), Avdelning (avdelningsnummer), År (tjänstgöringstid) och Lön (lön). Självhjälpsexempel med länkar för att validera lösningen - efter tabellen.

namnAvdårLön
Sanders20 7 18357.5
Junkers15 6 16232.8
Månsken15 8 21500.6
Pernal20 8 18171.2
Aisen15 7 19540.7
McGregor15 7 15790.8
Marenghi38 5 17506.8
Läkare20 5 12322.4
Faktor38 8 16228.7

Exempel 5. Bestäm antalet avdelningar där den genomsnittliga arbetserfarenheten för anställda är mer än 6,5 år.

SQL HAVING-sats och jämförelse med värdet som returneras av kvantifieraren ALL eller ANY (SOME)

SQL HAVING-satsen kan användas för att hämta data som matchar jämförelseresultaten inte bara med ett givet tal, utan också med värdet som returneras av ALL eller ANY (SOME) kvantifierare. Kvantifieraren ALL returnerar det maximala värdet från frågan som den tillämpas på, och sedan med HAVING-operatorn utförs en jämförelse med det maximala värdet. Till exempel kommer ALL (10, 15, 20) att returnera 20. Kvantifieraren ANY (och dess analoga SOME) returnerar minimivärdet, och sedan med HAVING-operatorn utförs en jämförelse med minimivärdet. Syntaxen för en fråga med SQL HAVING-satsen som definierar en jämförelse med värdet som returneras av kvantifieraren ALL eller ANY (SOME) är följande :.

VÄLJ COLUMN_NAME FRÅN TABLE_NAME GROUP EFTER COLUMN_NAME HA AGGREGATE_FUNCTION(KOLUMNNAMN) COMPARATOR_OPERATOR QUANTOR ( VÄLJ AGGREGATE_FUNCTION(COLUMNNAME) FRÅN TABLE_NAME GROUP BY COLUMN_NAME)

Exempel 7. Det finns en databas "Theater". Den har en Play-tabell som innehåller data om teaterföreställningar. Den här tabellen innehåller fälten PlayID (identifierare), Namn (titel), Genre (genre), Author (författare), Dir_ID (främmande nyckel - regissörens identifierare), PremiereDate (premiärdatum), LastDate (slutdatum). Det krävs för att bestämma den mest populära teatergenren, det vill säga den genre där det största antalet produktioner har satts upp.

Med hjälp av SQL HAVING- och GROUP BY-satserna skriver vi den första delen av frågan till Play-tabellen, som jämför antalet rader grupperade efter genre:

VÄLJ Genre FRÅN Spelgrupp EFTER Genre ATT HA COUNT (*)> =

Nu måste du bestämma vad du ska jämföra med. Detta är det maximala antalet poster i samma tabell, grupperade efter genre. Därför behöver vi kvantifieraren ALL. Vi skriver den andra delen av begäran:

ALLA (VÄLJ ANTAL (*) FRÅN SPELGRUPP EFTER Genre)

Hela frågan för att bestämma den mest populära genren i teatern kommer att vara följande:

VÄLJ genre FRÅN SPELGRUPP EFTER Genre ATT HA COUNT (*)> = ALLA (VÄLJ ANTAL (*) FRÅN SPELGRUPP EFTER Genre)

SQL HAVING-sats på tabellkopplingar

Låt oss gå tillbaka till frågorna med SQL HAVING-satsen, där jämförelsen utförs med ett givet nummer, som i första stycket. Men låt oss komplicera uppgiften. I praktiken bestäms ofta antalet rader i en fråga av en främmande nyckel som refererar till en annan tabell.

Exempel 8. Vi fortsätter att arbeta med Teaterdatabasen. Vi kommer att behöva Play-tabellerna som innehåller data om teaterföreställningarna och Team som innehåller data om skådespelarnas roller. Det är nödvändigt att visa en lista över soloföreställningar (framträdanden med en skådespelare). Nedan är ett diagram över databasen "Theater" (för att förstora bilden, klicka på den med vänster musknapp).

Mer exakt måste vi välja föreställningar där det bara finns en roll. Bland fälten i Team-tabellen finns PlayID – en främmande nyckel som refererar till Play-bordet. I varje post i lagtabellen identifierar denna främmande nyckel i vilket skede rollen spelas. Om vi ​​kopplar ihop Play- och Team-borden med hjälp av PlayID-nyckeln kan vi bestämma antalet roller i produktionerna. Eftersom vi sammanfogar två tabeller, och inte fler, kan vi för enkelhets skull använda en join utan JOIN-operatorn, lista tabeller separerade med kommatecken och använda ordet WHERE för att indikera sammanfogningsvillkoret.

Med HAVING-operatorn använder vi COUNT-aggregatfunktionen - för att räkna antalet roller i varje produktion. Hela begäran om att definiera föreställningar med en roll, och därför med en skådespelare, kommer att vara följande:

Skriv frågor med SQL HAVING-sats själv och se sedan lösningar

Exempel 9. Vi fortsätter att arbeta med Teaterdatabasen. Lista de skådespelare som spelar mer än en roll i en föreställning och antalet roller.

Använd JOIN-operatorn. Naturligtvis, använd HAVING, GROUP BY.

Relationsdatabaser och SQL-språket

HAVING-satsen används i kombination med GROUP BY-satsen. Den kan användas i en SELECT-sats för att filtrera de poster som returneras av GROUP BY-satsen.

HAVING-satssyntax

aggregerad_funktion kan vara en funktion som SUM, COUNT, MIN eller MAX.

Ett exempel på användning av SUM-funktionen
Du kan till exempel använda SUM-funktionen för att hitta avdelningsnamn och försäljningsbelopp (för respektive avdelning). HAVING-erbjudandet kan endast väljas av de avdelningar vars försäljning är över $1000.

VÄLJ avdelning, SUMMA (försäljning) SOM "Total försäljning" FROM order_details GRUPPER EFTER avdelning HA SUMMA (försäljning)> 1000;

Exempel på användning av COUNT-funktionen
Du kan till exempel använda COUNT-funktionen för att hämta namnet på en avdelning och antalet anställda (på motsvarande avdelning) som har tjänat mer än $25 000 per år. HAVING-erbjudandet kommer endast att välja de avdelningar där det finns fler än 10 sådana anställda.

Exempel på användning av MIN-funktionen
Du kan till exempel använda MIN-funktionen för att returnera avdelningens namn och minimiinkomsten för den avdelningen. HAVING-klausulen kommer endast att returnera de avdelningar med intäkter som börjar på $35 000.

VÄLJ avdelning, MIN (lön) SOM "Lägsta lön" FRÅN anställda GRUPP FÖR avdelning HAR MIN (lön) = 35000;

Exempel på användning av MAX-funktionen
Du kan till exempel även använda funktionen för att hämta avdelningens namn och avdelningens maximala intäkter. HAVING-erbjudandet kommer endast att återbetala avdelningar med en maximal inkomst på mindre än 50 000 $.

VÄLJ avdelning, MAX (lön) SOM "Högsta lön" FRÅN anställda GRUPP FÖR avdelning HAR MAX (lön)< 50000 ;

Den har i sin arsenal många kraftfulla verktyg för att manipulera data som lagras i form av tabeller.

Utan tvekan är möjligheten att gruppera data när de väljs ut enligt ett visst kriterium ett av sådana verktyg. HAVING, tillsammans med WHERE-satsen, låter dig definiera villkor för att välja data som redan är grupperad på något sätt.

HAVING SQL-parameter: beskrivning

Först och främst bör det noteras att denna parameter är valfri och används uteslutande tillsammans med parametern GROUP BY. Som ni minns används GROUP BY när aggregerade funktioner används i SELECT, och resultaten av deras beräkningar måste erhållas för vissa grupper. Om WHERE tillåter dig att ange urvalsvillkor innan data grupperas, så innehåller HAVING villkor som rör data direkt i grupperna själva. För en bättre förståelse, låt oss ta en titt på det schematiska exemplet som visas i figuren nedan.

Detta är ett bra exempel för att beskriva ATT HA SQL. Givet en tabell med en lista över produktnamn, företag som producerar dem och några andra områden. I förfrågan i det övre högra hörnet försöker vi få information om hur många produktnamn varje företag producerar, medan vi i resultatet vill visa endast de företag som producerar fler än 2 namn. GROUP BY-parametern bildade tre grupper som motsvarade företagens namn, för var och en av vilka antalet produkter (rader) beräknades. Men HAVING-parametern skar av sitt villkor en grupp från det resulterande urvalet, eftersom den inte uppfyllde villkoret. Som ett resultat får vi två grupper motsvarande företag med antalet produkter 5 och 3.

Du kanske undrar varför du ska använda HAVING när SQL har en WHERE. Om vi ​​använde WHERE, skulle det titta på det totala antalet rader i tabellen, och inte efter grupper, och villkoret skulle inte vara vettigt i det här fallet. Men ganska ofta går de bra överens i en förfrågan.

I exemplet ovan kan vi se hur data först väljs av namnen på anställda som anges i parametern WHERE, och sedan kontrolleras resultatet grupperat i GROUP BY dessutom för lönebeloppet för varje anställd.

SQL HAVING-parameter: exempel, syntax

Låt oss titta på några av funktionerna i HAVING SQL-syntaxen. Beskrivningen av denna parameter är ganska enkel. Först, som redan nämnts, används den uteslutande tillsammans med parametern GROUP BY och specificeras omedelbart efter den och före ORDER BY, om det finns en i frågan. Detta är förståeligt, eftersom HAVING definierar villkor för redan grupperade data. För det andra kan endast aggregerade funktioner och fält som anges i parametern GROUP BY användas i villkoret för denna parameter. Alla villkor i denna parameter specificeras på exakt samma sätt som i fallet WHERE.

Slutsats

Som du kan se är det inget komplicerat i den här operatören. Semantiskt används det på samma sätt som WHERE. Det är viktigt att förstå att WHERE används med avseende på alla valda data, och HAVING används endast med avseende på de grupper som anges i parametern GROUP BY. Vi har tillhandahållit en omfattande beskrivning av HAVING SQL, vilket är tillräckligt för att arbeta med det med tillförsikt.

I förra artikeln red vi ut det. Där skrev jag att denna konstruktion gör att man kan välja separata grupper och för varje grupp räkna ut de funktioner som anges efter VÄLJ... A HAR tillåter, beroende på resultatet av exekvering av funktioner, att filtrera bort extra rader från grupper. Låt oss ta en närmare titt på detta.

Låt oss komma ihåg vårt tidigare problem, där vi beräknade det genomsnittliga priset på mjölk för en specifik stormarknadskedja. Låt oss inte bara titta på det genomsnittliga priset med dig, utan också visa bara de stormarknadskedjor där snittpris under 38.

För denna filtrering baserat på resultaten av exekveringen av aggregatfunktionen, använd i SQL HAVING-kommandot:

VÄLJ `shop_id`, AVG (`pris`) FRÅN `table` GROUP BY` shop_id` HA AVG (`price`)< 38

Som ett resultat, istället för 4-x linjer kommer vi bara att ha 3 :

shop_id AVG ('pris')
1 37.5
2 36.0
3 37.0

Om konstruktionerna GRUPP AV kommer inte, då HAR kommer inte att gälla för en specifik grupp, utan för hela urvalet. Detta innebär att om tillståndet HAR kommer att köras, då kommer det inte att ha någon effekt. Och om det inte exekveras, kommer det inte att finnas någon resulterande rad.







2021 gtavrl.ru.