Pradžia arrow Straipsniai arrow SQL pagrindai

SQL pagrindai Spausdinti El. paštas

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

Gairės: Pradedantiesiems,
Komentarai
Pridėti naują Ieškoti
pinigai internete     |2010-11-19 22:08:05
Gera info naujokams. Aciu
Gintaras  - Uzdarbis internete     |2011-04-01 08:44:21
Joooo... painokai čia truputį :)
royalsmk   |2011-10-20 22:09:16
Gera informacija, ačiū
Rašyti komentarą
Vardas:
E-paštas:
 
Tinklapis:
Antraštė:
Prašom įvesti apsaugos kodą, kurį matote paveikslėlyje.

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 
< Ankstesnis   Kitas >

Prisijungimas






Pamiršote slaptažodį?
Dar neužsiregistravote? Užsiregistruokite!