MySQL UNION
UNION
В MySQL оператор UNION используется для объединения результатов нескольких операторов SELECT в один набор результатов.
Характеристика по умолчанию для UNION - удалить дублирующиеся строки из результата. Ключевое слово DISTINCT, которое является необязательным, не оказывает никакого влияния, поскольку по умолчанию оно определяет удаление дублирующихся строк. Но если мы используем необязательное ключевое слово ALL, удаление дублирующихся строк не происходит, и результирующий набор включает все соответствующие строки из всех операторов SELECT.
Синтаксис:
ВЫБРАТЬ ... СОЮЗ [ВСЕ | DISTINCT] ВЫБРАТЬ ... [СОЮЗ [ВСЕ | DISTINCT] ВЫБРАТЬ ...]
Наглядная презентация оператора UNION
Оператор UNION возвращает результат обоих запросов после удаления повторяющихся строк.
Образцы таблиц
сотрудники:
job_history:
пример
Если мы хотим отобразить текущие и предыдущие сведения о заданиях всех сотрудников, можно использовать следующую инструкцию MySQL.
Select employee_id, job_id
FROM employees
UNION
Select employee_id,job_id
FROM job_history;
Пример вывода:
+ ------------- + ------------ + | employee_id | job_id | + ------------- + ------------ + | 100 | AD_PRES | | 101 | AD_VP | | 102 | AD_VP | | 103 | IT_PROG | | 104 | IT_PROG | | 105 | IT_PROG | | 106 | IT_PROG | | 107 | IT_PROG | | 108 | FI_MGR | | 109 | FI_ACCOUNT | | 110 | FI_ACCOUNT | | 111 | FI_ACCOUNT | | 112 | FI_ACCOUNT | | 113 | FI_ACCOUNT | | 114 | PU_MAN | | 115 | PU_CLERK | | 116 | PU_CLERK | | 117 | PU_CLERK | | 118 | PU_CLERK | | 119 | PU_CLERK | | 120 | ST_MAN | | 121 | ST_MAN | | 122 | ST_MAN | | 123 | ST_MAN | | 124 | ST_MAN | | 125 | ST_CLERK | | 126 | ST_CLERK | | 127 | ST_CLERK | | 128 | ST_CLERK | | 129 | ST_CLERK | | 130 | ST_CLERK | | 131 | ST_CLERK | | 132 | ST_CLERK | | 133 | ST_CLERK | | 134 | ST_CLERK | | 135 | ST_CLERK | | 136 | ST_CLERK | | 137 | ST_CLERK | | 138 | ST_CLERK | | 139 | ST_CLERK | | 140 | ST_CLERK | | 141 | ST_CLERK | | 142 | ST_CLERK | | 143 | ST_CLERK | | 144 | ST_CLERK | | 145 | SA_MAN | | 146 | SA_MAN | | 147 | SA_MAN | | 148 | SA_MAN | | 149 | SA_MAN | | 150 | SA_REP | | 151 | SA_REP | | 152 | SA_REP | | 153 | SA_REP | | 154 | SA_REP | | 155 | SA_REP | | 156 | SA_REP | | 157 | SA_REP | | 158 | SA_REP | | 159 | SA_REP | | 160 | SA_REP | | 161 | SA_REP | | 162 | SA_REP | | 163 | SA_REP | | 164 | SA_REP | | 165 | SA_REP | | 166 | SA_REP | | 167 | SA_REP | | 168 | SA_REP | | 169 | SA_REP | | 170 | SA_REP | | 171 | SA_REP | | 172 | SA_REP | | 173 | SA_REP | | 174 | SA_REP | | 175 | SA_REP | | 176 | SA_REP | | 177 | SA_REP | | 178 | SA_REP | | 179 | SA_REP | | 180 | SH_CLERK | | 181 | SH_CLERK | | 182 | SH_CLERK | | 183 | SH_CLERK | | 184 | SH_CLERK | | 185 | SH_CLERK | | 186 | SH_CLERK | | 187 | SH_CLERK | | 188 | SH_CLERK | | 189 | SH_CLERK | | 190 | SH_CLERK | | 191 | SH_CLERK | | 192 | SH_CLERK | | 193 | SH_CLERK | | 194 | SH_CLERK | | 195 | SH_CLERK | | 196 | SH_CLERK | | 197 | SH_CLERK | | 198 | SH_CLERK | | 199 | SH_CLERK | | 200 | AD_ASST | | 201 | MK_MAN | | 202 | MK_REP | | 203 | HR_REP | | 204 | PR_REP | | 205 | AC_MGR | | 206 | AC_ACCOUNT | | 102 | IT_PROG | | 101 | AC_ACCOUNT | | 101 | AC_MGR | | 201 | MK_REP | | 114 | ST_CLERK | | 122 | ST_CLERK | | 176 | SA_MAN | | 200 | AC_ACCOUNT | | 0 | | + ------------- + ------------ +
Наглядное представление результатов
Здесь на рисунке выше показано, что только сотрудники employee_id и job_id, окруженные красным прямоугольником, одинаковы в таблице employee и job_history, поэтому в выходных данных они встречаются один раз, а другие employee_id и job_id различны в обеих таблицах, поэтому они встречаются в каждой.
MySQL UNION ALL
Оператор UNION ALL не удаляет дубликаты выбранных строк и возвращает все строки.
Иллюстрированная презентация оператора UNION ALL
Оператор UNION ALL возвращает все строки обоих запросов, и устранение дублирования не происходит.
MySQL UNION против UNION ALL
В MySQL оператор UNION возвращает объединенный результат из нескольких инструкций SELECT в один набор результатов, но исключает дубликаты строк, где, поскольку оператор UNION ALL избегает удаления дубликатов выбранных строк и возвращает все строки.
Смотрите пример ниже.
пример
Если мы хотим отобразить текущие и предыдущие сведения о заданиях всех сотрудников, и они могут появляться более одного раза, можно использовать следующий оператор MySQL.
Select employee_id, job_id,department_id
FROM employees
UNION ALL
Select employee_id,job_id,department_id
FROM job_history;
Пример вывода:
+ ------------- + ------------ + --------------- + | employee_id | job_id | отдел_ид | + ------------- + ------------ + --------------- + | 100 | AD_PRES | 90 | | 101 | AD_VP | 90 | | 102 | AD_VP | 90 | | 103 | IT_PROG | 60 | | 104 | IT_PROG | 60 | | 105 | IT_PROG | 60 | | 106 | IT_PROG | 60 | | 107 | IT_PROG | 60 | | 108 | FI_MGR | 100 | | 109 | FI_ACCOUNT | 100 | | 110 | FI_ACCOUNT | 100 | | 111 | FI_ACCOUNT | 100 | | 112 | FI_ACCOUNT | 100 | | 113 | FI_ACCOUNT | 100 | | 114 | PU_MAN | 30 | | 115 | PU_CLERK | 30 | | 116 | PU_CLERK | 30 | | 117 | PU_CLERK | 30 | | 118 | PU_CLERK | 30 | | 119 | PU_CLERK | 30 | | 120 | ST_MAN | 50 | | 121 | ST_MAN | 50 | | 122 | ST_MAN | 50 | | 123 | ST_MAN | 50 | | 124 | ST_MAN | 50 | | 125 | ST_CLERK | 50 | | 126 | ST_CLERK | 50 | | 127 | ST_CLERK | 50 | | 128 | ST_CLERK | 50 | | 129 | ST_CLERK | 50 | | 130 | ST_CLERK | 50 | | 131 | ST_CLERK | 50 | | 132 | ST_CLERK | 50 | | 133 | ST_CLERK | 50 | | 134 | ST_CLERK | 50 | | 135 | ST_CLERK | 50 | | 136 | ST_CLERK | 50 | | 137 | ST_CLERK | 50 | | 138 | ST_CLERK | 50 | | 139 | ST_CLERK | 50 | | 140 | ST_CLERK | 50 | | 141 | ST_CLERK | 50 | | 142 | ST_CLERK | 50 | | 143 | ST_CLERK | 50 | | 144 | ST_CLERK | 50 | | 145 | SA_MAN | 80 | | 146 | SA_MAN | 80 | | 147 | SA_MAN | 80 | | 148 | SA_MAN | 80 | | 149 | SA_MAN | 80 | | 150 | SA_REP | 80 | | 151 | SA_REP | 80 | | 152 | SA_REP | 80 | | 153 | SA_REP | 80 | | 154 | SA_REP | 80 | | 155 | SA_REP | 80 | | 156 | SA_REP | 80 | | 157 | SA_REP | 80 | | 158 | SA_REP | 80 | | 159 | SA_REP | 80 | | 160 | SA_REP | 80 | | 161 | SA_REP | 80 | | 162 | SA_REP | 80 | | 163 | SA_REP | 80 | | 164 | SA_REP | 80 | | 165 | SA_REP | 80 | | 166 | SA_REP | 80 | | 167 | SA_REP | 80 | | 168 | SA_REP | 80 | | 169 | SA_REP | 80 | | 170 | SA_REP | 80 | | 171 | SA_REP | 80 | | 172 | SA_REP | 80 | | 173 | SA_REP | 80 | | 174 | SA_REP | 80 | | 175 | SA_REP | 80 | | 176 | SA_REP | 80 | | 177 | SA_REP | 80 | | 178 | SA_REP | 0 | | 179 | SA_REP | 80 | | 180 | SH_CLERK | 50 | | 181 | SH_CLERK | 50 | | 182 | SH_CLERK | 50 | | 183 | SH_CLERK | 50 | | 184 | SH_CLERK | 50 | | 185 | SH_CLERK | 50 | | 186 | SH_CLERK | 50 | | 187 | SH_CLERK | 50 | | 188 | SH_CLERK | 50 | | 189 | SH_CLERK | 50 | | 190 | SH_CLERK | 50 | | 191 | SH_CLERK | 50 | | 192 | SH_CLERK | 50 | | 193 | SH_CLERK | 50 | | 194 | SH_CLERK | 50 | | 195 | SH_CLERK | 50 | | 196 | SH_CLERK | 50 | | 197 | SH_CLERK | 50 | | 198 | SH_CLERK | 50 | | 199 | SH_CLERK | 50 | | 200 | AD_ASST | 10 | | 201 | MK_MAN | 20 | | 202 | MK_REP | 20 | | 203 | HR_REP | 40 | | 204 | PR_REP | 70 | | 205 | AC_MGR | 110 | | 206 | AC_ACCOUNT | 110 | | 102 | IT_PROG | 60 | | 101 | AC_ACCOUNT | 110 | | 101 | AC_MGR | 110 | | 201 | MK_REP | 20 | | 114 | ST_CLERK | 50 | | 122 | ST_CLERK | 50 | | 200 | AD_ASST | 90 | | 176 | SA_REP | 80 | | 176 | SA_MAN | 80 | | 200 | AC_ACCOUNT | 90 | | 0 | | 0 | + ------------- + ------------ + --------------- + 118 рядов в наборе (0,11 сек)
Наглядное представление результатов
Здесь на рисунке выше показано, что только employee_id и job_id, окруженные красным прямоугольником, совпадают в таблицах employee и job_history, и все они появились в наборе результатов. Здесь UNION ALL должны избегать устранения дублирующихся строк.
MySQL UNION DISTINCT
Предложение DISTINCT с UNION не производит ничего лишнего, как простой UNION. Из оператора UNION мы знаем, что все строки будут отображаться в обоих запросах, за исключением того, что повторяется один раз.пример
Если мы хотим отобразить текущие и предыдущие сведения о заданиях всех сотрудников, можно использовать следующую инструкцию MySQL.
SELECT DISTINCT employee_id, job_id
FROM employees
UNION
SELECT DISTINCT employee_id,job_id
FROM job_history;
Выход :
Результат будет таким же, как и у оператора UNION.
MySQL СОЮЗ ЗАКАЗАТЬ
Предложение ORDER BY с UNION размещает строки в наборе результатов в определенном порядке. По умолчанию порядок возрастает. ORDER BY используется только в самом конце оператора.пример
Если мы хотим отобразить текущие и предыдущие сведения о заданиях всех сотрудников, можно использовать следующую инструкцию MySQL.
SELECT employee_id, job_id
FROM employees
UNION
SELECT employee_id,job_id
FROM job_history
ORDER BY employee_id;
Результат будет таким же, как у оператора UNION.
Пример вывода:
+ ------------- + ------------ + | employee_id | job_id | + ------------- + ------------ + | 0 | | | 100 | AD_PRES | | 101 | AC_ACCOUNT | | 101 | AC_MGR | | 101 | AD_VP | ..... | 107 | IT_PROG | | 108 | FI_MGR | | 113 | FI_ACCOUNT | | 114 | PU_MAN | | 114 | ST_CLERK | ..... | 128 | ST_CLERK | | 129 | ST_CLERK | | 134 | ST_CLERK | | 135 | ST_CLERK | ..... | 149 | SA_MAN | | 150 | SA_REP | | 158 | SA_REP | | 159 | SA_REP | ..... | 176 | SA_REP | | 176 | SA_MAN | | 177 | SA_REP | | 200 | AC_ACCOUNT | | 200 | AD_ASST | | 201 | MK_REP | | 201 | MK_MAN | ..... | 204 | PR_REP | | 205 | AC_MGR | | 206 | AC_ACCOUNT | + ------------- + ------------ + 116 рядов в наборе (0,00 сек)
Предыдущий: MySQL базовый оператор выбора
Далее: MySQL Агрегатные функции и группировка Агрегатные функции и группировка
Новый контент: Composer: менеджер зависимостей для PHP , R программирования