3.1 Declarația GROUP BY
Limbajul SQL este foarte puternic. Pe lângă preluarea simplă a datelor, vă permite să grupați datele în timpul interogării. De exemplu, vrem să știm câte tipuri de produse de fiecare marcă avem, cum putem face asta?
Există un operator special pentru asta GROUP BY
, iată cum este scris.
GROUP BY column
Să scriem o interogare care solicită SQL să afișeze numărul de tipuri de produse pentru fiecare marcă. O astfel de cerere ar arăta cam așa:
SELECT brand, COUNT(*)
FROM product
GROUP BY brand
Veți obține următorul rezultat al interogării:
marca | numara(*) |
---|---|
(NUL) | 2 |
Bosch | 4 |
IKEA | 6 |
LG | 2 |
Smartflower | 1 |
Să analizăm cu atenție ce fel de cerere am scris și ce fel de rezultat am obținut. Ca rezultat, vedem două coloane. Primul cu o listă de mărci, ceea ce este logic. Am vrut să obținem ceva de genul unui set de perechi „brand --> amount” .
Vă rugăm să rețineți că printre numele mărcilor există un cuvânt NULL
. Într-adevăr, avem produse în marca în care este scris NULL
și le vedem aici. Puțin neașteptat, dar util. Putem vedea câte produse fără marcă există.
Acum să aruncăm o privire mai atentă la cerere. Am vrut să știm numărul de produse ale fiecărui brand, așa că am scris GROUP BY brand
, iar în SELECT
am scris brand și expresiaCOUNT(*)
COUNT(*)
este o așa-numită funcție agregată care este efectuată pe un grup de rânduri. În cazul nostru, ea pur și simplu numără numărul lor. Există o mulțime de astfel de funcții și le vom analiza puțin mai târziu.
3.2 Interogări complexe cu GROUP BY
Acum să scriem o interogare în care mai întâi aruncăm produsele al căror preț este mai mic de 10, apoi le grupăm. O astfel de cerere ar arăta cam așa:
SELECT brand, COUNT(*)
FROM product
WHERE price > 10
GROUP BY brand
Veți obține următorul rezultat al interogării:
marca | numara(*) |
---|---|
Bosch | 4 |
IKEA | 5 |
LG | 2 |
Smartflower | 1 |
Toate produsele NULL au dispărut din tabelul nostru de rezultate, deoarece erau foarte ieftine, iar numărul de produse IKEA a scăzut cu 1. De la 6 la 5.
Acest lucru sugerează că mai întâi aplicați WHERE
liniile dorite pentru a filtra și abia apoi aplicați gruparea rezultatului.
3.3 Numele coloanelor rezultatului
Apropo, puteți da nume coloanelor rezultate. Vedeți cum a sugerat serverul numele count(*)
? Să-l înlocuim cu total. O astfel de cerere ar arăta cam așa:
SELECT brand, COUNT(*) AS total
FROM product
WHERE price > 10
GROUP BY brand
Veți obține următorul rezultat al interogării:
marca | total |
---|---|
Bosch | 4 |
IKEA | 5 |
LG | 2 |
Smartflower | 1 |
De asemenea, puteți redenumi coloanele existente. Să luăm una dintre interogările utilizate anterior și să adăugăm nume noi coloanelor.
SELECT
id AS product_id,
name AS product_name,
price
FROM product
WHERE price < 20 AND brand IS NOT NULL
Veți obține următorul rezultat al interogării:
product_id | numele produsului | Preț |
---|---|---|
2 | Scaun | 5.00 |
8 | Lampă | 15.00 |