SlideShare uma empresa Scribd logo
1 de 118
Baixar para ler offline
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:









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
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
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
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
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:






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


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,
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.
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:
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.
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...":
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.
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.
Dritarja e Properties ka nje numer te madh opsionesh qe mund te konfigurohen.
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...":
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
3. Pasi kemi krijuar strukturen e tabeles nepermjet FILE > SAVE ose nepermjet ikones SAVE
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.
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":
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)
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
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...:
2. Shtoni tabelat qe do te perfshihen ne kete query.
3. Perzgjidhni kollonat qe do te afishohen nga query:
4. Klikoni "OK"

Ndersa punoni me mousin per te zgjedhur kollonat ne pjesen e poshtme Query Designer nderton komanden
kerkuar nga JU.
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' ,
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
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
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
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.
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.')
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'
)
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.
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
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
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'
)
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) ___-____’
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
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.
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
(
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
where
OrderDate>'1996-1-1'
and
Orders.CustomerID=Customers.CustomerID
)
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’
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
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',
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
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
(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
(
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
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
(
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',
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%')
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
-- 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
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
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
(
UnitPrice*(1-Discount)
) 'MaxPrice',
MIN
(
UnitPrice*(1-Discount)
) 'MinPrice'

from

[Order Details]

Group by OrderID

Joins
Per te marre te dhena nga disa tabela perdoret JOIN. Kemi disa lloje te JOIN:





INNER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
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
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.
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:
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
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
OrderId

Orderdate

Firstname

Lastname

...

...

...

...

Zgjidhje

SELECT Orders.OrderID,Orders.OrderDate,Orders.EmployeeID,
Employees.FirstName,Employees.LastName
FROM Orders INNER JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID

Ushtrim 2 - Te afishojme kodin e porosise, daten, kodin e klientit
dhe emrin e kompanise klient per cdo porosi

OrderId Orderdate

CustomerId

CompanyName

...

...

...

...
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
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
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'
)
)
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]
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

...

...
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,
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
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
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
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
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
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
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
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
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,
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
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()
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
...
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'
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
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
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
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
-- 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
-- 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
-- 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
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:





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')
“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'),
('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.
(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,
[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.
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]
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
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
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:
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%.
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];
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'
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
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
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.
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
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()
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
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
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]
-- 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
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)
-- 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
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
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
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
-- 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')

Mais conteúdo relacionado

Mais procurados

Problemet e arsimit e shkolles sot
Problemet e arsimit e shkolles sotProblemet e arsimit e shkolles sot
Problemet e arsimit e shkolles sotGenti Mustafaj
 
Historia e zhvillimit te matematikes
Historia e zhvillimit te matematikesHistoria e zhvillimit te matematikes
Historia e zhvillimit te matematikesXhuliana Haxhiu
 
Llojet e teksteve
Llojet e teksteveLlojet e teksteve
Llojet e tekstevesindi21
 
Energjia, llojet dhe perdorimi
Energjia, llojet dhe perdorimiEnergjia, llojet dhe perdorimi
Energjia, llojet dhe perdorimiBlerinaMuobega
 
Projekt Kimi - Burime te hidrokarbureve ne Shqiperi
Projekt Kimi - Burime te hidrokarbureve ne ShqiperiProjekt Kimi - Burime te hidrokarbureve ne Shqiperi
Projekt Kimi - Burime te hidrokarbureve ne ShqiperiMarinela Abedini
 
PROJEKT: GJERGJ FISHTA DHE ” LAHUTA E MALCIS”
PROJEKT: GJERGJ FISHTA  DHE  ” LAHUTA E MALCIS” PROJEKT: GJERGJ FISHTA  DHE  ” LAHUTA E MALCIS”
PROJEKT: GJERGJ FISHTA DHE ” LAHUTA E MALCIS” #MesueseAurela Elezaj
 
Siguria e fëmijëve në internet
Siguria e fëmijëve në internetSiguria e fëmijëve në internet
Siguria e fëmijëve në internetenis vladi
 
Lidhja e matematikes me lendet e tjera
Lidhja e matematikes me lendet e tjeraLidhja e matematikes me lendet e tjera
Lidhja e matematikes me lendet e tjeraolinuhi
 
Konceptet baze te probabilitetit
Konceptet baze te probabilitetitKonceptet baze te probabilitetit
Konceptet baze te probabilitetitMenaxherat
 
Tregu i punes ne Shqiperi
Tregu i punes ne Shqiperi Tregu i punes ne Shqiperi
Tregu i punes ne Shqiperi Darla Evangjeli
 
Teoremat e rrethit
Teoremat e rrethitTeoremat e rrethit
Teoremat e rrethitTeutë Domi
 
Hekuri ,elementi kimik me vlere...
Hekuri ,elementi kimik me vlere...Hekuri ,elementi kimik me vlere...
Hekuri ,elementi kimik me vlere...Xhesiana Muka
 
Kohezioni dhe koherenca
Kohezioni dhe koherencaKohezioni dhe koherenca
Kohezioni dhe koherencaMenaxherat
 

Mais procurados (20)

Problemet e arsimit e shkolles sot
Problemet e arsimit e shkolles sotProblemet e arsimit e shkolles sot
Problemet e arsimit e shkolles sot
 
Historia e zhvillimit te matematikes
Historia e zhvillimit te matematikesHistoria e zhvillimit te matematikes
Historia e zhvillimit te matematikes
 
Llojet e teksteve
Llojet e teksteveLlojet e teksteve
Llojet e teksteve
 
Algoritmet C++
Algoritmet C++Algoritmet C++
Algoritmet C++
 
Energjia, llojet dhe perdorimi
Energjia, llojet dhe perdorimiEnergjia, llojet dhe perdorimi
Energjia, llojet dhe perdorimi
 
Historia e numrit
Historia e numritHistoria e numrit
Historia e numrit
 
Figurat letrare
Figurat letrareFigurat letrare
Figurat letrare
 
Projekt Kimi - Burime te hidrokarbureve ne Shqiperi
Projekt Kimi - Burime te hidrokarbureve ne ShqiperiProjekt Kimi - Burime te hidrokarbureve ne Shqiperi
Projekt Kimi - Burime te hidrokarbureve ne Shqiperi
 
Mjedisi
MjedisiMjedisi
Mjedisi
 
PROJEKT: GJERGJ FISHTA DHE ” LAHUTA E MALCIS”
PROJEKT: GJERGJ FISHTA  DHE  ” LAHUTA E MALCIS” PROJEKT: GJERGJ FISHTA  DHE  ” LAHUTA E MALCIS”
PROJEKT: GJERGJ FISHTA DHE ” LAHUTA E MALCIS”
 
FILOZOFIA
FILOZOFIA FILOZOFIA
FILOZOFIA
 
Teknologji kompjuteri
Teknologji kompjuteriTeknologji kompjuteri
Teknologji kompjuteri
 
Siguria e fëmijëve në internet
Siguria e fëmijëve në internetSiguria e fëmijëve në internet
Siguria e fëmijëve në internet
 
Lidhja e matematikes me lendet e tjera
Lidhja e matematikes me lendet e tjeraLidhja e matematikes me lendet e tjera
Lidhja e matematikes me lendet e tjera
 
Konceptet baze te probabilitetit
Konceptet baze te probabilitetitKonceptet baze te probabilitetit
Konceptet baze te probabilitetit
 
ANALIZE ..."ZONJA BOVARI "
ANALIZE ..."ZONJA BOVARI "ANALIZE ..."ZONJA BOVARI "
ANALIZE ..."ZONJA BOVARI "
 
Tregu i punes ne Shqiperi
Tregu i punes ne Shqiperi Tregu i punes ne Shqiperi
Tregu i punes ne Shqiperi
 
Teoremat e rrethit
Teoremat e rrethitTeoremat e rrethit
Teoremat e rrethit
 
Hekuri ,elementi kimik me vlere...
Hekuri ,elementi kimik me vlere...Hekuri ,elementi kimik me vlere...
Hekuri ,elementi kimik me vlere...
 
Kohezioni dhe koherenca
Kohezioni dhe koherencaKohezioni dhe koherenca
Kohezioni dhe koherenca
 

Destaque

Shpend Stojkaj baza e të dhënave
Shpend Stojkaj baza e të dhënaveShpend Stojkaj baza e të dhënave
Shpend Stojkaj baza e të dhënaveShpend Stojkaj
 
Pyetje me pergjigje nga informatika
Pyetje me  pergjigje nga  informatikaPyetje me  pergjigje nga  informatika
Pyetje me pergjigje nga informatikaDritan Halimi
 
Open Access as an element of an “Open All” approach – policies and practices,...
Open Access as an element of an “Open All” approach – policies and practices,...Open Access as an element of an “Open All” approach – policies and practices,...
Open Access as an element of an “Open All” approach – policies and practices,...Platforma Otwartej Nauki
 
Menaxhimi i projekteve përmes aplikacioneve on-line (dotProject)
Menaxhimi i projekteve përmes aplikacioneve on-line (dotProject)Menaxhimi i projekteve përmes aplikacioneve on-line (dotProject)
Menaxhimi i projekteve përmes aplikacioneve on-line (dotProject)yllferizi
 
Informatika e biznesit java7
Informatika e biznesit java7Informatika e biznesit java7
Informatika e biznesit java7coupletea
 
Relational database management system
Relational database management systemRelational database management system
Relational database management systemMuhammad Bilal Tariq
 
Baza e të dhënave mod
Baza e të dhënave modBaza e të dhënave mod
Baza e të dhënave modArmend Gjoshi
 
Query formulation process
Query formulation processQuery formulation process
Query formulation processmalathimurugan
 
Securing MySQL with a Focus on SSL
Securing MySQL with a Focus on SSLSecuring MySQL with a Focus on SSL
Securing MySQL with a Focus on SSLwolfSSL
 
DB2 and PHP in Depth on IBM i
DB2 and PHP in Depth on IBM iDB2 and PHP in Depth on IBM i
DB2 and PHP in Depth on IBM iAlan Seiden
 
SISTEMI NERVOR QENDROR
SISTEMI NERVOR QENDRORSISTEMI NERVOR QENDROR
SISTEMI NERVOR QENDRORDentistry
 
Histori dhe zhvillimi i kompjuterave
Histori dhe zhvillimi i kompjuteraveHistori dhe zhvillimi i kompjuterave
Histori dhe zhvillimi i kompjuteraveEGLI TAFA
 

Destaque (19)

Shpend Stojkaj baza e të dhënave
Shpend Stojkaj baza e të dhënaveShpend Stojkaj baza e të dhënave
Shpend Stojkaj baza e të dhënave
 
Ligjerata 7
Ligjerata 7Ligjerata 7
Ligjerata 7
 
Pyetje me pergjigje nga informatika
Pyetje me  pergjigje nga  informatikaPyetje me  pergjigje nga  informatika
Pyetje me pergjigje nga informatika
 
Open Access as an element of an “Open All” approach – policies and practices,...
Open Access as an element of an “Open All” approach – policies and practices,...Open Access as an element of an “Open All” approach – policies and practices,...
Open Access as an element of an “Open All” approach – policies and practices,...
 
QUERY BD ACCESS
QUERY BD ACCESSQUERY BD ACCESS
QUERY BD ACCESS
 
Menaxhimi i projekteve përmes aplikacioneve on-line (dotProject)
Menaxhimi i projekteve përmes aplikacioneve on-line (dotProject)Menaxhimi i projekteve përmes aplikacioneve on-line (dotProject)
Menaxhimi i projekteve përmes aplikacioneve on-line (dotProject)
 
Operador logistico
Operador logisticoOperador logistico
Operador logistico
 
Informatika e biznesit java7
Informatika e biznesit java7Informatika e biznesit java7
Informatika e biznesit java7
 
2. routing protokolle
2. routing protokolle2. routing protokolle
2. routing protokolle
 
Relational database management system
Relational database management systemRelational database management system
Relational database management system
 
Baza e të dhënave mod
Baza e të dhënave modBaza e të dhënave mod
Baza e të dhënave mod
 
Query formulation process
Query formulation processQuery formulation process
Query formulation process
 
Securing MySQL with a Focus on SSL
Securing MySQL with a Focus on SSLSecuring MySQL with a Focus on SSL
Securing MySQL with a Focus on SSL
 
DB2 and PHP in Depth on IBM i
DB2 and PHP in Depth on IBM iDB2 and PHP in Depth on IBM i
DB2 and PHP in Depth on IBM i
 
SISTEMI NERVOR QENDROR
SISTEMI NERVOR QENDRORSISTEMI NERVOR QENDROR
SISTEMI NERVOR QENDROR
 
Histori dhe zhvillimi i kompjuterave
Histori dhe zhvillimi i kompjuteraveHistori dhe zhvillimi i kompjuterave
Histori dhe zhvillimi i kompjuterave
 
Gjuha c++
Gjuha c++Gjuha c++
Gjuha c++
 
Operadores logisticos
Operadores logisticosOperadores logisticos
Operadores logisticos
 
Microsoft Excel
 Microsoft Excel Microsoft Excel
Microsoft Excel
 

Semelhante a Database

Deyrat e portofolit te informatikes semestri i dyte
Deyrat e portofolit te informatikes semestri i dyteDeyrat e portofolit te informatikes semestri i dyte
Deyrat e portofolit te informatikes semestri i dyteRexhino Kovaci
 
Lek 1 (12 files merged).pdf
Lek 1 (12 files merged).pdfLek 1 (12 files merged).pdf
Lek 1 (12 files merged).pdflkot
 
Microsoft access-projekt-ne-word
Microsoft access-projekt-ne-wordMicrosoft access-projekt-ne-word
Microsoft access-projekt-ne-wordAberi Kajo
 
microsoft Access Punim ne Word Driton Nuha
microsoft Access Punim ne Word Driton Nuhamicrosoft Access Punim ne Word Driton Nuha
microsoft Access Punim ne Word Driton NuhaDriton Nuha
 
Benefitet, përparësit e Database Mirroring ndaj Clustering
Benefitet, përparësit e Database Mirroring ndaj ClusteringBenefitet, përparësit e Database Mirroring ndaj Clustering
Benefitet, përparësit e Database Mirroring ndaj ClusteringAtdhe Buja
 
Teknologji e informimit dhe komunikimit (TIK) Punim Seminarik Driton Nuha
Teknologji e informimit dhe komunikimit (TIK) Punim Seminarik Driton NuhaTeknologji e informimit dhe komunikimit (TIK) Punim Seminarik Driton Nuha
Teknologji e informimit dhe komunikimit (TIK) Punim Seminarik Driton NuhaDriton Nuha
 
PROJEKTIMI I PROGRAMIT PËR MENAXHIM TË DOKUMENTACIONIT NË SHKOLLAT E MESME TË...
PROJEKTIMI I PROGRAMIT PËR MENAXHIM TË DOKUMENTACIONIT NË SHKOLLAT E MESME TË...PROJEKTIMI I PROGRAMIT PËR MENAXHIM TË DOKUMENTACIONIT NË SHKOLLAT E MESME TË...
PROJEKTIMI I PROGRAMIT PËR MENAXHIM TË DOKUMENTACIONIT NË SHKOLLAT E MESME TË...UBT - Higher Education Institution
 

Semelhante a Database (12)

Deyrat e portofolit te informatikes semestri i dyte
Deyrat e portofolit te informatikes semestri i dyteDeyrat e portofolit te informatikes semestri i dyte
Deyrat e portofolit te informatikes semestri i dyte
 
Ligjerata 7
Ligjerata 7Ligjerata 7
Ligjerata 7
 
Lek 1 (12 files merged).pdf
Lek 1 (12 files merged).pdfLek 1 (12 files merged).pdf
Lek 1 (12 files merged).pdf
 
Projekti olive oils
Projekti olive oilsProjekti olive oils
Projekti olive oils
 
Microsoft access-projekt-ne-word
Microsoft access-projekt-ne-wordMicrosoft access-projekt-ne-word
Microsoft access-projekt-ne-word
 
microsoft Access Punim ne Word Driton Nuha
microsoft Access Punim ne Word Driton Nuhamicrosoft Access Punim ne Word Driton Nuha
microsoft Access Punim ne Word Driton Nuha
 
Ligjerata 6
Ligjerata 6Ligjerata 6
Ligjerata 6
 
Client server
Client server Client server
Client server
 
Projekti
ProjektiProjekti
Projekti
 
Benefitet, përparësit e Database Mirroring ndaj Clustering
Benefitet, përparësit e Database Mirroring ndaj ClusteringBenefitet, përparësit e Database Mirroring ndaj Clustering
Benefitet, përparësit e Database Mirroring ndaj Clustering
 
Teknologji e informimit dhe komunikimit (TIK) Punim Seminarik Driton Nuha
Teknologji e informimit dhe komunikimit (TIK) Punim Seminarik Driton NuhaTeknologji e informimit dhe komunikimit (TIK) Punim Seminarik Driton Nuha
Teknologji e informimit dhe komunikimit (TIK) Punim Seminarik Driton Nuha
 
PROJEKTIMI I PROGRAMIT PËR MENAXHIM TË DOKUMENTACIONIT NË SHKOLLAT E MESME TË...
PROJEKTIMI I PROGRAMIT PËR MENAXHIM TË DOKUMENTACIONIT NË SHKOLLAT E MESME TË...PROJEKTIMI I PROGRAMIT PËR MENAXHIM TË DOKUMENTACIONIT NË SHKOLLAT E MESME TË...
PROJEKTIMI I PROGRAMIT PËR MENAXHIM TË DOKUMENTACIONIT NË SHKOLLAT E MESME TË...
 

Mais de Xhendris Ismaili

Leksioni 10 rrjetet kompjuterike
Leksioni 10   rrjetet kompjuterikeLeksioni 10   rrjetet kompjuterike
Leksioni 10 rrjetet kompjuterikeXhendris Ismaili
 
Leksioni 9 pajisjet periferike
Leksioni 9   pajisjet periferikeLeksioni 9   pajisjet periferike
Leksioni 9 pajisjet periferikeXhendris Ismaili
 
Leksioni 7 kartat audio-video
Leksioni 7   kartat audio-videoLeksioni 7   kartat audio-video
Leksioni 7 kartat audio-videoXhendris Ismaili
 
Leksioni 6 kujtesa dytesore
Leksioni 6   kujtesa dytesoreLeksioni 6   kujtesa dytesore
Leksioni 6 kujtesa dytesoreXhendris Ismaili
 
Leksioni 5 kujtesa paresore
Leksioni 5   kujtesa paresoreLeksioni 5   kujtesa paresore
Leksioni 5 kujtesa paresoreXhendris Ismaili
 
Leksioni 4 motherboard+bios
Leksioni 4   motherboard+biosLeksioni 4   motherboard+bios
Leksioni 4 motherboard+biosXhendris Ismaili
 
Rrjeta kompjuterike leksion 7 tcp-ip dhe interneti
Rrjeta kompjuterike leksion 7    tcp-ip dhe internetiRrjeta kompjuterike leksion 7    tcp-ip dhe interneti
Rrjeta kompjuterike leksion 7 tcp-ip dhe internetiXhendris Ismaili
 
Rrjeta kompjuterike leksion 6
Rrjeta kompjuterike leksion 6  Rrjeta kompjuterike leksion 6
Rrjeta kompjuterike leksion 6 Xhendris Ismaili
 
Rrjeta kompjuterike leksion 5
Rrjeta kompjuterike leksion 5  Rrjeta kompjuterike leksion 5
Rrjeta kompjuterike leksion 5 Xhendris Ismaili
 
Rrjeta kompjuterike leksion 4
Rrjeta kompjuterike leksion 4  Rrjeta kompjuterike leksion 4
Rrjeta kompjuterike leksion 4 Xhendris Ismaili
 
Rrjeta kompjuterike leksion 3
Rrjeta kompjuterike leksion 3  Rrjeta kompjuterike leksion 3
Rrjeta kompjuterike leksion 3 Xhendris Ismaili
 
Rrjeta kompjuterike leksion 2
Rrjeta kompjuterike leksion 2  Rrjeta kompjuterike leksion 2
Rrjeta kompjuterike leksion 2 Xhendris Ismaili
 
Rrjeta kompjuterike leksion 1
Rrjeta kompjuterike leksion 1  Rrjeta kompjuterike leksion 1
Rrjeta kompjuterike leksion 1 Xhendris Ismaili
 
Rrjeta kompjuterike leksion 8 mekanizmat e protokolleve te routimit
Rrjeta kompjuterike leksion 8    mekanizmat e protokolleve te routimitRrjeta kompjuterike leksion 8    mekanizmat e protokolleve te routimit
Rrjeta kompjuterike leksion 8 mekanizmat e protokolleve te routimitXhendris Ismaili
 

Mais de Xhendris Ismaili (20)

Hardware i smartphone
 Hardware i smartphone Hardware i smartphone
Hardware i smartphone
 
Leksioni 10 rrjetet kompjuterike
Leksioni 10   rrjetet kompjuterikeLeksioni 10   rrjetet kompjuterike
Leksioni 10 rrjetet kompjuterike
 
Leksioni 9 pajisjet periferike
Leksioni 9   pajisjet periferikeLeksioni 9   pajisjet periferike
Leksioni 9 pajisjet periferike
 
Leksioni 7 kartat audio-video
Leksioni 7   kartat audio-videoLeksioni 7   kartat audio-video
Leksioni 7 kartat audio-video
 
Leksioni 6 kujtesa dytesore
Leksioni 6   kujtesa dytesoreLeksioni 6   kujtesa dytesore
Leksioni 6 kujtesa dytesore
 
Leksioni 5 kujtesa paresore
Leksioni 5   kujtesa paresoreLeksioni 5   kujtesa paresore
Leksioni 5 kujtesa paresore
 
Leksioni 4 motherboard+bios
Leksioni 4   motherboard+biosLeksioni 4   motherboard+bios
Leksioni 4 motherboard+bios
 
Leksioni 3 procesori
Leksioni 3   procesoriLeksioni 3   procesori
Leksioni 3 procesori
 
Leksioni 2
Leksioni 2Leksioni 2
Leksioni 2
 
Leksioni 1
Leksioni 1Leksioni 1
Leksioni 1
 
Leksioni 8 portat io
Leksioni 8   portat ioLeksioni 8   portat io
Leksioni 8 portat io
 
Rrjeta kompjuterike leksion 7 tcp-ip dhe interneti
Rrjeta kompjuterike leksion 7    tcp-ip dhe internetiRrjeta kompjuterike leksion 7    tcp-ip dhe interneti
Rrjeta kompjuterike leksion 7 tcp-ip dhe interneti
 
Rrjeta kompjuterike leksion 6
Rrjeta kompjuterike leksion 6  Rrjeta kompjuterike leksion 6
Rrjeta kompjuterike leksion 6
 
Rrjeta kompjuterike leksion 5
Rrjeta kompjuterike leksion 5  Rrjeta kompjuterike leksion 5
Rrjeta kompjuterike leksion 5
 
Rrjeta kompjuterike leksion 4
Rrjeta kompjuterike leksion 4  Rrjeta kompjuterike leksion 4
Rrjeta kompjuterike leksion 4
 
Rrjeta kompjuterike leksion 3
Rrjeta kompjuterike leksion 3  Rrjeta kompjuterike leksion 3
Rrjeta kompjuterike leksion 3
 
Rrjeta kompjuterike leksion 2
Rrjeta kompjuterike leksion 2  Rrjeta kompjuterike leksion 2
Rrjeta kompjuterike leksion 2
 
Rrjeta kompjuterike leksion 1
Rrjeta kompjuterike leksion 1  Rrjeta kompjuterike leksion 1
Rrjeta kompjuterike leksion 1
 
Rrjeta kompjuterike leksion 8 mekanizmat e protokolleve te routimit
Rrjeta kompjuterike leksion 8    mekanizmat e protokolleve te routimitRrjeta kompjuterike leksion 8    mekanizmat e protokolleve te routimit
Rrjeta kompjuterike leksion 8 mekanizmat e protokolleve te routimit
 
Sherbimet e mail serverit
Sherbimet e mail serveritSherbimet e mail serverit
Sherbimet e mail serverit
 

Database

  • 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.
  • 15. Dritarja e Properties ka nje numer te madh opsionesh qe mund te konfigurohen.
  • 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...:
  • 24. 2. Shtoni tabelat qe do te perfshihen ne kete query.
  • 25. 3. Perzgjidhni kollonat qe do te afishohen nga query:
  • 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 (
  • 58. UnitPrice*(1-Discount) ) 'MaxPrice', MIN ( UnitPrice*(1-Discount) ) 'MinPrice' from [Order Details] Group by OrderID Joins Per te marre te dhena nga disa tabela perdoret JOIN. Kemi disa lloje te JOIN:     INNER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN
  • 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
  • 64. OrderId Orderdate Firstname Lastname ... ... ... ... Zgjidhje SELECT Orders.OrderID,Orders.OrderDate,Orders.EmployeeID, Employees.FirstName,Employees.LastName FROM Orders INNER JOIN Employees ON Orders.EmployeeID=Employees.EmployeeID Ushtrim 2 - Te afishojme kodin e porosise, daten, kodin e klientit dhe emrin e kompanise klient per cdo porosi OrderId Orderdate CustomerId CompanyName ... ... ... ...
  • 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')