Об'єднання UNION і UNION ALL в SQL - опис і приклади

  1. Що таке UNION і UNION ALL в SQL?
  2. Приклади використання union і union all

Прийшов час поговорити про об'єднання даних за коштами конструкції union і union all, так як це іноді буває дуже корисно, і без використання такої конструкції буває деколи не обійтися. Приклади писатимемо в СУБД MSSQL 2008, використовуючи мову SQL.

І почати хотілося б з того, що ми з Вами вже розглядали багато прикладів написання запитів на SQL, наприклад, оператор select мови SQL , або використання строкових функцій SQL , Також розглядали програмування як на plpgsql так і на transact-sql, наприклад, Як написати функцію на PL / pgSQL і Transact-sql - Табличні функції і тимчасові таблиці відповідно.

Я не просто так вказав перераховані вище статті, а вказав я їх, тому, що для більш кращого розуміння і засвоєння сьогоднішнього уроку, необхідно початкові знання (це сайт для початківців програмістів), які як раз Ви можете отримати з вищезгаданого матеріалу.

І так приступимо. І для початку давайте розглянемо, що ж це за оператори union і union all.

Що таке UNION і UNION ALL в SQL?

  • UNION - це оператор SQL для об'єднання результуючого набору даних декількох запитів, і даний оператор виводить тільки унікальні рядки в запитах, тобто наприклад, Ви поєднуєте два запити і в кожному з яких є однакові дані, іншими словами повністю ідентичні, і оператор union об'єднає їх в один рядок для того щоб не було дублів;
  • UNION ALL - це оператор SQL для об'єднання результуючого набору даних декількох запитів, а ось цей оператор, виведе вже абсолютно всі рядки, навіть дублі.

Необхідні умови для операторів union і union all

  1. Набір полів повинен бути однаковий у всіх запитах, тобто кількість полів в кожному запиті, який буде об'єднуватися за коштами конструкції union або union all, має бути однакове;
  2. Типи даних полів також повинні збігатися в кожному запиті, тобто наприклад, якщо Ви захочете написати один запит, в якому буде тип даних int а в другому запиті тип даних varchar то у Вас запит не виконається а вікно запиту виведе помилку;
  3. У разі сортування оператор order by можна вказати тільки після останнього запиту.

Тепер давайте поговоримо про те, в яких випадках нам може знадобитися використання цих операторів. Ну, наприклад, у Вас є кілька баз зі схожою структурою, кожна з яких створена, наприклад, для якого-небудь філії, а Вам необхідно об'єднати ці дані для надання звітності по всіх філіях керівництву і найпростіше як це можна зробити, це написати запити на SQL, кожен з яких буде звертатися до різних баз, і через конструкцію union або union all об'єднати їх. Також іноді буває необхідно об'єднати дані в одній базі таким чином, що звичайними об'єднаннями це не реалізувати і доводиться використовувати union. Чому я кажу «доводиться» та тому що дана конструкція значно збільшує час виконання запиту, якщо наприклад даних дуже багато, і зловживати нею не потрібно.

Досить теорії, переходимо до практики.

Примітка! Як вже говорилося, запити писатимемо в Management Studio для SQL Server 2008

Приклади використання union і union all

Для початку створимо дві прості таблиці test_table і test_table_2

CREATE TABLE [test_table] ([id] [bigint] IDENTITY (1,1) NOT NULL, [number] [numeric] (18, 0) NULL, [text] [varchar] (50) NULL, CONSTRAINT [PK_test_table] PRIMARY KEY CLUSTERED ([id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] GO SET ANSI_PADDING OFF GO --І друга таблиця CREATE TABLE [test_table_2] ([id] [bigint] IDENTITY (1,1) NOT NULL, [number] [numeric] (18, 0) NULL, [text] [varchar] (50) NULL, CONSTRAINT [PK_test_table_2] PRIMARY KEY CLUSTERED ([id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] GO SET ANSI_PADDING OFF GO

Вони однакові для прикладу, тільки різні назви. Я заповнив їх ось такими даними:

Тепер давайте напишемо запит, який об'єднає результуючі дані в одні, наприклад через union. Синтаксис дуже простий:

Запит 1 union запит 2 union запит 3 і т.д.

д

Ось запит:

select number, text from test_table union select number, text from test_table_2

Як Ви бачите, вивелося всього 5 рядків, так як у нас перший рядок в першому запиті і перший рядок у другому запиті однакові, тому вони об'єдналися.

Тепер давайте об'єднаємо через union all

Ось запит:

select number, text from test_table union all select number, text from test_table_2

Тут вже вивелися всі рядки, так як ми вказали union all.

А тепер давайте розглянемо, які можуть бути помилки навіть в цьому простому запиті. Наприклад, ми переплутали послідовність полів:

Наприклад, ми переплутали послідовність полів:

Або ми в першому запиті вказали додаткове поле, а в другому цього не зробили.

Або ми в першому запиті вказали додаткове поле, а в другому цього не зробили

Також, наприклад, при використанні order by:

Також, наприклад, при використанні order by:

Тут ми вказали сортування в кожному запиті, а потрібно було тільки в останньому, наприклад:

select number, text from test_table union all select number, text from test_table_2 order by number

І наостанок, хотів розповісти про одну хитрість, яку можна використовувати тоді коли, наприклад, все-таки необхідно вивести в одному запиті якесь поле, а в інших його немає або просто воно не потрібно, для цього можете написати ось такий запит:

select id, number, text from test_table union all select '', number, text from test_table_2

тобто як Ви бачите просто там, де має бути поле ставити порожньо і запит відмінно відпрацює, наприклад:

І ще один невеликий рада, так як запити при об'єднанні через union досить великі, то краще на їх основі створити уявлення (Views), в разі якщо такий запит Вам потрібно постійно, і вже до цього поданням звертатися кожен раз, коли потрібно, а навіщо потрібні уявлення ми з Вами вже розглядали ось тут - Що таке уявлення і навіщо вони потрібні .

Напевно, все, що я хотів розповісти про конструкцію union і union all мови SQL я розповів, якщо є питання по використанню цих операторів, задавайте їх у коментарях. Успіхів!

Що таке UNION і UNION ALL в SQL?
Що таке UNION і UNION ALL в SQL?