Пропозиція ORDER BY поради та хитрощі Oracle (продовження 1) - SQL програмування

TABLE

Ця пропозиція потрібна при запиті до ієрархічної вкладеної таблиці.

PARTITION

Запит обмежується вказаним розділом таблиці. Фактично, рядки витягуються лише з зазначеного розділу, а чи не зі всієї таблиці.

SUBPARTITION

Запит обмежується зазначеним підрозділом таблиці. Оскільки рядки витягуються лише із зазначеного підрозділу, а чи не з усієї таблиці, зменшується навантаження на канали вводу-вывода.

SAMPLE [BLOCK] [процент_для_зразка] [SEED (початкове_значення)

Ця пропозиція вказує, що записи будуть відібрані з випадкового набору рядків у результуючому наборі, зазначеного як відсоткова частка рядків або блоків, а не з таблиці. Пропозиція BLOCK змушує Oracle відбирати зразки за блоками, а не рядками. Параметр процент_для_зразка, який показує, яка частка рядків або блоків буде включена в зразок, може змінюватися в межах від 0.000001 до 99. Додаткова пропозиція SEED використовується для забезпечення обмеженої відтворюваності результатів. При вказівці початкового значення _значш Oracle спробує повертати при різних виконаннях запиту один і той же зразок. Початкове значення може змінюватися від 0 до 4294967295. Якщо пропозиція SEED опущена, то результуючий набір при кожному запиті буде різний. Відбір зразка можна використовувати лише у запитах до однієї таблиці.

JOIN

Результати набору з однієї або декількох таблиць об'єднуються в одному запиті. Детально описується нижче.

PARTITION ВY вираз [, …]

Визначається спеціальний тип запиту, що називається секціноване_зовнішнє_з'єднання, в якому стандартний синтаксисзовнішнього з'єднання розширюється шляхом застосування правого та лівого зовнішніх з'єднань до секціювання одного або декількох рядків, що вказуються за допомогою виразу. Цей запит особливо корисний при запитах до даних, розкиданих за конкретним виміром, оскільки він повертає рядки, які б інакше не потрапили в результуючий набір. За прикладами звертайтеся до підрозділу «Огасі» розділу «Пропозиція JOIN». Пропозиція PARTITION У можна використовувати на будь-якій стороні зовнішнього з'єднання, що аналогічно пропозиції UNION, застосованому до зовнішніх з'єднань кожного з розділів секційованого результуючого набору з таблицею на іншій стороні з'єднання. (Якщо ця пропозиція опущена, Oracle розглядає весь результуючий набір як один розділ.) Пропозицію PARTITION BY не можна використовувати з пропозицією FULL OUTER JOIN.

WHERE… [[START WITH значення] CONNECT BY [PRIOR] умова]

Пропозиція фільтрує записи, які потрапляють у результуючий набір. Платформа Oracle дозволяє використовувати у таблицях ієрархічну інформацію, фільтрацію якої можна здійснювати за допомогою пропозиції START WITH. Пропозиція START WITH вказує рядки, які виконуватимуть у результуючому наборі роль батьківських. Пропозиція CONNECT ВY визначає умову співвідношення між батьківськими рядками та їх рядками-нащадками. Ключове слово PRIOR використовується для вказівки батьківських рядків замість рядків-нащадків. В ієрархічних запитах псевдостовпець LEVEL використовується для вказівки кореневої точки (1), точок-первинних нащадків (2), точок-вторинних нащадків (3) і так далі. Також у ієрархічних запитах доступні такі псевдостовпці, як CONNECT BYISCYCLE та CONNECT ВYJSLEAF. Ієрархічні запити є взаємовиключними із пропозиціями ORDER BY та GROUP BY. Невикористовуйте ці пропозиції у запитах, що містять пропозиції START WITH або CONNECT BY. Ви можете сортувати записи однорангових нащадків однієї батьківської таблиці за допомогою пропозиції ORDER SIBLINGS BY.

ORDER [SIBLINGS] Y вираз для сортування

Результуючий набір запиту сортується у порядку, що визначається виразом для сортування. Цей вираз може бути іменами стовпців, їх псевдоніми або цілими числами, що вказують порядкове положення стовпців. Пропозиція ORDER SIBLINGS BY використовується при запитах до ієрархічних таблиць із пропозицією CONNECT BY. Пропозиція ORDER SIBLINGS BY змушує Oracle зберігати сортування, що визначається пропозицією CONNECT BY, і застосовувати її тільки до однорангових рядків (тобто рядків, що знаходяться на одному рівні ієрархії). Пропозиції NULLS FIRST та NULLS LAST вказують, що записи, що містять порожні значення, повинні ставитися або на початок або наприкінці відповідно.

FOR UP DA ТІ [OF [схема.] …

Рядки в результуючому наборі блокуються, так що інші користувачі не зможуть заблокувати або змінити їх, доки ви не завершите свою транзакцію. Пропозицію FOR UPDATE не можна використовувати в підзапитах, запитах, які використовують пропозиції DISTINCT або GROUP BY, або запитах, які використовують оператори для роботи з наборами даних або агрегатні функції. Рядки-нащадки в ієрархічній таблиці не блокуються при запиті до батьківських рядків. Ключове слово OF використовується для блокування лише вказаної таблиці або подання. В іншому випадку Oracle блокує всі таблиці та уявлення, зазначені у реченні FROM. При використанні пропозиції OF стовпці не мають особливого значення, але ви маєте використовувати реальні імена стовпців, а не псевдоніми.Пропозиції NOWAIT і WAIT змушують Oracle або повернути вам управління негайно (якщо блокування вже встановлено), або почекати перед поверненням управління ціле число секунд відповідно. Якщо не вказано ні пропозицію WAIT, ні NOWAIT, то Oracle чекає, поки рядки не стануть доступними.

На відміну від деяких інших платформ баз даних, Oracle не дозволяє використовувати інструкцію SELECT без пропозиції FROM. Наприклад, наступний запит буде неприпустимим.

SELECT 2+2;

Щоб обійти це обмеження, Oracle існує спеціальна таблиця під назвою dual. Кожного разу при виконанні запиту, який не витягує жодних даних з таблиць користувача, наприклад при виконанні обчислення, використовуйте синтаксис FROM dual. Усі наведені нижче запити є допустимими.

Реалізація інструкції SELECT у Oracle досить зрозуміла, якщо ви хочете отримати дані з таблиці. Наприклад, Oracle дозволяє використовувати іменовані запити. Іменований запит - це, по суті, псевдонім всього запиту, що дозволяє заощаджувати час при написанні інструкцій SELECT з безліччю підзапитів. Наприклад:

У цьому прикладі ми створюємо два іменованих підзапит - pub_costs і avg_costs, на які пізніше буде посилатися головний запит. Іменовані запити, по суті, аналогічні до запитів. Однак підзапити потрібно переписувати повністю при кожному їх використанні, а іменовані запити не потрібно переписувати.

Платформа Oracle дозволяє відбирати рядки з одного розділу секційованої таблиці (за допомогою пропозиції PARTITION) або отримувати лише статистичну вибірку рядків із результуючого набору у вигляді процентної частки рядків чи блоків. Для цього використовується пропозиція SAMPLE. Наприклад:

Ретроспективні запити(Flashback Query) - це можливість Oracle, яка дозволяє витягувати результуючі набори на певні моменти часу. Наприклад, ми можемо з'ясувати, яка зарплата була в будь-якого співробітника вчора, перш ніж до бази даних було внесено великі зміни.

Ще одне цікаве розширення стандартного формату запиту Oracle - це ієрархічний запит. Ієрархічний запит повертає результати запитів до ієрархічно побудованих таблиць у порядку, який ви визначите. Наприклад, наступний запит повертає імена співробітників, їхнє становище в ієрархії (яке відображається місцезнаходженням у стовпці org_chart), ID співробітника, ID менеджера та ID посади.

[CROSS] JOIN

З таблиць1 і таблиця2 витягуються всі записи. За змістом ця пропозиція ідентична пропозиції FROM таблиця1, таблиця2 без зазначення умов з'єднання пропозиції WHERE.

INNER JOIN

З таблиць 1 і 2 витягуються ті записи, котрим обох таблицях є значення, відповідні одне одному відповідно до умови з'єднання. Зверніть увагу, що пропозиція INNER JOIN за змістом аналогічна пропозиції FROM таблиця!, таблиця2 із зазначенням умов з'єднання у пропозиції FROM.

NATURAL

LEFT [OUTER] JOIN

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

SELECT j, jobid, e.lname FROM jobs]

У наведеному вище запиті пропозиція CONNECT Y визначає ієрархічневідношення значення emp_id як батьківського рядка дорівнює значенню mgr id у рядку-нащадці, а пропозиція START WITH вказує, з якого місця ієрархії має починатися результуючий набір.

Oracle підтримує наступні типи синтаксису пропозиції JOIN (за додатковою інформацією зверніться до розділу «Пропозиція JOIN»).

RIGHT [OUTER] JOIN

Виймаються всі записи з правої таблиці та відповідні записи з лівої таблиці. Пропозиція RIGHT JOIN – це не більше ніж LEFT JOIN, за винятком того, що додаткова таблиця знаходиться ліворуч.

FULL [OUTER] JOIN

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

ON умова з'єднання

USING (список_стовпців)

Відіграє роль альтернативи пропозиції ON. Замість опису умови з'єднання просто вкажіть ім'я стовпця (або кількох стовпців через кому), який існує в обох таблицях. Імена стовпців в обох таблицях повинні збігатися і не повинні містити як префікс ім'я таблиці або псевдонім. Наступні два запити дають однакові результати. Один з них написаний за допомогою USING, а в іншому умови з'єднання вказуються з використанням синтаксису ANSI.

Зауважте, що старий синтаксис Oracle використовує пропозицію WHERE, а зовнішні з'єднання описуються за допомогою знака (+). Синтаксис з'єднань стилю ANSI став доступний лише починаючи з Oracle 9i Release 1. Тому ви часто стикатиметеся у вже існуючому коді зі старим синтаксисом. Наприклад, наступний запит за змістом еквівалентнийнаведеному вище прикладу лівої зовнішньої сполуки.

Додаткова інформація на тему

Додаткові секрети використання пропозиції ORDER BY у базах даних на платформі MySQL

Деякі секрети використання пропозиції ORDER BY у базах даних на платформі Oracle

Деякі поради щодо використання пропозиції ORDER BY у базах даних на різних платформах

Деякі секрети використання пропозиції ORDER BY у базах даних на платформі MySQL