Главная Обратная связь Дисциплины:
Архитектура (936)
|
Приклади роботи команди SELECT
Для деяких прикладів буде використані дві таблиці: table1 і table2. Таблиця table1 створена в такий спосіб:
CREATE TABLE table1 (c1 int, c2 int, c3 int primary key identity) Аналогічно створена таблиця table2:
CREATE TABLE table2 (c1 int, c2 int, c3 int primary key identity) Вміст таблиць table1 і table2 представлено в табл. 1.
Табл. 1. Уміст таблиць table1 і table2
Приклад 1. Виконання найпростішої команди SELECT: SELECT 2+5 as EX_COL дасть наступний результат:
Приклад 2. Використання секцій FROM, ORDER BY і опцій секції SELECT.
У результаті виконання команди SELECT DISTINCT c1, c2 FROM table1
буде отриманий наступний набір рядків:
тобто двох однакових рядків у результуючій множині немає.
У результаті виконання команди SELECT DISTINCT TOP 4 c1, c2 FROM table1 будуть отримані тільки 1-і 4 рядка з множини рядків, що повертаються попередньою командою. Якщо ж виконати таку команду
SELECT TOP 2 WITH TIES c1, c2 FROM table1 ORDER BY c1
то результуюча множина рядків буде наступною:
незважаючи на те, що повинні були бути отримані тільки два 1-их рядки. Це відбувається тому, що використано опцію WITH TIES, застосування якої приводить до того, що вибираються всі рядки, у яких значення в стовпцях c1 і c2 збігаються зі значеннями 2-ого рядка. Приклад 3. Використання секцій INTO і WHERE.
При необхідності скопіювати частину рядків таблиці table1, що задовольняють деякій умові, у нову таблицю, наприклад table3, необхідно виконати наступну команду:
SELECT * INTO table3 FROM table1 WHERE c1 > 1 and c2 != 5 У результаті виконання цієї команди таблиця table3 (не повинна існувати перед виконанням команди) буде містити наступних 5 рядків:
Приклад 4. Вертикальні об'єднання.
Всі приклади вертикальних об'єднань розглянемо з використанням таблиць table1 і table2. INNER JOIN:
SELECT * from table1 t1 JOIN table2 t2 ON t1.c2 = t2.c2
Результат (спочатку стовпці table1, потім - table2):
LEFT JOIN:
SELECT * from table1 t1 LEFT JOIN table2 t2 ON t1.c2 = t2.c2
Результат (спочатку стовпці table1, потім - table2):
RIGHT JOIN:
SELECT * from table1 t1 RIGHT JOIN table2 t2 ON t1.c2 = t2.c2
Результат (спочатку стовпці table1, потім - table2):
FULL JOIN:
SELECT * from table1 t1 FULL JOIN table2 t2 ON t1.c2 = t2.c2
Результат (спочатку стовпці table1, потім - table2):
CROSS JOIN:
SELECT * from table1 CROSS JOIN table2 що еквівалентно
SELECT * from table1, table2 Результат (спочатку стовпці table1, потім - table2):
Використання оператора APPLY. Для демонстрації можливостей такого оператора об'єднання напишемо функцію, що повертає набір рядків з таблиці table1, значення стовпця c2 у яких збігається з аргументом функції:
/* Перевіряємо існування функції з ім'ям func1 */
IF EXISTS (SELECT name, type FROM sys.all_objects WHERE name = 'func1' AND type = 'FN') /* Якщо така функція існує, то видаляємо її
DROP FUNCTION func1 - Команда створення функції повинна бути 1-ою у пакеті команд, тому виконуємо - примусове завершення пакета за допомогою команди go GO /* Створюємо функцію, що повертає значення типу TABLE - таблицю з полями за назвою і типом, що збігаються з полями таблиці table1, що вставляє в поверта_ змінну @tt1 табличного типу всі рядки таблиці table1, значення стовпця c2 у яких збігається з аргументом @c2_val. */
CREATE FUNCTION func1(@c2_val int) RETURNS @tt1 TABLE(c1 int, c2 int, c3 int) AS BEGIN INSERT INTO @tt1 SELECT * FROM table1 WHERE c2 = @c2_val - Обов'язкова наявність ключового слова return
RETURN END GO
Тепер виконаємо команди SELECT з використанням оператора об'єднання APPLY. Спочатку - CROSS APPLY:
SELECT * FROM table1 AS t1 CROSS APPLY func1(t1.c2 + 1)
у результаті чого одержуємо:
Якби результати цієї команди потрібно було б перенести в таблицю, то це можна було б зробити, використовуючи вкладений запит SELECT, у такий спосіб:
SELECT * INTO cross_apply FROM (SELECT t1.*, t2.c1 AS cc1, t2.c2 AS cc2, t2.c3 AS cc3 FROM table1 AS t1 CROSS APPLY func1(t1.c2 + 1) AS t2) AS tt2
Слід зазначити, що складність написання вищерозглянутої команди полягає в тому, що в результаті знаходження об'єднання таблиці table1 і результатів роботи функції func1 виходить 3 пари полів з однаковими назвами, що не дозволяє записати результат виконання цього запиту в нову таблицю за допомогою секції INTO зовнішньої команди SELECT. Для вирішення конфлікту імен доводиться для кожного імені, що дублюється, описувати синонім у вкладеній команді SELECT. Тепер розглянемо приклад використання оператора об'єднання OUTER APPLY:
SELECT * FROM table1 AS t1 OUTER APPLY func1(t1.c2 + 1)
Результат виконання цієї команди буде наступним:
Приклад 5. Оператори PIVOT і UNPIVOT.
Розглянемо використання оператора PIVOT на наступному прикладі: нехай, необхідно написати таку команду SELECT, що для таблиці table1 поверне один рядок значень, що для діапазону значень стовпця c1 від 1 до 13 буде містити середнє (округлене) значення по стовпцю c2 для кожного присутнього в таблиці значення стовпця c1. NULL - у випадку, коли такого значення стовпця c1 у таблиці table1 немає.
SELECT 'AverC2' as C1_VAL, [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13]
|