Eli jos on musiikkitietokanta ja siinä taulut: artistit ja levyt. Yhdellä artistilla voi siis olla monta levyä. Miten saan sql-kyselyllä tulostettua artistin nimen ja artistin levyjen määrän?
SQL-kyselyyn apua
dodi
5780
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 5
Vanhimmat
Oletuksia:
1. artistit-taulussa on pääavaimena ID-kenttä nimeltä artistiID.
2. levyt-taulussa on vierasavaimena ID-kenttä nimeltä artistiID.
SELECT artistit.artistiNimi, count(levyt.levynimi) as levyjenmaara
FROM artistit, levyt
WHERE artistit.artistiID = levyt.artistiID
GROUP BY artistit.artistiNimi
Vaikka onkin oikein, niin tuo on ukkovaarien aikainen tapa kirjoittaa kyseinen SELECT lause. Kannattaa opetella uusi tapa, jos kerran opettelemassa on, kömpelö optimoija saattaa jopa suorittaa uuden lauseen huomattavasti nopeammin.
Nykyään näin:
SELECT artistit.artistiNimi, count(levyt.levynimi) as levyjenmaara
FROM artistit JOIN levyt
ON artistit.artistiID = levyt.artistiID
GROUP BY artistit.artistiNimi
ORDER BY artistit.artistiNimi
Parahin nimimerkki "Ukko Vaari", kommenttisi oli kenties tarpeellinen, joskin hieman pureva.. :)
Lisättäköön nyt sitten vielä, että mikäli lauseen
FROM artistit JOIN levyt
muuntaa muotoon
FROM artistit LEFT JOIN levyt
saa hakutulokseen myös sellaiset onnettomat artistit, jotka eivät ole onnistuneet levyjä tekemään.
Mitään varmaa ei voi noin suoraan sanoa.
Jos käytössä on kädetön koodaaja ja hyvä optimoija, niin tulos saattaa olla nopeampi, kun taulujen yhdistely tehdään WHERE-lauseessa.
Jos taas tilanne on toisinpäin, eli kyselyä kirjoittaa sql-guru, niin hän saattaa saada parempaa jälkeä aikaiseksi pakottaessaan/vihjatessaa JOIN:n avulla optimoijalle sopivan liitosjärjestyksen.
Kannattaa myös muistaa, että Todella Isossa Kannassa(TM) nopeus ja resurssien riittävyys ovat kaksi eri asiaa. Nopeudesta ei ole paljoa iloa jos esim muisti tai levy-I/O loppuu kesken =)
Niin tai näin, muutaman taulun ja rivin kotikannassa on ihan p*skan hailee kumpaa tapaa käyttää. Eroja alkaa syntyä vasta kun rivejä on satoja tuhansia, tauluja useampia kuin kaksi ja optimoijalta loppuu kyvyt kesken.
Saako WHERE-rakenteella aikaan samanlaisen vastauksen kuin tuolla LEFT JOIN -rakenteella?
Siis listalle myös ne onnettomat, jotka eivät ole levyttäneet.
Onko netissä missään suomenkielistä SQL-opasta tälle uudemmalle kielelle. Perus SQL on aikoianaan opeteltu, mutta ainakin MS Access näyttää tuottavan noita JOIN-rakenteita, joita en oikein ymmärrä.