Ik begrijp het punt van GROUP BY x
.
Maar hoe werkt GROUP BY x, y
werk, en wat betekent het?
Antwoord 1, Autoriteit 100%
Group By X
Middelen Zet al die met dezelfde waarde voor x in de ene groep .
Group By X, Y
BETREKKING Zet al die met dezelfde waarden voor zowel X als Y in de One Group .
Om te illustreren met behulp van een voorbeeld, laten we zeggen dat we de volgende tabel hebben, te maken met wie bijwonen welk onderwerp op een universiteit is:
Table: Subject_Selection
+---------+----------+----------+
| Subject | Semester | Attendee |
+---------+----------+----------+
| ITB001 | 1 | John |
| ITB001 | 1 | Bob |
| ITB001 | 1 | Mickey |
| ITB001 | 2 | Jenny |
| ITB001 | 2 | James |
| MKB114 | 1 | John |
| MKB114 | 1 | Erica |
+---------+----------+----------+
Wanneer u alleen een GROUP BY
op de kolom Onderwerp; Zeg:
select Subject, Count(*)
from Subject_Selection
group by Subject
je krijgt zoiets:
+---------+-------+
| Subject | Count |
+---------+-------+
| ITB001 | 5 |
| MKB114 | 2 |
+---------+-------+
… omdat er 5 inzendingen zijn voor ITB001, en 2 voor MKB114
Als we naar GROUP BY
twee kolommen:
select Subject, Semester, Count(*)
from Subject_Selection
group by Subject, Semester
We zouden dit krijgen:
+---------+----------+-------+
| Subject | Semester | Count |
+---------+----------+-------+
| ITB001 | 1 | 3 |
| ITB001 | 2 | 2 |
| MKB114 | 1 | 2 |
+---------+----------+-------+
Dit komt omdat, wanneer we groeperen op twee kolommen, er wordt gezegd “Groepeer ze zo dat al diegenen met hetzelfde onderwerp en semester in dezelfde groep zitten, en bereken dan alle geaggregeerde functies(Aantal, Som, Gemiddelde, etc.) voor elk van die groepen”. In dit voorbeeld wordt dit aangetoond door het feit dat, als we ze tellen, er driemensen zijn die ITB001 doen in semester 1 en tweehet doen in semester 2. Beiden van de mensen die MKB114 doen zit in semester 1, dus er is geen rij voor semester 2 (geen gegevens passen in de groep “MKB114, Semester 2”)
Hopelijk is dat logisch.
Antwoord 2, autoriteit 2%
Hier ga ik niet alleen het gebruik van de GROUP-clausule uitleggen, maar ook het gebruik van de aggregatiefuncties.
De GROUP BY
-clausule wordt gebruikt in combinatie met de aggregatiefuncties om de resultaatset te groeperen op een of meer kolommen. bijv.:
-- GROUP BY with one parameter:
SELECT column_name, AGGREGATE_FUNCTION(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
-- GROUP BY with two parameters:
SELECT
column_name1,
column_name2,
AGGREGATE_FUNCTION(column_name3)
FROM
table_name
GROUP BY
column_name1,
column_name2;
Onthoud deze bestelling:
SELECT (wordt gebruikt om gegevens uit een database te selecteren)
FROM (clausule wordt gebruikt om de tabellen weer te geven)
WAAR (clausule wordt gebruikt om records te filteren)
GROUP BY (clausule kan worden gebruikt in een SELECT-instructie om gegevens te verzamelen)
over meerdere records en groepeer de resultaten op een of meer kolommen)HAVING (clausule wordt gebruikt in combinatie met de GROUP BY-clausule om)
beperk de groepen met geretourneerde rijen tot alleen die waarvan de voorwaarde
is WAAR)ORDER BY (sleutelwoord wordt gebruikt om de resultatenset te sorteren)
U kunt deze allemaal gebruiken als u gebruikmaakt van aggregatiefuncties, en dit is de volgorde waarin ze moeten worden ingesteld, anders kunt u een foutmelding krijgen.
Totale functies zijn:
MIN() geeft de kleinste waarde in een bepaalde kolom terug
MAX() retourneert de maximale waarde in een bepaalde kolom.
SUM() geeft de som van de numerieke waarden in een bepaalde kolom terug
AVG() retourneert de gemiddelde waarde van een bepaalde kolom
COUNT() retourneert het totale aantal waarden in een bepaalde kolom
COUNT(*) geeft het aantal rijen in een tabel terug
SQL-scriptvoorbeelden over het gebruik van aggregatiefuncties:
Stel dat we de verkooporders moeten vinden waarvan de totale verkoop groter is dan $ 950. We combineren de HAVING
-clausule en de GROUP BY
-clausule om dit te bereiken:
SELECT
orderId, SUM(unitPrice * qty) Total
FROM
OrderDetails
GROUP BY orderId
HAVING Total > 950;
Alle bestellingen tellen en ze klant-ID groeperen en het resultaat oplopend sorteren. We combineren de functie COUNT
en de clausules GROUP BY
, ORDER BY
en ASC
:
SELECT
customerId, COUNT(*)
FROM
Orders
GROUP BY customerId
ORDER BY COUNT(*) ASC;
Haal de categorie op met een gemiddelde eenheidsprijs van meer dan $ 10, gebruik de functie AVG
in combinatie met de clausules GROUP BY
en HAVING
:
SELECT
categoryName, AVG(unitPrice)
FROM
Products p
INNER JOIN
Categories c ON c.categoryId = p.categoryId
GROUP BY categoryName
HAVING AVG(unitPrice) > 10;
Het goedkoopste product per categorie verkrijgen, met behulp van de functie MIN
in een subquery:
SELECT categoryId,
productId,
productName,
unitPrice
FROM Products p1
WHERE unitPrice = (
SELECT MIN(unitPrice)
FROM Products p2
WHERE p2.categoryId = p1.categoryId)
De volgende instructie groepeert rijen met dezelfde waarden in de kolommen categoryIden productId:
SELECT
categoryId, categoryName, productId, SUM(unitPrice)
FROM
Products p
INNER JOIN
Categories c ON c.categoryId = p.categoryId
GROUP BY categoryId, productId
Antwoord 3
In eenvoudig Engels van GROUP BY
met twee parameters, wat we doen is op zoek naar vergelijkbare waardeparen en de telling naar een 3e kolom brengen.
Bekijk het volgende voorbeeld ter referentie. Hier gebruik ik Internationale voetbalresultaten van 1872 tot 2020
+----------+----------------+--------+---+---+--------+---------+-------------------+-----+
| _c0| _c1| _c2|_c3|_c4| _c5| _c6| _c7| _c8|
+----------+----------------+--------+---+---+--------+---------+-------------------+-----+
|1872-11-30| Scotland| England| 0| 0|Friendly| Glasgow| Scotland|FALSE|
|1873-03-08| England|Scotland| 4| 2|Friendly| London| England|FALSE|
|1874-03-07| Scotland| England| 2| 1|Friendly| Glasgow| Scotland|FALSE|
|1875-03-06| England|Scotland| 2| 2|Friendly| London| England|FALSE|
|1876-03-04| Scotland| England| 3| 0|Friendly| Glasgow| Scotland|FALSE|
|1876-03-25| Scotland| Wales| 4| 0|Friendly| Glasgow| Scotland|FALSE|
|1877-03-03| England|Scotland| 1| 3|Friendly| London| England|FALSE|
|1877-03-05| Wales|Scotland| 0| 2|Friendly| Wrexham| Wales|FALSE|
|1878-03-02| Scotland| England| 7| 2|Friendly| Glasgow| Scotland|FALSE|
|1878-03-23| Scotland| Wales| 9| 0|Friendly| Glasgow| Scotland|FALSE|
|1879-01-18| England| Wales| 2| 1|Friendly| London| England|FALSE|
|1879-04-05| England|Scotland| 5| 4|Friendly| London| England|FALSE|
|1879-04-07| Wales|Scotland| 0| 3|Friendly| Wrexham| Wales|FALSE|
|1880-03-13| Scotland| England| 5| 4|Friendly| Glasgow| Scotland|FALSE|
|1880-03-15| Wales| England| 2| 3|Friendly| Wrexham| Wales|FALSE|
|1880-03-27| Scotland| Wales| 5| 1|Friendly| Glasgow| Scotland|FALSE|
|1881-02-26| England| Wales| 0| 1|Friendly|Blackburn| England|FALSE|
|1881-03-12| England|Scotland| 1| 6|Friendly| London| England|FALSE|
|1881-03-14| Wales|Scotland| 1| 5|Friendly| Wrexham| Wales|FALSE|
|1882-02-18|Northern Ireland| England| 0| 13|Friendly| Belfast|Republic of Ireland|FALSE|
+----------+----------------+--------+---+---+--------+---------+-------------------+-----+
En nu ga ik groeperen op soortgelijk land (kolom _c7
) en toernooi(_c5
) waardeparen volgens GROUP BY
bewerking ,
SELECT `_c5`,`_c7`,count(*) FROM res GROUP BY `_c5`,`_c7`
+--------------------+-------------------+--------+
| _c5| _c7|count(1)|
+--------------------+-------------------+--------+
| Friendly| Southern Rhodesia| 11|
| Friendly| Ecuador| 68|
|African Cup of Na...| Ethiopia| 41|
|Gold Cup qualific...|Trinidad and Tobago| 9|
|AFC Asian Cup qua...| Bhutan| 7|
|African Nations C...| Gabon| 2|
| Friendly| China PR| 170|
|FIFA World Cup qu...| Israel| 59|
|FIFA World Cup qu...| Japan| 61|
|UEFA Euro qualifi...| Romania| 62|
|AFC Asian Cup qua...| Macau| 9|
| Friendly| South Sudan| 1|
|CONCACAF Nations ...| Suriname| 3|
| Copa Newton| Argentina| 12|
| Friendly| Philippines| 38|
|FIFA World Cup qu...| Chile| 68|
|African Cup of Na...| Madagascar| 29|
|FIFA World Cup qu...| Burkina Faso| 30|
| UEFA Nations League| Denmark| 4|
| Atlantic Cup| Paraguay| 2|
+--------------------+-------------------+--------+
Uitleg:de betekenis van de eerste rij is dat er in totaal 11 vriendschappelijke toernooien zijn gehouden op Zuid-Rhodesië.
Opmerking:hier is het in dit geval verplicht om een tellerkolom te gebruiken.