Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Приклади роботи команди 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

table1 table2
с1 с2 с3 с1 с2 с3
 
 
 

 

Приклад 1.

Виконання найпростішої команди SELECT:

SELECT 2+5 as EX_COL

дасть наступний результат:

 

  EX_COL

 

Приклад 2.

Використання секцій FROM, ORDER BY і опцій секції SELECT.

 

У результаті виконання команди

SELECT DISTINCT c1, c2 FROM table1

 

буде отриманий наступний набір рядків:

c1 с2

 

тобто двох однакових рядків у результуючій множині немає.

 

У результаті виконання команди

SELECT DISTINCT TOP 4 c1, c2 FROM table1

будуть отримані тільки 1-і 4 рядка з множини рядків, що повертаються попередньою командою.

Якщо ж виконати таку команду

 

SELECT TOP 2 WITH TIES c1, c2 FROM table1 ORDER BY c1

 

то результуюча множина рядків буде наступною:

 

с1 с2

 

незважаючи на те, що повинні були бути отримані тільки два 1-их рядки. Це відбувається тому, що використано опцію WITH TIES, застосування якої приводить до того, що вибираються всі рядки, у яких значення в стовпцях c1 і c2 збігаються зі значеннями 2-ого рядка.



Приклад 3.

Використання секцій INTO і WHERE.

 

При необхідності скопіювати частину рядків таблиці table1, що задовольняють деякій умові, у нову таблицю, наприклад table3, необхідно виконати наступну команду:

 

SELECT * INTO table3 FROM table1 WHERE c1 > 1 and c2 != 5

У результаті виконання цієї команди таблиця table3 (не повинна існувати перед виконанням команди) буде містити наступних 5 рядків:

 

с1 с2 с3

 

Приклад 4.

Вертикальні об'єднання.

 

Всі приклади вертикальних об'єднань розглянемо з використанням таблиць table1 і table2. INNER JOIN:

 

SELECT * from table1 t1 JOIN table2 t2 ON t1.c2 = t2.c2

 

Результат (спочатку стовпці table1, потім - table2):

 

с1 с2 с3 с1 с2 с3

 



LEFT JOIN:

 

SELECT * from table1 t1 LEFT JOIN table2 t2 ON t1.c2 = t2.c2

 

Результат (спочатку стовпці table1, потім - table2):

 

с1 с2 с3 с1 с2 с3
NULL NULL NULL
NULL NULL NULL
NULL NULL NULL
NULL NULL NULL

RIGHT JOIN:

 

SELECT * from table1 t1 RIGHT JOIN table2 t2 ON t1.c2 = t2.c2

 

Результат (спочатку стовпці table1, потім - table2):

 

с1 с2 с3 с1 с2 с3
NULL NULL NULL
NULL NULL NULL

FULL JOIN:

 

SELECT * from table1 t1 FULL JOIN table2 t2 ON t1.c2 = t2.c2

 

Результат (спочатку стовпці table1, потім - table2):

с1 с2 с3 с1 с2 с3
NULL NULL NULL
NULL NULL NULL
NULL NULL NULL
NULL NULL NULL
NULL NULL NULL
NULL NULL NULL

CROSS JOIN:

 

SELECT * from table1 CROSS JOIN table2

що еквівалентно

 

SELECT * from table1, table2

Результат (спочатку стовпці table1, потім - table2):

 

с1 с2 с3 с1 с2 с3

 

Використання оператора 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)

 

у результаті чого одержуємо:

 

с1 с2 З3 с1 с2 с3

 

Якби результати цієї команди потрібно було б перенести в таблицю, то це можна було б зробити, використовуючи вкладений запит 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)

 

Результат виконання цієї команди буде наступним:

 

с1 с2 с3 с1 с2 с3
NULL NULL NULL
NULL NULL NULL
NULL NULL NULL
NULL NULL NULL

 

Приклад 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]


Просмотров 203

Эта страница нарушает авторские права

allrefrs.ru - 2020 год. Все права принадлежат их авторам!