SQL upiti
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:
- naredbe za definisanje podataka (Data Definition Statements),
- naredbe za manipulisanje (rukovanje) podacima (Data Manipulation Statements) i
- naredbe kontrolne (upravljačke) funkcije (Data Control Statements).
SQL Naredbe
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:
- CREATE TABLE (kreiranje tabele baze podataka)
- CREATE VIEW (kreiranje virtuelne tabele – “pogleda”)
- CREATE INDEX (kreiranje indeksa nad kombinacijom kolona tabele)
- ALTER TABLE (izmena definicije tabele)
- DROP TABLE (izbacivanje tabele iz baze podataka)
Naredbe za manipulisanje (rukovanje) podacima omogućuju ažuriranje i prikaz podataka baze:
- SELECT (prikaz sadržaja relacione baze podataka)
- UPDATE (izmena vrednosti kolona tabele)
- DELETE (izbacivanje redova tabele)
- INSERT (dodavanje redova postojecoj tabeli)
Naredbe za kontrolne (upravljačke) funkcije omogućuju oporavak, konkurentnost, sigurnost i integritet relacione baze podataka:
- GRANT (dodela prava korišcenja sopstvene tabele drugim korisnicima)
- REVOKE (oduzimanje prava korišćenja sopstvene tabele od drugih korisnika)
- COMMIT (prenos dejstava transakcije na bazu podataka)
- ROLLBACK (poništavanje dejstava transakcije)
Kategorije SQL naredbi
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:
- naredbe za šemu baze podataka (SQL-Schema Statements), koje se koriste za kreiranje, izmenu i izbacivanje šema i objekata šema (CREATE, ALTER, DROP),
- naredbe za podatke (SQL-Data Statements) koje se koriste za prikaz i ažuriranje podataka baze (SELECT, INSERT, UPDATE, DELETE),
- naredbe za transakcije (SQL-Transaction Statements) koje se koriste za startovanje, završavanje i postavljanje parametara za transakcije (COMMIT, ROLLBACK),
- naredbe za kontrolu (SQL-Control Statements) koje se koriste za kontrolu izvršavanja sekvence SQL naredbi (CALL, RETURN),
- naredbe za konekcije (SQL-Connection Statements) koje se koriste za uspostavljanje i prekidanje SQL konekcije (CONNECT, DISCONNECT),
- naredbe za sesije (SQL-Session Statements) koje se koriste za postavljanje Default vrednosti i drugih parametara SQL sesije (SET),
- naredbe za dijagnostiku (SQL-Diagnostic Statements) koje koriste dijagnostičke podatke i signaliziraju izuzetke u SQL rutinama (GET DIAGNOSTICS).
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).
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.
Kreiranje tabele – osnovna sintaksa
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.
SQL operacije – upiti
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;
Upit tipa selekcije
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.
Nula vrednost
U relacionom modelu mogu se definisati dve vrste „nula vrednosti”:
-
nula vrednost sa smislom „još nepoznata vrednost”, marker sa specifičnim binarnim kodom koji označava nedostatak informacija o vrednosti nekog atributa,
-
nula vrednost sa smislom „neprimenljiivo svojstvo” koja označava da neki atribut nije primenljivo svojstvo za sve n-torke date relacije.
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;
ORDER BY klauzula
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.
GROUP BY i HAVING klauzula
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.
Numeričke funkcije
SQL:1999 standard sadrži četiri tipa funkcija za obradu pojedinačnih redova. To su:
-
numeričke funkcije,
-
tekstualne funkcije,
-
datumske funkcije i
-
intervalne funkcije.
Numeričke funkcije za obradu pojedinačnih redova su: POSISION, EXTRACT, CHARACTER_LENGTH…
POSITION
-
POSITION (‘48’ IN ’Narednih 48 sati’) – vraća vrednost 10
EXTRACT
-
EXTRACT (YEAR FROM DATE “1966-06-28” – vraća vrednost 1966
-
EXTRACT (MONT FROM DATE “1966-06-28” – vraća vrednost 6
-
EXTRACT (DAY FROM DATE “1966-06-28” – vraća vrednost 28
CHARACTER_LENGTH
-
CHARACTER_LENGTH (“Baze podataka”) – vraća vrednost 13
Tekstualne funkcije – SQL
Tekstualne funkcije za obradu pojedinačnih redova su: SUBSTRING, UPPER, LOWER, TRIM i OVERLAY.
-
SUBSTRING (‘Narednih 48 sati 0,9’) – vraća “Narednih 4”
-
UPPER (‘Hoću da sam veliki !!!’) – vraća “HOĆU DA SAM VELIKI !!!”
-
LOWER (‘LAKŠE JE BITI MALI’) – vraća “lakše je biti mali”
-
TRIM (LEADING “ “ FROM “ TEST “ – vraća “TEST”
-
OVERLAY (“Nikad subotom” PLACING “Uvek” FROM 1 FOR 5 – vraća vrednost “Uvek subotom”
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.