SQL-kyselyyn apua

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?
5780
Äänestä

Muut lukivat myös

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

Äänestä
  • 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

    Äänestä

  • Ukko Vaari kirjoitti:

    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.

    Äänestä

  • Ukko Vaari kirjoitti:

    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

    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.

    Äänestä

  • parempi kirjoitti:

    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ä.

    Äänestä

Kommentoi aloitusta


dodi kirjoitti:

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?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu