-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSQL database.txt
More file actions
410 lines (297 loc) · 13.5 KB
/
Copy pathSQL database.txt
File metadata and controls
410 lines (297 loc) · 13.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
CREATE TABLE Angajati
(
IdFunctie INT NOT NULL PRIMARY KEY,
Denumire VARCHAR(10) NOT NULL,
Salariu FLOAT NOT NULL
)
CREATE TABLE IdAngajat
(
IdAngajat INT NOT NULL PRIMARY KEY,
Nume VARCHAR(20) NOT NULL,
Prenume VARCHAR(20) NOT NULL,
Marca INT NOT NULL,
Data_Nasterii DATE NULL,
DataAngajarii DATE NULL,
Adresa_jud varchar(20) NOT NULL,
Id_Functie int NOT NULL,
IdDep INT NOT NULL
)
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Militaru', 'Anca', 1, '02/10/2005','10/10/2024', 'Cluj', 1, 1, 1 )
GO
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Seichei', 'Daniela', 2, '05/15/2007', '01/06/2025', 'Cluj', 2, 2,2)
Select * From Angajati
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Seichei', 'Andreea', 3, '06/15/2004', '10/06/2024', 'Cluj', 3, 3, 3)
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Seichei', 'Mirela', 4, '08/04/1976', '01/09/2000', 'Cluj', 2, 2, 4);
DELETE from Angajati
Where IdAngajat=4;
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Seichei', 'Mirela', 4, '08/04/1976', '01/09/2000', 'Cluj', 2, 2, 4);
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Faur', 'Luca', 5, '03/12/2007', '26/12/2023', 'Cluj', 2, 2, 5)
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Bulea', 'Paul', 6, '31/12/2004', '05/11/2024', 'Cluj', 3, 3, 6)
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Rupi', 'Sebastian', 2, '07/11/2003', '11/09/2021', 'Cluj', 3, 3, 7)
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Prodan', 'Alexandru', 2, '01/27/2005', '03/27/2026', 'Cluj', 2, 2, 8)
INSERT INTO ANGAJATI (Nume, Prenume, Marca, Data_Nasterii,DataAngajarii, Adresa_jud,Id_Functie , Iddept, IdAngajat)
VALUES ('Costea', 'Robert', 2, '12/20/2004', '01/06/2025', 'Cluj', 2, 2, 9)
GO
ALTER TABLE Angajati
ADD constraint ck_data_angajarii_pozitiva CHECK(DataAngajarii>Data_Nasterii)
CREATE TABLE Departamente(
IdDept int NOT NULL PRIMARY KEY,
Denumire varchar(30) NOT NULL
)
UPDATE DEPARTAMENTE SET Denumire = 'CERCETARE' WHERE IdDept = 1;
UPDATE DEPARTAMENTE SET Denumire='REDACTARE' WHERE IdDept=2;
ALTER TABLE Departamente
ALTER COLUMN IdDept INT NOT NULL;
ALTER TABLE Departamente
ADD CONSTRAINT PK_Departamente PRIMARY KEY (IdDept);
ALTER TABLE ANGAJATI
ADD CONSTRAINT FK_ANGAJATI_DEPT FOREIGN KEY (IdDept)
REFERENCES DEPARTAMENTE(IdDept)
INSERT INTO Departamente (IdDept, Denumire) VALUES(1,'Management');
INSERT INTO Departamente (IdDept, Denumire) VALUES(2,'Vanzari');
INSERT INTO Departamente(IdDept, Denumire) VALUES (3, 'Contabilitate')
GO
INSERT INTO Functii (IdFunctie,Denumire, Salariu) VALUES (1, 'MANAGER', 5000);
INSERT INTO Functii(IdFunctie, Denumire, Salariu) VALUES (2, 'INGINER', 7000);
INSERT INTO Functii(IdFunctie, Denumire, Salariu) VALUES (3, 'Contabil', 4000);
GO
--Care sunt angajații dintr-un anumit departament a căror nume conține caracterul ‘A’ ?
SELECT * FROM Angajati
WHERE IdDept = 1 AND Nume LIKE 'A'
-- Care sunt angajații dintr-un anumit departament (dat prin denumire) (opțional: ordonați după
--salariu crescător/descrescător)? (ORDER BY)
SELECT A.Nume, A.Prenume, F.Salariu
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
WHERE D.Denumire = 'Vanzari'
ORDER BY F.Salariu ASC
--4. Câți angajați sunt într-un anumit departament (dat prin Denumire)?
SELECT COUNT(A.IdAngajat) AS Numar_Angajati
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
WHERE D.Denumire = 'Contabilitate'
--5. Care este suma salariilor angajaților din companie?
SELECT SUM(F.Salariu) AS Total_Salarii
FROM Angajati A
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
--1. Care este media salariilor pe un departament specificat prin nume? (AVG)
SELECT AVG(F.Salariu) AS Media_Salariu
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
WHERE D.Denumire = 'Vanzari'
--2. Mediile salariilor grupate pe funcții
SELECT F.Denumire, AVG(F.Salariu) AS Media_Functie
FROM Functii F
GROUP BY F.Denumire
--3. Cel mai mic/mare salariu din companie
SELECT MIN(Salariu) AS Salariu_Minim, MAX(Salariu) AS Salariu_Maxim
FROM Functii
--4. Cel mai mic/mare salariu dintr-un departament specificat (ex: 'Management')
SELECT MIN(F.Salariu) AS Min_Dept, MAX(F.Salariu) AS Max_Dept
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
WHERE D.Denumire = 'Management'
--5. Cele mai mici și cele mai mari salarii pe fiecare departament
SELECT D.Denumire, MIN(F.Salariu) AS Minim, MAX(F.Salariu) AS Maxim
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
GROUP BY D.Denumire
--6. Câți angajați sunt în fiecare departament?
SELECT D.Denumire, COUNT(A.IdAngajat) AS Nr_Angajati
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
GROUP BY D.Denumire
--7. Suma salariilor pe fiecare departament
SELECT D.Denumire, SUM(F.Salariu) AS Total_Salarii_Dept
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
GROUP BY D.Denumire
--8. Listați angajații, grupați pe departamente și vechimi (rotunjite la an)
-- Nota: GROUP BY se foloseste aici doar daca am avea functii de agregare.
-- Pentru o lista simpla folosim ORDER BY.
SELECT D.Denumire, A.Nume, A.Prenume, DATEDIFF(year, A.DataAngajarii, GETDATE()) AS Vechime_Ani
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
ORDER BY D.Denumire, Vechime_Ani
--9. Angajații, grupați pe funcții, cu vechime > 10 ani
SELECT F.Denumire, A.Nume, A.Prenume
FROM Angajati A
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
WHERE DATEDIFF(year, A.DataAngajarii, GETDATE()) > 10
ORDER BY F.Denumire
--10. Angajații, grupați pe departamente, cu vârsta de minim 30 ani
SELECT D.Denumire, A.Nume, A.Prenume
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
WHERE DATEDIFF(year, A.Data_Nasterii, GETDATE()) >= 30
ORDER BY D.Denumire
--11. Departamentele care au media salariilor > 3000
-- Aici folosim HAVING pentru ca punem conditie pe o functie de grup (AVG)
SELECT D.Denumire, AVG(F.Salariu) AS Media_Salariala
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
GROUP BY D.Denumire
HAVING AVG(F.Salariu) > 3000
USE Firma_Restanta
CREATE TABLE [dbo].[Vanzari](
IdVanzare int PRIMARY KEY IDENTITY NOT NULL,
IdProdus int NOT NULL,
IDClient int NOT NULL,
IDVanzator int NOT NULL,
DataVanz date NULL,
NrProduse int NULL,
PretVanz float NULL,
)
--Să se șteargă toate vânzările mai vechi de 4 ani.
DELETE from Vanzari WHERE DATEDIFF(day,Datavanz, GETDATE())>4
--Să se introducă o constrângere ce verifică că în câmpul Data_vanz din tabela Vanzari nu se
--pot introduce date din viitor (se folosesc funcțiile GETDATE și DATEDIFF). Să se verifice
--funcționarea constrângerii.
ALTER TABLE Vanzari ADD CONSTRAINT ck_data_corecta CHECK (DATEDIFF(day, DataVanz, GETDATE()) >=0)
--Să se populeze tabela Vanzari, cu cel puțin 15 înregistrări cât mai variate
ALTER TABLE Vanzari ADD TipProdus varchar(20)
INSERT INTO Vanzari ( IdProdus, IDClient, IDVanzator, DataVanz, NrProduse, PretVanz)
VALUES (1,1,1, '01/01/2025', '50', '100')
INSERT INTO Vanzari ( IdProdus, IDClient, IDVanzator, DataVanz, NrProduse, PretVanz)
VALUES(2,2,2,'02/02/2025', '10', '400')
INSERT INTO Vanzari ( IdProdus, IDClient, IDVanzator, DataVanz, NrProduse, PretVanz)
VALUES(2,2,3,'02/02/2025', '10', '400')
INSERT INTO Vanzari ( IdProdus, IDClient, IDVanzator, DataVanz, NrProduse, PretVanz)
VALUES(3,3,3,'02/02/2025', '10', '400')
GO
CREATE TABLE [dbo].[Clienti](
IDClient int PRIMARY KEY IDENTITY NOT NULL,
Denumire varchar(20),
Tip_cl varchar(20),
Adresa_jud varchar(20)
)
ALTER TABLE Clienti ADD CONSTRAINT ck_tip_cl_initiale_firma CHECK(Tip_cl='PFA')
ALTER TABLE Clienti DROP CONSTRAINT ck_tip_cl_initiale_firma;
--Să se introducă o constrângere ce verifică că în câmpul Tip_cl din tabela Clienti se pot
--introduce numai valorile: PF, PFA, SRL, SA. Să se verifice funcționarea constrângerii.
ALTER TABLE Clienti ADD CONSTRAINT ck_tip_cl_initiale_firma CHECK(Tip_cL IN ('PFA' , 'PF', 'SRL', 'SA'))
INSERT INTO Clienti(Denumire) VALUES ('Mircea')
INSERT INTO Clienti(Denumire) VALUES ('Andrei')
INSERT INTO Clienti(Denumire) VALUES ('George')
--Să se șteargă toți clienții dintr-un anumit judet
DELETE FROM Clienti WHERE Adresa_jud='Alba'
SELECT Nume, Prenume,Data_Nasterii , DataAngajarii FROM Angajati;
CREATE TABLE [dbo].[Produse](
IDProdus int PRIMARY KEY IDENTITY NOT NULL,
Denumire varchar(20),
IDCateg int NOT NULL
)
ALTER TABLE Produse ADD Pret float;
ALTER TABLE Produse ADD Stoc int DEFAULT 0;
ALTER TABLE Produse DROP COLUMN Cod_Produs
--Să se introducă un câmp nou (Cod_produs CHAR(6)) în tabela Produse ce admite numai
--valori unice. Să se introduca produse noi cu date pentru Cod_produs.
ALTER TABLE Produse ADD Cod_produs varchar(6) UNIQUE
ALTER TABLE Produse add constraint
ck_pret_pozitiv CHECK(Pret>0);
INSERT INTO Produse ( Denumire, IDCateg, Cod_Produs)
VALUES( 'BMW', 1, '12KJOP')
INSERT INTO Produse ( Denumire, IDCateg, Cod_Produs)
VALUES('AUDI', 2, '563P8I')
INSERT INTO Produse ( Denumire, IDCateg, Cod_Produs)
VALUES('SKODA', 3, '7JHU90')
INSERT INTO Produse ( Denumire, IDCateg, Cod_Produs)
VALUES('TOYOTA',4, '56LK2P')
--1. Funcții care conțin ‘ngi’ (ex: Inginer)
SELECT A.Nume, A.Prenume, F.Denumire
FROM Angajati A
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
WHERE F.Denumire LIKE '%ngi%'
--2. Salariile din 'PRODUCTIE' și câți angajați au acele salarii
SELECT F.Salariu, COUNT(A.IdAngajat) AS Nr_Angajati
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
WHERE D.Denumire = 'PRODUCTIE'
GROUP BY F.Salariu
--3. Cele mai mici/mari salarii din departamente
SELECT D.Denumire, MIN(F.Salariu) AS Minim, MAX(F.Salariu) AS Maxim
FROM Angajati A
INNER JOIN Departamente D ON A.IdDept = D.IdDept
INNER JOIN Functii F ON A.Id_Functie = F.IdFunctie
GROUP BY D.Denumire
--4. Produsele vândute într-o perioadă (ex: Ianuarie 2025)
SELECT DISTINCT P.Denumire
FROM Vanzari V
INNER JOIN Produse P ON V.IdProdus = P.IDProdus
WHERE V.DataVanz BETWEEN '2025-01-01' AND '2025-01-31'
--5. Clienții care au cumpărat de la un vânzător anume (IDVanzator = 1)
SELECT DISTINCT C.Denumire
FROM Vanzari V
INNER JOIN Clienti C ON V.IDClient = C.IDClient
WHERE V.IDVanzator = 1
--6. Clienții care au cumpărat exact două produse (ca tipuri diferite)
SELECT C.Denumire
FROM Vanzari V
INNER JOIN Clienti C ON V.IDClient = C.IDClient
GROUP BY C.IDClient, C.Denumire
HAVING COUNT(DISTINCT V.IdProdus) = 2
--7. Clienții implicați în cel puțin două vânzări (tranzacții)
SELECT C.Denumire
FROM Vanzari V
INNER JOIN Clienti C ON V.IDClient = C.IDClient
GROUP BY C.IDClient, C.Denumire
HAVING COUNT(V.IdVanzare) >= 2
--8. Clienți cu o cumpărare (o singură linie) > 200
SELECT DISTINCT C.Denumire
FROM Vanzari V
INNER JOIN Clienti C ON V.IDClient = C.IDClient
WHERE (V.NrProduse * V.PretVanz) > 200
--9. Clienții din CLUJ cu cumpărări > 200
SELECT DISTINCT C.Denumire
FROM Vanzari V
INNER JOIN Clienti C ON V.IDClient = C.IDClient
WHERE C.Adresa_jud = 'Cluj' AND (V.NrProduse * V.PretVanz) > 200
--10. Mediile vânzărilor pe perioadă, grupate pe produse
SELECT P.Denumire, AVG(V.NrProduse * V.PretVanz) AS Media_Vanzare
FROM Vanzari V
INNER JOIN Produse P ON V.IdProdus = P.IDProdus
WHERE V.DataVanz BETWEEN '2025-01-01' AND '2025-12-31'
GROUP BY P.Denumire
--11. Număr total de produse vândute pe o perioadă
SELECT SUM(NrProduse) AS Total_Produse
FROM Vanzari
WHERE DataVanz BETWEEN '2025-01-01' AND '2025-12-31'
--12. Produse vândute de un vânzător (ex: numele 'Militaru' din tabela Angajati)
SELECT SUM(V.NrProduse) AS Total_Vandut
FROM Vanzari V
INNER JOIN Angajati A ON V.IDVanzator = A.IdAngajat
WHERE A.Nume = 'Militaru'
--13. Clienți cu cumpărări > media din august 2016
SELECT DISTINCT C.Denumire
FROM Vanzari V
INNER JOIN Clienti C ON V.IDClient = C.IDClient
WHERE (V.NrProduse * V.PretVanz) > (
SELECT AVG(NrProduse * PretVanz)
FROM Vanzari
WHERE DataVanz BETWEEN '2016-08-01' AND '2016-08-31')
--14. Produse vândute la mai mult de un client
SELECT P.Denumire
FROM Vanzari V
INNER JOIN Produse P ON V.IdProdus = P.IDProdus
GROUP BY P.IDProdus, P.Denumire
HAVING COUNT(DISTINCT V.IDClient) > 1
--15. Vânzări pe vânzător, produse și clienți, cu SUBTOTAURI (ROLLUP)
SELECT IDVanzator, IdProdus, IDClient, SUM(NrProduse * PretVanz) AS Valoare_Vanzare
FROM Vanzari
GROUP BY ROLLUP (IDVanzator, IdProdus, IDClient)