Professional Documents
Culture Documents
Obiective
Aparitia limbajului SQL pentru baze de date. Tipuri de instructiuni SQL. Interogarea bazelor de date - SELECT SQL. Clauzele principale ale instructiunii SELECT. Moduri de a extrage date din mai multe tabele relationate din baza de date. Functii in SQL. Grupuri de date si functii de grup.
Obiective
Subinterogari simple.
Subinterogari multicoloana.
Interogari ce folosesc operatorii de multimi. Categorii de instructiuni DML:
inserari actualizari stergeri
Controlul tranzactiilor.
SQL - Structured Query Language
Istoric SQL
Utilizat initial de firma IBM, SQL a devenit la mijlocul deceniului trecut un standard n domeniu. Primul standard SQL a fost creat n 1989 de catre ANSI (Institutul National American pentru standarde) fiind cunoscut sub numele de ANSI-SQL 89. Proliferarea n timp a diferitelor implementari ale limbajului SQL a determinat formarea consortiului SAG (The SQL Access Group), cu scopul de a concepe un set de standarde SQL, care sa aiba la baza un subset al standardului ANSI-SQL89 si sa rezolve probleme de implementarea acestora n arhitecturi client/server cum ar fi conectivitatea si interfetele de programare. Fiecare SGBD implementeaza limbajul standard SQL (sau un subset mai redus de instructiuni) la care adauga sau modifica instructiunile proprii. SQL - Structured Query Language
Modelul Relational
Relatie Domeniu Atribut Tuplu Cheie primara Cheie externa
SQL
Tabel --Coloana Linie Cheie primara Referinta
Relationarea tabelelor Fiecare linie dintr-un tabel este identificata unic de cheia primara (PK). Se pot relationa logic date din tabele diferite prin cheile straine (FK).
Tabelul: ANGAJAT
MARCA 7839 10 7698 7782 NUME KING BLAKE CLARK JONES FUNCTIE PRESIDENT MANAGER MANAGER MANAGER NRDEPT
Tabelul: DEPARTAMENT
NRDEPT DENUMIERE LOCALITATE 10 ACCOUNTING 20 RESEARCH 30 SALES
30
10 7566
40
20
OPERATIONS
BOSTON
Cheie primara
Cheie externa
Cheie primara
Instructiunea SQL
SQL> SELECT localitate 2 FROM departament;
Database
Afisarea rezultatelor
LOCALITATE
COMMIT ROLLBACK Transaction control SAVEPOINT GRANT REVOKE Data control language (DCL)
1400 300 0
7521 WARD DENUMIRE 7902 FORD -------------7369 SMITH ACCOUNTING 7788 SCOTT RESEARCH 7876 SALESADAMS 7934 MILLER OPERATIONS
SALESMAN LOCALITATE ANALYST ---------CLERK NEW YORK ANALYST DALLAS CLERK CHICAGO CLERK BOSTON
1250 500 30 GRADESAL 3000 20 800 20 GRAD SALMIN SALMAX 3000 --------- --------20 --------1100 1 20 700 1200 1300 2 10 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999
Interogarea bazelor de date Interogarea bazelor de date relationale se face cu instructiunea SQL SELECT Instructiunea SELECT este complexa, formata din numeroase clauze si optiuni SELECT SQL implementeaza o serie de operatori relationali (selectie, proiectie, join) Instructiunea SELECT poate extrage date din una sau mai multe tabele ale bazei de date
Tabela 1
Join
Tabela 1
Tabela 1
Tabela 2
SELECT identifica ce coloane sunt afisate FROM identifica din care tabele sunt datele Instructiunile SQL nu sunt case sensitive Pot fi scrise pe mai multe linii Cuvintele cheie nu pot fi abreviate Clauzele se pun pe linii separate pentru lizibilitate
SQL - Structured Query Language
Valori NULL O valoare NULL este valoarea inexistenta, necunoscuta. Valoare NULL difera de sirul vid sau de 0.
SQL> SELECT 2 FROM nume, functie, com angajat;
NUME FUNCTIE COM ---------- --------- --------KING PRESIDENT BLAKE MANAGER ... TURNER SALESMAN 0 ... 14 rows selected.
Aliasuri de coloana Redenumeste numele unei coloane la afisare Este folositor la afisarea coloanelor calculate Se adauga dupa coloana Trebuie introdus intre ghilimele duble daca are spatii sau este case sensitive
SQL> SELECT nume as Nume, 2 sal*12 "Salar Anual" 3 FROM emp;
NUME Salar Anual ------------- ------------...
Eliminarea duplicatelor Liniile duplicate se elimina prin folosirea optiunii DISTINCT in clauza SELECT
SQL> SELECT DISTINCT nrdept 2 FROM angajat;
NRDEPT --------10 20 30
Limitarea liniilor rezultate Limitarea liniilor rezultate dintr-o instructiune SELECT se face prin clauza WHERE. Clauza WHERE urmeaza clauzei FROM. Clauza WHERE contine conditii logice simple sau complexe (legate cu operatorii logici AND si OR).
SELECT FROM [WHERE [DISTINCT] {*, coloana [alias], ...} tabe; conditii];
Operatori de comparatie
Operator = > >= < <= <> Semnificatie
Egal
Mai mare
Mai mare sau egal Mai mic
IN(list)
LIKE
IS NULL
Exemplu ORDER BY
Afiseaza ordonat rezultatele interogarii: Este ultima clauza din instructiunea SELECT
SQL> SELECT nume, nrdept, sal 2 FROM angajat 3 ORDER BY nrdept, sal DESC; NUME NRDEPT SAL ---------- --------- --------KING 10 5000 CLARK 10 2450 MILLER 10 1300 FORD 20 3000 ... 14 rows selected.
DEPART
NRDEPT -----10 20 30 40 DENUMIRE ---------ACCOUNTING RESEARCH SALES OPERATIONS LOCALIT -------NEW YORK DALLAS CHICAGO BOSTON
MILLER ...
MARCA NRDEPT LOCALITATE ----- ------- -------7839 10 NEW YORK 7698 30 CHICAGO 7782 10 NEW YORK 7566 20 DALLAS 7654 30 CHICAGO 7499 30 CHICAGO ... 14 rows selected.
Ce este un JOIN ? Interogare care extrage date din mai multe tabele:
SELECT FROM WHERE tabel1.coloana, tabel2.coloana tabel1, tabel2 tabel1.coloana1 = tabel2.coloana2;
Conditiile de legatura se scriu in clauza WHERE. Daca o coloana are acelasi nume in tabele diferite, se prefixeaza numele coloanei cu numele tabelei de unde provine.
SQL - Structured Query Language
Pentru evitarea unui produs cartezian se introduce o conditie de legatura valida in clauza WHERE a instructiunii SELECT.
Tipuri de Join
Equijoin
ANGAJAT
MARCA NUME NRDEPT ------ ------- ------7839 KING 10 7698 BLAKE 30 7782 CLARK 10 7566 JONES 20 7654 MARTIN 30 7499 ALLEN 30 7844 TURNER 30 7900 JAMES 30 7521 WARD 30 7902 FORD 20 7369 SMITH 20 ... 14 rows selected.
DEPART
NRDEPT ------10 30 10 20 30 30 30 30 30 20 20 ... 14 rows DENUMIRE ---------ACCOUNTING SALES ACCOUNTING RESEARCH SALES SALES SALES SALES SALES RESEARCH RESEARCH selected. LOCALIT -------NEW YORK CHICAGO NEW YORK DALLAS CHICAGO CHICAGO CHICAGO CHICAGO CHICAGO DALLAS DALLAS
Primary key
Foreign key
Non-equijoin
ANGAJAT
MARCA NUME SAL ------ ------- -----7839 KING 5000 7698 BLAKE 2850 7782 CLARK 2450 7566 JONES 2975 7654 MARTIN 1250 7499 ALLEN 1600 7844 TURNER 1500 7900 JAMES 950 ... 14 rows selected.
GRADSALAR
GRAD SALMIN SAL ----- ----- -----1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999
salarul in tabela ANGAJAT este intre salarul minim si salarul maxim in tabela GRADSALAR
Exemplu Non-equijoin
SQL> 2 3 4
NUME SAL GRAD ---------- --------- --------JAMES 950 1 SMITH 800 1 ADAMS 1100 1 ... 14 rows selected.
Outer-join
ANGAJAT
NUME ----KING BLAKE CLARK JONES ... NRDEPT -----10 30 10 20
DEPART
NRDEPT -----10 30 10 20 ... 40 DENUMIRE ---------ACCOUNTING SALES ACCOUNTING RESEARCH OPERATIONS
Outer-join
Se foloseste pentru a afisa linii care nu indeplinesc conditii de join normale (equijoin). In SQL standard cuvintele cheie sunt: LEFT OUTER JOIN, RIGHT OUTER JOIN Operatorul outer-join specific Oracle este (+).
SELECT table.column, table.column FROM table1, table2 WHERE table1.column(+) = table2.column; SELECT table.column, table.column FROM table1, table2 WHERE table1.column = table2.column(+);
Exemplu Outer-join
SQL> 2 3 4 SELECT FROM WHERE ORDER BY a.nume, d.nrdept, d.denumire angajat a, depart d a.nrdept(+) = d.nrdept a.nrdept;
NUME NRDEPT DENUMIRE ---------- --------- ------------KING 10 ACCOUNTING CLARK 10 ACCOUNTING ... 40 OPERATIONS 15 rows selected.
Self-join
ANGAJAT (LUCRATOR)
MARCA ----7839 7698 7782 7566 7654 7499 NUME -----KING BLAKE CLARK JONES MARTIN ALLEN SEF ---7839 7839 7839 7698 7698
ANGAJAT (MANAGER)
MARCA NUME ----- -------7839 7839 7839 7698 7698 KING KING KING BLAKE BLAKE
SEF din tabela LUCRATOR este egal cu MARCA din tabela MANAGER " SQL - Structured Query Language
Functiile SQL accepta argumente si returneaza valori. Functiile SQL sunt specifice fiecarui SGBD. Sunt prezentate functiile implementate de serverul Oracle.
Intrare arg 1
Iesire
arg 2
Valoarea rezultata
arg n
Functii
Generale
Numerice
Conversie
Date calendaristice
Folosirea datelor calendaristice Serverul Oracle stocheaza valorile date calendaristice in formatul: secol, an, luna, zi, ora, minute, secunde. Formatul predefinit este DD-MON-YY. Functia care intoarce data sistemului este SYSDATE. Daca se aduna un numar la o data rezulta o data calendaristica. Diferenta intre doua date reprezinta numarul de zile dintre cele doua date calendaristice.
SQL - Structured Query Language
Functii de conversie
Conversii explicite
TO_NUMBER TO_DATE
NUMBER
CHARACTER
DATE
TO_CHAR
TO_CHAR
Primul argument este data calendaristica care trebuie convertita. Al doilea argument este sirul de formatare. Sirul de formatare:
trebuie inclus intre apostroafe simple si este case sensitive poate include orice format valid de data calendaristica poate include subsirul fm pentru eliminarea spatiilor
SQL> SELECT nume, 2 TO_CHAR(data_ang, 'fmDD Month YYYY') DATA_ANG 3 FROM angajat; NUME DATA_ANG ---------- ----------------KING 17 November 1981 BLAKE 1 May 1981 CLARK 9 June 1981 JONES 2 April 1981 MARTIN 28 September 1981 ALLEN 20 February 1981 ... 14 rows selected.
Functia NVL Converteste o valoare NULL la o valoare data. Tipurile de date acceptate sunt datele calendaristice, sirurile de caractere si numerele
SQL> SELECT nume, sal, com, (sal*12)+NVL(com,0) VENIT 2 FROM angajat;
NUME SAL COM VENIT ---------- --------- --------- -------------------KING 5000 60000 BLAKE 2850 34200 CLARK 2450 29400 JONES 2975 35700 MARTIN 1250 1400 16400 ALLEN 1600 300 19500
Functia DECODE
DECODE(col/expresie, cautare1, rezultat1 [, cautare2, rezultat2,...,] [, predefinit])
Functie de cautare conditionala echivalenta cu instructiunile CASE sau IF-THEN-ELSE. Primul argument este coloana sau expresia dupa care se face cautarea. Al doilea argument reprezinta valoare de comparatie, urmatorul este valoarea intoarsa in cazul in care conditia este adevarata. Ultimul argument este valoarea intoarsa daca toate conditiile sunt false.
SQL - Structured Query Language
Functiile de un singur rind pot fi imbricate. Functia care se evalueaza prima este cea cu nivelul de imbricare cel mai mare.
Functii de grup
ANGAJAT
NRDEPT SAL --------- --------10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250
MAX(SAL) --------5000
Grupuri de date
ANGAJAT
NRDEPT SAL --------- --------10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250
2916.6667
salarul mediu NRDEPT AVG(SAL) pe fiecare ------- --------departament 2175 10 2916.6667 20 2175 30 1566.6667
1566.6667
Clauza GROUP BY
SELECT FROM [WHERE [GROUP BY [ORDER BY coloana, functie_grup(coloana) tabel conditie] expresie_group_by] coloana];
Se pot imparti liniile unei tabele in grupuri folosind clauza GROUP BY. Orice coloana care apare in clauza SELECT si nu este intr-o functie de grup atunci trebuie sa apara in clauza GROUP BY.
SQL - Structured Query Language
3000
2850
Clauza HAVING
SELECT FROM [WHERE [GROUP BY [HAVING [ORDER BY column, group_function table condition] group_by_expression] group_condition] column];
Subinterogari
Cine are salarul mai mare ca salarul lui Jones ?
Interogarea principala
Sintaxa subinterogarii
SELECT FROM WHERE coloane tabel expresie operator (SELECT FROM
coloane tabel)
Interogarea interna se executa o singura data, inaintea interogarii principale. Rezultatele subinterogarii sunt folosite de interogarea principala.
Reguli pentru subinterogari Subinterogarile se includ intre paranteze. Subinterogarea se plaseaza in partea dreapta a operatorului de comparatie. Clauza ORDER BY nu este permisa in subinterogare. Folositi operatori de o singura linie pentru subinterogari de o singura linie. Folositi operatori multi-linie pentru subinterogari care intorc mai multe linii.
SQL - Structured Query Language
WHERE AND
NUME SAL NRDEPT SALMED ---------- --------- --------- ---------KING 5000 10 2916.6667 JONES 2975 20 2175 SCOTT 3000 20 2175 ... 6 rows selected.
Operatori cu multimi
A B
Intersect
A B A B
Minus
SQL - Structured Query Language
Reguli pentru operatorii de multime Expresiile din clauzele SELECT trebuie sa se potriveasca la numar si ca tip de date. Liniile duplicate sunt eliminate, exceptie facind operatorul UNION ALL. Numele coloanelor din prima interogare apar in rezultat. Predefinit, rezultatul este ordonat crescator. Se pot folosi parantezele pentru a schimba ordinea de executie.
SQL - Structured Query Language
se adauga o linie la o tabela se modifica o linie existenta se sterge o linie dintr-o tabela
O tranzactie consta intr-o colectie de instructiuni DML care alcatuiesc un modul logic de lucru.
Modificarea datelor:
UPDATE
Stergerea datelor:
DELETE
Insereaza o linie noua in tabela. Daca nu se afiseaza lista coloanelor trebuie sa se listeze valori pentru fiecare coloana din tabel. Ordinea valorilor trebuie sa corespunda cu ordinea coloanelor din tabel. Optional se poate afisa si lista coloanelor. Valorile sir de caractere si data calendaristica se introduc intre apostroafe.
SQL - Structured Query Language
Actualizarea datelor
UPDATE SET [WHERE tabel coloana = valoare [, coloana = valoare] conditie];
Se modifica valorile dintr-un tabel. Daca nu se specifica o clauza WHERE atunci vor fi actualizate toate liniile din tabel. In functie de conditia din clauza WHERE se pot actualiza 0, 1 sau mai multe linii din tabel.
Constringeri de integritate
UPDATE angajat * ERROR at line 1: ORA-02291: integrity constraint (USR.ANGAJAT_DEPT_FK) violated - parent key not found
Se pot sterge linii din tabel cu DELETE. Liniile sterse sunt cele care indeplinesc conditiile din clauza WHERE. Daca nu exista clauza WHERE se sterg toate liniile din tabel.
O tranzactie incepe cu prima instructiune DML. O tranzactie se termina la unul din urmatoarele evenimente:
COMMIT sau ROLLBACK instructiuni DDL sau DCL (se executa un COMMIT automat) deconectarea utilizatorului pica sistemul SQL - Structured Query Language
Zavoarele Zavoarele Oracle: previn interactiunile distructive intre tranzactiile concurente nu necesita actiunea utilizatorului automat folosesc cel mai jos nivel de restrictivitate sunt mentinute pe durata unei tranzactii sunt de doua tipuri:
exclusive partajate SQL - Structured Query Language
Tranzactii concurente
Fiecare tranzactie executata complet trebuie sa lase baze de date intr-o stare consistenta:
utilizatorii specifica restrictiile de integritate pe care SGBD-ul le aplica SGBD-ul nu intelege semnificatia datelor Utilizatorul are responsabilitatea ca o tranzactie sa lase baza de date intr-o stare consistenta
Inainte de a scrie/citi un obiect, o tranzactie cere un zavor (lock) asupra obiectului, si asteapta pana SGBD asigura acel zavor. Toate zavoarele sunt sterse la sfarsitul tranzactiei. Ideea: daca actiunea tranzactiei Ti (de scriere a lui X) afecteaza Tj (care citeste X), Ti va obtine zavorul pe X iar Tj este fortata sa astepte pana Ti se termina; acest mecanism ordoneaza tranzactiile. Putem avea cazul cand Tj are deja un zavor pe Y iar Ti va cere la randul ei un zavor pe Y. In acest caz avem Deadlock. Ti sau Tj este restartata.
Axiome ACID A tomicitate: Toate actiunile unei tranzactii se produc toate sau nici una (all-or-nothing). C onsistenta: Daca fiecare tranzactie este consitenta si daca baza de date se starteaza consistenta atunci ea ramane consistenta in orice moment. I zolarea: Executia unei tranzactii este izolata de celalte tranzactii. D urabilitate: Daca o tranzactie comite atunci efectele sale sunt permanentizate.
Avantajele COMMIT si ROLLBACK COMMIT - permanentizeaza schimbarile in baza de date. ROLLBACK - anuleaza schimbarile facute in tranzactia curenta si aduce baza de date in starea anterioara tranzactiei curente. Asigura consistenta datelor. Permit vizualizarea datelor inainte de a permanentiza schimbarile in baza de date. Grupeaza operatiile relationate logic.
SQL - Structured Query Language
Controlul tranzactiilor
Tranzactie INSERT
COMMIT
UPDATE
INSERT
DELETE
Savepoint A
Savepoint B
ROLLBACK to Savepoint B
ROLLBACK to Savepoint A
ROLLBACK
Se executa un ROLLBACK automat in cazul unei deconectari anormale sau cind sistemul pica (software sau hardware).
Starea datelor inainte de ROLLBACK sau COMMIT Poate fi restaurata starea anterioara a datelor. Utilizatorul poate vizualiza modificarile facute prin instructiunile DML prin instructiuni SELECT. Alt utilizator nu poate vedea modificarile facute de utilizatorul curent. Liniile modificate sunt blocate. Alt utilizator nu poate modifica datele schimbate de utilizatorul curent.
Starea datelor dupa COMMIT Schimbarile efectuate sunt permanentizate in baza de date. Starea anterioara a datelor este pierduta. Toti utilizatorii pot vizualiza datele modificate. Liniile blocate sunt accesibile si pentru alti utilizatori pentru modificare. Sunt sterse toate punctele de salvare marcate pe parcursul unei tranzactii.
ROLLBACK la nivel de instructiune DML Daca o instructiune DML nu reuseste sa se execute cu succes, numai acea instructiune este anulata. Serverul Oracle implementeaza un punct de salvare implicit. Toate celelalte schimbari sunt mentinute. Utilizatorul trebuie sa incheie tranzactia printr-o instructiune explicita de COMMIT sau ROLLBACK.
Consistenta la citire Consitenta la citire garanteaza o vedere consistenta a datelor in orice moment. Schimbarile efectuate de un utilizator nu intra in conflict cu schimbarile facute de alt utilizator. Se asigura ca pentru aceleasi date: cititorii nu asteapte scriitorii scriitorii nu asteapta cititorii
User A
SELECT * FROM angajat;
User B
SQL - Structured Query Language
Concluzii S-au introdus definitii ale limbajului SQL. S-au urmarit principalele etape in istoricul aparitiei limbajului SQL. S-au enumerat principalele tipuri de instructiuni SQL. Sintaxa de baza SELECT SQL Clauzele instructiunii de interogare: SELECT, FROM, WHERE, ORDER BY. Extragerea datelor din mai multe tabele.
SQL - Structured Query Language
Grupuri de date si functii de grup. Subinterogari simple, multi-linie si multicoloana. Interogari ce folosesc operatori de multimi: reuniunea, intersectia, diferenta.
SQL - Structured Query Language
Controlul tranzactiilor:
COMMIT ROLLBACK puncte de salvare (SAVEPOINT) consistenta la citire zavoare Oracle
SQL - Structured Query Language