72
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 Grupit Ka disa funksione te SQL qe aplikohen mbi grupet e rreshtave. Keto funksione si psh S 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 GR jene ne listen e kollonave te SELECT. Rezultatet pas grupimit mund te filtrohen nepermjet HAVING BY, e cila eshte e ngjashm por ne dallim nga kjo e fundit aplikohet pas llogaritjes se rezultateve mbi rreshtat Per shembull, komanda e meposhtme afishon numrin e shitjeve per cdo kod punonjesi: SELECT EmployeeId, Count(*) ‘NoOfOrdersHeDealed’ from Orders Group by (EmployeeId) Shembull

Ushtrimet e DB1

Embed Size (px)

DESCRIPTION

DATABASE

Citation preview

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%