Professional Documents
Culture Documents
Ligj.3 - DB
Ligj.3 - DB
2
VETITË E RELACIONEVE/TABELAVE
Ka emër unik;
Çdo celulë (cell) e tabelës/relacionit përmban saktësisht një vlerë atomike (të vetme);
Çdo atribut/kolonë ka emër të veçantë;
Vlerat e atributit/kolonës janë të gjitha nga i njëjti domain (tip i të dhënave);
Çdo rresht/tuple është i veçantë; nuk ka rresht të kopjuar (identik);
Radha e atributeve/kolonave nuk ka rëndësi;
Radha e rreshtave/tuples nuk ka rëndësi.
3
ÇELËSI I RELACIONEVE/TABELAVE (ZGJIDHJA E
KUFIZIMIT/CONSTRAINT)
Në bazën e të dhënave relacionale është e nevojshme që të identifikojmë një ose më shumë atribute (të quajtur çelësa relacional)
që në mënyrë unike identifikon çdo rresht në një relacion.
ID-ja e studentit është çelësi për relacionin/tabelën e Studentit (secili studentë ka ID unike nga të tjerët).
ISBN është çelës për relacionin/tabelën Libri (të gjithë Librat kanë ISBN unik).
4
ÇELËSI KRYESOR (PRIMARY KEY)
Është çelës kandidat i cili është zgjedhur (selected) që të identifikoj rreshtat në formë unike në një relacion/tabelë.
Për shkak se një relacion/tabelë nuk ka asnjëherë dy rreshta identik (të njëjtë), është gjithmonë e mundur të
identifikohet secili rresht në mënyrë unike. Kjo do të thotë që një relacion/tabelë do të ketë gjithmonë një çelës
primar.
Kolona/atributi që është definuar si çelës primar nuk mund të jetë NULL si dhe duhet të përmbaj vlera unike (të
pa përsëritura).
Duhet të ketë vetëm një çelës primar në një tabelë/relacion.
Në rastin më të keq nëse nuk mund të definohet një çelës primar brenda një relacioni/tabele atëherë mund të
shfrytëzohet i gjithë grupi i atributeve si çelës kryesor/primar (zakonisht merret nëngrupi më i vogël i cili është i
mjaftueshëm për të dalluar rreshtat/tuples).
5
ÇELËSI I HUAJ (FOREIGN KEY)
Është një kolonë, ose grup kolonash, në një tabelë, vlerat e të cilave korrespondojnë me vlerat e çelësit primar në
një tabelë tjetër.
Për të shtuar një rresht me një vlerë të caktuar të çelësit të huaj, duhet të ekzistojë një rresht në tabelën
përkatëse me të njëjtën vlerë të çelësit primar.
Tabela që përmban çelës të huaj (foreign key) quhet tabelë fëmijë kurse tabela që përmban çelës primar quhet
tabelë referencuese ose tabelë prind.
Tipi i të dhënave të çelësit të huaj dhe çelësit primar duhet të jetë i njëjtë!
6
LIDHJA E TABELAVE (USE CASE)
Candidate Key
Candidate Key
Foreign Key
Primary Key
Primary Key
LIDHJA E TABELAVE (USE CASE)
STUDENTI
LENDA VLERESIM
8
LIDHJA E TABELAVE - ERD
STUDENTI(id: char (PK), Emri: varchar, Mbiemri: varchar, Datalindjes: date, Email: varchar, NotaMesatare: float, Qyteti: varchar)
VLERESIMI (Studenti(FK): char, Lenda(FK): char, Nota: float, afatiProvimit: varchar)
LËNDA(Id: char (PK), Emri: varchar, ECTS: int)
Çelësi i huaj paraqet kufizim në bazën e të dhënave relacionale dhe për këtë ne duhet të kemi parasysh disa
rregulla:
Nuk mund të shtohet vlerë e caktuar si Foreign Key (në tabelën fëmijë) nëse nuk ekziston si Primary Key (në tabelën Prind)
P.sh nuk mund të shtojmë një rresht në tabelën Vlerësimi nëse nuk kemi vlera referuese në tabelën Studenti dhe/ose Lënda.
Edhe mungesa e njërës nga vlerat (ID e Studentit ose ID e Lëndës) nuk mund të realizoj shtim në tabelën Vlerësimi.
Duhet të kemi kujdes kur fshijmë (delete) vlera të çelësit kryesor (Primary Key) nëse janë referencuar në ndonjë tabelë si
çelës i jashtëm (Foreign Key).
P.sh nëse dëshirojmë të fshijmë studentin me ID: S002 atëherë nuk mund të ndodh fshirja për shkak se ky student është përmendur
(referuar) në tabelën Vlerësimi.
Në anën tjetër nëse duhet që të fshijmë patjetër një vlerë (rresht) nga tabela përkatëse (e deklaruar si PK) , atëherë duhet
të fshihen edhe vlerat në të gjitha tabelat që ajo vlerë është referuar (të deklaruara si FK)
SQL ofron mundësi përkatëse për trajtimin e këtyre çështjeve dhe do të mbulohet në ligjëratat në vazhdim.
11
KUFIZIMET E RELACIONEVE
12
RASTI I STUDIMIT
Si rast studimi po trajtojmë vlerësimin e studentëve
për lëndët përkatëse të cilët ata kanë përfunduar.
/*Krijimi i tabeles/skemes Studenti*/
create table Studenti
( /*Krijimi i tabeles/skemes
id_s char(3) Primary Key, relacionale Vlersimi*/
Së pari krijojmë bazën e të dhënave: Emri varchar(30) Not Null, create table Vlersimi
Mbiemri varchar(30) Not Null, (
create database Ligj_03 DataLindjes date, idStudenti char(3),
Email varchar(50), idLenda char(5),
Për të krijuar skemën përkatëse NotaMesatare float, Nota float,
në bazën e të dhënave që sapo Qyteti varchar(20) afatiProvimit varchar(20),
krijuam: ) Primary key
/*Krijimi i tabeles/skemes Lënda*/ (idStudenti,idLenda),
use Ligj_03 create table Lenda Foreign key (idStudenti)
( references Studenti (id_s),
id_l char(5) Primary Key, Foreign key (idLenda)
Emertimi varchar(30) Not Null, references Lenda (id_l))
ECTS int
--ky është një koment në SQL ) 13
INSERT [dbo].[Lenda] ([id_l], [Emertimi], [ECTS]) VALUES (N'40CS1', N'Shkenca Kompjuterike 1', 4)
INSERT [dbo].[Lenda] ([id_l], [Emertimi], [ECTS]) VALUES (N'40HAL', N'Hyrje ne Algoritme ', 5)
INSERT [dbo].[Lenda] ([id_l], [Emertimi], [ECTS]) VALUES (N'40MT2', N'Matematike 2', 6)
INSERT [dbo].[Lenda] ([id_l], [Emertimi], [ECTS]) VALUES (N'41SBD', N'Sistemet e bazës së të dhënave', 6)
INSERT [dbo].[Lenda] ([id_l], [Emertimi], [ECTS]) VALUES (N'41WEB', N'Inxhieri e Web-it', 5)
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S01', N'Agnesa', N'Beqiraj', CAST(N'1997-10-11' AS Date),
N'ab@gmail.com', 3.7, N'Prishtine')
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S02', N'Shend', N'Gashi', CAST(N'1993-05-05' AS Date),
N'sg@yahoo.com', 5, N'Lipjan')
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S03', N'Alban', N'Krasniqi', CAST(N'2000-12-07' AS Date),
N'ak@hotmail.com', 4.2, N'Prishtine')
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S04', N'Ines', N'Hoxha', CAST(N'1994-06-05' AS Date),
N'ih@live.com', 4.3, N'Peje')
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S05', N'Bekim', N'Hasani', CAST(N'1999-01-09' AS Date),
N'bh@hotmail.com', 3.8, N'Gjilan')
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S06', N'Flora', N'Kelmendi', CAST(N'1994-07-08' AS Date),
N'fk@gmail.com', 4.8, N'Gjakove')
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S07', N'Albina', N'Hyseni', CAST(N'2000-07-10' AS Date),
N'ah@gmail.com', 3.5, N'Ferizaj')
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S08', N'Adelina ', N'Sefaj', CAST(N'2000-10-07' AS Date),
N'as@yahoo.com', 4.1, N'Peje')
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S09', N'Egzon', N'Bajrami', CAST(N'1999-07-05' AS Date),
N'eb@gmail.com', 2.9, N'Ferizaj')
INSERT [dbo].[Studenti] ([id_s], [Emri], [Mbiemri], [DataLindjes], [Email], [NotaMesatare], [Qyteti]) VALUES (N'S10', N'Dardan', N'Daka', CAST(N'2002-08-12' AS Date),
N'dd@gmail.com', 3.7, N'Gjilan') 14
RASTI I STUDIMIT (INSERTIMI I TË DHËNAVE)
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S02', N'40CS1', 8, N'Janar')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S02', N'41SBD', 6, N'Prill')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S02', N'41WEB', 9, N'Shkurt')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S05', N'40HAL', 9, N'Shkurt')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S05', N'40MT2', 9, N'Prill')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S05', N'41WEB', 10, N'Prill')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S07', N'41WEB', 7, N'Prill')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S08', N'40MT2', 8, N'Shkurt')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S09', N'40CS1', 6, N'Prill')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S09', N'40HAL', 8, N'Prill')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S09', N'41WEB', 6, N'Janar')
INSERT [dbo].[Vlersimi] ([idStudenti], [idLenda], [Nota], [afatiProvimit]) VALUES (N'S10', N'40HAL', 7, N'Janar')
Operacioni i produktit kartezian përcakton një relacion që është lidhja e çdo rreshti (tuples) të një
relacioni/tabele me të gjitha rreshtat (tuples) të relacionit/tabelës tjetër.
P.sh nëse kemi relacionet/tabelat P dhe Q atëherë produkti kartezian i këtyre dy tabelave do të shprehej si P x Q:
Rezultati i produktit kartezian rrjedh nga relacioni (lidhja) e dy apo më shumë tabelave.
16
PRODUKTI KARTEZIAN (SHEMBULL)
Rezultati
Lidhja e tabelave duke përfshirë
barazimin e PK dhe FK sipas tabelave
Kushti sipas afatit të përkatëse.
provimit (Shkurt) 17
FUNKSIONET E AGREGIMIT (GRUPIMIT) NË SQL
Meqë shumica e të dhënave përmbajnë numra dhe neve na duhet që ato të dhëna të mblidhen apo të kthehen në
një formë të përpunuar të rezultatit të cilat kthehen si një raport atëherë përdoren funksionet e agregimit.
Këto funksione janë listuar në tabelën më poshtë:
Këto funksione në SQL veprojnë si grupim i të dhënave të rreshtave duke kthyer një rezultat të vetëm për gjithë
grupin duke marrë parasysh edhe kushtet përkatëse. 18
FUNKSIONET E AGREGIMIT (GRUPIMIT) NË SQL
Ky funksion kthen numrin e rreshtave në tabelë që përmbush kushtin e përcaktuar në deklaraten WHERE .
Nëse kushti WHERE nuk është specifikuar, atëherë pyetësori (query) kthen numrin total të rreshtave në tabelë.
Shembull:
ID Emri Paga
1 A 500
Count(*): Kthen numrin total të të dhënave/rreshtave d.m.th 6.
2 B 450
Count(paga): Kthen numrin total të vlerave NOT NULL në kolonën
‘Paga’ d.m.th 5. 3 C NULL
6 F 600
21
SQL SUM()
Shembull:
22
SQL SUM() (VAZHDIM)
23
SQL MIN()
Ky funksion përdorët për të kthyer vlerën më të ulët (vogël) nga një kolonë numerike.
Shembull:
Sintaksa: /*Të e gjeni cila është nota mesatare më
ulët e regjistruar në tabelën Studenti*/
SELECT MIN (emri_kolonës) SELECT MIN(s.NotaMesatare) [NotaMesatare me
FROM emri_tabeles e Ulet]
WHERE kushti; FROM Studenti s
24
SQL MAX()
Ky funksion përdorët për të kthyer vlerën më të lartë (madhe) nga një kolonë numerike.
Shembull:
25
SQL AVG()
Ky funksion përdorët për të kthyer vlerën mesatare nga një kolonë numerike.
Shembull:
26
DEKLARATA ORDER BY
Përdorët për të renditur rezultatin sipas vlerave të një ose më shumë kolonave.
Renditja e paracaktuar (default) është Ascending (nga më e vogla te më e madhja).
Mund të përdoret te kolonat numerike (renditja e numrave) dhe jo numerike (renditja e tekstit sipas alfabetit).
ORDER BY mund të përdoret si Asscending (ASC) dhe Descending (DESC).
Shembull:
Sintaksa:
/* Të renditen studentët sipas numrit të kredive të arritura,
nga studenti që ka më shumë kredi te ai që ka më pak kredi*/
SELECT listaKolonave
FROM listaTabelave Select s.Emri, s.Mbiemri, sum(l.ECTS) as [Kredite]
from Studenti s, Vlersimi v, Lenda l
[WHERE [listaKushtëshve ] where s.id_s = v.idStudenti and v.idLenda = l.id_l
[ORDER BY listaKolonave [ASC | group by s.Emri, s.Mbiemri
order by [Kredite] desc 27
DESC] ]
GROUP BY
Secila nga funksionet agreguese (SUM, AVG, COUNT, MIN, MAX) kthejnë si rezultat vetëm një rezultat total
përmbledhës (raport).
Shpesh na duhet që të gjejmë subtotal të rreshtave deri në një total final.
Për ta bërë këtë ne mund të përdorim GROUP BY.
GROUP BY ndryshe quhet si pyetësor i grupuar (grouped query) sepse ai grupon të dhënat nga deklarata
SELECT dhe prodhon një rresht të vetëm për secilin grup.
Kolonat të cilat përdoren në GROUP BY quhen si kolona grupuese (grouped columns).
Sipas rregullave, deklarata SELECT dhe deklarata GROUP BY janë të lidhura ngushtë me njëra tjetrën.
Çfarë do kolone e përmendur në SELECT duhet që të përmendet patjetër në GROUP BY. (nuk vlen e kundërta,
mund të përdoret një kolonë në GROUP BY dhe të mos përfshihet në SELECT).
28
GROUP BY (SINTAKSA)
29
GROUP BY (SHEMBUJ)
Ne e dimë që deklarata WHERE përdoret për të vendosur kushte në kolona, por çka nëse duam të vendosim
kushte në grupe?
Këtu hyn në përdorim deklarata HAVING.
Ne mund të përdorim deklaraten HAVING për të vendosur kushte për grupet e fituara në rezultate
përfundimtare.
Pra, ne duhet të përdorim deklaraten HAVING nëse duam të përdorim ndonjë nga funksionet agreguese (count,
sum, avg, min dhe max) si kusht. P.sh:
Shembull:
Shënim: Sipas të
/*Te shfaqen studentet qe jane notuar në 2 ose me shume lëndë*/ dhënave aktuale,
Select s.Emri, count(v.nota) nrLendeve
From Studenti s, Vlersimi v, Lenda l kemi vlerësim të
Where s.id_s=v.idStudenti and l.id_l=v.idLenda studentëve në 1 ose 31
Group by s.Emri 3 lëndë.
having count(v.nota)>=2;
SHEMBUJ TË TJERË TË FUNKSIONEVE AGREGUESE
/*Shfaqni numrin e lëndëve për studentët që kanë kaluar dhe totali i kredive të arritur nga ta*/
SELECT s.Emri, s.Mbiemri, count(v.idLenda) 'Nr Lendeve', sum(l.ECTS) [Kreditë]
FROM Studenti s, Vlersimi v, Lenda l
WHERE s.id_s=v.idStudenti and l.id_s=v.idLenda and v.Nota>5
GROUP BY s.Emri, s.Mbiemri
HAVING count (v.idLenda)>1 /*Përdoret për të filtruar funksionet e agregimit*/
Order By [kreditë] desc 32
REFERENCAT
33
Pyetje?
34