-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUNION.txt
160 lines (127 loc) · 8.31 KB
/
UNION.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
****** SQL оператор UNION ******
SQL оператор UNION используется для объединения результирующих наборов из 2-х
или более операторов SELECT. Он удаляет повторяющиеся строки между различными
запросами SELECT. Каждый оператор SELECT в UNION должен иметь одинаковое
количество полей в наборах результатов с одинаковыми типами данных.
****** Разница между UNION и UNION ALL ******
UNION удаляет повторяющиеся строки
Оператор UNION ALL не удаляет повторяющиеся строки
Синтаксис:
********************************************************************************
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
********************************************************************************
Параметры:
- expression1, expression2, expression_n - cтолбцы или расчеты, которые
мы хотим получить.
- tables - таблицы, из которых мы хотим получить записи. В предложении
FROM должна быть указана хотя бы одна таблица.
- WHERE conditions - необязательный. Условия, которые должны быть выполнены
для записей, которые будут выбраны.
!!! ВНИМАНИЕ !!!
В обоих операторах SELECT должно быть одинаковое количество выражений
Соответствующие выражения должны иметь одинаковый тип данных в запросах SELECT.
Например: expression1 должен иметь одинаковый тип данных как в первом, так
и во втором операторе SELECT
!!! ВНИМАНИЕ !!!
****** UNION с одиночным полем с тем же именем ******
Использование SQL оператора UNION, который возвращает одно поле. В этом примере
поле в обоих операторах SELECT будет иметь одинаковое имя и тип данных.
Пример:
********************************************************************************
SELECT supplier_id
FROM suppliers
UNION
SELECT supplier_id
FROM orders
ORDER BY supplier_id;
********************************************************************************
В этом SQL запросе, если supplier_id появилось в таблицах suppliers и orders
(т.е. в обеих таблицах), оно будет отображено один раз в вашем наборе результатов.
Оператор UNION удаляет дубликаты. Если мы не хотим удалять дубликаты, нужно
использовать оператор UNION ALL.
Пример:
Таблица suppliers, имеет поля: supplier_id, supplier_name.
Таблица orders имеет поля: order_id, order_date, supplier_idA
Формируем SQL запрос с UNION:
********************************************************************************
SELECT supplier_id
FROM suppliers
UNION
SELECT supplier_id
FROM orders
ORDER BY supplier_id;
********************************************************************************
В данном случае UNION возьмет все значения supplier_id из таблицы suppliers, а также
из таблицы orders и возвратит комбинированный набор результатов. Поскольку оператор
UNION удалит дубликаты между результирующими наборами, поле supplier_id имеющее
дубликаты будет иметь неповторяющийся набор данных, т.е. все выведенные записи
отображается только один раз, даже если оно находится в таблицах suppliers и orders.
Если мы хотим отображать дубликаты, нужно использовать оператор UNION ALL.
****** Использование UNION с разными именами полей ******
Нет необходимости, чтобы соответствующие столбцы в каждом операторе SELECT имели
одинаковые имена, но они должны быть с одинаковыми, соответствующими типами данных
(INT к INT, STRING к STRING). Если у нас нет одинаковых имен столбцов между
операторами SELECT, это немного путает, особенно если мы хотим упорядочить результаты
запроса, используя оператор ORDER BY.
Использование оператора UNION с разными именами столбцов и упорядочиванием
результатов запроса, пример:
********************************************************************************
SELECT supplier_id,
supplier_name
FROM suppliers
WHERE supplier_id > 2000
UNION
SELECT company_id,
company_name
FROM companies
WHERE company_id > 1000
ORDER BY 1;
********************************************************************************
В этом запросе, имена столбцов в двух операторах SELECT различаются, поэтому более
разумно ссылаться на столбцы в ORDER BY по их положению в наборе результатов.
В этом примере мы отсортировали результаты по supplier_id / company_id в порядке
возрастания, как обозначено ORDER BY 1. Поля supplier_id / company_id находятся в
позиции № 1 в наборе результатов.
Пример более подробно.
Допустим у нас есть таблица suppliers с полями: supplier_id, supplier_name.
И таблица companies с полями: company_id, company_name.
Формируем SQL запрос с UNION:
********************************************************************************
SELECT supplier_id,
supplier_name
FROM suppliers
WHERE supplier_id > 2000
UNION
SELECT company_id, company_name
FROM companies
WHERE company_id > 1000
ORDER BY 1;
********************************************************************************
В результате мы получим:
- Во-первых, все записи с supplier_id, больше 2000 имеющие дубликаты
(например, 3000, 4000), появятся только один раз в наборе результатов,
поскольку запрос UNION удалил (не отобразит) повторяющиеся записи.
- Во-вторых, заголовки столбцов в наборе результатов называются supplier_id
и supplier_name. Это потому, что это имена столбцов, использованных в первом
операторе SELECT в UNION.
Мы можем присвоить псевдонимы столбцам следующим образом:
********************************************************************************
SELECT supplier_id AS ID_Value,
supplier_name AS Name_Value
FROM suppliers
WHERE supplier_id > 2000
UNION
SELECT company_id AS ID_Value,
company_name AS Name_Value
FROM companies
WHERE company_id > 1000
ORDER BY 1;
********************************************************************************
Теперь заголовки столбцов в результате выдачи будут иметь псевдонимы ID_Value для
первого столбца и Name_Value для второго столбца.