По умолчанию все строки таблицы рассматриваются как одна группа. Для
разбиения таблицы на меньшие группы строк используется предложение 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 обязательно.
Если требуется получить данные из более, чем из одной таблицы базы данных,
используется операция соединения, определенная в реляционной алгебре.
Строки одной таблицы соединяются со строками другой согласно общим значениям в
соответствующих столбцах – первичных и внешних ключей.
Рисунок 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 наличие двух таблиц имитируется путем использования двух различных
псевдонимов одной и той же таблицы.