Главная Программы Учебное пособие Практикум Дополнительно
    Введение
  Глава 1
  Глава 2
  Глава 3
  Глава 4
  Глава 5
  Глава 6
  Глава 7
  Глава 8
  Задания
  Литература
  Приложение 1
  Приложение 2
  Приложение 3

Практикум

Глава 4. Выборка данных из базы данных

 

4.6. Группировка строк в запросе

По умолчанию все строки таблицы рассматриваются как одна группа.  Для разбиения таблицы на меньшие группы строк используется предложение GROUP BY команды SELECT. Синтаксис:

SELECT

{столбец, групповая_функция}

FROM

Таблица

[WHERE

условие]

[GROUP BY

выражение_группирования]

[ORDER BY

{Столбец, выражение} [ASC|DESC]];

где

выражение_группирования

определяет столбец, по значениям которого группируются строки.

Для получения сводной информации по каждой группе можно использовать групповые функции. Если в предложение SELECT включена групповая функция, получить одновременно отдельные результаты можно только в случае, если в предложении GROUP BY задан отдельный столбец.  Если список столбцов отсутствует, выдается сообщение об ошибке.

Предложение WHERE позволяет исключить некоторые строки до начала разбиения на группы.

Если в списке SELECT заданы столбцы одновременно с групповыми функциями, их список должен использоваться и в предложении GROUP BYВ предложении GROUP BY нельзя использовать позиционные обозначения или псевдонимы столбцов.

По умолчанию строки сортируются в порядке возрастания в соответствии со списком GROUP BY.  Изменить порядок сортировки можно с помощью предложения ORDER BY.

Пример. Вывод номера, фамилии и номера отдела сотрудников, работающих в отделе 41.

 

 

ID

LAST_NAME

DEPATMENT

2

Ngao

41

6

Urguhart

41

16

Maduro

41

17

Smith

41

 

Пример. Вывод номера отдела и количества сотрудников, работающих в отделе 41.

 

 

DEPT_ID

NUMBER

41

4

 

Пример. Вывод всех возможных кредитных рейтингов и количества клиентов в каждой категории. Столбец должен иметь заголовок “# Cust”.

 

 

CREDIT_RATING

# CUST

EXELLENT

9

GOOD

3

POOR

3

 

Пример. Вывод всех должностей, кроме вице-президента, и соответствующей общей заработной платы за месяц.  Список сортируется по общей заработной плате.

 

 

TITLE

PAYROLL

President

2500

Warehouse

6157

Sales

7380

Stock

9490

 

Столбец, заданный в предложении GROUP BY, не обязательно должен быть задан в предложении SELECT. С другой стороны, если столбец из предложения GROUP BY входит в список SELECT, результат имеет больше смысла.

Если в одной и той же команде SELECT указаны как отдельные элементы данных, так и групповые функции, но пропущено предложение GROUP BY, описывающее эти отдельные элементы, выдается сообщение об ошибке.

Пример.

 

Для исправления этой ошибки следует добавить предложение GROUP BY.

 

Группы внутри групп

Сводные результаты по группам и подгруппам можно получить путем указания более чем одного столбца в предложении GROUP BY. В следующем примере количество людей подсчитывается не только по отделам, но и по должностям.  Порядок сортировки, используемый по умолчанию, определяется порядком столбцов в предложении GROUP BY.

Пример. Вывод количества служащих по должностям внутри отделов.

 

 

DEPT_ID TITLE COUNT(*)
   
34 Sales Representative 1
34 Stock Clerk 1
35 Sales Representative 1
41 Stock Clerk 2
41 VP, Operations 1
   

 

Предложение HAVING

Предложение WHERE для исключения групп не используется.  Для исключения целиком некоторых групп следует пользоваться предложением HAVING.

Пример. Вывод номера отдела и средней заработной платы для отделов, где средняя заработная плата превышает 2000.

 

 

Вместо этого для ограничения количества групп следует использовать предложение HAVING.

 

 

DEPT_ID

AVG(SALARY)

50

2025

 

Предложение HAVING задает условие отбора групп для вывода. Следовательно, на группы накладывается дальнейшее ограничение, основанное на сводной информации. Синтаксис:

SELECT {столбец, групповая_функция}
FROM Таблица
[WHERE условие]
[GROUP BY выражение_группирования]
[HAVING условие_группы]
[ORDER BY {Столбец, выражение} [ASC|DESC]];

 

где

HAVING

Вывод конкретных групп.

Условие_группы

Включает в выходной результат только те группы, для которых заданное условие истинно (TRUE).

 

Если используется предложение HAVING, сервер баз данных, как правило, выполняет следующие действия.

  • Группирует строки.
  • Применяет групповую функцию.
  • Производит вывод групп, удовлетворяющих условию предложения HAVING.

Предложение HAVING может предшествовать предложению GROUP BY, но более логично ставить предложение GROUP BY первым. Образование групп и вычисление групповых функций происходят до того, как к группам из списка SELECT применяется ограничение, заданное в предложении HAVING.

Пример. Вывод должности и общей заработной платы для всех должностей с заработной платой более 5000 в месяц, кроме вице-президентов. Выходные строки сортируются по заработной плате.

 

 

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

  • Если команда содержит предложение WHERE, то прежде всего отбираются строки, удовлетворяющие этому предложению.
  • Выявляются группы, заданные предложением GROUP BY.
  • Исключаются группы, не удовлетворяющие критерию, указанному в предложении HAVING.

Предложение GROUP BY можно использовать без указания групповой функции в списке SELECT. Если отбор строк производится по результатам групповой функции, то использование как предложения GROUP BY, так и предложения HAVING обязательно.

 

Для закрепления материала рекомендуется выполнить Практическое занятие 4 .

 

4.7. Выборка данных из нескольких таблиц

Если требуется получить данные из более, чем из одной таблицы базы данных, используется операция соединения, определенная в реляционной алгебре.  Строки одной таблицы соединяются со строками другой согласно общим значениям в соответствующих столбцах – первичных и внешних ключей.

 

Рисунок 7. Соединение таблиц

 

СУБД, как правило, поддерживает следующие способы соединения:

  • эквисоединение;
  • не-эквисоединение;
  • внешнее соединение;
  • соединение таблицы с собой (рекурсия).

При соединении нескольких таблиц возможен случай, когда в качестве результата запроса можно получить Декартово произведение, которое образуется, если:

  • опущено условие соединения;
  • условие соединения недействительно;
  • все строки первой таблицы соединяются со всеми строками второй таблицы.

Во избежание получения Декартова произведения в предложение WHERE всегда необходимо включать допустимое условие соединения.

 

Простой запрос с соединением

Синтаксис:

SELECT таблица.столбец, таблица.столбец
FROM таблица1, таблица2;
WHERE таблица1.столбец1 = таблица2.столбец2

где:

таблица.столбец

таблица и столбец, из которых производится выборка данных.

таблица1.столбец1=таблица2.столбец2

условие, соединяющее таблицы (или задающее их связь).

 

В предложении WHERE указывается допустимое для этого вида соединения логическое условие. Указывать имя таблицы в предложении SELECT необязательно, однако читать предложение легче, если каждому имени столбца предшествует имя таблицы.  Если столбцы с одинаковыми именами имеются более, чем в одной таблице, имя таблицы перед именем столбца обязательно.

 

Эквисоединение

Этот вид соединения возникает, когда в качестве условия для соединения указывается точное равенство значений одного столбца значениям другого.  Часто эти столбцы являются компонентами первичного и внешнего ключа.

Пример. Вывести фамилию служащего, номер и название отдела.

 

 

LAST_NAME

DEPT_ID

NAME

Velasquez

50

Administration

Ngao

41

Operations

Nagayama

31

Sales

Quick-To-See

10

Finance

Ropeburn

50

Administration

Urquhart

41

Operations

Menchu

42

Operations

Biri

43

Operations

Catchpole

44

Operations

Havel

45

Operations

Magee

31

Sales

Giljum

32

Sales

Sebeghi

33

Sales

 

Строки двух таблиц комбинируются и в результат включаются лишь те, у которых значения столбцов S_EMP.DEPT_ID и S_DEPT.ID равны.

 

Псевдонимы таблиц

Для различения одноименных столбцов из разных таблиц используются префиксы в виде имен таблиц.  Использование префиксов в некоторых случаях увеличивает производительность запроса. Хотя одноименные столбцы из разных таблиц можно различать по их псевдонимам, однако использование имен таблиц становится обязательным, если имена столбцов в них совпадают.  В случае, если имена таблиц очень громоздки, рекомендуется использовать вместо них псевдонимы (алиасы) таблиц.  При этом необходимо следовать следующим правилам:

  • перед именами столбцов рекомендуется указывать псевдонимы таблиц;
  • псевдонимы таблиц действительны только для данной команды SELECT;
  • если псевдоним таблицы создан, перед ссылкой на столбец следует указывать его, а не имя таблицы.

Пример. Вывод наименования клиента, номера региона и названия региона. Вместе с псевдонимами столбцов используются и псевдонимы таблиц для упрощения ссылок на них.

 

 

Псевдонимы таблиц могут содержать до тридцати символов, но чем они короче, тем лучше.  Действие псевдонима таблицы распространяется лишь на текущую команду SELECT.  Использование псевдонимов таблиц позволяет уменьшить объем команды SQL.

 

Дополнительные условия поиска

Помимо условий соединения в предложении WHERE можно задавать и другие дополнительные критерии для ограничения получаемых в запросе строк.  Поскольку условие соединения необходимо для исключения Декартова произведения, дополнительное условие добавляется с помощью логического оператора AND.

Пример. Вывод фамилии, номера отдела и названия отдела для сотрудника по фамилии “Menchu”.

 

 

Пример. Вывод фамилии, названия региона и процента комиссионных всех служащих, получающих комиссионные.

 

 

LAST_NAME NAME COMMISSION_PCT
Magee North America 10
Giljum Couth America 12.5
Sedeghi Africa / Middle East 10
Nguyen Asia 15
Dumas Europe 17.5

 

Пример. Вывод номер, название отдела и фамилии служащих для отдела 42.

Не-эквисоединения

Не-эквисоединение возникает в случае, если ни один столбец одной таблицы не соответствует точно столбцу другой таблицы.  Условие соединения содержит оператор, не являющийся оператором равенства (=).

Пример.  Вычисления категории служащего по заработной плате.  Заработная плата должна быть между нижним и верхним значениями диапазона зарплат.

 

 

NAME JOB SAL S.GRADE
SMITH CLERK 800 1
ADAMS CLERK 1,100.00 1
JAMES CLERK 950 1
WARD SALESMAN 1,250.00 2
MARTIN SALESMAN 1,250.00 2
MILLER CLERK 1,300.00 2
ALLEN SALESMAN 1,600.00 3
TURNER SALESMAN 1,500.00 3
JONES MANAGER 2,975.00 4
BLAKE MANAGER 2,850.00 4
CLARK MANAGER 2,450.00 4
SCOTT ANALYST 3,000.00 4
FORD ANALYST 3,000.00 4
KING PRESIDENT 5,000.00 5
14 rows selected

 

Здесь могут быть использованы и другие операторы, (например, <= и >=), но самый простой способ – оператор BETWEEN.

 

Внешние соединения

Внешнее соединение используется для выборки строк, не удовлетворяющих обычным условиям соединения. Оператором внешнего соединения является знак плюс, заключенный в скобки “(+)”.  Этот оператор указывается с той стороны, где нет значения, по которому можно было бы произвести соединение. Синтаксис:

 

SELECT таблица.столбец, таблица.столбец
FROM таблица1, таблица2;
WHERE таблица1.столбец1 = таблица2.столбец2(+)

где:

таблица1.столбец1=таблица2.столбец2

условие, соединяющее таблицы (или задающее их отношение).

(+)

Символ внешнего соединения; может использоваться на любой стороне условия в предложении WHERE. (+) указывается после имени таблицы, в которой нет соответствующих строк.

 

Оператор внешнего соединения может использоваться только на одной стороне выражения (там, где недостаточно информации). Он возвращает строки таблицы, для которых в другой таблице нет соответствующей строки.

Условие, предполагающее внешнее соединение, не может использовать оператор IN и быть связанным с другими условиями с помощью оператора OR.

Пример. Вывод для каждого клиента его наименования, а также фамилии и идентификационного номера торгового представителя. В список включаются наименования даже тех клиентов, которые не имеют торгового представителя.

 

 

 

Соединение таблицы с собой

Рекурсивное соединение возникает в том случае, когда строки таблицы соединяются со строками этой же самой таблицы.  При этом в предложении FROM наличие двух таблиц имитируется путем использования двух различных псевдонимов одной и той же таблицы.

Пример. Вывод имен сотрудников и их менеджеров.

 

  

Для закрепления материала рекомендуется выполнить Практическое занятие 5.

 

Назад | Далее