Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы Госы_3.doc
Скачиваний:
84
Добавлен:
27.10.2018
Размер:
1.55 Mб
Скачать

37. Группирование результатов средствами языка sql.

Конструкция group by (группировка) используется в операторе выбора для разделения результатов на группы. Группировку можно проводить за одним или несколькими названиями столбцов, или за результат вычисления, используя числовые типы данных в выражении. В конструкции group by максимальное число названий столбцов и выражений не должно превосходить 16.

Примечание. Нельзя проводить группировку по столбцам типа text или image.

Стандарт SQL на использование конструкции group by является суровее сравнительно с вышеприведенным. Стандарт требует соблюдения следующих условий :

- Названия столбцов, которые находятся в списке выбора, должны быть присутствующими также в конструкции group by или быть аргументами агрегируют функций.

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

Группировку можно вести за несколькими столбцами, чтобы разбить таблицу на более мелкие группы. Например, в следующем запитые вычисляется средняя цена книги и годовая сумма продажи для каждого книжного издательства и для каждого вида книг, который выпускается этим издательством, :

select pub_id, type, avg (price), sum (total_sales)

from titles

group by pub_id, типы

С целью расширения возможностей, заложенных в стандартном SQL, в языке Transact - SQL не накладывается никаких ограничений на содержание списка выбора в операторе select, который содержит конструкцию группировки :

1. Названия столбцов в списке выбора не обязаны присутствовать также в конструкции группировки или быть аргументами агрегируют функций.

2. Названия столбцов в конструкции группировки не обязаны присутствовать в списке выбора.

Если столбец, по которому проводится группировка, содержит неопределенные значения, то все строки содержат это значение (null), собираются в одну группу.

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

38. Создание много табличных запросов средствами языка sql.

Реляционное умножение самый Простой пример многотабличных SQL -запиту : SELECT * FROM A, B;

Этот запрос соединяет каждую строку из таблицы A с каждой строкой из таблицы B в одну строку, в которой будут все колонки из первой таблицы и все колонки из второй таблицы. И возвращает набор таких соединенных строк. Если в запитые будет три и больше таблицы, то строки будут соединяться в тройки, четверки и так далее по принципу каждая с каждой.

Оператор соединения SELECT * FROM Comments, Users

WHERE Comments.user_id = Users.id

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

Допустимо полет id таблицы Users содержит уникальный числовой идентификатор пользователя, полет user_id таблицы Comments содержит уникальный числовой идентификатор автора. Тогда описан выше запрос можно интерпретировать таким способом: выбрать все строки из таблицы Comments соединить их с соответствующими (указанной условию) строками из таблицы Users, то есть выбрать комментарии и информацию об авторах этих комментариев. Каждая строка результата будет содержать информацию о комментариях и о пользователе, который является автором комментария.

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

Описанное высшее (внутреннее) соединение, соединяет строки таблиц удовлетворяют условию. Внешнее соединение, тоже соединяет строки таблиц, но немного по другому.

SELECT * FROM Users LEFT JOIN Comments ON Comments.user_id = User.id

Данный запрос делает следующее: выбирает все строки из таблицы Users соединяет из с каждой строкой из таблицы Comments, выбирает только те пары, которые отвечают выражению указанной после слова ON, то есть все точно также как в предыдущем примере, но!Потом, если для какой-то строки из таблицы Users не нашлось ни одной строки из таблицы Comments, соответствующей условию, то эта строка соединяется с фиктивной рядком таблице Comments, в которой все поля имеют специальные значения NULL (нет значения). Таким образом, в результате в любом случае будет информация обо всех пользователях.

Для некоторых строк из таблицы Users может найтись несколько строчек из таблицы Comments, а для каких-то ни одной и тогда эта строка соединяется со строкой заполненной значениями NULL. Такое соединение называется внешним.

LEFT JOIN, RIGHT JOIN В примере внешнего соединения мы использовали SQL -оператор LEFT JOIN. Оператор RIGHT JOIN действует аналогично, но выбирает все записи из таблицы справа (а LEFT JOIN слева).Это их единственное отличие.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]