...
SQL (Structured Query Language) on tietokantakieli, jonka avulla käyttäjä voi määritellä tietokannan, ylläpitää sitä ja kohdistaa siihen kyselyitä. Ennen PC-maailmaan saapumistaan SQL on ollut yleinen suurkoneympäristöissä. Alunperin sitä pidettiinkin liian raskaana toimimaan PC:ssä. SQL:n juuret juontavat 1970-luvun alussa kehitettyyn relaatiomalliin. IBM aloitti tähän tietomalliin perustuvan kehitystyön 'System R'-projektissaan. Projektissa kehitettiin SQL:n edeltäjä SEQUEL. Ensimmäisenä SQL:n toi markkinoille Relational Software eli nykyinen Oracle Corporation 1970-luvun lopussa.Emsimmäinen virallinen standardi eli ANSIn määrittelemä standardi julkistettiin 1986. Standardiin viitataan nimillä ANSI/SQL ja SQL-86. Siinä määriteltiin kielen käyttö ohjelmiin upotettuna mutta ei sen vuorovaikutteista käyttöä. Vuotta myöhemmin myös ISO hyväksyi standardin. ANSI ja ISO päättivät tehdä kielen määritykseen laajennuksen ja näin syntyi SQL-89. Siinä kieleen lisättiin muun muassa käsitteet perus- ja vierasavaimista ja säännöt, jotka vaikuttivat käyttäjän määrittelemiin viite-eheyssääntöihin. 1990-luvulla määriteltiin SQL-92, joka on edelleenkin käytössä.
SQL-kieli on kaikkien nykyaikaisten tietokannanhallintajärjestelmien taustalla. Kun esimerkiksi Access'issa tehdään kysely, syntyy siitä SQL-lause. Usein vain Mutta eri ohjelmistovalmistajat sisällyttävät SQL-kielen toteutuksiinsa omia lisäyksiään, jotka tekevät niistä vaikeaselkoisia . Me tulemme tässä osiossa käsittelemään SQL-kieltä lähes sen yksinkertaisimmassa, SQL-86:ta vastaavassa muodossaan. Yhdistettynä IDC-tekniikkaan sillä kuitenkin voidaan toteuttaa kaikki tietokantojen hallinnan edellyttämät toimet, jopa moni-moneen yhteyden käsittely sujuu huomattavasti helpommin kuin Accessilla itsellään. Käytettäessä IDC:tä ei palvelimella eikä asiakkaan PC:llä tarvitse olla Access'ia lainkaan. Pelkkä Access'illa luotu tietokanta riittää. Loput tehdään IDC- ja HTX-tiedostoilla. Mutta ennenkuin siirrymme varsinaiseen IDC-tekniikkaan, käymme lyhyesti läpi SQL-kielen tärkeimmät lauseet ja niiden syntaksin. Syntaksilla tarkoitetaan ohjelmointikielten kirjoitussääntöjä, jotka SQL:n tapauksessa ovat hyvin yksinkertaiset.
Tässä käsiteltävät SQL-kielen lauseet eivät muodosta koko SQL-kieltä. SQL sisältää lisäksi mm. lauseet tietokantataulujen luontiin ja tuhoamiseen. Tässä kuitenkin edellytetään, että tietokanta on jo valmiiksi luotu esim. Access'illa. IDC-tekniikka ei yleensä edellytä, että tietokantaa luotaessa tehtäisiin kyselyitä, lomakkeista tai raporteista puhumattakaan. Kaikki tehdään www-sivuilla. Yhteyksiäkään ei luoda vaan ne syntyvät IDC:tä käytettäessä SQL-kielen sivulauseilla eksplisiittisesti (ulkopuolisesti, ei siis Access'ista).
ja yhteensopimatonta.
SQL-kieli on hyvin laaja, se sisältää esimerkiksi lauseet tietokantataulujen luontiin ja tuhoamiseen.
Code Block |
---|
--tuhotaan taulut
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 |
---|
-- Describe CLIENT
CREATE TABLE client
(
client_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
name TEXT
);
|
–
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)
);
|
SQL-kielessä on lauseet tietueiden valintaan SELECT, tietojen päivittämiseen eli niiden tietosisällön muuttamiseen UPDATE, uuden tietueen luomiseen INSERT ja tietue(id)en tuhoamiseen DELETE.Tärkeimmät SQL-kielen lauseet ovat SELECT tietueiden valintaan, UPDATE tietojen päivittämiseen eli niiden tietosisällön muuttamiseen, INSERT uuden tietueen luomiseen ja DELETE tietue(id)en tuhoamiseen. Seuraavassa käsitellään kukin lause erikseen.
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ä.
...