You are on page 1of 4

Exemple de fraze SQL

Exemple de fraze SQL

Enunt: Se da o societate comerciala cu profil de activitate repararea de aparatura informatica (servere,


computere personale, imptrimante, dispozitive mobile etc). Societatea are in componenta persoane specializate
pe domenii. Pentru fiecare reparatie se intocmeste o fisa pe care se inscriu date despre reparatia efectuata.

I. Structura tabelelor

Pentru a administra activitatea companiei, proiectam urmatoarea baza de date:


Angajati Reparatii Clienti
id_angajat - autonumber nr_reparatie - autonumber id_client - autonumber
nume - text data_reparatie - date denumire - text
prenume - text obiect - text adresa - text
adresa - text an_fabricatie - number telefon - text
telefon - text diagnostic - text e_mail - text
data_angajare - date tarif - number website - text
specializare - text id_angajat - number observatii - text
salariu - numeric id_client - number

II. Operatii creare, modificare tabele si adaugare de inregistrari

1. Sa se realizeze o fraza SQL pentru crearea tabelei Angajati (mai putin ultimul camp dintre cele
enumerate mai sus)

CREATE TABLE Angajati (id_angajat COUNTER PRIMARY KEY, nume TEXT(50), prenume TEXT(50),
adresa TEXT(100), telefon TEXT(20), data_angajare DATE, specializare TEXT(20));

2. Sa se adauge tabelei Angajati ultimul camp (salariu)

ALTER TABLE Angajati ADD COLUMN salariu NUMBER

3. Sa se insereze in tabela un angajat nou cu datele:


nume - Popescu
prenume - Marius
adresa - Str. Revolutiei nr.1
telefon - 0722.77.28.55
data_angajare - 24/01/2001
salariu - 1500
specializare - electronica

INSERT INTO Angajati (nume, prenume, adresa, telefon, data_angajare, salariu, specializare) VALUES
("Popescu", "Marius" , "Str. Revolutiei nr.1", "0722.77.28.55", "01/24/2001", 1500, "electronica")

III. Interogari (selectii) simple

- pagina 1 -
Exemple de fraze SQL

4. Sa se afiseze numele, prenumele si telefoanele angajatilor cu salarii mai mari sau egale cu 1000,
ordonand alfabetic lista rezultata. In lista nu vor aparea angajatii care nu au telefon.

SELECT nume, prenume, telefon FROM Angajati WHERE salariu>=1000 AND telefon IS NOT NULL
ORDER BY nume ASC

5. Sa se selecteze toate datele despre persoanele angajate in martie 2002 si au una dintre
specializarile “informatica” sau “electronica”.

SELECT * FROM Angajati


WHERE data_angajare BETWEEN #03/01/2002# AND #03/31/2002# AND specializare IN
("informatica", "electronica")
ORDER BY salariu DESC, data_angajare ASC

sau

SELECT * FROM Angajati


WHERE (data_angajare >= #3/1/2002# AND data_angajare <= #3/31/2002#) AND specializare IN
("informatica", "electronica")
ORDER BY salariu DESC, data_angajare ASC

6. Sa se afiseze toate reparatiile efectuate in ultimele 10 zile.

SELECT * FROM Reparatii


WHERE data_reparatie > Date()-10

7. Sa se selecteze numele si prenumele angajatilor, sa se calculeze vechimea in munca pentru fiecare


angajat (in ani). Intr-un alt camp, calculat si denumit spor_vechime, sa se afiseze 0 daca vechimea este sub 2
ani si 1 daca vechimea este peste 2 ani.

SELECT nume, prenume, (Date()-data_angajare)/365 AS vechime, IIF(vechime<2,0,1) AS


spor_vechime
FROM Angajati

IV. Interogari multiple

8. Sa se afiseze denumirea si adresa clientilor care au avut de reparat produsul “imprimanta”.

SELECT DISTINCT denumire, adresa


FROM Clienti, Reparatii
WHERE Reparatii.id_client = Clienti.id_client AND obiect="imprimanta"

sau

SELECT DISTINCT denumire, adresa


FROM Clienti INNER JOIN Reparatii ON Reparatii.id_client = Clienti.id_client
WHERE obiect="imprimanta"

9. Sa se afiseze numele angajatilor care au realizat reparatii pentru clientul “Millenium Trading” si datele
la care au fost efectuate aceste reparatii.

SELECT nume, prenume, data_reparatie


FROM Angajati, Reparatii, Clienti
WHERE Angajati.id_angajat = Reparatii.id_angajat AND Reparatii.id_client = Clienti.id_client AND
Clienti.denumire = "Millenium Trading"

- pagina 2 -
Exemple de fraze SQL

sau

SELECT nume, prenume, data_reparatie


FROM (Angajati INNER JOIN Reparatii ON Angajati.id_angajat = Reparatii.id_angajat) INNER JOIN
Clienti ON Reparatii.id_client = Clienti.id_client
WHERE Clienti.denumire = "Millenium Trading"

V. Interogari de selectie ce utilizeaza functii de grup

10. Sa se calculeze costul mediu al unei categorii de reparatii (medie per calculator, medie per
imprimanta, etc). Lista va fi ordonata descrescator dupa cost.

SELECT obiect, AVG(tarif) as cost_mediu


FROM Reparatii
GROUP BY obiect
ORDER BY AVG(tarif) DESC

11. Sa se calculeze costul mediu al unei categorii de reparatii, afisandu-se numai acelea pentru care
costul mediu depaseste valoarea 750.
Obs.: Clauza WHERE nu lucreaza cu functii totalizatoare, deci se foloseste clauza HAVING.

SELECT obiect, AVG(tarif) as cost_mediu


FROM Reparatii
GROUP BY obiect
HAVING AVG(tarif)>750
ORDER BY AVG(tarif) DESC

12. Sa se calculeze suma incasata de la fiecare client in anul 2002.

SELECT denumire, SUM(tarif) as suma_incasata


FROM Clienti INNER JOIN Reparatii ON Clienti.id_client = Reparatii.id_client
WHERE Year (data_reparatie)=2002
GROUP BY denumire

VI. Interogari tip UNION

13. Sa se afiseze toti angajatii si toti clientii care au domiciliul in Craiova.

SELECT nume, adresa


FROM Angajati
WHERE adresa LIKE "*Craiova*"
UNION
SELECT denumire as nume, adresa
FROM Clienti
WHERE adresa LIKE "*Craiova*"

VII. Interogari de stergere

14. Sa se stearga din baza de date angajatii care au codul 1 sau 3.

DELETE FROM Angajati


WHERE id_angajat=1 OR id_angajat=3

15. Sa se stearga din baza de date angajatii care au participat la reparatiile cu numerele 1 si 3.

- pagina 3 -
Exemple de fraze SQL

DELETE FROM Angajati


WHERE id_angajat IN (SELECT id_angajat FROM Reparatii WHERE nr_reparatie=1 OR
nr_reparatie=3)

VIII. Interogari de actualizare (modificare) date

16. Sa se modifice tariful reparatiilor la 1500 pentru obiectul “calculator”.

UPDATE Reparatii
SET tarif=1500
WHERE obiect=”calculator”

17. Sa se mareasca salariile cu 20% pentru angajatii veniti in firma inainte de 1 ianuarie 2002.

UPDATE Angajati
SET salariu = salariu *1.2
WHERE data_angajare<#1/1/2002#

IX. Interogari de tip crosstab

18. Sa se afiseze cate reparatii a efectuat fiecare angajat in fiecare an. Numele angajatilor se vor afisa
pe linii, iar anii pe coloanele tabelului.

TRANSFORM COUNT(nr_reparatie)
SELECT nume
FROM Angajati INNER JOIN Reparatii ON Angajati.id_angajat = Reparatii.id_angajat
GROUP BY nume
PIVOT YEAR (data_reparatie)

O interogare de tip crosstab se realizeaza punand valorile la TRANSFORM, randurile la SELECT, iar
coloanele la PIVOT. In exemplu de mai sus, COUNT(nr_reparatie) reprezinta valorile, nume reprezinta
randurile, iar YEAR (data_reparatie) coloanele.

X. Alte tipuri de interogari

19. Sa se afiseze clientii care incep cu un sir introdus de la tastatura.

SELECT denumire, telefon, e_mail


FROM Clienti
WHERE denumire LIKE [Introduceti numele] & "*"

XI. Recomandari

Clauzele Inner Join, Left Join, Right Join sunt mai rapide decat clauzelor Where.
Pe cat posibil, sa se evite utilizarea operatorului Not.
Nu folositi clauza Order By pentru o subselectie.
Evitati, pe cat posibil, folosirea tabelelor temporale.

XII. Tipuri si exemple de relatii

1-M: studenti - orase-de-nastere, orase - judete, produse - categorii, produse - firme-producatoare


facturi-clienti, jucatori - tari, jucatori - echipe, echipe - tari

M-M: studenti - examene, studenti - profesori, facturi - produse, actori - filme, carti - abonati

- pagina 4 -

You might also like