CATEGORII DOCUMENTE |
1970 Dr. E.F. Codd (IBM) stabileste fundamentele modelului relational
1974 D.D. Chamberlain (IBM) defineste limbajul SEQUEL (Structured English Query Language)
1975 R. Boyce defineste limbajul SQUARE (Specifying Queries as Relational Expressions). Implementarea in acest limbaj a algebrei relationale se realiza prin propozitii.
1976 IBM defineste o versiune modificata a limbajului SEQUEL denumita SEQUEL/2 apoi o versiune revizuita a acestuia numita SQL
1977 Se fondeaza compania Relational Software Inc (redenumita ulterior Oracle Corporation)
1979 Relational Software Inc. lanseaza sistemul Oracle care este primul SGBD comercializat care se bazeaza pe SQL
1981 IBM produce primul sau SGBD, numit SQL/DS
1982-1986 SQL este subiectul unei standardizari ANSI (American National Standards Institute)
1987 Norma SQL este adoptata de ISO (International Standards Organization)
1989 ANSI si ISO completeaza standardizarea si publica extensia SQL89 care adauga la versiunea anterioara tratarea integritatii datelor
1992 Apare prima forma revizuita a limbajului sub numele de SQL2 sau SQL92, care este standardul ISO actual. Acesta a devenit un standard international.
1993 Microsoft lanseaza ODBC (Open Database Conectivity) ce permite aplicatiilor Windows sa se conecteze la un SGBD si sa execute comenzi SQL. ODBC este o biblioteca de functii proiectata pentru a furniza o interfata de programare a aplicatiilor (API Application Programming Interface) care sa asigure suportul pentru sistemele de baze de date. Comunicarea cu SGBD-ul se face printr-un driver analog cum comunica sistemul de operare Windows cu o imprimanta prin intermediul unui driver.
1994 Borland lanseaza IDAPI (Integrated Database Application Programming Interface) care este o biblioteca de functii SQL ce se pot integra intr-un program gazda
1998 Se complecteaza standardul SQL cu posibilitatile gestiunii datelor orientate obiect conducand spre SQL3
SQL pronuntat "ess-que-el' este acronimul pentru Structured Query Language (Limbaj de interogare structurat). Defineste metodele pentru crearea si manipularea bazelor de date relationale. Conform ANSI (American National Standards Institute), este limbajul standard pentru SGDB-urile relationale. SQL nu este un limbaj de programare (asa cum sint limbajele procedurale cunoscute: C, Pascal, Fortran, Cobol), este destinat manipularii datelor dintr-o baza de date relationala. Cererile SQL sunt utilizate pentru operatii precum modificari sau extrageri de informatii din bazele de date. Printre cele mai cunoscute SGBD-uri relationale care utilizeaza SQL se gasesc: Oracle, Sybase, Microsoft SQL Server, Access, Ingres, Informix etc. Astfel Oracle utilizeaza PL/SQL, Microsoft SQL Server utilizeaza Transact SQL. Toate acestea se bazeaza insa pe standardul ANSI SQL. Fiecare SGBD dispune de extensii specifice; cu toate acestea , comenzile SQL standard ("Select', 'Insert', 'Update', 'Delete', 'Create' si 'Drop') pot fi folosite pentru manipularea datelor in orice SGBD. SQL este folosit pentru interogarea bazelor de date si in limbaje de scripting precum PHP, PERL sau ASP.
O baza de date relationala contine una sau mai multe obiecte numite tabele. Datele sau informatiile sunt stocate in aceste tabele. Tabelele sunt identificate in mod unic prin nume si cuprind coloane si linii. Coloanele se descriu prin nume, tip si alte atribute ale acesteia. Randurile contin inregistrari (date) corespunzatoare coloanelor.
Comenzile SQL pot fi impartite in 2 categorii: DDL (Data Definition Language -Limbajul de definire a datelor) contine comenzile pentru crearea si distrugerea obiectelor bazelor de date. Dupa crearea structurii bazelor de date folosind DDL, administratorul de baze de date poate utiliza a doua categorie de comenzi si anume DML (Data Manipulation Language -Limbajul de manipulare a datelor) pentru a insera, extrage, modifica sau sterge inregistrari.
Instalarea unui SGBD pe un calculator ne permite crearea si gestionarea mai multor baze de date. Un exemplu ar fi baza de date ce cuprinde vanzarile unui magazin ce trebuie sa cuprinda o tabela de clienti, o tabela de produse, una de facturi (informatii generale despre facturi) si una de detalii (cuprinzand facturile detaliate pe coduri).
Instructiunea CREATE DATABASE permite crearea unei baze de date.
CREATE DATABASE vanzari
-creeaza o baza de date numita vanzari
Urmatorul pas este crearea tabelelor.
Instructiunea CREATE TABLE permite crearea unei noi tabele. Sintaxa acestei comenzi este urmatoarea:
CREATE TABLE 'numetabela'
( 'coloana1' 'tip coloana' [constringere],
'coloana2' ' tip coloana ' [constringere],
'coloana3' ' tip coloana ' [constringere] );
Exemplu:
CREATE TABLE facturi
( nrfact NUMBER,
dataf DATE,
codcl NUMBER);
CREATE TABLE detalii
( nrfact NUMBER,
codpr NUMBER
cant NUMBER );
Pentru a crea a noua tabela se utilizeaza CREATE TABLE urmat de numele tabelei, paranteza deschisa, urmat de perechi nume coloana tip coloana si optional constrangeri, perechi despartite prin virgula iar in final paranteza inchisa. Numele coloanei trebuie sa inceapa cu o litera, urmata de litera, cifra sau caracterul de subliniere, in total nu trebuie sa depaseasca 30 de caractere in lungime; nu se pot utiliza cuvinte cheie rezervate ca nume de tabele.
Tipul de date specifica tipul datelor ce vor fi stocate in respectiva coloana. Cele mai utilizate tipuri de date sunt:
CHAR(lungime) Sir de caractere de lungime fixa. Marimea este specificata intre paranteze. Dimensiunea maxima este 255 caractere.
VARCHAR2(lungime) Sir de caractere de lungime variabila. Marimea este specificata intre paranteze.
NUMBER(lungime) Numar cu un numar maxim de cifre precizat intre paranteze
NUMBER(lungime,precizie) Numar cu un numar maxim total de cifre precizat prin lungime din care numarul de zecimale este specificat de precizie
DATE Valoare de tip data calendaristica
O constrangere este in principiu o regula asociata unei coloane pe care datele introduse trebuie sa o satisfaca. Constrangerile se introduc pentru a preveni introducerea de date invalide in tabele.
-"UNIQUE" precizeaza faptul ca nu pot exista doua inregistrari care sa aiba aceeasi valoare in coloana cu acest tip de constrangere. Toate valorile corepunzatoare acestei coloane trebuie sa fie unice.
-"NOT NULL" precizeaza faptul ca acea coloana nu poate ramane necomplectata (fara valoare).
-"PRIMARY KEY" specifica faptul ca acea coloana defineste un identificator unic pentru toate inregistrarile acelei tabele. O cheie primara este o coloana sau un set de coloane ce identifica in mod unic un articol.
-"FOREIGN KEY" specifica faptul ca acea coloana este cheie straina. O cheie straina este o coloana intr-o tabela, coloana aflata in relatie cu o coloana dintr-o alta tabela ce constituie o cheie primara. Aceasta sta la baza relatiilor 1-M dintre doua tabele.
-"CHECK" -specifica o conditie ce trebuie sa fie adevarata
CREATE TABLE clienti
(codcl NUMBER(3) NOT NULL,
nume VARCHAR2(60) NOT NULL,
adresa VARCHAR2(60) NOT NULL,
localitate VARCHAR2(60) NOT NULL,
CONTRAINT cod_pk PRIMARY KEY(cod),
CONSTRAINT cod_c CHECK (cod BETWEEN 100 AND 999));
O contrangere poate fi adaugata si ulterior creerii tabelei folosind instructiunea:
ALTER TABLE nume_tabela ADD CONSTRAINT nume_constrangere constrangere;
Stergerea unei constrangeri:
ALTER TABLE nume_tabela DROP CONTRAINT nume_constangere;
Dezactivarea unei constrangeri:
ALTER TABLE nume_tabela DISABLE CONSTRAINT nume_constrangere;
Activarea unei constrangeri:
ALTER TABLE nume_tabela ENABLE CONSTRAINT nume_constrangere;
Dupa crearea unei tabele este posibil sa dorim modificarea structurii ei in sensul adaugarii sau modificarii unei coloane.
Comanda de modificare a tabelei este ALTER TABLE.
Pentru a insera o noua coloana se procedeaza astfel:
ALTER TABLE "nume_tabela" ADD "nume coloana" "tip_coloana" [constrangere];
Exemplu:
ALTER TABLE detalii ADD cant NUMBER;
Pentru modificarea unei coloane se procedeaza astfel:
ALTER TABLE "nume_tabela" MODIFY "nume coloana" "tip_coloana" [constrangere];
Exemplu:
ALTER TABLE detalii MODIFY cant NUMBER NOT NULL;
-constrangerea NOT NULL poate fi specificata doar in cazul in care in tabela nu avem nici o inregistrare sau daca tuturor inregistrarilor li s-a complectat coloana cantitate
Permite modificarea numelui unui obiect.
RENAME facturi TO factura
-va modifica numele tabelei facturi in factura
Permite stergerea tuturor inregistrarilor unei tabele.
TRUNCATE TABLE clienti
-va sterge toate inregistrarile din tabela clienti
Permite stergerea in intregime a obiectelor bazei de date sau a bazei de date in intregime.
DROP TABLE "nume_tabela";
-permite stergerea tabelei cu numele specificat
DROP DATABASE "nume_bazadedate";
-permite stergerea bazei de date cu numele specificat
Atentie: Aceste comenzi sunt periculoase. Pentru a sterge inregistrari dintr-o tabela se utilizeaza comanda DDL DELETE.
Permite introducerea unui comentariu la o tabela
COMMENT ON TABLE clienti IS 'Tabela de clienti';
-adauga comentariul aflat intre apostroafe la tabela clienti
Permite inserarea (adaugarea) unei/unor inregistrari intr-o tabela existenta. Sintaxa ei este urmatoarea:
INSERT INTO 'nume_tabela'
(prima_coloana,ultima_coloana)
VALUES (prima_valoare,ultima_valoare);
Exemplu:
INSERT INTO facturi (nrfact, codcl, dataf)
VALUES (12,1050,'02-MAR-01');
Valorile tip sir de caractere se delimiteaza prin apostroafe.
Se poate evita precizarea coloanelor daca se respecta intocmai numarul de valori (egal cu numarul de coloane ale tabelei) precum si corespondenta exacta intre valori si campurile corespunzatoare in ordinea in care acestea au fost definite.
Clauza VALUE accepta doar valori constane, nefiind admise expresiile. De asemenea se accepta:
NULL -pentru valori nule;
TODAY -pentru data curenta
CURRENT -pentru data si timpul curent
USER -pentru nume user
DBSERVERNAME (sau SITENAME) -pentru numele calculatorului pe care ruleaza serverul de baze de date
O alta forma a instructiunii INSERT permite inlocuirea clauzei VALUE cu o instructiune SELECT. Aceasta permite:
-inserarea mai multor inregistrari folosind o singura instructiune INSERT (cate o inregistrare pentru fiecare rand generat de instructiunea SELECT)
-valori calculate
Exemplu:
INSERT INTO produse (codpr, denumire)
SELECT cod, denumire FROM omologare
WHERE data_omologarii IS NOT NULL;
-va insera in tabela produse toate inregistrarile din tabela omologare la care campul data_omologarii este complectat
Instructiunea SELECT dintr-o astfel de inserare nu poate contine clauzele INTO, ORDER BY si nu se poate referi la tabela in care se insereaza.
Serveste la actualizarea unei/unor inregistrari care satisfac o anumita conditie. Sintaxa este urmatoarea:
UPDATE 'nume_tabela'
SET 'nume_coloana1' = 'valoare_noua1'[,'nume_coloana2' = 'valoare_noua2']
WHERE 'nume_coloana' OPERATOR 'valoare' [and|or 'nume_coloana' OPERATOR 'valoare'];
Exemplu:
UPDATE produse
SET pretunit=105000 WHERE codpr=12;
-modifica valoarea pretului unitar la produsul cu codul 12
sau
UPDATE produse
SET pretunit = pretunit * 1.1;
-permite actualizarea tuturor inregistrarilor din tabela produse prin indexarea cu 10% a preturilor tuturor reperelor
Lipsa clauzei WHERE la o instructiune UPDATE va produce modificarea tuturor inregistrarilor acelei tabele!
In clauza WHERE se pot utiliza subcereri.
UPDATE produse SET pretunit = pretunit * 1.05
WHERE codpr IN
(SELECT codpr FROM detalii
WHERE cant <3)
-pretul tuturor produselor care se regasesc in tabela detalii cu o cantitate mai mica de 3 bucati va creste cu 5%.
Permite stergerea unor inregistrari dintr-o tabela. Sintaxa ei este urmatoarea:
DELETE FROM 'nume_tabela'
WHERE
'nume_coloana1' OPERATOR 'valoare1' [and|or
'nume_coloana2' OPERATOR 'valoare2'];
Daca lipseste clauza WHERE toate inregistrarile tabelei vor fi sterse!
DELETE FROM clienti
WHERE codcl=2014;
-va sterge clientul cu codul 2014 (sigur o singura inregistrare daca campul cod are constrangerea UNIQUE)
DELETE FROM clienti
WHERE adresa='Str. Libertatii';
-va sterge toti clientii ce au in campul adresa valoarea 'Str. Libertatii'
Instructiunea SELECT este comanda de baza din SQL, majoritatea comenzilor SQL fiind instructiuni SELECT. Cand se construiesc interogari SQL folosind comanda SELECT este foarte important sa se cunoasca toate posibilele optiuni pentru a obtine cel mai rapid mod de interogare.
Este utilizata pentru interogarea bazelor de date si obtinerea datelor ce satisfac anumite criterii specificate.
Are 5 clauze de baza din care una (clauza FROM) este obligatorie. Formatul general al acestei instructiuni este urmatorul:
SELECT [ALL | DISTINCT] column1[,column2]
FROM table1[,table2]
[WHERE 'conditions']
[GROUP BY 'column-list']
[HAVING 'conditions]
[ORDER BY 'column-list' [ASC | DESC] ]
Numele coloanelor ce urmeaza cuvantului cheie SELECT stabilesc valorile caror coloane vor fi afisate in cadrul rezultatului. Se pot specifica oricate nume de coloane sau se poate folosi * pentru a selecta toate coloanele.
Numele tabelei sau a tabelelor implicate in interogare este precizat prin clauza FROM.
-permite introducerea unor conditii in cadrul instructiunii de interogare. Doar articolele ce satisfac conditiile date vor fi afisate.
SELECT codcl, nume, adresa
FROM clienti
WHERE localit='Cluj Napoca';
-va selecta toate inregistrarile (doar coloanele cod, nume, adresa) din tabela clienti ce contin clientii din localitatea Cluj Napoca
Nu se poate utiliza clauza WHERE pentru restrictii pe grupuri (se va utiliza clauza HAVING).
-permite cumularea tutoror inregistrarilor cu valori egale aferente coloanelor specificate permitand utilizarea functiilor agregate. Aceasta va produce o singura inregistrare rezultat pentru fiecare grup de randuri ce poseda aceeasi valoare pentru fiecare din coloanele specificate in clauza GROUP BY. Clauza GROUP BY nu ordoneaza datele (este necesara in acest caz si clauza ORDER BY).
Pentru a obtine o lista cu inregistrarile ce contin cantitatea maxima vanduta din fiecare reper se foloseste GROUP BY:
SELECT MAX(cant), codpr
FROM detalii
GROUP BY codpr ;
Clauza HAVING
-permite specificarea unor conditii pentru randurile fiecarui grup -cu alte cuvinte care randuri vor fi selectate depind de conditiile specificate. Clauza HAVING fixeaza conditii pe grupurile deja formate (spre deosebire de clauza WHERE care nu accepta expresii agregate). Se poate utiliza o clauza GROUP BY fara HAVING sau invers.
-daca dorim sa selectam cantitatea medie vanduta din fiecare produs luand in calcul doar mediile mai mari ca o valoare data se foloseste HAVING:
SELECT codpr,AVG(cant)
FROM detalii
GROUP BY codpr
HAVING AVG(cant)>3;
-permite afisarea rezultatelor interogarii intr-o ordine sortata (ascendent sau descendent) dupa coloanele specificate
ASC -ordine ascendenta (implicit)
DESC -ordine descendenta
SELECT *
FROM detalii
WHERE cant>3
ORDER BY codpr DESC, cant
-va afisa articolele din tabela detalii care au campul cant mai mare decat 3 in ordine descrescatoare a codului produsului iar pentru aceleasi valori in ordine crescatoare a cantitatii
In specificarea coloanelor care se vor selecta si in tabelele care se vor utiliza se pot specifica aliasuri. Acestea sunt noi denumiri pentru elementele corespunzatoare. Exista doua feluri de aliasuri: aliasuri pentru coloane si aliasuri pentru tabele. Aliasurile pentru coloane se folosesc in cazul in care fie avem functii agregate fie numele coloanei nu este sugestiv si dorim utilizarea unui alt titlu pentru respectiva coloana. Utilizarea aliasurilor va duce la obtinerea unui rezultat cu un cap de tabel mult mai sugestiv.
SELECT f.codcl codul_clientului, f.nrfact numar_factura, d.codpr codul_produsului
FROM facturi f, detalii d
WHERE f.nrfact = d.nrfact
GROUP BY f.codcl, f.nrfact, d.codpr
ORDER BY f.codcl, d.codpr
In cazul in care utilizam mai multe tabele iar acestea au coloane cu denumiri identice, este necesara prefixarea numelui coloanei cu numele tabelei sau cu numele aliasului (daca acesta a fost precizat). In acest caz aliasul tabelelor facturi si detalii sunt f respectiv d. Selectia va afisa ca nume de coloane aliasurile precizate (codul_clientului, numar_factura, codul_produsului). Selectia anterioara utilizeaza doua tabele, cea de facturi ce cuprinde cuprinde campul numar factura si tabela detalii ce cuprinde toate reperele ce se gasesc pe fiecare factura. Rezultatul acestei selectii vor fi toate produsele vandute. Se face o grupare dupa codul clientului iar ordinea de afisare va fi dupa codul clientului iar pentru acelasi client in ordinea codurilor de produs. Se observa ca cele 2 tabele sunt legate folosind clauza WHERE dupa codul facturii (pentru fiecare factura exista o inregistrare in tabela facturi si una sau mai multe inregistrari (in functie de numarul de repere de pe factura) in tabela detalii. Toate campurile selectate in afara celor agregate trebuie sa apara in clauza GROUP BY.
Instructiuni SELECT imbricate (subcereri)
Subcererile reprezinta cereri incluse in clauzele unor comenzi. Randurile selectate de o subcerere nu sunt afisate, ele fiind utilizate in continuare de o comanda SQL. Daca subcererea este folosita in partea dreapta a unei expresii logice sau in partea dreapta a unei expresii de atribuire, ea va returna o singura valoare sau o coloana de valori. In cazul in care subcererea este folosita pentru a specifica valori in comenzi ca INSERT, CREATE TABLE, ea va returna cate o valoare pentru fiecare coloana specificata in comanda. Clauze ca ORDER BY sau GROUP BY nu pot fi folosite in subcereri.
Exista subcereri corelate cu cererile din comanda principala care apar doar in clauza WHERE a comenzii SELECT (sau pe instructiuni INSERT, DELETE sau UPDATE). Acestea trebuie incluse intre paranteze pentru ca ele sa fie executate mai intai.
Subcererile pot fi corelate sau necorelate. In primul caz valoarea generata de instructiunea incuibarita depinde de o valoare generata de instructiunea exterioara. In cazul in care nu exista aceasta legatura aceste instructiuni vor fi necorelate.
Cea mai importanta particularitate a celor corelate instructiunea incuibarita se va executa repetat, pentru fiecare valoare produsa de instructiunea exterioara.
Instructiunile SELECT incuibarite permit executarea urmatoarelor actiuni:
-compararea unei expresii cu rezultatul unei alte instructiuni SELECT
-determina daca rezultatul unei alte instructiuni SELECT include o expresie
-determina daca o alta instructiune SELECT a returnat vreo inregistrare
Instructiunea SELECT incuibarita poate returna mai multe, una sau nici o valoare. Ea este precedata de unul din urmatoarele cuvinte cheie:
ALL pentru compararea cu toate valorile returnate
ANY pentru compararea cu oricare din valorile returnate
IN pentru a verifica apartenenta la lista de valori returnata
EXISTS testeaza daca rezultatul returnat nu este NULL.
<ANY mai mic decat maximul
>ANY mai mare ca minimul
<ALL mai mic ca minimul
>ALL mai mare ca maximul
SELECT * FROM detalii
WHERE cant > (select AVG(cant) FROM detalii)
-va selecta toate inregistrarile din tabela detalii care au cantitatea mai mare decat valoarea medie
SELECT *
FROM detalii
WHERE cant > ALL (SELECT cant FROM detalii
WHERE codpr=1070);
-va selecta doar inregistrarile din tabela detalii cu cantitatea mai mare decat orice cantitate vanduta din reperul cu codul 1070
SELECT *
FROM detalii
WHERE codpr = ANY (SELECT codpr FROM detalii
WHERE nrfact=5);
-va selecta toate inregistrarile care au codul de produs egal cu oricare din reperele de pe factura cu numarul 5
Nu este necesara utilizarea cuvintelor ALL sau ANY in cazul in care stim ca subcererea va returna exact o valoare. O subcerere care returneaza exact o valoare poate fi tratata ca o functie. Este cazul, in general a subcererilor care utilizeaza functii agregate.
SELECT codpr FROM detalii
WHERE nrfact = (SELECT min(nrfact) FROM facturi);
-va selecta codurile tuturor produselor de pe factura cu numarul cel mai mic
In cazul in care se doreste o lista de facturi cu cele mai recente 3 date de facturare este necesara o subcerere incuibarita:
SELECT nrfact, dataf
FROM facturi princ
WHERE 3 > (SELECT COUNT (DISTINCT dataf)
FROM facturi sec
WHERE sec.dataf > princ.dataf)
ORDER BY dataf;
-subcererea se executa pentru fiecare inregistrare produsa de cererea exterioara.
SELECT nrfact, codcl FROM facturi
WHERE EXISTS (SELECT codcl FROM clienti
WHERE nume LIKE 'Ion%' AND facturi.codcl = clienti.codcl);
-va selecta facturile clientilor a caror nume incepe cu Ion
In general EXISTS este echivalent cu IN. Astfel cererea de mai sus poate fi exprimata astfel:
SELECT facturi.nrfact, facturi.codcl FROM facturi, clienti
WHERE facturi.codcl IN
(SELECT codcl FROM clienti
WHERE nume LIKE 'Ion%')
AND clienti.codcl = facturi.codcl;
IN si EXISTS pot fi negati cu operatorul NOT:
SELECT codcl, nume FROM clienti
WHERE codcl NOT IN
(SELECT codcl FROM facturi
WHERE clienti.codcl = facturi.codcl);
-va selecta toti clientii din tabela clienti care nu au nici o factura in tabela facturi.
EXISTS si IN sunt folosite pentru operatii denumite intersectii iar NOT EXISTS si NOT IN sunt folosite pentru operatii denumite ca diferente.
In varianta SQL standard clauza HAVING poate sa contina subcereri incluse in timp ce in varianta SQL din FoxPro acest lucru nu este permis.
Acestea se numesc comenzi SQL de set. Ele sunt corespondentul ale operatiilor matematice pe multimi (reuniune, intersectie si complementaritate). Aceste comenzi aditionale ajuta la o rezolvare mai directa si mai simpla a problemei fata de folosirea echivalenta a joinurilor si a subcererilor.
Uneori este necesar sa se urmareasca rezultatul a mai multor cereri reunite. Pentru a reuni rezultatul a mai multor cereri se utilizeaza UNION. In forma cea mai simpla UNION pentru doua sau mai multe tabele adauga randurile primei tabele la randurile celei de a doua tabele si produce un nou set de randuri la iesire.
Pentru a obtine toate judetele in care avem clienti sau furnizori inregistrati se poate folosi cererea:
SELECT judet FROM clienti
UNION
SELECT judet FROM furnizori;
-lista coloanelor ce apar in fiecare cerere trebuie sa coincida, coloana cu coloana, ca si tip de date.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1762
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved