Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мет_ОБД.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.92 Mб
Скачать

Into ім'я_таблиці

FROM ім'я_джерела_даних

WHERE умова пошуку

GROUP BY перелік_ колонок_що_впорядковуються

HAVING умова_пошуку

ORDER BY

COMPUTE вираз

FOR вираз

OPTION параметри_запиту

Рис. 1. Діаграма, що відображає зв'язки між створеними таблицями і

первинні ключі таблиць.

Слід зазначити, що:

  1. Обов'язковою частиною є тільки секція SELECT.

  2. Секції з SELECT до HAVING одного запиту можуть поєднуватися з аналогічними секціями інших запитів за допомогою операторів UNION, EXCEPT і INTERSECT.

  3. Секція WITH і оператори EXCEPT і INTERSECT є специфічними для MS SQL Server 2005.

Розглянемо деякі із секцій і операторів команди SELECT більш докладно, причому будемо використовувати наступні позначення:

  • [] - означає необов'язковість параметра;

  • {} - параметр, що припускає безліч можливих значень.

  • | - позначає або.

  • ключові слова пишуться з великої букви;

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

Секція WITH.

Секція WITH дозволяє описувати common table expressions (CTE), які по суті є поіменованими запитами SELECT (аналогічно поданням), до яких можна звертатися в наступній команді DML. Використання CTE припустиме, якщо рівень сумісності для БД виставлений у значення 90. Слід зазначити, що CTE може використовувати рекурсію, тобто команду SELECT, що звертається до самих CTE. У загальному виді секція WITH виглядає так:

WITH

ім'я_CTE [(перелік_імен_стовпців)]

AS

(перелік_запитів_SELECT)

[, і. т.д.]

Таким чином, у цій секції можна поєднувати декілька CTE. Перелік_запитів_SELECT є набором команд SELECT, об'єднаних яким-небудь із операторів EXCEPT, INTERCEPT або UNION [ALL] (у випадку нерекурсивного CTE). У випадку рекурсивного CTE Перелік_запитів_SELECT виглядає так:

Нерекурсивний_запит_SELECT_1

[

{EXCEPT | INTERSECT | UNION [ALL]}

Нерекурсивний_запит_SELECT_2

{EXCEPT | INTERSECT | UNION [ALL]}

Нерекурсивний_запит_SELECT_N

]

UNION ALL

Рекурсивний_запит_SELECT_1

[

Рекурсивний_запит_SELECT_2

UNION ALL

Рекурсивний_запит_SELECT_N

]

Слід зазначити, що кількість стовпців поєднуваних запитів повинна бути однаковою, а їхні типи даних - сумісні.

Створення CTE підкоряється наступним правилам:

  1. CTE може посилатися сама на себе або на раніше описані CTE, але не може посилатися на CTE, які ще не описані.

  2. Не можна використовувати секцію WITH в CTE.

  3. У запитах SELECT, які утворюють CTE, не можуть бути використані наступні секції:

    • COMPUTE [BY].

    • ORDER BY (крім випадку, коли використовується опція TOP).

    • INTO.

    • OPTION із вказівкою настроювань поводження запиту.

    • FOR XML.

    • FOR BROWSE.

  4. Якщо команда, що містить секцію WITH іде не 1-ою у пакеті команд, то попередня їй команда повинна завершуватися символом ;.

Для рекурсивних CTE існує ряд додаткових правил і обмежень:

  1. Секція FROM рекурсивних запитів повинна посилатися на ім'я CTE, до якого вони належать, тільки 1 раз.

  2. Наступні секції, оператори і конструкції не можуть використовуватися в запитах SELECT, які утворюють CTE:

    • Опції DISTINCT і TOP.

    • GROUP BY.

    • HAVING.

    • Оператори {LEFT | RIGHT | FULL} [OUTER] JOIN (INNER JOIN і CROSS JOIN- припустимі).

    • Вкладені запити SELECT.

    • Скалярні агрегаційнні функції.

  3. Всі стовпці, що повертаються рекурсивним CTE, мають властивість NULL.

  4. Подання, що містить рекурсивні CTE, не може бути використане для зміни даних у пов'язаних з ним таблицях.

  5. Якщо рекурсивний CTE міститься в команді SELECT, що описує курсор, то тип курсору може бути тільки STATIC або FAST_FORWARD. У противному випадку - тип курсору буде приведений до типу STATIC.

  6. У рекурсивному запиті повинна міститися умова зупинки, що перериває його виконання. У противному випадку виходить нескінченний цикл виконання рекурсивного запиту SELECT, що приводить до помилки.

Секція SELECT.

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

SELECT [ {ALL | DISTINCT} ]

[TOP вираження [PERCENT] [WITH TIES] ]

{

* |

[ {ім'я_таблиці | ім'я_подання | псевдонім_таблиці}.]* |

{

[ {ім'я_таблиці | ім'я_подання | псевдонім_таблиці}.]

{ім'я_стовпця | $IDENTITY | $ROWGUID} |

ім'я_стовпця_користув_типу [ {.|::} { {ім'я_властивості | ім'я_поля } |

ім'я_методу(аргументи) }] |

вираження

[ [AS] псевдонім_стовпця]

} |

псевдонім_стовпця = вираз

}

де:

  • ALL | DISTINCT - описує можливість (ALL) появи рядків, що дублюються, у результаті виконання запиту або їх відсутність (DISTINCT);

  • TOP вираз [PERCENT] [WITH TIES] - показує яка кількість рядків з результуючого набору буде отримана, причому, якщо зазначено ключове слово PERCENT, те вираз задає кількість відсотків рядків. WITH TIES показує, що будуть отримані всі рядки, значення стовпців, використовуваних у секції ORDER BY, у яких збігаються зі значеннями стовпців останнього одержуваного рядка. WITH TIES не може бути використане без ORDER BY. Слід зазначити, що впорядкування набору за допомогою ORDER BY впливає на те, які рядки будуть отримані за допомогою TOP;

  • Далі йде перелік обираних стовпців (виразів) - select_list, що може задаватися або за допомогою символу *, що означає всі стовпці, причому цьому символу може передувати ім'я таблиці або подання, якщо використовується кілька джерел вибірки даних, або за допомогою завдання переліку імен стовпців, що витягаються, перед якими може вказуватися ім'я таблиці або подання. Як ім'я стовпця може бути використані спеціальні ключові слова: $IDENTITY або $ROWGUID, які означають вибір значень стовпця з відповідними властивостями (Властивість IDENTITY може мати тільки один стовпець у таблиці). Для обираного стовпця або виразу може задаватися псевдонім, що буде використовуватися як ім'я для одержуваного стовпця значень у результуючій множині рядків. Також можна використовувати псевдоніми для імен таблиць, які задаються в секції FROM. Можуть бути використані типи даних common language runtime (CLR), а також їхні методи властивості й поля. Максимальна кількість виразів в select_list - 4096.

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

Секція INTO.

Використовуючи цю секцію можна скопіювати одержувані значення стовпців зі списку обираних стовпців секції SELECT у нову таблицю, задану своїм ім'ям (такої таблиці або подання існувати не повинно). Слід зазначити, що при такому копіюванні стовпці, що обчислюються (computed) в новій таблиці стануть звичайними. Команда SELECT із секцією INTO не може використовувати секцію COMPUTE.

Секція FROM.

Секція FROM показує з якого джерела(ел) даних будуть витягати рядки, що утворять результуючу множин. У загальному виді ця секція виглядає так:

FROM table_source, де table_source, максимальна кількість яких 256, може бути описаний так:

{

ім'я_табл_або_подання [ [as] псевдонім ]

[TABLESAMPLE [SYSTEM] (розмір_вибірки [ {PERCENT | ROWS }])]

[REPEATTABLE (ідентифікатор_вибірки)]

[WITH (список_опцій)] |

функція_що_повертає_набір_рядків [ [as] псевдонім ]

[(псевдоніми_стовпців)] |

функція_визначена_користувачем [ [as] псевдонім ]

[(псевдоніми_стовпців)] |

OPENXML (doc_handle int [in], шаблон_ідентиф_вузла nvarchar [in],

[прапори byte [in] ])

[WITH ({опис_схеми | ім'я_таблиці})] |

(вкладений_запит) [ [as] псевдонім ]

[(псевдоніми_стовпців)] |

{

table_source [{INNER | {LEFT | RIGHT | FULL} [OUTER] }]

[опції_об'єднання]

JOIN table_source ON умова_об'єднання |

table_source CROSS JOIN table_source |

table_source_ліва_частина {CROSS | OUTER} APPLY

table_source_права_частина

} |

table_source PIVOT агрегаційна_функція(ім'я_стовпця_обчисл)

FOR ім'я_стовпця_угруповання