ushtrimet e db1
DESCRIPTION
DATABASETRANSCRIPT
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%