NePo
Birželis 28, 2007

SQL pagrindai

Kuriant duomenų bazes (toliau - ), gali būti panaudotos įvairios duomenų bazių valdymo sistemos (toliau - DBVS), pavyzdžiui, Oracle - skirta labai didelėms , arba MS Access - ir atskiriems kompiuteriams, ir serveriams.
patraukli tuo, kad yra nemokama. Ją galite gauti adresu http://www.mysql.com/. dirba ir Unix, ir Windows platformose.

Kiekvieną duomenų bazę sudaro viena (retai) ar kelios lentelės. Lentelėje mes išskiriame eilutes ir stulpelius, pavyzdžiui:

  +------------+-------+---------+---------+------------------+
  | kliento_id | vardas| pavard  | tel     | adresas          |
  +------------+-------+---------+---------+------------------+
  |          1 | Jonas | Kuzma   | 1234567 | Daukanto 1 - 1   |
  |          2 | Kostas| Kuzma   | 8373728 | Daukanto 12 - 10 |
  |          3 | Ignas | Klimas  | 7449373 | Kanto 2 - 10     |
  |          4 | Santa | Klausas | 9999999 | Siaures polius 1 |
  +------------+-------+---------+---------+------------------+

Viena lentelės eilutė - tai įrašas, o stulpelis - tai laukas arba atributas. priklauso vadinamųjų reliacinių kategorijai. Reliacinę sudaro kelios lentelės, kuriose esanti informacija yra tam tikru būdu susijusi (relation - ryšys, sąryšis, tarpusavio priklausomybė).
SQL leidžia kombinuoti visose lentelėse esančius duomenis, sudarant ir analizuojant duomenų sąryšius.
Turėtąją lentelę

+------------+-------+---------+---------+------------------+
| kliento_id | vardas| pavard  | tel     | adresas          |
+------------+-------+---------+---------+------------------+
|          1 | Jonas | Kuzma   | 1234567 | Daukanto 1 - 1   |
|          2 | Kostas| Kuzma   | 8373728 | Daukanto 12 - 10 |
|          3 | Ignas | Klimas  | 7449373 | Kanto 2 - 10     |
|          4 | Santa | Klausas | 9999999 | Siaures polius 1 |
+------------+-------+---------+---------+------------------+

papildykime tokia:

+----------+-------------------+------------------+
| video_id | filmas            | autorius         |
+----------+-------------------+------------------+
|        1 | Star Wars         | George Lucas     |
|        2 | ET                | Ignasn Spielberg |
|        3 | Charlie's Angels  | McG              |
|        4 | Any Given Sunday  | Oliver Stone     |
|        5 | Hollow Man        | Paul Verhoeven   |
|        6 | Woman On Top      | Fina Torres      |
+----------+-------------------+------------------+

ir dar tokia:

+------------+----------+
| kliento_id | video_id |
+------------+----------+
|          2 |        6 |
|          4 |        2 |
|          1 |        1 |
|          1 |        2 |
|          1 |        3 |
+------------+----------+

Kaip matome, pastaroji lentelė suriša dvi pirmąsias. Joje nurodyta, kuris asmuo kurią vaizdajuostę paėmęs.

iškvietimas: $
Pasirodo maždaug toks pranešimas:

Welcome to the  monitor. Commands end with ; or \g.
Your  connection id is 80 to server version: 3.23.24-beta-debug
Type ‘help;’ or ‘\h’ for help.

>

Dabar sistema laukia komandos.

CREATE DATABASE komanda

Kadangi visos lentelės laikomos duomenų bazėje, reikia pradėti nuo jos sukūrimo, pavyzdžiui:

mysql> CREATE DATABASE library;
Query OK, 1 row affected (0.05 sec)

Duomenų bazė, kurią tvarkysime, nurodoma komanda USE:

 mysql> USE library;
DATABASE changed

CREATE TABLE komanda

Duomenų bazės lentelių sąrašą galima pamatyti nurodžius komandą SHOW TABLES:

 mysql> SHOW TABLES;
Empty SET (0.00 sec)

CREATE TABLE komandos sintaksė:
CREATE TABLE <table_name>
(<field_name_1> <field_type_1> <modifiers>,
<field_name_2> <field_type_2> <modifiers>, … ,
<field_name_n> <field_type_n> <modifiers>)

Pavyzdys:

CREATE TABLE nariai (
   kliento_id int(11) NOT NULL AUTO_INCREMENT,
   vardas varchar(50) NOT NULL,
   pavard varchar(50) NOT NULL,
   tel varchar(15),
   adresas varchar(50) NOT NULL,
   PRIMARY KEY (kliento_id)
);

ALTER komanda

Tam, kad modifikuoti lentelę, naudokite komandą ALTER TABLE;
jei pridedate naują stulpelį:

ALTER TABLE <table_name> ADD <new_field_name> <new_field_type>

arba, jei modifikuojate anksčiau sukurtą stulpelį:

ALTER TABLE <table_name> MODIFY <old_field_name> <new_field_type>
Pavyzdys:

ALTER TABLE bfcplay ADD  COLUMN skin VARCHAR(100) DEFAULT "img/bfc.css"

INSERT komanda

INSERT komandos sintaksė:
INSERT into table_name (field_name_1, field_name2, field_name_n) VALUES (value_1, value_2, value_n)

Pavyzdys:

mysql> INSERT INTO nariai (kliento_id, vardas, pavard, tel, adresas) VALUES
(NULL, ‘Jonas', 'Kuzma', '1234567', 'Daukanto 1 - 1');
Query OK, 1 row affected (0.06 sec)

DELETE komanda

DELETE komandos sintaksė:
DELETE FROM <table_name>

Pavyzdys:

mysql> DELETE FROM nariai;
Query OK, 0 rows affected (0.06 sec)

Bus pašalinti visi įrašai iš lentelės “nariai”.

Jei reikia pašalinti tik tuos lentelės “nariai” įrašus, kuriuose kliento_id = 16:

mysql> DELETE FROM nariai WHERE kliento_id = 16;
Query OK, 1 row affected (0.06 sec)

UPDATE komanda

UPDATE komanda skirta įrašų reikšmėms modifikuoti. Jos sintaksė:
UPDATE <table_name> SET <field_name> = <new_value>

Jei reikia pakeisti Jono Kuzmos adresą nauju:

mysql> UPDATE nariai SET adresas = 'Kampo 132-15' WHERE kliento_id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

UPDATE komanda gali modifikuoti kelių įrašo stulpelių reikšmes:

mysql>  UPDATE   SET adresas = 'Kampo 12-1 , pavard= 'Kuzma Kitas’
 WHERE kliento_id = 2;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Tuomet lentelė atrodys taip:

+------------+-------+-------------+---------+------------------+
| kliento_id | vardas| pavard      | tel     | adresas          |
+------------+-------+-------------+---------+------------------+
|          1 | Jonas | Kuzma Kitas | 1234567 | Kampo 12-1       |
|          2 | Kostas| Kuzma       | 8373728 | Daukanto 12 - 10 |
|          3 | Ignas | Klimas      | 7449373 | Kanto 2 - 10     |
|          4 | Santa | Klausas     | 9999999 | Siaures polius 1 |
+------------+-------+-------------+---------+------------------+

4 rows in set (0.00 sec)

SELECT komanda

Jei reikia išrinkti visus įrašus iš lentelės “nariai”, SELECT komanda atrodys taip:

mysql> SELECT * FROM nariai;
+------------+-------+---------+---------+------------------+
| kliento_id | vardas| pavard  | tel     | adresas          |
+------------+-------+---------+---------+------------------+
|          1 | Jonas | Kuzma   | 1234567 | Kampo 132-15     |
|          2 | Kostas| Kuzma   | 8373728 | Daukanto 12 - 10 |
|          3 | Ignas | Klimas  | 7449373 | Kanto 2 - 10     |
|          4 | Santa | Klausas | 9999999 | Siaures polius 1 |
+------------+-------+---------+---------+------------------+

4 rows in set (0.00 sec)

Jei reikia išrinkti visas įrašytas pavardes iš lentelės “nariai” , SELECT komanda atrodys taip:

mysql> SELECT pavard FROM nariai;
+---------+
| pavard  |
+---------+
| Kuzma   |
| Kuzma   |
| Klimas  |
| Klausas |
+---------+

4 rows in set (0.00 sec)

Jei reikia išrinkti įrašytas skirtingas pavardes iš lentelės “nariai”, SELECT komanda atrodys taip:

mysql> SELECT DISTINCT pavard FROM nariai;
+---------+
| pavard  |
+---------+
| Kuzma   |
| Klimas  |
| Klausas |
+---------+

3 rows in set (0.05 sec)

Jei reikia išrinkti tuos lentelės “nariai” įrašus, kuriuose kliento pavardė “Kuzma”, SELECT komanda atrodys taip:

   mysql> SELECT * FROM nariai WHERE pavard= "Kuzma";
+------------+-------+-------+---------+------------------+
| kliento_id | vardas| pavard| tel     | adresas          |
+------------+-------+-------+---------+------------------+
|          1 | Jonas | Kuzma | 1234567 | Kampo 132-15     |
|          2 | Kostas| Kuzma | 8373728 | Daukanto 12 - 10 |
+------------+-------+-------+---------+------------------+

2 rows in set (0.00 sec)

Jei norime sužinoti Santa Klauso adresą, SELECT rašykime taip:

mysql> SELECT adresas FROM nariai WHERE vardas= "Santa";
+------------------+
| adresas          |
+------------------+
| Siaures polius 1 |
+------------------+

1 row in set (0.06 sec)

Jei norime sužinoti visus Georgo Lucas filmus, SELECT rašykime taip:

mysql> SELECT filmas, autorius FROM videos WHERE autorius = "George Lucas";
+------------+--------------+
| filmas     | autorius     |
+------------+--------------+
| Star Wars  | George Lucas |
+------------+--------------+

1 row in set (0.06 sec)

Santykio ir loginiai operatoriai

SQL užklausose galima naudoti santykio ir loginius operatorius.
Turime tokią lentelę “pazymiai”:

# pazymiai
+-------+-----+--------+----------+
| vardas| mat | fizika | literat  |
+-------+-----+--------+----------+
| Jonas |   8 |      7 |        9 |
| Aidas |   6 |      9 |        9 |
| Tomas |   5 |     10 |        5 |
| Linas |   9 |      5 |        8 |
+-------+-----+--------+----------+

SQL turi 6 santykio operatorius:

= lygu
!= nelygu
> daugiau
< mažiau
>= daugiau arba lygu
<= mažiau arba lygu

Be to, SQL turi 3 loginius operatorius: AND, OR, NOT.
Santykio ir loginiai operatoriai užklausose
Tarkime, norime sužinoti, kurie mokiniai moka matematiką pažymiui 8 ar daugiau:

mysql> SELECT * FROM pazymiai WHERE mat > 7;
+-------+-----+--------+----------+
| vardas| mat | fizika | literat  |
+-------+-----+--------+----------+
| Jonas |   8 |      7 |        9 |
| Linas |   9 |      5 |        8 |
+-------+-----+--------+----------+

2 rows in set (0.00 sec)

Tarkime, norime sužinoti, kurie mokiniai moka matematiką pažymiui 8 ar daugiau, o fiziką - pažymiui 7 ar daugiau:

mysql> SELECT vardas FROM pazymiai WHERE mat > 7 AND fizika > 6 AND literat > 8;
+-------+
| vardas|
+-------+
| Jonas |
+-------+

1 row in set (0.00 sec)

Tarkime, norime sužinoti, kurie mokiniai silpnai moka bent vieną iš šių dalykų (pažymiui 5 ar mažiau):

mysql> SELECT * FROM pazymiai WHERE mat <= 5 OR fizika <= 5 OR literat <= 5;
+-------+-----+--------+----------+
| vardas| mat | fizika | literat  |
+-------+-----+--------+----------+
| Tomas |   5 |     10 |        5 |
| Linas |   9 |      5 |        8 |
+-------+-----+--------+----------+

2 rows in set (0.00 sec)

SQL užklausose galima naudoti ir pagrindinius aritmetinius operatorius. Pavyzdžiui, susumuoti pažymius:

mysql> SELECT name, mat+fizika+literat FROM pazymiai;
+-------+--------------------+
| vardas| mat+fizika+literat |
+-------+--------------------+
| Jonas |                 24 |
| Aidas |                 24 |
| Tomas |                 20 |
| Linas |                 22 |
+-------+--------------------+

4 rows in set (0.05 sec)

Rikiavimas

SQL užklausose galima nurodyti, kad išrinkti įrašai būtų surikiuoti. Tam skirtas ORDER BY:

mysql> SELECT * FROM nariai ORDER BY kliento_id;
+------------+-------+---------+---------+------------------+
| kliento_id | vardas| pavard  | tel     | adresas          |
+------------+-------+---------+---------+------------------+
|          1 | Jonas | Kuzma   | 1234567 | Kampo 132-15     |
|          2 | Kostas| Kuzma   | 8373728 | Daukanto 12 - 10 |
|          3 | Ignas | Klimas  | 7449373 | Kanto 2 - 10     |
|          4 | Santa | Klausas | 9999999 | Siaures polius 1 |
+------------+-------+---------+---------+------------------+

4 rows in set (0.06 sec)

Jei reikia, kad išrinkti įrašai būtų surikiuoti atvirkščia tvarka, pridėkite DESC :

mysql> SELECT * FROM nariai ORDER BY kliento_id DESC;
+------------+-------+---------+---------+------------------+
| kliento_id | vardas| pavard  | tel     | adresas          |
+------------+-------+---------+---------+------------------+
|          4 | Santa | Klausas | 9999999 | Siaures polius 1 |
|          3 | Ignas | Klimas  | 7449373 | Kanto 2 - 10     |
|          2 | Kostas| Kuzma   | 8373728 | Daukanto 12 - 10 |
|          1 | Jonas | Kuzma   | 1234567 | Kampo 132-15     |
+------------+-------+---------+---------+------------------+

4 rows in set (0.00 sec)

Išrenkamų įrašų skaičiaus ribojimas

SQL užklausose galima apriboti išrinktų įrašų skaičių:

mysql> SELECT * FROM videos LIMIT 2,2;
+----------+------------------+--------------+
| video_id | filmas           | autorius     |
+----------+------------------+--------------+
|        3 | Charlie's Angels | McG          |
|        4 | Any Given Sunday | Oliver Stone |
+----------+------------------+--------------+

2 rows in set (0.00 sec)
nors tinkamų įrašų skaičius yra didesnis.
Čia pirmasis parametras nurodo pirmosios pateikiamos eilutės “poslinkį” (offset), o antrasis – pateikiamų įrašų skaičių.

SQL užklausose galima kartu naudoti išrinktų įrašų skaičiaus ribojimą ir rikiavimą naujausiems įrašams atrinkti:

mysql> SELECT * FROM videos ORDER BY video_id DESC LIMIT 0, 4;
+----------+------------------+----------------+
| video_id | filmas           | autorius       |
+----------+------------------+----------------+
|        6 | Woman On Top     | Fina Torres    |
|        5 | Hollow Man       | Paul Verhoeven |
|        4 | Any Given Sunday | Oliver Stone   |
|        3 | Charlie's Angels | McG            |
+----------+------------------+----------------+

4 rows in set (0.00 sec)

Įrašų skaičiavimas

Galima sužinoti įrašų skaičių:

mysql> SELECT COUNT(*) FROM videos;
+----------+
| COUNT(*) |
+----------+
|        6 |
+----------+

1 row in set (0.00 sec)

Funkcijų panaudojimo pavyzdžiai:

Vidurkio paskaičiavimas:

mysql> SELECT AVG(mat), AVG(fizika), AVG(literat) FROM pazymiai;
+-----------+-------------+--------------+
| AVG(mat)  | AVG(fizika) | AVG(literat) |
+-----------+-------------+--------------+
|    7.0000 |      7.7500 |       7.7500 |
+-----------+-------------+--------------+

1 row in set (0.00 sec)

Vidurkio paskaičiavimas:

mysql> SELECT MIN(mat) FROM pazymiai;
+----------+
| MIN(mat) |
+----------+
|        5 |
+----------+

1 row in set (0.00 sec)

LIKE panaudojimas

LIKE padeda atrinkti pagal “pavyzdį”; tarkime, mus domina asmenys, kurių varduose yra raidė “o”:

mysql> SELECT * FROM nariai WHERE vardas LIKE '%o%';
+------------+-------+---------+---------+------------------+
| kliento_id | vardas| pavard  | tel     | adresas          |
+------------+-------+---------+---------+------------------+
|          1 | Jonas | Kuzma   | 1234567 | Kampo 132-15     |
|          2 | Kostas| Kuzma   | 8373728 | Daukanto 12 - 10 |
+------------+-------+---------+---------+------------------+

2 rows in set (0.16 sec)

Arba mus domina filmai, kurių pavadinimuose yra skiemuo “man”:

mysql> SELECT filmas, autorius FROM videos WHERE filmas LIKE '%man%';
+--------------+----------------+
| filmas       | autorius       |
+--------------+----------------+
| Hollow Man   | Paul Verhoeven |
| Woman On Top | Fina Torres    |
+--------------+----------------+

2 rows in set (0.05 sec)

Lentelių apjungimas

Aukščiau užklausos buvo skirtos vienai lentelei. Dabar kreipkimės į dvi, norėdami atrinkti informaciją apie išnuomotus filmus. Tam naudojamas JOIN:

mysql> SELECT * FROM STATUS, nariai WHERE STATUS.kliento_id =
nariai.kliento_id;
+-----------+---------+-----------+-------+-------+---------+---------------+
|kliento_id |video_id |kliento_id | vardas| pavard| tel     | adresas       |
+-----------+---------+-----------+-------+-------+---------+---------------+
|         1 |       1 |         1 | Jonas | Kuzma | 1234567 |Daukanto 1 - 1 |
|         1 |       2 |         1 | Jonas | Kuzma | 1234567 |Daukanto 1 - 1 |
|         1 |       3 |         1 | Jonas | Kuzma | 1234567 |Daukanto 1 - 1 |
|         2 |       6 |         2 | Kostas| Kuzma | 8373728 |Daukanto 12-10 |
|         4 |       2 |         4 | Santa | Klausas|9999999 |Siaures polius 1
+-----------+---------+-----------+-------+-------+---------+---------------+

5 rows in set (0.00 sec)

Atrinkdami informaciją apie išnuomotus filmus, galime nurodyti, kokie stulpeliai turi būti suformuotoje lentelėje:

mysql> SELECT vardas, pavard, video_id FROM nariai, STATUS 	WHERE nariai.kliento_id = STATUS.kliento_id;
+-------+--------+----------+
| vardas| pavard | video_id |
+-------+--------+----------+
| Kostas| Kuzma  |        6 |
| Santa | Klausas|        2 |
| Jonas | Kuzma  |        1 |
| Jonas | Kuzma  |        2 |
| Jonas | Kuzma  |        3 |
+-------+--------+----------+

5 rows in set (0.16 sec)

Dabar apjunkime tris lenteles, kad sužinotume, kokie asmenys turi kokius filmus:

mysql> SELECT vardas, pavard, filmas FROM nariai, videos, STATUS WHERE STATUS.kliento_id = nariai.kliento_id AND STATUS.video_id = videos.video_id;
+-------+--------+-------------------------------+
| vardas| pavard | filmas                        |
+-------+--------+-------------------------------+
| Kostas| Kuzma  | Woman On Top                  |
| Santa | Klausas| ET                           |
| Jonas | Kuzma  | Star Wars: The Phantom Menace |
| Jonas | Kuzma  | ET                            |
| Jonas | Kuzma  | Charlie's Angels              |
+-------+--------+-------------------------------+

5 rows in set (0.17 sec)

Pseudonimai (aliases)

Vardams galima priskirti pseudonimus, pavyzdžiui,
“m”, “s” ir “v” vietoj “nariai”, “status” ir “videos” (atitinkamai):

mysql> SELECT m.vardas, m.pavard, v.filmas FROM nariai m, STATUS s, videos v WHERE s.kliento_id = m.kliento_id AND s.video_id = v.video_id;
+-------+--------+-------------------------------+
| vardas| pavard | filmas                        |
+-------+--------+-------------------------------+
| Kostas| Kuzma  | Woman On Top                  |
| Santa | Klausas| ET                            |
| Jonas | Kuzma  | Star Wars: The Phantom Menace |
| Jonas | Kuzma  | ET                            |
| Jonas | Kuzma  | Charlie's Angels              |
+-------+--------+-------------------------------+

5 rows in set (0.00 sec)

Dviguba užklausa

Tarkime, norime sužinoti, kas pasiskolino filmą apie žvaigždžių karus (jo id=1) šį savaitgalį:

mysql> SELECT vardas, pavard FROM nariai WHERE kliento_id=(SELECT kliento_id FROM STATUS WHERE video_id=1);

Tuomet SQL pirmiau vykdys vidinę užklausą

SELECT kliento_id FROM STATUS WHERE video_id=1;
+------------+
| kliento_id |
+------------+
|          1 |
+------------+

Po to gautas reikšmes SQL perduos išorinei užklausai, kuri pateiks ieškomą rezultatą:

SELECT vardas, pavard FROM nariai WHERE kliento_id=1;
+-------+-------+
| vardas| pavard|
+-------+-------+
| Jonas | Kuzma |
+-------+-------+

1 row in set (0.00 sec)

Štai ir viskas šiandien arba tiek žinių gali praversti pradedančiajam apie SQL.

Pastaba: Šis tekstas nėra mano. Būtent nuo šio pradžiamokslio aš pradėjau žygius į painius labirintus. Kadangi originalo rasti nesugebėjau, tikiuosi autorius nesupyks, jog neleidžiu pražūti jo vertingai informacijai ir pasidalinu ja su tauta.
P.s. straipsnis iš tiesų senas ir informacija pateikta pagal labai seną versiją - 3.23.24-beta-debug.

Panašūs straipsniai


“SQL pagrindai” komentarų: 3

  1. Eimantas

    manau, kad užklausa su STATUS nesigaus, nes STATUS yra raktinis MySQL (o gal ir viso SQL) žodis. Tokiu atveju reikėtų naudoti atbulines kabutes (backticks - `), jeigu nors viena duomenų sritis (db, lentelė ar stulpelis) sutampa su SQL raktiniu žodžiu ar f-jos pavadinimu. Tai tiek .)

  2. asterisk

    Pritariu Eimantui ir apskritai, dėl tvarkingumo manau gražu būtų visur backticksus, kabutes dėti :)
    SELECT `vardas`, `pavard` FROM `nariai` WHERE `kliento_id` = ‘1′;


  3. +1 prie Eimanto ir asterisk.

    Praktika rodo, kad tokias `-kabintas užklausas žimiai lengviau skaityti, o kai pripranti `-kabinti, reikia mažiau galvoti apie laukų pavadinimus.

    Dar venas pastebejimas apie ne tavo tekstą: patarčiau aprašiti indeksų svarbą - dažnai tai buna esmine klaidą, apie kuria pamiršta pradiedantieji.

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.