Documente Academic
Documente Profesional
Documente Cultură
PROIECT DE CURS
la disciplina: Baze de date
Tema: Proiectarea unei baze de date si implementarea ei in SQL Server
Chișinău 2019
Cuprins
1. Proiectarea logică a bazei de date................................................................................................................3
1.1 Analiza domeniului....................................................................................................................... 3
1.2 Descrierea atributelor.................................................................................................................... 3
1.3 Stabilirea dependențelor funcționale.............................................................................................4
1.4 Codificarea atributelor...................................................................................................................4
1.5 Sinteza schemei bazei de date.......................................................................................................4
1.6 Decodificarea atributelor.............................................................................................................11
1.7 Descrierea asocierilor între relații............................................................................................... 12
2. Implementarea bazei de date în SQL........................................................................................................13
2.1 Crearea bazei de date noi în T-SQL............................................................................................ 13
2.2 Crearea relațiilor și constrîngerilor de integritate în T-SQL....................................................... 13
2.3 Crearea cheilor externe................................................................................................................15
2.4 Crearea diagramei bazei de date..................................................................................................16
2.5 Popularea cu tupluri relațiile bazei de date................................................................................. 16
2.6 Crearea schemelor bazei de date.................................................................................................18
2.7 Crearea utilizatorilor................................................................................................................... 19
2.8 Crearea viziunilor........................................................................................................................20
2.9 Crearea sinonimilor.....................................................................................................................21
3. Interograrea bazei de date......................................................................................................................... 22
3.1 Crearea interogărilor ce exprima operațiile algebrei relaționale.................................................22
3.2 Crearea interogărilor cu funcții de agregare................................................................................27
3.3 Crearea interogărilor de grupare................................................................................................. 28
3.4 Subinterogări...............................................................................................................................29
3.5 Subinterogări în alte locuri decît în WHERE..............................................................................31
3.6 Crearea declanșatoarelor............................................................................................................. 32
3.7 Crearea procedurilor stocate........................................................................................................33
Concluzii.......................................................................................................................................................... 41
Anexa A - Scriptul T-SQL bazei de date Kanborad.....................................................................................42
2
1. Proiectarea logică a bazei de date
1.1 Analiza domeniului
Kanboard este o aplicație care oferă posibilitatea de a organiza sarcinile dumneavoastre în timp.
Kanboard vă permite să colaborați cu colegii din companie mai eficient. Aplicația dată folosește indirect
principiul de „Divide et Impera” – divizează și stăpînește. Dacă aveți un proiect amplu și nu știți de la ce să
vă apucați dar știți exact care sunt sarcinile în soluție vă poate veni Kanboard-ul. Aplicația dată în mare parte
utilizează bază de date, ca exemplu o sarcină reprezintă în sine o relație. În baza de date a aplicației Kanboard
sunt patru relații de bază: Utilizator, Proiect, Diviziune, Sarcina. Urmează să descrie atributele în parte.
3
1.3 Stabilirea dependențelor funcționale
În subcapitolul dat am să reprezint dependențele funcționale în baza de date a aplicației Kanboard.
FVezi={mai jos dependențele funcționale în mulțimea de dependețe F:
UtilizatorId → UtilizatorNume UtilizatorPrenume,
UtilizatorId → UtilizatorLoginUtilizatorParola,
UtilizatorLogin → UtilizatorId,
UtilizatorLogin → UtilizatorParola,
UtilizatorLogin → UtilizatorNumeUtilizatorPrenume,
UtilizatorIdUtilizatorLogin → UtilizatorNumeUtilizatorPrenume UtilizatorParola,
ProiectId → ProiectNume,
ProiectId → ProiectNume ProiectDescriere,
DiviziuneId → ProiectId,
ProiectIdProicteNumeProiectDescriere → ProiectTimpLimita, DiviziuneId → DiviziuneNume,
SarcinaId → DiviziuneId,
SarcinaIdSarcinaNumeSarcinaDescriere → SarcinaPrioritate,
SarcinaId → SarcinaDescriereSarcinaPrioritateDiviziuneId,
SarcinaId → SarcinaNume
}
1.4 Codificarea atributelor
F = { AUtilizînd→BC,A mulțimea→DE,D →deA,dependențeD→E,D
→funcționaleBC,AD→dinBCE,capitolulF→G,1F.3→șiGH,codareaJ→F,dinFGHcapitolul→I,J →1.2K,primesc:L→J, LMN → O,L → NOJ,L → M}
1.5 Sinteza schemei bazei de date
Algoritmul de sinteză
F = { AMulțimea→BC,A →deDE,dependențeD→A,Dfuncționale→E,D→ BC,reeșindAD →dinBCE,codificareaF→G,
Fatributelor:→GH,J→ F, FGH → I, J → K, L → J, LMN → O,L → NOJ,L → M}
4
→
F =1){ AAduc→B, Adependențe→C,A→D,funcționaleA→E,D→laA, D → :E, D → B, D → C, AD → B, AD → C, AD → E, F → G, F → H, FGH → I,J → F,J → K,L → J,LMN → O,L
→ N,L → O,L → M}
2) Adaug în mulțimea de dependențe funcționale o dependență de forma → , unde R este
F = { Auniversul→B,A→ bazeiC,A→deD,date,A→ iarE,DQ→nuA,aparțineD→E,Dlui→ R:B, D → C, AD → B, AD → C, AD → E, F → G, F
→ H, FGH → I,J → F,J → K,L → J,LMN → O,L → N,L → O,L → M,ABCDEFGHIJKLMNO → Q}
3) Construiesc acoperirea neredundantă pentru F:
∙ (A)F+\A→B =< A, AC, ACD, ACDE, ACDEB >; B aparține (A)+ rezultă: F = F\A → B.
∙ (A)F+\A→C =< A, AD, AD, ADE, ADEB, ADEBC >; C aparține (A)+ rezultă: F = F\A → C.
∙ (A)F+\A→E =< A, AD, ADE, ADEB, ADEBC >; E aparține (A)+ rezultă: F = F\A → E.
∙ (D)F+\D→E =< D, DA, DAB, DABC, DABCE >; E aparține (D)+ rezultă: F = F\D → E.
∙ (D)F+\D→B =< D, DA, DAC, DACB, DACBE >; B aparține (D)+ rezultă: F = F\D → B.
∙ (D)F+\D→C =< D, DA, DAB, DABC, DABCE >; C aparține (D)+ rezultă: F = F\D → C.
I nu aparține (FGH)+.
LMNOJKFGHI >;
∙ (A)F+ =< A, AD, ADB, ADBC, ADBCE >; B aparține (A)+ rezultă: F = F\AD → B ∪ A → B.
∙ (A)F+ =< A, AD, ADB, ADBC, ADBCE >; C aparține (A)+ rezultă: F = F\AD → C ∪ A → C.
∙ (A)F+ =< A, AD, ADB, ADBC, ADBCE >; E aparține (A)+ rezultă: F = F\AD → E ∪ A → E.
∙ (FG)F+ =< FG, FGH, FGHI >; I aparține (FG)+ rezultă : F = F\FGH → I ∪ FG → I.
∙ (F)F+ =< F, FG, FGH, FGHI >; I aparține (F)+ rezultă: F = F\FG → I ∪ F → I.
.
∙ (ABCDEFGHIJKLMN) + =< ABCDEFGHIJKLMN, ABCDEFGHIJKLMNO, ABCDEFGHIJKLMNOQ >;
∙ (ABCDEFGHIJKLM) + =
ABCDEFGHIJKLMNOQ >;
.
ABCDEFGHIJKLMNO, ABCDEFGHIJKLMNOQ >;
ABCDEFGHIJKLMNOQ >;
.
ABCDEFGHIJKLMNOQ >;
.
ABCDEFGHIJKLMNOQ >;
.
Q nu aparține (ABCDE)+
.
ABCDEFGHIJKLMNOQ >;
Q aparține (ABCDF) + rezultă: F = F\ABCDEF → Q ∪ ABCDF → Q
∙ (ABCF)+ =< ABCF, ABCDF, ABCDEF, ABCDEFG, ABCDEFGH, ABCDEFGHI, ABCDEFGHIJ, ABCDEFGHIJK,
F ABCDEFGHIJKL, ABCDEFGHIJKLM, ABCDEFGHIJKLMN, ABCDEFGHIJKLMNO, ABCDEFGHIJKLMNOQ
>;
7
Q aparține (ABCF)+ rezultă: F = F\ABCDF → Q ∪ ABCF → Q
∙ (ABF)+ =< ABF, ABCF, ABCDF, ABCDEF, ABCDEFG, ABCDEFGH,. ABCDEFGHI, ABCDEFGHIJ,
F ABCDEFGHIJK, ABCDEFGHIJKL, ABCDEFGHIJKLM, ABCDEFGHIJKLMN,
ABCDEFGHIJKLMNO, ABCDEFGHIJKLMNOQ >;
Q aparține (ABF)+ rezultă: F = F\ABCF → Q ∪ ABF → Q
∙ (AF)+ =< AF, ABF, ABCF, ABCDF, ABCDEF, ABCDEFG, ABCDEFGH,. ABCDEFGHI, ABCDEFGHIJ,
F ABCDEFGHIJK,ABCDEFGHIJKLMNO,ABCDEFGHIJKL,ABCDEFGHIJKLMNOQABCDEFGHIJKLM,>; ABCDEFGHIJKLMN,
Q aparține (AF)+ rezultă: F = F\ABF → Q ∪ AF → Q
.
∙ (F)+ =< F, FG, FGH, FGHI, FGHIJ, FGHIJK, FGHIJKL, FGHIJKLM, FGHIJKLMN, FGHIJKLMNO >; Q nu Faparține (F)+.
F = {A → D,D → A,AD → B,AD → C,AD → E,F → G,F → H,FGH → I,J → F,J → K,L → J,L → N,L → O,
L → M, ABCDEFGHIJKLMNO → Q }
F = { ARezultatul→D,D→ A,primit:A→B, A → C, A → E, F → G, F → H, F → I, J → F, J → K, L → J, L → N, L → O,
L→M,AF→Q}
→5) Formez clasele de echivalență pentru mulțimea de dependențe F:
∙ (A)+ =< A, AD, ADB, ADBC, ADBCE >;
→F
∙ (D)+F =< D, DA, DAB, DABC, DABCE >;
→
∙ (A)+ =< A, AB, ABD, ABDC, ABDCE >;
→F
∙ (A)+ =< A, AC, ACD, ACDB, ACDBE >;
→F
∙ (A)+F =< A, AE, AED, AEDB, AEDBC >;
→
∙ (F)F+
=< F, FI, FIG, FIGH >;
∙ (J)F+
=< J, JF, JFK, JFKG, JFKGH, JFKGHI >;
∙ (J)F+
=< J, JK, JKF, JKFG, JKFGH, JKFGHI >;
∙ (L)F+
=< L, LJ, LJN, LJNO, LJNOM, LJNOMK, LJNOMKF, LJNOMKFG, LJNOMKFGH, LJNOMKFGHI >;
∙ (L)F+
=< L, LN, LNO, LNOM, LNOMJ, LNOMJK, LNOMJKF, LNOMJKFG, LNOMJKFGH, LNOMJKFGHI >;
∙ (L)F+
=< L, LO, LON, LONM, LONMJ, LONMJK, LONMJKF, LONMJKFG, LONMJKFGH, LONMJKFGHI >;
∙ (L)F+ =< L, LM, LMN, LMNO, LMNOJ, LMNOJK, LMNOJKF, LMNOJKFG, LMNOJKFGH, LMNOJKFGHI >;
∙ (AF)+ =< AF, AFQ, AFQD, AFQDB, AFQDBC, AFQDBCE, AFQDBCEG, AFQDBCEGH, AFQDBCEGHI,
AFQDBCEGHIJKLNOM >;
F={A→D,D→A,A→B, A→C,A→E,F→G,F→H,F→I,J→F,J→K,L→J,L →N,L→ O,
Clasele de echivalență:
L→M,AF→Q}
E F={E(A)={A→D,D→A,A→B,A→C,A→E},
E(F)={F→G,F→H,F→I},
E(J)={J→K,J→F},
E(L)={L→N,L→O,L→M,L→J},
E(AF)={AF→Q }, }
=∪{→, → }
{∅},
{∅},
{∅},}
E F={E(A) ={A→B,A→C,A→E },
E(F) ={F→G,F→H,F→I},
E(J)= {J→K,J→F},
E(L) ={L→N,L→O,L→M,L→J},
+ +
F\A→C ∪ J
∙ (A) =< A, AB, ABC, ABCD >; E nu aparține (A) .
+ +
F\A→E ∪ J
∙ (F) =< F, FH, FHI >; G nu aparține (F) .
+ +
F\F→G ∪ J
∙ (F) =< F, FG, FGI >; H nu aparține (F) .
+ +
F\F→H ∪ J
∙ (F) =< F, FG, FGH >; I nu aparține (F) .
+ +
F\F→I ∪ J
∙ (J) =< J, JK >; F nu aparține (J) .
+ +
F\J→F ∪ J
∙ (J) =< J, JF, JFG, JFGH, JFGHI >; K nu aparține (J) .
+ +
F\J→K ∪ J
∙ (L) =< L, LN, LNO, LNOM >; J nu aparține (L) .
+ +
F\L→J ∪ J
∙ (L)+F\L→N ∪ J =< L, LO, LOM, LOMJ, LOMJK, LOMJKF, LOMJKFG, LOMJKFGH, LOMJKFGHI >; N nu aparține (L) +.
∙ (L)+F\L→O ∪ J =< L, LN, LNM, LNMJ, LNMJK, LNMJKF, LNMJKFG, LNMJKFGH, LNMJKFGHI >; O nu aparține (L) +.
∙ (AF)+ =< AF, AFD, AFDB, AFDBC, AFDBCE, AFDBCEG, AFDBCEGH, AFDBCEGHI, AFDBCEGHIJ,
F\AF→Q ∪ J AFDBCEGHIJK, AFDBCEGHIJKL, AFDBCEGHIJKLN, AFDBCEGHIJKLNO, AFDBCEGHIJKLNOM >;
Q nu aparține (AF)+.
10
8) Introduc J în F:
EF = { E (A)={ A → D, D → A, A → B, A
→ C,A→E},
E(F)={F→G,F→H,F→I}, E(J)={J→K,J→F},
→ J },
E(L)={L→N,L→O,L→M,L E(AF) = {AF
→ Q},}
R1 = {A,D,B,C,E}, K= {A,D};
9) Reeșind din punctul anterior formez schemele bazei de date și cheile primare:
R2 = {F,G,H,I}, K= {F};
R3 = {J,K.F}, K= {J};
R4 = { L,N,O,M,J }, K= {L};
R5 = {A,F}, K = {AF}.
10) Relațiile schemelor bazei de date:
1 *
ABDCE JKF
1
* * 1
AF 1
FGHI LNOMJ
11
K = { ProiectId. Proiect };
R ={{ Diviziune },Diviziune
3 Id Nume Id },
K= DiviziuneId ;
R4 ={{ SarcinaId},SarcinaNume, SarcinaPrioritate, SaricinaDescriere, DiviziuneId },
K= SarcinaId ;
R5 = { UtilizatorId, ProiectId },
K = { UtilizatorIdProiectId }.
1.7 Descrierea asocierilor între relații
Deci relația Utilizator are cinci atribute (id,nume, prenume, login,parola) și este întro legătură mulți la
mulți cu relația Proiect care are patru atribute (id,nume,descriere,timp), relația dată se realizează printr-o relație
adăugătoare UtilizatorProiect cu două atribute (idUtilizator, idProiect). Adica un utilizator poate lucra la mai
multe proiecte și un poriect poate fi realizat de mai mulți utilizatori. Diviziunile sunt dispărțiturile din fiecare
proiect care au o semnificație logică de container pentru sarcini, de exemplu prima diviziune este „Toate
sarcinile” în sunt prezente sarcinile noi create și cele care nu sunt încă prelucrate. O diviziune poate conține mai
multe sarcini, deci între diviziune și sarcini este o relație de unu la mulți. Un proiect poate conține trei diviziuni
„Toate sarcinile”, „În progress” și „Finisate”, deci relația între proiect și diviziuni este de unu la mulți.
12
2. Implementarea bazei de date în SQL
2.1 Crearea bazei de date noi în T-SQL
IF DB_ID('Kanboard') IS NOT NULL
DROP DATABASE [Kanboard];
13
CREATE TABLE [Utilizator] (
[Utilizator_Id] INT NOT NULL IDENTITY(1,1),
[Utilizator_Nume] VARCHAR(255),
[Utilizator_Prenume] VARCHAR(255),
[Utilizator_Login] VARCHAR(255) NOT NULL,
[Utilizator_Parola] VARCHAR(255) NOT NULL,
CONSTRAINT [CHECK_Utilizator_Id] CHECK([Utilizator_Id]>0),
CONSTRAINT [UNIQUE_Utilizator_Login]
UNIQUE([Utilizator_Login]), );
-- PROIECT
IF OBJECT_ID('Proiect','U') IS NOT NULL
DROP TABLE [Proiect];
-- DIVIZIUNE
IF OBJECT_ID('Diviziune','U') IS NOT NULL
DROP TABLE [Diviziune];
-- SARCINA
IF OBJECT_ID('Sarcina','U') IS NOT NULL
DROP TABLE [Sarcina];
14
Figura 2.2.1 – Rezultatul scriptului T-SQL
15
2.4 Crearea diagramei bazei de date
16
INSERT INTO Utilizator_Proiect (Utilizator_Id,Proiect_Id)
VALUES
(1,5),
(1,2),
(1,3),
(1,4),
(2,2),
(2,3),
(7,5),
(6,5),
(2,1),
(2,4),
(2,5),
(3,5),
(4,5);
17
Figura 2.5.1 – Rezultatul scriptului T-SQL
18
2.7 Crearea utilizatorilor
IF EXISTS(SELECT * FROM [master].[dbo].[syslogins] WHERE [name]='LOGIN_First'
AND [dbname]='Kanboard')
DROP LOGIN [LOGIN_First];
Verificarea utilizatorilor
SELECT SUSER_NAME(),USER_NAME();
EXEC AS USER = 'USER_First';
SELECT SUSER_NAME(),USER_NAME();
INSERT INTO [Proiecte].[Sarcina]
([Sarcina_Nume],[Sarcina_Descriere],[Sarcina_Prioritatea],[Diviziune_Id])
VALUES
('TEST1','TEST1',DEFAULT,2);
SELECT * FROM [Utilizatori].[Utilizator];
REVERT;
EXEC AS USER = 'USER_Second';
SELECT SUSER_NAME(),USER_NAME();
INSERT INTO [Proiecte].[Sarcina]
([Sarcina_Nume],[Sarcina_Descriere],[Sarcina_Prioritatea],[Diviziune_Id])
VALUES
('TEST2','TEST2',DEFAULT,2);
SELECT * FROM [Proiecte].[Proiect];
19
REVERT;
SELECT SUSER_NAME(),USER_NAME();
GO
CREATE VIEW [VIEW_First]
WITH SCHEMABINDING
AS
SELECT
[Relatii].[Utilizator_Proiect].[Utilizator_Id],
[Relatii].[Utilizator_Proiect].[Proiect_Id] FROM
[Relatii].[Utilizator_Proiect] GO
DROP TABLE [Relatii].[Utilizator_Proiect];
GO
CREATE VIEW [VIEW_Second]
AS
SELECT
[Proiecte].[Proiect].[Proiect_Nume],
[Proiecte].[Proiect].[Proiect_Descriere],
[Proiecte].[Proiect].[Proiect_TimpLimit]
FROM [Proiecte].[Proiect]
WHERE [Proiecte].[Proiect].[Proiect_Nume] LIKE 'NO%'
WITH CHECK OPTION
GO
UPDATE [VIEW_Second]
SET [VIEW_Second].[Proiect_Nume] = 'NU ESTE DENUMIRE'
WHERE [VIEW_Second].[Proiect_Nume] LIKE 'NO%';
20
Figura 2.8.1 – Rezultatul scriprului
21
3. Interograrea bazei de date
3.1 Crearea interogărilor ce exprima operațiile algebrei relaționale
- uniunea
- Sa se afiseze toate sarcinile proiectului sub denumirea Personal
project. SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'TOATE
SARCINILE') UNION ALL
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'IN PROGRESS')
UNION ALL
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'TERMINATE');
- intersectie
- Sa se afiseze proiectele comune a utilizatorului Osipov Victor si Mihail
Urmanshi SELECT * FROM [Pro]
WHERE [Pro].[Proiect_Id] = ( SELECT
[UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Osipov' AND [U].[Utilizator_Prenume] = 'Victor')
INTERSECT
SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Urmanschi' AND [U].[Utilizator_Prenume] = 'Mihail'));
22
Figura 3.1.2 – Intersecția
- diferenta
- Sa se afiseze identificatoarele proiectelor care apartin lui Osipov Victor si nu lui Vovc
Artiom SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Osipov' AND [U].[Utilizator_Prenume] = 'Victor')
EXCEPT
SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Vovc' AND [U].[Utilizator_Prenume] = 'Artiom');
- produsul cartezian
- Sa se afiseze produsul cartezian al tuturor proiectelor si a tuturor
utilizatorilor SELECT [U].*,[Pro].* FROM [Pro] CROSS JOIN [U]
ORDER BY [U].[Utilizator_Id] ASC;
- complimentul activ
- Sa se afiseze complimentul activ al relatiei Diviziune
SELECT * FROM (
(SELECT [Div].[Diviziune_Id] FROM [Div]) AS [DivId]
CROSS JOIN
(SELECT [Div].[Diviziune_Nume] FROM [Div]) AS [DivNume]
CROSS JOIN
(SELECT [Div].[Proiect_Id] FROM [Div]) AS [DivProiect])
EXCEPT
SELECT * FROM [Div];
23
Figura 3.1.5 – Compliment activ
- teta jonctiune
- Sa se afiseze divizunea care are sarcina cu denumirea sa inceapa cu
Setarea SELECT * FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id] AND [Sar].[Sarcina_Nume] LIKE 'Setarea %'
- jonctiune naturala
- Sa se afiseze proiectele si utilizatorii dezovoltate de fiecare
utilizator SELECT [UP].[Proiect_Id],[U].* FROM [UP] JOIN [U]
ON [UP].[Utilizator_Id] = [U].[Utilizator_Id];
- jonctiunea externa
- jonctionea left join
- Sa se afiseze toate diviziunile si sarcinile prin left
join SELECT * FROM [Div] LEFT OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id]
24
Figura 3.1.8 – Joncțiune stînga
- semijonctiunea
- Sa se reprezinte diviziunile care au cel putin o
sarcina SELECT DISTINCT [Div].* FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id]
25
Figura 3.1.11 – Semijoncțiune
- divizarea
- Sa se prezite divizarea fara pierderi pentru relatia Diviziuni
SELECT * FROM
(SELECT [Div].[Diviziune_Id],[Div].[Diviziune_Nume] FROM [Div]) AS
[D1] JOIN
(SELECT [Div].[Diviziune_Id],[Div].[Proiect_Id] FROM [Div]) AS
[D2] ON [D1].[Diviziune_Id] = [D2].[Diviziune_Id];
26
3.2 Crearea interogărilor cu funcții de agregare
- Sa se afiseze proiectul cu cele mai putine
sarcini SELECT [SARCOUNTSUM].[Proiect_Id] FROM (
SELECT [SARCOUNT].[Proiect_Id],SUM([SARCOUNT].[NR_Sarcini]) AS [SUM_SARCINNI] FROM
( SELECT [Div].[Proiect_Id],COUNT([Sar].[Sarcina_Id]) AS [NR_Sarcini]
FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id] )
AS [SARCOUNT]
GROUP BY [SARCOUNT].[Proiect_Id]
) AS [SARCOUNTSUM]
WHERE [SARCOUNTSUM].[SUM_SARCINNI] = (SELECT MIN([SARCOUNTSUMD].[SUM_SARCINNI]) FROM(
SELECT [SARCOUNTD].[Proiect_Id],SUM([SARCOUNTD].[NR_Sarcini]) AS [SUM_SARCINNI] FROM
( SELECT [Div].[Proiect_Id],COUNT([Sar].[Sarcina_Id]) AS [NR_Sarcini]
FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id] )
AS [SARCOUNTD]
GROUP BY [SARCOUNTD].[Proiect_Id]
) AS
[SARCOUNTSUMD] );
27
Figura 3.2.2 – Rezultatul interogării
28
HAVING COUNT([Div].[Proiect_Id]) <= 2;
3.4 Subinterogări
- IN
- Sa se selecteze untilizatorii care au macar un proiect
29
SELECT * FROM [U]
WHERE [U].[Utilizator_Id] IN (SELECT [UP].[Utilizator_Id] FROM [UP])
- ANY
- Din toate sarcinile existente in baza de date de afisat sarcinile care au proprietatea mai mare
- decit alta sarcina
SELECT * FROM [Sar]
WHERE [Sar].[Sarcina_Prioritatea]>ANY(SELECT [Sar].[Sarcina_Prioritatea] FROM [Sar])
- ALL
- Sa se afiseze Diviziunea cu cele mai multe sarcini din toate proiectele
SELECT * FROM (
SELECT [Div].[Diviziune_Id],COUNT([Sar].[Sarcina_Id]) AS
[NR_Sarcini] FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id]) AS [DI]
WHERE [DI].[NR_Sarcini] >= ALL (SELECT [DID].[NR_Sarcini] FROM
( SELECT [Div].[Diviziune_Id],COUNT([Sar].[Sarcina_Id]) AS
[NR_Sarcini] FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id] )
AS [DID]);
30
Figura 3.4.3 – Rezultatul interogării
- EXISTS
- Sa se prezinte care proiecte sunt
active SELECT * FROM [Pro] AS [P]
WHERE EXISTS (SELECT * FROM [UP] WHERE [UP].[Proiect_Id]=[P].[Proiect_Id]);
- Sa se selecteze sarcinile din toate proiectele care au prioritatea mai mare decit 1 si mai
mic decit 3
SELECT * FROM
( SELECT * FROM [Sar]
31
WHERE [Sar].[Sarcina_Prioritatea]>1
) AS [Sa]
WHERE [Sa].[Sarcina_Prioritatea]<3;
GO
UPDATE [U]
SET [Utilizator_Nume] = 'NO NAME'
WHERE [Utilizator_Prenume] = 'Artiom';
GO
CREATE TRIGGER [TRIGGER_Utilizator_Delete]
ON [Proiecte].[Sarcina]
FOR DELETE
AS
IF OBJECT_ID('temodb..#table') IS NOT NULL
DROP TABLE #table;
32
Figura 3.6.1 – Rezultatul scriptului T-SQL
- De comparat timpurile limita fiecarui proiect cu cel mai mare timpul limita a proiectelor
IF OBJECT_ID('TIMPURILE_LIMITA','P') IS NOT NULL
DROP PROCEDURE [TIMPURILE_LIMITA];
GO
CREATE PROCEDURE [TIMPURILE_LIMITA]
AS
SELECT [Pro].*,(SELECT MAX([Pro].[Proiect_TimpLimit]) FROM [Pro]) FROM [Pro];
GO
- Din toate sarcinile existente in baza de date de afisat sarcinile care au proprietatea mai mare
33
-- decit alta sarcina
IF OBJECT_ID('CEA_MAI_MARE_PRIORITATE','P') IS NOT
NULL DROP PROCEDURE [CEA_MAI_MARE_PRIORITATE]; GO
34
SELECT [Div].[Proiect _Id],COUNT([Sar].[Sarcina_Id]) AS
[NR_Sarcini] FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id]
HAVING COUNT([Sar].[Sarcina_Id])<5
) AS [SARCOUNT]
GROUP BY [SARCOUNT].[Proiect_Id]
) AS [SARCOUNTAVG]
WHERE [SARCOUNTAVG].[AVG_SARCINNI] = (SELECT MIN([SARCOUNTAVGD].[AVG_SARCINNI]) FROM(
SELECT [SARCOUNTD].[Proiect_Id],AVG([SARCOUNTD].[NR_Sarcini]) AS [AVG_SARCINNI] FROM
( SELECT [Div].[Proiect_Id],COUNT([Sar].[Sarcina_Id]) AS [NR_Sarcini]
FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id]
HAVING COUNT([Sar].[Sarcina_Id])<5
) AS [SARCOUNTD]
GROUP BY [SARCOUNTD].[Proiect_Id]
) AS [SARCOUNTAVGD]
);
GO
35
GROUP BY [SARCOUNT].[Proiect_Id]
) AS [SARCOUNTSUM]
WHERE [SARCOUNTSUM].[SUM_SARCINNI] = (SELECT MAX([SARCOUNTSUMD].[SUM_SARCINNI]) FROM(
SELECT [SARCOUNTD].[Proiect_Id],SUM([SARCOUNTD].[NR_Sarcini]) AS [SUM_SARCINNI] FROM
( SELECT [Div].[Proiect_Id],COUNT([Sar].[Sarcina_Id]) AS [NR_Sarcini]
FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id]
) AS [SARCOUNTD]
GROUP BY [SARCOUNTD].[Proiect_Id]
) AS [SARCOUNTSUMD]
);
GO
- uniunea
- Sa se afiseza toate sarcinile proiectului sub denumirea Personal project.
IF OBJECT_ID('UNION','P') IS NOT NULL
DROP PROCEDURE [UNION];
GO
CREATE PROCEDURE [UNION]
AS
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] =
'TOATE SARCINILE')
UNION ALL
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'IN PROGRESS')
UNION ALL
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
36
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'TERMINATE');
GO
- intersectie
- Sa se afiseze proiectele comune a utilizatorului Osipov Victor si Mihail
Urmanshi IF OBJECT_ID('INTERSECT','P') IS NOT NULL
DROP PROCEDURE
[INTERSECT]; GO
CREATE PROCEDURE
[INTERSECT] AS
SELECT * FROM [Pro]
WHERE [Pro].[Proiect_Id] = ( SELECT
[UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Osipov' AND [U].[Utilizator_Prenume] = 'Victor')
37
- teta jonctiune
- Sa se afiseze divizunea care are sarcina cu denumirea sa inceapa cu
Setarea IF OBJECT_ID('THETAJOIN','P') IS NOT NULL
DROP PROCEDURE
[THETAJOIN]; GO
CREATE PROCEDURE
[THETAJOIN] AS
SELECT * FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id] AND [Sar].[Sarcina_Nume] LIKE 'Setarea %';
GO
- jonctiune naturala
- Sa se afiseze proiectele si utilizatorii dezovoltate de fiecare utilizator
IF OBJECT_ID('[NATURALJOIN]','P') IS NOT NULL
DROP PROCEDURE [NATURALJOIN];
GO
CREATE PROCEDURE [NATURALJOIN]
AS
SELECT [UP].[Proiect_Id],[U].* FROM [UP] JOIN [U]
ON [UP].[Utilizator_Id] = [U].[Utilizator_Id];
GO
- jonctiunea externa
- jonctionea left join
- Sa se afiseze toate diviziunile si sarcinile prin left
join IF OBJECT_ID('LEFTJOIN','P') IS NOT NULL
DROP PROCEDURE
[LEFTJOIN]; GO
CREATE PROCEDURE
[LEFTJOIN] AS
SELECT * FROM [Div] LEFT OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id];
GO
- jonctionea right join
- Sa se afiseze toate diviziunile si sarcinile prin right
join IF OBJECT_ID('RIGHTJOIN','P') IS NOT NULL
DROP PROCEDURE
[RIGHTJOIN]; GO
CREATE PROCEDURE
[RIGHTJOIN] AS
SELECT * FROM [Div] RIGHT OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id];
GO
- jonctionea full join
- Sa se afiseze toate diviziunile si sarcinile prin full
join IF OBJECT_ID('FULLJOIN','P') IS NOT NULL
DROP PROCEDURE
[FULLJOIN]; GO
CREATE PROCEDURE
[FULLJOIN] AS
SELECT * FROM [Div] FULL OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id];
GO
- semijonctiunea
- Sa se reprezinte diviziunile care au cel putin o sarcina
IF OBJECT_ID('SEMIJONCTIUNEA','P') IS NOT NULL
DROP PROCEDURE [SEMIJONCTIUNEA];
GO
CREATE PROCEDURE [SEMIJONCTIUNEA]
AS
SELECT DISTINCT [Div].* FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id];
GO
38
- divizarea
- Sa se prezite divizarea fara pierderi pentru relatia Diviziuni IF
OBJECT_ID('DIVIZAREA_FARA_PIERDERI','P') IS NOT NULL
DROP PROCEDURE
[DIVIZAREA_FARA_PIERDERI]; GO
CREATE PROCEDURE
[DIVIZAREA_FARA_PIERDERI] AS
SELECT * FROM
(SELECT [Div].[Diviziune_Id],[Div].[Diviziune_Nume] FROM [Div]) AS
[D1] JOIN
(SELECT [Div].[Diviziune_Id],[Div].[Proiect_Id] FROM [Div]) AS
[D2] ON [D1].[Diviziune_Id] = [D2].[Diviziune_Id];
GO
- Sa se prezinte divizarea cu pierderi pentru relatia Diviziuni
IF OBJECT_ID('DIVIZAREA_CU_PIERDERI','P') IS NOT
NULL DROP PROCEDURE [DIVIZAREA_CU_PIERDERI]; GO
EXEC [UNION];
EXEC [INTERSECT];
EXEC [DIFFERENCE];
EXEC [PRODUSCARTEZIAN];
EXEC [COMPLIMENTACTIVE];
EXEC [THETAJOIN];
EXEC [NATURALJOIN];
EXEC [LEFTJOIN];
EXEC [RIGHTJOIN];
EXEC [FULLJOIN];
EXEC [SEMIJONCTIUNEA];
EXEC [DIVIZAREA_FARA_PIERDERI];
EXEC [DIVIZAREA_CU_PIERDERI];
EXEC [SARCINI_PRIORITATE] @MIN = 1,@MAX = 3;
EXEC [TIMPURILE_LIMITA];
EXEC [AU_PROIECT];
EXEC [CEA_MAI_MARE_PRIORITATE];
EXEC [DIV_CU_CELE_MAI_MULTE_SARCINI];
EXEC [CARE_PROIECTE_SUNT_ACTIVE];
EXEC [DIV_PROCESARE];
EXEC [PRO_CEA_MAI_MICA_SM];
EXEC [PRO_CEA_MAI_PUTINE_SARCINI];
EXEC [PRO_CEA_MAI_MULTE_SARCINI];
EXEC [PRO_CEA_MAI_MARE_SM];
39
Figura 3.7.1 – Rezultatul scriptului T-SQL
40
Concluzii
O bază de date este un instrument pentru colectarea și organizarea informațiilor. Bazele de date pot
stoca informații despre persoane, produse, comenzi sau orice altceva. Multe baze de date încep sub formă de
liste într-un editor de text sau într-o foaie de calcul. Pe măsură ce lista crește, încep să apară redundanțe și
inconsistențe în datele prezente. Datele devin greu de înțeles în formă de listă, iar posibilitățile de a căuta și a
extrage subseturi de date pentru revizuire sunt limitate. Odată ce încep să apară aceste probleme, este o idee
bună să se transfere datele într-o bază de date creată de un sistem de gestionare al bazelor de date.
În acest proiect am analizat aplicația Kanboard care oferă posibilitatea de a organiza sarcinile pe care
le-am analizat în timp. Aceasta aplicatie kanboard permite să colaboram cu colegii din companie mai eficient.
Aceasta aplicatie folosește indirect principiul de „Divide et Impera” – divizează și stăpînește. Dacă avem un
proiect amplu și nu știm de la ce să ne apucam dar știm exact care sunt sarcinile în soluție ne poate veni
Kanboard-ul in ajutor. Aplicația dată în mare parte utilizează bază de date, ca exemplu o sarcină reprezintă în
sine o relație. În baza de date a aplicației Kanboard sunt patru relații de bază: Utilizator, Proiect, Diviziune,
Sarcina, ceea ce am reprezentat in aceasta lucrare.
41
Anexa A - Scriptul T-SQL bazei de date Kanborad
USE [master];
GO
--
____________________________________________________________________________________________________
___
- _______________________________________________ 2.1
___________________________________________________
-
____________________________________________________________________________________________________
___
--
____________________________________________________________________________________________________
___
- _______________________________________________ 2.2
___________________________________________________
-
____________________________________________________________________________________________________
___
-- UTLIZATOR
IF OBJECT_ID('Utilizator','U') IS NOT NULL
DROP TABLE [Utilizator];
-- PROIECT
42
IF OBJECT_ID('Proiect','U') IS NOT NULL
DROP TABLE [Proiect];
-- DIVIZIUNE
IF OBJECT_ID('Diviziune','U') IS NOT NULL
DROP TABLE [Diviziune];
-- SARCINA
IF OBJECT_ID('Sarcina','U') IS NOT NULL
DROP TABLE [Sarcina];
--
____________________________________________________________________________________________________
___
- _______________________________________________ 2.4
___________________________________________________
-
____________________________________________________________________________________________________
___
43
CONSTRAINT [FK_UTILIZATORID] FOREIGN KEY([Utilizator_Id])
REFERENCES [Utilizator]([Utilizator_Id]),
CONSTRAINT [FK_PROIECTID] FOREIGN KEY([Proiect_Id]) REFERENCES [Proiect]([Proiect_Id]);
--
____________________________________________________________________________________________________
___
- _______________________________________________ 2.5
___________________________________________________
-
____________________________________________________________________________________________________
___
--
____________________________________________________________________________________________________
___
- _______________________________________________ 2.6
___________________________________________________
-
____________________________________________________________________________________________________
___
44
INSERT INTO Utilizator_Proiect (Utilizator_Id,Proiect_Id)
VALUES
(1,5),
(1,2),
(1,3),
(1,4),
(2,2),
(2,3),
(7,5),
(6,5),
(2,1),
(2,4),
(2,5),
(3,5),
(4,5);
--
____________________________________________________________________________________________________
___
- _______________________________________________ 2.7
___________________________________________________
-
____________________________________________________________________________________________________
___
45
IF EXISTS(SELECT SYS.schemas.name FROM SYS.schemas WHERE
SYS.schemas.name='Utilizatori') DROP SCHEMA [Utilizatori];
GO
CREATE SCHEMA [Utilizatori];
GO
ALTER SCHEMA [Utilizatori] TRANSFER [dbo].[Utilizator];
GO
IF EXISTS(SELECT SYS.schemas.name FROM SYS.schemas WHERE SYS.schemas.name='Proiecte')
DROP SCHEMA [Proiecte];
GO
CREATE SCHEMA [Proiecte];
GO
ALTER SCHEMA [Proiecte] TRANSFER [dbo].[Proiect];
ALTER SCHEMA [Proiecte] TRANSFER [dbo].[Diviziune];
ALTER SCHEMA [Proiecte] TRANSFER [dbo].[Sarcina];
GO
IF EXISTS(SELECT SYS.schemas.name FROM SYS.schemas WHERE
SYS.schemas.name='Relatii') DROP SCHEMA [Relatii];
GO
CREATE SCHEMA [Relatii];
GO
ALTER SCHEMA [Relatii] TRANSFER [dbo].[Utilizator_Proiect];
GO
--
____________________________________________________________________________________________________
___
- _______________________________________________ 2.8
___________________________________________________
-
____________________________________________________________________________________________________
___
46
EXEC SP_ADDROLEMEMBER 'db_datawriter', 'USER_Second';
SELECT SUSER_NAME(),USER_NAME();
EXEC AS USER = 'USER_First';
SELECT SUSER_NAME(),USER_NAME();
INSERT INTO [Proiecte].[Sarcina]
([Sarcina_Nume],[Sarcina_Descriere],[Sarcina_Prioritatea],[Diviziune_Id])
VALUES
('TEST1','TEST1',DEFAULT,2);
SELECT * FROM [Utilizatori].[Utilizator];
REVERT;
EXEC AS USER = 'USER_Second';
SELECT SUSER_NAME(),USER_NAME();
INSERT INTO [Proiecte].[Sarcina]
([Sarcina_Nume],[Sarcina_Descriere],[Sarcina_Prioritatea],[Diviziune_Id])
VALUES
('TEST2','TEST2',DEFAULT,2);
SELECT * FROM [Proiecte].[Proiect];
REVERT;
SELECT SUSER_NAME(),USER_NAME();
--
____________________________________________________________________________________________________
___
- _______________________________________________ 2.9
___________________________________________________
-
____________________________________________________________________________________________________
___
GO
CREATE VIEW [VIEW_First]
WITH SCHEMABINDING
AS
SELECT
[Relatii].[Utilizator_Proiect].[Utilizator_Id],
[Relatii].[Utilizator_Proiect].[Proiect_Id]
FROM [Relatii].[Utilizator_Proiect]
GO
DROP TABLE [Relatii].[Utilizator_Proiect];
GO
CREATE VIEW [VIEW_Second]
AS
SELECT
[Proiecte].[Proiect].[Proiect_Nume],
[Proiecte].[Proiect].[Proiect_Descriere],
[Proiecte].[Proiect].[Proiect_TimpLimit]
FROM [Proiecte].[Proiect]
WHERE [Proiecte].[Proiect].[Proiect_Nume] LIKE 'NO%'
WITH CHECK OPTION
GO
UPDATE [VIEW_Second]
SET [VIEW_Second].[Proiect_Nume] = 'NU ESTE DENUMIRE'
47
WHERE [VIEW_Second].[Proiect_Nume] LIKE 'NO%';
--
____________________________________________________________________________________________________
___
- _______________________________________________ 2.10
__________________________________________________
-
____________________________________________________________________________________________________
___
--
____________________________________________________________________________________________________
___
- _______________________________________________ END CAP 2
_____________________________________________
-
____________________________________________________________________________________________________
___
--
____________________________________________________________________________________________________
___
- _______________________________________________ 3.1
___________________________________________________
-
____________________________________________________________________________________________________
___
- uniunea
- Sa se afiseza toate sarcinile proiectului sub denumirea Personal project.
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'TOATE
SARCINILE') UNION ALL
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
48
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'IN PROGRESS')
UNION ALL
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'TERMINATE');
- intersectie
- Sa se afiseze proiectele comune a utilizatorului Osipov Victor si Mihail
Urmanshi SELECT * FROM [Pro]
WHERE [Pro].[Proiect_Id] = ( SELECT
[UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Osipov' AND [U].[Utilizator_Prenume] = 'Victor')
INTERSECT
SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Urmanschi' AND [U].[Utilizator_Prenume] = 'Mihail'));
- diferenta
- Sa se afiseze identificatoarele proiectelor care apartin lui Osipov Victor si nu lui Vovc
Artiom SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Osipov' AND [U].[Utilizator_Prenume] = 'Victor')
EXCEPT
SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Vovc' AND [U].[Utilizator_Prenume] = 'Artiom');
- produsul cartezian
- Sa se afiseze produsul cartezian al tuturor proiectelor si a tuturor utilizatorilor
- complimentul activ
- Sa se afiseze complimentul activ al relatiei Diviziune
SELECT * FROM (
(SELECT [Div].[Diviziune_Id] FROM [Div]) AS [DivId]
CROSS JOIN
(SELECT [Div].[Diviziune_Nume] FROM [Div]) AS [DivNume]
CROSS JOIN
(SELECT [Div].[Proiect_Id] FROM [Div]) AS [DivProiect])
EXCEPT
SELECT * FROM [Div];
- teta jonctiune
- Sa se afiseze divizunea care are sarcina cu denumirea sa inceapa cu
Setarea SELECT * FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id] AND [Sar].[Sarcina_Nume] LIKE 'Setarea %'
- jonctiune naturala
- Sa se afiseze proiectele si utilizatorii dezovoltate de fiecare utilizator
- jonctiunea externa
- jonctionea left join
- Sa se afiseze toate diviziunile si sarcinile prin left
join SELECT * FROM [Div] LEFT OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id]
- jonctionea right join
- Sa se afiseze toate diviziunile si sarcinile prin right
join SELECT * FROM [Div] RIGHT OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id]
- jonctionea full join
- Sa se afiseze toate diviziunile si sarcinile prin full join
SELECT * FROM [Div] FULL OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id]
49
- semijonctiunea
- Sa se reprezinte diviziunile care au cel putin o
sarcina SELECT DISTINCT [Div].* FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id]
- divizarea
- Sa se prezite divizarea fara pierderi pentru relatia Diviziuni
SELECT * FROM
(SELECT [Div].[Diviziune_Id],[Div].[Diviziune_Nume] FROM [Div]) AS
[D1] JOIN
(SELECT [Div].[Diviziune_Id],[Div].[Proiect_Id] FROM [Div]) AS
[D2] ON [D1].[Diviziune_Id] = [D2].[Diviziune_Id];
- Sa se prezinte divizarea cu pierderi pentru relatia Diviziuni
SELECT * FROM
(SELECT [Div].[Proiect_Id],[Div].[Diviziune_Nume] FROM [Div]) AS [D1]
JOIN
(SELECT [Div].[Proiect_Id],[Div].[Diviziune_Id] FROM [Div]) AS [D2]
ON [D1].[Proiect_Id] = [D2].[Proiect_Id];
--
____________________________________________________________________________________________________
___
- _______________________________________________ 3.2
___________________________________________________
-
____________________________________________________________________________________________________
___
50
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id]
) AS [SARCOUNTD]
GROUP BY [SARCOUNTD].[Proiect_Id]
) AS [SARCOUNTSUMD]
);
- Selecteaza proiectul cu cea mai mare suma medie de
sarcini SELECT [SARCOUNTAVG].[Proiect_Id] FROM (
SELECT [SARCOUNT].[Proiect_Id],AVG([SARCOUNT].[NR_Sarcini]) AS [AVG_SARCINNI] FROM
( SELECT [Div].[Proiect_Id],COUNT([Sar].[Sarcina_Id]) AS [NR_Sarcini]
FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id] )
AS [SARCOUNT]
GROUP BY [SARCOUNT].[Proiect_Id]
) AS [SARCOUNTAVG]
WHERE [SARCOUNTAVG].[AVG_SARCINNI] = (SELECT MAX([SARCOUNTAVGD].[AVG_SARCINNI]) FROM(
SELECT [SARCOUNTD].[Proiect_Id],AVG([SARCOUNTD].[NR_Sarcini]) AS [AVG_SARCINNI] FROM
( SELECT [Div].[Proiect_Id],COUNT([Sar].[Sarcina_Id]) AS [NR_Sarcini]
FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id] )
AS [SARCOUNTD]
GROUP BY [SARCOUNTD].[Proiect_Id]
) AS
[SARCOUNTAVGD] );
--
____________________________________________________________________________________________________
___
- _______________________________________________ 3.3
___________________________________________________
-
____________________________________________________________________________________________________
___
51
HAVING COUNT([Sar].[Sarcina_Id])<5
) AS [SARCOUNTD]
GROUP BY [SARCOUNTD].[Proiect_Id]
) AS [SARCOUNTAVGD]
);
--
____________________________________________________________________________________________________
___
- _______________________________________________ 3.4
___________________________________________________
-
____________________________________________________________________________________________________
___
- IN
- Sa se selecteze untilizatorii care au macar un proiect
SELECT * FROM [U]
WHERE [U].[Utilizator_Id] IN (SELECT [UP].[Utilizator_Id] FROM [UP])
- ANY
- Din toate sarcinile existente in baza de date de afisat sarcinile care au proprietatea mai mare
- decit alta sarcina
SELECT * FROM [Sar]
WHERE [Sar].[Sarcina_Prioritatea]>ANY(SELECT [Sar].[Sarcina_Prioritatea] FROM [Sar])
- ALL
- Sa se afiseze Diviziunea cu cele mai multe sarcini din toate proiectele
SELECT * FROM (
SELECT [Div].[Diviziune_Id],COUNT([Sar].[Sarcina_Id]) AS
[NR_Sarcini] FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id]) AS [DI]
WHERE [DI].[NR_Sarcini] >= ALL (SELECT [DID].[NR_Sarcini] FROM
( SELECT [Div].[Diviziune_Id],COUNT([Sar].[Sarcina_Id]) AS
[NR_Sarcini] FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id] )
AS [DID]);
- EXISTS
- Sa se prezinte care proiecte sunt active
SELECT * FROM [Pro] AS [P]
WHERE EXISTS (SELECT * FROM [UP] WHERE [UP].[Proiect_Id]=[P].[Proiect_Id]);
--
____________________________________________________________________________________________________
___
- _______________________________________________ 3.5
___________________________________________________
-
____________________________________________________________________________________________________
___
- De comparat timpurile limita fiecarui proiect cu cel mai mare timpul limita a proiectelor
SELECT [Pro].*,(SELECT MAX([Pro].[Proiect_TimpLimit]) FROM [Pro]) FROM [Pro];
- Sa se selecteze sarcinile din toate proiectele care au prioritatea mai mare decit 1 si mai
mic decit 3
SELECT * FROM
( SELECT * FROM [Sar]
52
WHERE [Sar].[Sarcina_Prioritatea]>1
) AS [Sa]
WHERE [Sa].[Sarcina_Prioritatea]<3;
--
____________________________________________________________________________________________________
___
- _______________________________________________ 3.6
___________________________________________________
-
____________________________________________________________________________________________________
___
GO
CREATE TRIGGER [TRIGGER_Utilizator]
ON [Utilizatori].[Utilizator]
FOR UPDATE
AS
IF UPDATE([Utilizator_Nume])
BEGIN
IF EXISTS (SELECT * FROM inserted WHERE LOWER([Utilizator_Nume]) = 'no name')
ROLLBACK;
END
GO
UPDATE [U]
SET [Utilizator_Nume] = 'NO NAME'
WHERE [Utilizator_Prenume] = 'Artiom';
GO
CREATE TRIGGER [TRIGGER_Utilizator_Delete]
ON [Proiecte].[Sarcina]
FOR DELETE
AS
IF OBJECT_ID('temodb..#table') IS NOT NULL
DROP TABLE #table;
--
____________________________________________________________________________________________________
___
- _______________________________________________ 3.7
___________________________________________________
-
____________________________________________________________________________________________________
___
53
- Sa se selecteze sarcinile din toate proiectele care au prioritatea mai mare decit 1 si mai
mic decit 3
IF OBJECT_ID('SARCINI_PRIORITATE','P') IS NOT
NULL DROP PROCEDURE [SARCINI_PRIORITATE];
GO
CREATE PROCEDURE [SARCINI_PRIORITATE]
@MIN INT = 1,
@MAX INT = 3
AS
SELECT * FROM
( SELECT * FROM [Sar]
WHERE [Sar].[Sarcina_Prioritatea]>@MIN )
AS [Sa]
WHERE [Sa].[Sarcina_Prioritatea]<@MAX;
GO
- De comparat timpurile limita fiecarui proiect cu cel mai mare timpul limita a proiectelor
IF OBJECT_ID('TIMPURILE_LIMITA','P') IS NOT NULL
DROP PROCEDURE [TIMPURILE_LIMITA];
GO
CREATE PROCEDURE [TIMPURILE_LIMITA]
AS
SELECT [Pro].*,(SELECT MAX([Pro].[Proiect_TimpLimit]) FROM [Pro]) FROM [Pro];
GO
- Din toate sarcinile existente in baza de date de afisat sarcinile care au proprietatea mai mare
- decit alta sarcina
IF OBJECT_ID('CEA_MAI_MARE_PRIORITATE','P') IS NOT
NULL DROP PROCEDURE [CEA_MAI_MARE_PRIORITATE]; GO
54
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id] )
AS [DID]);
GO
55
CREATE PROCEDURE [PRO_CEA_MAI_PUTINE_SARCINI]
AS
SELECT [SARCOUNTSUM].[Proiect_Id] FROM (
SELECT [SARCOUNT].[Proiect_Id],SUM([SARCOUNT].[NR_Sarcini]) AS [SUM_SARCINNI] FROM
( SELECT [Div].[Proiect_Id],COUNT([Sar].[Sarcina_Id]) AS [NR_Sarcini]
FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id] )
AS [SARCOUNT]
GROUP BY [SARCOUNT].[Proiect_Id]
) AS [SARCOUNTSUM]
WHERE [SARCOUNTSUM].[SUM_SARCINNI] = (SELECT MIN([SARCOUNTSUMD].[SUM_SARCINNI]) FROM(
SELECT [SARCOUNTD].[Proiect_Id],SUM([SARCOUNTD].[NR_Sarcini]) AS [SUM_SARCINNI] FROM
( SELECT [Div].[Proiect_Id],COUNT([Sar].[Sarcina_Id]) AS [NR_Sarcini]
FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id] )
AS [SARCOUNTD]
GROUP BY [SARCOUNTD].[Proiect_Id]
) AS [SARCOUNTSUMD]
);
GO
56
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id]
) AS [SARCOUNT]
GROUP BY [SARCOUNT].[Proiect_Id]
) AS [SARCOUNTAVG]
WHERE [SARCOUNTAVG].[AVG_SARCINNI] = (SELECT MAX([SARCOUNTAVGD].[AVG_SARCINNI]) FROM(
SELECT [SARCOUNTD].[Proiect_Id],AVG([SARCOUNTD].[NR_Sarcini]) AS [AVG_SARCINNI] FROM
( SELECT [Div].[Proiect_Id],COUNT([Sar].[Sarcina_Id]) AS [NR_Sarcini]
FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id] = [Sar].[Diviziune_Id]
GROUP BY [Div].[Diviziune_Id],[Div].[Proiect_Id]
) AS [SARCOUNTD]
GROUP BY [SARCOUNTD].[Proiect_Id]
) AS [SARCOUNTAVGD]
);
GO
- uniunea
- Sa se afiseza toate sarcinile proiectului sub denumirea Personal
project. IF OBJECT_ID('UNION','P') IS NOT NULL
DROP PROCEDURE
[UNION]; GO
CREATE PROCEDURE
[UNION] AS
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] =
'TOATE SARCINILE')
UNION ALL
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'IN PROGRESS')
UNION ALL
SELECT * FROM [Sar]
WHERE [Sar].[Diviziune_Id] IN (SELECT [Div].[Diviziune_Id] FROM [Div]
WHERE [Div].[Proiect_Id] IN (SELECT [Pro].[Proiect_Id] FROM [Pro]
WHERE [Pro].[Proiect_Nume] = 'Personal project')AND [Div].[Diviziune_Nume] = 'TERMINATE');
GO
- intersectie
- Sa se afiseze proiectele comune a utilizatorului Osipov Victor si Mihail Urmanshi
IF OBJECT_ID('INTERSECT','P') IS NOT NULL
DROP PROCEDURE [INTERSECT];
GO
CREATE PROCEDURE [INTERSECT]
AS
SELECT * FROM [Pro]
WHERE [Pro].[Proiect_Id] = (
SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Osipov' AND [U].[Utilizator_Prenume] = 'Victor')
INTERSECT
SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Urmanschi' AND [U].[Utilizator_Prenume] = 'Mihail'));
- diferenta
- Sa se afiseze identificatoarele proiectelor care apartin lui Osipov Victor si nu lui Vovc
Artiom IF OBJECT_ID('DIFFERENCE','P') IS NOT NULL
DROP PROCEDURE [DIFFERENCE];
GO
57
CREATE PROCEDURE [DIFFERENCE]
AS
SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Osipov' AND [U].[Utilizator_Prenume] = 'Victor')
EXCEPT
SELECT [UP].[Proiect_Id] FROM [UP]
WHERE [UP].[Utilizator_Id] = (SELECT [U].[Utilizator_Id] FROM [U] WHERE [U].[Utilizator_Nume]
= 'Vovc' AND [U].[Utilizator_Prenume] = 'Artiom');
- produsul cartezian
- Sa se afiseze produsul cartezian al tuturor proiectelor si a tuturor utilizatorilor
IF OBJECT_ID('PRODUSCARTEZIAN','P') IS NOT
NULL DROP PROCEDURE [PRODUSCARTEZIAN];
GO
CREATE PROCEDURE
[PRODUSCARTEZIAN] AS
SELECT [U].*,[Pro].* FROM [Pro] CROSS JOIN
[U] ORDER BY [U].[Utilizator_Id] ASC;
GO
- complimentul activ
- Sa se afiseze complimentul activ al relatiei Diviziune
IF OBJECT_ID('COMPLIMENTACTIVE','P') IS NOT NULL
DROP PROCEDURE [COMPLIMENTACTIVE];
GO
CREATE PROCEDURE [COMPLIMENTACTIVE]
AS
SELECT * FROM (
(SELECT [Div].[Diviziune_Id] FROM [Div]) AS [DivId]
CROSS JOIN
(SELECT [Div].[Diviziune_Nume] FROM [Div]) AS [DivNume]
CROSS JOIN
(SELECT [Div].[Proiect_Id] FROM [Div]) AS [DivProiect])
EXCEPT
SELECT * FROM [Div];
GO
- teta jonctiune
- Sa se afiseze divizunea care are sarcina cu denumirea sa inceapa cu
Setarea IF OBJECT_ID('THETAJOIN','P') IS NOT NULL
DROP PROCEDURE
[THETAJOIN]; GO
CREATE PROCEDURE
[THETAJOIN] AS
SELECT * FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id] AND [Sar].[Sarcina_Nume] LIKE 'Setarea %';
GO
- jonctiune naturala
- Sa se afiseze proiectele si utilizatorii dezovoltate de fiecare utilizator
IF OBJECT_ID('[NATURALJOIN]','P') IS NOT NULL
DROP PROCEDURE [NATURALJOIN];
GO
CREATE PROCEDURE [NATURALJOIN]
AS
SELECT [UP].[Proiect_Id],[U].* FROM [UP] JOIN [U]
ON [UP].[Utilizator_Id] = [U].[Utilizator_Id];
GO
- jonctiunea externa
- jonctionea left join
- Sa se afiseze toate diviziunile si sarcinile prin left
join IF OBJECT_ID('LEFTJOIN','P') IS NOT NULL
DROP PROCEDURE [LEFTJOIN];
58
GO
CREATE PROCEDURE [LEFTJOIN]
AS
SELECT * FROM [Div] LEFT OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id];
GO
- jonctionea right join
- Sa se afiseze toate diviziunile si sarcinile prin right
join IF OBJECT_ID('RIGHTJOIN','P') IS NOT NULL
DROP PROCEDURE
[RIGHTJOIN]; GO
CREATE PROCEDURE
[RIGHTJOIN] AS
SELECT * FROM [Div] RIGHT OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id];
GO
- jonctionea full join
- Sa se afiseze toate diviziunile si sarcinile prin full
join IF OBJECT_ID('FULLJOIN','P') IS NOT NULL
DROP PROCEDURE
[FULLJOIN]; GO
CREATE PROCEDURE
[FULLJOIN] AS
SELECT * FROM [Div] FULL OUTER JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id];
GO
- semijonctiunea
- Sa se reprezinte diviziunile care au cel putin o sarcina
IF OBJECT_ID('SEMIJONCTIUNEA','P') IS NOT NULL
DROP PROCEDURE [SEMIJONCTIUNEA];
GO
CREATE PROCEDURE [SEMIJONCTIUNEA]
AS
SELECT DISTINCT [Div].* FROM [Div] JOIN [Sar]
ON [Div].[Diviziune_Id]=[Sar].[Diviziune_Id];
GO
- divizarea
- Sa se prezite divizarea fara pierderi pentru relatia Diviziuni IF
OBJECT_ID('DIVIZAREA_FARA_PIERDERI','P') IS NOT NULL
DROP PROCEDURE
[DIVIZAREA_FARA_PIERDERI]; GO
CREATE PROCEDURE
[DIVIZAREA_FARA_PIERDERI] AS
SELECT * FROM
(SELECT [Div].[Diviziune_Id],[Div].[Diviziune_Nume] FROM [Div]) AS
[D1] JOIN
(SELECT [Div].[Diviziune_Id],[Div].[Proiect_Id] FROM [Div]) AS
[D2] ON [D1].[Diviziune_Id] = [D2].[Diviziune_Id];
GO
- Sa se prezinte divizarea cu pierderi pentru relatia Diviziuni
IF OBJECT_ID('DIVIZAREA_CU_PIERDERI','P') IS NOT
NULL DROP PROCEDURE [DIVIZAREA_CU_PIERDERI]; GO
59
EXEC [UNION];
EXEC [INTERSECT];
EXEC [DIFFERENCE];
EXEC [PRODUSCARTEZIAN];
EXEC [COMPLIMENTACTIVE];
EXEC [THETAJOIN];
EXEC [NATURALJOIN];
EXEC [LEFTJOIN];
EXEC [RIGHTJOIN];
EXEC [FULLJOIN];
EXEC [SEMIJONCTIUNEA];
EXEC [DIVIZAREA_FARA_PIERDERI];
EXEC [DIVIZAREA_CU_PIERDERI];
EXEC [SARCINI_PRIORITATE] @MIN = 1,@MAX = 3;
EXEC [TIMPURILE_LIMITA];
EXEC [AU_PROIECT];
EXEC [CEA_MAI_MARE_PRIORITATE];
EXEC [DIV_CU_CELE_MAI_MULTE_SARCINI];
EXEC [CARE_PROIECTE_SUNT_ACTIVE];
EXEC [DIV_PROCESARE];
EXEC [PRO_CEA_MAI_MICA_SM];
EXEC [PRO_CEA_MAI_PUTINE_SARCINI];
EXEC [PRO_CEA_MAI_MULTE_SARCINI];
EXEC [PRO_CEA_MAI_MARE_SM];
60