TIEDONHALLINTA - SYKSY 2011 Kurssikoodi: Saapumisryhmä: Luento 11 TU00AA48-2002 TU10S1E Hannu Markkanen 22.11.2011 9/10/12 Helsinki Metropolia University of Applied Sciences 1
Indeksit
Indeksit Taulun kaikkien sarakkeiden perusteella voi tehdä hakuja Taulun rivit ovat (yleensä) epäjärjestyksessä Rivimäärän kasvaessa haut hidastuvat Hakuja voidaan nopeuttaa perustamalla sarakkeille indeksejä Indeksi on tauluun liittyvä aputietorakenne, jota käytetään samaan tapaan kuin kirjan hakemistoa, joka kertoo millä sivuilla haettu termi mainitaan Indeksistä on suora viittaus vastaavalle riville taulussa Indekseillä on kaksi päätarkoitusta: 1. Indeksi takaa sarakke(id)en arvo(je)n yksikäsitteisyyden (UNIQUE INDEX) 2. Indeksi nopeuttaa kyselyitä Indeksin haittapuolia Vievät levytilaa Hidastavat lisäys- ja päivitysoperaatioita Hannu Markkanen Metropolia Ammattikorkeakoulu 3
Indeksin käyttö Indeksi perustetaan aina pääavaimelle (yksilöivä indeksi, UNIQUE INDEX) yleensä viiteavaimille (yhdiste-operaatioiden nopeuttaminen) lisäksi niille tietokannan kentille, jotka toistuvat usein haku- tai lajitteluehdoissa. Jos taululle on määritelty perusavain, useimmat järjestelmät luovat automaattisesti sitä vastaavan indeksin Indeksi voidaan määritellä käyttäen yhtä tai useampaa saraketta Indeksin voi perustaa vaikka tauluun olisi jo ehditty tallettaa rivejä Indeksi vaikuttaa vain suorituskykyyn, ei kyselyjen logiikkaan Hannu Markkanen Metropolia Ammattikorkeakoulu 4
Indeksit SQL:ssä CREATE [UNIQUE] INDEX indeksin_nimi ON taulun_nimi(sarake_lista) DROP INDEX indeksin_nimi Perustetaan nimille indeksi henkilo tauluun: CREATE INDEX henkilo_nimi ON henkilo(snimi, enimi) Poistetaan yllä tehty indeksi (MySQL): DROP INDEX henkilo_nimi ON henkilo Hannu Markkanen Metropolia Ammattikorkeakoulu 5
Näkymät
Näkymät Talletettuja kyselyjä Toimivat ikään kuin ikkunoina tietokannan tauluihin Voi käyttää kuin taulua, mutta ne ovat virtuaalisia (eli tietoja ei talleteta fyysisesti uudestaan vaan ne sijaitsevat oikeissa tauluissa) CREATE VIEW <näkymän nimi> AS <SELECT-lause>; Esimerkki: henkilo (htun, enimi, snimi, kunta, ostun) Luo näkymä tamperelainen, josta löytyy kaikkien tamperelaisten työntekijöiden tiedot. CREATE VIEW tamperelainen AS SELECT htun, enimi, snimi, ostun FROM henkilo WHERE kunta = "Tampere"; SELECT * FROM tamperelainen; SELECT snimi, enimi FROM tamperelainen INNER JOIN osasto ON tamperelainen.ostun = osasto.ostun WHERE osnimi = "Tietohallinto ; Hannu Markkanen Metropolia Ammattikorkeakoulu 7
Näkymät Mihin näkymiä tarvitaan? Kyselylauseista tulee lyhyempiä Helpottaa usein toistuvien kyselyjen tekemistä Tiedon koostaminen ja karsiminen ( raporttien luominen) Näkymien käytössä huomioitava: Näkymä voi perustua toiseen näkymään ORDER BY-lausetta ei saa käyttää näkymän määrittelyssä Näkymiä ei voi indeksoida Näkymälle ei ole ALTER-lausetta rakenteen muuttamiseksi Taulujen tietoihin voi tehdä lisäyksiä (INSERT), poistoja (DELETE) sekä muutoksia (UPDATE) näkymän avulla, mutta siihen liittyy rajoituksia, kuten: Näkymä on muodostettu yhdestä taulusta Näkymässä on vähintään pääavaimet ja NOT NULL-sarakkeet Näkymän muodostuksessa ei ole käytetty DISTINCT määrettä, koosteoperaattoreita tai GROUP BY -määrettä Hannu Markkanen Metropolia Ammattikorkeakoulu 8
Näkymät esimerkki tietojen päivityksestä INSERT INTO tamperelainen(htun, enimi, snimi, ostun) VALUES (3548, "Heikki", "Huttunen", 1); Huomaa että tamperelainen-näkymään kuulumattomien henkilo-taulun attribuuttien arvoksi tulee NULL Voit käyttää SELECT-lausetta apuna osastotunnuksen hakemisessa osaston nimen perusteella: INSERT INTO tamperelainen(htun, enimi, snimi, ostun) SELECT 3549, "Sari", "Sormunen", ostun FROM osasto WHERE osnimi = "Markkinointi"; Hannu Markkanen Metropolia Ammattikorkeakoulu 9
Oikeudet Tietojen katsominen, lisääminen tai muuttaminen voidaan sallia tai estää käyttäjäkohtaisesti Käyttäjän oikeudet määritellään taulu-, näkymä- tai sarakekohtaisesti ja eri operaatiolle (SELECT, CREATE, DELETE, INSERT) Oikeudet annetaan GRANT-komennolla ja poistetaan REVOKE-komennolla GRANT <operaatiot> ON <objekti> TO <käyttäjät> REVOKE <operaatiot> ON <objekti> FROM <käyttäjät> Esimerkkejä GRANT SELECT ON asiakas TO Pekka, Paavo GRANT SELECT ON asiakas TO PUBLIC GRANT INSERT,UPDATE ON asiakas TO Pekka GRANT UPDATE(alennus) ON asiakas TO Paavo REVOKE ALL ON asiakas FROM Pekka, Paavo Sallitaan haku asiakas-taulusta Pekalle ja Paavolle Sallitaan kaikille haku asiakas-taulusta. Sallitaan asiakas-taulun rivien lisäys ja päivitys Pekalle Vain Paavo saa määritellä asiakkaiden alennuksia Poistetaan Pekan ja Paavon kaikki valtuudet Hannu Markkanen Metropolia Ammattikorkeakoulu 10
Talletetut proseduurit Talletettu proseduuri on yhden tai useampia SQL-käskyjä sisältävä ohjelma, jota ohjelmoija voi kutsua eri parametriarvoilla Talletettuja proseduureja käytetään asiakas-palvelinjärjestelmissä vähentämään verkkoliikennettä Voi määritellä myös talletettuja funktion, joka palauttaa arvon sitä kutsuttaessa Esimerkki: Proseduuri, joka laskee kuinka monta henkilöä tietystä parametrin määräämästä kunnasta. DELIMITER // CREATE PROCEDURE henkiloston_maara(out lukum INT) SELECT COUNT(*) INTO lukum FROM henkilo; // DELIMITER ; CALL henkiloston_maara(@henkilo_summa); SELECT @henkilo_summa AS "Henkilöstömäärä"; Huomioitavaa MySQL:n syntaksista DELIMITER vaihtaa komennon päättävän merkin toiseksi (vaihto tehtävä koska proseduurin määrittelyssä pitää käyttää puolipistettä) @-syntaksilla luodaan käyttäjän määrittelemä muuttuja Hannu Markkanen Metropolia Ammattikorkeakoulu 11
Herätin (Trigger) Herätin on tietokantaan tallennettu pieni ohjelma, joka liitetään johonkin tietokannan tauluun Herätin määritellään suoritettavaksi ennen tai jälkeen jonkun seuraavista tietokantaoperaatioista: INSERT, UPDATE, DELETE Herättimiä käytetään yleisimmin huolehtimaan tietokannan eheydestä Verrattuna vastaavien operaatioiden suorittamiseen sovellusohjelmassa, herättimen etuna on nopeus Esimerkki: Herätin, joka poistaa henkilön tiedot projektihenkilö taulusta, jos henkilö poistetaan henkilo-taulusta. henkilo (htun, enimi, snimi, ostun) proj_henk (ptun, htun, tunnit) -- htun on viiteavain henkilo-tauluun CREATE TRIGGER henkilon_poisto ON henkilo BEFORE DELETE FOR EACH ROW BEGIN DELETE FROM proj_henk WHERE proj_henk.htun = OLD.htun; END OLD on MySQL:n tarjoama tunniste, jonka avulla voi viitata poistettavaan tauluun Hannu Markkanen Metropolia Ammattikorkeakoulu 12