Компоненты SQL
SUM
Функция SUM складывает значения из указанного столбца. Столбец должен иметь один из числовых типов данных, а значение суммы не должно выходить за пределы диапазона, предусмотренного для этого типа. Таким образом, если столбец имеет тип данных SMALLINT, то полученная сумма не должна превышать верхний предел, имеющийся у этого типа данных. В таблице INVOICE (счет-фактура) из базы данных, о которой уже говорилось в этой главе, хранятся данные по всем продажам. Чтобы найти общую сумму в долларах для всех продаж, иные которых хранятся в базе, используйте функцию SUM следующим образом:
SELECT SUM(TotalSale) FROM INVOICE;
AVG
Функция AVG возвращает среднее арифметическое всех значений указанного столбца. Функция SUM, AVG применяется только к столбцам с числовым типом данных. Чтобы найти среднее арифметическое значение продаж, учитывая все финансовые операции, хранящиеся в базе, используйте функцию AVG следующим образом:
SELECT AVG(TotalSale) FROM INVOICE;
Имейте в виду, что неопределенные значения значениями не считаются, так что если в каких-либо строках в столбце TotalSale (всего продано) находятся неопределенные значения, то при подсчете средней продажи эти строки игнорируются.
Подзапросы
Подзапросами (см. выше раздел "Итоговые функции") являются запросы, находящиеся внутри какого-либо запроса. В любом месте оператора SQL, где можно использовать выражение, можно также использовать и подзапрос. Подзапросы являются мощным инструментом для связывания информации из одной таблицы с информацией из другой. Дело в том, что запрос к одной из таблиц можно встроить в другой запрос. С помощью вложенных подзапросов можно иметь доступ к информации более чем из двух таблиц. Если правильно пользоваться подзапросами, то из базы данных можно получить почти любую нужную информацию.
Язык управления данными
В языке управления данными (Data Control Language, DCL) имеются четыре команды: COMMIT (завершить), ROLLBACK (откат), GRANT (предоставить) и REVOKE (отозвать). Все эти команды связаны с защитой базы от случайного или умышленного повреждения.
Транзакции
Базы данных наиболее уязвимы именно тогда, когда в них вносят изменения. Изменения могут быть опасными даже для однопользовательских баз. Аппаратный или программный сбой, происшедший во время изменения, может застать базу данных в переходном состоянии – между состоянием в момент начала изменений и состоянием, которое было бы в момент завершения этих изменений.
С целью защиты базы данных язык SQL ограничивает операции, которые могут ее изменить, так что они выполняются только в пределах транзакций. Во время транзакции SQL записывает каждую операцию с данными в файл журнала. Если транзакцию, перед тем как она будет завершена оператором COMMIT, что-то прервет, то можно восстановить первоначальное состояние системы с помощью оператора ROLLBACK. Этот оператор обрабатывает журнал транзакций в обратном порядке, отменяя все действия, имевшие место во время транзакции. Выполнив откат базы данных до состояния, в котором она была перед началом транзакции, можно выяснить, что вызвало неполадки, а затем попробовать еще раз выполнить транзакцию.
Повреждения базы данных или некорректные результаты возможны в многопользовательской системе даже тогда, когда нет никаких аппаратных или программных отказов. Серьезные неприятности могут быть вызваны совместными действиями двух или нескольких пользователей но отношению к одной и той же таблице, т.е. имеющих к ней доступ в одно и то же время. VL решает эту проблему, допуская внесение изменений только в пределах транзакций.
Совет:
База данных может пострадать из-за сбоев в аппаратном или программном обеспечении. Современные СУБД стараются свести подобную возможность к минимуму. Для этого они все операции с базой данных выполняют в пределах транзакций. Выполнив операции, находящиеся в транзакции, СУБД завершают транзакции одним оператором COMMIT. В современных системах управления базами данных также ведутся журналы транзакций. Это делается для того, чтобы в случае неприятностей с аппаратным обеспечением, программами или персоналом гарантировать защиту данных. После завершения транзакции данные защищены от всех системных отказов, если только не считать самых катастрофических; в случае ее неудачи го проведения возможен откат транзакции назад к ее начальной фазе и – после устранения причин неполадок – повторное выполнение этой транзакции.
Поместив все операции, воздействующие на базу данных, в транзакции, вы можете изолировать действия одного пользователя от действий другого. Если необходима уверенность, что результаты, получаемые из базы данных, являются точными, то такая изоляция очень важна.
Технические подробности:
Возможно, вы удивитесь, что совместные действия двух пользователей могут при. вести к некорректным результатам. Скажем, Донна читает запись какой-либо таблицы из базы данных. Через мгновение Дэвид меняет в той записи значение числового поля. А теперь в то же поле Донна записывает число, полученное на основе значения, прочитанного ею вначале. И так как она не знает об изменении, сделанном Дэвидом, то ее операция является некорректной.
Другая неприятность может произойти, когда Донна вносит в запись какие-то значения, а Дэвид затем эту запись читает. И если Донна проводит откат своей транзакции, то Дэвид не знает об этой операции и выполняет свои действия на основе прочитанного им значения, которое не совпадает со значением, имеющимся в базе после отката. То, что смешно в кинокомедии, не всегда приятно в реальной жизни.