1. Bazat e te dhenave relacionale
Cfare eshte nje sistem i manaxhimit te te dhenave (DBMS)
Nje sistem i manaxhimit te te dhenave perbehet nga nje bashkesi komponentes:
c programet aplikative mbi bazat e te dhenave
c Komponentet klient
c Serverat e Database
c Database-t
Nje program aplikativ mbi bazat e te dhenace eshte per nje qellim te caktuar.
Ndersa nje komponente klient eshte nje software qe perdoret per veprime te perditeshme mbi
bazen e te dhenave, per administrimin , per raportime etj.
Nepermjet nje komponenti klient , perdoruesit mund te perdorin nje baze te dhenash ne te njejtin
kompjuter apo ne nje kompjuter(server) me te cilin komunikojne nepermjet nje rrjeti.
Funksioni i nje serveri te bazes se te dhenave eshte te administroje te dhenat. Cdo klient mund ti
perdore te dhenat vetem duke i derguar serverit nje kerkese (query) dhe serveri pas disa
kontrolleve nese klienti eshte i autorizuar te kryeje veprimin e kerkuar mbi te dhenat e kryen
veprimin dhe i kthen nje pergjigje me rezultatin klientit.
Nje DBMS ofron funksionet e meposhtme:
2.
Nderfaqe per perdoruesit, qe te kene mundesi te bejne kerkesa per sherbime mbi te
dhenat
Pavaresi te te dhenave fizike ( Physical data independence)
Pavaresi llogjite te te dhenave ( Logical data independence)
Optimizim te kerkesave ( Query optimization )
Integritin e te dhenave (Data integrity)
Kontroll te konkurences ( Concurrency control)
Backup dhe recovery
Siguri te bazes se te dhenave (Database security)
Le ti shohim me konkretisht keto funksione
Nderfaqe per perdoruesit
Shume baza te dhenash jane nderttuar per tu perdorur nga perdorues te kategorive te ndryshme
me nivel te ndryshem njohurish.
Ndaj DBMS duhet te ofroje disa nderfaqe per perdoruesit me menu, forma, raporte si edhe nje
gjuhe programimi(SQL) per perdoruesit me te perparuar.
Pavaresia fizike e te dhenave
Eshte e nevojshme qe programet qe perdorin te dhenat ne nej baze te dhenash te mos jene te
varur nga struktura fizike ne te cilen jane ruajtur te dhenat. Kjo gje na mundeson te modifikojme
te dhenat pa ndikuar ne programin aplikativ. Per shembull duhet te kemi mundesi te zhvendosim
te dhenat ne nje server te ri me te shpejte pa modifukuar aplikacionin.
Ose, nese nje tabele eshte shume e madhe dhe po ndikon ne shpejtesine e sistemit, mund te
vendosim ta ndajme ate ne dy skedare ku sejcili prej tyre te ruhet ne nje disk me vehte per te
rritur shpejtesin e sistemit.
Sigurisht, nuk duam te modifikojme aplikacionin per kete gje.
Pavaresia llogjike e te dhenave
Po e ilustrojme kete me nje shembull.
Nese duam te shtojme nje kollone adresa ne nje tabele Employees, mund ta bejme kete pa
modifikuar aplikacionin,
Nese te dhenat mbi punonjesit do te ruheshin ne nje skedar atehere shtimi i nje fushe ne skedar
do te kerkonte modifikimin e aplikacionit mbi te dhenat
Optimizimi i kerkesave
Te gjithe DBMS kane nje komponent qe quhet optimizues, i cili merr ne konsiderate disa menyra
te ndryshme per te ekzekutuar komandat ne bazen e te dhenave. Menyra e zgjedhur quhet plan
ekzekutimi. Optimizuesi merr vendimet duke u bazuar ne informacione si madhesia e tabelave
ku po ekzekutohet komanda, cfare indeksesh ka, dhe cfare operatoresh llogjike (AND,
OR, NOT) perdoren ne klauzolen WHERE
Integriteti i te dhenave
3. Nje nga funksionet e DBMS eshte te identifikoje te dhena qe jane llogjikisht jo te sakta dhe te
mos i pranoje to ruaje ato ne bazen e te dhenave. Per shembull nese ruajme moshen e nje
punonjesi DBMS nuk duhet te pranoje nje moshe jashte intervalit (18-70).
Kontrolli i konkurences
Pjesa me e madhe e DBMS te sotem, jane sisteme shume-perdorues dhe i mundesojne disa
perdoruesve ne te njejten kohe (ne menyre konkurente) te punojne me te dhenat.
Puna ne menyre te njekoheshme me te dhenat nga disa perdorues, paraqet disa probleme te cilat
duhet ti shmange (administroje) DBMS. Per ilustrim po marrim nje shembull tipik:
1.Nje llogarie bankare numer 4711 ne banken X ka nje balance prej $2,000.
2. Dy pronaret e kesaj llogarie, Znj. A dhe Z. B, shkojne ne dy sportele te ndryshme dhe sejcili
prej tyre terheq 2000 dollare
DBMS nuk duhet ta lejoje kete situate. Llogaria duhet te "kycet" ne momentin qe telleri i pare
fillon te kryeje nje veprim terheqje nga kjo llogari dhe telleri i dyte duhet et vendoset ne pritje
derisa te mbaroje pune telleri i pare.
Telleri i dyte fillon te punoje me llogarine pasi ka mbaruar telleri i pare, duke gjetur nje balance
te llogarise 0 dollare, gje qe nuk i mundeson Z. B te terheqe 2000 dollaret e tij pasi ato me pare i
ka terhequr Znj. A.
Backup dhe Recovery
Nje DBMS duhet te kete mjete per te ruajtur te dhenat ne menyre te tille qe ti rigjeneroje ato ne
rast te nje demtimi te pajisjeve ose te te dhenave,
Siguria e bazes se te dhenave
Siguria e bazes se te dhenave lidhet me dy procese: autentikimin dhe autorizimin.
Autentikimi eshte procesii verifikimit te kredencialeve te perdoruesit per te mos lejuar
perdoruers te paautorizuar te perdorin DBMS. Autentikimi zakonisht realizohet nepermejt nje
emri perdoruesi dhe fjalekalimi. Ky informacion kontrollohet nga DBMS dhe nese eshte i sakte
perdoruesi lejohet te perdore sistemin. Per te shmabgur vjedhjen e fjalekalimit gjate transmetimit
ne rrjet apo gjate ruajtes se tiej perdoret enkriptimi, ndersa
Autorizimi eshte proces qe ndodh pas autentikimit. Tani me DBMS e di identitetin e perdoruesit
(nepermjet autentikimit) dhe sa here qe nje perdorues tenton te perdore nje objekt te te dhenave
DBMS verifikon nese perdoruesi eshte lejuar te ktyeje kete veprim. nese po e autorizon
perdoruesin te kryeje veprimin e kerkuar.
Relational Database Management Systems (RDBMS)
Sistemet relacionale te manaxhimit te te dhenave
Koncepti i bazave te dhenave relacionale eshte prezantuar per here te pare nga E. F. Codd ne
artikullin e tij “A Relational Model of Data for Large Shared Data Banks” ne vitin 1970. Ne
dallim nga sistemet e meparshme (rrjet dhe hierarkik), sistemet relacionale bazohen ne modelin
e te dhenave relacional qe bazohet ne algjebren relacionale.
Koncepti baze i modelit relacional eshte relacioni (= tabela), prandaj ne nje sistem relacional
tabela eshte e vetmja strukture per ruajtjen e te dhenave. Tek nje kolline e nje rreshti ruhet me
4. saktesi nje vlere skalare.
Per te ilustruar bazat e te dhenave relacionale do te bazohemi tek baza e te dhenave Northwind.
Po paraqesim me poshte disa nga tabelat e kesaj baze te dhenash.
Sic duket baza e te dhenave Northwind ruan informacion mbi shitjet e nje kompanie
Tabela Orders
Tabela Orders ruan informacion mbi porosite e kryera ne kompani. Per cdo porosi ruhen disa
5. informacione nder te cilat disa jane informacione te detyrueshme e disa opsionale.
Keshtu per nje porosi ruhet :
Kodi ne kollonen me emrin OrderId,
Kodi i klientit ne kollonen me emrin CustomerID,
Kodi i punonjesit qe realizoi kete porosi ne kollonen me emrin EmployeeId,
Data e porosise ne kollonen me emrin OrderDate
si edhe te tjera informacione si
daten kur kerkohet qe porosia te levrohet tek klienti,
ne cilen date duhet te nise transporti(Shippeddate),
kodi i kompanise se transportit(ShipVia) etj.
Tabela Employees
Tabela Employees ruan informacion mbi punonjesit e kompanise. Per cdo punonjes ruhen disa
informacione nder te cilat disa jane informacione te detyrueshme e disa opsionale.
Keshtu per nje punonjes ruhet :
Kodi ne kollonen me emrin EmployeeId,
Mbiemri i punonjesit ne kollonen me emrin Lastname,
Emri i punonjesit ne kollonen me emrin Firstname,
Pozicionin e punes se punonjesit ne kollonen me emrin Title
Datelindjen ne kollonen me emrin Birthdate
Daten e marrjes ne pune ne kollonen me emrin Hiredate
si edhe informacione te tjera mbi punonjesit.
Tabela Customers
6. Tabela Customers ruan informacion mbi klientet. Per cdo klient ruhen disa informacione nder te
cilat disa jane informacione te detyrueshme e disa opsionale.
Keshtu per nje klient ruhet :
Kodi ne kollonen me emrin CustomerId,
Emri i kompanise ne kollonen me emrin CompanyName,
Personin e kontaktit ne kollonen me emrin ContactName,
Pozicionin e punes se personit te kontaktirne kollonen me emrin ContactTitle
Adresen
Qytetin
si edhe informacione te tjera.
Tabela OrderDetails
Tabela OrderDetails ruan informacion mbi detajet e porosive. Per cdo detaj (rresht te porosise,
kujtoni nje fature qe keni pare se fundmi) ruhen informacionet e meposhtme:
7.
Kodi i porosise ne kollonen me emrin OrderId,
Kodi i produktit ne kollonen me emrin ProductId,
Cmimi i produktit ne kollonen me emrin UnitPrice,
Sasine e porositur nga ky produkt ne kollonen me emrin Quantity
Ndonje ulje te mundshme ne kollonen me emrin Discount
Tabela Products
Tabela Products ruan informacion mbi produktet qe shet kompania. Per cdoprodukt ruhen
informacionet e meposhtme:
Kodi i Produktit ne kollonen me emrin ProductId,
Emri i produktit ne kollonen me emrin ProductName,
Kodi i furnitorit ( te cilet ruhen ne nje tabele me vehte me emrin Suppliers ) ne kollonen
me emrin SupplierId ,
Kodi i kategorise se produktit (te cilat ruhen ne nje tabele me vehte Categories)
Cmimin e produktit ne kollonen me emrin UnitPrice
sasine ne stok ne kollonen me emrin UnitsInStock
etj
Sic vihet re edhe nga baza e te dhenave e marre si shembull:
Rreshtat e nje tabele nuk kane ndonje rend te paracaktuar
Kollonat ne nje tabele nuk kane ndonje rend te percaktuar
Nuk kemi dy kollona me te njejtin emer brenda te njejtes tabele
Mund te kemi kollona me te njejtin emer nese ato ndodhen ne dy tabela te ndryshme ( Per
shembull kollona OrderId ne tabelen Orders dhe kollona OrderId ne tabelen OrderDetails
si edhe EmployeeId ne tabelen Employees dhe kollona EmployeeId ne tabelen Orders)
Te gjitha te dhenat qe ruhen ne nje kollone te nje rreshti te tabeles jane skalare
Ne cdo tabele, ka te pakten nje kollone (ose kombimin kollonash si ne tabelen Order
8.
Details kollonat OrderId dhe ProductID) qe permban vlera unike. Ne modelin relacional
te te dhenave keto kollona qe sherbjene si identifikues te rreshtave referohen si celes
kandidat. Nese nje tabele ka disa celesa kandidate ne nje tabele , dizenjuesi i bazes se te
dhenave percakton njerin prej celesave kandidate si celesi primar i tabeles, psh OrderId
eshte celes primar i tabeles Orders, EmployeeId i tabeles Employees dhe CustomerId i
tabeles Customers, ndersa ne tabelen OrderDetails celesi primar perbehet nga kombinimi
i dy kollonave OrderId dhe ProductId
Ne asnje nga tabelat nuk ekzistojne dy rreshta me permbajtje identike
Gjuha per bazat e te dhenave relacionale, SQL(Structured Query Language)
Versioni i gjuhes SQL qe perdor SQL Server quhet Transact-SQL. Transact SQL konsiderohet
si nj dialekt i Structured Query Language.
Lindja e gjuhes SQL eshte e lidhur ngushte me nje projekt te quajtur System R, te IBM ne
fillim te viteve 1980.
Ky projekt provoi se eshte e mundur te perdoret model teorik i E. F. Codd per te ndertuar nje
sistem relacional te te dhenave.
SQL, gjuhe e bazuar tek bashkesite
Ndryshe nga gjuhet e programimt si C, C++, apo Java, SQL eshte nje gjuhe e bazuar tek
bashkesite. KJo nenkupton qe SQL mund te kerkoje te dhena ne shume rreshta nga nje ose disa
tabela me nje komande te vetme. Kjo karakteristike eshte nje nga avantazhet me te rendesishme
te SQL, pasi ofron nje nderfaqe programimi te nje niveli te larte abstraksioni, me larg gjuhes se
makines por me afer gjuhes natyrale njerezore.
SQL gjuhe jo proceduriale
Gjithashtu SQL eshte nje gjuhe jo proceduriale. Te gjithe programet e shkruajtura ne nje gjuhe
proceduriale (C, C++, Java) pershkruan si te kryhet nje pune, hap pas hapi. Perkundrazi , SQL,
pershkruan cfare kerkon perdoruesi dhe eshte sistemi DBMS qe gjen menyren me te mire per t'iu
pergjigjur kerkeses se perdoruesit.
DDL dhe DML
SQL permban dy bashkesi kompandash:
1. data definition language (DDL) dhe
2. data manipulation language (DML).
Komandat DDLperdoren per te pershkruar skemen e objekteve te bazes se te dhenave.
DDL permban tre komanda te pergjithshme:
CREATE object
ALTER object
DROP object
Keto komanda krijojne , modifikojne dhe fshijne objekte te bazes se te dhenave si database,
9. tabele, kollona, dhe indekse
Ndersa DML permbledh komandat qe manipulojne permbajtjen e ketyre objekteve: afishimin,
shtimin, fshirjen, dhe modifikimin.
Komanda per gjetjen dhe afishimin eshte SELECT
Komanda per gjetjen dhe afishimin eshte INSERT
Komanda per gjetjen dhe afishimin eshte DELETE
Komanda per gjetjen dhe afishimin eshte UPDATE
SQL Server Management Studio
Microsoft SQL Server eshte nje Relational Database Management System (RDBMS) i
nderuar per tu ekzekutuat ne platforma te ndryshme qe nga laptopet deri tek serverat
me disa procesore. SQL Server perdoret per ruajtjen e te dhenave te aplikimeve te
llojeve te ndryshme qe perdoren nga mijera perdorues te njokohshem.
SQL Server eshte i pajisur me mjete qe na ndihmijne ne detyrat tona te administrimit te
bazes se te dhenave si edhe te programimit mbi te dhenat.
SQL Server eshte shume me robust dhe i zgjerueshem se nje DBMS i konceptuar per nje
kompjuter si Microsoft Access. Access nuk perdoret ne raste kur baza e te dhenave
perdoret nga nje numer i madh perdoruesish ne te njejten kohe!
Ndonese mund te funksionoje edhe si nje sistem i manazhimit te te dheAlthough SQL
Server can also be run as a desktop database system, it is most commonly used as a
server database system.
Versionet e SQL Server 2008
SQL Server 2008 ka disa versione te pershtatura per perdorime te ndryshme.
Versionet Express dhe Compact jane gratis nga Microsoft.
Ndersa mund te perdorni versionin Evaluation per 180 dite.
10. Enterprise Edition
Eshte nje platforme per manaxhimin e te dhenave dhe inteligjencen e biznesit qe ofron kapacitetin e nev
(high availability), dhe sigurine e per ekzekutimin e aplikacioneve kritike te biznesit.
Standard Edition
Eshte nje platforme per manaxhimin e te dhenave dhe inteligjencen e biznesit qe ofron thjeshtesi ne per
pershtatshem per ekzekutimin e aplikacioneve me te vogla
Workgroup Edition
Eshte nje platforme per manaxhimin e te dhenave dhe raportimin qe mund te perdoret ne kompani te v
Developer Edition
Perdoret nga programuesit per ndertimin e aplikimeve dhe ka gjithe funksionalitet e versionit Enterprise
Web Edition
A low-TCO, scalable, and manageable database option for web hosters and end customers looking to dep
and services
Express Edition
Version gratis i SQL Server eshte ideal per te mesuar dhe ndertuaraplikacione te vogla en desktop dhe
Compact Edition
Version gratis me kapacitet te limituat, i pershtatshem per ndertimin e aplikacioneve ne pajisje mobile
Evaluation Edition
Ky version eshte disponibel per perdorim gratis per 180 dite
SQL Server Management Studio
SQL Server Management Studio (SSMS) eshte ambjenti kryesor i punes ne SQL Server.
Nepermjet SSMS mund te krijojme objektet e bazave te te dhenave (si databaza, tablela, views etj), te shiko
konfigurojme userat, te transferojme te dhena midis databazave, etj.
SQL Server Management Studio ka pamje te ngjashme me imazhin e meposhtem:
11. Ne te majte afishohet Object Explorer. Nepermjet Object Explorer mund te administrojme databazat, objek
trigerat, funksionet, procedurat),etj.
Si te krijojme nje Database
Nje nga gjerat e para qe bejme kur fillojme te punojme me SQL Server eshte krijimi i nje database.
12. Databazat e sistemit (System Databases)
Tek Object Explorer nen Databases do te vini re qe ekzistojne disa database te sistemit qe krijohen automati
Serverin. Me poshte eshte nje liste e database te sistemit:
Database
Type
Description
master
System
database
Ruan informacione te sistemit si llogarite e perdoruesve, parametra konfigurim
mbi databazat e tjera.
model
System
database
Kjo database perdoret si nje model (template) per te gjithe database e reja qe
msdb
System
database
Perdoret nga sherbimi SQL Server Agent per konfigurimin e njoftimeve(alerts) d
planifikuara.
tempdb
System
database
Ruan tabelat e perkohshme dhe objekte te tjera te perkohshme.
Si te krijojme nje database
Hapat e meposhtme tregojne si mund te krijojme nje database nepermjet SQL Server Management Studio.
1. Klikojme me te djathten tek "Databases" dhe klikoni "New Database...":
13. Database u krijua
Mund te vini re qe database MyDatabase duket nen "Databases" section of SQL Server Management Studio
Database i ri i krijuar bazohet tek database "Model". Po te klikojme tek shenja e + do te navigojme ne objek
views etj.
14. Opsione shtese
Sapo kemi krijuar nje database me opsionet default. Kur krijuam database u krijuan automatikisht nje "Data
Log" .
Nese duam te ndrshojme parametrat e konfigurimit te databases mund te klikojme me te djathen mbi emrin e
Properties.
16. Te krijojme nje Tabele
Si te krijojme nje tabele nepermjet SQL Server Management Studio (SSMS).
1. Klikojme me te djathen mbi "Tables" dhe zgjedhim "New Table...":
17. 2. Pas kesaj hapet nje nderfaqe per krijimin e tabeles:
1. Sic duket edhe nga figura me poshte kemi tre kollona ColumnName , Data Type dhe Allow Nulls. Tek Colum
kollones, tek Data Type tipin e te dhenave qe do te kene vlerat qe do te vendosen ne kete kollone dhe tek Al
kollone pranon vlera boshe apo jo.
2. Nje kollone , zakonisht celesin primar te tipit INT e bejme "identity column", duke vendosur vleren "Yes" te
poshtme te dritares tek Dritarja e Atribueve (Properties Panel)
3. Gjithashtu mund te vendosim nje vlere "Default Value" per nje kollone psh nje mund te vendosim nje vler
kollonen DateCreated. (Kjo do te vendose automatikisht kohen e momentit kur shtohet nje rresht i ri ne tabe
18. 3. Pasi kemi krijuar strukturen e tabeles nepermjet FILE > SAVE ose nepermjet ikones SAVE
19. 4. Vendosim emrin e tabeles dhe perfundojme krijimin e tabeles:
Tabela u krijuar
Mund te verejme qe tabela eshte krijuar nen menune "Tables" tek Object Explorer.
20. Te modifikojme vlerat e tabeles
ne SQL 2008 mund te klikojme tek "Edit Top 200 Rows" pasi kemi klikuar me te djathten mbi emrin e tab
1. Kliko me te djatthe mbi emrin e tabeles , zgjidh "Edit Top 200 Rows":
21. 2. Tanime mund te modifikojme te dhenat e tabeles
Shenim: nuk mund te futim te dhena ne kollona qe i kemi percaktuar si IDENDTITY.
Ndersa mund te mos futim te dhena ne kollona qe kemi percaktuat nje vlere default dhe SQL serveri do te ve
default(vini re kollonen DateCreated ne shembullin me poshte)
22. Metoda e mesiperme eshte e pershtatshme kur sasia e te dhenave eshte e vogel.
Nje menyre me e mire do te ishte nepermjet komandave SQL (skripteve SQL)
Si te shkruajme komanda SQL - New Query
Per te shkruajtur komanda SQL mund te klikojme tek butoni "New Query" :
Kjo gje do te hape nje dritare te bardhe ne te djathte ku mund te shkruajme komandat SQL.
Si te shkruajme dhe te ekzekutojme komandat SQL
Ne fleten e bardhe qe u krijua ne te djathte te Object Explorer mund te shkruajme tanime komandat SQL.
Per te ekzekutuar komandat SQL i selectojme ato dhe klikojme butonin Execute ose shtypim tasten F5 ne ta
Ne pjesen e poshtme afishohet nje panel ku afishohen rezultatet e komandes se ekzektuar.
Figura meposhte ilistron kete proces
23. Query Designer
Rreth Query Designer
Query designer eshte nje derfaqe grafike qe Ju mundeson te shkruani komanda mbi bazen e te dhenave. N
i dobishem nese po shkruajme komanda te gjata e komplekse qe perfshijne disa tabela,viee etj.
Ndertim i komandave ne Query Designer
Per te ndertuar nje "query" :
1. Selektoni Query > Design Query in Editor...:
26. 4. Klikoni "OK"
Ndersa punoni me mousin per te zgjedhur kollonat ne pjesen e poshtme Query Designer nderton komanden
kerkuar nga JU.
27. Komanda SELECT
Te marrim te dhena nga SQL Server.
Sintaksa e komandes SELECT
SELECT (liste me kollona ose *)
FROM emertabele
WHERE (shprehje llogjike)
.GROUP BY (liste me kollona)
HAVING (shprehje llogjike)
Per shembull per te afishuar te dhenat e punonjesit me kodin 1 do te shkruanim komanden e
meposhtme:
SELECT *
FROM employees
WHERE EmployeeId=1
Shprehja llogjike mund te jete e perbere nga disa shprehje llogjike te lidhura nepermjet operatoreve
llogjike AND,OR. Ne kete rast eshte e rekomandueshme te perdoren kllapat per te percaktuar prioritetin
e veprimeve.
Krijimi i alias
krijimi i alias per kollonat
SELECT EmployeeID 'Kodi' ,
28. FirstName [Emri] ,
LastName [Mbiemri],
TitleOfCourtesy AS Titulli ,
Title AS 'Pozicioni',
BirthDate AS [Datelindja],
ReportsTo AS Shefi
FROM employees
ky perdoret vetem ne klauzolen order by. Nuk mund te perdoret ne klauzolen where:
Krijim i alias per tabelen
Duke perdorur fjalen kyce as
SELECT EmployeeID 'Kodi' ,
FirstName [Emri] ,
LastName [Mbiemri],
TitleOfCourtesy AS Titulli ,
Title AS 'Pozicioni',
BirthDate AS [Datelindja],
ReportsTo AS Shefi
FROM employees as punonjesit
order by Emri ASC
Pa e perdorur
29. SELECT EmployeeID 'Kodi' ,
FirstName [Emri] ,
LastName [Mbiemri],
TitleOfCourtesy AS Titulli ,
Title AS 'Pozicioni',
BirthDate AS [Datelindja],
ReportsTo AS Shefi
FROM employees punonjesit
order by Emri ASC
A vlen emri i tabeles se vjeter? Para krijimit te alias?
Komanda:
SELECT EmployeeID 'Kodi' ,
FirstName [Emri] ,
LastName [Mbiemri],
TitleOfCourtesy AS Titulli ,
Title AS 'Pozicioni',
BirthDate AS [Datelindja],
ReportsTo AS Shefi
FROM employees as punonjesit
where Employees.EmployeeID=1
order by Emri ASC
30. jep gabim:
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "Employees.EmployeeID" could not be bound.
Ndersa komanda:
SELECT EmployeeID 'Kodi' ,
FirstName [Emri] ,
LastName [Mbiemri],
TitleOfCourtesy AS Titulli ,
Title AS 'Pozicioni',
BirthDate AS [Datelindja],
ReportsTo AS Shefi
FROM employees as punonjesit
where punonjesit.EmployeeID=1
order by Emri ASC
eshte e sakte pasi tabela tani quhet punonjesit.
Per shembull komanda me poshte afishon listen e punonjesve qe jane zonja ose zonjusha
31. SELECT *
FROM employees
WHERE TitleOfCourtesy = 'Ms.' OR TitleOfCourtesy = 'Mrs.'
Operatori BETWEEN
Komanda e meposhtme afishon nje liste me punonjesit qe jane marre ne pune vitin e fundit:
SELECT firstname, lastname, hiredate
FROM employees
WHERE hiredate >= '1994-1-1' AND hiredate <='1995-1-1'
Kjo komande mund te shkruhet ne nje menyre me te pembledhur duke perdorur operatorin BETWEEN
SELECT firstname, lastname, hiredate
FROM employees
WHERE hiredate
between '1994-1-1' AND '1995-1-1'
Operatori NOT
Operatori NOT na mundeson llogaritjen e te kundertes se nje shprehje llogjike.
32. Shembulli i meposhtem, i cili afishon nje liste te punonjesve qe nuk jane marre ne pune vitin e fundit.
SELECT firstname, lastname, hiredate
FROM employees
WHERE hiredate
NOT between ‘1-Jan-2010’ AND ‘31-Dec-2010’
Operatori IN
Operatori IN krahason nje shprehje kundrejt nej liste vlerash. Lista e vlerave mund te jete statike ose nje
liste me vlera e kthyer nga nje komande SELECT. Shembujt e meposhtem ilustrojne te dy keto raste:
Komanda e meposhtme afishon te gjithe punonjesite, mbiemri i te cileve nuk ndodhet ne listen (‘Jones’,
‘Smith’, ‘Keenan’)
SELECT firstname, lastname
FROM employees
WHERE lastname NOT IN (‘Jones’, ‘Smith’, ‘Keenan’)
Shembull 19 tetori 2012
1 -Te afishojme punonjesit qe jane gjini femrerore ose kane titull shkencor
select * from employees
where TitleOfCourtesy
IN ('Mrs.','Ms.','Dr.')
33. Ndersa komanda e meposhtme afishon nje liste me punonjesit qe nuk kane realizuar asnje shitje
SELECT firstname, lastname
FROM employees
WHERE EmployeeId
NOT IN
(SELECT EmployeeId from Ordes)
Ushtrim
Te afishojme listen e punonjesve qe kane shitur ne ShipCountry='Denmark'
SELECT *
FROM employees
WHERE EmployeeId
IN
(
SELECT EmployeeId
from Orders
where ShipCountry='Denmark'
)
34. USHTRIM
a- Afishoni nje liste me porosite e realizuara ne vitin 1996. Te afishohen kollonat e meposhtme
Kodi
Data Punonjesi
Klienti
Shteti
Qyteti
...
...
...
....
..
...
Zgjidhje
select OrderId as Kodi,
Orderdate as Data,
Employeeid as Punonjesi,
CustomerId as Klienti,
ShipCountry as Shteti,
ShipCity as Qyteti
from Orders
where (OrderDate between '1996-1-1' and '1996-12-31')
b- Afishoni nje liste me porosite e realizuara nga punonjesi me kodin 1 ne vitin 1996. Te afishohen
kollonat e meposhtme.
35. Kodi
Data Punonjesi
Klienti
Shteti
Qyteti
...
...
...
....
..
...
Zgjidhje
select OrderId as Kodi,
Orderdate as Data,
Employeeid as Punonjesi,
CustomerId as Klienti,
ShipCountry as Shteti,
ShipCity as Qyteti
from Orders
where (OrderDate between '1996-1-1' and '1996-12-31')
and (EmployeeID=1)
c- Rezultati te jete i renditur alfabetikisht ne rendin zbrites sipas Qytetit
select OrderId as Kodi,
Orderdate as Data,
Employeeid as Punonjesi,
CustomerId as Klienti,
ShipCountry as Shteti,
ShipCity as Qyteti
from Orders
36. where (OrderDate between '1996-1-1' and '1996-12-31')
and (EmployeeID=1)
order by Qyteti DESC
USHTRIM 2 - Afishoni listen e klienteve te kompanise.
a- Do te afishoni kollonat e meposhtme:
Kodi
Kompania
Person
Pozicioni
Telefon
Shteti
Kontakti
i punes
...
...
...
...
....
..
Shenim - Emrat e kollonave kane hapesire boshe midis fjaleve
zgjidhje
b- Interesohemi veten per klientet qe kemi ne USA
Operatori EXISTS
37. Komanda e meposhtme afishon nje liste me punonjesit qe kane realizuar te pakten nje shitje
SELECT * from Employees
where
exists
(
select * from Orders where Orders.EmployeeID=Employees.EmployeeID
)
Ushtrim
Te afishojme listen e punonjesve qe nuk kane shitur ne ShipCountry='Denmark'
SELECT * from Employees
where
not exists
(
select * from Orders
where Orders.EmployeeID=Employees.EmployeeID
and Orders.ShipCountry='Denmark'
)
38. Operatoti LIKE
Operatori LIKE eshte nej operator mbi stringjet, dhe mundeson krahasimin e nje stringu(teksti)
kundrejt nje maske , qe permban shkronja, numra , shenja pikesimi si edhe disa simbole te vecante si %
dhe _ qe quhen wildcards.
Tabela me poshte sqaron funksionin e wildcards
Simboli % nenkupton nje numer variabel simbolesh nga 0 deri ne n.
Simboli _ nenkupton saktesisht nje simbol
psh [a-f] nenkupton nje shkronje nga a deri f
psh [^a-f] nenkupton nje shkronje cfaredo meperkashtim te intervalit a deri f
[abc] nenkupton nje simbol a ose b ose c
[^abc] nenkupton nje simbol cfaredo me perjashtim te a, b dhe c
Shembujt e meposhtem sqarojne funksionin e operatorit LIKE:
Komanda
SELECT * from employees where Firstname like ‘A%’
afishon nje liste te punonjesve emrat e te cileve fillojne me shkronjen A , ndersa komanda e
meposhtme:
SELECT * from employees where homephone like ‘(206) ___-____’
39. afishon nje liste te punonjesve te cilet e kane numrin e telefonit me prefix (206) , e me pas vazhdon me
3 shifra, vazhdon me simbolin - dhe me pas ka kater shifra.
Operatori IS NULL
Per te testuar nese nje kollone e caktuar ka vleren NULL duhet te perdorim operatorin IS NULL (ose IS
NOT NULL kur duam te gjejme vlera jo boshe).
Nuk eshte e mundur te krahasojme per vlera NULL me shenjen e barazimit.
Homephone=NULL konsiderohet gabim , shkrimi korrekt do te ishte Homephone IS NULL
Per shembull, komanda e meposhtme:
SELECT * from Employees where Birthdate IS NULL
afishon nje liste te punonjesve per te cilet nuk e kemi te regjistruar datelindjen, ndersa komanda e
meposhtme:
SELECT * from Employees where Birthdate
IS NOT NULL
afishon nje liste te punonjesve per te cilet e kemi te regjistruar datelindjen.
Te rendisim rezultatin nepermjet klauzoles ORDER BY
40. Klauzola Order By, mundeson te rendisim rezultatin e nje query sipas nje ose disa kollonash.
ASC - ASCENDING, percakton rendin rrites ndersa
DESC - DESCENDING, percakton rendin zbriter
Nese nuk e percaktojme SQL nenkupton qe po kerkojme ti rendisim rreshtat ne rendin rrites ASC.
Per shembull, komanda e meposhtme:
SELECT firstname, lastname
FROM Employees
ORDER BY firstname
afishon nje liste te punonjesve te renditur sipas emrit te tyre ne rendin rrites (A->Z), ndersa komanda e
meposhtme:
SELECT firstname, lastname
FROM Employees
ORDER BY firstname DESC ,lastname ASC
afishon nje liste te punonjesve te renditur sipas emrit te tyre ne rendin zbrites(Z->A) dhe me pas sipas
mbiemrit ne rendin rrites (A->Z)
Ushtrim
Te afishojme te renditura porosite sipas ShipCountry (rrites) dhe me pas sipas dates se porosies ne
rendin zbrites.
41. select OrderID,EmployeeId,
CustomerID,OrderDate,ShipCountry
from Orders
order by ShipCountry ASC, OrderDate DESC
Lista e punonjesve qe shiten produkte te shtrenjta (mbi 250 euro)
SELECT * FROM Employees
where EmployeeId IN
(
Select distinct EmployeeID from orders
where OrderID IN
(
select distinct OrderID
from [Order Details]
where UnitPrice>250
)
)
Operatori IN dhe EXISTS
select EmployeeID,FirstName,LastName,TitleOfCourtesy,Title
from Employees
where EmployeeID NOT IN
42. (
SELECT
DISTINCT EmployeeID FROM Orders
where ShipCountry='SPAIN'
)
select EmployeeID,FirstName,LastName,TitleOfCourtesy,Title
from Employees
where Not
SELECT
Exists (
* FROM Orders
where
ShipCountry='SPAIN'
and
Orders.EmployeeID=Employees.EmployeeID
)
select *
from Customers
where CustomerID NOT IN(
SELECT
DISTINCT CustomerID FROM Orders
where
OrderDate>'1996-1-1'
)
select *
from Customers
where Not
SELECT
Exists (
* FROM Orders
44. unksionet e Grupit
Funksionet e Grupit
Ka disa funksione te SQL qe aplikohen mbi grupet e rreshtave. Keto funksione si psh SUM, COUNT etj,
shoqerohen me klauzolen GROUP BY.
Tabela me poshte paraqet nje pershkrim te funksioneve te grupit:
AVG - Mesatarja
COUNT - Numeron vlerat
MAX - maksimumi
MIN - minimumi
SUM - shuma
STDEV - Deviacioni standart (statitike)
VAR - Varianca ( statistike )
Ne rastin e SELECT te shoqeruar me Group By, vetem kollonat qe ndodhen ne listen e GROUP BY mund
te jene ne listen e kollonave te SELECT.
Rezultatet pas grupimit mund te filtrohen nepermjet HAVING BY, e cila eshte e ngjashme me WHERE,
por ne dallim nga kjo e fundit aplikohet pas llogaritjes se rezultateve mbi rreshtat e grupuara.
Per shembull, komanda e meposhtme afishon numrin e shitjeve per cdo kod punonjesi:
SELECT EmployeeId,
Count(*) ‘NoOfOrdersHeDealed’
45. from Orders
Group by (EmployeeId)
Shembull
Nga tabela Products
Te afishojme sa produkte
kemi ne magazine gjendje nga cdo kategori
select CategoryID,sum(UnitsInStock )
from Products
group by CategoryID
Te afishojme cmimin mesatar
te produkteve per cdo kategori
select CategoryID,AVG(UnitPrice)
from Products
group by CategoryID
Te afishojme cmimin ma te madh
te produkteve per cdo kategori
46. select CategoryID,MAX(UnitPrice)
from Products
group by CategoryID
Te afishojme cmimin ma te ulet
te produkteve per cdo kategori
select CategoryID,MIN(UnitPrice)
from Products
group by CategoryID
Te afishojme sa eshte vlera finaciare e magazines per
produktet per cdo kategori
select CategoryID,
SUM(UnitPrice*UnitsInStock ) AS 'VleraFinanciare'
from products
GROUP BY CategoryID
Ti afishojme keto vlera ne nje query
select CategoryID,
COUNT(*) AS 'Produkte',
sum(UnitsInStock )AS 'ProdukteGjendje',
47. MAX(UnitPrice ) AS 'CmimiMax',
MIN(UnitPrice ) AS 'CmimiMin',
AVG(UnitPrice ) AS 'CmimiMes',
SUM(UnitPrice*UnitsInStock ) AS 'VleraFinanciare'
from products
GROUP BY CategoryID
Ushtrim1
Te afishojme sa eshte numri i porosive qe eshte realizuar ne cdo shtet?
select ShipCountry,
COUNT(*) as 'NumerPorosish'
from Orders
group by ShipCountry
order by NumerPorosish DESC
Ushtrim2
Te afishojme sa eshte numri i porosive qe eshte realizuar ne cdo shtet, vetem per ato shtet ku kam
derguar me shume se 80 porosi.
select ShipCountry,
COUNT(*) as 'NumerPorosish'
from Orders
group by ShipCountry
48. having COUNT(*)>80
order by NumerPorosish DESC
Ushtrim3
Te afishojme sa eshte numri i porosive qe eshte realizuar ne cdo shtet, vetem per ato shtet ku kam
derguar me shume se 20 porosi ne vitin 1996.
select ShipCountry,
COUNT(*) as 'NumerPorosish'
from Orders
where OrderDate between '1996-1-1' and '1997-1-1'
group by ShipCountry
having COUNT(*)>20
Ushtrim 4
Te afishojme listen e punonjesve qe kane shitur me shume se 3 porosi ne USA ne peiudhen 1996-1-1
deri 1997-1-1
select * from employees
where employeeId
IN
(
select EmployeeID from ORders
where ShipCountry='USA' and
49. (OrderDate between '1996-1-1' and '1997-1-1')
group by EmployeeID
having COUNT(*)>3
)
Ushtrim 5 - Te afishojme kodin dhe vleren financiare te cdo porosie te realizuar ne vitin 1996
OrderId
Amount
...
...
Zgjidhje
Te gjejme kodet e porosive te realizuara ne 1996
select OrderID from orders
where OrderDate
between '1996-1-1' and '1997-1-1'
Zgjidhja perfundimtare
select OrderID,
SUM(UnitPrice*Quantity)as 'Amount'
from [Order Details]
where OrderID IN
50. (
select OrderID from orders
where OrderDate
between '1996-1-1' and '1997-1-1'
)
group by OrderID
Zgjidhja alternative, jo e rekomandueshme
select OrderID,
SUM(UnitPrice*Quantity)as 'Amount'
from [Order Details]
group by OrderID
having OrderID IN
(
select OrderID from orders
where OrderDate
between '1996-1-1' and '1997-1-1'
)
ndersa komanda e meposhtme afishon kodin e nje porosise dhe vleren financiare te saj si total
51. SELECT OrderId,SUM(Quantity*UnitPrice) 'totalamount' from [Order Details]
Group by OrderID
Ndersa komanda e meposhtme afishon vetem kodet e punonjesve qe kane bere me shume se 10 shitje:
SELECT EmployeeId,
Count(*) ‘NoOfOrdersHeDealed’
from Orders
Group by (EmployeeId)
Having Count(*) >10
--
shembull
SELECT * FROM Employees
WHERE EmployeeID
IN
(
SELECT DISTINCT EmployeeID FROM Orders
WHERE
OrderID
IN
(
52. select OrderID 'kodi'
from [Order Details]
where Discount=0 -- para grupimit
group by OrderID
having SUM(Unitprice*Quantity)>12500 -- pas grupimit
)
)
-- FUNKSIONET E GRUPIT
SELECT (KOLLONA)
FROM (TABELE)
WHERE (KUSHT)
GROUP by (KOLLONA)
HAVING (KUSHT)
SELECT Country,City FROM Customers
ORDER BY Country,City
SELECT Country Shteti ,
City 'Qyteti',
53. COUNT(*) as Numri_Klienteve
FROM Customers
GROUP BY Country,City
order by Country,City
-- TE AFISHOJ VETEM ATO QYTETE KU KAM ME
SHUME SE 2 KLIENTE
SELECT Country Shteti ,
City 'Qyteti',
COUNT(*) as Numri_Klienteve
FROM Customers
GROUP BY Country,City
HAVING COUNT(*)>0
order by
COUNT(*)
-- TE AFISHOJ VETEM ATO QYTETE EMRI I SHTETIT TE TE CILIT FILLON ME SHKRONJEN A?
-- KE DO PERDOR ? WHERE APO HAVING?
--NGA ANA SINTAKSORE MUND TI PERDOR TE DYJA
-- TE PROVOJME HAVING
SELECT Country Shteti ,
City 'Qyteti',
COUNT(*) as Numri_Klienteve
FROM Customers
GROUP BY Country,City
HAVING (COUNT(*)>0) AND (Country LIKE 'A%')
54. order by
COUNT(*)
-- TE PROVOJME WHERE
SELECT Country Shteti ,
City 'Qyteti',
COUNT(*) as Numri_Klienteve
FROM Customers
WHERE (Country LIKE 'A%')
GROUP BY Country,City
HAVING (COUNT(*)>0)
order by
COUNT(*)
-- CILIN TE PERDORIM???
-- having perdoret per filtrimin e funksioneve te grupit
-- per arsye performance
-- USHTRIM 1
--- GRUPONI TABELEM PUNONJESIT SIPAS TITULLIT TE KORTEZISE
-- AFISHONI NUMRIN E RRESHTAVE PER CDO GRUP
SELECT TitleOfCourtesy,count(*)
FROM Employees
group by TitleOfCourtesy
55. -- USHTRIM 2
-- SA ESHTE NUMRI I POROSIVE NE CDO SHTET?
select ShipCountry,COUNT(*)
from Orders
Group BY ShipCountry
order by COUNT(*)
--USHTRIM 2b
-- afishoni vetem shtet me me shume se 20 porosi
select ShipCountry,COUNT(*)
from Orders
Group BY ShipCountry
having COUNT(*)>20
order by COUNT(*)
--USHTRIM 2c
-- afishoni vetem shtet me me shume se 20 porosi
--ne periudhen '1996-1-1' deri '1997-1-1'
select ShipCountry,COUNT(*)
from Orders
where OrderDate between '1996-1-1' and '1997-1-1'
Group BY ShipCountry
having COUNT(*)>20
56. order by COUNT(*)
-- TE AFISHOJME PER CDO POROSI
-- VLEREN FINACIARE TE SAJ
-- SE PARI TE GJEJME VLEREN PER CDO RRESHT
select OrderID,ProductID,
UnitPrice*(1-Discount) as CmimiPasUljes,
(UnitPrice*(1-Discount))* Quantity as 'lineamount'
from
[Order Details]
-- ti grupojme sipas kodit te porosise
-- te gjejme shumen e vlerave te rreshtave
select OrderID,
SUM
(
(UnitPrice*(1-Discount))* Quantity
) as 'invoiceamount'
from
[Order Details]
Group by OrderID
-- TE SHTOJME NE REZULTAT
--CMIMIN MESATAR TE PRODUKTEVE TE SHITURA NE CDO POROSI
57. select OrderID,
SUM
(
(UnitPrice*(1-Discount))* Quantity
) as 'invoiceamount',
AVG
(
UnitPrice*(1-Discount)
) 'AverageProductPrice'
from
[Order Details]
Group by OrderID
-- TE SHTOJME NE REZULTAT
--CMIMIN ME TE LARTE DHE ME TE ULET
--TE PRODUKTEVE TE SHITURA NE CDO POROSI
select OrderID,
SUM
(
(UnitPrice*(1-Discount))* Quantity
) as 'invoiceamount',
AVG
(
UnitPrice*(1-Discount)
) 'AverageProductPrice' ,
MAX
(
59. INNER JOIN
Kthen te gjithe rreshtat e tabeles ne te majte te veprimit te Join per te cilet ka nje korrespondence ne
tabelen e djathte te veprimit te JOIN si edhe te gjithe rreshtat e tabeles se djathte per te cilat ka nje
korrespondence ne tabelen e majte.
INNER JOIN nuk kthen rreshtat e tabeles ne te majte te JOIN per te cilat nuk ka korrespondence ne
tabelen e djathte dhe nuk kthen rreshtat e tabeles ne te djathte per te cilet nuk ka korrespondence ne
tabelen e majte.
Per shembull
SELECT Products.ProductID,
Products.ProductName,Categories.CategoryID,Categories.CategoryName from
Categories INNER JOIN Products
ON Categories.CategoryID=Products.CategoryID
where Categories.CategoryId>6
Shenim: Per arsye te permasave te afishimit po perqendrohemi tek kategorite > 6 (where
Categories.CategoryId>6)
Afishon te gjithe produktet dhe kategorite qe jane korrespondence me njeri tjetrin.
Nuk afishon kategori per te cilat nuk ka produkte
Nuk afishon produkte per te cilat nuk ka kategori
Me poshte paraqitet rezultati i afishimit te komanded se mesiperme INNER JOIN
60. Vini re qe ne tabelen kategorite eshte shtuar se fundmi nje kategori me emrin kategori bosh, me
CategoryId= 9 per te cilen nuk ka produkte.
Kjo kategory nu afishohet ne rezultatin e INNER JOIN pe arsye se kjo kategori nuk ka produkte, pra nuk
ka referenca nga rreshtat e tabekes qe ndodhet ne te djathte te JOIN (Products) tek kjo kategori. Kjo
eshte arsyeja qe INNER JOIN nuk e perfshin kete kategori ne rezultatin final.
61. INNER JOIN eshte menyra baze (default) si funksionojne JOIN.
LEFT OUTER JOIN
Ne disa raste eshte e nevojshme te afishojme pervec rreshtave qe kane korrespondence ne te dy anet e
e JOIN edhe rreshtat ne tabelen e majte per te cilat nuk ka korrespondence ne tabelen e djathte.
Keshtu nese duam te afishojme te gjithe kategorite qe kane ose jo produkte si edhe te gjithe produktet e
ketyre kategorive do te perdornimi JOIN por kesaj rradhe me LEFT OUTER , duke vendosur tabelen
Categories ne te majte te veprimit JOIN
SELECT Products.ProductID,
Products.ProductName,Categories.CategoryID,Categories.CategoryName from
Categories LEFT OUTER JOIN Products
ON Categories.CategoryID=Products.CategoryID
where categories.CategoryID>6
Do te afishonte:
62. Pra LEFT OUTER JOIN , ne kete rast me Categories ne te majte dhe Products ne te djathte :
afishon te gjithe produktet dhe kategorite qe kane korrespondence direkte midis tyre
afishon te gjithe kategorite pavaresishte nese kane apo jo produkte (kategoria 9,kategoribosh)
nuk afishon produktet qe nuk kane kategori
RIGHT OUTER JOIN
Eshte i ngjashem me LEFT OUTER JOIN vetem se vepron ne te djathte te veprimit te JOIN.
Nese do te donim te merrnim rezultatin e mesiperm me RIGHT OUTER JOIN thjeshte do te ndryshonim
vendosjen e tabelave ne te majte dhe te djathte te veprimit JOIN. Vini re query e meposhtem dhe vereni
dallimin me query e mesiperm me LEFT OUTER
63. SELECT Products.ProductID,
Products.ProductName,Categories.CategoryID,Categories.CategoryName from
Products RIGHT OUTER JOIN Categories
ON Categories.CategoryID=Products.CategoryID
where categories.CategoryID>6
Rezultati eshte identik me rezultatin e query te meparshem
FULL OUTER JOIN
Eshte i ngjashem me rastet e meparshme por vepron edhe ne te majte edhe ne te djathte te veprimit
JOIN.
Prandaj komanda:
SELECT Products.ProductID,
Products.ProductName,Categories.CategoryID,Categories.CategoryName from
Categories FULL OUTER JOIN Products
ON Categories.CategoryID=Products.CategoryID
afishon te gjithe produktet dhe kategorite per te cilat ka korrespondence
afishon kategorite per te cilat nuk ka produkte
afishon produktet qe nuk jane te kategorizuar
USHTRIME
Ushtrim 1- te afishojme kodin e porosise, daten,kodin dhe emrin e punonjesit qe e trajtoi ate porosi
65. Zgjidhje
SELECT Orders.OrderID,Orders.OrderDate,Orders.CustomerID,
Customers.CompanyName
FROM Orders INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID
Ushtrim 3 Te afishojme kodin e produktit,emrin e produktit
dhe emrin e kompanise furnitore per kete produkt
ProductId
ProductName
SupplierName
...
..
...
Zgjidhje
SELECT Products.ProductID,Products.ProductName,Suppliers.CompanyName
FROM Products INNER JOIN Suppliers
ON Products.SupplierID=Suppliers.SupplierID
3-a te renditen sipas emrit te furnitorit
SELECT Products.ProductID,Products.ProductName,Suppliers.CompanyName
FROM Products INNER JOIN Suppliers
ON Products.SupplierID=Suppliers.SupplierID
66. ORDER BY Suppliers.CompanyName
3.b- te emertohen kollonat ne shqip.
SELECT Products.ProductID 'KodiProduktit',Products.ProductName 'EmriProduktit',
Suppliers.CompanyName 'Furnitori'
FROM Products INNER JOIN Suppliers
ON Products.SupplierID=Suppliers.SupplierID
ORDER BY Suppliers.CompanyName
3.c-te afishohen vetem produktet e kategorise me kodin 8 (seafood)
SELECT Products.ProductID 'KodiProduktit',Products.ProductName 'EmriProduktit',
Suppliers.CompanyName 'Furnitori'
FROM Products INNER JOIN Suppliers
ON Products.SupplierID=Suppliers.SupplierID
WHERE Products.CategoryID=8
ORDER BY Suppliers.CompanyName
3.d :te afishohen vetem produktet qe nuk jane shitur asnjehere
SELECT Products.ProductID 'KodiProduktit',Products.ProductName 'EmriProduktit',
Suppliers.CompanyName 'Furnitori'
FROM Products INNER JOIN Suppliers
ON Products.SupplierID=Suppliers.SupplierID
67. WHERE Products.ProductID NOT IN
(
SELECT DISTINCT ProductID FROM [Order Details]
)
ORDER BY Suppliers.CompanyName
3.e- Te afishojme produktet qe jane shitur ne Denmark
Zgjidhje
select ProductID,ProductName,
Suppliers.CompanyName as 'SupplierName'
from products inner join Suppliers
on products.SupplierID=suppliers.SupplierID
where products.ProductID
in
(
select DISTINCT ProductId from [Order Details]
where OrderId IN
(
select OrderID
from Orders
where ShipCountry='Denmark'
)
)
68. Zgjidhje me JOIN
SELECT Products.ProductID, Products.ProductName, Suppliers.CompanyName AS SupplierName,
Orders.ShipCountry
FROM
Suppliers INNER JOIN
Products ON Suppliers.SupplierID = Products.SupplierID INNER JOIN
[Order Details] ON Products.ProductID = [Order Details].ProductID INNER JOIN
Orders ON [Order Details].OrderID = Orders.OrderID
WHERE
(Orders.ShipCountry = N'Denmark')
3.f-Te afishohen vetem produktet qe jane shitur me shtrenjt se 500 euro copa
Zgjidhje
SELECT Products.ProductID 'KodiProduktit',Products.ProductName 'EmriProduktit',
Suppliers.CompanyName 'Furnitori'
FROM Products INNER JOIN Suppliers
ON Products.SupplierID=Suppliers.SupplierID
WHERE Products.ProductID NOT IN
(
SELECT DISTINCT ProductID FROM [Order Details]
69. where UnitPrice>500
)
ORDER BY Suppliers.CompanyName
Zgjidhja duke perdorur JOIN
SELECT
Products.ProductID, Products.ProductName,
Suppliers.CompanyName AS SupplierName,
[Order Details].UnitPrice
FROM
Products INNER JOIN
Suppliers ON Products.SupplierID = Suppliers.SupplierID
INNER JOIN
[Order Details] ON Products.ProductID = [Order Details].ProductID
WHERE
([Order Details].UnitPrice > 200)
Ushtrim 4 Te afishohet kodi,data e porosise si edhe emri i sherbimit postar per te gjithe porosite
OrderId Orderdate ShipperName
...
zgjidhje
...
...
70. SELECT Orders.OrderID,Orders.OrderDate,Shippers.CompanyName
FROM ORDERS INNER JOIN Shippers
ON Orders.ShipVia=Shippers.ShipperID
UShtrim 5 Te afishohet kodi,data e porosise si edhe emri i sherbimit postar dhe emri i kompanise klient
OrderId OrderDate
ShipperName
CustomerrName
............ ............
............
............
HINT: -JOIN me 3 tabela
SELECT Orders.OrderID,Orders.OrderDate,Shippers.CompanyName,Customers.CompanyName
FROM Orders INNER JOIN Shippers ON Orders.ShipVia=Shippers.ShipperID
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
-- JOIN me me shume se 3 tabela
--te afishohet kodi,data e porosise si edhe emri i sherbimit postar
--dhe Emri i kompanise klient si edhe emrin dhe mbiemrin e punonjesit
-- qe e ka trajtuar ate porosi
SELECT Orders.OrderID,Orders.OrderDate,Shippers.CompanyName,Customers.CompanyName,
71. Employees.FirstName,Employees.LastName
FROM Orders INNER JOIN Shippers ON Orders.ShipVia=Shippers.ShipperID
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
INNER JOIN Employees ON Orders.EmployeeID=Employees.EmployeeID
SELF JOIN
Ushtrim
Te afishojme per cdo punonjes, kodin,emrin, mbiemrin, pozicionin e punes, titullin e kortezise dhe emrin
dhe mbiemrin e shefit te tij
Kodi
Emri
Mbiemri Pozicioni
Titulli
EmriShefit
Zgjidhje
select vartesit.EmployeeID,
vartesit.TitleOfCourtesy,
vartesit.FirstName,vartesit.LastName,
vartesit.Title,vartesit.ReportsTo,
shefat.EmployeeID,shefat.FirstName,shefat.LastName
from
employees as vartesit
LEFT OUTER JOIN
Mbiemri
Shefit
72. Employees as shefat
on vartesit.ReportsTo=shefat.EmployeeID
order by vartesit.EmployeeID
JOIN DHE GROUP BY
Ushtrim
Te afishojme librin e shitjeve ne kompanine Northwind sipas formatit te meposhtem:
OrderId OrderDate
...
EmerKlienti
...
EmerPunonjesi
...
...
VleraEPorosise
...
Te mbledhim te dhenat qe na duhen per kete llogaritje
select
Orders.OrderID,OrderDate,Employees.FirstName+' '+Employees.LastName,
Customers.CompanyName,UnitPrice,Quantity
from
Employees inner join Orders
on Employees.EmployeeID=Orders.EmployeeID
inner join Customers
On Customers.CustomerID=Orders.CustomerID
inner join [Order Details]
on [Order Details].OrderID=Orders.OrderID
73. Te shtojme vleren per cdo rresht
select
Orders.OrderID,OrderDate,Employees.FirstName+' '+Employees.LastName,
Customers.CompanyName,UnitPrice,Quantity,
UnitPrice*Quantity as LineAmount
from
Employees inner join Orders
on Employees.EmployeeID=Orders.EmployeeID
inner join Customers
On Customers.CustomerID=Orders.CustomerID
inner join [Order Details]
on [Order Details].OrderID=Orders.OrderID
Libri i shitjeve
select
Orders.OrderID,OrderDate,
Employees.FirstName+' '+Employees.LastName as Employee,
Customers.CompanyName,
SUM(UnitPrice*Quantity) as Amount
from
Employees inner join Orders
on Employees.EmployeeID=Orders.EmployeeID
74. inner join Customers
On Customers.CustomerID=Orders.CustomerID
inner join [Order Details]
on [Order Details].OrderID=Orders.OrderID
group by Orders.OrderID,OrderDate,Employees.FirstName+' '+Employees.LastName,
CompanyName
Interesohemi vetem per vitin 1996, do perdorim where apo having?
per perfomancen perdorim where
Interesohemi vetem per poriste mbi 100 euro, do perdorim where apo having?
Filtrimi behet sipas shumes qe llogaritet me funksion grupi SUM. D,th pasi rreshtat jane grupuar. Pas
kesaj nuk perdorim dot me where.
Duam te shtojme edhe cmimin mesatar te produkteve te shitura
select
Orders.OrderID,OrderDate,
Employees.FirstName+' '+Employees.LastName as Employee,
Customers.CompanyName,
SUM(UnitPrice*Quantity) as Amount,
AVG(UnitPrice) as AvgPrice
from
75. Employees inner join Orders
on Employees.EmployeeID=Orders.EmployeeID
inner join Customers
On Customers.CustomerID=Orders.CustomerID
inner join [Order Details]
on [Order Details].OrderID=Orders.OrderID
group by Orders.OrderID,OrderDate,Employees.FirstName+' '+Employees.LastName,
CompanyName
JOINS dhe GRUPIMI
Detyre 1a) Te afishojme librin e shitjeve te kompanise Northwind
Kodi
Data
Emri
Mbiemri Klienti
Zgjidhje
SELECT
Orders.OrderID AS Kodi,
Orders.OrderDate AS Data,
Employees.FirstName AS Emri,
Employees.LastName AS Mbiemri,
Customers.CompanyName AS Klienti,
Vlera
76. SUM([Order Details].UnitPrice * [Order Details].Quantity) as Vlera
FROM
Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
INNER JOIN
Employees ON Orders.EmployeeID = Employees.EmployeeID
INNER JOIN
[Order Details] ON Orders.OrderID = [Order Details].OrderID
GROUP BY Orders.OrderID,
Orders.OrderDate,
Employees.FirstName,
Employees.LastName,
Customers.CompanyName
1.b) Te afishojme vetem shitjet e realizuara ne USA
Hint: Join me grupi dhe me klauzole where
Zgjidhje
SELECT
Orders.OrderID AS Kodi,
Orders.OrderDate AS Data,
Employees.FirstName AS Emri,
Employees.LastName AS Mbiemri,
Customers.CompanyName AS Klienti,
SUM([Order Details].UnitPrice * [Order Details].Quantity) as Vlera
77. FROM
Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
INNER JOIN
Employees ON Orders.EmployeeID = Employees.EmployeeID
INNER JOIN
[Order Details] ON Orders.OrderID = [Order Details].OrderID
WHERE Orders.ShipCountry='USA'
GROUP BY Orders.OrderID,
Orders.OrderDate,
Employees.FirstName,
Employees.LastName,
Customers.CompanyName
1.c. Te afishojme vetem shitjet me vlere me te madhe se 4000 euro te shitura ne USA
Hint: Join me Group By, Where dhe Having
SELECT
Orders.OrderID AS Kodi,
Orders.OrderDate AS Data,
Employees.FirstName AS Emri,
Employees.LastName AS Mbiemri,
Customers.CompanyName AS Klienti,
SUM([Order Details].UnitPrice * [Order Details].Quantity) as Vlera
78. FROM
Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
INNER JOIN
Employees ON Orders.EmployeeID = Employees.EmployeeID
INNER JOIN
[Order Details] ON Orders.OrderID = [Order Details].OrderID
WHERE Orders.ShipCountry='USA'
GROUP BY Orders.OrderID,
Orders.OrderDate,
Employees.FirstName,
Employees.LastName,
Customers.CompanyName
HAVING SUM([Order Details].UnitPrice * [Order Details].Quantity)>4000
1.d Duam te analizojme shitjet e kompanise ne vitin 1996 muaj pas muaji, sipas formatit te meposhtem
Kodi
Data
Emri
Zgjidhje
SELECT
Orders.OrderID,
Mbiemri Klienti
Muaji
Vlera
79. Employees.FirstName,
Employees.LastName,
Customers.CompanyName,
MONTH(Orders.OrderDate) as muaji,
sum([Order Details].UnitPrice* [Order Details].Quantity)
FROM
Customers INNER JOIN
Orders ON Customers.CustomerID = Orders.CustomerID INNER JOIN
Employees ON Orders.EmployeeID = Employees.EmployeeID INNER JOIN
[Order Details] ON Orders.OrderID = [Order Details].OrderID
Where YEAR(OrderDate)=1996
GROUP BY Orders.OrderID,
Employees.FirstName,
Employees.LastName,
Customers.CompanyName,
MONTH(Orders.OrderDate)
1.e - Te afishojme xhiron e cdo punonjesi ne cdo muaj
-- do eliminojme detaje (Klientin , kodin i porosise)
Zgjidhje
SELECT
Employees.FirstName,
Employees.LastName,
80. MONTH(Orders.OrderDate) as muaji,
sum([Order Details].UnitPrice* [Order Details].Quantity) as vlera
FROM
Customers INNER JOIN
Orders ON Customers.CustomerID = Orders.CustomerID INNER JOIN
Employees ON Orders.EmployeeID = Employees.EmployeeID INNER JOIN
[Order Details] ON Orders.OrderID = [Order Details].OrderID
Where YEAR(OrderDate)=1996
GROUP BY
Employees.FirstName,
Employees.LastName,
MONTH(Orders.OrderDate)
1-f: Te afishojme xhiron ne total per cdo muaj ne vitin 1996
zgjidhje
SELECT
MONTH(Orders.OrderDate) as muaji,
sum([Order Details].UnitPrice* [Order Details].Quantity) as vlera
FROM
Customers INNER JOIN
Orders ON Customers.CustomerID = Orders.CustomerID INNER JOIN
Employees ON Orders.EmployeeID = Employees.EmployeeID INNER JOIN
[Order Details] ON Orders.OrderID = [Order Details].OrderID
Where YEAR(OrderDate)=1996
81. GROUP BY
MONTH(Orders.OrderDate)
Detyre
2.1 Te afishojme xhiron financiare per cdo punonjes ne formatin
EmployeeId
Firstname
Lastname
Turnover
.........
...........
...............
.............
select Employees.EmployeeID,FirstName,LastName,
SUM(UnitPrice*Quantity) as TurnOver
from Employees Inner join Orders
on Employees.EmployeeID=Orders.EmployeeID
inner join [Order Details] on Orders.OrderID=[Order Details].OrderID
group by Employees.EmployeeID,FirstName,LastName
2.2. Interesohemi vetem per vitin 1996 por duam te dime xhiron per cdo muaj, sipas formatit me poshte
Informacione shtese: Funksione mbi datat
PRINT GETDATE()
SELECT GETDATE()
82. SELECT DATEDIFF(YEAR,'1998-9-1',GETDATE())
SELECT DATEDIFF(MONTH,'1998-9-1',GETDATE())
SELECT DATEDIFF(DAY,'1998-9-1',GETDATE())
SELECT DATEDIFF(HOUR,'1998-9-1',GETDATE())
SELECT DATEADD(DAY,-10,GETDATE())
SELECT * FROM Orders
WHERE OrderDate
BETWEEN '1996-1-1' AND DATEADD(DAY,3000,'1996-1-1')
SELECT CONVERT(VARCHAR,DATEPART(HOUR,GETDATE())) + ':' +
CONVERT(VARCHAR,DATEPART(MINUTE,GETDATE())) + ':'+
CONVERT(VARCHAR,DATEPART(SECOND,GETDATE()))
EmployeeID
...
Firstname
...
Lastname
...
InterstedMonth
..
Turnover
...
83. select Employees.EmployeeID,FirstName,LastName,DATEPART(MONTH,Orderdate) as
'InterestedMonth',
SUM(UnitPrice*Quantity) as TurnOver
from Employees Inner join Orders
on Employees.EmployeeID=Orders.EmployeeID
inner join [Order Details] on Orders.OrderID=[Order Details].OrderID
where OrderDate between '1996-1-1' and '1997-1-1'
group by Employees.EmployeeID,FirstName,LastName,DATEPART(MONTH,Orderdate)
order by Employees.EmployeeID,InterestedMonth
I njejti rezultat merret me funksionin MONTH
select Employees.EmployeeID,FirstName,LastName,Month(Orderdate) as 'InterestedMonth',
SUM(UnitPrice*Quantity) as TurnOver
from Employees Inner join Orders
on Employees.EmployeeID=Orders.EmployeeID
inner join [Order Details] on Orders.OrderID=[Order Details].OrderID
where OrderDate between '1996-1-1' and '1997-1-1'
84. group by Employees.EmployeeID,FirstName,LastName,Month(Orderdate)
order by Employees.EmployeeID,InterestedMonth
Detyre 3.1 - Te afishojme xhiron financiare te klienteve sipas formatit te meposhtem
Kodi
Klienti
Xhiro
.....
.........
.........
Zgjidhje
3.2 interesohemi vetem per klientet qe kemi ne USA
3.3. Interesohemi per klientet qe kompania ka ne USA,
qe kane realizuar nje xhiro me te madhe se 2000 euro
85. Shembull me produktet dhe kategorite
select Products.ProductID as 'KodiProduktit',
Products.ProductName 'EmriProduktit',
Categories.CategoryID 'KodiKategorise',
Categories.CategoryName 'EmriKategorise'
from
Products RIGHT OUTER JOIN Categories
ON Categories.CategoryID=Products.CategoryID
where Categories.CategoryID>6
order by Categories.CategoryID desc
-- JOIN DHE GRUPIMI
-- shembull me produktet dhe kategorite
SELECT Categories.CategoryID,CategoryName,
ProductID,Productname
FROM
Categories LEFT OUTER JOIN Products
on Categories.CategoryID=Products.CategoryID
-- TI GRUPOJME DHE NUMEROJME
86. SELECT Categories.CategoryID,CategoryName,
COUNT(ProductID) 'Produkte'
FROM
Categories LEFT OUTER JOIN Products
on Categories.CategoryID=Products.CategoryID
GROUP BY Categories.CategoryID,CategoryName
-- po nese nuk e vendosim categoryname tek group by
SELECT Categories.CategoryID,CategoryName,
COUNT(ProductID) 'Produkte'
FROM
Categories LEFT OUTER JOIN Products
on Categories.CategoryID=Products.CategoryID
GROUP BY Categories.CategoryID
-- AFISHON GABIM
--Column 'Categories.CategoryName' is invalid in the select list because it
is not contained
--in either an aggregate function or the GROUP BY clause.
-- po nese numerojme rreshtat count(*)
SELECT Categories.CategoryID,CategoryName,
COUNT(*) 'Produkte'
FROM
Categories LEFT OUTER JOIN Products
87. on Categories.CategoryID=Products.CategoryID
GROUP BY Categories.CategoryID,CategoryName
-- gabimisht numeron nje produkt nga kategoria bosh
-- pse ? se numerojme rreshtat jo vlerat product id?
-- producti d per kategorine 9 eshte NULL qe nuk numerohet nga count
-- e sakte
SELECT Categories.CategoryID,CategoryName,
COUNT(ProductID) 'Produkte'
FROM
Categories LEFT OUTER JOIN Products
on Categories.CategoryID=Products.CategoryID
GROUP BY Categories.CategoryID,CategoryName
-- mund te perdorim where?????
-- po psh dua te gjithe produktet qe kam me pak se 10 njesi ne stok
SELECT Categories.CategoryID,CategoryName,
COUNT(ProductID) 'Produkte'
FROM
Categories LEFT OUTER JOIN Products
on Categories.CategoryID=Products.CategoryID
WHERE Products.UnitsInStock<10
GROUP BY Categories.CategoryID,CategoryName
88. -- po having
-- per shembull dua vetem ato kategori
--qe kane me pak se 2 produkte me pak stok
SELECT Categories.CategoryID,CategoryName,
COUNT(ProductID) 'Produkte'
FROM
Categories LEFT OUTER JOIN Products
on Categories.CategoryID=Products.CategoryID
WHERE Products.UnitsInStock<10
GROUP BY Categories.CategoryID,CategoryName
HAVING COUNT(ProductID)<2
-- AFISHONI EMRAT(EMER,MBIEMRI) E PUNONJESVE TE CILET KANE
--REALIZUAR ME SHUME SE 15 POROSI
--NE PERIUDHEN 1996-1-1 DERI 1997-1-1
SELECT
Employees.EmployeeID,FirstName,LastName,
COUNT(OrderID) as 'NrPorosive'
FROM
Employees INNER JOIN Orders
on Employees.EmployeeID=Orders.EmployeeID
where OrderDate between '1996-1-1' and '1997-1-1'
group by Employees.EmployeeID,FirstName,LastName
having COUNT(OrderID)>15
89. -- AFISHONI klientet(CustomerId,CompanyName) TE CILET KANE
--REALIZUAR ME SHUME SE 10 POROSI
--NE PERIUDHEN 1996-1-1 DERI 1997-1-1
SELECT Customers.CustomerID,CompanyName,
count(OrderID) as 'NrPorosi'
FROM Customers inner join Orders
on Customers.CustomerID=Orders.CustomerID
where OrderDate between '1996-1-1' and '1997-1-1'
group by Customers.CustomerID,CompanyName
having count(OrderID)>3
-- AFISHONI kompanite e transporti
--Shippers(ShipperId,CompanyName) TE CILET KANE
--TRAJTURAR ME SHUME SE 10 POROSI
--NE PERIUDHEN 1996-1-1 DERI 1997-1-1
SELECT
ShipperID,CompanyName,Count(OrderID) as 'Porosi'
FROM Shippers INNER JOIN Orders
ON Shippers.ShipperID=Orders.ShipVia
where OrderDate between '1996-1-1' and '1997'
group by ShipperID,CompanyName
having COUNT(OrderID)>10
90. -- DETYRE
-- Afishoni te njejtat rezultate
--por me filter where ShipCountry='USA'
-- DETYRE AVANCUAR
-- AFISHONI Emrat e punonjesve kodet dhe
--vlerat e porosive qe kane vlere me te madhe se 300 euro
91. Komanda INSERT
Komanda INSERT ruan rreshta ne tabela. Kjo komande ka dy forma:
1) INSERT [INTO] tab_name [(col_list)]
VALUES ({ DEFAULT | NULL | expression } [ ,...n] )
2) INSERT INTO tab_name | view_name [(col_list)]
{select_statement | execute_statement}
Forma e pare perdoret per te shruar nje rresht me vlera ne tabele.
Forma e dyte shton ne tabele ruan ne tabele nje bashkesi rreshtash te kthyer nga nje komande SELECT
ose nga nje "STORED PROCEDURE", e cila ekzekutohet me ane te komandes "EXECUTE".
Me te dy menyrat, cdo vlere qe ruhet duhet te kete nje tip te dhene i cili te jete kompatibel me tipin e te
dhenes se kolones korresponduese te tabeles. Per te garantuar kompatibilitetin, te gjitha vlerat me baze
karakteresh duhet patjeter qe te futen ne apostrofa, kurse per vlerat numerike nje gje e tille nuk eshte e
nevojshme.
Ruajtja e nje rreshti te vetem
Ne te dy menyrat e komandes INSERT percaktimi i listes se kolonave eshte opsional. Nese lista e
kollonave nuk vendoset atehere merret per baze lista e kollonave sipas struktures se tabeles. Vlerat qe
duhet ti korrespondojne kollonave sipas struktures se tabeles.
Nqs nje kolone eshte e percaktuar si “IDENTITY”, vlera qe krijohet automatikisht nga sistemi do
te ruhet ne kolonen perkatese. Nuk eshte e munudr qe te vendosim nje vlere ne kollonat e tipit
IDENTITY nepermjet nje komande INSERT.
Nese per kollonat qe lejojne vlera NULL nuk percaktohet nje vlere atehere tek ko do te ruhet
vlera NULL.
Nese vlera per nje kollone nuk eshte percaktuar ne nje komande INSERT atehere:
92.
Nese per ate kollone ka nje vlere DEFAULT te percaktuar ne strukturen e tabeles,
ne ate kollone do te ruhet vlera default. Kjo do te ndodhe pavaresishte nese
kollona lejon vlera NULL apo jo.
Nese kollona nuk lejon vlera NULL dhe per te eshte percaktuar nje vlere
DEFAULT komanda insert ekzekutohet pa gabime.
Nese per ate kollone nuk ka vlere DEFAULT atehere:
o Nese kollona lejon vlera NULL ne kete kollone do te ruhet vlera NULL
o Nese kollona nuk lejon vlera NULL atehere komanda INSERT do te
deshtoje me nje mesazh gabimi
Shembujt me poshte ilustrojne perdorimin e komandes INSERT
Per shembull
INSERT INTO Employees(FirstName,LastName)
values ('John','Smith')
Komanda me lart shton ne tabelen Employees punonjesin John Smith. Ne te
gjitha kollonat e tjera qe nuk permenden ne komande vendoset vlera NULL.
Nese per kollonen HireDate percaktojme nje vlere DEFAULT te barabarte me
getdate(), i cili eshte nje funksion i SQL qe kthen kohen e momentit atehere
komanda:
INSERT INTO Employees(FirstName,LastName,HireDate)
values ('John','Smith',DEFAULT)
si edhe komanda:
INSERT INTO Employees(FirstName,LastName)
values ('John','Smith')
Do te shtojne nje punonjes me emrin John Smith qe merret ne pune ne castin e shtimit
te rreshtit ne tabele.
Ndersa komandat me poshte jana gabim nga ana sintaksore ndaj do te deshtonin me
nje mesazh gabimi.
INSERT INTO Employees(FirstName,LastName,HireDate)
values ('John','Smith',)
INSERT INTO Employees(FirstName,LastName,HireDate)
values ('John','Smith')
93. “Table Value Constructors” dhe INSERT
Me SQL Server 2008 Microsoft ka shtuar nje funksionalitet te ri te quajtur “table
value constructor”, e cila ju lejon te vendosni disa rreshta ne nje DML.
Shembulli me poshte tregon se si mund te shtohen disa rreshta duke perdorur konstruktoret e
komandes INSERT.
INSERT INTO Employees(FirstName,Lastname,Title)
VALUES
('Marie', 'Meielleur', 'Sales Account Manager'),
('Marie-Pierre', 'Dubost', 'Sales manager'),
('Mariel', 'Montmatre', 'Marteking Specialist')
Komanda insert ne shembullin e mesiperm 3 rreshta ne te njejten kohe ne tabelen Employees.
Numri maksimal i rreshtave qe mund te shtohen me kete menyre eshte 1000.
Perdorimi i konstruktorit te vlerave te tabeles per te shtuar disa rreshta ne tabele
nepermjet nje komande INSERT ndryshon funksionalisht nga perdorimi i disa
komandave INSERT per te shtuar te njejtat rreshta ne tabele. Ne rastin e perdorimit
te konstruktorit te vlerave te tabeles shtimi i rreshtave eshte nje instruksion (nje
transksion ne fakt) ndersa disa komanda insert jane disa instruksione (
transaksione te pavarura ne AUTOCOMMIT mode).
Per te kuptuar dallimin do te perdorim nje shembull. Do te shtojme tre
punonjes ne tabelen punonjesit duke perdorur te dy menyrat.
Menyra e pare - Shtimi i rreshtave duke perdorur konstruktorin e vlerave te
tabeles
Nese ekzekutojme komanden e meposhtme:
INSERT INTO Employees(FirstName,Lastname,Title)
VALUES
(NULL, 'Meielleur', 'Sales Account Manager'),
('Marie', 'Dubost', 'Sales manager'),
94. ('Mariel', 'Montmatre', 'Marteking Specialist')
SQL Serveri do te afishoje nje mesazh gabimi te ngjashem me mesazhin e
meposhtem:
Cannot insert the value NULL into column 'FirstName', table
'Northwind.dbo.Employees'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Shkaku per kete gabim eshte sepse ne rreshtin e pare tentojme te shtojme nje punonjes
me mbiemrin Meielleur, emrin e te cilit e kemi vendosur NULL. Struktura e
tabeles Employees nuk lejon vlera NULL ne kollonen Firstname, prandaj
afishohet mesazhi i gabimit dhe komanad deshton.
Po cfare ka ndodhur me dy punonjesit e tjere? A jane shtuar Marie Dubost
dhe Mariel Montmatre ne listen e punonjesve?
Po te verifikojme permbajtjen e tabeles Employees do te veme re qe keta
punonjes nuk jane shtuar. Pra komanda ka patur nje gabim ndaj ka deshtuar.
Menyra e dyte - Shtimi i rreshtave me komanda INSERT te pavarura
Nese per shtimin e tre punonjesve perdorim tre komanda INSERT si me poshte:
INSERT INTO Employees(FirstName,Lastname,Title)
VALUES
(NULL, 'Meielleur', 'Sales Account Manager')
INSERT INTO Employees(FirstName,Lastname,Title)
VALUES ('Marie', 'Dubost', 'Sales manager')
INSERT INTO Employees(FirstName,Lastname,Title)
VALUES ('Mariel', 'Montmatre', 'Marteking Specialist')
Serish do te na shfaqet nje mesazh gabimi i ngjashem me :
Cannot insert the value NULL into column 'FirstName', table
'Northwind.dbo.Employees'; column does not allow nulls. INSERT fails.
The statement has been terminated.
95. (1 row(s) affected)
(1 row(s) affected)
Por ne dallim nga komanda e pare nese verifikojme ne tabelen Employees do te veme
re qe dy punonjesit e tjere Marie Dubost dhe Mariel Montmatre jane shtuat ne
listen e punonjesve.
FORMA E DYTE INSERT me nje SELECT
Do te ndertojme nje tabele ndihmese per ilustrim punonjes. Kodi me poshte krijon tabelen punonjes
USE [Northwind]
GO
CREATE TABLE [dbo].[punonjes](
[EmployeeID] [int] NOT NULL,
[LastName] [nvarchar](20) NOT NULL,
[FirstName] [nvarchar](10) NOT NULL,
[Title] [nvarchar](30) NULL,
[TitleOfCourtesy] [nvarchar](25) NULL,
[BirthDate] [datetime] NULL,
[HireDate] [datetime] NULL,
[Address] [nvarchar](60) NULL,
[City] [nvarchar](15) NULL,
[Region] [nvarchar](15) NULL,
[PostalCode] [nvarchar](10) NULL,
[Country] [nvarchar](15) NULL,
96. [HomePhone] [nvarchar](24) NULL,
[Extension] [nvarchar](4) NULL,
[Photo] [image] NULL,
[Notes] [ntext] NULL,
[ReportsTo] [int] NULL,
[PhotoPath] [nvarchar](255) NULL,
[AddedOn] [datetime] NULL,
[AddedBy] [varchar](50) NULL,
CONSTRAINT [PK_punonjes] PRIMARY KEY CLUSTERED
(
[EmployeeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Te shtojme ne tabelen punonjes
vetem personat me titullin Dr. nga tabela Employees
INSERT INTO Punonjes(EmployeeId,Firstname,Lastname)
select EmployeeId,Firstname,Lastname from Employees
where TitleOfCourtesy='Dr.'
Te shtojme ne tabelen punonjes
vetem personat me titullin Ms.
97. INSERT INTO Punonjes
select * from Employees
where TitleOfCourtesy='Ms.'
Do ti rikthehmi kur te flasim per funksionet tabele
Shembulli me poshte ilustron perdorimin e komandes SELECT qe shton ne
tabele nje bashkesi rreshtash qe kthehen nga nje komande SELECT
CREATE FUNCTION liber(@dt1 DATETIME, @dt2 DATETIME)
RETURNS @L TABLE
(
Kodi INT PRIMARY KEY,
Data DATETIME,
Punonjesi VARCHAR(50),
Klienti VARCHAR(50),
Vlera MONEY
)
AS
BEGIN
INSERT INTO @L(Kodi,Data,Punonjesi,Klienti,Vlera)
SELECT
Orders.OrderID,Orders.OrderDate,
FirstName+' '+LastName,
Customers.CompanyName,
SUM(UnitPrice*Quantity)
FROM Orders inner join [Order Details]
98. ON Orders.OrderID=[Order Details].OrderID
INNER JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID
INNER JOIN
Customers
ON Orders.CustomerID=Customers.CustomerID
WHERE OrderDate BETWEEN @dt1 and @dt2
GROUP BY
Orders.OrderID,Orders.OrderDate,
FirstName+' '+LastName,
Customers.CompanyName
RETURN
END
Komanda UPDATE
Komanda UPDATE modifikon permbajtjen e nje tabele.
Komanda UPDATE ka formen e pergjithshme si me poshte:
UPDATE <emer_tabele>
{ SET column_1 = {expression | DEFAULT | NULL} [,...n]
[FROM tab_name1 [,...n]]
[WHERE condition]
Modifikimi aplikohet ne treshtat e tabeles <emer_tabele> per te cilat kushtin WHERE eshte i
vertete. Klauzola where eshte opsionale dhe ne kete rast modifikimi aplikohet ne te gjithe
99. rreshtat e tabeles.
Per cdo rresht qe do te modifikohet komanda UPDATE ndryshon vleren e
kollonave qe jane specifikuar ne listen “SET”, duke ju vendosur nje vlere
konstante ose nje shprehje variablash.
Shembull 1 - Te modifikohet pozicioni i punonjesit Nancy Davolio (EmployeeId=1) nga Sales
Reppresentative ne Sales Manager.
UPDATE Employees
SET Title = 'Sales Manager'
WHERE EmployeeID = 1
Shembull 2
Te ndryshojme pozicionin e punes te te gjithe punonjesve qe e kane pozicionin Sales
reppresentative ne emertimin Sales Manager .
UPDATE Employees
SET Title='Sales Manager'
WHERE Title='Sales Representative'
Shembull 3
Te promovohen ne pozicionin Board Member te gjithe punonjesit qe kane
realizuar me shume se 100 porosi.
UPDATE Employees
set Title='Board Member'
WHERE EmployeeID IN
(
SELECT EmployeeID
FROM Orders
100. Group BY EmployeeID
HAVING COUNT(*)>100
)
Shembulli 3 perdor tekniken e subquery duke percaktuar nepermjet nje query te brendeshme
ne klauzolen WHERE te komandes UPDATE cilet jane rreshtat ku do te aplikohet modifikimi.
Shembull 4 Te ndryshojme pozicionin e punes se punonjesve qe kane realizuar porosi gjate vitit
1996. Komanda me poshte ilustron perdorimin e klauzoles FROM.
UPDATE Employees
SET Title='Board Member'
FROM Employees,Orders
WHERE Employees.EmployeeID=Orders.EmployeeID
AND OrderDate BETWEEN '1998-5-6' AND '1999-2-1'
Ne kete shembull ilustrohet perdorimi i kaluzoles from per te perfshire ne komanden UPDATE
edhe nje tjeter tabele, tabela Orders. Kjo tabele e dyte eshte e nevojshme per shkak se kollona
Orderdate do te sherbeje per te percaktuar cilat rreshta do te modifikohen. Vendosja e dy
tabelava te ndara me presje Employees,Orders e kombinuar me
Employees.EmployeeID=Orders.EmployeeID realizon INNER JOIN midis
dy tabelave, duke mundesuar qe ndersa modifikohet nje kollone e tabeles
Employees, kollona Title, te perdoret nje kollone e tables Orders per te filtruar
rreshtat.
kushtin
Shembull 5 - Perdorimi i CASE ne komanden UPDATE
Ne kete shembull te fundit do te ilustrojme perdorimin e CASE ne komanden UPDATE.
Nepermjet konstruktit CASE kemi mundesi qe te modifikojme vleren e nje kollone bazuar ne
vleren qe ajo ka aktualisht. Supozojme se na paraqitet situata e meposhtme:
101. Kompania Northwind vendos te modifikoje cmimet e produkteve te saj duke aplikuar nje rritje
te pershkallezuar 10%, 20% dhe 30%. Cmimi do te rritet mbi bazen e cmimit aktual te
produktit.
Nese cmimi i produktit per njesi eshte me i ulet se 20 euro atehere rritja do te jete 10%,
Nese cmimi i produktit do te jete me i larte se 20 dhe me i ulet se 5o euro atehere rritja do te
jete 20% ,
ndersa nese cmimi aktual eshte me i larte se 50 euro per njesi rritja do te jete 30%.
Komanda me poshte realizon kete kerkese kerkese:
UPDATE Products
SET UnitPrice = CASE
WHEN UnitPrice <20
THEN UnitPrice*1.1
WHEN UnitPrice between 20 and 50 THEN UnitPrice*1.2
ELSE UnitPrice*1.3
END
Konstrukti CASE kthen nje shprehje ne varesi te kushtit llogjik, por kjo shprehje nuk
eshte e thene te jete e bazuar ne kollonen qe po modifikohet.
Shembujt me poshte e ilustrojne kete rast:
UPDATE Products
SET UnitPrice = CASE
WHEN CategoryID =1
THEN UnitPrice*1.1
WHEN CategoryID =2 THEN UnitPrice*1.2
ELSE UnitPrice*1.3
END
Kjo komande ndryshon cmimet e produkteve duke u bazuar ne kodin e
kategorise se ciles ato i perkasin. Cmimet e produkteve te kategorise 1 rriten
me 10% cmimet e produkteve te kategorise 2 rriten me 20% ndersa te gjithe
kategorite e tjera rriten me 30%.
102. Gjithashtu nuk eshte gabim qe tek kushti WHEN te perdoren dy kollona te ndryshme por ne
kete rast duhet te jemi te kujdesshem me interpretimin:
UPDATE Products
SET UnitPrice = CASE
WHEN CategoryId=1
WHEN
THEN UnitPrice*1.1
ProductID=1 THEN 200
ELSE UnitPrice*1.3
END
Komanda e mesiperme do te aplikoje nje rritje cmimesh me 10% per te gjithe produktet e
kategorise 1 perfshire produktin me kodin 1 dhe nje rritje cmimesh prej 30% per te gjithe
proiduktet e tjera.
Komanda DELETE
Komanda DELETE fshin rreshta nga tabelat.Kjo komande ka dy forma te ndryshme:
DELETE FROM table_name
[WHERE <shrehje llogjike>];
DELETE table_name
FROM table_name [,…]
[WHERE condition];
103. Te gjithe rreshtat qe plotesojne kushtin WHERE do te fshihen. Listimi ne menyre eksplicite e
kolonave te nje tabele nuk eshte e nevojshme (dhe nuk lejohet), sepse komanda DELETE operon
mbi rreshtat dhe jo mbi kolonat.
Shembull1
Te fshijme te gjithe punonjesit me kodin me te madh se 9:
DELETE FROM Employees
WHERE EmployeeID > 9
Kushti WHERE ne komanden DELETE mund te permbaje nje query te
brendeshme, per shembull:
Shembull 2
Te fshijme te gjithe punonjesit qe nuk kane realizuar asnje porosi:
DELETE FROM Employees
where EmployeeID
NOT IN (SELECT EmployeeID FROM Orders)
Shembull 3 Komanda DELETE ne menyre analoge me komanden UPDATE, mund te perdore
edhe klauzolen FROM per te marre nepermjet JOIN kollona nga tabela te tjera qe te perdoren
ne klauzolen WHERE. Te fshijme te gjithe punonjesit qe kane realizuar shitje brenda nje
periudhe te caktuar.
DELETE Employees
FROM Employees,Orders
WHERE Employees.EmployeeID=oRDERS.EmployeeID
AND OrderDate BETWEEN '1999-1-1' AND '2000-1-1'
104. Kujdes:
Perdorimi I klauzoles WHERE ne komanden DELETE eshte opsional. Ne qofte se klauzola WHERE
mungon, te gjithe rreshtat e tabeles do te fshihen.
Komanda TRUNCATE TABLE
Per fshirjen e permbajtjes se tabeles mund te perdoret edhe komanda TRUNCATE TABLE.
Kjo komande perdoret rralle pasi ajo fshin te gjithe rreshtat e tabeles. Kjo komande nuk ka
klauzole WHERE ku te percaktohet nje filter qe perzgjedh cilat rreshta do te fshihen.
Komanda TRUNCATE operon mbi PAGE ndersa komanda DELETE operon mbi rreshta, gje qe e
ben komanden TRUNCATE shume me te shpejte se komanda DELETE per fshirjen e te gjithe
rreshtave te tabeles.
Nje tjeter dallim i rendesishem midis dy komandave per fshirjen e permbajtjes se tabeles eshte
se nese fshihet permbajtja e tabeles nepermjet TRUNCATE nuk eshte e mundur qe te
ekzekutohen Triggera.
Komanda TRUNCATE TABLE ka sintaksen e meposhtme:
TRUNCATE TABLE <emer_tabele>
Klauzola OUTPUT
Rezultati i ekzekutimit te nje komande INSERT, UPDATE ose DELETE gjithmone
permban vetem tekst qe tregon numrin e rreshtave te prekur nga ky veprim (“3
rows deleted”).
Nqs ky informacion nuk eshte i mjaftueshem, mund te perdorim klauzolen
OUTPUT, e cila afishon ne menyre rreshtat qe jane prekur nga komandat
INSERT, UPDATE ose DELETE.
Klauzola OUTPUT perdor tabelat “INSERTED” dhe “DELETED” per te shfaqur rezultatin e kerkuar.
Per me teper klauzola OUTPUT mund te perdoret e kombinuar me nje shprehje INTO per ti
ruajtur rreshtat e prekur ne nje tabele tjeter.
Per kete arsye perdoret nje variable tabele per te ruajtur rezultatin.
Shembulli1 ilustron se si shprehja OUTPUT punon me nje komande DELETE.
Shembull 1 - Klauzola OUTPUT ne komanden DELETE
DELETE
Employees
105. OUTPUT DELETED.EmployeeID,deleted.lastname
WHERE EmployeeID>9
ose
DELETE
Employees
OUTPUT DELETED.*
WHERE EmployeeID>9
Kujdes:
Kushti WHERE i perket komandes DELETE, dmth ne shembullin me siperm fshihen nga
tabela Employees te gjith rreshtat qe plotesojne kushtin WHERE EmployeeID>9 dhe te gjithe
rreshtat e fshire afishohen .
Shembull 2 - Kapja e vlerave nga klauzola OUTPUT
Ne disa raste eshte e nevojshme qe rreshtat qe kthehen nga klauzola OUTPUT te
kapen dhe te ruhen ne nje tjeter tabele, per shembull per audit. Kjo gje mund te
realizohet nepermjet kombinimit te OUTPUT me klauzolen INTO. Kodi me poshte
ilustron kete teknike:
DECLARE @del_table TABLE (emp_no INT, emp_lname CHAR(20));
DELETE
Employees
OUTPUT DELETED.EmployeeID,deleted.lastname
INTO @del_table(emp_no,emp_lname)
WHERE EmployeeID>9
SELECT * FROM @del_table
Kodi i mesiperm do te afishonte nje liste me kodet dhe mbiemrat e punonjesve te fshire.
Shembull 3 - Klauzola OUTPUT ne komanden UPDATE
106. Ne komanden UPDATE klauzola OUTPUT mund te kape rreshtat e modifikuar duke lezuar ne
tabelen INSERTED dhe versionin e rreshtave para modifikimit duke lezuar tabelen DELETED.
Shembulli me poshte ilustron perdorimin e OUTPUT me komanden UPDATE
UPDATE Employees
SET Title='Sales Manager'
OUTPUT Deleted.EmployeeID,deleted.FirstName,deleted.LastName,deleted.Title
'OldTitle',inserted.Title 'NewTitle'
WHERE EmployeeID>9
Komanda e mesiperme modifikon pozicionin e punes se disa punonjesve.
Komanda afishon nje rezultat te ngjashem me figuren me poshte:
EmployeeId
Firstname
LastName
OldTitle
NewTitle
121
Marie
Pierre
NULL
Sales
Manager
122
John
Smith
NULL
Sales
Manager
Komanda MERGE
SQL Server 2008 permban dhe komanden SQL te quajtur MERGE. Kjo komande kombinon
komandat INSERT dhe UPDATE ne nje shprehje atomike, ne varesi te ekzistences se rekordit.
Aplikimi kryesor I komandes MERGE eshte ne “data warehouse”, ku tabelat duhet te freskohen
ne menyre periodike me te dhenat e reja te cilat vijne nga sistemi OLTP (online transaction
processing). Keto te dhena te reja mund te permbajne ndryshime ne rreshtat ekzistues ne
tabele dhe/ose rreshta te rinje duhet te shtohen. Nqs nje rresht ne te dhenat e reja I
korespondon me ndonje rresht ekzistues te tabeles, nje komande UPDATE duhet te
ekzekutohet. Ne te kundert nje komande INSERT duhet te ekzekutohet.
107. Versionet e meparshme se SQL Server 2008, e implementonin kete sin je sekuence me INSERT
dhe UPDATE,Duke e zgjeruar Transact-SQL me kete komande te re, SQL Server 2008 thjeshton
implementimin e data warehouse dhe e bene me performant.
Per ilustrimin e komandes MERGE do te perdorim nje tabele ndihmese me emrin punonjes.
CREATE TABLE PUNONJES
(
EmployeeId INT PRIMARY KEY,
Firstname VARCHAR(20),
Lastname VARCHAR(20),
Title VARCHAR(20)
)
Do te shtojme ne tabelen punonjes te gjithe punonjesit nga tabela Employees qe e kane
kodin me te madh se 5. Per secilin nga keta punonjes do te ruajme ne tabelen Punonjes
Title = 'NEW'
INSERT INTO PUNONJES
SELECT EmployeeID,FirstName,LastName,'NEW'
FROM Employees WHERE EmployeeID>5
Pas ketyre dy hapave parapergatitore po formulojme problemin qe kerkon zgjidhje nepermjer
komandes MERGE.
Duam te shkrijme tabelen Employees ne tabelen Punonjes. Procesi i shkrirjes te jete i tille qe:
Punonjesit qe jane ne tabelen Employees dhe nuk jane ne tabelen Punonjes te
kopjohen,
Punonjesit qe ndodhen tashme ne tabelen Punonjes te mos kopjohen por Title i tyre te
modifikohet me title qe punonjesi ka ne tabelen Employees
Kollona qe do te perdoret per te verifikuar nese nje punonjes ekziston apo jo ne te dy tabelat do te jete
kollona EmployeeID qe identifikon punonjesin.
Me poshte paraqitet komanda MERGE qe realizon kerkesen e mesiperme:
MERGE INTO PUNONJES P
USING (SELECT EmployeeId,FirstName,LastName,Title FROM Employees) E
108. ON P.EmployeeID=E.EmployeeID
WHEN MATCHED THEN
UPDATE SET P.Title=E.Title
WHEN NOT MATCHED THEN
INSERT (EmployeeId,FirstName,LastName,Title)
VALUES(E.EmployeeId,E.FirstName,E.LastName,E.Title);
Klauzola OUTPUT ne komanden MERGE
Klauzola OUTPUT mund te perdoret gjithashtu edhe me komanden MERGE
Ne kete rast klauzola OUTPUT ka ne dispozicion tabelat INSERTED dhe DELETED si edhe variablin e
sistemit $action.
Me poshte paraqitet nje version i komandes MERGE per shkrirjen e tabelave te punonjesve qe perdor
klauzolen OUTPUT:
MERGE INTO PUNONJES P
USING (SELECT EmployeeId,FirstName,LastName,Title FROM Employees) E
ON P.EmployeeID=E.EmployeeID
WHEN MATCHED THEN
UPDATE SET P.Title=E.Title
WHEN NOT MATCHED THEN
INSERT (EmployeeId,FirstName,LastName,Title)
VALUES(E.EmployeeId,E.FirstName,E.LastName,E.Title)
OUTPUT $ACTION,INSERTED.*,DELETED.* ;
-- funksioni getdate() kthen kohen e tanishme
print getdate()
select GETDATE()
109. Trigerat – “Sensoret”
Cfare jane triggerat
Si funksionon nje INSERT trigger (sensor per Insert)
Si funksionon nje DELETE trigger (sensor per delete)
Si funksionon nje update trigger (sensor per modifikim)
Cfare jane triggerat
Procedura qe ekzektuohen automatikisht nese ndodh nje kompande insert,update ose
delete ne nje tabele
Triggerat dhe komanda qe i aktivizoi ato jane pjese e e te njejtit transaksion
Si punon nje Insert trigger
Kur aktivizoeht nje INSERT trigger, rreshtat e reja shtohen edhe ne tabelen INSERTED
Tabela inserted eshte nje tabele llogjike qe mban nje kopje et rreshtave te saposhtuar.
Triggeri mund te lexoje te dhenat ne tabelen inserted per te vendosur cfare duhet te beje
Si krijohet nje INSERT trigger
CREATE TRIGGER NewCats on Categories
AFTER INSERT AS
BEGIN
select CategoryId,CategoryName from inserted
END
Si funksionon nje delete trigger
Rreshtat e fshire vendosen ne nje tabele me emrin Deleted
Tabela Deleted eshte nje tabele llogjike qe permban rreshtat e sapofshire
Si krijohet nje DELETE Trigger
CREATE TRIGGER MosFshiKat on Categories
AFTER DELETE AS
BEGIN
ROLLBACK
END
Trigeri i mesiperm nuk lejon fshirjen ne tabelen categories
Si funksionon nje update trigger
Sensori per modifikim bazohet ne te dy tabelat llogjike:
Tabela DELETED ruan versionin e rreshtave te modifikuar para modifkimit
Tabela INSERTED ruan versionin e rreshtave te modifikuar pas modifkimit
110. Si krijohet nje UPDATE Trigger
CREATE TRIGGER AfishoKatMod on Categories
AFTER UPDATE AS
BEGIN
SELECT CategoryId, CategoryName from Categories
END
Shembull me update
create trigger employeeslog
on employees
after update
as
begin
select deleted.EmployeeID,deleted.FirstName,
deleted.LastName,deleted.Title as OldPosition,
inserted.Title as NewPosition,
CURRENT_USER as ModifiedBy,
GETDATE() as ModifiedOn
from inserted inner join deleted
on inserted.EmployeeID=deleted.EmployeeID
end
Shembuj
Shembull 1
-- Nje insert trigger qe ben nje rollback
-- trigger therret nje funksion te krijuar parprakisht
-- trigeri shtimin e nje shkrimtari nese per te nuk ka libra te regjistruar parprakisht
CREATE TRIGGER NewAuthor2 on Authors
AFTER INSERT AS
BEGIN
Declare @auid as int
select @auid=inserted.AuthorId from insterted
if dbo.librat(@auid)=0
BEGIN
RAISERROR('shkrimtari nuk gjendet ne tabelen botime',10,1)
ROLLBACK
END
END
Shembull 2
-- Nje triger per delete qe kryen nje delete ne cascade te detajve te porosise kur fshihet nje
porosi
-- trigeri nenkupton qe nuk ka kufuzim celes te jashtem midis dy tabelave
111. CREATE TRIGGER DeletePorosi on Orders
AFTER DELETE AS
BEGIN
Declare @orderid as int
select @orderid=deleted.OrderNo from deleted
delete from OrderDetails where OrderNo=@orderid
END
Shembull 3
--triger qe kontrollon nese autori ka botime dhe nuk lejon fshirjen
--transaksioni kthen mbarpsht te gjithe inserted ndonese autori me kodin 1003 nuk ka
-- botime
CREATE TRIGGER DeleteAuthor on Authors
AFTER DELETE AS
BEGIN
if exists(
select AuthorId from deleted where AuthorId in
(
select kodi from botime
)
)
begin
raiserror('nuk mund te fshihet autori pasi ka botime',1,10)
if (@@TRANCOUNT>0)
begin
PRINT 'transaksioni anullohet'
ROLLBACK
end
end
END
Shembull 4
--triger qe ruan historikun e veprimeve te modifikimit mbi tabelen authors
-- Se pari do te krijojme tabelat ku do te ruajme historikun e veprimeve
--po krijojme tabelen eventlog
CREATE TABLE [dbo].[eventlog](
[kodi] [int] IDENTITY(1,1) NOT NULL,
[event] [varchar](250) NOT NULL,
[eventtime] [datetime] NULL,
CONSTRAINT [PK_eventlog] PRIMARY KEY CLUSTERED
(
[kodi] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
112. -- te krijojme tabellen ku do te ruhen rreshtat e modifikuar te tabeles Authors
CREATE TABLE [dbo].[AuthorsHistory](
[AuthorId] [int] NOT NULL,
[FirstName] [varchar](50) NOT NULL,
[Lastname] [varchar](50) NOT NULL,
[YearBorn] [int] NULL,
[YearDied] [int] NULL,
[Note] [varchar](250) NULL,
lastchange datetime NULL,
changedby varchar(30)
CONSTRAINT [PK_Authors2] PRIMARY KEY CLUSTERED
(
[AuthorId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
-- Se fundi krijojme triggerin qe do te ruaje historikun e veprimeve te modifikimit mbi
tabelen Authors
create trigger NdryshoAuthor on Authors
after update
as
BEGIN
--ruaj eventin
insert into eventlog(event)
select 'authors are updated: old data-kodi='+convert(varchar,AuthorID,100)
+' FN='+Firstname+' LN='+LastName
from deleted
--ruaj event
insert into eventlog(event)
select 'new value for updated authors : kodi='+convert(varchar,AuthorID,100)
+' FN='+Firstname+' LN='+LastName
from inserted
--ruaj historikun e rreshtit
insert into authorshistory(AuthorId,FirstName,Lastname,changedby)
select AuthorId,FirstName,Lastname,CURRENT_USER from deleted
END
SHEMBUJ
CREATE TRIGGER ChangeCat ON CATEGORIES
AFTER UPDATE
AS
BEGIN
print 'rreshtat e kategorive para modifikimit'
SELECT CategoryId,CategoryName from deleted
113. print 'rreshtat e kategorive pas modifikimit'
SELECT CategoryId,CategoryName from inserted
END
CREATE TRIGGER [dbo].[NewCats] on [dbo].[Categories]
AFTER INSERT AS
BEGIN
insert INTO NewCats1(CategoryId,CategoryName)
select CategoryId,CategoryName from inserted
END
CREATE TRIGGER CategoriesRecBin
ON CATEGORIES
AFTER DELETE
AS
BEGIN
INSERT INTO DeletedCats(CategoryId,CategoryName)
SELECT CategoryId,CategoryName FROM DELETED
END
--le te provojme rezultatin
insert into Categories (CategoryID,CategoryName)
values
(220,'prove220'),
(221,'prove221'),
(222,'prove222'),
(223,'prove223')
select * from newcategories
-- trigger qe nuk lejon fshirjen e kategorive te produkteve
CREATE TRIGGER nodeletecat
ON Categories
AFTER DELETE
AS
BEGIN
print 'nuk fshihet cat'
ROLLBACK
END
Ushtrim
Krijoni nje triger qe ruan nje kopje te cdo kategorie te shtuar
--paraprakish kemi ndertuar nje tabele me emrin
Operations(OpId IDENTITY(1,1),OperationType,ObjectName,ModifiedValues)
114. -- te ruajme psh u shtua nje kategori e re
--OperationType=INSERT,Object=categories,ModifiedValues="CategoryId=10
CategoryName=prove"
CREATE TRIGGER newkategori
ON CATEGORIES
AFTER INSERT
AS
BEGIN
INSERT into operations (OperationType,ObjectName,ModifiedValues)
select 'INSERT','Categories',
'CategoryId='+convert(varchar,CategoryId)+' CategoryName='+CategoryName
from INSERTED
END
-- te ruajme veprimin insert
--ruhen edhe vlerat e vjetra edhe vlerat e reja
-- tabela operations ka nje kollone optime me vler default getdate()
CREATE TRIGGER udpatekategori
ON CATEGORIES
AFTER UPDATE
AS
BEGIN
INSERT into operations (OperationType,ObjectName,ModifiedValues)
select
'DELETE','Categories',
'CategoryId='
+convert(varchar,CategoryId)+' CategoryName='+CategoryName
from DELETED
INSERT into operations (OperationType,ObjectName,ModifiedValues)
select
'INSERT','Categories',
'CategoryId='
+convert(varchar,CategoryId)+' CategoryName='+CategoryName
from INSERTED
END
CREATE TRIGGER porosiere
ON Orders
INSTEAD OF INSERT
AS
BEGIN
select * from Inserted
END
CREATE TRIGGER fshikategori
115. ON Categories
INSTEAD OF DELETE
AS
BEGIN
INSERT INTO Operations (OperationType,ObjectName,ModifiedValues)
SELECT 'DELETE','Categories','CategoryId='+convert(varchar,CategoryId)+'
CategoryName='+CategoryName
FROM DELETED
END
shembujt e dates 10 maj 2012
-- te ndertojme nje triger
--qe nuk lejon fshirjen e zonjushave
-- nga tabela punonjes
select * from Employees
CREATE TRIGGER fshipunonjes
ON Employees
AFTER DELETE
AS
BEGIN
IF EXISTS
(
SELECT * FROM deleted
where TitleOfCourtesy='Ms.'
or TitleOfCourtesy='Mrs.'
)
ROLLBACK
END
-- Te shtojme nje punonjes
-- me titullin 'Ms.' dhe do tentojme me
--pas ta fshijme
INSERT INTO
Employees(FirstName,LastName,TitleOfCourtesy)
values ('Leke','Plepi','Mr.')
delete from Employees
where FirstName='Leke'
select * from Employees
order by EmployeeID desc
-- trigerat instead of
116. insert into Products(ProductName,UnitsInStock)
values ('Makina Ducati',100)
-- nese tentojme te fshijme nje produkt
-- db nuk duhet ta fshije por ta modifikoje ate
create trigger fshiprod
on Products
instead of delete
as
begin
update Products
set UnitsInStock=0
where ProductId in
(select
ProductID from deleted)
end
delete Products
where ProductName='Makina Ducati'
select * from Products
order by ProductID desc
-- te ndertojme nje triger i cili nuk
--lejon te shtohen porosi me destinacion
--shtetin USA
create trigger stopusa
on Orders
after insert
as
begin
if exists
(
select * from inserted
where ShipCountry='USA'
)
ROLLBACK
end
insert into
Orders(EmployeeID,CustomerID,ShipCountry)
values (1,'ALFKI','USA')
-- a mund te kapim tabela te tjera nga brenda trigerit?
-- ta provojme
-- Nuk lejohet te shesim me tek nje klient nese xhiroja
--financiare qe ai ka realizuar eshte me e madhe se 1000 euro
create trigger debitore
on Orders
after insert
as
117. begin
IF exists
(
select * from inserted
where dbo.CustomerTurnOver(CustomerID)>1000
)
rollback
end
--- duam qe te ruajme nje kopje te daljeve nga magazina
-- nenkptojne update te tabeles products tek kollona unitsinstock
-- cfare informacionesh duam te ruajme?
-- kush e beri daljen?
-- kur e beri daljen
--kodi i produktit
-- emri i produktit
-- sa ishte gjendja
-- sa u bene dalje
-- sa eshte gjendje aktualisht?
-- te ndertojme nje tabele me keto te dhena
print CURRENT_USER
-- afishon userin qe eshtre loguar ne kete moment ne sistem
CREATE TRIGGER log_dalje_hyrje
ON Products
AFTER UPDATE
as
BEGIN
insert into logmagazina
(ProductId,ProductName,GjendjaPara,GjendjaPas,Dalje)
select ins.ProductID,ins.ProductName,
del.UnitsInStock,ins.UnitsInStock,
del.UnitsInStock-ins.UnitsInStock
from
inserted ins inner join deleted del
on ins.ProductID=del.ProductID
END
update Products
set UnitsInStock=UnitsInStock-10
where ProductID=1
118. -- a u modifikua? PO
select * from Products
-- a u ruajt dalja nga magazina ne log????
select * from logmagazina
-- a mund te therras nje funksion nga brenda trigerit?
-- te bej nje funksion qe merr kodin e nje klienti dhe
-- kthen xhiron e tij financiare
create function CustomerTurnOver
(
@cid as char(5)
)
returns money
as
begin
declare @xhiro as money
select @xhiro=SUM(UnitPrice*Quantity)
from
Orders o inner join [Order Details] od
on o.OrderID=od.OrderID
where CustomerID=@cid
group by CustomerID
return @xhiro
end
print dbo.CustomerTurnOver('ALFKI')