Repository navigation
Expand file tree
/
Copy path09_SQL_Set-operators.sql
More file actions
174 lines (134 loc) · 4.21 KB
/
Copy path09_SQL_Set-operators.sql
File metadata and controls
174 lines (134 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
------------SET OPERATORS-------------
/*
Uzywajac SET Operators bedziemy laczyc tabele po wierszach wplywajac na jej dlugosc a nie szerokosc
jak w JOIN 'ach. Aby wykonac tego typu polaczenie bedziemy potrzebowali takich samych kolumn.
struktura SET Operators:
SELECT ---- 1st select statement
FirstName,
LastName
FROM Customers
(reszta select statementu
np.join where group by)
UNION ---- SET operator
SELECT ---- 2nd select statement
FirstName
LastName
FROM Employees
(reszta select statementu
np.join where group by)
Zasady SET Operators:
- mozna uzywac z niemal wszystkimi poleceniami z select statements, ale nie
z ORDER BY. Te mozna uzyc dopiero na koncu zapytania tylko jeden raz (na samym dole).
- liczba kolumn w kazdym zapytaniu musi byc taka sama
- typy danych w podanych kolumnach musza byc byc kompatybilne
- kolejnosc kolumn w select statementach musi byc taka sama
- nazwy kolumn w result set sa definiowane przez nazwy kolumn w pierszym zapytaniu SELECT
- nawet jesli wczesniejsze zasady sa zachowane to dalej nie ma gwarancji ze wynik jest
poprawny poprawne napisanie zapytania nalezy do nas
USE CASES dla SET Operators
- laczenie podobnych informacji przed analiza danych
- identyfikowanie roznic lub zmian (delty) w 2 partiach danych. przykladowo porownywanie informacji
z dnia 1 do dnia 2 aby uniknac wgrywania niepotrzebych danych do data warehouse lub data lake.
- operator EXCEPT moze byc uzywany by porownywac talebe aby zauwazyc rozbieznosci pomiedzy dwoma
bazami danych (np przy migracji. robimy EXCEPT zaczynajac od pierwszej, a potem od drugiej tabeli)
NOTE::Pierwszy select "kontroluje" jakie typy w danych kolumnach przymuje nasza tabela
*/
---------------UNION---------------
/*
Zwraca wszystkie unikalne wiersze z obu zapytan select. Usuwa duplikaty z wyniku.
(graficznie;; P suma R)
*/
USE SalesDB
/*task: Combine the data from employees and customers into one table*/
SELECT
FirstName,
LastName
FROM Sales.Employees
UNION
SELECT
FirstName,
LastName
FROM Sales.Customers
-------------UNION ALL--------------
/*
Zwraca wszystkie wiersze z dwoch zapytan select, takze duplikaty.
(graficznie;; osobne kolka)
NOTE:: Union all jest szybsze od union poniewaz nie sprawdza instnienia duplikatow
NOTE:: Union all uzywa sie do znalezienia duplikatow i innych problemow jakosciowych
*/
/*task: Combine the data from employees and customers into
one table including duplicates */
SELECT
FirstName,
LastName
FROM Sales.Employees
UNION ALL
SELECT
FirstName,
LastName
FROM Sales.Customers
-----------EXCEPT (minus)------------
/*
Zwraca wszystkie unikalne wiersze z pierszego zapytania select, ktorych nie ma
w drugim zapytaniu drugim. Tak jak wszystkie set operators (oprocz union all) usuwa duplikaty.
(graficznie;; P \ R ..chocby left anti join).
*/
SELECT
FirstName,
LastName
FROM Sales.Employees
EXCEPT
SELECT
FirstName,
LastName
FROM Sales.Customers
------------INTERSECT-----------
/*
Zwraca tylko wiersze ktore wystepuja w obu zapytaniach select.
*/
/*task: Find the employees who are also customers*/
SELECT
FirstName,
LastName
FROM Sales.Employees
INTERSECT
SELECT
FirstName,
LastName
FROM Sales.Customers
/*task: Orders are stored in separat tables (Orders and OrdersArchive)
Combine all orders into one report without duplicates*/
SELECT
'Orders' AS SourceTable
,[OrderID]
,[ProductID]
,[CustomerID]
,[SalesPersonID]
,[OrderDate]
,[ShipDate]
,[OrderStatus]
,[ShipAddress]
,[BillAddress]
,[Quantity]
,[Sales]
,[CreationTime]
FROM Sales.Orders
UNION ALL -- uzylem union all poniewaz data w archiwum sa starsze niz w orders, co gwarantuje brak duplikatow
SELECT
'OrdersArchive' AS SourceTable
,[OrderID]
,[ProductID]
,[CustomerID]
,[SalesPersonID]
,[OrderDate]
,[ShipDate]
,[OrderStatus]
,[ShipAddress]
,[BillAddress]
,[Quantity]
,[Sales]
,[CreationTime]
FROM Sales.OrdersArchive
--NOTE:: Nie uzywaj gwiazdki (*) by laczyc tabele; wypisz potrzebne kolumny
--NOTE:: Uzywaj source flag (ta kolumna ze statikiem na poczatku zapytan), aby okreslic
--z ktorej tabeli jest to wiersz