Kirjautuminen

Haku

Tehtävät

Oppaat: MySQL ja PHP: Osa 3 - Hakukyselyt I

  1. Osa 1 - Johdanto
  2. Osa 2 - PHP ja PDO
  3. Osa 3 - Hakukyselyt I
  4. Osa 4 - Hakukyselyt II
  5. Osa 5 - Hakukyselyt III
  6. Osa 6 - Lisäys, muutos ja poisto
  7. Osa 7 - Tietotyypit
  8. Osa 8 - Tietokannan suunnittelu
  9. Osa 9 - Monta taulua
  10. Osa 10 - Lisätietoa
  11. Liite 1 - MySQL:n komentorivityökalu
  12. Liite 2 - phpMyAdmin-sovellus

Kirjoittaja: Antti Laaksonen. Vuosi: 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ä.

Esimerkkitaulu

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 |
+----+----------+-------+

Kenttien valinta

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 |
+----------+-------+

Vertailut

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 |
+----+----------+-------+

Loogiset merkinnät

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 |
+----+---------+-------+

Joukossa ja välissä

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 |
+----+----------+-------+

Järjestely

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 |
+----+----------+-------+

Kommentit

jessenic [19.05.2010 20:02:15]

Lainaa #

Mikäs on vikana, kun yritän seuraavaa:
ORDER BY `lastonline`, `update` ASC
Tulee vaan virhe-ilmoituksia?

Eli supplied argument is not a valid MySQL result resource

Kirjoita kommentti

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.

Muista lukea keskustelun ohjeet.
Tietoa sivustosta