Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Посібник Мова SQL кредитно-модульний.doc
Скачиваний:
35
Добавлен:
01.05.2015
Размер:
1.25 Mб
Скачать

Підзапити з операторами порівняння

В операторах порівняння, які використовуються з підзапитами, дозволяється застосовувати ключові слова ALLабоANY. Ключове словоSOME у стандарті SQL-92 уважається еквівалентомANY. Підзапити в операторах порівняння повертають нуль або більше значень і можуть містити в собі конструкціїGROUP BYабоHAVING. Ці підзапити можна перевизначити за допомогою ключового словаEXISTS. Ключові словаALLіANY порівнюють скалярне значення з набором значень одного стовпця. Ключове словоALLзастосовується до всіх значень, а ключове словоANY- як мінімум до одному. У наступному прикладі ключове словоANYвикористовується з оператором порівняння ’більше’ (>):

USE Pubs

SELECT Title

FROM Titles

WHERE Advance > ANY

(

SELECT Advance

FROM Publishers INNER JOIN Titles

ON Titles. Pub_id = Publisher. Pub_id

AND Pub_name = ' Algodata Infosystems '

)

Цей оператор знаходить видання, які авансовані сумою, що перевищує мінімальну суму авансу, сплаченого Algodata Infosystems(у цьому випадку він становить $5 000). КонструкціяWHEREу зовнішньому операторіSELECTмістить підзапит, за допомогою з'єднання який витягає суми авансу дляAlgodata Infosystems. Після цього мінімальна сума авансу використовується для визначення видань, які необхідно витягти з таблиціTitles.

Підзапити із ключовими словами exists і not exists

Коли підзапит містить ключове слово EXISTS, він функціонує як перевірка наявності тієї або іншої сутності. КонструкціяWHEREзовнішнього запиту перевіряє, є чи рядки, які повертає підзапит. Цей підзапит насправді не видає ніяких даних, замість цього він повертає значенняTRUEабоFALSE. У наступному прикладі конструкціяWHERE із зовнішнього оператораSELECT містить підзапит і використовує ключове словоEXISTS:

USE Pubs

SELECT Pub_name

FROM Publishers

WHERE EXISTS

(

SELECT * FROM Titles

WHERE Titles. Pub_id = Publishers. Pub_id

AND Type = 'business'

)

Щоб визначити результат цього запиту, необхідно по черзі розглянути назву кожного видавництва. У цьому випадку першим буде видавництво Algodata Infosystemsз ідентифікаційним номером 1389. Чи є в таблиціTitlesрядки, значення поляPub_idяким дорівнює 1 389, а тип -business? Якщо так, тоAlgodata Infosystemsповинне бути серед обраних значень. Цей процес повторюється для кожної назви видавництва. Ключові словаNOT EXISTS працюють аналогічноEXISTSза винятком того, що умова конструкціїWHERE, де використовуєтьсяNOT EXISTS, виконується, коли підзапит не повертає жодного рядка.

Узагальнення даних

В Transact-SQL входять кілька елементів, що дозволяють генерувати прості зведені звіти. Для цього застосовують оператори CUBEабоROLLUP, які є частиною конструкціїGROUP BYоператора SELECT. Крім того, можна використати операториCOMPUTEіCOMPUTE BY, які також пов'язані з конструкцієюGROUP BY. ОператориCOMPUTEіCOMPUTE BYпідтримуються заради зворотної сумісності.

Узагальнення даних за допомогою оператора cube

Оператор CUBE генерує результуючий набір у вигляді багатомірного куба - розширення фактичних даних або даних, що реєструють окремі події. Таке розширення засноване на стовпцях, які хоче проаналізувати користувач. Стовпці називаються вимірами. Куб являє собою результуючий набір, що містить зведені дані із всіх можливих комбінацій вимірів. У наступному операторі SELECTу конструкціїGROUP BYвикористаний операторCUBE:

USE Pubs

SELECT SUBSTRING(Title, 1, 65) AS Title,

SUM(qty) AS 'Quantity'

FROM Sales INNER JOIN Titles

ON Sales.Title_id = Titles.Title_id

GROUP BY Title

WITH CUBE

ORDER BY Title

Оператор SELECT відповідає відношенню один до багатьохміж книгами й кількістю проданих екземплярів кожної книги. За допомогою оператораCUBEвін повертає додатковий рядок. Вона містить порожнє значення в стовпціTitleрезультуючого набору й представляє всі значення стовпцяTitleтаблиціTitles. Результуючий набір повертає значення кількості проданих екземплярів кожної книги й сумарну кількість проданих екземплярів всіх книг. У цьому випадку операториCUBE і ROLLUPповертають той самий результат.