3.1 GRUPPER FOR erklæring
SQL-sproget er meget kraftfuldt. Ud over simpel datahentning giver det dig mulighed for at gruppere data på forespørgselstidspunktet. For eksempel vil vi gerne vide, hvor mange slags produkter af hvert mærke vi har, hvordan kan vi gøre det?
Der er en speciel operatør til dette GROUP BY
, her er hvordan det er skrevet.
GROUP BY column
Lad os skrive en forespørgsel, der beder SQL om at vise antallet af produkttyper for hvert mærke. En sådan anmodning ville se sådan ud:
SELECT brand, COUNT(*)
FROM product
GROUP BY brand
Du får følgende forespørgselsresultat:
mærke | tælle(*) |
---|---|
(NUL) | 2 |
Bosch | 4 |
IKEA | 6 |
LG | 2 |
Smartflower | 1 |
Lad os omhyggeligt analysere, hvilken slags anmodning vi skrev, og hvilken slags resultat vi fik. Som et resultat ser vi to kolonner. Den første med en liste over mærker, hvilket er logisk. Vi ønskede at få noget som et sæt par "mærke --> antal" .
Bemærk venligst, at der blandt mærkenavnene er et ord NULL
. Faktisk har vi produkter i det mærke, som det er skrevet i NULL
, og vi ser dem her. Lidt uventet, men hjælpsomt. Vi kan se, hvor mange umærkede produkter, der er.
Lad os nu se nærmere på anmodningen. Vi ville gerne vide antallet af produkter af hvert mærke, så vi skrev GROUP BY brand
, og i SELECT
skrev vi mærke og udtrykketCOUNT(*)
COUNT(*)
er en såkaldt aggregeret funktion, der udføres på en række rækker. I vores tilfælde tæller hun simpelthen deres antal. Der er mange sådanne funktioner, og dem vil vi se på lidt senere.
3.2 Komplekse forespørgsler med GROUP BY
Lad os nu skrive en forespørgsel, hvor vi først kasserer produkter, hvis pris er mindre end 10, og derefter grupperer dem. En sådan anmodning ville se sådan ud:
SELECT brand, COUNT(*)
FROM product
WHERE price > 10
GROUP BY brand
Du får følgende forespørgselsresultat:
mærke | tælle(*) |
---|---|
Bosch | 4 |
IKEA | 5 |
LG | 2 |
Smartflower | 1 |
Alle NULL-produkter forsvandt fra vores resultattabel, da de var meget billige, og antallet af IKEA-produkter faldt med 1. Fra 6 til 5.
Dette foreslår, at du først anvender WHERE
de ønskede linjer til filtrering og først derefter anvender grupperingen på resultatet.
3.3 Kolonnenavne på resultatet
Forresten kan du give navne til de resulterende kolonner. Kan du se, hvordan serveren foreslog navnet count(*)
? Lad os erstatte det med total. En sådan anmodning ville se sådan ud:
SELECT brand, COUNT(*) AS total
FROM product
WHERE price > 10
GROUP BY brand
Du får følgende forespørgselsresultat:
mærke | Total |
---|---|
Bosch | 4 |
IKEA | 5 |
LG | 2 |
Smartflower | 1 |
Du kan også omdøbe eksisterende kolonner. Lad os tage en af de tidligere brugte forespørgsler og tilføje nye navne til kolonnerne.
SELECT
id AS product_id,
name AS product_name,
price
FROM product
WHERE price < 20 AND brand IS NOT NULL
Du får følgende forespørgselsresultat:
produkt_id | produktnavn | pris |
---|---|---|
2 | Stol | 5.00 |
8 | Lampe | 15.00 |