Kirjoittaja: Antti Laaksonen (2009).
SELECT
-kysely on yleisin ja monimutkaisin tietokantakysely. Tämä ja kaksi seuraavaa opasta antavat kuvaa siitä, mitä SELECT
-kyselyllä voi tehdä. Aluksi katsomme, miten haettavia kenttiä ja rivejä voi valita ja miten kyselyn tulokset voi järjestellä.
Lisätään esimerkkitauluun muutama rivi lisää:
INSERT INTO tuotteet (nimi, hinta) VALUES ('retiisi', 4); INSERT INTO tuotteet (nimi, hinta) VALUES ('lanttu', 1); INSERT INTO tuotteet (nimi, hinta) VALUES ('selleri', 3);
Nyt taulussa ovat kaikkiaan seuraavat rivit:
SELECT * FROM tuotteet;
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 1 | kaali | 3 | | 2 | porkkana | 2 | | 3 | peruna | 3 | | 4 | retiisi | 4 | | 5 | lanttu | 1 | | 6 | selleri | 3 | +----+----------+-------+
Tähän asti SELECT
-kyselyssä on käytetty merkkiä *
, mikä tarkoittaa, että taulusta haetaan kaikkien kenttien tiedot. Tämän sijasta on mahdollista luetella vain ne kentät, joita todella tarvitaan.
Seuraava kysely hakee vain tuotteiden nimet:
SELECT nimi FROM tuotteet;
+----------+ | nimi | +----------+ | kaali | | porkkana | | peruna | | retiisi | | lanttu | | selleri | +----------+
Seuraava kysely taas hakee tuotteiden nimet ja hinnat:
SELECT nimi, hinta FROM tuotteet;
+----------+-------+ | nimi | hinta | +----------+-------+ | kaali | 3 | | porkkana | 2 | | peruna | 3 | | retiisi | 4 | | lanttu | 1 | | selleri | 3 | +----------+-------+
Kyselyn WHERE
-osan avulla voi antaa ehtoja, joita haettavien rivien täytyy toteuttaa.
Vertailut =
, <>
, <
, >
, <=
ja >=
toimivat tavalliseen tapaan. Jos vertailtavana ovat lukuarvot, tutkitaan niiden suuruusjärjestystä. Jos vertailtavana ovat merkkijonot, tutkitaan niiden aakkosjärjestystä.
Seuraava kysely hakee rivit, joissa nimi on peruna:
SELECT * FROM tuotteet WHERE nimi = 'peruna';
+----+--------+-------+ | id | nimi | hinta | +----+--------+-------+ | 3 | peruna | 3 | +----+--------+-------+
Seuraava kysely hakee rivit, joissa hinta ei ole 3:
SELECT * FROM tuotteet WHERE hinta <> 3;
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 2 | porkkana | 2 | | 4 | retiisi | 4 | | 5 | lanttu | 1 | +----+----------+-------+
Seuraava kysely hakee rivit, joissa nimi on aakkosissa porkkanan jälkeen:
SELECT * FROM tuotteet WHERE nimi > 'porkkana';
+----+---------+-------+ | id | nimi | hinta | +----+---------+-------+ | 4 | retiisi | 4 | | 6 | selleri | 3 | +----+---------+-------+
Seuraava kysely hakee rivit, joissa hinta on korkeintaan 2:
SELECT * FROM tuotteet WHERE hinta <= 2;
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 2 | porkkana | 2 | | 5 | lanttu | 1 | +----+----------+-------+
Merkkijonojen vertailuun on myös merkintä LIKE
, jossa alaviiva (_
) tarkoittaa mitä tahansa yksittäistä merkkiä ja prosentti (%
) tarkoittaa mitä tahansa merkkijonoa.
Seuraava kysely hakee rivit, joissa nimi alkaa p-kirjaimella:
SELECT * FROM tuotteet WHERE nimi LIKE 'p%';
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 2 | porkkana | 2 | | 3 | peruna | 3 | +----+----------+-------+
Seuraava kysely hakee rivit, joissa nimessä on kirjainyhdistelmä "an":
SELECT * FROM tuotteet WHERE nimi LIKE '%an%';
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 2 | porkkana | 2 | | 5 | lanttu | 1 | +----+----------+-------+
Ehdoissa voi käyttää loogisia merkintöjä AND
, OR
ja NOT
. Merkintä AND
tarkoittaa, että kahdesta ehdosta kummankin täytyy päteä. Merkintä OR
tarkoittaa, että kahdesta ehdosta ainakin toisen täytyy päteä. Merkintä NOT
tarkoittaa, että ehto ei saa päteä. Ehdoissa voi käyttää tarvittaessa sulkuja.
Seuraava kysely hakee rivit, joissa hinta on 3 ja nimi ei ole kaali:
SELECT * FROM tuotteet WHERE hinta = 3 AND nimi <> 'kaali';
+----+---------+-------+ | id | nimi | hinta | +----+---------+-------+ | 3 | peruna | 3 | | 6 | selleri | 3 | +----+---------+-------+
Seuraava kysely hakee rivit, joissa hinta on alle 2 tai yli 3:
SELECT * FROM tuotteet WHERE hinta < 2 OR hinta > 3;
+----+---------+-------+ | id | nimi | hinta | +----+---------+-------+ | 4 | retiisi | 4 | | 5 | lanttu | 1 | +----+---------+-------+
Seuraava kysely hakee rivit, joissa hinta ei ole 3:
SELECT * FROM tuotteet WHERE NOT (hinta = 3);
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 2 | porkkana | 2 | | 4 | retiisi | 4 | | 5 | lanttu | 1 | +----+----------+-------+
Seuraava kysely hakee rivit, joissa hinta on alle 2 tai yli 3 ja nimi ei ole lanttu:
SELECT * FROM tuotteet WHERE (hinta < 2 OR hinta > 3) AND nimi <> 'lanttu';
+----+---------+-------+ | id | nimi | hinta | +----+---------+-------+ | 4 | retiisi | 4 | +----+---------+-------+
Merkintä IN
tarkoittaa, että arvon täytyy kuulua tiettyyn joukkoon. Merkintä BETWEEN
tarkoittaa, että arvon täytyy olla järjestyksessä kahden arvon välissä.
Seuraava kysely hakee rivit, joissa nimi on kaali, lanttu tai selleri:
SELECT * FROM tuotteet WHERE nimi IN ('kaali', 'lanttu', 'selleri');
+----+---------+-------+ | id | nimi | hinta | +----+---------+-------+ | 1 | kaali | 3 | | 5 | lanttu | 1 | | 6 | selleri | 3 | +----+---------+-------+
Seuraava kysely hakee rivit, joissa hinta on ainakin 2 ja korkeintaan 3:
SELECT * FROM tuotteet WHERE hinta BETWEEN 2 AND 3;
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 1 | kaali | 3 | | 2 | porkkana | 2 | | 3 | peruna | 3 | | 6 | selleri | 3 | +----+----------+-------+
Tulostaulun rivien järjestykseen voi vaikuttaa ORDER BY
-osan avulla. Tässä osassa ilmoitetaan, minkä kenttien mukaan ja kumpaan suuntaan rivit järjestetään.
Tämä kysely hakee tuotteet nimen mukaan järjestettyinä:
SELECT * FROM tuotteet ORDER BY nimi;
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 1 | kaali | 3 | | 5 | lanttu | 1 | | 3 | peruna | 3 | | 2 | porkkana | 2 | | 4 | retiisi | 4 | | 6 | selleri | 3 | +----+----------+-------+
Merkintä DESC
kääntää järjestyksen toisinpäin:
SELECT * FROM tuotteet ORDER BY nimi DESC;
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 6 | selleri | 3 | | 4 | retiisi | 4 | | 2 | porkkana | 2 | | 3 | peruna | 3 | | 5 | lanttu | 1 | | 1 | kaali | 3 | +----+----------+-------+
Seuraava kysely järjestää tuotteet hinnan mukaan, mutta jos kahdella tuotteella on sama hinta, järjestys valitaan nimen mukaan käänteisesti:
SELECT * FROM tuotteet ORDER BY hinta, nimi DESC;
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 5 | lanttu | 1 | | 2 | porkkana | 2 | | 6 | selleri | 3 | | 3 | peruna | 3 | | 1 | kaali | 3 | | 4 | retiisi | 4 | +----+----------+-------+
Rivien järjestyksen voi myös valita satunnaisesti:
SELECT * FROM tuotteet ORDER BY RAND();
+----+----------+-------+ | id | nimi | hinta | +----+----------+-------+ | 6 | selleri | 3 | | 5 | lanttu | 1 | | 2 | porkkana | 2 | | 1 | kaali | 3 | | 3 | peruna | 3 | | 4 | retiisi | 4 | +----+----------+-------+
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.