Kapitulli VI
Nxjerrja e te dhenave
Komanda SELECT mbi nje tabele
JOIN dhe Subquery-t
Funksionet e Grupit
Kombimi i Rezultateve
Funksionet skalare te SQL (built-in scalar functions)
Funksionet e Grupit
Funksionet e GrupitKa 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(*)NoOfOrdersHeDealedfromOrdersGroup
by(EmployeeId)
ShembullNga tabela Products
Te afishojme sa produkte
kemi ne magazine gjendje nga cdo kategori
selectCategoryID,sum(UnitsInStock)fromProductsgroup
byCategoryIDTe afishojme cmimin mesatar
te produkteve per cdo kategori
selectCategoryID,AVG(UnitPrice)fromProductsgroup byCategoryIDTe
afishojme cmimin ma te madh
te produkteve per cdo kategori
selectCategoryID,MAX(UnitPrice)fromProductsgroup byCategoryIDTe
afishojme cmimin ma te ulet
te produkteve per cdo kategori
selectCategoryID,MIN(UnitPrice)fromProductsgroup byCategoryIDTe
afishojme sa eshte vlera finaciare e magazines per
produktet per cdo kategori
selectCategoryID,SUM(UnitPrice*UnitsInStock )AS
'VleraFinanciare'fromproductsGROUP BYCategoryIDTi afishojme keto
vlera ne nje query
selectCategoryID,COUNT(*)AS'Produkte',sum(UnitsInStock
)AS'ProdukteGjendje',MAX(UnitPrice )AS'CmimiMax',MIN(UnitPrice
)AS'CmimiMin',AVG(UnitPrice
)AS'CmimiMes',SUM(UnitPrice*UnitsInStock
)AS'VleraFinanciare'fromproductsGROUP BYCategoryID
Ushtrim1Te afishojme sa eshte numri i porosive qe eshte
realizuar ne cdo shtet?
selectShipCountry,COUNT(*)as'NumerPorosish'fromOrdersgroup
byShipCountryorder byNumerPorosishDESCUshtrim2Te afishojme sa eshte
numri i porosive qe eshte realizuar ne cdo shtet, vetem per ato
shtet ku kam derguar me shume se 80 porosi.
selectShipCountry,COUNT(*) as 'NumerPorosish'from Ordersgroup by
ShipCountryhaving COUNT(*)>80order by NumerPorosish
DESCUshtrim3Te 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 Orderswhere
OrderDate between '1996-1-1' and '1997-1-1'group by
ShipCountryhaving COUNT(*)>20Ushtrim 4Te afishojme listen e
punonjesve qe kane shiturme shume se 3 porosi ne USAne peiudhen
1996-1-1
deri 1997-1-1
select * from employeeswhere employeeIdIN(select EmployeeID from
ORderswhere ShipCountry='USA' and(OrderDate between '1996-1-1' and
'1997-1-1')group by EmployeeIDhaving COUNT(*)>3)Ushtrim 5 -Te
afishojme kodindhe vleren financiare te cdo porosiete realizuar ne
vitin 1996OrderId
Amount
...
...
Zgjidhje
Te gjejme kodet e porosive te realizuara ne 1996
selectOrderIDfromorderswhereOrderDatebetween
'1996-1-1'and'1997-1-1'Zgjidhja perfundimtare
selectOrderID,SUM(UnitPrice*Quantity)as'Amount'from[Order
Details]whereOrderIDIN(selectOrderIDfromorderswhereOrderDatebetween'1996-1-1'and'1997-1-1')group
byOrderIDZgjidhja alternative, jo e rekomandueshme
selectOrderID,SUM(UnitPrice*Quantity)as'Amount'from[Order
Details]group
byOrderIDhavingOrderIDIN(selectOrderIDfromorderswhereOrderDatebetween'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 OrderIDNdersa komanda e meposhtme afishon vetem
kodet e punonjesve qe kane bere me shume se 10 shitje:
SELECT EmployeeId,Count(*) NoOfOrdersHeDealedfrom OrdersGroup by
(EmployeeId)Having Count(*) >Shembull
SELECT * FROM EmployeesWHERE EmployeeIDIN(SELECT DISTINCT
EmployeeID FROM OrdersWHEREOrderIDIN(select OrderID 'kodi'from
[Order Details]where Discount=0 -- para grupimitgroup by
OrderIDhaving SUM(Unitprice*Quantity)>12500 -- pas
grupimit))
-- FUNKSIONET E GRUPIT
SELECT (KOLLONA)
FROM (TABELE)
WHERE (KUSHT)
GROUP by (KOLLONA)
HAVING (KUSHT)
SELECT Country,City FROM CustomersORDER BY Country,CitySELECT
Country Shteti ,City 'Qyteti',COUNT(*) as Numri_KlienteveFROM
CustomersGROUP BY Country,Cityorder by Country,City-- TE AFISHOJ
VETEM ATO QYTETE KU KAM ME
SHUME SE 2 KLIENTESELECT Country Shteti ,City 'Qyteti',COUNT(*)
as Numri_KlienteveFROM CustomersGROUP BY Country,CityHAVING
COUNT(*)>0order 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_KlienteveFROM CustomersGROUP BY Country,CityHAVING
(COUNT(*)>0) AND (Country LIKE 'A%')order by COUNT(*)-- TE
PROVOJME WHERE
SELECT Country Shteti ,City 'Qyteti',COUNT(*) as
Numri_KlienteveFROM CustomersWHERE (Country LIKE 'A%')GROUP BY
Country,CityHAVING (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 Employeesgroup by
TitleOfCourtesy-- USHTRIM 2
-- SA ESHTE NUMRI I POROSIVE NE CDO SHTET?
select ShipCountry,COUNT(*)from OrdersGroup BY ShipCountryorder
by COUNT(*)--USHTRIM 2b
-- afishoni vetem shtet me me shume se 20 porosi
select ShipCountry,COUNT(*)from OrdersGroup BY ShipCountryhaving
COUNT(*)>20order 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 Orderswhere OrderDate between
'1996-1-1' and '1997-1-1'Group BY ShipCountryhaving
COUNT(*)>20order 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
Komanda SELECT
Te marrim te dhena nga SQL Server.
Sintaksa e komandes SELECTSELECT (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 employeesWHERE EmployeeId=1Shprehja 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 aliaskrijimi i alias per kollonat
SELECT EmployeeID 'Kodi' ,FirstName [Emri] ,LastName
[Mbiemri],TitleOfCourtesy AS Titulli ,Title AS
'Pozicioni',BirthDate AS [Datelindja],ReportsTo AS ShefiFROM
employeesky 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 ShefiFROM
employees as punonjesitorder by Emri ASCPa e perdorur
SELECT EmployeeID 'Kodi' ,FirstName [Emri] ,LastName
[Mbiemri],TitleOfCourtesy AS Titulli ,Title AS
'Pozicioni',BirthDate AS [Datelindja],ReportsTo AS ShefiFROM
employees punonjesitorder by Emri ASCA 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 ShefiFROM
employees as punonjesitwhere Employees.EmployeeID=1order by Emri
ASCjep gabim:
Msg 4104, Level 16, State 1, Line 1The 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 ShefiFROM
employees as punonjesitwhere punonjesit.EmployeeID=1order by Emri
ASCeshte e sakte pasi tabela tani quhet punonjesit.
Per shembull komanda me poshte afishon listen e punonjesve qe
jane zonja ose zonjusha
SELECT *FROM employeesWHERE TitleOfCourtesy = 'Ms.' OR
TitleOfCourtesy = 'Mrs.'Operatori BETWEENKomanda e meposhtme
afishon nje liste me punonjesit qe jane marre ne pune vitin e
fundit:
SELECT firstname, lastname, hiredateFROM employeesWHERE hiredate
>= '1994-1-1' AND hiredate Z), ndersa komanda e meposhtme:
SELECT firstname, lastnameFROM EmployeesORDER BY firstname DESC
,lastname ASCafishon 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)
UshtrimTe afishojme te renditura porosite sipas ShipCountry
(rrites) dhe me pas sipas dates se porosies ne rendin zbrites.
select OrderID,EmployeeId,CustomerID,OrderDate,ShipCountryfrom
Ordersorder by ShipCountry ASC, OrderDate DESC
Lista e punonjesve qe shiten produkte te shtrenjta (mbi 250
euro)
SELECT * FROM Employeeswhere EmployeeId IN(Select distinct
EmployeeID from orderswhere OrderID IN(select distinct OrderIDfrom
[Order Details]where UnitPrice>250))Operatori IN dhe EXISTS
select EmployeeID,FirstName,LastName,TitleOfCourtesy,Titlefrom
Employeeswhere EmployeeID NOT IN(SELECT DISTINCT EmployeeID FROM
Orderswhere ShipCountry='SPAIN')select
EmployeeID,FirstName,LastName,TitleOfCourtesy,Titlefrom
Employeeswhere Not Exists (SELECT * FROM
OrderswhereShipCountry='SPAIN'andOrders.EmployeeID=Employees.EmployeeID)select
*from Customerswhere CustomerID NOT IN(SELECT DISTINCT CustomerID
FROM OrderswhereOrderDate>'1996-1-1')select *from Customerswhere
Not Exists (SELECT * FROM
OrderswhereOrderDate>'1996-1-1'andOrders.CustomerID=Customers.CustomerID)
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 JOINKthen 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
fromCategories INNER JOIN ProductsON
Categories.CategoryID=Products.CategoryIDwhere
Categories.CategoryId>6Shenim: 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 produkteNuk afishon produkte per te
cilat nuk ka kategoriMe poshte paraqitet rezultati i afishimit te
komanded se mesiperme INNER JOIN
Vini re qe ne tabelen kategorite eshte shtuar se fundmi nje
kategori me emrinkategori bosh, me CategoryId= 9per 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 JOINNe 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
fromCategories LEFT OUTER JOIN ProductsON
Categories.CategoryID=Products.CategoryIDwhere
categories.CategoryID>6Do te afishonte:
Pra LEFT OUTER JOIN , ne kete rast me Categories ne te majte dhe
Products ne te djathte :
afishonte gjithe produktet dhe kategorite qe kane korrespondence
direkte midis tyreafishon te gjithe kategorite pavaresishte nese
kane apo jo produkte (kategoria 9,kategoribosh)nuk afishon
produktet qe nuk kane kategoriRIGHT OUTER JOINEshte 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
fromProducts RIGHT OUTER JOIN CategoriesON
Categories.CategoryID=Products.CategoryIDwhere
categories.CategoryID>6Rezultati eshte identik me rezultatin e
query te meparshem
FULL OUTER JOINEshte 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
fromCategories FULL OUTER JOIN ProductsON
Categories.CategoryID=Products.CategoryIDafishon te gjithe
produktet dhe kategorite per te cilat ka korrespondenceafishon
kategorite per te cilat nuk ka produkteafishon produktet qe nuk
jane te kategorizuar
USHTRIMEUshtrim 1- te afishojme kodin e porosise, daten,kodin
dhe emrin e punonjesit qe e trajtoi ate
porosiOrderIdOrderdateFirstnameLastname...
...
...
...
ZgjidhjeSELECT
Orders.OrderID,Orders.OrderDate,Orders.EmployeeID,Employees.FirstName,Employees.LastNameFROM
Orders INNER JOIN EmployeesON
Orders.EmployeeID=Employees.EmployeeIDUshtrim 2 - Te afishojme
kodin e porosise, daten, kodin e klientitdhe emrin e kompanise
klient per cdo porosiOrderIdOrderdateCustomerIdCompanyName...
...
...
...
ZgjidhjeSELECT
Orders.OrderID,Orders.OrderDate,Orders.CustomerID,Customers.CompanyNameFROM
Orders INNER JOIN CustomersON
Orders.CustomerID=Customers.CustomerIDUshtrim 3Te afishojme kodin e
produktit,emrin e produktitdhe emrin e kompanise furnitore per kete
produktProductIdProductNameSupplierName...
..
...
ZgjidhjeSELECT
Products.ProductID,Products.ProductName,Suppliers.CompanyNameFROM
Products INNER JOIN SuppliersON
Products.SupplierID=Suppliers.SupplierID3-a te renditen sipas emrit
te furnitoritSELECT
Products.ProductID,Products.ProductName,Suppliers.CompanyNameFROM
Products INNER JOIN SuppliersON
Products.SupplierID=Suppliers.SupplierIDORDER BY
Suppliers.CompanyName3.b- te emertohen kollonat ne shqip.SELECT
Products.ProductID 'KodiProduktit',Products.ProductName
'EmriProduktit',Suppliers.CompanyName 'Furnitori'FROM Products
INNER JOIN SuppliersON
Products.SupplierID=Suppliers.SupplierIDORDER BY
Suppliers.CompanyName3.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 SuppliersON
Products.SupplierID=Suppliers.SupplierIDWHERE
Products.CategoryID=8ORDER BY Suppliers.CompanyName3.d :te
afishohen vetem produktet qe nuk jane shitur asnjehereSELECT
Products.ProductID 'KodiProduktit',Products.ProductName
'EmriProduktit',Suppliers.CompanyName 'Furnitori'FROM Products
INNER JOIN SuppliersON
Products.SupplierID=Suppliers.SupplierIDWHERE Products.ProductID
NOT IN(SELECT DISTINCT ProductID FROM [Order Details])ORDER BY
Suppliers.CompanyName3.e- Te afishojme produktet qe jane shitur ne
Denmark
Zgjidhje
select ProductID,ProductName,Suppliers.CompanyName as
'SupplierName'from products inner join Supplierson
products.SupplierID=suppliers.SupplierIDwhere
products.ProductIDin(select DISTINCT ProductId from [Order
Details]where OrderId IN(select OrderIDfrom Orderswhere
ShipCountry='Denmark'))Zgjidhje me JOIN
SELECT Products.ProductID, Products.ProductName,
Suppliers.CompanyName AS SupplierName, Orders.ShipCountryFROM
Suppliers INNER JOINProducts ON Suppliers.SupplierID =
Products.SupplierID INNER JOIN[Order Details] ON Products.ProductID
= [Order Details].ProductID INNER JOINOrders ON [Order
Details].OrderID = Orders.OrderIDWHERE (Orders.ShipCountry =
N'Denmark')3.f-Te afishohen vetem produktet qe jane shitur me
shtrenjt se 500 euro copaZgjidhjeSELECT Products.ProductID
'KodiProduktit',Products.ProductName
'EmriProduktit',Suppliers.CompanyName 'Furnitori'FROM Products
INNER JOIN SuppliersON
Products.SupplierID=Suppliers.SupplierIDWHERE Products.ProductID
NOT IN(SELECT DISTINCT ProductID FROM [Order Details]where
UnitPrice>500)ORDER BY Suppliers.CompanyNameZgjidhja duke
perdorur JOIN
SELECT Products.ProductID,
Products.ProductName,Suppliers.CompanyName AS SupplierName,[Order
Details].UnitPriceFROM Products INNER JOINSuppliers ON
Products.SupplierID = Suppliers.SupplierIDINNER JOIN[Order Details]
ON Products.ProductID = [Order Details].ProductIDWHERE ([Order
Details].UnitPrice > 200)Ushtrim 4 Te afishohet kodi,data e
porosise si edhe emri i sherbimit postar per te gjithe
porositeOrderIdOrderdateShipperName...
...
...
zgjidhjeSELECT
Orders.OrderID,Orders.OrderDate,Shippers.CompanyNameFROM ORDERS
INNER JOIN ShippersON Orders.ShipVia=Shippers.ShipperIDUShtrim 5 Te
afishohet kodi,data e porosise si edhe emri i sherbimit postar dhe
emri i kompanise
klientOrderIdOrderDateShipperNameCustomerrName............
............
............
............
HINT:-JOIN me 3 tabelaSELECT
Orders.OrderID,Orders.OrderDate,Shippers.CompanyName,Customers.CompanyNameFROM
Orders INNER JOIN Shippers ON
Orders.ShipVia=Shippers.ShipperIDINNER 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 porosiSELECT
Orders.OrderID,Orders.OrderDate,Shippers.CompanyName,Customers.CompanyName,Employees.FirstName,Employees.LastNameFROM
Orders INNER JOIN Shippers ON
Orders.ShipVia=Shippers.ShipperIDINNER JOIN Customers ON
Orders.CustomerID = Customers.CustomerIDINNER JOIN Employees ON
Orders.EmployeeID=Employees.EmployeeID
SELF JOINUshtrimTe afishojme per cdo punonjes, kodin,emrin,
mbiemrin, pozicionin e punes, titullin e kortezise dhe emrin dhe
mbiemrin e shefit te tij
KodiEmriMbiemriPozicioniTitulliEmriShefitMbiemri
ShefitZgjidhje
select
vartesit.EmployeeID,vartesit.TitleOfCourtesy,vartesit.FirstName,vartesit.LastName,vartesit.Title,vartesit.ReportsTo,shefat.EmployeeID,shefat.FirstName,shefat.LastNamefromemployees
as vartesitLEFT OUTER JOINEmployees as shefaton
vartesit.ReportsTo=shefat.EmployeeIDorder by
vartesit.EmployeeIDJOIN DHE GROUP BYUshtrimTe afishojme librin e
shitjeve ne kompanine Northwind sipas formatit te meposhtem:
OrderIdOrderDateEmerKlientiEmerPunonjesiVleraEPorosise...
...
...
...
...
Te mbledhim te dhenat qe na duhen per kete llogaritje
selectOrders.OrderID,OrderDate,Employees.FirstName+'
'+Employees.LastName,Customers.CompanyName,UnitPrice,QuantityfromEmployees
inner join Orderson Employees.EmployeeID=Orders.EmployeeIDinner
join CustomersOn Customers.CustomerID=Orders.CustomerIDinner join
[Order Details]on [Order Details].OrderID=Orders.OrderIDTe shtojme
vleren per cdo rresht
selectOrders.OrderID,OrderDate,Employees.FirstName+'
'+Employees.LastName,Customers.CompanyName,UnitPrice,Quantity,UnitPrice*Quantity
as LineAmountfromEmployees inner join Orderson
Employees.EmployeeID=Orders.EmployeeIDinner join CustomersOn
Customers.CustomerID=Orders.CustomerIDinner join [Order Details]on
[Order Details].OrderID=Orders.OrderIDLibri i shitjeve
selectOrders.OrderID,OrderDate,Employees.FirstName+'
'+Employees.LastName as
Employee,Customers.CompanyName,SUM(UnitPrice*Quantity) as
AmountfromEmployees inner join Orderson
Employees.EmployeeID=Orders.EmployeeIDinner join CustomersOn
Customers.CustomerID=Orders.CustomerIDinner join [Order Details]on
[Order Details].OrderID=Orders.OrderIDgroup by
Orders.OrderID,OrderDate,Employees.FirstName+'
'+Employees.LastName,CompanyNameInteresohemi 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
shituraselectOrders.OrderID,OrderDate,Employees.FirstName+'
'+Employees.LastName as
Employee,Customers.CompanyName,SUM(UnitPrice*Quantity) as
Amount,AVG(UnitPrice) as AvgPricefromEmployees inner join Orderson
Employees.EmployeeID=Orders.EmployeeIDinner join CustomersOn
Customers.CustomerID=Orders.CustomerIDinner join [Order Details]on
[Order Details].OrderID=Orders.OrderIDgroup by
Orders.OrderID,OrderDate,Employees.FirstName+'
'+Employees.LastName,CompanyNameJOINS dhe GRUPIMI
Detyre 1a) Te afishojme librin e shitjeve te kompanise
Northwind
KodiDataEmriMbiemriKlientiVleraZgjidhje
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 VleraFROM
CustomersINNER JOIN OrdersON Customers.CustomerID =
Orders.CustomerIDINNER JOINEmployees ON Orders.EmployeeID =
Employees.EmployeeIDINNER JOIN[Order Details] ON Orders.OrderID =
[Order Details].OrderIDGROUP BY
Orders.OrderID,Orders.OrderDate,Employees.FirstName,Employees.LastName,Customers.CompanyName1.b)
Te afishojme vetem shitjet e realizuara ne USA
Hint: Join me grupi dhe me klauzole whereZgjidhje
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 VleraFROM
CustomersINNER JOIN OrdersON Customers.CustomerID =
Orders.CustomerIDINNER JOINEmployees ON Orders.EmployeeID =
Employees.EmployeeIDINNER JOIN[Order Details] ON Orders.OrderID =
[Order Details].OrderIDWHERE Orders.ShipCountry='USA'GROUP BY
Orders.OrderID,Orders.OrderDate,Employees.FirstName,Employees.LastName,Customers.CompanyName1.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 VleraFROM
CustomersINNER JOIN OrdersON Customers.CustomerID =
Orders.CustomerIDINNER JOINEmployees ON Orders.EmployeeID =
Employees.EmployeeIDINNER JOIN[Order Details] ON Orders.OrderID =
[Order Details].OrderIDWHERE Orders.ShipCountry='USA'GROUP BY
Orders.OrderID,Orders.OrderDate,Employees.FirstName,Employees.LastName,Customers.CompanyNameHAVING
SUM([Order Details].UnitPrice * [Order
Details].Quantity)>40001.d Duam te analizojme shitjet e
kompanise ne vitin 1996 muaj pas muaji, sipas formatit te
meposhtem
KodiDataEmriMbiemriKlientiMuajiVleraZgjidhje
SELECT
Orders.OrderID,Employees.FirstName,Employees.LastName,Customers.CompanyName,MONTH(Orders.OrderDate)
as muaji,sum([Order Details].UnitPrice* [Order
Details].Quantity)FROM Customers INNER JOINOrders ON
Customers.CustomerID = Orders.CustomerID INNER JOINEmployees ON
Orders.EmployeeID = Employees.EmployeeID INNER JOIN[Order Details]
ON Orders.OrderID = [Order Details].OrderIDWhere
YEAR(OrderDate)=1996GROUP 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
SELECTEmployees.FirstName,Employees.LastName,MONTH(Orders.OrderDate)
as muaji,sum([Order Details].UnitPrice* [Order Details].Quantity)
as vleraFROM Customers INNER JOINOrders ON Customers.CustomerID =
Orders.CustomerID INNER JOINEmployees ON Orders.EmployeeID =
Employees.EmployeeID INNER JOIN[Order Details] ON Orders.OrderID =
[Order Details].OrderIDWhere YEAR(OrderDate)=1996GROUP
BYEmployees.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 vleraFROM
Customers INNER JOINOrders ON Customers.CustomerID =
Orders.CustomerID INNER JOINEmployees ON Orders.EmployeeID =
Employees.EmployeeID INNER JOIN[Order Details] ON Orders.OrderID =
[Order Details].OrderIDWhere YEAR(OrderDate)=1996GROUP
BYMONTH(Orders.OrderDate)Detyre2.1 Te afishojme xhiron financiare
per cdo punonjes ne formatin
EmployeeIdFirstnameLastnameTurnover.........
...........
...............
.............
select
Employees.EmployeeID,FirstName,LastName,SUM(UnitPrice*Quantity) as
TurnOverfrom Employees Inner join Orderson
Employees.EmployeeID=Orders.EmployeeIDinner join [Order Details] on
Orders.OrderID=[Order Details].OrderIDgroup by
Employees.EmployeeID,FirstName,LastName2.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 OrdersWHERE
OrderDateBETWEEN '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()))EmployeeIDFirstnameLastnameInterstedMonthTurnover...
...
...
..
...
select
Employees.EmployeeID,FirstName,LastName,DATEPART(MONTH,Orderdate)
as 'InterestedMonth',SUM(UnitPrice*Quantity) as TurnOverfrom
Employees Inner join Orderson
Employees.EmployeeID=Orders.EmployeeIDinner join [Order Details] on
Orders.OrderID=[Order Details].OrderIDwhere OrderDate between
'1996-1-1' and '1997-1-1'group by
Employees.EmployeeID,FirstName,LastName,DATEPART(MONTH,Orderdate)order
by Employees.EmployeeID,InterestedMonthI njejti rezultat merret me
funksionin MONTH
select Employees.EmployeeID,FirstName,LastName,Month(Orderdate)
as 'InterestedMonth',SUM(UnitPrice*Quantity) as TurnOverfrom
Employees Inner join Orderson
Employees.EmployeeID=Orders.EmployeeIDinner join [Order Details] on
Orders.OrderID=[Order Details].OrderIDwhere OrderDate between
'1996-1-1' and '1997-1-1'group by
Employees.EmployeeID,FirstName,LastName,Month(Orderdate)order by
Employees.EmployeeID,InterestedMonthDetyre 3.1 - Te afishojme
xhiron financiare te klienteve sipas formatit te meposhtem
KodiKlientiXhiro.....
.........
.........
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 CategoriesON
Categories.CategoryID=Products.CategoryIDwhere
Categories.CategoryID>6order by Categories.CategoryID desc--
JOIN DHE GRUPIMI
-- shembull me produktet dhe kategorite
SELECT
Categories.CategoryID,CategoryName,ProductID,ProductnameFROMCategories
LEFT OUTER JOIN Productson
Categories.CategoryID=Products.CategoryID-- TI GRUPOJME DHE
NUMEROJME
SELECT Categories.CategoryID,CategoryName,COUNT(ProductID)
'Produkte'FROMCategories LEFT OUTER JOIN Productson
Categories.CategoryID=Products.CategoryIDGROUP BY
Categories.CategoryID,CategoryName-- po nese nuk e vendosim
categoryname tek group by
SELECT Categories.CategoryID,CategoryName,COUNT(ProductID)
'Produkte'FROMCategories LEFT OUTER JOIN Productson
Categories.CategoryID=Products.CategoryIDGROUP 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'FROMCategories LEFT OUTER JOIN Productson
Categories.CategoryID=Products.CategoryIDGROUP 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'FROMCategories LEFT OUTER JOIN Productson
Categories.CategoryID=Products.CategoryIDGROUP 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'FROMCategories LEFT OUTER JOIN Productson
Categories.CategoryID=Products.CategoryIDWHERE
Products.UnitsInStock10-- DETYRE-- Afishoni te njejtat
rezultate--por me filter where ShipCountry='USA'
Kapitulli VI. Integriteti Referues
6.1 Perfundoni percaktimin e SQL DDL-se se database-it te bankes
te figures se meposhtme duke perfshire dhe relacionet loan dhe
borrower.
create table customer
(customer-name char(20),
customer-street char(30),
customer-city char(30),
primary key (customer-name))
create table branch
(branch-name char(15),
branch-city char(30),
assets integer,
primary key (branch-name),
check (assets >= 0))
create table account
(account-number char(10),
branch-name char(15),
balance integer,
primary key (account-number),
foreign key (branch-name) references branch,
check (balance >= 0))
create table depositor
(customer-name char(20),
account-number char(10),
primary key (customer-name, account-number),
foreign key (customer-name) references customer,
foreign key (account-number) references account)
Figure 1. SQL DDL per pjesen e db-se se bankes
Zgjidhje:create table loan
(loan-number char(10),
branch-name char(15),
amount integer,
primary key (loan-number),
foreign key (branch-name) references branch)
create table borrower
(customer-name char(20),
loan-number char(10),
primary key (customer-name, loan-number),
foreign key (customer-name) references customer,
foreign key (loan-number) references loan)
6.2 Le te marrim parasysh database-in relacional te
meposhtem:
employee (employee-name, street, city)
works (employee-name, company-name, salary)
company (company-name, city)
manages (employee-name, manager-name)
Jepni nje percaktim te gjuhes se percaktimit te te dhenave SQL
per kete db, duke identifikuar constraints-et e integritetit
referues qe duhet te paraqiten dhe perfshini ato ne percaktimin
DDL.
Zgjidhje:
create table employee
(employee-name char(20),
street char(10),
city char(10),
primary key (employee-name))
create table works
(employee-name char(20),
company-name char(15),
salary integer,
primary key (employee-name),
foreign key (employee-name) references employee,
foreign key (company-name) references company)
create table company
(company-name char(15),
city char(10),
primary key (company-name))
create table manages
(employee-name char(20),
manager-name char(20),
primary key (employee-name),
foreign key (employee-name) references employee,
foreign key (manager-name) references employee)
6.3. Constraints-et e integritetit referues perfshijne
ekzaktesisht dy relacione. Konsideroni nje db qe perfshin
relacionet e mposhtme:
salaried-worker (name, office, phone, salary)
hourly-worker (name, hourly-wage)
address (name, street, city)
Supozojme se deshirojme te kerkojme qe cdo emer qe shfaqet ne
address te shfaqet po ashtu dhe ne salaried-worker ose
hourly-worker, por jo patjeter ne te dyja.
a. propozoni nje sintakse per te shprehur keto konstrainte.b.
diskutoni veprimet qe sistemi mund te ndermarre per te siguruar nje
constraint te kesaj forme.6.4. SQL-ja lejon qe nje varesi e celesit
te jashtem ti referohet te njejtit relacion, si ne shembullin e
meposhtem:
create table manager
(employee-name char(20) not null
manager-name char(20) not null,
primary key employee-name,
foreign key (manager-name) references manager
on delete cascade )
Ketu, employee-name eshte nje celes ne tabelen manager, me
domethenien qe cdo punonjes ka te pakten nje manaxher. Fjalia
foreign-key kerkon qe cdo manaxher te jete gjithashtu nje punonjes.
Shpjegoni se cfare ndodh kur nje rresht ne relacionin manager te
fshihet?
Zgjidhje:
Atehere do te fshihen gjithe rreshtat e punonjesve te relacionit
manager. Se pari do te fshihen te gjithe rreshtat qe i
korrespondojne direkt punonjesve te manager-it. Pastaj keto fshirje
do te pershkallezohen ne nivel te dyte te rreshtave te punonjesve,
derisa ne menyre direkte apo indirekte do te fshihen te gjithe
rreshtat e punonjesve.
6.5. Supozojme se kemi dy relacione r dhe s, te tille qe celesi
i jashtem B i r-se i referohet celesit primar te A-se nga s-ja.
Pershkruani si duhet te perdoret mekanizimi i trigger-it qe mund te
perdoret per te implementuar opsionin on delete cascade kur nje
rresht fshihet nga s-ja.
r(A), s(B)
create table r
(A char(10),
primary key (A))create table s
(B char(10),
foreign key (B) references r
on delete cascade )create trigger trigger_test
after delete on s
referencing old row as orow
for each row
delete from s
where orow.B in (select A from r where orow.A=r.A)
6.6. Jepet tabela e mposhtme per Employee:
Eid | Ename | City | Designation | Salary | Perks(perfitim)
|
+-----+---------+----------+-------------------+--------+-------+
| 1 | Rahul | Delhi | Manager | 10300 | 853 |
| 2 | Gaurav | Mumbai | Assistant Manager | 10300 | 853 |
| 3 | Chandan | Banglore | Team Leader | 15450 | 999 |
| 5 | Tapan | Pune | Developer | 20600 | 1111 |
| 6 | Amar | Chennai | Developer | 16000 | 1124 |
| 7 | Santosh | Delhi | Designer | 10000 | 865 |
| 8 | Suman | Pune | Web Designer | 20000 | 658 |
a. update-ni kolonen Salary( me nje vlere minus 200 $ per ato
punonjs qe kane nje prfitim me te madh se 400) te tabeles Employee
prpara se te insertoni cdo rekord ne tabelen Employee.
create trigger insert_trigger
before insert on Emp
for each row
update Employee set salary = salary 200
where perks>400;
1.ekzekutohet trigger-i (asnj # nuk ndodh)
2. psh ne rast se behet nje insert into Emp values
(9,'Rajesh','Delhi','Developer',15000,658); ath rezultati do te
jete 1 row affected, keshtu nga trigger-i event before insert do te
kem tashme ne tab. Employee keto te dhena: SELECT * FROM
Employee;
+-----+---------+----------+-------------------+--------+-------+
| Eid | Ename | City | Designation | Salary | Perks |
+-----+---------+----------+-------------------+--------+-------+
| 1 | Rahul | Delhi | Manager | 10000 | 853 |
| 2 | Gaurav | Mumbai | Assistant Manager | 10000 | 853 |
| 3 | Chandan | Banglore | Team Leader | 15150 | 999 |
| 5 | Tapan | Pune | Developer | 20300 | 1111 |
| 6 | Amar | Chennai | Developer | 15700 | 1124 |
| 7 | Santosh | Delhi | Designer | 9700 | 865 |
| 8 | Suman | Pune | Web Designer | 19700 | 658 |
+-----+---------+----------+-------------------+--------+-------+
b. modifikoni vleren e salary (nqs salary= 2)
BEGIN ATOMIC
UPDATE sal-change SET Cnt = Cnt + 1
WHERE Eno = NEW.Eno AND Year = CURRENT YEAR;
INSERT INTO log VALUES(NEW.Eno, NEW.Sal);
END
shembull 2: Kur nje manaxher fshihet, gjithe punonjesit ne
departamentin e tij/saj fshihen gjithashtu.
CREATE TRIGGER Fshirje_Man AFTER DELETE ON emp
FOR EACH ROW
DELETE FROM emp E1 WHERE E1.DeptNo =
(SELECT D.Dno FROM dept D WHERE D.MgrNo = OLD.Eno)
shembull 3: Kur punonjesit insertohen ne tab. emp, ndaloni
ekzekutimin e transaksionit nese ekziston nje vlere qe cenon
constraint per celesin e jashtem
CREATE TRIGGER AbortEmp AFTER INSERT ON emp
FOR EACH STATEMENT
WHEN EXISTS (SELECT * FROM Tab_Re E WHERE NOT EXISTS
(SELECT * FROM dept D WHERE D.Dno = E.DeptNo))
ROLLBACK
shembull 4: Create a view DepPagLarte that has at least one rich
employee
earning more than 1000$.
CREATE VIEW DepPagLarte AS
SELECT DISTINCT D.Dname
FROM emp E, dept D
WHERE E.DeptNo = D.Dno AND E.Sal > 1000
shembull 5:Rifreskoni view-ne DepPagLarte kur shfaqet ndonje
Update ne tabelen emp.
CREATE TRIGGER Refresh_View AFTER UPDATE OF DeptNo, Sal ON
emp
FOR EACH STATEMENT
BEGIN ATOMIC
DELETE FROM DepPagLarte;
INSERT INTO DepPagLarte
(SELECT DISTINCT D.Dname FROM emp E, dept D
WHERE E.DeptNo = D.Dno AND E.Sal > 1000);
END
shembull 6: Mirembani nje kopje replikuese te dept kur tabela
origjinale dept ndryshon:
Rreg 1:
CREATE TRIGGER Rreg_Insert
AFTER INSERT ON dept FOR EACH STATEMENT
INSERT INTO PosDelta
(SELECT * FROM NEW TABLE)
Rreg 2:
CREATE TRIGGER Rreg_Delete
AFTER DELETE ON dept FOR EACH STATEMENT
INSERT INTO NegDelta
(SELECT * FROM OLD TABLE)
Rreg 3:
CREATE TRIGGER Rreg_Update
AFTER UPDATE ON dept FOR EACH STATEMENT
BEGIN ATOMIC
INSERT INTO PosDelta
(SELECT * FROM NEW TABLE);
INSERT INTO NegDelta (SELECT * FROM OLD TABLE);
END
Kapitulli: NORMALIZIMIRregullat e ArmstrongsNqs , ath
(pasqyrimi)
Nqs , ath (shtimi)
Nqs , dhe , ath (kalimi)
Nqs plotesohet(i vertete) dhe plotesohet, ath plotesohet
(bashkimi)
Nqs eshte i vertete, ath plotesohet dhe plotesohet
(dekompozimi)
Nqs eshte i vertete dhe plotesohet, ath plotesohet
(pseudokalimit)
1. Supozojme se dekompozojme skemen R = (A, B, C, D, E) ne:(A,
B, C)(A, D, E)Tregoni qe ky dekompozim eshte nje dekompozim
lossless-join nqs plotesohet bashkesia F e varesive
funksionale:
A BCCD EB DE ANje dekompozim {R1, R2} eshte dekompozim
lossless-join nqs R1 R2 R1 ose R1 R2 R2. Le te jete R1 = (A, B, C),
R2 = (A, D, E), dhe R1 R2 = A. Meqe A eshte nje celes kandidat (do
te shohim mbylljen e F+), prandaj R1 R2 R1.
Shenim: Nuk ka arsye qe te studentat te listojne gjithe F+.
Rezultati duhet te jete i pranueshem per sa kohe nuk gjendet asnje
anetar te F.
Zgjidhje:Fillojme me:
A BC, mund te konkludojme se : A B dhe A C (dekompozimi)
Meqe A B dhe B D ath A D (kalimi)
Meqe A CD (nga: A C dhe A D , vetia e bashkimit ) dhe CD E ath A
E (kalimi)
Meqe A A, (pasqyrimi)
A ABCDE nga hapat e mesiperm (bashkimi)
Meqe E A, ath E ABCDE (nga kalimi meqe A ABCDE)
Meqe CD E ath CD ABCDE (kalimi)
Meqe B D and BC CD, BC ABCDE (shtimi, kalimi)
Prandaj, cdo varesi fnk me A, E, BC, ose CD ne LHS (sepse kam
qe: A ABCDE, E ABCDE, CD ABCDE, BC ABCDE ) te shigjetave eshte ne
F+ nuk ka rendesi se cilat attribute paraqiten ne FD.
Shenojme me * per te perfaqesuar cdo bashkesi atributesh ne R,
pastaj F+ eshte
BD B, BD D, C C, D D, BD BD, B D, B B, B BD, dhe gjithe FDs
e
forms A , BC , CD , E ku eshte cdo lloj nenbashkesie e {A, B, C,
D, E}. Celesat candidate jane: A, BC, CD, dhe E.
2. Listoni gjithe varesite funksionale qe plotesojne relacionin
e meposhtem:Varesite funksionale qe plotesohen jane: A B dhe C BC
nukA (rreshti i pare dhe i trete kane vlera te ndryshme)B nukA
pse?A nukC B nukC3. Konsideroni nje relacion R ={A,B,C,D,E}. Jane
dhene varesite e mposhtme funksionaleA BBC EED A A eshte ACD nje
celes kandidat per R? (Shenim: nje bashkesi atributesh X eshte nje
celes nese X R, ku R eshte nje bashkesi e te gjithe atributeve te
relacionit R)
Zgjidhje:a) ne baze te v. shtimit me C kemi AC BCb) nga
v.kalimit AC BC dhe BC E ath AC Ec) nga v.bashkimit a) dhe b) ath
AC BCEd) nga v.shtimit me AD, AC BCE ath ACD ABCDEKeshtu qe, meqe
ACD ABCDE percaktohet nga bashkesia e FDs ath ACD eshte nje celes4.
Konsideroni nje relacion R ={A,B,C,D}. Jane dhene varesite e
mposhtme funksionale :A B CC DD AA B D A B AA C A A C C A C D A C B
A D A BD BA BD C BD Da.gjeni celesat ne R{A}+={A} {C,D}+={
C,D,A}{B}+={B} {A,B,C}+={A,B,C,D}{C}+={C,D,A }
{A,B,D}+={A,B,C,D}{D}+={D,A} {A,C,D}+={A,C,D}{A,B}+={A,C,D} ()
{B,C,D}+={A,B,C,D}{A,C}+={A,C,D,B?}
{A,B,C,D}+={A,B,C,D}{A,D}+={A,D}{B,C}+={ B,C,D,A} {B,D}+={ B,D,A}b)
gjeni gjithe varesite jo triviale {A}+={A} {C,D}+={ C,D,A}{B}+={B}
{A,B,C}+={A,B,C,D}{C}+={C,D,A} {A,B,D}+={A,B,C,D}{D}+={D,A}
{A,C,D}+={A,C,D}{A,B}+={A,B,C,D} {B,C,D}+={A,B,C,D}{A,C}+={A,C,D}
{A,B,C,D}+={A,B,C,D}{A,D}+={A,D}{B,C}+={ B,C,D,A} {B,D}+={
B,D,A}Duke perdorur database Northwind
1) Ndertoni nje view vw_Prod_UK, qe shfaq emrin, sasine dhe
cmimim per njesi te produkteve qe jane shitur ne 'UK'
CREATE VIEW vw_Prod_UK AS
SELECT
Products.ProductName,Products.QuantityPerUnit,Products.UnitPrice
FROM Products,Orders,[Order Details],Customers
WHERE Products.ProductID = [Order Details].ProductID
AND [Order Details].OrderID = Orders.OrderID
AND Orders.CustomerID = Customers.CustomerID
AND Customers.Country like 'UK'
//THIRRJA E VIEWS
SELECT * FROM vw_Prod_UKNdertoni nje stored procedure qe merr si
parameter input id-ne e fatures dhe kthen vleren e kesaj fature.
Duke perdorur kete stored procedure, gjeni vleren e fatures me id
10298CREATE PROCEDURE Fatura
@ID int,
@totali int OUTPUT
AS
BEGIN
SELECT @totali=SUM(Quantity *(UnitPrice -
UnitPrice*Discount))
FROM [Order Details]
WHERE OrderID = @ID
RETURN @totali
END
//THIRRJA E STORE PROCEDURES
DECLARE@return_value int,
@totali int
EXEC@return_value = Fatura
@ID = 10298,
@totali = @totali OUTPUT
SELECT@totali as N'@totali'
SELECT @return_value2) Gjeni tek cili punonjes raporton (dmth ke
ka shef) punonjesi me emer Buchanan Steven
SELECT shefi.FirstName , shefi.LastName
FROM Employees as shefi
WHERE shefi.EmployeeID in
(SELECT punonjes.ReportsTo
FROM Employees as punonjes
WHERE punonjes.FirstName = 'Steven'
AND punonjes.LastName = 'Buchanan')KAPITULLI XML1. Jepni nje
paraqitje alternative te informacionit te bankes qe permban te
njejtat te dhena si ne fig. 1 duke perdorur atributet ne vend te
nenelementeve. Gjithashtu jepni dhe DTD per kete paraqitje.
A-101
Downtown
500
A-102
Perryridge
400
A-201
Brighton
900
Johnson
Alma
Palo Alto
Hayes
Main
Harrison
A-101
Johnson
A-201
Johnson
A-102
Hayes
Fig.1a. Zgjidhje
b. DTD e bankes
account-number ID #REQUIRED
branch-name CDATA #REQUIRED
balance CDATA #REQUIRED >
customer-name ID #REQUIRED
customer-street CDATA #REQUIRED
customer-city CDATA #REQUIRED >
account-number IDREF #REQUIRED
customer-name IDREF #REQUIRED >] >2. Tregoni duke dhene
DTD si paraqitet relacioni i nderfutur books nga fig. e
meposhtme:
Zgjidhje nga studentat:
3. Tregoni DTD per paraqitjen XML te skemes se meposhtme
relacionale:
Emp = (ename, ChildrenSet setof(Children), SkillsSet
setof(Skills))Children = (name, Birthday)Birthday = (day, month,
year)Skills = (type, ExamsSet setof(Exams))Exams = (year,
city)Zgjidhje:
] >4.Shkruani query-t ne XSLT dhe ne XPath ne DTD e ushtrimit
3 per te listuar gjithe llojet e aftesive ne Emp.
a. XPath: /db/emp/skills/type
b. XSLT:
5. Shkruani nje query ne XQuery ne paraqitjen XML te fig.1 per
te gjetur totalin e balances, pergjate gjithe llogarive ne cdo
dege.
for $b in distinct (/bank/account/branch-name)
return
$b/text() let $s := sum
(/bank/account[branch-name=$b]/balance)
return $s
6.Shkruani nje document XML per te pershkruar vetveten si: name,
occupation, address dhe hobies.
Oskari
Heinonen
assistant
Univ. of Helsinki, Dept. of Computer Science
P.O. Box 68
Gustaf Hllstrmin katu 2b
FI-00014
University of Helsinki
eating
sleeping
b. Jepni DTD per xml e mesiperme:
7. Jepet dok XML i meposhtem se bashku me DTD dhe nje CSS
file
Computer Parts
Motherboard
ASUS
P3B-F
123.00
Video Card
ATI
All-in-Wonder Pro
160.00
Sound Card
Creative Labs
Sound Blaster Live
80.00
type (computer|auto|airplane) #IMPLIED>
dhe xmlpartstyle.css".
PARTS
{ display: block }
TITLE
{ display: block;
font-family: arial;
color: #008000;
font-weight: 600;
font-size: 22;
margin-top: 12pt;
text-align: center }
PART
{ display: block }
ITEM
{ display: block;
font-family: arial;
color: #000080;
font-weight: 400;
margin-left: 15pt;
margin-top: 12pt;
font-size: 18 }
MANUFACTURER
{ display: block;
font-family: arial;
color: #600060;
font-weight: 400;
margin-left: 45pt;
margin-top: 5pt;
font-size: 18 }
MODEL
{ display: block;
font-family: arial;
color: #006000;
font-weight: 400;
margin-left: 45pt;
margin-top: 5pt;
font-size: 18 }
COST
{ display: block;
font-family: arial;
color: #800000;
font-weight: 400;
margin-left: 45pt;
margin-top: 5pt;
font-size: 18 }
b. Tregoni si paraqitet ne browser
8. Jepet XML e meposhtme, tregoni DTD per te:
Video Title 1 Artist 1
< music > Video Title 2 < artist > Artist 2 <
artist > Artist 3
1. Jepni DTD per skemen relacionale te mesiperme:
pid ID #REQUIRED
>
sid ID #REQUIRED >
2. Shkruani dok XML nepermjet DTD-se se dhene
Wiz
555-1234
gizmo plus
99.99
more features
25%
Econo-Wiz
555-6543
gizmo
22.99
great
10%
gizmo plus
99.99
more features
15%