CATEGORII DOCUMENTE |
Elemente de baza ale interogarilor SQL
Modalitatea prin care, pornind de la o schema relationala, pot fi obtinute diverse informatii dintr-o baza de date se numeste interogare (QUERY), iar formularea unei interogari inseamna redactarea unei fraze SELECT
Termenul de interogare este oarecum impropriu. O interogare SQL nu este neaparat o intrebare pusa bazei de date. Ea poate fi si o comanda pentru executarea uneia din actiunile urmatoare:
- sa construiasca sau sa stearga o baza de date;
- sa insereze, sa modifice sau sa stearga linii sau campuri;
- sa caute in cateva tabele o anumita informatie si sa returneze rezultatele intr-o anumita ordine;
- sa modifice securitatea informatiilor.
O fraza SELECT are un format simplu si flexibil. Cele trei clauze principale sunt SELECT FROM si WHERE dintre care doar primele doua sunt obligatorii.
Sintaxa oarecum simplificata a unei interogari SQL este urmatoarea:
SELECT [ALL/DISTINCT/] lista_atribute
FROM lista_tabele
[WHERE criteriu_de_cautare]
[GROUP BY atribut_de_grupare]
[HAVING criteriu_de_grupare]
[ORDER BY criteriu_de_ordonare [ASC/DESC]];
unde:
lista_atribute |
- specifica atributele ale caror valori vor fi returnate |
nume-tabele |
- specifica tabelele din care se vor extrage datele |
ALL |
- specifica returnarea tuturor tuplurilor care indeplinesc conditiile precizate in blocul de cerere |
DISTINCT |
- elimina tuplurile care prezinta valori duplicate continute in atributele specificate |
WHERE |
- permite, prin precizarea unei expresii, exprimarea criteriului de selectie |
ORDER BY |
- precizeaza atributul dupa care se va face ordonarea |
GROUP BY |
- folosit pentru a partitiona o relatie in grupuri, acordand acestora valori pe un atribut sau lista de atribute |
HAVING |
- folosit pentru a specifica criterii de selectie pe grupuri de tupluri |
In continuare este realizata o paralela intre clauzele principale ale frazei SELECT cu operatorii algebrei relationale prezentati in capitolul 3 Algebra relationala.
Selectie si proiectie
Clauza SELECT in algebra relationala corespunde operatorului proiectie, ea fiind folosita pentru a desemna care sunt coloanele care vor aparea in rezultat. Clauza FROM este folosita pentru a enumera tabelele (relatiile) din care vor fi extrase informatiile aferente consultarii. Prin clauza WHERE este desemnat predicatul selectiv al algebrei relationale, ce se aplica atributelor din relatiile care apar in clauza FROM
O consultare simpla in SQL, la modul cel mai general si simplist, poate fi prezentata astfel:
SELECT C1, C2, , Cn
FROM T1, T2, , Tm
WHERE P
Rezultatul unei astfel de fraze SQL se prezinta sub o forma tabelara. Aceasta forma poate fi o lista (text), o tabela propriu-zisa sau o tabela temporara, dar si o tabela derivata (imagine). Sunt si cazuri in care rezultatul poate fi obtinut si ca o variabila masiv (tablou).
Ci - reprezinta coloanele (care pot fi atribute sau expresii de atribute) rezultat);
Tj - tabelele ce trebuie parcurse pentru obtinerea rezultatului;
P - predicatul (conditia) simplu sau compus ce trebuie indeplinit de tupluri pentru a putea fi incluse in rezultat.
Atunci cand clauza WHERE nu este prezenta, se considera in mod implicit ca valoarea logica a predicatului P este "adevarat" si in consecinta, toate liniile din tabela sau produsul cartezian al tabelelor specificata/specificate in clauza FROM vor fi incluse in rezultat.
Daca in locul coloanelor C1, C2, , Cn apare simbolul (asterisc), rezultatul va fi format din toate atributele tabelelor specificate in clauza FROM. De asemenea, numele atributelor rezultatului sunt numele atributelor din tabela (tabelele) specificata in FROM. Daca se doreste schimbarea acestui nume rezultat se apeleaza la clauza AS
Conform restrictiei de unicitate, intr-o relatie nu pot exista doua linii identice. In schimb, in SQL, tabela obtinuta dintr-o consultare poate contine doua sau mai multe tupluri identice.
Spre deosebire de algebra relationala, unde tuplurile identice (dublurile) sunt eliminate automat din rezultat, in SQL nu se intampla acelasi lucru. Pentru aceasta este necesara folosirea optiunii DISTINCT
SELECT DISTINCT C1, C2, , Cn
FROM T1, T2, , Tm
WHERE P
Din cele prezentate pana acum se poate trage concluzia ca o fraza SELECT corespunde:
- unei proiectii (SELECT C1
- unui produs cartezian (FROM R1 A R2 A A Rm
- unei selectii algebrice (WHERE P
si conduce la obtinerea unui rezultat cu "n" coloane, fiecare coloana fiind un atribut din T1, T2, , Tm sau expresie calculata pe baza unor atribute din T1, T2, , Tm
In continuare, pe baza exemplelor din capitolul 3, vom transpune in SQL, cateva interogari din algebra relationala.
Exemplul 1. Selectie
SELECT *
FROM R1
WHERE C1>500
Exemplul 2. Selectie
SELECT *
FROM R1
WHERE C3>250 AND C3<=350
Exemplul 3. Selectie
SELECT *
FROM R1
WHERE C1>300 AND C3>300
Exemplul 4. Care sunt studentii Facultatii de Stiinte Economice?
SELECT *
FROM STUDENT
WHERE facultate = "Stiinte Economice"
Exemplul 5. Care sunt studentii Facultatii de Stiinte Economice, specializarea Contabilitate si Informatica de Gestiune?
SELECT *
FROM STUDENT
WHERE facultate = "Stiinte Economice" AND
sectia = "CIG"
Exemplul 6. Ce burse au fost incasate in februarie 2004?
Formatul general al unei constante de tip data calendaristica este YYYY-MM-DD, interogarea in SQL-92 poate avea forma.
SELECT *
FROM BURSA
WHERE data_incasarii>='2004/02/01' AND
data_incasarii<='2004/02/29'
In Visual FoxPro aceeasi interogare este de forma:
SELECT *;
FROM BURSA;
WHERE data_incasarii>= AND;
data_incasarii<=
Observatie: In Visual Foxpro caracterul ; este folosit pentru a specifica faptul ca o comanda este scrisa pe mai multe linii.
Exemplul 7. Proiectie
SELECT C3
FROM R1
Exemplul 8. Proiectie
SELECT C1, C3
FROM R1
Exemplul 9. Care sunt facultatile preluate in baza?
SELECT facultate
FROM STUDENT
SQL, spre deosebire de algebra relationala, nu elimina automat duplicatele. Tabela obtinuta prin consultarea de mai sus are forma tabelei R' (figura 3.13.). Pentru a obtine rezultatul de forma tabelei R (o facultate sa apara o singura data), se foloseste clauza DISTINCT
Exemplu 10. Care sunt: cota, titlul, domeniul si numar de exemplare al fiecarei carti?
SELECT cota_carte, titlu, domeniu, nr_exemplare
FROM CARTE
In acest caz nu este necesara clauza DISTINCT, deoarece cota_carte este cheia primara a tabelei CARTE.
Exemplul 11. Care este facultatea pe care o urmeaza studentul Barbu Costel?
SELECT facultate
FROM STUDENT
WHERE nume = "Barbu Costel"
Exemplul 12. Care sunt regiunile din care fac parte judetele Dambovita si Valcea?
SELECT judet, regiune
FROM LOCALITATE
WHERE judet = "Dambovita" OR judet = "Valcea"
Exemplul 13. Care sunt studentii Facultatii de Stiinte Economice de la specializarile CIG si FA?
SELECT nume, sectia
FROM STUDENT
WHERE facultate = "Stiinte Economice" AND sectia =
"CIG" OR sectia = "FA"
Exemplul 14. Care sunt cartile care au aparut la editurile Eficient si Macarie?
SELECT titlu
FROM CARTE
WHERE editura = "Eficient" OR editura = "Macarie"
Reuniune, intersectie, diferenta, produs cartezian
Primii trei operatori asamblisti prezinta operatori SQL dedicati: UNION INTERSECT MINUS EXCEPT) in timp ce produsul cartezian se obtine automat prin simpla enumerare a celor doua tabele in clauza FROM
Reuniunea
Un rezultat identic cu tabela R3 din figura 3.2., se obtine prin urmatoarea fraza SELECT
SELECT *
FROM R1
UNION
SELECT *
FROM R2
Revenind la exemplul 13 din capitolul 3 - Care sunt studentii Facultatii de Stiinte Economice de la specializarile CIG si FA? -, fraza SQL echivalenta cu solutia 2 bazata pe reuniune este:
SELECT nume
FROM STUDENT
WHERE facultate = "Stiinte Economice" AND sectia =
"CIG"
UNION
SELECT nume
FROM STUDENT
WHERE facultate = "Stiinte Economice" AND sectia =
"FA"
Intersectia
Raportandu-ne la exemplul din figura 3.3. , echivalentul tabelei R4 se obtine in SQL prin:
SELECT *
FROM R1
INTERSECT
SELECT *
FROM R2
Pentru o prima reprezentare a utilizarii intersectiei, transcriem solutia din algebra relationala formulata la exemplul 14 - Care sunt cartile care au aparut la editurile Eficient si Macarie?
SELECT titlu
FROM CARTE
WHERE editura = "Eficient"
INTERSECT
SELECT tilu
FROM CARTE
WHERE editura = "Macarie"
Exemplul de mai sus functioneaza in Oracle, nu insa si in Visual FoxPro, care nu are implementat operatorul INTERSECT, astfel incat intersectia trebuie realizata folosind alte clauze si operatori.
Diferenta
Operatorul la care ne-am astepta in acest caz ar fi MINUS. In Standardul SQL - 92 si in alte cateva SGBD-uri operatorul MINUS nu exista, el fiind substituit de EXCEPT, in timp ce in alte SGBD-uri nu exista nici unul, nici altul. Tabela R5 din figura 3.4., calculata prin expresia R1 - R2, in SQL se obtine prin interogarea:
SELECT *
FROM R1
EXCEPT
SELECT *
FROM R2
Ca si pentru INTERSECT, Visual FoxPro nu are implementat un operator SQL pentru realizarea diferentei a doua relatii.
Produsul cartezian
SQL nu pune la dispozitie vreun operator special dedicat produsului cartezian si asta din simplul motiv ca nici nu este nevoie sa o faca. Tabela R6 din figura 3.5., se obtine pur si simplu prin enumerarea celor doua relatii in clauza FROM
SELECT *
FROM R1, R2
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1874
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved