Advertisement
Guest User

Untitled

a guest
Apr 5th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 6.54 KB | None | 0 0
  1. --Katarzyna Reszka-Hanaj
  2. USE NORTHWND
  3. --Łączenie tabel
  4.  
  5. /*
  6. W klauzuli FROM określamy przede wszystkim źródła (zbiory) z których chcemy pobrać dane
  7. FROM jest pierwszym krokiem przetwarzania danych
  8.  
  9. SELECT * FROM Tab_1, Tab_2 -> nie stusujemy zazwyczaj, dostajemy iloczyn kartezjanski
  10. */
  11.  
  12. Select * FROM Employees --9 wierszy
  13. Select * from orders    --830 wierszy
  14. select * from employees, orders --9 * 830 wierszy
  15.  
  16. --iloczyn kartezjański: podstawa wszystkich rodzaje złączeń
  17. --odrzuca się z niego następnie wiersze, które 'nie pasują' do złączenia danego typu  
  18.  
  19. /*
  20. patrzymy na klucze glówne i obce
  21.  
  22. Złączenia wewnętrzne:
  23. JOIN ... ON ...
  24. INNER JOIN ... ON ...
  25.  
  26. Złączenia zewnętrzne
  27. LEFT JOIN ... ON ...
  28. LEFT OUTER JOIN ... ON ...
  29. RIGHT JOIN ... ON ...
  30. RIGHT OUTER JOIN ... ON ...
  31. FULL JOIN ... ON ...
  32. CROSS JOIN ... on...
  33.  
  34. select*
  35. from tabela1 JOIN tabela2 ON tabela1.nazwaKolumny = tabela2.nazwaKolumny
  36.  
  37. Podstawowym rodzajem złączeń jest INNER JOIN:
  38. Z iloczynu kartezjańskiego wybiera ono te wiersze dla  których warunek równania zostaje spełniony.
  39. W żadnej z łączonych tabel kolumna użyta do łączenia nie może mieć wartości NULL.
  40. Zwraca wyłacznie te wiersze, dla których kolumny użyte do złaczenia mają tę samą wartość.
  41.  
  42. LEFT JOIN zwraca:
  43. 1) wiersze dla których warunek złączenia jest spełniony,
  44. 2) wiersze z 'lewej' tabeli, dla których nie ma odpowiedników w 'prawej' tabeli.
  45.  
  46. RIGHT JOIN zwraca:
  47. 1) wiersze dla których warunek złączenia jest spełniony,
  48. 2) wiersze z 'prawej' tabeli, dla których nie ma odpowiedników w 'lewej' tabeli.
  49.  
  50. LEFT OUTER JOIN zwraca:
  51. 1) wiersze dla których warunek złączenia jest spełniony,
  52. 2) wiersze z 'lewej' tabeli, dla których nie ma odpowiedników w 'prawej' tabeli.
  53.  
  54. RIGHT OUTER JOIN zwraca:
  55. 1) wiersze dla których warunek złączenia jest spełniony,
  56. 2) wiersze z 'prawej' tabeli, dla których nie ma odpowiedników w 'lewej' tabeli.
  57.  
  58.  
  59. FULL OUTER JOIN zwraca:
  60. 1) wiersze dla których warunek złączenia jest spełniony,
  61. 2) wiersze z 'prawej' tabeli, dla których nie ma odpowiedników w 'lewej' tabeli,
  62. 3) wiersze z 'lewej' tabeli, dla których nie ma odpowiedników w 'prawej' tabeli.
  63.  
  64. JOIN = INNER JOIN
  65. LEFT JOIN = LEFT OUTER JOIN
  66. RIGHT JOIN = RIGHT OUTER JOIN
  67. FULL JOIN = FULL OUTER JOIN
  68. CROSS JOIN = iloczyn kartezjański
  69.  
  70. Kroki przetwarzania:
  71. 1) iloczyn kartezjański (każdy z każdym)
  72. 2) określenie warunków połączeń (zdefiniowanych w ON) -> True, False, Unknown
  73. 3) Usuwanie wszystkich elementów z pośredniego zbioru wynikowego, dla których wynik połaczenia (pkt 2)
  74. jest rózny od true
  75. 4) W zależności od typu (left, right, full), wykonywane jest dopełnienie zbioru, o wszystkie
  76. elementy tabeli występującej po lewej, prawej, lub obydwu stronach operatora join, dla których wynik
  77. warunków nie był spełniony (false lub unknown)
  78.  
  79. Krok 4 nie jest wykonywany dla inner join
  80.  
  81. ALIASY:
  82. Skoro from jest wykonywane jako pierwsze, jeśli nadamy aliasy we from, możemy ich potem wszędzie indziej używać
  83.  SELECT *
  84.  FROM tabela1 T1 JOIN tabela2 T2 on T1.nazwaKolumny = T2.nazwaKolumny
  85.  T1, T2 - to aliasy - z pierwszych liter
  86. */
  87.  
  88. --ZADANIA
  89.  
  90. --wyświetl numery zamówień i pracowników (imię i nazwisko)
  91. SELECT FirstName, LastName, OrderID
  92. FROM Employees E JOIN Orders O ON E.EmployeeID=O.EmployeeID
  93.  
  94. --zamówienia/klienci: numery i klienci
  95. SELECT CompanyName, OrderID
  96. FROM Customers C JOIN Orders O ON O.CustomerID=C.CustomerID
  97.  
  98. --zamówienia/klienci/pracownicy: numery i klienci i pracownicy (imię i nazwisko)
  99. SELECT FirstName, LastName, CompanyName, O.OrderID
  100. FROM Employees E JOIN Orders O ON E.EmployeeID=O.EmployeeID
  101. JOIN Customers C ON O.CustomerID=C.CustomerID
  102.  
  103. --ile zmowien zrobili poszczegolni klienci
  104. SELECT CompanyName, count(O.OrderID) AS 'liczba zamowien'
  105. FROM Customers C JOIN Orders O ON O.CustomerID=C.CustomerID
  106. GROUP BY CompanyName
  107. ORDER BY 1
  108.  
  109. --ile zmowien z poszczegolnych krajow
  110. SELECT C.Country AS kraj, count(O.OrderID) AS 'liczba zamowien'
  111. FROM Customers C JOIN Orders O ON O.CustomerID=C.CustomerID
  112. GROUP BY C.Country
  113. ORDER BY 2 desc
  114.  
  115. --ile dostarczono produktów z poszczegolnych krajow
  116. SELECT S.Country AS kraj, SUM(P.UnitsInStock) AS 'liczba dostarczonych produktów'
  117. FROM Suppliers S JOIN Products P ON S.SupplierID = P.SupplierID
  118. GROUP BY S.Country
  119. ORDER BY 2 desc
  120.  
  121. --ile rodzajow produktów w danej kategorii
  122. SELECT Cat.CategoryName AS kategoria, count(P.ProductID) AS 'liczba produktów'
  123. FROM Categories Cat JOIN Products P ON Cat.CategoryID = P.CategoryID
  124. GROUP BY Cat.CategoryName
  125.  
  126. --jakie produkty kupowali poszczeglni klienci
  127. --odp: nazwa klienta (firma), produkty
  128.  
  129. SELECT DISTINCT C.CompanyName, P.ProductName
  130. FROM Products P JOIN [Order Details] OD ON P.ProductID= OD.ProductID
  131. JOIN Orders O ON OD.OrderID=O.OrderID
  132. JOIN Customers C ON C.CustomerID = O.CustomerID
  133. Order by 1
  134.  
  135. --podaj pracownikow oraz wartosc sprzedazy i udzielony rabat dla zmaowien, ktore realizowali
  136. SELECT E.FirstName, E.LastName, OD.Discount, COUNT(O.OrderID) AS 'liczba zamowien', round(SUM(OD.Quantity*OD.UnitPrice), 2) AS Sprzedaz, round(AVG(OD.Quantity*OD.UnitPrice),2) AS sredniaWartosc
  137. FROM Employees E JOIN
  138. Orders O ON E.EmployeeID = O.EmployeeID JOIN
  139. [Order details] OD ON O.OrderID = OD.OrderID
  140. GROUP BY E.FirstName, E.LastName, OD.Discount
  141.  
  142. --podaj pracownikow oraz wartosc sprzedazy i udzielony rabat dla zmaowien, ktore realizowali
  143. SELECT E.FirstName, E.LastName, round(SUM(OD.Quantity*OD.UnitPrice), 2) AS Sprzedaz, round(SUM(OD.Quantity*OD.Discount), 2)
  144. FROM Employees E JOIN
  145. Orders O ON E.EmployeeID = O.EmployeeID JOIN
  146. [Order details] OD ON O.OrderID = OD.OrderID
  147. GROUP BY E.FirstName, E.LastName
  148. Order by 3 desc
  149.  
  150. --wybierz nazwy i nry tel klientow ktorym w 97r przesyłki dostarczała firma United Package
  151. SELECT DISTINCT C.CompanyName,C.Phone,  S.CompanyName AS Dostawca
  152. FROM Customers C JOIN
  153. Orders O ON O.CustomerID=C.CustomerID JOIN
  154. Shippers S ON S.ShipperID=O.ShipVia
  155. WHERE DATEPART(yyyy, O.OrderDate)= 1997
  156. AND S.CompanyName LIKE 'United Package'
  157. ORDER BY 1
  158.  
  159. --ile zamowien obsluzyli spedytorzy
  160. SELECT S.CompanyName, count(O.OrderID) AS liczba
  161. FROM Orders O JOIN
  162. Shippers S ON S.ShipperID=O.ShipVia
  163. GROUP BY S.CompanyName
  164. ORDER BY 2 desc
  165.  
  166. --dla każdego zamowienia łaczna liczba zamowionych jednostek
  167. --wyświetl tylko zamówienia, gdzie łączna ilośc jedbostek jest większa od 250
  168.  
  169. SELECT O.OrderID, SUM(OD.Quantity) AS 'liczba jednostek'
  170. FROM Orders O JOIN [Order Details] OD ON O.OrderID=OD.OrderID
  171. GROUP BY O.OrderID
  172. HAVING SUM(OD.Quantity)>250
  173. ORDER BY 2 desc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement