Використання директиви GROUP BY

Директива GROUP BY дозволяє розділити таблицю на групи рядків так, щоб в рядках кожної групи містилися однакові значення в певному стовпці. Повторення кожного окремого значення поміщаються в одну групу. Подібна угруповання дозволяє застосувати одні й ті ж функції до груп рядків.

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

 

SELECT column_l,..., соlumn_n
FROM table_name
GROUP BY column_name_l,..., column_name_n

Директива GROUP BY дозволяє сортувати значення стовпців в порядку зростання (це стандартний спосіб сортування), а потім перерахувати тільки унікальні значення стовпців.

На відміну від директиви ORDER BY, директива GROUP BY видає в результаті список унікальних значень стовпців (тобто ці значення не повторюються). Подібність між цими директивами полягає в тому, що обидві вони за умовчанням упорядковують значення стовпців за зростанням.

У наступному прикладі виконується угрупування рядків по стовпцю Department. Спочатку значення з цього стовпчика сортуються в порядку зростання, а потім перераховуються без повторень. Як бачите, мета директиви GROUP BY оператора SELECT полягає в тому, щоб сформувати групи рядків для їх подальшої обробки іншими директивами.

 

SELECT Department, "HeadCount" = count (*)
FROM Employee
GROUP BY Department

Крім того, можна вибрати певні групи за допомогою директиви HAVING, яка дозволяє порівняти деяка властивість групи з константою. Якщо група задовольняє умові (який представляє собою логічне вираження) з директиви HAVING, то вона включається в результати запиту. Синтаксис оператора SELECT з директивою HAVING виглядає наступним чином.

 

SELECT column_1, …, соlum _ n
FROM table _ name
GROUP BY column _ name
HAVING expression

Директива HAVING використовується для відбору груп, які будуть відображені в результаті виконання запиту. Розглянемо приклад використання цієї директиви.

 

SELECT Department, " HeadCount " = count (*)
FROM Employee
GROUP BY Department
HAVING count(*) = 1

44.Об'єднання результатів запиту за допомогою директиви UNION

Для об'єднання результатів двох і більше запитів використовується директива UNION.

Вона дозволяє неявно видалити із запитів повторювані рядки.

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

Це означає, що у них має бути однакова кількість стовпців, а також загальний стовпець, що міститься в кожній таблиці.

Директиву UNION можна використовувати також при визначенні виду.
Синтаксис запиту, що містить директиву UNION, виглядає наступним чином.

SELECT column_name_1 ,..., соlumn_namе_n
FROM table_name_1 ,..., table_name_n
WHERE column_name comparison_operator value
[GROUP BY...]
[HAVING...]
UNION
SELECT column_name_1 ,..., column_name_n
FROM table_name_1 ,..., table_name_n
WHERE column_name comparison_operator value
[GROUP BY...]
[HAVING...]
[ORDER BY...]
[COMPUTE...]

У наступному прикладі ідентифікаційні номери, які є загальними для обох таблиць, відображаються за допомогою двох операторів вибору, пов'язаних директивою UNION. Директива ORDER BY розташована після останнього запиту і призначена для впорядкування остаточних результатів. Зауважимо, що ця директива завжди йде за останнім оператором SELECT. Нагадаю, що директива UNION неявно видаляє повторювані рядки.

 

SELECT Badge FROM Employee
UNION
SELECT Badge FROM Pays
ORDER BY Badge

Badge

1051
1234
1834
1997
3211
4411
5522
5555
6732
7773

(10 row(s) affected)

У наступному прикладі використовуються ті ж запити, тільки до директиви UNION додано ключове слово ALL. Завдяки цьому зберігаються повторювані елементи з шпальти Badge, а також повторювані рядки з обох таблиць.

SELECT Badge FROM Employee
UNION ALL
SELECT BADGE FROMPays
ORDER BY Badge

Badge

1051
1051
1234
1234
1834
1834
1997
1997

 

(8 row(s) affected)

Якщо типи даних, зазначені у запиті для одного з двох стовпців, не є сумісними - запит повертає помилку.

Директиву UNION можна використовувати в запитах для об'єднання рядків з двох сумісних таблиць і приміщення результатів в третю таблицю. Щоб проілюструвати таке об'єднання, результати якого зберігаються в постійній таблиці, створимо нову таблицю Employee2, що має такі ж типи даних, як і таблиця Employee. У нову таблицю вставлені перші кілька рядків.

CREATE TABLE Employee2
(Name CHAR(20), Department CHAR(20), Badge INT)
GO

INSERT INTO Eroployee2 VALUES ('Rod Gilbert', 'SALES', 3339)
GO

INSERT INTO Employee2 VALUES ('JeanRatele', 'SALES', 5551)
GO

INSERT INTO EMPLOYEE2 VALUES ('Eddie Giacomin', 'SALES', 8888)

Тепер в обох таблицях містяться записи про співробітників. Якщо використовувати директиву UNION для об'єднання операторів SELECT і застосувати команду INSERT INTO, то отримані рядки збережуться в нової, третьої, таблиці.

У операторі SELECT, в якому вказується таблиця Employee, для вибору рядків, у яких у стовпці DEPARTMENT міститься елемент SALES, використовується директива WHERE. Всі три рядки таблиці Employee2 містять записи про співробітників відділу SALES, тому тут директива WHERE не потрібна. Результати об'єднання поміщаються в таблицю Employees.

CREATE TABLE Employee3
(Name CHAR(20), Department CHAR(20), Badge INT)
GO

INSERT INTO Employee3
SELECT * FROM Employee WHERE Department = 'SALES'
UNION
SELECT * FROM Employee2

(8 row(s) affected)

SELECT * FROM Employee3

Name Department Badge

Eddie Giacomin SALES 8888
Jean Ratele SALES 5551
Rod Gilbert SALES 3339
Sally Springer Sales 9998
Stan Humphries Jr SALES 3211
Bob Smith ALES 1834
Fred Sanders SALES 1051
Gertie Humphries SALES 3211

(8 row(s) affected)

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

Це може знадобитися, наприклад, якщо працюють у різних офісах співробітники протягом дня додають нові рядки до таблиць з однаковими стовпцями.В кінці робочого дня можна використовувати набір операторів SELECT разом з директивою UNION для додавання окремих таблиць до основної таблиці, що знаходиться в центральному офісі. Після копіювання рядків в основну таблицю можна видалити ці рядки з вихідних таблиць за допомогою оператора DELETE FROM, що не містить директиви WHERE, або оператора TRUNCATE (про цих операторах говорилося на початку глави).

Можна об'єднати до 16 операторів SELECT, помістивши між ними додаткові директиви UNION. Для визначення порядку директив UNION використовуються круглі дужки. У цьому випадку спочатку виконуються оператори SELECT, укладені в дужки, а потім - ті, які знаходяться за дужками. Якщо у всіх директивах UNION використовується ключове слово ALL, то дужки взагалі не потрібні. Не потрібні вони і в тому випадку, якщо в жодній директиві UNION не використовується ключове слово ALL.

У наступному прикладі за допомогою директиви UNION об'єднуються три таблиці. Для першої таблиці використовується ключове слово IN, яке дозволяє визначити різні способи написання відділу SALES. Для другої таблиці не використовується директива WHERE, і тому вибираються всі рядки. Для третьої таблиці зазначений тільки один варіант написання назви відділу (регістрозалежний), передбачається, що в SQL Server встановлений бінарний порядок сортування.

У даному випадку для визначення порядку об'єднань дужки не потрібні, так як ні в одній директиві UNION не використовується ключове слово ALL. Отримані в результаті рядки упорядковуються по стовпцях Badge і Name за допомогою директиви ORDER BY, яка може йти тільки за останнім оператором SELECT.

SELECT Name, Badge
FROM Employee
WHERE DEPARTMENT IN ('SALES.', 'Sales', 'sales')
UNION
SELECT Name,Badge
FROM Employee2
UNION
SELECT Name, Badge
FROM Employee3
WHERE DEPARTMENT ='Sales'
ORDER BY Name,Badge

Name Badge

Bob Smith 1834
Eddie Giacomin 8888
Fred Sanders 1051
Gertie Humphries 3211
Jean Ratelle 5551
Rod Gilbert 3339
Sally Springer 9998
Stan Humphries Jr 3211

(8 row(s) affected)

45.Використання строкових функцій

46.Використання числових функцій


Дата добавления: 2015-12-17; просмотров: 14; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!