3.1 GROUP BY-verklaring

De SQL-taal is erg krachtig. Naast het eenvoudig ophalen van gegevens, kunt u gegevens groeperen tijdens het uitvoeren van een query. We willen bijvoorbeeld weten hoeveel soorten producten we van elk merk hebben, hoe kunnen we dat doen?

Hier is een speciale operator voor GROUP BY, zo wordt het geschreven.

GROUP BY column

Laten we een query schrijven die SQL vraagt ​​om het aantal producttypes voor elk merk weer te geven. Zo'n verzoek ziet er ongeveer zo uit:

SELECT brand, COUNT(*)
FROM product
GROUP BY brand

U krijgt het volgende zoekresultaat:

merk graaf(*)
(NUL) 2
Bosch 4
Ikea 6
LG 2
Slimme bloem 1

Laten we zorgvuldig analyseren wat voor soort verzoek we hebben geschreven en wat voor resultaat we hebben gekregen. Als resultaat zien we twee kolommen. De eerste met een lijst met merken, wat logisch is. We wilden zoiets krijgen als een set paren "merk -> aantal" .

Houd er rekening mee dat er onder de merknamen een woord is NULL. We hebben inderdaad producten in het merk waarin het is geschreven NULL, en we zien ze hier. Een beetje onverwacht, maar nuttig. We kunnen zien hoeveel merkloze producten er zijn.

Laten we het verzoek nu eens nader bekijken. We wilden het aantal producten van elk merk weten, dus schreven we GROUP BY brand, en in SELECTschreven we merk en de uitdrukkingCOUNT(*)

COUNT(*)is een zogenaamde aggregatiefunctie die wordt uitgevoerd op een groep rijen. In ons geval telt ze gewoon hun aantal. Er zijn veel van dergelijke functies, en we zullen ze later bekijken.

3.2 Complexe queries met GROUP BY

Laten we nu een query schrijven waarbij we eerst producten weggooien waarvan de prijs lager is dan 10, en ze vervolgens groeperen. Zo'n verzoek ziet er ongeveer zo uit:

SELECT brand, COUNT(*)
FROM product
WHERE price > 10
GROUP BY brand

U krijgt het volgende zoekresultaat:

merk graaf(*)
Bosch 4
Ikea 5
LG 2
Slimme bloem 1

Alle NULL-producten verdwenen uit onze resultatentabel, omdat ze erg goedkoop waren, en het aantal IKEA-producten daalde met 1. Van 6 naar 5.

Dit suggereert dat u eerst WHEREde gewenste regels toepast om te filteren en pas daarna de groepering op het resultaat toepast.

3.3 Kolomnamen van het resultaat

Overigens kunt u namen geven aan de resulterende kolommen. Zie je hoe de server de naam voorstelde count(*)? Laten we het vervangen door totaal. Zo'n verzoek ziet er ongeveer zo uit:

SELECT brand, COUNT(*) AS total
FROM product
WHERE price > 10
GROUP BY brand

U krijgt het volgende zoekresultaat:

merk totaal
Bosch 4
Ikea 5
LG 2
Slimme bloem 1

U kunt ook bestaande kolommen hernoemen. Laten we een van de eerder gebruikte query's nemen en nieuwe namen aan de kolommen toevoegen.

SELECT
id AS  product_id,
name AS product_name,
price
FROM product
WHERE price < 20 AND brand IS NOT NULL

U krijgt het volgende zoekresultaat:

Product-ID productnaam prijs
2 Stoel 5.00
8 Lamp 15.00 uur