Curs SQL

12

Click here to load reader

Transcript of Curs SQL

Page 1: Curs SQL

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; operatori de comparaţie;

1/9

Page 2: Curs SQL

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_tabelWHERE 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

Page 3: Curs SQL

Î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_nastereFROM studenti_tabel

Ex.2. SELECT *FROM studenti_tabel

Expresii aritmetice

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

Expresii concatenate

Ex.4. SELECT `Specializarea` ||nume||` are codul`,cod_specFROM 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 DescriereFROM bursa_tabel

Tip bursa DESCRIEREBursa_soc are valoarea 100 .leiBursa_mer are valoarea 800 .lei

Clauza WHERESintaxa: WHERE expresie_logica

Ex.6. SELECT nume, grupa, codspecFROM 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

Page 4: Curs SQL

Operatorul BETWEENSintaxa: expresie BETWEEN valoare.min AND valoare.max

Ex. 7. SELECT nume, an, punctajFROM 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_nastereFROM 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_tabelWHERE functie = `CONTABIL`

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

FROM angajati_tabelWHERE data_angajare=`17-dec-1990`

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

FROM angajati_tabelWHERE nr_dept = 10

Operatorul LIKEDacă 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_tabelWHERE nume LIKE `S%`

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

FROM angajati_tabelWHERE nume LIKE `_ _ _ _`

Ex.14. – listează toţi angajaţii care au al doilea caracter din nume `O`:SELECT *

4/9

Page 5: Curs SQL

FROM angajati_tabelWHERE nume LIKE `_O%`

Condiţia IS NULLPentru 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_tabelWHERE 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 BYCu 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_tabelWHERE 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

Page 6: Curs SQL

Comenzi pentru actualizarea bazelor de dateSQL 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:

INSERTINTO nume_tabel (listă de câmpuri)VALUES (listă de valori)

Ex.17. INSERTINTO 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:DELETEFROM nume_tabelWHERE condiţie

Ex.18. DELETEFROM clienti_tabelWHERE CodClient=1003

- modificarea valorii unui atribut.Comanda utilizată este UPDATE care are formatul general:

UPDATE nume_tabelSET atribut = expresieWHERE condiţie

Modificarea se va produce pentru toate liniile tabelului care îndeplinesc condiţia specificată.

Ex.19. UPDATE facturi_tabelSET ValoareTotala = 3000WHERE NrFactura = 1122

FuncţiiFuncţ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

Page 7: Curs SQL

Ex.20. SELECT AVG(salariu), MAX (salariu), MIN(salariu)FROM angajati_tabel

WHERE functie = `VANZATOR`

Comenzi pentru descrierea datelorComanda 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:

TEXTCHAR(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 MEDIUMTEXTMEDIUMBLOBLONGTEXTLONGBLOBENUM

NUMERICTINYINT(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-DDDATETIME() Format YYYY-MM-DD HH:MM:SSTIME() HH:MM:SSYEAR()

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

Page 8: Curs SQL

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 CLIENTIADD 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-URIPentru 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.columnFROM table1, table2WHERE 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_name2ON 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 aLEFT OUTER JOIN departament d

8/9

Page 9: Curs SQL

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 aRIGHT 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 aFULL OUTER JOIN departament d

ON a.id_dept = d.id_dept;

9/9