logo
Лабы базы Данных / Базы данных / Введение в модель данных SQL

Возможности формулирования аналитических запросов

Аналитическими запросами к базе данных принято называть запросы, сводные (агрегатные) результаты которых вычисляются над детальными данными, хранящимися в таблицах базы данных. В этом смысле любой запрос на языке SQL, результат которого основан на вычислении агрегатных функций, можно назвать аналитическим. Характерная особенность аналитических запросов состоит в том, что, как правило, они применяются к большим по объему базам данных, и выполнение таких запросов вызывает существенные накладные расходы СУБД.

В этом курсе мы не будем подробно обсуждать возможности языка SQL, предназначенные для поддержки оперативной аналитической обработки баз данных (OLAP - on-line analytical processing). Рассмотрим только самые основные средства, опираясь на простые примеры. Для этих примеров предположим, что таблица EMP содержит следующий набор строк (покажем содержимое только тех столбцов, которые потребуются в примерах, причем для простоты будем считать, что в столбце EMP_DATE содержится не полная дата, а только год рождения служащего):

EMP

EMP_NO

DEPT_NO

EMP_BDATE

EMP_SAL

2440

1

1950

15000.00

2441

1

1950

16000.00

2442

1

1960

14000.00

2443

1

1960

19000.00

2444

2

1950

17000.00

2445

2

1950

16000.00

2446

2

1960

14000.00

2447

2

1960

20000.00

2448

3

1950

18000.00

2449

3

1950

13000.00

2450

3

1960

21000.00

2451

3

1960

22000.00

Представим себе, что для проведения анализа требуется узнать максимальный размер зарплаты на всем предприятии, максимальный размер зарплаты в каждом отделе и максимальный размер зарплаты сотрудников каждой возрастной категории каждого отдела. Если пользоваться стандартными средствами языка SQL, обсуждавшимися ранее в предложенном курсе, то для получения этих данных потребуется три запроса:

SELECT MAX (EMP_SAL) AS MAX_ENT_SAL

FROM EMP;

SELECT DEPT_NO, MAX (EMP_SAL) AS MAX_DEP_SAL

FROM EMP

GROUP BY DEPT_NO;

SELECT DEPT_NO, EMP_BDATE, MAX (EMP_SAL)

AS MAX_DEP_BDATE_SAL

FROM EMP

GROUP BY DEPT_NO, EMP_BDATE;

При выполнении запросов будут получены следующие результирующие таблицы:

MAX_ENT_SAL

22000.00

DEPT_NO

MAX_DEP_SAL

1

19000.00

2

20000.00

3

22000.00

DEPT_NO

EMP_BDATE

MAX_DEP_BDATE_SAL

1

1950

16000.00

1

1960

19000.00

2

1950

17000.00

2

1960

20000.00

3

1950

18000.00

3

1960

22000.00