Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

Code Block
--tuhotaan taulut jos ne ovat olemassa
DROP TABLE user;
DROP TABLE client;
DROP TABLE project;

Edellisten käskyjen suhteen on syytä olla tarkkana, koska kaikki taulujen sisältö tuhoutuu.

Code Block
CREATE TABLE user
(
 user_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
 client_id INTEGER,
 name TEXT NOT NULL,
 username TEXT NOT NULL,
 password TEXT NOT NULL,
 FOREIGN KEY(client_id) REFERENCES client(client_id)
 );

...

Code Block
CREATE TABLE project
(
    project_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name TEXT,
    header TEXT, --Header to raports
    date DATETIME,
    parent_project_id INTEGER,
    client_id INTEGER,
    author TEXT,
    notes TEXT,
    ActiveProject Boolean NOT NULL, -- only one project is active
    FOREIGN KEY(client_id) REFERENCES client(client_id)
);

Tärkeimmät SQL-kielen lauseet ovat SELECT kielessä on lauseet  tietueiden valintaan SELECT, UPDATE   tietojen päivittämiseen eli niiden tietosisällön muuttamiseen UPDATE, INSERT uuden tietueen luomiseen INSERT ja DELETE tietue(id)en tuhoamiseen . Seuraavassa käsitellään kukin lause erikseenDELETE.

SELECT-lause

SELECT-lauseen voidaan sanoa olevan SQL:n perusta. SELECT lauseella valitaan yhdestä tai useammasta tietokantataulusta tietyt kentät näytettäviksi. Mitkä tietueet valitaan määrätään ns. sivulauseella, joka vastaa kyselyn ehtoa Access'issa. SELECT lauseessa ehdot vain voidaan asettaa huomattavasti monipuolisemmin.

SELECT-lauseen yleinen muoto eli ns. syntaksi on:unmigrated-wiki-markup

Code Block

SELECT kenttä1\[, kenttä2,...KenttäN\]
FROM Taulu1\[, Taulu2,...Taulu3\]

Kenttä1, KenttäN, Taulu1, TauluN viittaavat tietokannassa määriteltyihin todellisiin kentän nimiin. Jos otamme esimerkiksi Oppilas-taulun, jossa on Etunimi, Sukunimi, Osoite, Postinumero ja Postitoimipaikka-kentät, kirjoitettaisiin SELECT lause, joka palauttaa kaikkien oppilaiden kaikki tiedot seuraavasti:

Code Block

SELECT Etunimi, Sukunimi, Osoite, Postinumero, Postitoimipaikka

...


FROM Oppilas

Mikäli kaikki kentät otetaan mukaan, voidaan niiden luettelemisen sijasta käyttää *-merkkiä:

Code Block

SELECT *

...


FROM Oppilas

Jos tulokset halutaan lajitella jonkinlaiseen järjestykseen, se onnistuu ORDER BY sivulauseella. Esim:

Code Block

SELECT *

...


FROM Oppilas

...


ORDER BY Sukunimi, Etunimi

lajittelee oppilaat ensin sukunimen, sitten etunimen mukaan.

Access-kyselyiden ehtoja vastaa SQL-kielessä WHERE sivulause. Kun Access-kyselyn rakennenäkymässä asetetaan ehtoja, Access toteuttaa ne SQL-kielen WHERE-lauseella. Se sijoitetaan FROM ja ORDER sivulauseiden väliin, esim:

Code Block

SELECT *

...


FROM Oppilas

...


WHERE Sukunimi > 'O' AND Sukunimi < 'Q'

...


ORDER BY Sukunimi, Etunimi

Esimerkin SELECT lause valitsi oppilaista vain ne, joiden sukunimi alkaa P-kirjaimella. Toisin sanoen sukunimen on oltava suurempi kuin pelkkä O-kirjain ja pienempi kuin pelkkä Q-kirjain. Nämä olisivat Access-kyselyn rakennenäkymän Sukunimi- ja Etunimi-kenttiin sijoitettavat ehdot. Monien vaihtoehtoisten käyttötapojensa vuoksi käsittelemme WHERE sivulauseen kuitenkin seuraavassa erikseen.

...

Koska WHERE-sivulausetta käytetään muidenkin SQL-lauseiden kuin pelkästään SELECT-lauseen sivulauseena ja kun sen avulla vielä luodaan yhteydetkin, on se syytä käsitellä omana tärkeänä kokonaisuutenaan.

Code Block

SELECT * FROM project, testtype_static WHERE project.ActiveProject=1 AND project.project_id=testtype_static.project_id

WHERE-sivulauseen tärkeitä elementtejä ovat sanat AND, OR ja NOT. Nämä ovat ns. loogisia operaattoreita, joita käytetään tavanomaisessakin puheessa. Sanomme esim. että "tänään on kylmä päivä JA sataa vettä". Jos etsimme jonkun ajanjakson päivien joukosta sellaiset päivät, jolloin on ollut kylmä JA on satanut, saamme tulokseksi juuri ne päivät, joille on kirjattu, että ne ovat olleet kylmiä JA että on satanut. Tämä kysely ei ilmoita meille niitä päiviä, jolloin on pelkästään satanut eikä niitä päiviä, jolloin on pelkästään ollut kylmä.

Sen sijaan jos kysymme päiviä, jolloin on satanut TAI on ollut kylmä, saamme luettelon päivistä, jolloin on pelkästään satanut tai on ollut pelkästään kylmä. Tässä on kuitenkin tavanomaiseen kielenkäyttöön pieni ero: mukaan otetaan myös sellaiset päivät jolloin on SEKÄ satanut ETTÄ on ollut kylmä. Yleensähän puhutussa kielessä TAI-sana pyrkii karsimaan vaihtoehdot erilleen. Esimerkiksi laulun sanat: "oli kylmä tai vaikkapa vari" tarkoittavat että olipa kylmä tai lämmin, mutta eivät suinkaan sitä, että olipa molemmat yhtäaikaa. Tällaista TAI-sanan käyttöä kutsutaan logiikassa poissulkevaksi TAI'ksi. Sen sijaan TAI joka hyväksyy molemmat vaihtoehdot, on nimeltään mukaanlukeva TAI.

NOT sana on tietenkin kielto, EI jotain. Siis jos EI sada, niin ei todellakaan sada. Mutta mitä tarkoitetaan jos sanotaan, että EI (EI sada)? Sulkeissa oleva toteamus kertoo että EI sada. Nyt kuitenkin kielletään se mitä sulkeissa sanotaan. Silloin tietenkin sataa. Kaksinkertainen kielto on todellisuudessa aina myöntö.

Edelläesitetty voi tuntua saivartelulta, mutta sitä se ei ole. Tietokantasuunnittelijat tietävät karvaasta kokemuksesta, että joskus voi olla jopa tarpeen määritellä tietokantataulujen kentät ja valita niihin talletettavat tiedot sitä silmälläpitäen, miten niitä sitten WHERE-lauseella helpoimmin pystytään käsittelemään.

Miten sitten WHERE-lauseessa esitetään kysymys, onko joku jotain vai onko se suurempi tai pienempi kuin joku muu? Siihen käytetään niin sanottuja vertailuoperaattoreita. Niitä ovat:

Nyt pitää huomata, että 'suurempi kuin' ei pidä sisällään yhtäsuuruutta. Sellainen arvo joka on yhtäsuuri ei tule tässä vertailussa huomioiduksi. Tällöin olisi pystyttävä käyttämään sitä merkkiä, jota matematiikassa kutsutaan 'suurempi tai yhtä suuri kuin' merkiksi. ASCII merkistöllä ei edes pystytä esittämään sitä, koska se ei kuulu ASCII-merkistön valikoimaan. Kysymys on kuitenkin 'suurempi kuin' merkistä, jonka alla on viiva, ikäänkuin yhtäsuuruusmerkin alempi osa. Mikäli olit tarkkaavainen, saatoit huomata missä salaisuus piilee. Edellä käytettiin sanontaa 'suurempi TAI yhtä suuri kuin'. Siis esim:

...

WHERE (sana > 'O') AND (sana < 'Q')

Seuraavassa on esimerkki valinnasta kahdesta eri taulusta

Code Block

SELECT * FROM project, testtype_static WHERE project.ActiveProject=1 AND project.project_id=testtype_static.project_id

UPDATE-lause

UPDATE-lauseen avulla saadaan tiedot päivittymään tietokantaan. Sen syntaksi on varsin yksinkertainen.

...

Wiki Markup
INSERT INTO Taulu
( Kenttä1 \[, Kenttä2,..KenttäN\] )
VALUES ( arvo1 \[, arvo2,..arvoN )

Code Block

INSERT INTO Anturi  VALUES ('1', '2', '0', 'Voimaanturi', 'IO', '1', '0', '1', 'AIN0', '1', '1', 'kN', '0.003076923');

INSERT-lauseessa kuuluu käyttää INTO-osaa, jolla kerrotaan mihin tauluun lisäyksen halutaan tapahtuvan. Suluissa oleva kenttäluettelo ja VALUES ( ) -sivulauseen arvojono on vastaavat toisiaan. Tällöin esimerkiksi jonossa kolmantena oleva kenttä saa sisällökseen kolmannen arvon arvojonosta. Sellaiset tietokantataulun kentät, joille INSERT-lauseessa ei anneta arvoa, saavat arvokseen tietokannassa ao. kentälle määrätyn oletusarvon. Tässä on syytä olla tarkkana, sillä sellaisille kentille, joille 'Arvo tarvitaan' on annettava jokin sisältö, vaikkapa vain blankko merkkitiedolle ja 0 numerotiedolle. INSERT-lauseessa ei käytetä WHERE sivulausetta, sillä tietoja ollaan vasta tallentamassa tietokantaan, eikä millään ehdolla näin ollen edes olisi merkitystä.

...