SQL (Structured Query Language) je standardni relacioni upitni jezik (ANSI i ISO standard). Njegov tvorac je Čemberlin (Chamberlin), a nastao je u IBM-ovoj istraživačkoj Iaboratoriji (IBM Research Laboratory) u San Hoseu, Kalifornija 1974. godine, dakle na istom mestu gde je Kod 1970. definisao osnovne koncepte relacionog modela podataka. Jezik se u početku zvao SEQUEL (Structured English Query Language) i predstavljao je programski interfejs (API) za System R, prototipski sistem za upravljanje bazom podataka (SU8P) koji se razvijao kao deo istraživačkog projekta pod istim nazivom. Krajem sedamdesetih i početkom osamdesetih godina prošlog veka javljaju se i prve komercijalne verzije relacionih sistema, sa SQL-om kao upitnim jezikom. Među njima su najznačajniji Oracle i dva IBM-ova proizvoda: SQL/DS i DB2.
Pojava komercijalnih relacionih sistema uvećala je značaj i ubrzala proces standardizacije relacionog upitnog jezika. Prva etapa tog procesa završila se 1986. godine usvajanjem SQL-a kao standardnog relacionog upitnog jezika. Ta prva verzija SQL standarda poznata je pod nazivom SQL-86. Njom su standardizovane osnovne karakteristike SQL-a kao deklarativnog relacionog upitnog jezika. Međutim, mnoge bitne karakteristike jezika ostale su nestandardizovane. To je dovelo do revizije standarda koja je usvojena 1989. godine i kojom su standardizovane karakteristike koje se odnose na očuvanje integriteta baze podataka i povezivanje sa klasičnim programskim jezicima. Ta verzija SQL standarda poznata je pod nazivom SQL-89. 1992. godine usvojena je sledeća bitna revizija standarda, poznata pod nazivom SQL-92 ili SQL2, kojom je SQL zaokružen kao programski jezik, a obim standarda uvećan šest puta u odnosu na polaznu verziju. Poslednja revizija SQL standarda usvojena je 1999. godine. Ta verzija SQL standarda poznata je pod nazivom SQL: 1999. U nju su uključeni koncepti objektne tehnologije, mehanizam trigera, rekurzija i proceduralna proširenja.
SQL je u stalnom razvoju. Na početku je bio prilično jednostavan, blizak korisniku i u velikoj meri deklarativan (neproceduralan). Danas se za SQL može reći da je kompleksan, proceduralno/deklarativan jezik. SQL radi sa tabelama. Tabela se kreira jednom izvršnom naredbom. Odmah po kreiranju tabela je raspoloživa za korišćenje. Svi podaci memorisani su u tabelama i rezultat bilo koje operacije se Iogički prikazuje u obliku tabele. Neproceduralnost SQL-a se ogledala u činjenici da se njime definisalo ŠTA se želi, a ne KAKO se dobija: koji podaci se žele, koje tabele se referenciraju i koji uslovi treba da budu ispunjeni, bez specifikacije procedure za dobijanje željenih podataka. Da bi se povećala funkcionalnost jezika, u SQL: 1999 standardu, uvedena je proceduralna nadgradnja SQL-a, koju uglavnom čine upravljačke strukture slične upavljačkim strukturama klasičnih programskih jezika.
Zaključno sa SQL-92 standardom SQL naredbe svrstavane su u tri kategorije:
Da ponovimo, zaključno sa SQL-92 standardom SQL naredbe su svrstavane u jednu od sledeće tri kategorije: naredbe za definisanje podataka (Data Definition Statements), naredbe za manipulisanje (rukovanje) podacima (Data Manipulation Statements) i naredbe za kontrolne (upravljačke) funkcije (Data Control Statements).
Naredbe za definisanje podataka omogućuju definisanje objekata baze. Primeri naredbi ove kategorije su:
Naredbe za manipulisanje (rukovanje) podacima omogućuju ažuriranje i prikaz podataka baze:
Naredbe za kontrolne (upravljačke) funkcije omogućuju oporavak, konkurentnost, sigurnost i integritet relacione baze podataka:
SQL:1999 standard razvrstava SQL naredbe u 7 kategorija. Osnovni razlog za drugačije razvrstavanje naredbi je uvođenje novih koncepata u SQL u skladu sa razvojem informatičke tehnologije i potreba da se postojeće naredbe preciznije grupišu. Definisane su sledeće kategorije SQL naredbi:
SQL:1999 standard definiše više načina korišćenja SQL-a. Dva osnovna načina su direktno (interaktivno) korišćenje SQL-a i povezivanje SQL-a sa klasičnim programskim jezicima („ugrađeni" SQL).
Domen je u SQL-u imenovani, prost korisnički definisani objekat, koji se može specificirati kao alternativa za predefinisani tip podataka. Definiše se nad nekim predefinisanim tipom podataka i može imati Default klauzulu i 0, 1 ili više ograničenja. Default klauzula specificira vrednost koja se koristi u odsustvu eksplicitno specificirane vrednosti kolone, a ograničenje dalje ograničava dozvoljene vrednosti domena. Domen se kreira sledećom naredbom:
CREATE DOMAIN <naziv domena> [AS] <predefinisani tip>
[DEFAULT <vrednost>]
[[CONSTRAINT <naziv ograničenja>] CHECK (<ograničenje>)]
Definicija domena menja se naredbom ALTER DOMAIN. Njom je moguce definisati ili izbaciti Default vrednost i dodati ili izbaciti ograničenje na vrednosti domena. Naredba je sledećeg izgleda:
ALTER DOMAIN <naziv domena>
SET DEFAULT <vrednost> I
DROP DEFAULT I ADD (CONSTRAINT <naziv ograničenja>] CHECK <ograničenje>} I DROP CONSTRAINT <naziv ograničenja>
Domen se uništava sledećom naredbom:
DROP DOMAIN <naziv domena>
Tabelu čini uređena kolekcija od jedne ili više kolona i neuređena kolekcija od nula ili više redova. Svaka kolona ima ime i tip podataka (ili domen). Svaki red ima, za svaku kolonu, tačno jednu vrednost i ona je tipa podataka te kolone. Red je najmanja jedinica podataka koja se može uneti u tabelu ili izbrisati iz nje. Tabela može biti:
Bazna tabela je tabela čiji se podaci negde smeštaju, bilo na disk ili u memoriju. Ona je ili objekat šeme baze podataka (pripada šemi) ili objekat modula (pripada modulu). Svi SQL podaci su smešteni (čuvaju se) u baznim tabelama.
Izvedena tabela predstavlja rezultat izvršavanja upita. Upit je operacija koja referencira nula ili više baznih tabela i vraća tabelu.
Pogled je imenovani upit. koji se može pozvati (izvršiti) korišćenjem datog imena. Rezultat poziva je tabela pogleda. Pogled i tabela pogleda se često koriste kao sinonimi.
Bazna tabela ili tabela pogleda, ne može imati dve kolone sa identičnim nazivom. Izvedena tabela, koja nije tabela pogleda, može imati više kolona sa identičnim nazivom.
Bazna tabela je:
Bazna tabela, koja je objekat šeme baze podataka, naziva se kreirana bazna tabela i može biti perzistentna ili privremena. Bazna tabela, koja je objekat modula, može biti samo privremena i naziva se deklarisana privremena tabela.
Perzistentna bazna tabela je imenovana tabela definisana CREATE TABLE naredbom bez ključne reči TEMPORARY.
Globalna privremena tabela je imenovana tabela definisana CREATE TABLE naredbom koja uključuje odrednicu GLOBAL TEMPORARY.
Kreirana lokalna privremena tabela je imenovana tabela definisana CREATE TABLE naredbom koja uključuje odrednicu LOCAL TEMPORARY.
Deklarisana lokalna privremena tabela je imenovana tabela koja se deklariše kao komponenta modula.
Globalne privremene tabele i kreirane lokalne privremene tabele su slične perzistentnim baznim tabelama u smislu da su njihove definicije u šemi i ostaju u njoj dok se eksplicitno ne uklone. Međutim, za razliku od perzistentnih baznih tabela, njihova fizička egzistencija se efektivno materijalizuje samo kada se referenciraju u SQL sesiji.
SQL sesija je kontekst u kome jedan korisnik (osoba ili aplikacija) izvršava sekvencu SQL naredbi u toku jedne SQL konekcije. SQL konekcija je asocijacija (veza) izmedu SQL klijenta i SQL servera.
SQL klijent je procesor koji uspostavlja vezu sa SQL serverom i koji je prvenstveno okrenut korisniku, odnosno aplikaciji. On predstavlja interfejs preko koga se prosleđuju zahtevi SQL serveru i prihvataju rezultati obrade zahteva. SQL server je procesor koji upravlja SQL sesijom. On prihvata zahteve od SQL klijenta. izvršava ih i rezultate prosleđuje klijentu.
Svaki modul ili „ugrađeni" SQL program, koji referencira kreiranu lokalnu privremenu tabelu, prouzrokuje materijalizaciju različitog pojavljivanja (instance) te tabele u svakoj SQL sesiji. To znači da se sadržaj kreirane lokalne privremene tabele, kao ni globalne privremene tabele, za razliku od perzistentnih baznih tabela, ne može deliti izmedu SQL sesija. Prema tome, privremena tabela je prazna na početku SQL sesije i prazni sa na njenom kraju ili na kraju SQL transakcije. Sadržaj kreirane lokalne privremene tabele ne može se deliti ni izmedu modula ili „ugrađenih" SQL programa jedne SQL sesije.
Da zaključimo, sadržaj globalne privremene tabele jedinstven je u SQL sesiji, sadržaj kreirane lokalne privremene tabele jedinstven je unutar modula ili „ugrađenog" SQL programa jedne SQL sesije, a sadržaj deklarisane lokalne privremene tabele jedinstven je unutar procedure jednog modula ili „ugradenog" SQL programa jedne SQL sesije.
Pri kreiranju tabele potrebno je navesti njeno ime i za svaku kolonu tabele naziv, tip, dužinu i da li su NULL vrednosti dozvoljene. Opšti oblik naredbe je:
CREATE TABLE <naziv tabele> (
<naziv kolone1> <tip podatka> [NOT NULL]
<naziv kolone2> <tip podatka> [NOT NULL] ...
)
Tabele radnik i odeljenje kreirane su sledećim naredbama:
CREATE TABLE RADNIK(
SRADNIK INTEGER NOT NULL,
IME VARCHAR (20) NOT NULL,
POSAO VARCHAR (20),
SRUKOV INTEGER,
DATZAP DATE,
PLATA NUMERIC (10),
PREMIJA NUMERIC (10).
ODELENJE INTEGER NOT NULL
);
CREATE TABLE ODELENJE (
ODELENJE INTEGER NOT NULL,
NAZIV VARCHAR (20) NOT NULL,
GRAD VARCHAR (20)
);
Pri definisanju kolone, umesto tipa podataka, moguće je navesti domen. Pored navedenih osnovnih svojstava, definicija kolone može da obuhvati i specifikaciju Default vrednosti i ograničenja na vrednosti kolone. Default vrednost se koristi ukoliko pri ubacivanju novog reda (n-torke) nije eksplicitno navedena vrednost za posmatranu kolonu. Kada kolona nema eksplicitno navedenu Default vrednost, tada ce Default vrednost implicitno biti NULL vrednost. Ako je kolona definisana kao NOT NULL, što je jedno od mogućih ograničenja na vrednosti kolone, tada ona mora dobiti vrednost pri ubacivanju n-torke, bez obzira na način ažuriranja (direktnim izvršavanjem naredbe INSERT, preko pogleda, preko interaktivne aplikacije za ažuriranje itd.); u suprotnom, NOT NULL ograničenje bilo bi narušeno, što bi dalje prouzrokovalo neuspeh izvršavanja operacije ubacivanja n-torke.
Osnova SQL-a je upitni blok oblika:
SELECT <lista atributa>
FROM <lista relacija>
WHERE <kvalifikacioni izraz >;
Listom atributa zadaje se operacija PROJEKCIJE. Kvalifikacionim izrazom zadaju se uslovi SELEKCIJE i SPAJANJA, odnosno iskazi slični iskazima u relacionom računu. Klauzule SELECT i FROM su obavezne, dok klauzula WHERE nije.
Ovde će se prikazati nekoliko upita tipa projekcije, odnosno upita koji prikazuju neke ili sve kolone posmatrane tabele i sve njene vrste bez ikakve selekcije.
1. Prikazati šifre, nazive i lokacije svih odeljenja iz relacije o odeljenjima.
SELECT ODELJENJE#, NAZIV, GRAD
FROM ODELJENJE;
WHERE se može koristiti sa SELECT, UPDATE i DELETE naredbama.
2. Prikazati sve podatke o radnicima koji rade u odeljenju 30.
SELECT *
FROM RADNIK WHERE ODELENJE # = 30;
Where se može koristiti sa SELECT, UPDATE i DELETE naredbama. Korišćena u SELECT bloku ona definiše uslove koje vrste tabele u rezultatu moraju da zadovolje, odnosno realizuje operaciju selekcije relacione algebre. Najčešće se prost uslov selekcije definiše preko operatora poređenja koji se može definisati nad tipom podatka, odnosno domenom odgovarajućeg atributa. Ako je tip podatka ili domen neki brojni tip, operacije poređenja su "=", "<>" (različito), ">", "<" , ">=" (veće ili jednako) i "<=" (manje ili jednako). Pored toga, definiše se i operator "BETWEEN a AND b" koji vraća TRUE ako je vrednost posmatranog atributa veća ili jednaka a, a manja ili jednaka b, kao i mnoge druge. Složeni uslov se formira vezivanjem prostih ili drugih složenih uslova logičkim operatorima AND, OR i NOT.
Uslov u WHERE klauzuli može da bude postavljen i po atributu koji može da dobije nula vrednost. Zbog toga je neophodno definisati rezultat primene operatora poređenja na nula vrednost. U najopštijem slučaju važi sledeće:
A Θ NULL := NULL
gde je Θ bilo koji operator poređenja ili Iogički operator, a A je bilo koja vrednost atributa, uključujući i vrednosti logičkog tipa podatka (TRUE i FALSE). To znači da je, uvedena još jedna moguća vrednost logičkog tipa podatka, vrednost NULL. Po pravilu, operacija selekcije u WHERE klauzuli selektuje one vrste tabele za koje se uslov selekcije sračunava u TRUE.
U relacionom modelu mogu se definisati dve vrste „nula vrednosti”:
SQL:1999 podržava samo jednu nula vrednost. Projektant i korisnik treba da pretpostave da je u pitanju nula vrednost sa smislom „još nepoznata vrednost”.
Da li neki atribut relacije ima nula vrednost, testira se preko klauzule IS NULL ili IS NOT NULL.
Primer:
Prikazati Ime i Posao radnika čija je premija nepoznata.
SELECT IME, POSAO
FROM RADNIK
WHERE PREMIJA IS NULL;
Korišćenjem ORDER BY klauzule moguće je sortirati rezultujuću tabelu po jednom ili više atributa u rastućem ili opadajućem redosledu.
Primer:
Prikazati Ime, Posao i platu radnika u odeljenju 30 uređene u rastućem redosledu poslova i opadajućem redosledu plata.
SELECT IME, POSAO, PLATA
FROM RADNIK
WHERE ODELENJE# =30
ORDER BY POSAO ASC, PLATA DESC;
ASC se koristi za specifikaciju rastućeg redosleda, a DESC se koristi za specifikaciju opadajućeg redosleda.
Kada se sortiranje vrši po koloni koja sadrži NULL vrednosti, redosled prikaza n-torki sa NULL vrednostima u koloni sortiranja uslovljen je realizacijom SQL-a u konkretnom SUBP.
Grupisanje redova tabele se eksplicitno specificira GROUP BY klauzulom. Ona rezultuje dobijanjem jednog reda za svaku različitu vrednost kolone po kojoj se vrši grupisanje.
Primer:
Naći minimalnu, srednju i maksimalnu platu, kao i ukupan broj radnika u svakom odeljenju.
SELECT MIN (PLATA), AVG (PLATA), MAX (PLATA), COUNT (*)
FROM RADNIK
GROUP BY ODELENJE#;
HAVING klauzula određuje kruterijume za selekciju grupa koje su prethodno specificirane GROUP BY klauzulom.
Primer:
Pokazati koje poslove obavlja više od 2 radnika u svakom odeljenju.
SELECT ODELENJE#, POSAO, COUNT (*)
FROM RADNIK
GROUP BY ODELENJE#, POSAO
HAVING COUNT(*) > 2;
WHERE klauzulom definisani su kriterijumi selekcije pojedinačnih redova. HAVING klauzulom definisani su kriterijumi selekcije grupa.
SQL:1999 standard sadrži četiri tipa funkcija za obradu pojedinačnih redova. To su:
Numeričke funkcije za obradu pojedinačnih redova su: POSISION, EXTRACT, CHARACTER_LENGTH...
POSITION
EXTRACT
Tekstualne funkcije za obradu pojedinačnih redova su: SUBSTRING, UPPER, LOWER, TRIM i OVERLAY.
Datumske funkcije u SQL:1999 (CURRENT_DATE i CURRENT_TIME) su same po sebi jasne i vraćaju tekući datum i tekuće vreme.