пятница, 16 декабря 2011 г.

Базы данных. Группировка строк в запросе


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

Групповые функции.
Функция
Возвращаемое значение
AVG([DISTINCT|ALL]n)Среднее значение от n, нулевые значения опускаются
COUNT([ALL]*)Число строк, извлекаемых в запросе или подзапросе
COUNT([DISTINCT|ALL] expr)Число строк, для которых expr принимает не пустое значение
MAX([DISTINCT|ALL] expr)Максимальное значение выражения eхрr
MIN([DISTINCT|ALL] expr)Минимальное значение выражения eхрr
SUM([DISTINCT|ALL] n)Сумма значений n



Предложение WHERE позволяет исключить некоторые строки до начала разбиения на группы.
Если в списке SELECT заданы столбцы одновременно с групповыми функциями, их список должен использоваться и в предложении GROUP BY. В предложении GROUP BY нельзя использовать позиционные обозначения или псевдонимы столбцов.
По умолчанию строки сортируются в порядке возрастания в соответствии со списком GROUP BY. Изменить порядок сортировки можно с помощью предложения ORDER BY.
Пример: Вывод номера, фамилии, возраста спортсменов, которым 21год.
SELECT id, last_name, age
FROM sportmen
WHERE age =21
Пример: Вывод возраста и количества спортсменов, которым 21.
SELECT age, count(*)
FROM sportmen
WHERE age =21
GROUP BY age;

age
--------------------
NUMBER
-------------------------
21
2

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

Группы внутри групп.
Сводные результаты по группам и подгруппам можно получить путем указания более чем одного столбца в предложении GROUP BY. Порядок сортировки, используемый по умолчанию, определяется порядком столбцов в предложении GROUP BY.
Пример: Вывод количества служащих по победам и повозрасту.
SELECT winner, age, count(*)
FROM sportmen
GROUP BY winner, age;
winner        age      count(*)
bronze         21         1
gold             22          2
gold             25          1
no_winner    18        1
no_winner    19        1
silver           20          1
silver           21          1

Предложение HAVING.
Предложение WHERE для исключения групп не используется. Для исключения целиком некоторых групп следует пользоваться предложением HAVING.
Пример: Вывод возраста и средней заработной платы тренеров, где средняя заработная плата превышает 20000.
SELECT age, avg(salary)
FROM trainer
GROUP BY age
HAVING AVG(salary)>20000;
age         avg(salary)
45           30000.0000
50           25000.0000
Предложение HAVING задает условие отбора групп для вывода. Следовательно, на группы накладывается дальнейшее ограничение, основанное на сводной информации.

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

Если используется предложение HAVING, сервер выполняет следующие действия:

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

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

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

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

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

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

Отношения между таблицами.
В  предложение WHERE всегда необходимо включать допустимое условие соединения.
********
Простой запрос с соединением.
Синтаксис

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


где:

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

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

Эквисоединение.
Этот вид соединения возникает, когда в качестве условия для соединения указывается точное равенство значений одного столбца значениям другого. Часто эти столбцы являются компонентами первичного и внешнего ключа.
Пример: Соединение таблиц спортсменов и видов спорта для вывода фамилии спортсмена, номера и названия спорта.
SELECT sportmen.last_name, sportmen.sp_id, sport_type.name
FROM sportmen, sport_type
WHERE sportmen.sp_id = sport_type.id;


last_name                     sp_id                name
titov                                     2                 tennis
chinskaya                            1                    beg
motin                                   5                   boks
martova                               8                 football
smirnov                                3          legkaya atletika
popov                                   4                 borba
popova                                 7             basketball
shmelev                                6                plavanie

Строки двух таблиц комбинируются и в результат включаются лишь те строки, у которых значения sportmen.sp_id и sport_type.id равны.
Псевдонимы таблиц.
Для различения одноименных столбцов из разных таблиц используются префиксы в виде имен таблиц. Использование префиксов в виде имен таблиц увеличивает производительность запроса. Одноименные столбцы из разных таблиц можно различать по их псевдонимам. Однако как быть в том случае, когда имена таблиц громоздки или совпадают?
Для разрешения такой ситуации используют псевдонимы таблиц. При этом необходимо следовать следующим правилам:
  • перед именами столбцов рекомендуется указывать псевдонимы таблиц;
  • псевдонимы таблиц действительны только для данной команды SELECT;
  • если псевдоним таблицы создан, перед ссылкой на столбец следует указывать его, а не имя таблицы.

Пример: Соединение таблиц спортсменов и видов спорта для вывода фамилии спортсмена, номера и названия спорта. Используются псевдонимы столбцов, а для упрощения ссылок на таблицы – псевдонимы таблиц.
SELECT s.last_name “Фамилия”, s.sp_id “Номер”, t.name “Вид спорта”
FROM sportmen s, sport_type t
WHERE s.sp_id = t.id;

Псевдонимы таблиц могут содержать до тридцати символов, но чем они короче, тем лучше. Действие псевдонима таблицы распространяется лишь на текущую команду SELECT. Использование псевдонимов таблиц позволяет уменьшить объем кода SQL, что сокращает расход памяти.
Дополнительные условия поиска.
Помимо соединения в предложении WHERE можно задавать и другие критерии для ограничения получаемых в запросе строк. Поскольку соединение необходимо для подбора соответствий, дополнительное условие добавляется с помощью оператора AND.
Пример: Вывод фамилии, номера и названия спорта спортсменки "popova".
SELECT s.last_name, s.sp_id , t.name
FROM sportmen s, sport_type t
WHERE s.sp_id = t.id
AND s.last_name='popova';

last_name     sp_id       name
        popova                7       basketball
Источник:
unesco.kemsu.ru

Комментариев нет:

Отправить комментарий