Розуміння SQL

У ПЕРШИХ ГЛАВАХ, МИ ОБГОВОРЮВАЛИ різні способи якими запити можуть поміщатися один всередину іншого. Є інший спосіб об'єднання численних запитів - тобто формування в об'єднання. У цьому розділі ви навчитеся використовувати пропозицію UNION в SQL. UNION відрізняється від підзапитів тим, що в ньому жоден з двох (або більше) запитів не керується іншим запитом. Усі запити виконуються незалежно друг від друга, а висновок їх - об'єднується.

ОБ'ЄДНАННЯ Багаточисельних запитів в один

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

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

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

КОЛИ ВИ МОЖЕТЕ РОБИТИ ОБ'ЄДНАННЯ МІЖ ЗАПИТами?

Коли два (або більше) запити піддаються об'єднанню, їх стовпці виводу мають бути сумісні для об'єднання. Це означає, що кожен запит повинен вказувати однакову кількість стовпців і в тому ж порядку, що і перший, другий, третій, і так далі, і кожен повинен мати тип, сумісний з кожним.Значення сумісності типів – змінюється. ANSI стежить за цим дуже суворо і тому числові підлога повинні мати однаковий числовий тип і розмір, хоча деякі імена, які використовуються ANSI для цих типів є - синонімами. ( Дивіться Додаток B для подробиць про ANSI числові типи.) Крім того, символьні поля повинні мати однакове число символів ( значення призначеного номера, не обов'язково таке ж як номер, що використовується ).

Добре, що деякі SQL програми мають більшу гнучкість ніж це визначається ANSI. Типи не визначені ANSI, такі як DATA та BINARY, зазвичай повинні збігатися з іншими стовпцями такого ж нестандартного типу. Довжина рядка може стати проблемою. Більшість програм дозволяють стать змінної довжини, але вони не обов'язково будуть використовуватися з UNION. З іншого боку, деякі програми (і ANSI теж) вимагають, щоб символьні поля були точно рівної довжини. У цих питаннях ви повинні проконсультуватися з документацією вашої програми.

Інше обмеження на сумісність - це коли пусті значення (NULL) заборонені в будь-якому стовпці об'єднання, причому ці значення необхідно заборонити і для відповідних стовпців в інших запитах об'єднання. Порожні значення (NULL) заборонені з обмеженням NOT NULL, яке обговорюватиметься в Розділі 18. Крім того, ви не можете використовувати UNION у підзапитах, а також не можете використовувати агрегатні функції у пропозиції SELECT запиту об'єднання. ( Більшість програм нехтують цими обмеженнями. )

UNION І УСУНЕННЯ ДУБЛІКАТІВ

UNION автоматично виключатиме дублікати рядків з виводу. Це щось невластиве для SQL, так як поодинокі запити зазвичай містять DISTINCT щоб усувати дублікати. Наприклад запит, чий висновокпоказується в Малюнку 14.2, має подвійну комбінацію значень ( snum = 1001, city = London ), тому що ми не вказали, щоб SQL усунув дублікати. Однак, якщо ми використовуємо UNION у комбінації цього запиту з подібним до нього таблиці Продавців, то ця надмірна комбінація буде усунена. Малюнок 14.3 показує виведення наступного запиту. Ви можете отримати щось схоже (в деяких програмах SQL, використовуючи UNION ALL замість просто UNION, на кшталт цього:

ВИКОРИСТАННЯ РЯДКІВ І ВИРАЗІВ З UNION

ВИКОРИСТАННЯ UNION З ORDER BY

Досі, ми не застерігали, що дані численних запитів будуть виводитися в якомусь особливому порядку. Ми просто показували висновок спочатку з одного запиту та тоді з іншого. Звичайно, ви не можете покладатися на висновок, що приходить у довільному порядку. Ми якраз зробимо так, щоб цей спосіб для виконання прикладів був більш простим. Ви можете використовувати пропозицію ORDER BY щоб упорядкувати висновок з об'єднання, так само як це робиться в індивідуальних запитах. Давайте переглянемо наш останній приклад, щоб упорядкувати імена за допомогою їх порядкових номерів. Це може внести суперечність, таке як повторення імені Peel в останній команді, як ви зможете побачити з висновку, показаного в Рисунку 14.5. Поки ORDER BY використовується за замовчуванням, ми не повинні його вказувати. Ми можемо впорядкувати наш висновок за допомогою декількох полів, одне всередині іншого і вказати ASC або DESC для кожного, так само, як ми робили це для одиночних запитів. Зауважте, що номер 3 у пропозиції ORDER BY вказує, який стовпець із пропозиції SELECT буде впорядкований. Оскільки стовпці об'єднання - це стовпці виведення, вони мають імен, отже, мають визначатися за номером. Цей номер вказує на їх місце серед іншихстовпців виведення. (Дивіться розділ 7, що обговорює стовпці виводу.)

ЗОВНІШнє ОБ'ЄДНАННЯ

Тепер ви знаєте, як використовувати пропозицію UNION, яка дає можливість об'єднувати будь-яку кількість запитів в єдине тіло виведення. Якщо ви маєте ряд подібних таблиць - таблиць, що містять схожу інформацію, але що належить різним користувачам і що охоплює різні особливості, можливо - що об'єднання зможе забезпечити простий спосіб злиття та впорядкування висновку. Аналогічно, зовнішні об'єднання дають вам новий спосіб використання умов, не для виключення висновку, а для його маркування або обробки його частин, коли зустрічається умова, яка відрізняється від того, яка не виконується.

Цим закінчуються наші розділи про запити. Ви тепер маєте досить повне уявлення про пошук даних у SQL. Наступний крок повинен включати те, як значення вводяться в таблиці та як таблиці створюються із самого початку. Як ви побачите, запити іноді використовуються всередині інших типів команд, так само добре, як і самі по собі.