Kaikki mitä sinun tarvitsee tietää SQL GROUP BY -lausekkeesta

Kaikki mitä sinun tarvitsee tietää SQL GROUP BY -lausekkeesta

Suuri osa relaatiotietokantojen voimasta tulee datan suodattamisesta ja taulukoiden yhdistämisestä. Siksi edustamme näitä suhteita ensiksi. Nykyaikaiset tietokantajärjestelmät tarjoavat kuitenkin toisen arvokkaan tekniikan: ryhmittelyn.





Ryhmittelyn avulla voit poimia yhteenvetotietoja tietokannasta. Sen avulla voit yhdistää tuloksia ja luoda hyödyllisiä tilastotietoja. Ryhmittely säästää sinua kirjoittamasta koodia yleisiin tapauksiin, kuten lukulistojen keskiarvoistamiseen. Ja se voi tehdä tehokkaampia järjestelmiä.





Mitä GROUP BY -lauseke tekee?

GROUP BY, kuten nimestä voi päätellä, ryhmittelee tulokset pienempään joukkoon. Tulokset koostuvat yhdestä rivistä ryhmitetyn sarakkeen jokaista erillistä arvoa kohden. Voimme näyttää sen käytön katsomalla joitain esimerkkitietoja riveillä, joilla on yhteisiä arvoja.





animoi Photoshop -kerrokset jälkitehosteissa

Seuraavassa on hyvin yksinkertainen tietokanta, jossa on kaksi taulukkoa, jotka edustavat levyalbumeja. Voit perustaa tällaisen tietokannan peruskaavion kirjoittaminen valitsemallesi tietokantajärjestelmälle. The albumit taulukossa on yhdeksän riviä, joissa on ensisijainen avain id sarake ja sarakkeet nimeä, esittäjää, julkaisuvuotta ja myyntiä varten:

+----+---------------------------+-----------+--------------+-------+
| id | name | artist_id | release_year | sales |
+----+---------------------------+-----------+--------------+-------+
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | The Dark Side of the Moon | 2 | 1973 | 24 |
| 3 | Rumours | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animals | 2 | 1977 | 6 |
| 6 | Goodbye Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
+----+---------------------------+-----------+--------------+-------+

The taiteilijoita taulukko on vieläkin yksinkertaisempi. Siinä on seitsemän riviä tunnus- ja nimisarakkeilla:



+----+---------------+
| id | name |
+----+---------------+
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+----+---------------+

Voit ymmärtää GROUP BY: n eri näkökohtia vain tällä yksinkertaisella tietojoukolla. Tosielämän tietojoukossa olisi tietysti paljon, paljon enemmän rivejä, mutta periaatteet ovat samat.

Ryhmittely yhden sarakkeen mukaan

Oletetaan, että haluamme selvittää, kuinka monta albumia meillä on kullekin artistille. Aloita tyypillisestä VALITSE kysely artistin tunniste -sarakkeen noutamiseksi:





SELECT artist_id FROM albums

Tämä palauttaa kaikki yhdeksän riviä odotetusti:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
+-----------+

Jos haluat ryhmitellä nämä tulokset taiteilijan mukaan, lisää lause GROUP BY artist_id :





SELECT artist_id FROM albums GROUP BY artist_id

Mikä antaa seuraavat tulokset:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+-----------+

Tulosjoukossa on seitsemän riviä, vähennetty yhdeksästä rivistä albumit pöytä. Jokainen ainutlaatuinen artist_id on yksi rivi. Lopuksi, saadaksesi todelliset lukemat, lisää KREIVI(*) valittuihin sarakkeisiin:

SELECT artist_id, COUNT(*)
FROM albums
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+-----------+----------+

Tulokset ryhmittävät kaksi riviä parille taiteilijoille, joilla on tunnus 2 ja 6 . Jokaisella on kaksi albumia tietokannassamme.

Aiheeseen liittyviä: Essential SQL Commands Cheat Sheet aloittelijoille

Ryhmitetyn datan käyttäminen yhdistelmätoiminnolla

Olet ehkä käyttänyt KREIVI toiminto ennen, erityisesti KREIVI(*) edellä kuvatulla tavalla. Se hakee sarjan tulosten määrän. Voit käyttää sitä saadaksesi taulukon tietueiden kokonaismäärän:

SELECT COUNT(*) FROM albums
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

COUNT on koostefunktio. Tämä termi viittaa toimintoihin, jotka kääntävät useiden rivien arvot yhdeksi arvoksi. Niitä käytetään usein yhdessä GROUP BY -lausekkeen kanssa.

Rivien lukumäärän laskemisen sijaan voimme käyttää yhdistettyä funktiota ryhmiteltyihin arvoihin:

SELECT artist_id, SUM(sales)
FROM albums
GROUP BY artist_id
+-----------+------------+
| artist_id | SUM(sales) |
+-----------+------------+
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+-----------+------------+

Edellä esitetyt artistien 2 ja 6 kokonaismyynnit ovat heidän useiden albumiensa myyntiä yhteensä:

SELECT artist_id, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+-----------+-------+

Ryhmittely usean sarakkeen mukaan

Voit ryhmitellä useamman kuin yhden sarakkeen mukaan. Sisällytä vain useita sarakkeita tai lausekkeita pilkuilla erotettuna. Tulokset ryhmitellään näiden sarakkeiden yhdistelmän mukaan.

SELECT release_year, sales, count(*)
FROM albums
GROUP BY release_year, sales

Tämä tuottaa yleensä enemmän tuloksia kuin ryhmitteleminen yhden sarakkeen mukaan:

+--------------+-------+----------+
| release_year | sales | count(*) |
+--------------+-------+----------+
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
+--------------+-------+----------+

Huomaa, että pienessä esimerkissämme vain kahdella albumilla on sama julkaisuvuosi ja myynti laskee (28 vuonna 1977).

Hyödyllisiä aggregaattitoimintoja

COUNTin lisäksi useita toimintoja toimii hyvin GROUPin kanssa. Jokainen funktio palauttaa arvon jokaiseen tulosryhmään kuuluvien tietueiden perusteella.

  • COUNT () palauttaa vastaavien tietueiden kokonaismäärän.
  • SUMMA () palauttaa annetun sarakkeen kaikkien arvojen summan.
  • MIN () palauttaa tietyn sarakkeen pienimmän arvon.
  • MAX () palauttaa tietyn sarakkeen suurimman arvon.
  • AVG () palauttaa keskiarvon. Se vastaa SUM () / COUNT ().

Voit käyttää näitä toimintoja myös ilman GROUP -lauseketta:

kuinka järjestää sähköpostit gmailissa
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 19.1111 |
+------------+

GROUP BY: n käyttäminen WHERE -lausekkeen kanssa

Aivan kuten normaalin SELECTin tapauksessa, voit silti suodattaa tulosjoukon WHERE:

SELECT artist_id, COUNT(*)
FROM albums
WHERE release_year > 1990
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 6 | 2 |
+-----------+----------+

Nyt sinulla on vain ne albumit, jotka on julkaistu vuoden 1990 jälkeen ja jotka on ryhmitelty artistin mukaan. Voit myös käyttää WHERE -lausekkeen liittämistä riippumatta GROUP BY:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
+---------+--------+
| name | albums |
+---------+--------+
| Nirvana | 1 |
| Adele | 2 |
+---------+--------+

Huomaa kuitenkin, että jos yrität suodattaa yhdistetyn sarakkeen perusteella:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND albums > 2
GROUP BY artist_id;

Saat virheilmoituksen:

ERROR 1054 (42S22): Unknown column 'albums' in 'where clause'

Kootut tiedot perustuvat sarakkeet eivät ole WHERE -lausekkeen käytettävissä.

HAVING -lausekkeen käyttäminen

Joten miten suodatat tulosjoukon ryhmittelyn jälkeen? The Ottaa lauseke käsittelee tätä tarvetta:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;

Huomaa, että HAVING -lauseke tulee GROUP BY: n jälkeen. Muuten se on pohjimmiltaan yksinkertainen WHERE: n korvaaminen HAVINGilla. Tulokset ovat:

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

Voit silti käyttää WHERE -ehtoa suodattaaksesi tulokset ennen ryhmittelyä. Se toimii yhdessä HAVING -lausekkeen kanssa suodatuksen jälkeen ryhmittelyn jälkeen:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

Vain yksi taiteilija tietokannastamme julkaisi useamman kuin yhden albumin vuoden 1990 jälkeen:

+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+

Tulosten yhdistäminen ryhmään GROUP BY

GROUP BY -lauseke on uskomattoman hyödyllinen osa SQL -kieltä. Se voi tarjota yhteenvetotietoja esimerkiksi sisältösivulle. Se on erinomainen vaihtoehto suurten tietomäärien hakemiseen. Tietokanta käsittelee tämän ylimääräisen työmäärän hyvin, koska sen muotoilu tekee siitä optimaalisen työhön.

Kun ymmärrät ryhmittelyn ja useiden taulukoiden liittämisen, voit käyttää suurinta osaa relaatiotietokannan voimasta.

Jaa Jaa Tweet Sähköposti Useiden tietokantataulukoiden kysely kerralla SQL -liitoksilla

Opi käyttämään SQL -liitoksia virtaviivaistamaan kyselyitä, säästämään aikaa ja tuntemaan olosi SQL -tehokäyttäjäksi.

windows xp -emulaattori Windows 10: lle
Lue seuraava Liittyvät aiheet
  • Ohjelmointi
  • SQL
Kirjailijasta Bobby Jack(58 artikkelia julkaistu)

Bobby on teknologian harrastaja, joka työskenteli ohjelmistokehittäjänä lähes kaksi vuosikymmentä. Hän on intohimoinen pelaamisesta, työskentelee Switch Editor Magazine -lehden arvostelutoimittajana ja on upotettu kaikkeen verkkojulkaisemiseen ja -kehitykseen.

Lisää Bobby Jackilta

tilaa uutiskirjeemme

Liity uutiskirjeeseemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia ​​e -kirjoja ja ainutlaatuisia tarjouksia!

Klikkaa tästä tilataksesi