Программирование >>  Программирование баз данных 

1 ... 60 61 62 [ 63 ] 64 65 66 ... 346


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

Операция exists

Автор рассматривает EXISTS как операцию, но в документации Books Online для обозначения EXISTS применяется лишь термин ключевое слово . По-видимому, применение указанной трактовки обусловлено тем, что EXISTS не полностью соответствует определению понятия операции. Разумеется, EXISTS в такой же степени заслуживает названия операция , как и операция, обозначаемая ключевым словом IN, но нельзя также отрицать, что обработка данных в ней происходит во многом иначе.

При использовании операции EXISTS возврат данных фактически не происходит. Вместо этого вырабатывается значение TRUE или FALSE, указывающее на то, существуют ли данные, которые соответствуют критериям, заданным в том запросе, на который распространяется действие операции EXISTS.

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

SELECT е.EmployeelD, FirstName, LastName FROM HumanResources.Employee e JOIN Person.Contact с

ON e.ContactID = e.ContactID WHERE EXISTS

(SELECT EmployeelD

FROM HumanResources.JobCandidate jc WHERE jc.EmployeelD = e.EmployeelD)

В результате происходит возврат тех же двух строк, которые были возвращены с помощью более привычного вложенного запроса:

EmployeelD FirstName LastName

41 Peng Wu

268 Stephen Jiang

(2 row(s) affected)

Очевидно, что такую же задачу можно было бы легко решить с помощью соединения:

SELECT DISTINCT е.EmployeelD, FirstName, LastName FROM HumanResources.Employee e JOIN Person.Contact с

ON e.ContactID = e.ContactID JOIN HumanResources.JobCandidate jc

ON jc.EmployeelD = e.EmployeelD

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



нового синтаксиса. Ответ на этот вопрос весьма прост- с потребностями повышения производительности.

Если в запросе используется ключевое слово EXISTS, то СУБД SQL Server не приходится выполнять полное построчное соединение. Вместо этого СУБД просматривает строки до тех пор, пока не находит первое соответствие, после чего немедленно останавливается. Дело в том, что операция EXISTS возвращает истинное значение сразу после обнаружения первого соответствия, поэтому необходимость в выполнении дальнейшего просмотра отпадает. Различие в производительности в данном случае становится еще более заметным по сравнению с внутренним соединением. Дело в том, что при выполнении оператора с ключевым словом NOT в СУБД SQL Server применяется операция отрицания к результатам той же операции EXISTS. И несмотря на то, что теперь используются не сами полученные результаты, а их отрицание, СУБД SQL Server по-прежнему прекращает просмотр сразу же после обнаружения одной строки, соответствующей условию. Единственное различие состоит в том, что условием прекращения просмотра становится возврат из операции сравнения значения FALSE, а не TRUE. Во всем остальном, кроме производительности, запрос с конструкцией NOT EXISTS не отличается от запроса с внешним соединением.

Другие способы использования ключевого слова exists

По мере накопления опыта работы со сценариями создания объектов базы данных на языке SQL разработчики обнаруживают, какие сложности возникают при использовании многих операторов CREATE. Один из типичных примеров применения оператора CREATE может выглядеть так:

IF EXISTS (SELECT * FROM sysobjects WHERE id =

object id(N[Sales].[SalesOrderHeader]) AND OBJECTPROPERTY(id, NIsUserTable) = 1)

DROP TABLE [Sales].[SalesOrderHeader] GO

CREATE TABLE [Sales].[SalesOrderHeader] (

В данном случае осуществляется выборка данных из таблицы sysobjects, но для той же цели могут использоваться таблицы sys objects, sys .databases или представления INFORMATION SCHEMA, а общий принцип остается тем же: проверка того, существует ли объект, перед выполнением оператора CREATE. Иногда при выполнении подобных сценариев предусмотрен просто отказ от применения оператора CREATE, если объект (в данном случае таблица) уже существует, а иногда предусматривается его удаление (как было сделано в примере, приведенном выше). Общая идея применяемого при этом синтаксиса довольно проста - исключить возможную предпосылку возникновения ошибки (если таблица, создаваемая с помощью оператора CREATE, уже существует, то возникает ошибка и попытка выполнения сценария оканчивается неудачей).

В качестве еще одного простого примера рассмотрим небольшой сценарий создания объекта базы данных. Кроме того, постараемся включить в сам оператор создания минимальное количество конструкций, поскольку наша цель - проиллюстрировать применение операции EXISTS, а не команды CREATE: USE master



IF NOT EXISTS (SELECT True FROM sys.databases WHERE name = DBCreateTest) BEGIN

CREATE DATABASE DBCreateTest

ELSE

BEGIN

PRINT Database already exists. Skipping CREATE DATABASE Statement

END GO

Bo время первого вызова на выполнение этого оператора на компьютере пользователя не должно быть базы данных DBCreateTest (если только такая база данных не была создана по стечению обстоятельств до того, как мы приступили к описанию данной темы), поэтому база данных будет создана успешно.

После этого вызовем тот же сценарий на вьшолнение во второй раз, после чего сразу станут заметными изменения, поскольку сценарий сформирует другое сообщение: Database already exists. Skipping CREATE DATABASE Statement

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

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

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

Смешивание типов данных:

функции cast и convert

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

Обе эти функции, CAST и CONVERT, обеспечивают преобразование типов данных. В определенном отношении обе они выполняют одинаковые действия, за исключением того, что функция CONVERT осуществляет также некоторые преобразования, связанные с форматированием даты, которые не поддерживаются функцией CAST.



1 ... 60 61 62 [ 63 ] 64 65 66 ... 346

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика