Introduktion till SQL HAVING-klausul
Den mycket grundläggande frågan som kommer in i sinnet är vad är denna HAVING-klausul? Tja, HAVING-klausulen används för att filtrera bort resultaten från en SQL-fråga med aggregerade funktioner. För att förstå på vanligt engelska, är det kommandot SQL-parsern "Hej SQL, från vår kunddatatabell, hämta mig namnen på länder som har mer än 1 miljon kunder".
Vänta, det är vad WHERE-klausulen gör, eller hur? Ja, det är väldigt likt hur WHERE-klausulen fungerar men med en liten skillnad. WHERE-klausulen fungerar inte med aggregerade funktioner.
Nu, bara för att sammanfatta lite om aggregerade funktioner, det här är funktioner som tar flera rader som ingång och ger en mer signifikant bearbetad utgång. Några exempel är Count (), Sum (), Min (), Max (), Avg () etc.
Varför HAVA och inte VAR?
Vi ser att HAVING och WHERE-klausuler utför en mycket liknande uppgift för att filtrera bort resultaten. Vad var då behovet av HAVING-klausulen? Varför kunde inte WHERE-klausulen användas med aggregerade funktioner?
För att svara på detta måste vi förstå hur SQL-motorn behandlar de två klausulerna. FRA-klausulen i varje SQL-kommando säger motorn varifrån den ska läsas raderna. Data lagras på disken och hämtas i minnet för bearbetning. När raderna läses en och en från skivan till minnet, kontrolleras de för WHERE-klausulen. Raderna som misslyckas med WHERE-klausulen laddas inte i minnet. Således utvärderas WHERE-klausulen för varje rad när de behandlas av SQL-motorn.
Tvärtom, HAVING-klausulen kommer in i bilden först efter att raderna har laddats i minnet. När de har laddats in i minnet utför de aggregerade funktionerna sin uppgift på raderna med önskat tillstånd.
Om vi nu skulle sätta en WHERE-klausul med den sammanlagda funktionen som avg () skulle detta förvirra SQL-motorn om den skulle inkludera raden för att beräkna medelvärdet eller inte. I grund och botten skulle vi beordra motorn att inte läsa raden eftersom den inte passade kriterierna för avg () i WHERE-klausulen. Men hej, för att avgöra om det passerade eller misslyckades med beräkningskriterierna för avg () måste raden läsas in i minnet. Ett tillstånd av dödläge.
Syntaxen
SELECT
FROM
Kundnummer | Köparens namn | Stad | Land |
1 | Anja Damian | Berlin | Tyskland |
2 | Denny Cockett | México DF | mexico |
3 | Eleanor Calnan | México DF | mexico |
4 | Albertha Albury | London | Storbritannien |
5 | Latisha Nembhard | Luleå | Sverige |
6 | Madalene Bing | Mannheim | Tyskland |
7 | Rebecka Beegle | Strasbourg | Frankrike |
8 | Rosy Tippie | madrid | Spanien |
9 | Audie Khan | Marseille | Frankrike |
10 | Hildegard Burrowes | Tsawassen | kanada |
11 | Cordell Dutremble | London | Storbritannien |
12 | Nora Reyna | Buenos Aires | argentina |
13 | Ursula Laforest | México DF | mexico |
14 | Claudie Neel | Bern | schweiz |
15 | Portia Yee | Sao Paulo | Brasilien |
16 | Angila Segarra | London | Storbritannien |
17 | Lise Wexler | Aachen | Tyskland |
18 | Ned Mendivil | Nantes | Frankrike |
19 | Sara Vidaurri | London | Storbritannien |
20 | Tayna Navin | Graz | österrike |
21 | Pura Ray | Sao Paulo | Brasilien |
22 | Erika Byard | madrid | Spanien |
23 | Jimmie Luke | Lille | Frankrike |
24 | Shayla Byington | Bräcke | Sverige |
25 | Christiana Boden | München | Tyskland |
26 | Irina Nitta | Nantes | Frankrike |
27 | Bryanna Alls | Torino | Italien |
28 | Norah Picken | Lisboa | portugal |
29 | Moriah Stwart | Barcelona | Spanien |
30 | Idella Harriott | Sevilla | Spanien |
OrderID | Kundnummer | Orderdatum |
10254 | 14 | 1996/11/07 |
10258 | 20 | 17-07-1996 |
10259 | 13 | 18-07-1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24-07-1996 |
10265 | 7 | 25-07-1996 |
10267 | 25 | 29-07-1996 |
10278 | 5 | 1996/12/08 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 1996/04/09 |
10303 | 30 | 1996/11/09 |
10308 | 2 | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 1996/10/10 |
10327 | 24 | 1996/11/10 |
10328 | 28 | 14-10-1996 |
10331 | 9 | 16-10-1996 |
10337 | 25 | 24-10-1996 |
10340 | 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10347 | 21 | 1996/06/11 |
10351 | 20 | 1996/11/11 |
10352 | 28 | 1996/12/11 |
10355 | 4 | 15-11-1996 |
10360 | 7 | 22-11-1996 |
10362 | 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10364 | 19 | 26-11-1996 |
10365 | 3 | 27-11-1996 |
10366 | 29 | 28-11-1996 |
10368 | 20 | 29-11-1996 |
10370 | 14 | 1996/03/12 |
10378 | 24 | 1996/10/12 |
10382 | 20 | 13-12-1996 |
10383 | 4 | 16-12-1996 |
10384 | 5 | 16-12-1996 |
10386 | 21 | 18-12-1996 |
10389 | 10 | 20-12-1996 |
10390 | 20 | 23-12-1996 |
10391 | 17 | 23-12-1996 |
10396 | 25 | 27-12-1996 |
10400 | 19 | 1997/01/01 |
10402 | 20 | 1997/02/01 |
10403 | 20 | 1997/03/01 |
10408 | 23 | 1997/08/01 |
10410 | 10 | 1997/10/01 |
10411 | 10 | 1997/10/01 |
10414 | 21 | 14-01-1997 |
10422 | 27 | 22-01-1997 |
10426 | 29 | 27-01-1997 |
10430 | 20 | 30-01-1997 |
10431 | 10 | 30-01-1997 |
10434 | 24 | 1997/03/02 |
10435 | 16 | 1997/04/02 |
10436 | 7 | 1997/05/02 |
10442 | 20 | 1997/11/02 |
Nu vill vi veta kunder i vilka länder som har gjort totalt 5 eller fler beställningar hos oss. Det kan vara en enda kund som gör mer än 5 beställningar eller 5 kunder som gör en beställning vardera.
För att uppnå detta skulle vi behöva
Steg 1 : Gå med i de två borden
Steg 2: Gruppera kunderna baserat på deras länder
Steg 3: Räkna antalet beställningar för varje grupp
Steg 4: Filtrera resultaten för 5 eller fler beställningar
Låt oss formulera kommandot:
SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC
Här är resultaten:
Land | NumberOfOrders |
österrike | 10 |
Frankrike | 9 |
Sverige | 7 |
Tyskland | 6 |
Storbritannien | 6 |
Slutsats - SQL HAVING-klausul
Således har vi sett vad syftet med HAVING-klausulen är och hur fungerar det. Det är viktigt att förstå det grundläggande arbetet, annars kan du bli förvirrad över varför HAVING-klausulen inte ger de önskade resultaten. Fortsätt spela med olika bord och sammanfogningar och kombinationer tillsammans med HAVING-klausulen.
Rekommenderade artiklar
Detta är en guide till SQL HAVING-klausulen. Här diskuterar vi hur HAVING-klausulen fungerar i SQL och exempel med följande tabell över kunder. Du kan också gå igenom våra andra föreslagna artiklar -
- SQL Infoga fråga
- Utländsk nyckel i SQL
- Särskilt sökord i SQL
- SQL Views
- Topp 6 förfrågan Exempel på Inre medlem i Oracle