|
Kuriant duomenų bazes (toliau - DB), gali būti panaudotos įvairios duomenų bazių valdymo sistemos (toliau - DBVS), pavyzdžiui, Oracle - skirta labai didelėms DB, arba MS Access - ir atskiriems kompiuteriams, ir serveriams. MySQL patraukli tuo, kad yra nemokama. Ją galite gauti adresu http://www.mysql.com/. MySQL 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. MySQL priklauso vadinamųjų reliacinių DB kategorijai. Reliacinę DB 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. CREATE DATABASE komanda Kadangi visos MySQL 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 | +------------+-------+-------------+---------+------------------+
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 | +------------+-------+---------+---------+------------------+
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 | +---------+
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 | +---------+
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 | +------------+-------+-------+---------+------------------+
Jei norime sužinoti Santa Klauso adresą, SELECT rašykime taip: mysql> SELECT adresas FROM nariai WHERE vardas= "Santa"; +------------------+ | adresas | +------------------+ | Siaures polius 1 | +------------------+
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 | +------------+--------------+
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 | +-------+-----+--------+----------+
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 | +-------+
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 | +-------+-----+--------+----------+
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 | +-------+--------------------+
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 | +------------+-------+---------+---------+------------------+
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 | +------------+-------+---------+---------+------------------+
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 | +----------+------------------+--------------+
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 | +----------+------------------+----------------+
Įrašų skaičiavimas Galima sužinoti įrašų skaičių: mysql> SELECT COUNT(*) FROM videos; +----------+ | COUNT(*) | +----------+ | 6 | +----------+
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 | +-----------+-------------+--------------+
Vidurkio paskaičiavimas: mysql> SELECT MIN(mat) FROM pazymiai; +----------+ | MIN(mat) | +----------+ | 5 | +----------+
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 | +------------+-------+---------+---------+------------------+
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 | +--------------+----------------+
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 +-----------+---------+-----------+-------+-------+---------+---------------+
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 | +-------+--------+----------+
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 | +-------+--------+-------------------------------+
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 | +-------+-------+
Štai ir viskas, tiek žinių gali praversti pradedančiajam apie SQL. Šaltinis: Pixel.lt
|