P. 1
Curs SQL

Curs SQL

|Views: 1,699|Likes:
Published by Vasi Vali

More info:

Published by: Vasi Vali on Apr 10, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

07/31/2013

pdf

text

original

SQL

1.1. Prezentare generală
Un limbaj particular care provine din dezvoltarea unui model relaţional este Limbajul Interogării Structurate, sau SQL. În ultimii ani SQL a devenit limbajul standard al bazelor de date relaţionale, în 1986 un standard pentru SQL fiind definit de American National Standards Institute (ANSI), care a fost preluat ca standard internaţional de către International Standards Organization (ISO) în 1987. Mai mult de 100 de sisteme de administrare a bazelor de date suportă SQL, rulate atât pe calculatoare personale cât şi pe reţele de calculatoare. În continuare, prezentarea SQL va fi făcută folosind în special terminologia ISO, în acest capitol fiind prezentate noţiunile de bază ale limbajului SQL.

1.1.1. Obiectivele şi terminologia SQL
În mod ideal un limbaj de baze de date ar trebui să permită utilizatorului să creeze baze de date şi structuri relaţionale; ar trebui să permită realizarea unor operaţii de bază asupra datelor ca: inserarea, modificarea şi ştergerea datelor din relaţii; şi ar trebui să permită realizarea atât a interogărilor simple cât şi complexe pentru a transforma datele iniţiale în informaţii. Ca o completare un limbaj de baze de date trebuie să gestioneze aceste evenimente cu un efort minim, şi structura şi sintaxa comenzilor trebuie să fie relativ uşor de învăţat. În final acesta trebuie să fie portabil, adică să fie conform unor standarde recunoscute în domeniu astfel încât să putem folosi aceleaşi structuri şi sintaxe de comenzi când trecem de la un SGBD la altul. SQL intenţionează să satisfacă aceste cerinţe. SQL este un exemplu de limbaj construit pentru folosi relaţiile pentru a transforma intrările în ieşirile cerute. Ca limbaj, SQL are două mari componente: • un limbaj de definire a datelor (LDD) pentru definirea structurii bazelor de date ; • un limbaj de manipulare a datelor (LMD) pentru recuperarea şi actualizarea datelor ; SQL conţine numai aceste comenzi definitorii şi manipulative; nu conţine comezi de control ca: IF…THEN…ELSE, GO TO, DO…WHILE ori alte astfel de comenzi. Acestea trebuiesc implementate folosind un limbaj de programare sau în mod interactiv prin deciziile utilizatorului. SQL poate fi utilizat în două moduri. Primul mod este de a folosi SQL interactiv, introducînd comenzile de la un terminal. Al doilea mod este de a ataşa comenzile SQL unui limbaj de programare procedural. SQL este un limbaj relativ uşor de învăţat: • Este un limbaj non-procedural: utilizatorul mai degrabă specifică ce informaţii îl interesează, decât cum se obţin acestea. Cu alte cuvinte nu cere să se specifice metodele de acces la date. • Ca majoritatea limbajelor moderne, SQL are în mod esenţial un format liber, ceea ce înseamnă că blocurile de declaraţii nu trebuie tipărite în zone particulare ale ecranului. • Structura comenzilor conţine cuvinte din engleza standard: CREATE TABLE, INSERT, SELECT. • SQL poate fi folosit de o mulţime de utilizatori incluzînd administratorii bazelor de date, programatorii de aplicaţii şi multe alte tipuri de utilizatori. Există acum un standard internaţional pentru limbajul SQL (ISO, 1992), care este considerat limbajul standard de definire şi manipulare a bazelor de date relaţionale. Standardul ISO SQL nu foloseşte termeni formali pentru relaţii, atribute şi tupluri, în schimb foloseşte termenii de tabele, coloane şi linii. De asemenea trebuie să punctăm faptul că SQL nu aderă strict la o definiţie a modelului relaţional. De exemplu, SQL permite tabelul produs ca rezultat a operaţiei SELECT ce conţine linii duble, impunînd o ordine a coloanelor, şi de asemenea permite utilizatorului de a ordona liniile unui tabel.

1.1.2. Scrierea comenzilor SQL
În acestă secţiune vom descrie structura unei declaraţii SQL şi notaţiile pe care le folosim în definirea formatelor pentru diferite construcţii SQL. O declaraţie SQL conţine cuvinte rezervate şi cuvinte definite de către utilizator. Cuvintele rezervate sunt o parte fixată a limbajului SQL şi au un înţeles fix. Ele trebuie scrise exact şi nu pot fi despărţite cu cratimă. Cuvintele definite de către utilizator sunt create ţinîndu-se seama de reguli specifice de sintaxă şi reprezintă numele diferitelor obiecte de bază de date cum ar fi relaţii, coloane, indexuri etc. Cuvintele dintr-o declaraţie sunt de asemenea construite ţinîndu-se seama de un set de reguli de sintaxă. Deşi standardul nu cere acest lucru, multe dialecte SQL pretind folosirea unui declaraţii finale pentru a marca sfârşitul fiecărei declaraţii SQL (de obicei se foloseşte “;”). 1

Majoritatea componentelor unei declaraţii SQL sunt insensibile la litere mari sau mici. O excepţie importantă de la această regulă este faptul că datele caractere literale trebuiesc scrise exact cum apar în baza de date. De exemplu dacă scriem numele unei persoane ‘MARIN’ şi apoi căutăm numele folosind ‘Marin’ articolul nu va fi găsit. Deşi SQL este de liber format, o declaraţie SQL sau un set de declaraţii este mult mai interesantă dacă este folosită alinierea. De exemplu: • Fiecare clauză din declaraţie ar trebui scrisă pe linie nouă. • Începutul fiecărei clauze ar trebui scrisă sub începutul altei clauze. • Dacă o clauză are mai multe părţi ele ar trebui să apară pe linii separate şi să fie inclusă la începutul clauzei pentru a arăta relaţia dintre ele. În acest capitol vom folosi următoarea modalitate pentru a defini declaraţiile SQL: • Literele mari sunt folosite în reprezentarea cuvintelor rezervate şi trebuiesc scrise exact. • Literele mici sunt folosite în reprezentarea cuvintelor definite de către utilizator. • “|” indică o alegere între alternative; de exemplu a | b | c. • Parantezele acolade indică un element dorit: de exemplu, {a}. • Parantezele pătrate indică un element opţional: de exemplu, [a]. • Punctele (…) sunt folosite pentru a indica repetiţia opţională a unui element nul sau a unui alt element de mai multe ori. De exemplu: {a|b}[,c…], ceea ce înseamnă a sau b urmat de zero sau mai multe repetiţii al lui c separate prin virgulă. În practică declaraţiile LDD sunt folosite pentru crearea de structuri de baze de date (tabele), iar declaraţiile LMD pentru a popula şi interoga tabelele. În acest capitol vom prezenta declaraţiile LMD înaintea celor LDD pentru a arăta importanţa relativă a declaraţiilor LMD.

1.2. SQL - limbaj de manipulare a datelor (LMD)
Această secţiune se referă la declaraţii SQL LMD disponibile, numite: • SELECT interogarea datelor din baza de date, • INSERT inserarea datelor într-un tabel, • UPDATE actualizarea datelor într-un tabel, • DELETE ştergerea datelor dintr-un tabel. Datorită complexităţii declaraţiilor SELECT şi a simplităţii relative a altor declaraţii LMD o mare parte din această secţiune va fi dedicată declaraţiei SELECT şi diferitelor formate ale acesteia. La început vor fi prezentate interogări simple şi succesiv acestea se vor complica pentru a arăta că pot fi generate interogări care folosesc la sortarea, gruparea, combinarea datelor şi de asemenea interogări pe mai multe tabele. În finalul aceastei secţiuni vor fi prezentate declaraţiile INSERT, UPDATE şi DELETE. Pe parcursul acestei secţiuni vor fi date exemple pentru toate comenzile SQL care vor fi prezentate, iar aceste exemple vor folosi, pentru a ilustra felul în care operează aceste comenzi, următoarele relaţii: cadre_didactice (nr_mat, nume, prenume, funcţia, vechime, salariu) secţii (cod_sec, denumire, iniţiale) grupe (cod_sec, cod_gr, nr_semigrupe, nr_studenţi) oraşe (cod, denumire); municipii(cod_m, denum_m); Pentru aceste relaţii vom considera următoarele înregistrări: Tabelul cadre_didactice: nr_mat nume 1111 Popa 1112 Liana 1113 Barbu 1114 Ştefan 1115 Savu 1116 Ionescu Tabelul secţii: cod_sec 1 2 3 4 denumire Matematică Informatică Matematică-fizică Fizică-chimie iniţiale M I MF FC 2

prenume Ioan Carmen Traian Elena Alexandru Mircea

funcţia lect. conf. conf. conf. conf. lect.

vechime 15 20 25 25 28 18

salariu 400,000 700,000 900,000 900,000 950,000 400,000

totuşi exemplele care urmează ilustrează principalele variante ale acestei declaraţii. conf. Ordinea clauzelor în declaraţia SELECT nu poate fi schimbată. Interogări simple 1.Tabelul grupe: cod_sec 1 1 2 3 3 4 Tabelul oraşe: cod O1 O2 O3 cod_gr 1 2 1 1 2 1 nr_semigrupe 2 2 1 2 1 2 nr_studenţi 25 24 30 28 24 29 denumire Braşov Codlea Timişoara Tabelul municipii: cod_m M1 M2 M3 denum_m Timişoara Iaşi Braşov 1. GROUP BY grupează toate liniile din tabele care au aceeaşi valoare pe coloana specificată. prenume.…]} FROM nume_tabel [alias][.000 900. alias reprezintă o prescurtare a numelui de tabel. conf.…] [WHERE condiţie] [GROUP BY listă_coloane] [HAVING condiţie] [ORDER BY listă_coloane] În această declaraţie expresie_coloană reprezintă o coloană sau o expresie. Există mai multe variante ale acestei comenzi. SELECT este comanda cea mai des folosită în SQL. funcţia. vechime 15 20 25 25 28 18 salariu 400.000 950. ORDER BY ordonează valorile returnate după coloanele specificate. rezultatul interogării unui tabel fiind tot un tabel. conf. proiecţia şi joncţiunea într-o singură declaraţie. SELECT * FROM cadre_didactice. Forma generală a declaraţiei SELECT este : SELECT [DISTINCT|ALL]{* | [expresie_coloană [AS nume_nou]][. conf. HAVING selectează grupurile care respectă condiţia de căutare.2. Operaţia SELECT este închisă. lect. WHERE specifică liniile care trebuiesc recuperate cu ajutorul unor condiţii. SELECT specifică coloanele care vor apărea în rezultatul interogării. Pentru cuvintele rezervate avem următoarea semnificaţie: FROM specifică tabelul sau tabelele care vor fi folosite. Este o comandă extrem de puternică capabilă de a echivala în algebra relaţională selecţia.000 2. nume.000 700. Recuperarea tuturor liniilor unui tabel: SELECT nr_mat. Comanda SELECT Scopul declaraţiei SELECT este de a recupera şi a afişa datele din unul sau mai multe tabele de baze de date. Recuperarea liniilor unui tabel doar pentru anumite coloane ale: 3 . salariu FROM cadre_didactice.000 400. Singurele două clauze obligatorii sunt primele două: SELECT şi FROM celelalte fiind opţionale.000 900. Obţinem în urma acestor două interogări acelaşi rezultat: nr_mat 1111 1112 1113 1114 1115 1116 nume Popa Liana Barbu Ştefan Savu Ionescu prenume Ioan Carmen Traian Elena Alexandru Mircea funcţia lect. vechime.1.

deseori avem nevoie de a restrânge liniile care au fost recuperate. şi NOT. < >.000 180. nume. nr_mat 1111 1112 1113 1114 1115 1116 Clauza WHERE nume Popa Liana Barbu Ştefan Savu Ionescu prenume Ioan Carmen Traian Elena Alexandru Mircea col 4 80. nume.000 900. <=. Compară valorile unei expresii cu valorile altei expresii: SELECT nr_mat. prenume. salariu/5 FROM cadre_didactice.000 900.000 SELECT DISTINCT salariu FROM cadre_didactice.000 80. Utilizarea cuvântului rezervat DISTINCT care elimină liniile duble: SELECT salariu FROM cadre_didactice.000 3. salariu FROM cadre_didactice. prenume.000 700. În SQL avem următoarii operatori de comparaţie: =. Cele 5 condiţii principale de căutare sunt următoarele: 1. salariu 400.000 Exemplele de mai sus arată folosirea declaraţiei SELECT pentru a recupera toate liniile dintr-un tabel.000 950.000 700.000 950.000 900. salariu FROM cadre_didactice WHERE salariu >700. • Operatorii NOT sunt evaluaţi înaintea operatorilor AND şi OR. Totuşi. prenume.SELECT nr_mat.000 400. cu paranteze sau nu. >=.000. != (diferit). >. OR. • Operatorii AND sunt evaluaţi înaintea celor OR.000 400. nume. • Subexpresiile în paranteze sunt evaluate prima dată. 4 .000 190.000 900.000 900. Regulile pentru evaluarea expresiilor condiţionate sunt: • O expresie evaluată de la stânga la dreapta. <. Acest lucru se poate realiza cu clauza WHERE care conţine cuvântul cheie urmat de o condiţie de căutare care specifică liniile ce trebuiesc recuperate. Folosirea parantezelor este întotdeauna recomandată pentru a elimina posibilile ambiguităţi. Comparaţia.000 700.000 180. Multe predicate complexe pot fi generate folosind operatori logici AND. pentru a arăta ordinea de valoare. nr_mat 1111 1112 1113 1114 1115 1116 nume Popa Liana Barbu Ştefan Savu Ionescu prenume Ioan Carmen Traian Elena Alexandru Mircea salariu 400.000 950.000 140. salariu 400.000 4. Folosirea câmpurilor calculate: SELECT nr_mat.

nume. vechime FROM cadre_didactice WHERE vechime IN (20.000 900. Clauza ORDER BY ne permite ordonarea articolelor recuperate în mod crescător (ASC) sau descrescător (DESC) pe orice coloană sau combinaţie de coloane indiferent dacă coloana apare sau nu în rezultat. nume. prenume. Clauza ORDER BY (rezultate de sortare) În general. Identificatorul de coloană poate fi. fie un nume de coloană. unele dialecte 5 . Şir. iar celelalte pot fi orice caracter. • adresa LIKE ‘%e’ înseamnă orice secvenţă de caractere de lungime cel puţin 1 cu ultimul caracter e. Compatibilitatea.000. Celelalte caractere se folosesc normal. ş.000 900. prenume FROM cadre_didactice WHERE nume LIKE ‘P%’.a.d. _ reprezintă orice caracter singular. nr_mat 1112 1113 1114 nume Liana Barbu Ştefan prenume Carmen Traian Elena vechime 20 25 25 4.nr_mat 1113 1114 1115 nume Barbu Ştefan Savu prenume Traian Elena Alexandru salariu 900. Apartenenţa la o mulţime. • adresa LIKE ‘%Popescu%’ înseamnă o secvenţă de caractere de orice lungime care conţine Popescu. nr_mat 1111 (1 linie) nume Popa prenume Ioan 5.Totuşi. liniile tabelului rezultat a unei interogari SQL nu sunt aranjate într-o anumită ordine. Testează dacă valoarea unei expresii este inclusă într-un şir de valori specificate (BETWEEN/NOT BETWEEN): SELECT nr_mat. nume. • adresa LIKE ‘H_ _ _’ înseamnă că trebuie să fie exact patru caractere în şir primul fiind H. salariu FROM cadre_didactice WHERE salariu BETWEEN 500. SELECT nr_mat. fie un număr de coloană care identifică un element din lista SELECT dîndu-ne poziţia acestuia în listă:1 pentru primul element din listă. • adresa NOT LIKE ‘H%’ înseamnă că numele nu poate începe cu H.m.000 AND 900. Numerele de coloană pot fi folosite dacă coloana ce trebuie sortată este o expresie şi nici o clauză AS nu este specificată în vederea ataşări unui nume pentru coloană.000 900. SQL are două caractere speciale: % reprezintă orice secvenţă de zero sau de mai multe caractere. nr_mat nume 1112 Liana 1113 Barbu 1114 Ştefan prenume Carmen Traian Elena salariu 700. 2 pentru al doilea.000 2. putem sorta rezultatele unei interogări folosind clauza ORDER BY din declaraţia SELECT. Testează dacă un şir se potriveşte cu un model specificat (LIKE/NOT LIKE). Nul.000 950. nume care ar putea fi de referinţă ulterior. Testează dacă valoarea unei expresii aparţine unui set de valori (IN/NOT IN): SELECT nr_mat. prenume. 25). De exemplu: • adresa LIKE ‘H%’ înseamnă că primul caracter trebuie să fie H. Testează dacă o coloană are o valoare nulă (necunoscută) (IS NULL/IS NOT NULL).000 3. Totuşi. Clauza ORDER BY conţine o listă de identificatori de coloană pentru ca rezultatul să fie sortat şi separat prin virgulă.

000 400. atunci acesta se numeşte cheie de sortare minoră.000 Standardul ISO specifică faptul că zerourile dintr-o coloană sau expresie sortată cu ORDER BY trebuiesc tratate mai puţin sau mai mult decît toate valorile nenule. COUNT(*) este o folosire specială a lui COUNT. salariu DESC.000 Este posibil de a include mai multe elemente în clauza ORDER BY. prenume. DISTINCT poate fi specificat o singură dată în interogare. de aceea trebuie pus în vedere dacă dublurile trebuiesc incluse sau nu în operaţie. conf. interogarea următoare este incorectă: 6 . dacă cheia de sortare majoră nu este unică. Ca o adăugare. nu mai este nevoie de nici o cheie de control pentru sortare. ar fi de dorit să se ordoneze liniile cu aceeaşi valoare pentru cheia de sortare majoră cu ajutorul unei chei de sortare adiţională. • SUM returnează suma valorilor dintr-o coloană specificată. funcţia. • MAX returnează cea mai mare valoare dintr-o coloană specificată. Standardul ISO permite specificarea cuvântului cheie ALL.000 700. • AVG returnează media valorilor dintr-o coloană specificată.000 700. nume. conf. SELECT nr_mat.000 900. nr_mat 1111 1116 1115 1113 1114 1112 nume Popa Ionescu Savu Barbu Ştefan Liana prenume Ioan Mircea Alexandru Traian Elena Carmen funcţia lect. fiecare funcţie elimină prima dată zerourile şi operează pe cele care au rămas cu valoare nenulă. • MIN returnează cea mai mică valoare dintr-o coloană specificată. Este important faptul că funcţiile complexe pot fi folosite numai în lista SELECT şi în clauza HAVING. Totuşi. lect. COUNT.000 400.000 900. poate avea un efect asupra rezultatelor date de SUM sau AVG. conf.insistă asupra faptului ca elementele ORDER BY să apara în lista SELECT. Este incorectă folosirea lor în altă parte. SELECT nr_mat.000 900. salariu FROM cadre_didactice ORDER BY salariu DESC. Aceste funcţii operează pe o singură coloană a tabelului şi returnează o singură valoare. În afară de COUNT(*). Folosirea funcţiilor complexe SQL Standardul ISO defineşte 5 functii complexe: • COUNT returnează numarul de valori dintr-o coloană specificată. În acest caz.000 900. salariu FROM cadre_didactice ORDER BY funcţia. În ambele cazuri. atunci nici un element din lista SELECT nu poate conţine referinţe la o coloană numai dacă acea coloană este un argument a unei funcţii complexe. Acest lucru rămîne la alegerea implementorului SGBD. Dacă lista SELECT include o funcţie complexă şi dacă nu a fost folosită clauza GROUP BY pentru gruparea datelor. prenume. salariu 400. deşi ALL este presupus dacă nu se specifică nimic. iar SUM şi AVG pot fi folosite numai pe câmpuri numerice. ar putea să existe mai multe linii din tabelul rezultat cu aceeaşi valoare pentru cheia de sortare majoră. Dacă cheia de sortare majoră este unică. DISTINCT nu are nici un efect asupra funcţiilor MIN şi MAX.000 950. clauza ORDER BY trebuie să fie întotdeauna ultima în declaraţia SELECT. conf. dacă nu dorim eliminarea dublurilor. nume. Dacă apare un al doilea element în clauza ORDER BY.000 400. Cheia de sortare majoră determină ordinea generală a tabelului rezultat. MAX se aplică atât pe câmpuri numerice cât şi pe câmpuri nenumerice. Totuşi. De exemplu. trebuie să folosim cuvântul cheie DISTINCT înainte de numele de coloană din funcţie. Scopul ei este de a număra liniile unui tabel indiferent dacă conţin sau nu zerouri sau valori duble. Dacă dorim să eliminăm dublurile înainte de a aplica funcţia. MIN. nr_mat 1115 1113 1114 1112 1111 1116 nume Savu Barbu Ştefan Liana Popa Ionescu prenume Alexandru Traian Elena Carmen Ioan Mircea salariu 950.

deoarece lista SELECT conţine atât un nume de coloană (nr_mat) cât şi o funcţie complexă separată (COUNT). Se condensează toate datele din raport într-o singură linie sumară de date. În plus. Toate numele de coloană din lista SELECT trebuie să apară în clauza GROUP BY.’. • o expresie cuprinzînd combinaţii ale elementelor de mai sus. Utilizarea funcţiilor COUNT şi SUM: SELECT COUNT(nr_mat) AS contor. Când clauza WHERE este folosită cu GROUP BY.000. SUM(salariu) AS total_sal FROM cadre_didactice WHERE funcţia=’conf. Utilizarea funcţiilor MIN.Când se foloseşte GROUP BY. MAX(salariu) AS max. O interogare care cuprinde clauza GROUP BY se numeşte interogare grupată. contor 3 3.000 max 950. Coloanele numite în clauza GROUP BY se numesc coloane de grupare. clauza SELECT poate să conţină numai: • nume de coloană. Pentru aceasta putem folosi clauza GROUP BY din declaraţia SELECT. AVG(salariu) AS media FROM cadre_didactice.SELECT nr_mat. MAX. fiecare element din lista SELECT trebuie să aibă valoare unică pe grup. Utilizarea funcţiei COUNT(*): SELECT COUNT(*) AS contor FROM cadre_didactice WHERE salariu >400. apoi grupurile sunt formate din liniile rămase ceea ce satisface condiţia de căutare. 7 . COUNT(salariu) FROM cadre_didactice. min 400. Utilizarea funcţiei COUNT(DISTINCT): SELECT COUNT(DISTINCT salariu) AS contor FROM cadre_didactice WHERE salariu BETWEEN 500. AVG: SELECT MIN(salariu) AS min. Exemple: 1. Reciproca nu este adevărată: pot să existe nume de coloane în clauza GROUP BY care nu apar în lista SELECT.000 4. Totuşi. contor 4 2. prima dată este apelată clauza WHERE. contor 4 total_sal 4. este deseori folositor de a avea subtotale în raport.000 media 708. în afară de cazul când numele este folosit numai într-o funcţie complexă. deoarece grupează datele din tabelele SELECT şi crează o singură linie pentru fiecare grup.333. • funcţii complexe.3 Clauza GROUP BY (rezultate de grupare) Interogările sumare de mai sus sunt similare cu totalele de la sfârşitul raportului. fără a fi folosită o clauză GROUP BY.000. Standardul ISO cere ca clauzele SELECT şi GROUP BY să fie strâns integrate.000 AND 950.450. • constante.

Deşi sunt similare în sintaxă. rezultatul este sortat în ordinea crescătoare după câmpul “funcţia”. Subinterogări Unele declaraţii SQL pot avea o declaraţie SELECT completă încrustată în interiorul lor. COUNT(nr_mat) AS contor. de asemenea. nr_studenţi FROM grupe WHERE cod_sec = (SELECT cod_sec FROM secţii WHERE denumire = ‘Matematica’). Rezultatele acestei declaraţii SELECT interioare (sau subselect) sunt folosite în declaraţiile exterioare pentru a ajuta la determinarea conţinutului rezultatului final. cod_gr 1 nr_semigrupe 2 nr_studenţi 25 8 . Pentru fiecare grup. funcţia conf. În final. ele sunt combinate în acelaşi grup. HAVING şi WHERE servesc scopuri diferite. deasemenea. orice interogare exprimată folosind clauza HAVING poate fi rescrisă întotdeauna fără clauza HAVING. SQL divide schema în grupuri ţinînd seama de câmpul “funcţia”.450. contor 2 4 total_sal 800. condiţia de căutare din clauza HAVING include întotdeauna cel puţin o funcţie complexă. SQL realizează interogarea în felul următor: 1.000 Conceptual. Un subselect poate fi folosit în clauzele WHERE şi HAVING a unei declaraţii SELECT exterioare.000 3. SUM(salariu) AS total_sal FROM cadre_didactice GROUP BY funcţia HAVING COUNT(nr_mat)>2 ORDER BY funcţia. 3. Clauza WHERE strecoară linii individuale în finalul tabelului rezultat. În cadrul fiecărui grup. SQL calculează numărul membrilor schemei şi adună valorile în coloana “salariu” pentru a obţine totalul salariilor. altfel condiţia de căutare ar putea fi mutată în clauza WHERE şi aplicată pe linii individuale. funcţia lect. SUM(salariu) AS total_sal FROM cadre_didactice GROUP BY funcţia ORDER BY funcţia. În practică. toate cadrele didactice au aceaşi funcţie.Standardul ISO consideră două zerouri ca fiind egale pentru scopurile clauzei GROUP BY. SQL generează o singură linie sumară în rezultatul interogării pentru fiecare grup.450. 2. Standardul ISO cere ca numele coloană folosite în clauza HAVING să apară. Exemplu: SELECT funcţia. Exemplu: SELECT funcţia. Clauza HAVING (restrângerea grupurilor) Clauza HAVING este folosită împreună cu clauza GROUP BY pentru a restrânge grupurile care apar la finalul tabelului rezultat. Subselectele pot apărea. conf. iar HAVING strecoară grupuri în finalul tabelului rezultat. Clauza HAVING nu este parte importantă a SQL. Dacă două linii au zerouri în aceeaşi coloană de grupare şi valori identice în toate coloanele de grupare nenule. contor 4 total_sal 3.000 Exemplu: SELECT cod_gr. COUNT(nr_mat) AS contor. nr_semigrupe. în declaraţiile INSERT. în lista GROUP BY sau să fie conţinute într-o funcţie complexă. unde acesta este numit subinterogare sau interogare intercalată. UPDATE şi DELETE.

000 Toate exemplele considerate pînă acum au o limitare majoră: toate coloanele ce trebuie să apară în tabelele rezultat trebuie să provină dintr-un singur tabel. Standardul ISO permite folosirea calificativului SOME în locul lui ANY. Dacă subinterogarea este vidă.000 900. Dacă tabelul rezultat final trebuie să conţină coloane din diferite tabele. Perechile de linii ce alcătuiesc tabelul asociat sunt toate acolo unde coloanele corespunzătoare din cele două tabele au aceeaşi valoare. 5) O subinterogare nu poate fi folosită ca operant într-o expresie. prenume. condiţia va fi adevărată dacă este satisfăcută de orice (una sau mai multe) valoare dată de subinterogare. putem alege între folosirea unei subinterogări şi a unei joncţiuni. care pot fi accesate şi folosite de către declaraţii exterioare. Utilizarea cuvântului rezervat ALL: SELECT nume. Dacă avem nevoie să obţinem informaţii din mai multe tabele. >=. >. iar condiţia ANY returnează valoarea fals. 3) Deoarece lipsesc. Este posibil să se recurgă la un tabel dintr-o clauză FROM a unei interogări exterioare în modificarea numelui coloană. Asupra subinterogărilor se aplică următoarele reguli: 1) Clauza ORDER BY nu poate fi folosită într-o subinterogare (deşi ea poate fi folosită în majoritatea declaraţiilor SELECT exterioare. numele coloană dintr-o subinterogare se referă la numele tabel din clauza FROM a subinterogării. Utilizarea cuvântului rezervat ANY: SELECT nume. nume Savu Barbu Ştefan prenume Alexandru Traian Elena salariu 950.2 2 24 Subinterogarea poate fi privită ca producătorul unor tabele temporare de rezultate. < >) într-o clauză WHERE sau HAVING. subinterogarea trebuie să apară în partea dreaptă a comparaţiei. nume prenume Savu Alexandru Interogări multi-tabele salariu 950. aliasul este 9 . Dacă subinterogarea este precedată de cuvântul cheie ALL. folosind ca separator virgula şi incuzînd clauza WHERE pentru a specifica coloanele joncţiunii. 4) Când o subinterogare este una din cei doi operanţi implicaţi într-o comparaţie. salariu FROM cadre_didactice WHERE salariu > ANY (SELECT salariu FROM cadre_didactice WHERE funcţia =’conf’). O subinterogare poate fi folosită imediat după un operator relaţional (=. Pentru a combina coloanele din mai multe tabele în obţinerea unui tabel rezultat. atunci trebuie să folosim joncţiunea.000 900.000 2. <=. salariu FROM cadre_didactice WHERE salariu => ALL (SELECT salariu FROM cadre_didactice WHERE funcţia =’conf. excepţie făcînd subinerogările care folosesc cuvântul cheie EXISTS. De asemenea. este posibil să folosim alias pentru un tabel specificat în clauza FROM. Dacă subinterogarea este precedată de cuvântul cheie ANY. În multe cazuri. În acest caz. acest lucru nu este suficient. Pentru a reuşi operaţia de joncţiune. 2) Lista subinterogărilor SELECT trebuie să conţină un singur nume coloană sau o singură expresie.< . trebuie doar să includem mai multe nume de tabele în clauza FROM. condiţia ALL returnează valoarea adevărat. avem nevoie de o operaţie de joncţiune. Exemple: 1. prenume.’). Folosirea cuvintelor rezervate ANY şi ALL Cuvintele ANY şi ALL pot fi folosite cu subinterogări care produc o singură coloană a numerelor. Subinterogarea însăşi este întodeauna închisă între paranteze. Operaţia de joncţiune SQL combină informaţia din două tabele formînd perechi de linii înrudite din cele două tabele. condiţia va fi adevărată numai dacă este satisfăcută de toate valorile date de subinterogare.

nr_studenţi FROM secţii s.iniţiale. clauza FROM înlocuieşte clauzele originale FROM şi WHERE. Dacă există o clauză WHERE.separat de numele tabelului printr-un spaţiu.cod_sec=g. Dacă există o clauza ORDER BY.nr_semigrupe. Se formează produsul cartezian a tabelelor numite în clauza FROM.denumire. vom specifica o condiţie de căutare care compară cheia străină cu cheia fundamentală. se mai poate folosi ca o notaţie pentru numele tabelului. se determină valoarea fiecărui element din lista SELECT în scopul producerii unei singure linii în tabelul rezultat.*.cod_sec FROM secţii JOIN grupe USING cod_sec FROM secţii NATURAL JOIN grupe În fiecare caz. Perechile de linii care generează interogarea rezultat sunt combinaţii de linii tată/fiu. trebuie folosit oriunde numele tabelului ar putea fi specificat. m. Fiecare fiu are un tată asociat şi fiecare părinte are asociaţi mai multi fii. g. SQL produce produsul cartezian al celor două tabele ca fiind interogarea rezultat. Dacă un alias este specificat. se sortează în modul cerut tabelul rezultat. Standardul SQL2 furnizează următoarele moduri alternative pentru a specifica această asociere: FROM secţii s JOIN grupe g ON s. Dacă SELECT DISTiNCT a fost specificat. 5. iar tabelul care conţine cheia fundamentală este un tabel tată. Acesta a fost cazul pentru joncţiunile examinate mai sus. 3. Interogarea precedentă este o astfel de interogare. cod O1 O2 O3 denumire Braşov Codlea Timişoara cod_m M3 NULL M1 denum_m Braşov NULL Timişoara 10 . reţinînd acele linii care satisfac condiţia.cod_sec = g. Un alias poate fi folosit pentru a modifica numele coloană ori de câte ori există ambiguităţi privind sursa numelui coloană. se aplică condiţia de căutare fiecărei linii a tabelului produs. unde coloanele corespunzătoare din fiecare tabel au aceeaşi valoare. Exemple: SELECT s. În termenii algebrei relaţionale. Joncţiuni externe Operaţia de joncţiune combină datele din două tabele formînd perechi de linii specificate. 4. Joncţiunea externă reţine liniile care nu satisfac condiţia de joncţiune. Tabelul care conţine cheia străină este un tabel fiu.cod_sec denumire Matematică Matematică Informatică Matematică-fizică Matematică-fizică Fizică-chimie iniţiale M M I MF MF FC cod_gr 1 2 1 1 2 1 nr_semigrupe 2 2 1 2 1 2 nr_studenţi 25 24 30 28 24 29 Cele mai comune interogări muti-tabel implică două tabele care au o relaţie 1:M (sau tată/fiu). joncţiune externă stângă: SELECT o. Dacă o linie a tabelului este fără pereche. Dacă specificăm o interogare doi-tabel fără clauza WHERE. grupe g WHERE s. Produsul cartezian a doua tabele este un alt tabel alcătuit din toate perechile posibile de linii din cele doua tabele. Pentru a folosi relaţia tată/fiu într-o interogare SQL. Pentru fiecare linie rămasă.denumire = m. s. În exemplul de mai sus se face o astfel de comparaţie. această operaţie produce o restricţie a produsului cartezian. g. Există trei tipuri de joncţiuni externe: 1. g. se elimină orice linie dublă din tabelul rezultat.denum_m. Procedura pentru generarea rezultatelor unui SELECT cu o asociere este: 1.cod_gr. În algebra relaţională.* FROM oraşe o LEFT JOIN municipii m ON o. linia este omisă din tabelul rezultat. Coloanele tabelului produs sunt toate coloanele primului tabel urmat de toate coloanele celui de al doilea tabel. Joncţiunea este o submulţime a unei combinaţii mult mai generale a două tabele cunoscute cum ar fi produsul cartezian a două tabele. pasul 3 şi 4 sunt echivalente cu o proiecţie a restricţiei asupra coloanelor menţionate în lista SELECT. De asemenea. Standardul ISO furnizează un alt set de operatori de joncţiune numiţi joncţiuni externe. 2.

nr_studenţi FROM grupe g WHERE EXISTS (SELECT * FROM secţii s WHERE g. NOT EXISTS este opusul lui EXISTS. atunci operaţia cu mulţimi este realizată prin coloana (coloanele) specificate. INTERSECT şi EXCEPT.*. 11 . Intersecţia a două tabele. ar fi fără sens să combinăm o coloană care conţine vârsta personalului cu numărul camerelor dintr-o proprietate.cod_sec AND iniţiale=’M’ ).* FROM oraşe o FULL JOIN municipii m ON o. operaţia cu mulţimi este realizată prin coloanele care sunt comune ambelor tabele. De exemplu. În timp ce EXISTS şi NOT EXISTS verifică numai existenţa sau inexistenţa liniilor în tabelul rezultat al subinterogării. cod O3 NULL O1 denumire Timişoara NULL Braşov cod_m M1 M2 M3 denum_m Timişoara Iaşi Braşov 3. Diferenţa a două tabele. dar nu sunt în B. Ele produc un rezultat simplu adevărat/fals. A şi B. Cei trei operatori de mulţimi sunt numiţi. în standardul ISO. este un tabel ce conţine toate liniile care sunt atât în tabelul A cât şi în B. Cea mai importantă restricţie este că cele două tabele sunt compatibile (prin asociere).2. coloanele lor corespunzătoare să aibă aceleaşi tipuri şi lungimi de date. Pentru simplificare. putem folosi operaţiile normale cu mulţimi: reuniune. Aceasta implică faptul că cele două tabele trebuie să conţină acelaşi numar de coloane şi că. subinterogarea urmînd una din aceste cuvinte cheie este de obicei de forma: (SELECT*…). EXCEPT) În SQL. INTERSECT. cod O3 NULL O2 O1 EXISTS şi NOT EXISTS Cuvintele cheie EXISTS şi NOT EXISTS se folosesc numai cu subinterogări.*. EXISTS este adevărat dacă şi numai dacă există cel puţin o linie în tabelul rezultat returnată de către interogare şi este falsă dacă subinterogarea returnează un tabel rezultat vid. Formatul clauzei operatorului de mulţimi este. Dacă CORRESPONDING este specificat dar fără clauza BY.denum_m. m. Reuniunea a două tabele. joncţiune externă totală: SELECT o. SMALLINT.cod_sec = s. Este responsabilitatea utilizatorului de a se asigura că valorile datelor în coloanele corespunzătoare provin din acelaşi domeniu. joncţiune externă dreaptă: SELECT o. Exemplu: SELECT cod_gr. UNION.* FROM oraşe o RIGHT JOIN municipii m ON o.…]}]] Dacă CORRESPONDING BY este specificat. A şi B. A şi B este un tabel ce conţine toate liniile comune celor două tabele. Există restricţii asupra tabelelor care pot fi combinate folosind operaţiile cu mulţimi.denumire = m.denumire = m. pentru a combina rezultatele a două sau mai multe interogări într-un singur tabel rezultat. intersecţia şi diferenţa. adică ele au aceaşi structură. nr_semigrupe.denum_m. în fiecare caz: operator [ALL][CORRESPONDING [BY {coloană [. m. chiar dacă ambele coloane ar putea avea acelaşi tip de dată: de exemplu. subinterogarea poate conţine orice număr de coloane. este un tabel ce conţine toate liniile care sunt în A. rezultatul poate include linii duble. cod_gr 1 2 nr_semigrupe 2 2 nr_studenţi 25 24 denumire Timişoara NULL Codlea Braşov cod_m M1 M2 NULL M3 denum_m Timişoara Iaşi NULL Braşov Combinarea tabelelor rezultat (UNION. Dacă ALL este specificat.

în cazul în 12 . Utilizarea operatorului EXEPT: (SELECT denumire AS oraşe FROM oraşe) EXEPT (SELECT denum_m FROM municipii). Prima formă permite inserarea unei singure linii într-un tabel specificat. altele folosesc MINUS în locul lui EXCEPT. Utilizarea operatorului UNION: (SELECT denumire AS oraşe FROM oraşe WHERE denumire IS NOT NULL) UNION (SELECT denum_m AS oraşe FROM municipii WHERE denum_m IS NOT NULL) oraşe Braşov Codlea Timişoara Iaşi 2. atunci orice coloană care este omisă din listă trebuie să fie declarată ca şi coloană NULL cănd tabelul a fost creat. vom descrie cele 3 declaraţii SQL care sunt disponibile pentru a modifica conţinuturile tabelelor în baza de date: • INSERT se agaugă noi linii de date într-un tabel • UPDATE se modifică data existentă într-un tabel • DELETE se mută linii de date dintr-un tabel Adăugarea datei în baza de date (INSERT) Există două forme a declaraţiei INSERT. Actualizările bazelor de date SQL este un limbaj complet de manipulare a datelor care poate fi folosit pentru modificarea datei în baza de date precum şi interogarea bazei de date.Unele dialecte ale SQL nu acceptă INTERSECT şi EXCEPT. dacă este omisă.2.2. oraşe Codlea 1. Exemple: 1. Lista _coloană este opţională. În această secţiune. Formatul declaraţiei INSERT este: INSERT INTO nume_tabel [(listă_coloană)] VALUES (lista_valoare_dată) nume_tabel poate fi un tabel de bază sau un view actualizabil şi lista_coloană reprezintă o listă a unuia sau mai multor nume coloane separate prin virgulă. Dacă este specificată. Comenzile pentru modificarea bazei de date nu sunt aşa complexe ca declaraţie SELECT. SQL presupune o listă a tuturor coloanelor în ordinea lor originală din CREATE TABLE. Utilizarea operatorului INTERSECT: (SELECT denumire AS oraşe FROM oraşe) INTERSECT (SELECT denum_m AS oraşe FROM municipii) oraşe Braşov Timişoara 3.

Lista_valoare_dată trebuie să se potrivească cu lista coloană după cum urmează : • Numărul elementelor din ambele liste trebuie să fie acelaşi • Trebuie să fie o corespondentă directă între poziţia elementelor din ambele liste. Dacă este omisă. astfel încât primul element din lista_valoare_dată corespunde primului element din lista_coloană. A doua formă a declaraţiei INSERT permite copierea mai multor linii din una sau mai multe tabele în altele. Formatul comenzii este: DELETE FROM nume_tabel [WHERE condiţia_căutare] Ca şi în declaraţiile INSERT şi UPDATE. Aceleaşi restricţii aplicate primei forme a declaraţiei INSERT se aplică şi aici.d. numai acele linii care satisfac condiţia sunt şterse.care opţiunea DEFAULT nu a fost folosită când s-a creat coloana. Condiţia_căutare este opţional. 1.a. Exemplu: UPDATE cadre_didactice SET funcţia =’conf.3.’. declaraţia DROP TABLE. nume_coloană 2= valoare_dată 2…] [WHERE condiţie_căutare] Nume_tabel poate fi numele unui tabel de bază sau un view actualizabil. al doilea element din lista_valoare_dată corespunde celui de-al doilea element din lista_coloană. dacă este omisă. Formatul comenzii este: UPDATE nume_tabel SET nume_coloană 1=valoare_dată 1[. Exemplu: INSERT INTO oraşe (SELECT cod_m.limbaj de definire a datelor (LDD) 13 .’. numai acele linii care satisfac condiţia_căutare sunt actualizate. nume_tabel poate fi numele unui tabel de bază şi un view actualizabil. în schimb. SQL . Dacă condiţia_căutare este specificată. Clauza SET specifică numele unei sau mai multor coloane care urmează să fie actualizate.’ WHERE funcţia=’lect. Exemplu: INSERT INTO oraşe VALUES (‘O5’. Noile valoare_dată trebuie să fie compatibile cu tipul de dată pentru coloana corespunzătoare. Modificarea datei în baza de date (UPDATE) Declaraţia UPDATE permite schimbarea conţinutului liniilor existente dintr-un tabel specificat. Liniile inserate în tabelul specificat sunt identice cu cele din tabelul rezultat produs de subselect. dacă se doreşte ştergerea conţinutul tabelului şi definiţia tabelului.m. Dacă clauza WHERE este specificată. Exemplu: DELETE FROM cadre_didactice WHERE funcţia=’lect. Formatul este: INSERT INTO nume_tabel [(lista_coloană)] SELECT… Nume_tabel şi lista_coloană sunt definite ca mai sus în cazul încasării unei singure linii. Acesta nu şterge tabelul. toate liniile sunt şterse din tabel. Ştergerea datei din baza de date (DELETE) Declaraţia DELETE permite ştergerea liniilor dintr-un tabel specificat. • Tipul datei fiecărui element din lista_valoare_dată trebuie să fie compatibil cu tipul datei coloanei corespunzătoare. denum_m FROM municipii). coloana specificată este actualizată pentru toate liniile din tabel. trebuie folosită. ‘Deva’). Clauza SELECT poate fi orice declaraţie valabilă SELECT. Clauza WHERE este opţională. ş.

CHAR. Principalele declaraţii de definirii datei în SQL sunt: CREATE SCHEMA DROP SCHEMA CREATE DOMAIN ALTER DOMAIN DROP DOMAIN CREATE TABLE ALTER TABLE DROP TABLE CREATE VIEW DROP VIEW Deasemenea.3. rapoarte şi indexuri). tabele. INTERVAL. view-uri. Formatul pentru specificarea unui tip de dată caracter este: CHARACTER [VARYING][length] CHARACTER can be abbreviated to CHAR and CHARACTER VARYING to VARCHAR. de asemenea. Datele caracter Datele caracter conţin o secvenţă de caractere dintr-un set de caractere definite de implementator. domenii. • Un identificator nu poate conţine spaţii.2. Dacă stringul este definit cu lungime fixă. De 14 . astfel folosindu-se mai puţine spaţii. DOUBLE PRECISION TIMESTAMP SMALLINT Uneori pentru scopuri de manipulare şi conversie. Identificatorii SQL Identificatorii SQL sunt folosiţi pentru a identifica obiectele în baza de date. cum să creăm şi să distrugem scheme. următoarele două declaraţii au fost prevăzute de multe SGBD: CREATE INDEX DROP INDEX Aceste declaraţii sunt folosite pentru a crea. FLOAT. discutăm sintaxa identificatorilor SQL şi tipurile de date SQL care pot fi folosite în definirea coloanelor tabel. adică este definită de către distribuitorul dialectului particular SQL. cum ar fi numele tabelelor. tipurile de date caracter şi bit sunt atribuite tipurilor de date string.1. DATE. şi dacă introducem un string cu câteva caractere mai puţin decât această lungime. stringul este completat cu spaţii la dreapta pentru a obţine lungimea cerută. Când o coloană caracter string este definită. posibilă specificarea unui set de caractere alternative. numele rapoartelor şi coloanele. care conţine literele mari A…Z. schimba sau distruge structurile care alcătuiesc schema conceptuală. tabele şi indexuri. • Un identificator trebuie să înceapă cu o literă. Un caracter string poate fi definită ca avînd o lungime fixă sau variabilă. REAL. pe scurt. literele mici a…z. Astfel. prezentate în tabelul care urmează: Tipul de dată caracter bit exact numeric aproximativ numeric dată-timp interval Declaraţii VARCHAR BIT VARYING DECIMAL.Limbajul de definire a datei SQL (LDD) ne permite crearea şi distrugerea obiectelor bază de dată (scheme. BIT. caracterele exacte care pot apărea ca valorile datelor într-o coloană tip caracter vor varia. şi exact numeric şi aproximativ numerice sunt atribuite tipurilor de date numeric. Următoarele restricţii sunt impuse pe un identificator: • Un identificator nu poate fi mai lung decât 128 de caractere (multe dialecte au o limită mai mică decât aceasta). numai acele caractere introduse sunt rezervate. examinăm. 1. deoarece ele împart proprietăţisimilare. În această secţiune. INTEGER. NUMERIC. Standardul ISO prevede următorul set de caractere. Tipurile de date ISO SQL Există 6 tipuri de date scalare SQL definite în standardul ISO. cifrele 0…9 şi caracterele subliniate ( _ ). Este. ASCII este una din seturile utilizate în comun astăzi. Caracterele care pot fi folosite într-un identificator SQL definit de utilizator trebuie să apara într-un set de caractere. Dacă stringul este definit cu lungime variabilă şi introducem un string cu câteva caractere mai puţin decât această lungime. o lungime poate fi specificată să indice maximul numărului de caractere conţinute în coloane (lungimiea implicită este 1). 1.3. TIME. Înainte de a considera declaraţiile LDD.

pot fi rezervate mai puţine spaţii de stocare pentru dată. Precizia dă numărul total a cifrelor zecimale semnificative: adică numărul total al cifrelor.999. INTEGER este folosit pentru numere mari pozitive sau negative întregi. Ultimele două câmpuri specifică ora şi minutul pentru anumite zone geografice. De exemplu. Standardul ISO foloseşte pentru acest tip de dată cuvintele rezervate: YEAR. -0. care are un număr variabil de caractere până la maximum de 20. ca de pildă numerele reale. este similar notaţiei stiinţifice în care un număr este scris ca o putere de zece. este evident un întreg mic şi poate fi declarată ca: vechime SMALLINT Coloana salariu a tabelului cadre_didactice poate fi declarată ca: salariu DECIMAL(9. intervale de timp şi intervale ale unei zile. Un caz special survine în cazul datelor exact numerice întregi. NUMERIC şi DECIMAL generează numere în scriere zecimală. iar precizia implicită este definită de limbaj.999. declarăm o coloană bit_string. incluzînd zecimalele dar excluzînd punctul. 10E3. HOUR. MONTH. Există mai multe moduri de a specifica un tip de dată exact numeric: NUMERIC [precision [. scale]] INTEGER SMALLINT INTEGER poate fi prescurtat prin INT şi DECIMAL prin DEC. Numărul conţine cifre. Aproximativ numeric. sau punct float.2E6. Coloana vechime a tabelului cadre_didactice.99. care are o lungime fixă de 4 caractere. un punct zecimal opţional şi un semn opţional. valoarea exact numerică -12. Un tip de dată exact numeric conţine o precizie şi o scală. Datele aproximativ numerice Tipul de dată aproximativ numeric este folosit pentru definirea numerelor care nu au o reprezentare exactă. De exemplu. pentru a ţine lungimea fixă a stringului binar ‘0011’. scale]] DECIMAL [precision [. De exemplu. este declarat ca: nr_mat CHAR(4) Coloana nume a tabelului cadre_didactice. Ca exemple putem da date calendaristice. SECOND. Valoarea implicită a scalei este întotdeauna 0. Există mai multe moduri de a specifica un tip de dată aproximativ numeric: FLOAT [precision] REAL DOUBLE PRECISION Datele dată-timp Acest tip de dată este folosit pentru a defini puncte în timp la un anumit grad de precizie. MINUTE. valoarea absolută maximă care poate fi stocată în acest tip de dată poate fi 32767. SMALLINT este folosit pentru numere mici pozitive sau negative întregi. ca: bit_string BIT(4) Datele exact numerice Tipul de dată exact numeric este folosit pentru definirea numerelor cu reprezentare exactă. este declarată ca: nume VARCHAR(20) Datele bit Tipul de date bit este folosit pentru definirea stringurile bit.exemplu. +5. TIMEZONE_HOUR şi TIMEZONE_MINUTE. adică o secvenţă de cifre binare.2E-4. Formatul pentru specificarea tipului de dată bit este similar cu cel al tipului de dată caracter: BIT [VARYING][lenght] De exemplu. fiecare avînd sau valoarea 0 sau 1. Specificînd acest tip de dată.2) care poate manipula o valoare până la 9. numărul matricol din coloana nr_mat a tabelului cadre_didactice. care reprezintă numărul anilor .345 are precizia 5 şi scala 3. Trei tipuri ale acestui tip de date sunt acceptate: DATE TIME [time_precision][WITH TIME ZONE] 15 . DAY. Scala dă numărul total al zecimalelor.

fiecare mediu este alcătuit dintr-unul sau mai multe cataloage şi fiecare catalog este alcătuit dintr-un set de scheme. O schemă este o colecţie specificată a obiectelor bazei de date care sunt legate una de alta într-un anumit mod (toate obiectele din baza de date sunt descrise într-o schemă sau alta). Clasa an-lună poate conţine numai câmpurile YEAR şi/sau MONTH. comparaţii. 16 . declaraţia SQL este: CREATE SCHEMA sql-schemă AUTHORIZATION Ionescu. HOUR. Formatul pentru specificarea tipului da dată interval este: INTERVAL {{start_câmp TO sfârşit_câmp} | câmp_dată-timp} start_câmp=YEAR|MONTH|DAY|HOUR|MINUTE [(precizia câmpului principal al intervalului)] sfârşit_câmp=YEAR| MONTH|DAY|HOUR|MINUTE|SECOND [(precizia zecimalelor câmpului secundar al intervalului)] câmp_dată-timp=start_câmp|SECOND [(precizia câmpului principal al intervalului [. care are forma următoare: DROP SCHEMA nume [RESTRICT | CASCADE] Dacă RESTRICT este specificat. operaţia aranjează în cascadă toată obiectele asociate schemei în ordinea definită înainte. relaţiile şi alte obiecte ale bazei de date există într-un mediu.3. Fiecare tip de dată interval este alcătuit dintr-un subset învecinat al câmpurilor: YEAR. Exemplu: INTERVAL YEAR(2) TO MONTH reprezintă un interval de timp cu o valoare între 0 ani 0 luni şi 99 ani 11 luni. view-uri. Obiectele dintr-o schemă pot fi tabele.3. Date interval Tipul de dată interval este folosit pentru a reprezenta intervale de timp. Dacă CASCADE este specificat. Cuvântul cheie WITH TIME ZONE controlează prezenţa câmpurilor TIMEZONE_HOUR şi TIMEZONE_MINUTE. Toate obiectele dintr-o schemă au acelaşi proprietar şi împart un număr de valori implicite. Crearea unei baze de date Procesul de creare a bazei de date diferă semnificativ de la produs la produs. Time_precision reprezintă unitatea de măsură a câmpului SECOND. Declaraţia de definire a schemei are forma (simplificată) următoare: CREATE SCHEMA [nume | AUTHORIZATION creator-identificator] De aceea. domenii. MINUTE şi SECOND. MINUTE. care este şi valoarea implicită dacă nici unul din calificative nu este specificat. Conform standardului ISO. TIME este folosit pentru a reprezenta timpul folosind cuvintele rezervate HOUR. TIMESTAMP reprezintă datele calendaristice şi timpul.9999 secunde. HOUR. O schemă poate fi distrusă folosind declaraţia DROP SCHEMA. iar în TIMESTAMP valoarea implicită este 6 fiind vorba de microsecunde. SECOND. 1. MINUTE. dacă creatorul unei scheme “sql-schemă” este Ionescu. MONTH. SECOND. Dacă nu este specificat acesta este implicit 0 în TIME fiind vorba de secunde. iar clasa zi-timp poate conţine o selecţie invecinată din DAY. DAY. Există două clase de date interval: intervale an-lună şi intervale zi-timp.TIMESTAMP [time_precision][ WITH TIME ZONE] DATE este folosit pentru a reprezenta datele calendaristice folosind cuvintele rezervate YEAR. Standardul ISO defineşte prin implementare mecanismul pentru crearea şi distrugerea cataloagelor şi furnizează mecanisme pentru crearea şi distrugerea schemelor. Printre altele. translaţii şi seturi de caractere. MONTH şi DAY.precizia câmpului secundar al intervalului])] zecimalelor În toate cazurile precizia implicită a câmpului start_câmp este 2. INTERVAL HOUR TO SECOND(4) reprezintă un interval de timp cu o valoare între 0 ore 0 minute 0 secunde şi 99 ore 59 minute 59. schema trebuie să fie vidă sau operaţia eşuează.

O folosire uzuală a comenzii DROP TABLE este de a corecta greşelile făcute la crearea unui tabel. Crearea unui tabel se face folosind comanda CREATE TABLE. De exemplu. Dacă se doreşte ştergerea liniilor din tabel dar să se reţină structura tabelului trebuie folosită declaraţia DELETE. ci şi toate liniile din interiorul acesteia. Definirea declaraţiei ALTER TABLE în standardul ISO este alcătuită din 6 opţiuni pentru: • a adăuga o nouă coloană la un tabel. pierdute sau nu sunt aplicabile. prenume CHAR(15) NOT NULL. • a şterge o restricţie a tabelului. Specificatorul NULL este folosit pentru a indica dacă unei coloane îi este permis sau nu să conţină null-uri. Valoarea implicită ISO este NULL. Observăm că această comandă şterge nu numai tabelul specificat. • a şterge o coloană dintr-un tabel . care are formatul: DROP TABLE nume_tabel [RESTRICT | CASCADE] De exemplu pentru a distruge tabelul cadre_didactice folosim comanda: DROP TABLE cadre_didactice. Crearea unui tabel (CREATE TABLE) Avînd creată structura bazei de dată. sistemul acceptă null-uri. Un null este diferit de spaţiu sau 0 şi este folosit pentru a reprezenta date dacă acestea nu sunt disponibile. În unele implementări. Putem şterge un tabel suplimentar din baza de date folosind declaraţia DROP TABLE.…]) Această comandă crează un tabel numit nume_tabel alcătuit din una sau mai multe coloane al câmpului tip_dată specificat. putem acum crea structurile tabelelor de bază a relaţiilor pentru a fi localizate în baza de date. pentru crearea tabelului cadre_didactice avem: CREATE TABEL cadre_didactice( nr_mat CHAR(4) NOT NULL. tabele noi fiind create iar altele vechi nu vor mai fi necesare. • a adăuga o nouă restricţie pentru tabel. care are următoarea sintaxă principală: CREATE TABLE nume_tabel (nume_coloană tip_dată [NULL | NOT NULL][. Când NOT NULL este specificat. Dacă NULL este specificat. Dacă este creat un tabel cu o structură incorectă se poate folosi DROP TABLE pentru a şterge tabelul nou creat şi începe din nou. Dacă CASCADE este specificat SQL automat şterge toate obiectele dependente de tabel (şi obiectele dependente de aceste obiecte). Modificarea structurii unui tabel (ALTER TABLE) Standardul ISO furnizează declaraţia ALTER TABLE pentru modificarea structurii unui tabel odată ce a fost creat. Dacă RESTRICT este specificat în comanda DROP TABLE şi există orice alte obiecte a căror existenţă depinde de existenţa tabelului. asupra căruia acţionează comanda. Formatul principal al declaraţiei este: 17 .În prezent declaraţiile CREATE şi DROP SCHEMA nu sunt încă larg implementate. • a şterge o valoare implicită a coloanei. Distrugerea unui tabel (DROP TABLE) Cu timpul structura unei baze de date se va schimba. în locul declaraţiei CREATE SCHEMA este folosită declaraţia următoare: CREATE DATABASE nume_bază-date. • a stabilii o valoare implicită pentru o coloană. funcţia CHAR(10) vechime SMALLINT ). nume CHAR(15) NOT NULL. SQL nu permite comenzii DROP TABLE să continue. sistemul respinge orice încercare de inserare a unui null în coloane.

valoarea implicită fiind ASC. în baza de date. dar este produsă pe baza cerinţei unui utilizator particular. Crearea indexurilor nu este standardizată în SQL. Clauza ADD COLUMN este similară cu definirea unei coloane din declaraţia CREATE TABLE. 18 .…]) Coloanele specificate alcătuiesc cheia index şi ar trebui listate în ordine descrescătoare. SQL avansat. pentru a satisface criteriul de căutare particular după ce tabelul a fost folosit un timp şi a crescut în mărime. 1. declaraţia DROP INDEX şterge indexul din baza de date. FOREIGN KEY sau CHECK. Pentru fiecare coloană putem specifica dacă ordinea este ascendentă (ASC) sau descendentă (DESC). deoarece valorile provenite din coloana (coloanele) indexată poate să conţină deja dubluri. de fapt. Dacă clauza UNIQUE este folosită. Definiţie_restricţie_tabel este una din clauzele: PRIMARY KEY. Totuşi multe dialecte acceptă cel puţin următoarea formă a acestei comenzi: CREATE [UNIQUE] INDEX nume_index ON nume_tabel (colonă [ASC |DESC] [. de obicei. Indexurile sunt create. Avem acelaş concept ca şi la calificativul RESTRICT | CASCADE a declaraţiei DROP TABLE. cel puţin pentru coloane cheie principale. Un view este o relaţie virtuală care nu există. Ştergerea unui index (DROP INDEX) Dacă creăm un index pentru un tabel de bază şi mai târziu decidem că nu mai este necesar. Crearea unui index (CREATE INDEX) Un index este o structură care furnizează accesul rapid la liniile unui tabel bazat pe valorile uneia sau mai multor coloane. CREATE UNIQUE INDEX nume_ind ON cadre_didactice(nume).ALTER TABLE nume_tabel [ADD [COLUMN] nume_coloană tip_dată [NOT NULL][UNIQUE] [DEFAULT opţiune_implicită][CHECK(condiţie_căutare)]] [DROP [COLUMN] nume_coloană [RESTRICT | CASCADE]] [ADD [CONSTRAINT [nume_restricţie]] definiţie_restricţie_tabel] [DROP CONSTRAINT nume_restricţie [RESTRICT | CASCADE]] [ALTER [COLUMN] SET DEFAULT opţiune_implicită] [ALTER [COLUMN] DROP DEFAULT] unde parametrii sunt definiţi ca şi în declaraţia CREATE TABLE. Clauza DROP COLUMN specifică numele coloanei ce trebuie ştearsă din definiţia tabelului. DROP INDEX are formatul: DROP INDEX nume_index Declaraţia următoare va şterge indexul creat în exemplul anterior: DROP INDEX matricol_ind. De exemplu pentru a adăuga coloana “vechime” la tabelul cadre_didactice folosim comanda: ALTER TABLE cadre_didactice ADD vechime INTEGER(2). declaraţia nu poate fi folosită pentru a muta o coloană existentă dintr-un tabel. În unele dialecte. De aceea este mai bine să creăm indexuri unice. unicitatea coloanei sau combinaţiei de coloane indexate va fi decretată de către sistem. putem avea probleme dacă încercăm să creăm un index unic pe un tabel care conţine articole.4. Indexurile pot fi create numai în tabele de bază nu şi în view-uri. Pentru tabelul cadre_didactice putem crea următoarele indexuri: CREATE UNIQUE INDEX matricol_ind ON cadre_didactice(nr_mat). UNIQUE. Prezenţa unui index poate îmbunătăţi simţitor performanţa unei interogări. atunci când tabelul de bază este creat şi sistemul nu va asigura automat unicitatea cheii principale. Declaraţia ALTER TABLE nu este disponibilă în toate dialectele SQL. Această clauză are un calificativ opţional care ne permite să specificăm dacă acţiunea DROP este în cascadă sau nu. View-uri Un view este rezultatul dinamic a uneia sau mai multor operaţii relaţionale care operează pe relaţii de bază pentru a produce altă relaţie. Deşi indexurile pot fi create oricând.

cod_sec. conf.cod_gr FROM secţii s. Lista numelor de coloană trebuie să fie specificată în cazul în care există orice ambiguitate în numele unei coloane. nr_mat 1113 1114 1115 nume Barbu Ştefan Savu prenume Traian Elena Alexandru funcţia conf. nume. Dacă lista numelor de coloană este omisă.1. Dacă o listă a numelor de coloană este specificată.cod_sec = g.denumire. fiecare coloană din view ia numele coloanei corespunzătoare din subselect. View vertical care pemite restricţionarea accesului utilizatorilor la anumite coloane ale unui tabel ale unui tabel: CREATE VIEW cadre_lect AS SELECT nr_mat. conf. un nume pentru fiecare coloană din view. prenume FROM cadre_didactice WHERE funcţia = ‘lect.denumire. View grupat şi view joncţionat: CREATE VIEW secţii_grupe (secţia. atunci trebuie să aibă acelaşi număr de elemente ca şi numărul coloanelor produse de către subselect. aceasta nu este adăugată la tabelul view-ului. secţia Matematică Matematică Informatică Matematică-fizică Matematică-fizică Fizică-chimie grupa 1 2 1 1 2 1 19 . Wiew orizontal. Deşi toate view-urile sunt create în acelaşi mod.000 2. vechime 25 25 28 salariu 900. Subselectul este cunoscut ca interogare definită. SQL asigură faptul că dacă o linie nu ajută la satisfacerea clauzei WHERE a interogării definite a view-ului.…])] AS subselect [WITH [CASCADED | LOCAL] CHECK OPTION] Se poate repartiza. Aceasta se poate întâmpla dacă subselectul include coloane calculate şi subclauza AS nu a fost folosită pentru a numi astfel de coloane sau produce două coloane cu nume identice ca rezultat a unei joncţiuni. grupa) AS SELECT s. GROUP BY s. care pemite restricţionarea accesului utilizatorilor la anumite linii ale unui tabel: CREATE VIEW vechime_cadre AS SELECT * FROM cadre_didactice WHERE vechime >= 25. nr_mat 1111 1116 nume Popa Ionescu prenume Ioan Mircea 3.000 900.’. opţional. Crearea unui view (CREATE VIEW) Formatul declaraţiei CREATE VIEW este: CREATE VIEW nume_view [(nume_coloană [. g.1. Dacă WITH CHECK OPTION este specificat.4.000 950. în practică diferite tipuri de view-uri sunt folosite pentru diferite scopuri: 1. grupe g WHERE s.

4. un view poate fi definit astfel încât utilizatorul poate continua să vadă vechiul tabel. atunci coloana poate apărea numai în clauzele SELECT şi ORDER BY ale interogării care accesează view-ul. Avantaje şi dezavantaje ale view-urilor Avantaje. comanda este respinsă. Dacă tabelul sursă însăşi este un view. 3. Restricţii asupra view-urilor Standardul ISO impune câteva restricţii importante în crearea şi folosirea view-urilor.4. cu alte cuvinte.4. • Dacă o coloană din view se bazează pe o funcţie complexă. Cu alte cuvinte. Securitatea 20 . De aceea. aceasta exclude orice view-uri bazate pe o joncţiune. • Nu există clauzele GROUP BY şi HAVING în interogarea definitorie. şterge toate obiectele de referinţă ale view-ului. În plus. • Clauza FROM specifică numai un tabel. coloane adăugate sau şterse. Independenţa datei Un view poate prezenta o imagine consistentă. o astfel de coloană nu poate fi folosită într-o clauză WHERE şi nu poate fi folosită ca argument pentru o funcţie complexă în orice interogare bazată pe view. • Fiecare element din lista SELECT a interogării definitorii este un nume de coloană (mai degrabă decât o constantă. adică view-ul trebuie să aibă un singur tabel sursă asupra căruia utilizatorul are privilegiile cerute. atunci acest view trebuie să satisfacă aceste condiţii. DROP VIEW şterge toate obiectele dependente.5. Actualizabilitatea view-urilor Toate actualizările unui tabel sunt imediat reflectate în toate view-urile care cuprind acel tabel. nemodificabilă a structurii bazei de date. Valoarea imlicită este RESTRICT. De exemplu. Dacă CASCADE este specificat. 2. fiecare linie adăugată prin view nu trebuie să încalce restricţiile de integritate ale tabelului. 1. vechiul tabel poate fi recreat prin definirea unui view joncţionînd noile tabele. tabele dezbinate. SGBD-ul trebuie să poată să copieze orice linie sau coloană înapoi în linia sau coloana sa din tabelul sursă. intersecţie (INTERSECT) şi diferenţă (EXCEPT). Universalitatea Schimbările oricăror tabele în interogarea definită sunt imediat reflectate în view. reuniune (UNION). o expresie sau o funcţie complexă) şi nici o coloană nu apare mai mult decât o dată. Dacă un tabel existent este rearanjat sau dezbinat. 1. În cazul dezbinării unui tabel. relaţii schimbate.4. • Un view grupat nu poate fi joncţionat cu un tabel sau un view. adică liniile duble nu trebuie eliminate din rezultatele interogării. În particular. restructurate sau redenumite). Analog.1.4. atunci definirea view-ului nu necesită schimbări. Ştergerea unui view (DROP VIEW) Un view este şters din baza de date cu declaraţia: DROP VIEW nume_view [RESTRICT | CASCADE]. chiar dacă tabelele sursă principale sunt schimbate (de exemplu. putem să ne aşteptăm la faptul că dacă un view este actualizat atunci tabelul (tabelele) va reflecta acea schimbare.2. Dacă coloanele sunt adăugate sau şterse dintr-un tabel şi aceste coloane nu sunt cerute de către view. 1. • Clauza WHERE nu include nici un SELECT intercalat care se referă la tabelul din clauza FROM.3. Dacă RESTRICT este specificat şi există orice alte obiecte a căror existenţă depinde de existenţa view-ului ce urmează a fi şters. Standardul ISO specifică view-urile care trebuie să fie actualizabile într-un sistem corespunzător standardului. putem şterge view-ul vechime_cadre folosind declaraţia: DROP VIEW vechime_cadre. deşi există variaţii considerabile între dialecte. Definiţia dată în standardul ISO este că un view este actualizabil dacă şi numai dacă: • DISTINCT nu este specificat. 1.

există de asemenea. În unele cazuri acest lucru va fi neglijabil. în diferite moduri. atunci aceste coloane nu vor apărea în view. Selectabilitatea View-urile furnizează posibilitatea ca aceleaşi tabele principale să poată fi văzute de diferiţi utilizatori. Performanţa Există un neajuns care apare când folosim un view. astfel. De exemplu. Rezoluţia view-ului cere resurse în plus calculatorului. care conţine date potrivite acelui utilizator. astfel restrângînd şi controlînd accesul la baza de date a fiecărui utilizator. 5. SQL asigură faptul că nici o linie care nu satisface clauza WHERE a interogării definite nu este niciodată adăugată la orice tabel principal prin view. Dacă interogarea definită a fost de forma SELECT * FROM …. 21 . Dezavantaje. 3. Integritatea datei Dacă WITH CHECK OPTION a declaraţiei CREATE VIEW este folosit.Fiecare utilizator poate avea privilegiul de a accesa baze de date numai printr-un mic set de view-uri. în alte cazuri poate fi mai problematic. un view definit printr-o interogare complexă multi-tabel poate lua un timp îndelungat pentru a fi prelucrat pe când rezoluţia view-ului trebuie să joncţioneze tabelele de fiecare dată când view-ul este accesat. câteva dezavantaje ale view-urilor SQL: 1. Dacă coloanele sunt ulterior adăugate la tabelul de bază. în afară de cazul când view-ul este şters şi recreat. atunci * se referă la coloanele tabelului de bază existent când a fost creat view-ul. Restricţia actualizării În unele cazuri un view nu poate fi actualizat. transformînd interogări multi-tabel în interogări 1-tabel. Complexitatea redusă Un view poate simplifica interogările prezentarea datelor din mai multe tabele într-un singur tabel şi. 2. 4. Deşi view-urile furnizează multe beneficii semnificative. prin aceasta asigurînd integritatea view-ului. Restricţia structurii Structura unui view este determinată la timpil creării lui. 6.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->