-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJOIN.txt
350 lines (250 loc) · 18.7 KB
/
JOIN.txt
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
****** JOIN-s оператор-s MySQL ******
Схематично: "Левая таблица" - JOIN - "Правая таблица"
MySQL (PostgreSQL) JOIN используются для извлечения данных из нескольких таблиц.
JOIN выполняется всякий раз, когда две или более таблиц объединяются в SQL запросе.
Существуют различные типы соединений MySQL:
MySQL (PostgreSQL) INNER JOIN (или иногда называют простое соединение)
MySQL (PostgreSQL) LEFT OUTER JOIN (или иногда называют LEFT JOIN)
MySQL (PostgreSQL) RIGHT OUTER JOIN (или иногда называют RIGHT JOIN)
PostgreSQL FULL OUTER JOIN (или иногда называется FULL JOIN)
Рассмотрим синтаксис MySQL JOIN и примеры MySQL JOIN.
****** INNER JOIN (простое соединение) ******
Наиболее распространенный тип соединения это MySQL INNER JOINS, который возвращает
все строки из нескольких таблиц, где выполняется условия соединения.
Синтаксис INNER JOIN в MySQL:
***************************************************************************************
SELECT columns
FROM table1 # Таблица слева
INNER JOIN table2 # Таблица справа
ON table1.column = table2.column; # Поля по которым происходит пересечение (выборка)
***************************************************************************************
!!! Если представить две таблицы table1 и table2 в виде равных кругов, которые пересекаются
между собой, то зона их пересечения будет походить на двояковыпуклую линзу, а если эту зону
закрасить для наглядности, то это и будет результат работы простого INNER JOIN, т.е. область
пересечения двух таблиц !!!
MySQL INNER JOIN будет возвращать записи, где table1 и table2 будут пересекаться.
Пример MySQL INNER JOIN:
***************************************************************************************
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
INNER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
***************************************************************************************
Этот MySQL (PostgreSQL) INNER JOIN возвращает все строки из таблиц suppliers и orders,
где имеются соответствующие значение поля supplier_id в обоих таблицах.
У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name) которая содержит
следующие данные:
supplier_id supplier_name
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA
У нас есть еще одна таблица orders с тремя полями (order_id, supplier_id и order_date)
и данными:
order_id supplier_id order_date
500125 10000 05.05.2015
500126 10001 08.02.2016
500127 10004 06.01.2017
Формируем MySQL запрос SELECT (который содержит INNER JOIN):
***************************************************************************************
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
INNER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
***************************************************************************************
Наш результирующий набор будет выглядеть следующим образом:
supplier_id name order_date
10000 IBM 05.05.2015
10001 Hewlett Packard 08.02.2016
Строки для Microsoft и NVIDIA из таблицы suppliers будут опущены, так как значения
supplier_id 10002 и 10003 не существует в обеих таблицах. Строка order_id 500127 из
таблицы orders будет опущена, так как supplier_id 10004 не существует в таблице
suppliers.
!!! ВНИМАНИЕ !!!
Приведенный выше пример MySQL INNER JOIN можно переписать, используя старый неявный
синтаксис следующим образом (но рекомендуется использовать синтаксис INNER JOIN):
***************************************************************************************
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers, orders
WHERE suppliers.supplier_id = orders.supplier_id;
***************************************************************************************
****** LEFT OUTER JOIN ("Левое соединение") ******
MySQL LEFT OUTER JOIN возвращает все строки из таблиц с левосторонним соединением, указанным
в условии ON, и только те строки из другой таблицы, где объединяемые поля равны.
Синтаксис для LEFT OUTER JOIN в MySQL:
***************************************************************************************
SELECT columns
FROM table1 # Левая таблица
LEFT [OUTER] JOIN table2 # Правая таблица
ON table1.column = table2.column;
***************************************************************************************
!!! Если представить две таблицы table1 (Левая) и table2 (Правая) в виде равных кругов,
которые пересекаются между собой, то зона их пересечения будет походить на двояковыпуклую
линзу. Если эту зону пересечения закрасить для наглядности, то это и будет результат
работы простого INNER JOIN, а если к этой зоне добавить еще и оставшуюся часть table 1
"Левой" таблицы, то это и будет зона пересечения по правилу LEFT OUTER JOIN пересечения
двух таблиц !!!
В некоторых базах данных LEFT OUTER JOIN заменяется на LEFT JOIN.
Т.е. мы имеем MySQL (PostgreSQL) LEFT OUTER JOIN, который возвратит все записи из table1
и только те записи из table2, которые пересекаются с table1.
Пример:
***************************************************************************************
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
LEFT JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
***************************************************************************************
Этот LEFT OUTER JOIN возвратит все строки из таблицы suppliers, и только те строки из
таблицы orders, где объединяемые поля равны.
Если значение supplier_id в таблице suppliers не существует в таблице orders, все поля
таблицы orders будут отображаться в результирующем наборе как NULL.
Рассмотрим более подробно, чтобы понять, как работает LEFT OUTER JOIN:
У нас есть таблица suppliers с полями (supplier_id и supplier_name) и данными:
supplier_id supplier_name
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA
И таблица orders с полями (order_id, supplier_id и order_date) и данными:
order_id supplier_id order_date
500125 10000 05.05.2015
500126 10001 08.02.2016
Выполним MySQL запрос SELECT (который содержит LEFT OUTER JOIN):
***************************************************************************************
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
LEFT OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
***************************************************************************************
Результирующий набор будет следующим:
supplier_id name order_date
10000 IBM 05.05.2015
10001 Hewlett Packard 08.02.2016
10002 Microsoft null
10003 NVIDIA null
Строки Microsoft и NVIDIA будут включены, так как был использован LEFT OUTER JOIN.
Однако поле order_date для этих записей содержит значение NULL.
****** RIGHT OUTER JOIN ("Правое соединение") ******
MySQL RIGHT OUTER JOIN - тип соединения, который возвращает все строки из таблиц с
правосторонним соединением, указанным в условии ON, и только те строки из другой
таблицы, где объединяемые поля равны.
Синтакси RIGHT OUTER JOIN в MySQL:
***************************************************************************************
SELECT columns
FROM table1
RIGHT [OUTER] JOIN table2
ON table1.column = table2.column;
***************************************************************************************
!!! Если представить две таблицы table1 (Левая) и table2 (Правая) в виде равных кругов,
которые пересекаются между собой, то зона их пересечения будет походить на двояковыпуклую
линзу. Если эту зону пересечения закрасить для наглядности, то это и будет результат
работы простого INNER JOIN, а если к этой зоне добавить еще и оставшуюся часть table 2
"Правой" таблицы, то это и будет зона пересечения по правилу RIGHT OUTER JOIN пересечения
двух таблиц !!!
В некоторых базах данных, RIGHT OUTER JOIN заменяется на RIGHT JOIN.
MySQL RIGHT OUTER JOIN возвратит все записи из table2 и только те записи из table1, которые
пересекаются с table2.
!!! Если подумать, в простом случае, можно обойтись только одним из вариантов
RIGHT/LEFT OUTER JOIN. Меняя таблицы местами в JOIN запросе, мы будем получать
нужный результат пересечения !!!
Ниже приведен пример MySQL RIGHT OUTER JOIN:
***************************************************************************************
SELECT orders.order_id, orders.order_date, suppliers.supplier_name
FROM suppliers
RIGHT JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
***************************************************************************************
Этот пример RIGHT OUTER JOIN возвращает все строки из таблицы orders и только те строки
из таблицы suppliers, где объединяемые поля равны.
Если значение supplier_id в таблице orders не существует в таблице suppliers, все поля в
таблице suppliers будут отображаться в результирующем наборе как NULL.
Рассмотрим пример, чтобы понять, как работает RIGHT OUTER JOIN:
У нас есть таблица suppliers с полями (supplier_id и supplier_name) и данными:
supplier_id supplier_name
10000 Apple
10001 Google
И таблица orders с полями (order_id, supplier_id и order_date) и записями:
order_id supplier_id order_date
500125 10000 12.05.2016
500126 10001 14.05.2016
500127 10002 18.05.2016
Запустим MySQL запрос SELECT (который содержит RIGHT OUTER JOIN):
***************************************************************************************
SELECT orders.order_id, orders.order_date, suppliers.supplier_name
FROM suppliers
RIGHT OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
***************************************************************************************
Результат будет выглядеть следующим образом:
order_id order_date supplier_name
500125 12.05.2016 Apple
500126 14.05.2016 Google
500127 18.05.2016 null
Строка для order_id 500127 будет включена, так как был использован RIGHT OUTER JOINS.
Однако поле supplier_name для этой записи содержит значение NULL, так как данных в
таблице suppliers нет.
!!! ****** PostgreSQL FULL OUTER JOIN ("Полное пересечение") ******* !!!
PostgreSQL FULL OUTER JOIN. Этот тип соединения возвращает все строки из левой таблицы и
правой таблицы с NULL - значениями в месте, где условие соединения не выполняется.
Синтаксис для PostgreSQL FULL OUTER JOIN:
***************************************************************************************
SELECT columns
-- Левая таблица
FROM table1
-- Правая таблица
FULL OUTER JOIN table2
ON table1.column = table2.column;
***************************************************************************************
!!! Если представить две таблицы table1 (Левая) и table2 (Правая) в виде равных кругов,
которые пересекаются между собой, то зона их пересечения будет походить на двояковыпуклую
линзу. Если эту зону пересечения закрасить для наглядности, то это и будет результат
работы простого INNER JOIN, а если к этой зоне добавить еще и оставшуюся часть table 2
"Правой" таблицы и оставшуюся часть table 1 "Левой" таблицы, то вся эта закрашеная область
похожая на прекрасную женскую грудь в узком декольте и будет зона пересечения по правилу
PostgreSQL FULL OUTER JOIN пересечения двух таблиц !!!
PostgreSQL FULL OUTER JOIN запрос будет возвращать все записи из table1 и table2.
Пример в PostgreSQL :
***************************************************************************************
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
FULL OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
***************************************************************************************
Этот пример FULL OUTER JOIN будет возвращать все строки из таблицы suppliers и все строки
из таблицы orders и всякий раз, когда условие соединения не выполняется, то поля в
результирующем наборе будут принимать пустые значения.
Если значение supplier_id в таблице suppliers не существует в таблице orders, все поля
в таблице orders будут отображаться как в результирующем наборе. Если значение supplier_id
в таблице orders не существует в таблице suppliers, все поля в таблице suppliers будут
отображаться как в результирующем наборе.
Пример работы FULL OUTER JOINS:
У нас таблица suppliers с полями (supplier_id и supplier_name) и записями:
supplier_id supplier_name
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA
И вторая таблица с именем orders и полями (order_id, supplier_id и order_date):
order_id supplier_id order_date
500125 10000 10.04.2019
500126 10001 20.04.2019
500127 10004 30.04.2019
Формируем SQL запрос (который содержит FULL OUTER JOIN):
***************************************************************************************
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
FULL OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
***************************************************************************************
Результат запроса будет выглядеть так:
supplier_id | supplier_name | order_date
----------------------------------------------
10000 | IBM | 10.04.2019
10001 | Hewlett Packard | 20.04.2019
10002 | Microsoft |
10003 | NVIDIA |
| | 30.04.2019
Строки для 'Microsoft' и 'NVIDIA' будут включены, поскольку использовался FULL OUTER JOIN.
Однако поле order_date для этих записей содержит пустое значение. Строка для supplier_id 10004
также будет включена, поскольку используется FULL OUTER JOIN. И тут поля supplier_id и
supplier_name для этих записей тоже содержат пустые значения.