Sunteți pe pagina 1din 9

SQL

Limbajul SQL (Structured Query Language) se bazează pe studiile lui E.F. Codd, prima
implementare a acestui limbaj datând din 1970.
SQL este un limbaj complet standardizat şi se poate utiliza pentru a accesa baze de date Oracle,
SQL Server, DB2, MySQL ş.a.
SQL utilizează o sintaxă foarte simplă şi uşor de folosit. Comenzile SQL sunt grupate în cinci
categorii, astfel:

1) Limbajul de interogare – permite regăsirea liniilor memorate în tabelele bazelor de date.


Comanda utilizată este SELECT.
2) Limbajul de manipulare a datelor – permite modificarea conţinutului tabelelor. Comenzile
utilizate sunt:
- INSERT – pentru adăugarea de noi linii într-un tabel;
- UPDATE – pentru modificarea valorilor memorate într-un tabel;
- DELETE – pentru ştergerea liniilor dintr-un tabel.
3) Limbajul de definire a datelor – permite definirea structurii tabelelor ce compun bazele de date.
Comenzile utilizate sunt:
- CREATE – pentru crearea structurii unei baze de date sau a unui tabel;
- ALTER – pentru modificarea structurii unei baze de date sau a unui tabel;
- DROP – pentru ştergerea structurii bazei de date;
- RENAME – pentru schimbarea numelui unui tabel;
4) Limbajul de control al tranzacţiilor. Comenzile utilizate sunt:
- COMMIT – pentru ca modificările efectuate asupra bazei de date să devină permanente;
- ROLLBACK – permite renunţarea la ultimele modificări asupra bazei de date;
- SAVEPOINT – pentru definirea unui punct de salvare la care se poate reveni, renunţând
la modificările făcute după acest punct asupra bazei de date.
5) Limbajul de control a datelor – permite definirea şi modificarea drepturilor asupra bazelor de
date. Comenzile utilizate sunt:
- GRANT – pentru acordarea unor drepturi altor utilizatori asupra bazei de date;
- REVOKE – pentru anularea anumitor drepturi ale utilizatorilor.

Principalele elemente care compun o comandă SQL


- NUME – toate obiectele dintr-o bază de date, tabele, coloane, indecşi etc., au un nume.
Numele poate fi orice şir de maximum 30 de litere, cifre şi caractere speciale („_”, „#”,
„$”), primul caracter fiind obligatoriu o literă.
- CUVINTE REZERVATE – la fel ca în orice limbaj şi în SQL există o listă de cuvinte
rezervate. Aceste cuvinte nu pot fi utilizate în alt scop decât cel definit iniţial.
- CONSTANTE – o constantă este o valoare fixă care nu poate fi modificată. Există:
• constante numerice, de exemplu 4, 12.34, .9 (se observă că dacă un număr real
are partea întreagă egală cu zero, atunci ea nu mai trebuie precizată);
• constante alfa-numerice (sau şir de caractere). Constantele şir de caractere sunt
scrise între apostrofuri şi sunt case-sensitive (‘abc’, ‘baza de date’).
- VARIABILE – o variabilă este o dată care poate avea în timp valori diferite. O variabilă
are întotdeauna un nume pentru a putea fi referită. SQL acceptă 2 tipuri de variabile:
• variabile asociate numelor coloanelor;
• variabile sistem.
- EXPRESII – o expresie este formată din variabile, constante şi funcţii. Operatorii care
pot fi utilizaţi sunt împărţiţi astfel:
• operatori aritmetici;
• operatori alfa-numerici;

1/9
• operatori de comparaţie;
• operatori logici.

Cu ajutorul comenzii SELECT se pot realiza următoarele tipuri de operaţii:


- Selecţia – constă în filtrarea liniilor care vor fi afişate;

- Proiecţia – constă în alegerea doar a anumitor coloane pentru a fi afişate;

- Uniune (JOIN) – constă în prelucrarea datelor din două sau mai multe tabele „legate”
conform unor reguli precizate;

Sintaxa:
SELECT [DISTINCT] listă_de_expresii
FROM nume_tabel
WHERE condiţie – clauză opţională
ORDER BY criterii_sortare_rezultat – clauză opţională;

Efectul:
Se parcurg rând pe rând liniile tabelului specificat în clauza FROM. Din fiecare linie,
conţinând date pentru care condiţia aflată în clauza WHERE este adevărată, va rezulta o linie în
răspunsul cererii.

În cazul în care clauza WHERE lipseşte, toate liniile tabelului din clauza FROM vor avea o
linie corespondentă în rezultatul cererii. Linia de rezultat este compusă pe baza listei de expresii aflată
pe clauza SELECT.
Dacă există cuvântul cheie DISTINCT, din rezultat se elimină liniile duplicat.
2/9
Înainte de a trimite rezultatul, serverul îl sortează în funcţie de criteriile specificate de clauza
ORDER BY. În cazul în care clauza ORDER BY lipseşte, liniile din rezultat sunt într-o ordine
independentă de conţinutul lor sau de ordinea în care ele au fost adăugate în tabel.
Numărul coloanelor din rezultat este egal cu numărul expresiilor din lista clauzei SELECT.
Aceste expresii dau şi numele coloanelor din rezultat.
Evaluarea valorii de adevăr a condiţiei din WHERE se face doar pe baza datelor aflate pe linia
respectivă. Deoarece parcurgerea liniilor specificată de o cerere SELECT se face după un plan de
execuţie generat de server, folosirea clauzei ORDER BY este obligatorie în cazul în care se doreşte un
rezultat sortat după anumite criterii.

Nume de coloane sau *

Ex.1. SELECT nume, prenume, data_nastere


FROM studenti_tabel

Ex.2. SELECT *
FROM studenti_tabel

Expresii aritmetice

Ex.3. SELECT tip, suma, (suma+20)*1.1


FROM bursa_tabel

Expresii concatenate

Ex.4. SELECT `Specializarea` ||nume||` are codul`,cod_spec


FROM specializare_tabel

Alias de coloană
- nu poate fi mai lung de 30 de caractere;
- începe cu o literă şi conţine litere, cifre sau e pus între ghilimele;
- nu poate fi folosit decât în cererea curentă;
- sistemul nu stochează în baza de date sau altundeva aceste nume alternative.

Ex.5. SELECT tip AS “Tip bursa”, `are valoarea` ||suma|| `.lei` AS Descriere
FROM bursa_tabel

Tip bursa DESCRIERE


Bursa_soc are valoarea 100 .lei
Bursa_mer are valoarea 800 .lei

Clauza WHERE
Sintaxa: WHERE expresie_logica

Ex.6. SELECT nume, grupa, codspec


FROM studenti_tabel
WHERE an = 4;

Operatori de comparare: (< )mai mic, (<=) mai mic sau egal, (>) mai mare, (>=) mai mare sau egal,
(<>, !=, ^=) diferit.
Condiţii compuse: (AND, OR, NOT).
3/9
Operatorul BETWEEN
Sintaxa: expresie BETWEEN valoare.min AND valoare.max

Ex. 7. SELECT nume, an, punctaj


FROM studenti_tabel
WHERE punctaj BETWEEN 2000 AND 4000;

Operatorul IN
Sintaxa: expresie IN (val_1, val_2, val_3,..., val_n)

Ex. 8. SELECT nume, data_nastere


FROM studenti_tabel
WHERE grupa IN (113, 114, 116)

Operatorul IN ignoră valorile nule din listă.


Pentru a putea folosi în clauza WHERE şiruri de caractere şi date calendaristice, acestea trebuie
introduse între ghilimele simple (` `), singura excepţie fiind constantele numerice.

Ex.9. – listează toţi angajaţii care sunt pe poziţia de contabil:


SELECT *
FROM angajati_tabel
WHERE functie = `CONTABIL`

Ex.10. – listează toţi angajaţii care au data de angajare 17-dec-1990:


SELECT *
FROM angajati_tabel
WHERE data_angajare=`17-dec-1990`

Ex.11. – listează toţi angajaţii care sunt în departamentul 10:


SELECT *
FROM angajati_tabel
WHERE nr_dept = 10

Operatorul LIKE
Dacă nu se cunoaşte valoarea exactă căutată, cu ajutorul condiţiei LIKE putem să selectăm
rânduri care se potrivesc cu un model specificat de caractere. Pentru construirea modelului şirului
căutat pot fi folosite două simboluri:
% - orice secvenţă de 0 sau mai multe caractere;
_ - un singur caracter.

Ex.12. – listează toţi angajaţii al căror nume începe cu litera S:


SELECT *
FROM angajati_tabel
WHERE nume LIKE `S%`

Ex.13. – listează toţi angajaţii care au numele din 4 caractere:


SELECT *
FROM angajati_tabel
WHERE nume LIKE `_ _ _ _`

Ex.14. – listează toţi angajaţii care au al doilea caracter din nume `O`:
SELECT *
4/9
FROM angajati_tabel
WHERE nume LIKE `_O%`

Condiţia IS NULL
Pentru a verifica valori de tip NULL există condiţia IS NULL sau negarea acesteia IS NOT
NULL.
O valoare nulă nu este la fel cu 0 care este un număr. Dacă valoarea NULL este utilizată într-o
comparaţie, trebuie să se folosească IS NULL sau IS NOT NULL, altfel rezultatul este întotdeauna
FALSE.

Ex.15. – listează toţi angajaţii care nu au comision:


SELECT *
FROM angajati_tabel
WHERE comision IS NULL

Negarea expresiilor:
Operator Semnificaţie
!=
^= diferit de...
<>
NOT BETWEEN nu se află între cele 2 valori...
NOT IN nu se află în lista...
NOT LIKE diferit de şirul ...
IS NOT NULL nu este o valoare nulă

Prioritate de execuţie:
1. operatorii aritmetici;
2. operatorii de concatenare;
3. condiţiile de comparare;
4. IS NULL, LIKE, IN;
5. BETWEEN;
6. operatorul logic NOT;
7. operatorul logic AND;
8. operatorul logic OR.
Dar ordinea se poate modifica dacă se folosesc paranteze.

Clauza ORDER BY
Cu ajutorul clauzei ORDER BY rândurile vor fi afişate în ordinea solicitată (cu toate acestea nu
se va modifica ordinea internă a rândurilor din baza de date). Ea trebuie să fie ultima clauză din cerere.

Sintaxa: SELECT nume_coloană


FROM nume_tabel
WHERE condiţie ORDER BY {coloană, expresie}
[ASC/DES];
Ex.16. – listează toţi angajaţii ordonându-i după data angajării (în ordine descrescătoare)
SELECT *
FROM angajati_tabel
ORDER BY data_angajare DESC;

Rândurile pot fi ordonate după mai multe coloane. Numărul maxim de coloane după care se pot ordona
rândurile este numărul maxim de coloane existente în tabel.

5/9
Comenzi pentru actualizarea bazelor de date
SQL prezintă comenzi specifice pentru modificarea conţinutului unui tabel, înţelegând prin
aceasta trei acţiuni prin care se actualizează baza de date:
- adăugarea de noi linii la cele existente într-un tabel;

Comanda utilizată pentru adăugarea de înregistrări este INSERT cu formatul:

INSERT
INTO nume_tabel (listă de câmpuri)
VALUES (listă de valori)

Ex.17. INSERT
INTO clienti_tabel (CodClient, NumeClient, AdresaClient)
VALUES (1009, „UPB-SRL”, ”spl.Indep.313”)
Pentru o utilizare mai uşoară putem folosi comanda DESCRIBE clienti_tabel care va afişa câmpurile
tabelului în ordinea lor, precum şi tipul fiecărui câmp.

- ştergerea unor linii existente;


Ştergerea uneia sau mai multor înregistrări se realizează prin comanda DELETE care are
sintaxa:
DELETE
FROM nume_tabel
WHERE condiţie

Ex.18. DELETE
FROM clienti_tabel
WHERE CodClient=1003

- modificarea valorii unui atribut.


Comanda utilizată este UPDATE care are formatul general:
UPDATE nume_tabel
SET atribut = expresie
WHERE condiţie
Modificarea se va produce pentru toate liniile tabelului care îndeplinesc condiţia specificată.

Ex.19. UPDATE facturi_tabel


SET ValoareTotala = 3000
WHERE NrFactura = 1122

Funcţii
Funcţiile se clasifică în două tipuri:
- funcţii referitoare la o singură înregistrare (LCASE() – converteşte caracterele din mari
în mici, UCASE() – converteşte caracterele din mici în mari, CONCAT() – echivalent
cu operatorul de concatenare ||, LEN() – returnează numărul de caractere etc.);
- funcţii referitoare la mai multe înregistrări (AVG() – valoarea medie, COUNT() –
numărul de rânduri, MAX(), MIN(), SUM() etc).

Funcţiile referitoare la o singură înregistrare returnează un singur rezultat pentru fiecare rând al
tabelului, pe când funcţiile referitoare la mai multe înregistrări returnează un singur rezultat pentru
fiecare grup de înregistrări din tabel.

6/9
Ex.20. SELECT AVG(salariu), MAX (salariu), MIN(salariu)
FROM angajati_tabel
WHERE functie = `VANZATOR`

Comenzi pentru descrierea datelor


Comanda CREATE TABLE creează un tabel vid, cu o anumită structură. De exemplu:
Ex.21.
CREATE TABLE CLIENTI
(CodClient INT(7) NOT NULL,
NumeClient CHAR(25) NOT NULL,
AdresaCLient CHAR(25),
CodPostal INT(4) NOT NULL DEFAULT 1100,
PRIMARY KEY(CodClient)

Atributul CodClient este de tip INT, valoarea sa fiind reprezentată pe şapte poziţii. Celelalte
atribute conţin şiruri de caractere. Valorile pentru CodClient, NumeClient şi CodPostal nu pot fi nule.
Pentru CodPostal valoarea implicită, pe care o ia automat la adăugarea unei linii în tabelul CLIENTI,
este 1100.
În calitate de cheie primară a relaţiei a fost investit atributul CodClient.
Cele mai multe dialecte SQL admit următoarele tipuri de date:
TEXT
CHAR(SIZE) Şir de caractere de lungime (SIZE)
VARCHAR(SIZE) Şir de caractere de lungime variabilă
TINYTEXT Şir de caractere (<255 caract.)
TEXT Şir de caractere de lungime maximă 65535 caract.
BLOB Binary Large OBjects
MEDIUMTEXT
MEDIUMBLOB
LONGTEXT
LONGBLOB
ENUM
NUMERIC
TINYINT(SIZE) Numere întregi -128:127 (0:255 UNSIGNED)
SMALLINT(SIZE) -32768:32767 (0:65535 UNSIGNED)
MEDIUMINT(SIZE)
INT(SIZE)
BIGINT(SIZE)
FLOAT(SIZE, D) Numere reale cu virgulă mobilă cu (SIZE) număr total de
poziţii, din care D la partea fracţionară.
DOUBLE(SIZE, D)
DECIMAL(SIZE, D)
DATĂ
DATE() Format YYYY-MM-DD
DATETIME() Format YYYY-MM-DD HH:MM:SS
TIME() HH:MM:SS
YEAR()
Există posibilitatea adăugării ulterioare a unui nou atribut la cele existente, ştergerii unui atribut
sau de modificare a tipului sau lungimii sale. Operaţiunea nu este atât de frecventă fiind recomandabil
să se desfăşoare cât mai rar; o bună analiză desfăşurată în faza de proiectare a bazei de date elimină, de
obicei, acest gen de probleme.

7/9
Dacă în tabelul CLIENTI se doreşte păstrarea şi a codului fiscal al fiecărui furnizor, este
necesară adăugarea atributului CodFiscal, care este un şir de caractere de lungime 8. Comanda utilizată
este:
Ex.22.
ALTER TABLE CLIENTI
ADD CodFiscal CHAR(8)

Cheile străine sunt declarate cu ajutorul opţiunii FOREIGN KEY. Pentru tabelul
FACTURI_EMISE cheie primară este atributul NrFactura, în timp ce CodClient este cheie străină
către tabelul CLIENTI.
Ex.23.
CREATE TABLE FACTURI_EMISE
(NrFactura DECIMAL(8) NOT NULL,
DataFactura DATE,
CodClient DECIMAL(7) NOT NULL,
ValoareTotala DECIMAL(17) NOT NULL,
TVA DECIMAL(14),
PRIMARY KEY(NrFactura)
FOREIGN KEY(CodClienti) REFERENCES CLIENTI)

Ştergerea unui tabel din baza de date este realizabilă cu ajutorul comenzii DROP TABLE. De
obicei această comandă se utilizează atunci când pe parcursul lucrului s-au creat tabele intermediare,
temporare.

JOIN-URI
Pentru a prelucra date din mai multe tabele, forma de bază a unei instrucţiuni SELECT constă
în adăugarea unei condiţii de legătură (JOIN) în clauza WHERE.

Ex.24.
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column

Numele coloanei trebuie prefixat de numele tabelului în situaţiile când acelaşi nume de coloană
apare în mai multe tabele.
Un JOIN cu două sau mai multe tabele care returnează doar linii ce au valori echivalente pentru
coloanele specificate este denumit SIMPLE JOIN sau INNER JOIN.

Ex.25.
SELECT column.name
FROM table_name1 INNER JOIN teble_name2
ON table_name1.column_name = table_name2.column.name;

Atunci când un JOIN returnează atât liniile care se potrivesc cât şi cele care nu se potrivesc,
acesta se numeşte OUTER JOIN.
Există trei tipuri de OUTER JOIN:
- LEFT OUTER JOIN

Ex.26. – sunt afişaţi şi acei angajaţi care nu au desemnat un id_dept:


SELECT a.nume, a.id_dept, d.denumire
FROM angajati a
LEFT OUTER JOIN departament d
8/9
ON a.id_dept = d.id_dept;

- RIGHT OUTER JOIN

Ex.27. – sunt afişate şi acele departamente care nu au angajaţi:


SELECT a.nume, a.id_dept, d.denumire
FROM angajati a
RIGHT OUTER JOIN departament d
ON a.id_dept = d.id_dept;

- FULL OUTER JOIN

Ex.28. – sunt afişaţi şi acei angajaţi care nu au un departament şi acele departamente care nu au
angajaţi:
SELECT a.nume, a.id_dept, d.denumire
FROM angajati a
FULL OUTER JOIN departament d
ON a.id_dept = d.id_dept;

9/9