|
Программирование >> Программирование баз данных
Рассмотрим, в чем состоят эти различия. Прежде всего, как и в случае с использованием всех столбцов, возвращаемых в результате вызова функции, заданное по умолчанию имя столбца не предусмотрено, поэтому если требуется задать имя столбца, то необходимо ввести псевдоним. Кроме того, следует отметить, что в действительности не получена достаточно значимая информация. Поэтому вначале выясним, что представляет собой этот набор записей. Он содержит количество строк, соответствующих условию WHERE запроса, относящемуся к таблице (таблицам) в конструкции FROM. Запомните формат этого запроса. Он представляет собой основной запрос, который может служить для проверки того, что количество строк, предполагаемых для получения при выборке из таблицы и соответствующих заданным условиям WHERE, действительно является таковым. Ради интереса попытаемся выполнить тот же запрос без конструкции WHERE: SELECT COUNT(*) FROM HumanResources.Employee Если применительно к таблице Employee читатель не выполнял какие-либо операции удаления или вставки, то должен быть получен набор записей, который выглядит примерно таким образом: (1 row(s) affected) Что означает это число? Оно представляет собой общее количество строк в таблице Employee. Данный запрос также относится к запросам такого типа, которые следует запомнить, поскольку они потребуются в дальнейшем. Теперь рассмотрим, как эта функция применяется с выражением (обычно с именем столбца). Вначале попытаемся применить уже известный нам способ вызова на выполнение функции COUNT, но по отношению к другой таблице: SELECT COUNT(*) FROM HumanResources.JobCandidate; Количество строк в этой таблице меньше, и это отражено в полученньгх результатах: (1 row(s) affected) А теперь модифицируем этот запрос, чтобы в нем для выборки и подсчета количества строк применялся конкретный столбец: SELECT COUNT(EmployeelD) FROM HumanResources.JobCandidate; Полученные результаты будут немного отличаться от предыдущих: (1 row(s) affected) Warning: Null value is eliminated by an aggregate or other SET operation. Чем обусловлено это различие? Причина становится вполне ясной, стоит только изменить свой взгляд на вещи. Дело в том, что не в каждой строке столбца EmployeelD значение присутствует как таковое. Иными словами, функция COUNT при ее использовании в любой форме, отличной от COUNT (*) , игнорирует NULL-значения. В действительности NULL-значения игнорируются во всех агрегирующих функциях, кроме COUNT(*). В этом вопросе следует внимательно разобраться, поскольку указанный нюанс может оказать весьма существенное влияние на полученные результаты. В частности, многие пользователи полагают, что при вычислении средних величин в столбцах с числовыми данными NULL-значения рассматриваются как равные нулю, но NULL-значения не равны нулю и не должны использоваться как таковые. Если функция AVG или другая агрегирующая функция применяется к столбцу с NULL-значениями, то эти значения не войдут в состав результатов операции агрегирования, если с помощью каких-либо манипуляций они не будут преобразованы в значения, отличные от NULL, в пределах вызова самой функции (например, с использованием функции COALESCE () или ISNULL ()). Эта тема будет рассматриваться более подробно в главе 6, но о нюансах работы с NULL-значениями всегда следует помнить, разрабатывая код T-SQL и проектируя базу данных. Рассуждения о том, что NULL-значения должны учитываться при проектировании базы данных, не лишены смысла. Достаточно сказать, что решение об использовании NULL-значений в столбце должно приниматься с учетом того, какие запросы будут выполняться по отношению к конкретной базе данных и какие агрегирующие функции будут в них использоваться. Теперь, после описания работы с группами, перейдем к рассмотрению одного из понятий, при освоении которых у большинства программистов возникают сложности. Надеемся, что после чтения следующего раздела у читателя такое впечатление полностью рассеется. Распространение условий на группы с помощью конструкции HAVING Конструкция HAVING используется лишь при том условии, что в запросе присутствует также конструкция GROUP BY; следует учитывать, что конструкция WHERE применяется к каждой строке еще до того, как будет выполнена проверка условий принадлежности этой строки к конкретной группе, а конструкция HAVING применяется к агрегированному значению, относящемуся к этой группе. Чтобы ознакомиться с тем, в чем это выражается на практике, рассмотрим небольшой пример, используя тот же запрос, который использовался в предьщущем примере конструкции GROUP BY, но добавим конструкцию HAVING: SELECT SalesOrderlD, SUM(OrderQty) FROM Sales.SalesOrderDetail WHERE SalesOrderlD BETWEEN 43684 AND 43686 GROUP BY SalesOrderlD HAVING SUM(OrderQty) > 5; Напомним, что в исходном запросе были возвращены три строки, а на этот раз применение констр)тсции HAVING приводит к тому, что количество строк сокращается до двух (строка с итоговым значением OrderQty, равным 5, исключена из полученных результатов): SalesOrderlD 43684 9 43685 б (2 row(s) affected) Вывод кода XML с использованием конструкции for xml Ко времени выхода предыдущей версии СУБД SQL Server в 2000 году язык XML еще не имел широкого распространения, но уже показал себя как один из основных способов обеспечения доступа к данным. Поэтому компания Microsoft, готовясь к выпуску указанной версии СУБД SQL Server (SQL Server 2000), предусмотрела возможность вывода результатов в формате XML, а не только оформления их в виде традиционного результирующего набора. Указанные средства вывода данных показали себя как чрезвычайно мощные, особенно в такой среде, как Web, или в системах, основанных на использовании нескольких разных платформ. С тех пор специалисты компании Microsoft немного усовершенствовали способы вывода данных в формате XML, но основы этих способов остались теми же, а их значимость еще больше возросла. В настоящей главе подробные сведения об использовании этой конструкции не приведены, поскольку описанию средств языка XML посвящена другая значительная часть данной книги, но следует учитывать, что в главе 16 изложен большой объем материала, касающегося XML. Но во всяком случае опыт автора показывает, что сначала лучше изучить основы. Использование подсказок, сформированных с помощью конструкции option Конструкция OPTION применяется для передачи СУБД SQL Server указаний, касающихся выбора способа выполнения запроса. Но в действительности СУБД SQL Server почти всегда находит гораздо лучший способ выполнения запроса, чем программист, поэтому чаще всего в результате использования конструкции OPTION производительность системы снижается. Однако иногда применение конструкции OPTION действительно необходимо. Это - еще одна из тем, которым будет уделено больше внимания позднее. Подсказки, применяемые в запросах, будут рассматриваться более подробно в главе, в которой речь пойдет о блокировках (глава 12), а поскольку мы еще не описали, как влияют подсказки на выполнение запросов, то не сформированы предпосылки для понимания конструкции OPTION, поэтому отложим обсуждение и этой темы. Конструкция distinct В данном разделе мы рассмотрим последнюю важную тему, которая относится к оператору SELECT, после чего перейдем к рассмотрению операторов действия (которые предназначены для внесения изменений в данные). Предикаты DISTINCT и ALL позволяют выполнять операции над повторяющимися данными. Конструкция DISTINCT полностью предназначена для устранения дублирующихся данных. При обнаружении повторяющихся значений любой последующий экземпляр не учитывается (а если конструкция DISTINCT используется вместе с функцией COUNT (), то подсчет уникальных значений также осуществляется единожды). Рассматриваемая конструкция применяется в начале списка выборки (если есть необходимость исключить
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |