Kas tas SQL ir kodėl verta jį mokytis?
SQL – tai Structured Query Language, arba struktūrizuotų užklausų kalba. Skamba gal ir baisiai, bet iš tikrųjų tai viena iš tų technologijų, kurią išmokus gyvenimas programuotojo (ar net analitiko, marketingo specialisto, ar bet ko, kas dirba su duomenimis) pastebimai palengvėja. SQL egzistuoja nuo 1970-ųjų, ir tai, kad ji vis dar naudojama masiškai, pasako viską.
Kiekvienas, kas nors kartą bandė tvarkyti duomenis Excel lentelėje ir suprato, kad tai tampa košmaru, kai eilučių yra šimtai tūkstančių – tas žino, kodėl reikia kažko geresnio. SQL yra tas „kažkas geriau”. Reliacinės duomenų bazės, kuriose SQL yra pagrindinis bendravimo įrankis, naudojamos praktiškai visur: bankuose, el. parduotuvėse, socialiniuose tinkluose, ligoninėse, valdžios institucijose. Jei kur nors yra duomenų, labai tikėtina, kad kažkur fone sukasi SQL užklausos.
Gera žinia pradedantiesiems: SQL nėra programavimo kalba tradicine prasme. Čia nereikia galvoti apie kilpas, rekursiją ar objektus. SQL yra deklaratyvi – tu tiesiog pasakai, ką nori gauti, o ne kaip tai padaryti. Tai daro ją gana intuityvią, bent jau pradžioje.
Duomenų bazės: prieš pradedant rašyti užklausas
Prieš šokant prie SQL sintaksės, verta suprasti, su kuo dirbama. Reliacinė duomenų bazė – tai rinkinys lentelių, kurios tarpusavyje susijusios per bendrus laukus. Įsivaizduok Excel failą su keliais lapais, tik daug galingesnį ir su griežtesne struktūra.
Kiekviena lentelė turi stulpelius (columns) ir eilutes (rows). Stulpeliai apibrėžia, kokio tipo informacija saugoma (pvz., vardas, amžius, el. paštas), o eilutės – tai konkretūs įrašai (pvz., Jonas Jonaitis, 28, [email protected]).
Populiariausios duomenų bazių valdymo sistemos, su kuriomis susidursi:
- MySQL – klasika, labai paplitusi, ypač web projektuose. Nemokama, lengva pradėti.
- PostgreSQL – galingesnė, su daugiau funkcijų, vis populiarėjanti. Irgi nemokama.
- SQLite – lengvutė, vienas failas, puiki mokymosi tikslams.
- Microsoft SQL Server – korporatyvinis pasaulis, dažnai sutinkamas didelėse įmonėse.
Pradedantiesiems rekomenduočiau SQLite arba MySQL – abu turi puikius įrankius, daug dokumentacijos ir plačias bendruomenes. Jei nori greičiausio starto, parsisiųsk DB Browser for SQLite – tai grafinė sąsaja, kur gali kurti lenteles ir rašyti užklausas be jokio serverio konfigūravimo.
SELECT: pirmoji ir svarbiausia komanda
Didžioji dalis SQL darbo – tai duomenų skaitymas. Ir tam naudojama SELECT komanda. Tai tavo pagrindinis įrankis, kurį naudosi kiekvieną dieną.
Paprasčiausias variantas:
SELECT * FROM vartotojai;Šis sakinys sako: „Duok man viską (*) iš lentelės, kuri vadinasi vartotojai.” Žvaigždutė reiškia visus stulpelius. Tai patogu tyrinėjant duomenis, bet gamybiniame kode geriau vengti – geriau nurodyti konkrečius stulpelius:
SELECT vardas, el_pastas, registracijos_data FROM vartotojai;Kodėl tai geriau? Nes kai lentelėje yra 50 stulpelių, o tau reikia tik 3, nėra prasmės tempti visą krūvą duomenų. Tai veikia greičiau ir kodas tampa aiškesnis.
Dabar pridėkime filtrą su WHERE:
SELECT vardas, el_pastas
FROM vartotojai
WHERE miestas = 'Vilnius';Čia gauname tik tuos vartotojus, kurie yra iš Vilniaus. WHERE sąlyga gali būti sudėtingesnė, naudojant AND, OR, NOT:
SELECT vardas, amzius
FROM vartotojai
WHERE miestas = 'Vilnius' AND amzius > 25;Praktinis patarimas: visada testuok užklausas su LIMIT, kai dirbi su didelėmis lentelėmis. SELECT * FROM uzsakymai LIMIT 10; grąžins tik pirmas 10 eilučių ir neužkraus sistemos.
Duomenų rikiavimas, grupavimas ir skaičiavimai
Duomenų gavimas – tik pradžia. Dažnai reikia juos surikiuoti, suskaičiuoti ar sugrupuoti. Čia į žaidimą įeina ORDER BY, GROUP BY ir agregatinės funkcijos.
Rikiavimas su ORDER BY:
SELECT vardas, registracijos_data
FROM vartotojai
ORDER BY registracijos_data DESC;DESC reiškia mažėjančia tvarka (naujausi viršuje), ASC – didėjančia (numatytasis). Tai paprasta, bet labai naudinga.
Agregatinės funkcijos – tai vienas iš tų dalykų, kurie SQL daro tikrai galingą:
COUNT()– suskaičiuoja eilutesSUM()– sudeda reikšmesAVG()– apskaičiuoja vidurkįMAX()irMIN()– randa didžiausią ir mažiausią reikšmę
Pavyzdys – kiek vartotojų yra iš kiekvieno miesto:
SELECT miestas, COUNT(*) AS vartotoju_skaicius
FROM vartotojai
GROUP BY miestas
ORDER BY vartotoju_skaicius DESC;Čia AS naudojamas stulpelio pervadinimui – tai vadinama aliasu. Rezultate vietoj neaiškaus COUNT(*) matysi vartotoju_skaicius. Visada naudok aliasus – kodas tampa daug skaitomesnis.
O jei nori filtruoti jau sugrupuotus duomenis? Tam yra HAVING – tai tarsi WHERE, bet veikia po grupavimo:
SELECT miestas, COUNT(*) AS vartotoju_skaicius
FROM vartotojai
GROUP BY miestas
HAVING COUNT(*) > 100;Šis užklausas grąžins tik tuos miestus, kuriuose yra daugiau nei 100 vartotojų. Dažna klaida pradedantiesiems – bandyti naudoti WHERE vietoj HAVING su agregatinėmis funkcijomis. Tai neveiks.
JOIN: kai reikia sujungti kelias lenteles
Čia daugeliui pradedančiųjų pradeda skaudėti galvą. Bet JOIN iš tikrųjų nėra toks baisus, jei supranti pagrindinę idėją: duomenys reliacinėse duomenų bazėse sąmoningai skaidomi į atskiras lenteles, ir JOIN leidžia juos sujungti pagal poreikį.
Klasikinis pavyzdys: turime dvi lenteles – uzsakymai ir vartotojai. Užsakymų lentelėje yra vartotojo_id, bet ne vartotojo vardas. Norėdami pamatyti, kas ką užsakė:
SELECT v.vardas, u.uzsakymo_data, u.suma
FROM uzsakymai u
JOIN vartotojai v ON u.vartotojo_id = v.id;Čia u ir v – tai lentelių aliasai, kurie padaro kodą trumpesnį. ON nurodo, pagal kokį lauką lenteles jungti.
Yra kelios JOIN rūšys, kurias verta žinoti:
- INNER JOIN (arba tiesiog JOIN) – grąžina tik tas eilutes, kurios turi atitikmenų abiejose lentelėse. Jei vartotojas neturi užsakymų, jis nepasirodys rezultate.
- LEFT JOIN – grąžina visas kairiosios lentelės eilutes, net jei dešinėje nėra atitikmenų. Vartotojai be užsakymų pasirodys, bet užsakymo laukai bus NULL.
- RIGHT JOIN – atvirkščiai nei LEFT JOIN. Naudojamas rečiau.
Praktinis patarimas: pradžioje naudok INNER JOIN, kol gerai suprasi logiką. LEFT JOIN prireiks, kai norėsi rasti „trūkstamus” duomenis – pavyzdžiui, vartotojus, kurie dar nieko neužsakė:
SELECT v.vardas
FROM vartotojai v
LEFT JOIN uzsakymai u ON v.id = u.vartotojo_id
WHERE u.id IS NULL;Šis triukas – LEFT JOIN su WHERE ... IS NULL – yra vienas iš dažniausiai naudojamų SQL šablonų realiame darbe.
Duomenų keitimas: INSERT, UPDATE, DELETE
Iki šiol kalbėjome tik apie duomenų skaitymą. Bet SQL leidžia ir rašyti, keisti bei trinti duomenis. Čia reikia būti atsargesniems – klaidos gali turėti rimtų pasekmių.
Naujo įrašo pridėjimas su INSERT:
INSERT INTO vartotojai (vardas, el_pastas, miestas)
VALUES ('Petras Petraitis', '[email protected]', 'Kaunas');Duomenų atnaujinimas su UPDATE:
UPDATE vartotojai
SET miestas = 'Vilnius'
WHERE id = 42;Labai svarbu: visada naudok WHERE su UPDATE ir DELETE. Jei pamiršti WHERE, pakeisite arba ištrinsite visus įrašus lentelėje. Tai viena iš klasikinių katastrofų, kurias patiria pradedantieji (ir kartais patyrę) programuotojai.
Prieš vykdydamas UPDATE ar DELETE, pirmiausia paleisk SELECT su ta pačia WHERE sąlyga ir patikrink, ar tikrai pasirinktos tinkamos eilutės. Tik tada keisk komandą į UPDATE arba DELETE.
Įrašų trynimas su DELETE:
DELETE FROM vartotojai
WHERE registracijos_data < '2020-01-01';Jei dirbi su svarbia duomenų baze, prieš bet kokius massinius pakeitimus padaryk backup. Tai skamba kaip akivaizdus patarimas, bet statistika rodo, kad žmonės jį ignoruoja iki pirmos katastrofos.
Lentelių kūrimas ir duomenų tipai
Anksčiau ar vėliau prireiks ne tik užklausti esamas lenteles, bet ir susikurti savo. Tam naudojama CREATE TABLE komanda, ir čia svarbu suprasti duomenų tipus.
CREATE TABLE produktai (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pavadinimas VARCHAR(255) NOT NULL,
kaina DECIMAL(10, 2),
kiekis INTEGER DEFAULT 0,
sukurta TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);Pagrindiniai duomenų tipai:
- INTEGER – sveikieji skaičiai (1, 42, -5)
- VARCHAR(n) – tekstas iki n simbolių ilgio
- TEXT – ilgesnis tekstas be griežto limito
- DECIMAL(p, s) – tikslūs dešimtainiai skaičiai (puikiai tinka kainoms)
- BOOLEAN – true/false reikšmės
- DATE, TIMESTAMP – datos ir laiko reikšmės
PRIMARY KEY – tai unikalus kiekvienos eilutės identifikatorius. NOT NULL reiškia, kad laukas negali būti tuščias. DEFAULT nustato numatytąją reikšmę, jei ji nenurodyta.
Svarbus patarimas dėl kainų ir finansinių duomenų: niekada nenaudok FLOAT ar DOUBLE. Slankaus kablelio skaičiai turi apvalinimo klaidų, kurios finansiniame kontekste gali sukelti rimtų problemų. Naudok DECIMAL arba saugok centais kaip INTEGER.
Nuo pirmų užklausų iki tikro darbo su duomenimis
SQL mokymasis turi aiškų kelią: pradedi nuo SELECT, supranti WHERE ir ORDER BY, paskui JOIN, tada agregatinės funkcijos, ir galiausiai pradedi jungti viską į sudėtingesnes užklausas. Tai ne savaitės reikalas, bet ir ne metų.
Realiausiems rezultatams pasiekti greičiausiai – praktika su tikrais duomenimis. Internete yra daugybė nemokamų duomenų rinkinių: Kaggle turi tūkstančius CSV failų, kuriuos gali importuoti į SQLite ir pradėti tyrinėti. Importuok kažką, kas tau įdomu – sporto statistiką, filmų duomenis, oro sąlygas – ir pradėk klausinėti. "Kuris žaidėjas pelnė daugiausiai taškų 2023 metais?" arba "Kokie filmai turi aukščiausią įvertinimą, bet mažiausiai balsų?" – tokios užduotys verčia galvoti ir mokytis daug greičiau nei abstraktūs pavyzdžiai.
Keletas resursų, kurie tikrai veikia: SQLZoo – interaktyvios užduotys tiesiogiai naršyklėje, Mode SQL Tutorial – gerai struktūrizuotas kursas su tikrais duomenimis, LeetCode SQL sekcija – jei jau nori pasitikrinti ir pasirengti darbo pokalbiams.
Ir paskutinis dalykas, kurį norisi pasakyti: SQL klaidos yra normali mokymosi dalis. Kiekvienas, kas dirba su duomenimis, yra bent kartą ištrinęs ką nors ne to arba gavęs visiškai netikėtų rezultatų dėl nesuprastos JOIN logikos. Svarbu ne tai, kad neklysti, o tai, kad suprastum, kodėl klysti. Skaityk klaidos pranešimus – SQL duomenų bazės paprastai labai aiškiai pasako, kas negerai. Ir visada, visada testuok su mažu duomenų kiekiu prieš paleidžiant kažką didelį.






