SQL ( Structured Query Language ) by uzd19483

VIEWS: 12 PAGES: 8

									Upitni jezici

Jedna od značajnih osobina zajednička za sve sustave baza podataka jest omogućavanje
visoke razine pristupa podacima pohranjenim u bazi podataka, a što se osigurava putem tzv.
upitnih jezika ili jezika za pretraţivanje.
Razvoj upitnih jezika tekao je usporedno s razvojem relacijskog modela podataka. Naime,
kada je E.F.Codd 1971. godine postavio koncept relacijskog modela podataka, ustvrdio je da
"… usvajanje relacijskog modela podataka … dopušta razvoj univerzalnog jezika podataka
zasnovanog na primjeni relacijske algebre".
Naime, kako su konstrukcije relacijske algebre i relacijskog računa za krajnjeg korisnika dosta
sloţene, ideja je bila izgraditi upitni jezik koji bi bio blizak korisnikovom prirodnom jeziku
(engleskom) i koji bi od njega "sakrio" tu sloţenost.
Najpoznatiji relacijski upitni jezici su:
     SQL -temelji se na kombinacijama relacijske algebre i relacijskog računa
     QUEL - primjena računa n-torki
     QBE – primjena računa domena.


SQL ( Structured Query Language )

Razvoj SQL-a počinje 1974. godine kada se pojavljuje članak autora D.D.Chamberlaina i
R.F.Boycea u kojem oni opisuju strukturni upitni jezik za pretraţivanje podataka nazvan
SEQUEL. Godine 1975. Boyce, Chamberlain i M.Hammer predstavljaju koncept jezika
SQUARE koji je koristio matematičke izraze, za razliku od engleskih termina koje je koristio
SEQUEL. Uskoro SQUARE mijenja ime u SEQUEL2 i taj jezik je korišten u razvoju prvog
prototipa relacijskog sustava za upravljanje bazama podataka, nazvanog “System R”
razvijenog u laboratorijima IBM-a. Kasnije jezik mijenja ime u SQL.
Standardni SQL je relacijski potpun jer za svih pet osnovnih relacijskih operator (SPAJANJE,
RAZLIKA, MNOŢENJE, RESTRIKCIJA i PROJEKCIJA) postoje semantički ekvivalentne
SQL naredbe.
SQL je standardiziran od strane ISO (International Standardization Organisation) i ANSI
instituta (American National Standards Institute) i danas se rabi u većini relacijskih sustava
baza podataka.
SQL spada u neproceduralne jezike, što znači da korisnik pomoću njega definira što ţeli
dobiti, a ne kao će to dobiti.
Za razliku od klasičnih, tzv. proceduralnih programskih jezika, SQL nema If...Then...Else
konstrukciju za ispitivanje uvjeta, niti ima konstrukciju za logičku strukturu petlje Do...While
ili For...Next. On sadrţi konstrukcije slične relacijskoj algebri ili računu (koje su osnove
jezika za rukovanje podacima), naredbe opisa baze podataka (jezik za opis podataka), naredbe
za povezivanje SQL-a s nekim standardnim programskim jezikom (CURSOR operacije), kao
i naredbe za definiranje zaštite i integriteta baze podataka, upravljanje konkurentnim
obradama i oporavak baze podataka.
SQL izraz predstavlja skup odgovarajućih SQL riječi koje zajedno tvore funkcionalnu cjelinu.

Kao osnovne osobine SQL-a mogu se izdvojiti sljedeće:
 English-like jezik. Koristi riječi kao što su: select (odaberi), insert (dodaj), delete (obriši)
   kao dio naredbe.
 Ne-proceduralni jezik
 U jednom trenutku češće obraĎuje skup slogova nego jedan slog tablice
    Mogu ga koristiti korisnici različitog profila: administratori baze podataka, aplikativni
     programeri, neprofesionalni korisnici.
    Osigurava naredbe za različite zadaće uključujući :
         upite nad podacima,
         dodavanje, mijenjanje i brisanje redaka u tablicama,
         kreiranje, mijenjanje i brisanje objekata sheme,
         kontrolu pristupa bazi podataka i objektima sheme,
         konzistentnost baze podataka.

SQL izrazi mogu se razvrstati u nekoliko skupina :

a)   izrazi za upravljanje podacima (engl. Data Manipulation Language Statements - DML),
b)   izrazi za definiranje podataka (engl. Data Definition Language Statements - DDL),
c)   izrazi za kontrolu transakcija (engl. Transaction Control Statements),
d)   izrazi za kontrolu sesije (engl. Session Control Statements),
e)   izrazi za kontrolu sustava (engl. System Control Statements),
f)   ugraĎeni SQL izrazi (engl. Embedded SQL Statements).


a) DML izrazi se koriste za izvoĎenje slijedećih akcija nad podacima :
        brisanje redaka iz tablica ili indeksa (naredba: DELETE)
        upisivanje redaka u tablicu ili indeks (naredba: INSERT)
        omogućavanje pregleda izvoĎenja SQL izraza (naredba: EXPLAIN PLAN)
        zaključavanje tablica i pogleda (naredba: LOCK TABLE)
        pretraţivanje redaka iz tablica ili pogleda (naredba: SELECT)
        promjena vrijednosti u stupcima tablica ili pogleda (naredba: UPDATE).

b) DDL izrazi kreiraju, mijenjaju i brišu objekte sheme. Omogućavaju sljedeće :
        kreiranje, mijenjanje i brisanje objekata sheme i drugih struktura baze podataka (same
         baze, korisnika nad bazom, tablica..) - CREATE, ALTER i DROP naredbe;
        mijenjanje imena objekata shema (naredba: RENAME);
        praćenje statistike o objektima sheme, validiranje strukture objekata (naredba:
         ANALYSE);
        davanje i oduzimanje privilegija i uloga (role) nad bazom (naredbe: GRANT i
         REVOKE);
        uključivanje i isključivanje kontrole nad bazom (naredbe: AUDIT, NOAUDIT);
        dodavanje komentara u rječnik podataka.

c) Izrazi za kontrolu transakcije upravljaju promjenama uzrokovanim DML izrazima. Oni
     omogućuju:
      trajno potvrĎivanje transakcije (naredba: COMMIT),
      vraćanje baze u stanje prije izvoĎenja transakcije (naredba: ROLLBACK),
      definiranje točke od koje se moţe povratiti stanje baze (naredba: SAVEPOINT),
      definiranje svojstva transakcije (naredba: SET TRANSACTION).

d) Izrazi za kontrolu sesija omogućuju upravljanje svojstvima sesije odreĎenog korisnika:
        mijenjanje vaţeće sesije izvoĎenjem odreĎene naredbe (naredba: ALTER SESSION)
        aktiviranje i deaktiviranje uloga za vaţeću sesiju (naredba: SET ROLE).
e) Izrazi za kontrolu sustava mijenjaju svojstva instance baze podataka. Jedina naredba je
     ALTER SYSTEM a omogućuje mijenjanje minimalnog broja dijeljenih servera i
     deaktiviranje sesije.

f)   UgraĎeni SQL izrazi spajaju DDL, DML i izraze za kontrolu transakcija u proceduralni
     program. Oni se koriste sa pre-prevodiocima (precompilers) baze podataka, a
     omogućavaju:
      definiranje, alociranje i otpuštanje kursora (Kursori su “drţači” ili imena područja u
        memoriji u kojima se drţe rastavljeni izrazi i ostale informacije za procesiranje izraza)
        – naredbe: DECLARE CURSOR, OPEN, CLOSE
      deklariranje imena baze podataka i spajanje na istu – naredbe: DECLARE
        DATABASE, CONNECT
      dodjeljivanje imena varijablama, specificiranje dogaĎaja i pogrešaka – naredbe:
        DECLARE STATEMENT, DESCRIBE, WHENEVER
      rastavljanje i izvoĎenje SQL izraza, pretraţivanje podataka iz baze – naredbe:
        PREPARE, EXECUTE, EXECUTE IMMEDIATE, FETCH.


Osnovne naredbe SQL-a

U daljnjem tekstu detaljnije su pojašnjene sljedeće osnovne naredbe SQL-a:
 kreiranje tablice (relacije)
 unos podataka u tablice (relacije)
 dohvaćanje podataka iz tablice (pretraţivanje)
 izmjena podataka u tablicama (relacijama)
 brisanje podataka iz tablica (relacija)

Kreiranje tablice

Opći oblik SQL naredbe za kreiranje tablica u relacijskom modelu je:
 CREATE TABLE <ime-tablice>
     <definicija atributa>
Definicija atributa ima oblik:
   <ime stupca tip podatka > < [NOT NULL]>
gdje se pod tipom podatka podrazumijevaju standardni SQL tipovi podataka putem kojih se
odreĎuje kakvi se podaci mogu pohraniti u konkretnu tablicu tj. polje tablice (znakovni,
isključivo numerički, datumski i sl.), dok se s NOT NULL definira obveznost unosa podatka u
tablicu na način da NOT NULL znači da se taj podatak obvezno mora unijeti (u suprotnom se
ne moţe napraviti pohranjivanje podataka iz tog retka tablice u bazu podataka), odnosno
NULL znači da podataka nije obvezan.

Naredbom CREATE formira se prazna tablica s odreĎenim imenom, imenima i tipovima
stupaca.
Primjer:
       CREATE TABLE Proizvodi
         (Šifra INTEGER(5) NOT NULL,
         Naziv VARCHAR(50),
         Jedinica_mjere VARCHAR(10),
         Količina NUMBER(15,2),
         Cijena NUMBER(15,2))
Unos podataka u tablice

Opći je oblik naredbe SQL-a za unos podataka, odnosno dodavanje novih redaka u tablicu
jeste:
       INSERT
       INTO ime-tablice (lista_atributa)
       VALUES (lista_vrijednosti)

      ili

      INSERT
      INTO ime-tablice (lista_vrijednosti)
      SELECT ... FROM ... WHERE ...

U drugom slučaju, kombiniranjem naredbi INSERT i SELECT preuzimaju se vrijednosti iz
neke druge tablice.
Primjer:
       INSERT
       INTO Proizvodi (Šifra, Naziv, Jedinica_mjere, Količina, Cijena)
       VALUES (342,'Kruh','komad',32,4);


Dohvaćanje podataka iz tablica

Veoma je česta uporaba SQL-a za pretraţivanje (dohvaćanje) podataka u tablicama. Najčešće
se rabi sljedeći oblik, tj. naredba SELECT:

      SELECT [All/DISTINCT] <lista atributa>
      FROM <lista tablica>
      WHERE <uvjet>;
gdje je:
<Lista atributa > - stupci (atributi) tablica (relacija) koji se ţele u rezultatu. Vidljivo je da
SELECT odgovara operaciji projekcije u relacijskoj algebri.
<Lista tablica> - tablice (relacije) koje se rabe u pretraţivanju, pa je FROM ekvivalentan
operaciji Kartezijeva proizvoda u relacijskoj algebri.
<Uvjet> - predikat koji zadovoljavaju selektirane n-torke u rezultatu, pa je WHERE
ekvivalentan operaciji selekcije u relacijskoj algebri.
Navedeni tipični upitni blok SQL jezika je samo dio mogućnosti, a ekvivalentan je već
opisanom općem izrazu kojim se zadovoljava upit u relacijskoj algebri:
       A1, A2 ..., Am ( AiAj (r1 Xr2 ...Xrn )) .
Jasno je da postoji ekvivalencija općeg izraza kojim se zadovoljava upit u relacijskom
računu n torki s tipičnom SQL naredbom SELECT:
      s  r1, t  r2 ..., u  rn
      s. A1, t. A2 ..., u. An gdje je zadovoljen P.
Time se još jedanput (sada posredno preko SQL izraza) pokazuje ekvivalencija relacijske
algebre i relacijskog računa. Tipičnoj SQL naredbi moţe se dodati još parametara. Ipak,
najbolje je razumijevanje bloka naredbi SELECT na primjerima.

Primjeri
Dana je relacija Proizvodi:
               Proizvodi
               Šifra Naziv      Jedinica_mjere Količina Cijena
                342 Kruh        komad                32      4
                456 Pivo        litra              452       6
                122 Cigarete    komad                45     10
                121 Cigarete    komad              523       7
                768 Ulje        litra                34      8

        Uporabom naredbe SELECT prikazati nazive proizvoda koji se nalaze na zalihi.
         SELECT Naziv
         FROM Proizvodi;
       To je jednostavan upit koji ne rabi parametar WHERE (parametar operacije selekcije u
       relacijskoj algebri) pa je rezultat tog upita projekcija relacije Proizvodi na atribut Naziv
       (Naziv je ime atributa koji označuje naziv proizvoda). Rezultat upita je:
                Naziv
               Kruh
               Pivo
               Cigarete
               Cigarete
               Ulje
Rezultat nije prava projekcija jer postoje n-torke koje se ponavljaju. Ako se ţeli prava
projekcija, onda upit treba imati slijedeći oblik:
      SELECT DISTINCT Naziv
      FROM Proizvodi;
Rezultat je:
                    Naziv
                   Kruh
                   Pivo
                   Cigarete
                   Ulje
Prava projekcija je restriktivna jer smanjuje broj redaka. Rezultat upita je relacija jer su
eliminirana ponavljanja istih n-torki. Njezina uporaba se preporuča samo ako je to nuţno.
     Prikazati šifre proizvoda i nazive proizvoda čija je cijena veća od 5, a količina veća od
       10 jedinica.
      SELECT Šifra, Naziv
      FROM Proizvodi
      WHERE Cijena >= 5 AND Količina > 30 ;
Rezultat je:
               Proizvodi
               Šifra Naziv
                122 Cigarete
                121 Cigarete
                768 Ulje
Ako se ţele prikazati svi atributi relacije, tada se ne moraju navoditi. Moţe se jednostavno
napisati SELECT *. Veoma je korisno uz ime atributa navesti i ime relacije (zapisati atribut u
obliku: ime_relacije.ime_atributa) kojoj pripada jer je moguće postojanje istih imena atributa
u više relacija. Npr. relacija Dobavljaci sadrţi atribut Naziv, a i relacija Proizvodi sadrţi
atribut s istim imenom - Naziv. Zato je dobro u nazivu atributa pisati i ime relacije, tj.
Dobavljaci.Naziv, odnosno Proizvodi.Naziv.

Ako se ţeli odrediti redoslijed n-torki u relaciji rezultata, rabi se klauzula
    ORDER BY ime_atributa redoslijed ,ime_atributa redoslijed ...

Primjer:
Prikazati šifre proizvoda i nazive proizvoda čija je cijena veća od 7, a kupljena količina veća
od 10 jedinica po rastućem redoslijedu šifre proizvoda.
      SELECT Šifra, Naziv
      FROM Proizvodi
      WHERE Cijena >= 7 AND Količina > 30
      ORDER BY ŠifraP ASC;

Često se primjenjuje i klauzula LIKE kojom se mogu pretraţivati vrijednosti atributa kao niz
karaktera (znakova) s vrijednosti koja je djelomično poznata (zadana). Rabi se sljedeća
oznaka:
      % predstavlja (zamjenjuje) niz od 0 ili više znakova.
Primjer:
Prikazati nazive proizvoda koji počinju s K.
      SELECT Naziv
      FROM Proizvodi
      WHERE Naziv LIKE 'K%';

Testiranje nula vrijednosti omogućuju klauzule IS NULL i IS NOT NULL.
Primjer:
Prikazati šifre proizvoda čije cijene nisu poznate.
      SELECT Šifra
      FROM Proizvodi
      WHERE Cijena IS NULL;

SQL omogućava pravljenje upita (pretraţivanje) nad više tablica (relacija) istovremeno. Upiti
nad više relacija postavljaju se "ugnjeţĎivanjem" jednog u drugi upit ili uporabom upita
spajanja (join queries). UgnjeţĎivanje upita primjenjuje se kada se pretraţuje više relacija, a
prikazuju atributi samo jedne relacije. Upit koji se nalazi unutar jednog upita (ugnijeţĎeni
upit), naziva se podupit (subquery).
Primjeri:
     Prikazati šifre i nazive proizvoda koji se nalaze u skladištu čiji je naziv Glavno
        skladište. Za zadovoljenje tog upita trebaju se uzeti podaci iz dviju tablica: iz tablice
        Proizvodi i tablice Skladišta. Upit bi mogao izgledati ovako:
       SELECT Šifra, Naziv
       FROM Proizvodi
       WHERE Šifra_skladišta=
                 (SELECT Šifra
                 FROM Skladišta
                 WHERE Naziv = 'Glavno skladište')
        Podupit daje rezultat, npr. Šifra_skladišta=1, i taj rezultat se primjenjuje u WHERE
        dijelu osnovnog upita (upita u kojem je drugi SELECT ugnijeţĎen).

       Prikazati imena radnika u skladištima u kojima postoje zalihe proizvoda čija je
        količina veća od 5000 jedinica.
        SELECT Ime
        FROM Radnici
        WHERE Šifra_skladišta IN
                    (SELECT Šifra
                     FROM Skladišta
                     WHERE Šifra_proizvoda IN
                                    (SELECT Šifra
                                     FROM Proizvodi
                                     WHERE Količina>=5000));

       Prikazati nazive proizvoda i imena radnika u skladištima gdje postoje proizvodi čija je
        količina na zalihi > 5000 jedinica. Taj upit je sličan prethodnom, ali traţi još
        prikazivanje atributa iz dviju relacija (osim atributa Ime iz relacije Radnici i atributa
        Naziv iz relacije Proizvodi). Takav upit ne moţe se zadovoljiti umetanjem upita, nego
        pomoću spajanja dviju relacija:

        SELECT Radnici.Ime, Proizvodi.Naziv
        FROM Radnici, Skladišta, Proizvodi
        WHERE Radnici.Šifra_skladišta= Skladišta.Šifra
        AND Proizvodi.Šifra_skladišta= Skladišta.Šifra
        AND Proizvodi.Količina > 5000;

       Operacija spajanja je vremenski najzahtjevnija pa treba biti oprezan prilikom njene
       primjene. MeĎutim u sustavu za upravljanje bazom podataka koji ima dobre
       optimizatore upita, vrijeme odgovora na upit moţe biti jednako bez obzira piše li se neki
       upit kao upit spajanja ili ugnjeţĎivanja (naravno, svaki upit napisan kao ugnjeţĎivanje
       moţe se napisati pomoću upita spajanja).

       Spajanje relacije sa samom sobom. Prikazati nazive proizvoda koji imaju na zalihi
        jednake količine.

       SELECT Proizvod1.Naziv, Proizvod2.Naziv, Proizvod1.Količina
       FROM Proizvodi Proizvod1, Proizvodi Proizvod2
       WHERE Proizvod1.Količina =Proizvod2.Količina

Relacija Proizvodi pojavljuje se u dijelu From naredbe Select s dva naziva kao Proizvod1 i
Proizvod2. Ti sinonimi se primjenjuju u dijelu Select i Where. Naime, vrši se spajanje tih
dviju relacija Proizvod1 i Proizvod2 u dijelovima Select i Where upita.


Izmjena podataka u tablicama


Izmjena vrijednosti podataka (aţuriranje) u tablici postiţe se uporabom naredbe UPDATE.
Opći oblik te naredbe moţe se prikazati kao:
      UPDATE <ime-tablice>
      SET <atribut = izraz>
      WHERE <uvjet>
U svim n-torkama u relaciji koje zadovoljavaju uvjet mijenja se (aţurira) vrijednost navedenih
atributa.
Primjer:
        U tablici Proizvodi, za šifru proizvoda 456 (Pivo) promijeniti cijenu s 6 na 5.

       UPDATE Proizvodi
       SET Cijena=5
       WHERE Šifra=456;


Brisanje podataka iz tablica

Za brisanje podataka iz tablice koristi se SQL naredba DELETE (brisanje). Opći je oblik te
naredbe je:
      DELETE
      FROM <ime-tablice>
      WHERE <uvjet>
Ona briše sve n-torke koje zadovoljavaju uvjet.
Primjer:
       Iz tablice Proizvodi izbrisati Cigarete.

       DELETE
       FROM Proizvodi
       WHERE Naziv LIKE 'Cigarete%';

Kao što je već rečeno, ovdje su pojašnjene samo neke od naredbi SQL-a, kako bi se barem
donekle stekao uvid u mogućnosti tog jezika, koji i pored svoje neproceduralne orijentacije, a
zahvaljujući čvrstoj utemeljenosti na relacijskoj algebri, omogućava korisnicima potpuno
manipuliranje podacima u relacijskoj bazi podataka.

								
To top