Об'єднання UNION і UNION ALL в SQL - опис і приклади
Прийшов час поговорити про об'єднання даних за коштами конструкції 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
- Набір полів повинен бути однаковий у всіх запитах, тобто кількість полів в кожному запиті, який буде об'єднуватися за коштами конструкції union або union all, має бути однакове;
- Типи даних полів також повинні збігатися в кожному запиті, тобто наприклад, якщо Ви захочете написати один запит, в якому буде тип даних int а в другому запиті тип даних varchar то у Вас запит не виконається а вікно запиту виведе помилку;
- У разі сортування оператор 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:
Тут ми вказали сортування в кожному запиті, а потрібно було тільки в останньому, наприклад:
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?