WWW.KNIGA.LIB-I.RU
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - Онлайн материалы
 

Pages:   || 2 | 3 | 4 | 5 |   ...   | 11 |

«Ицик Бен-Ган Деян Сарка Рон Талмейдж УДК 004.6 ББК 32.973.26-018.2 Б46 Бен-Ган, И. Microsoft® SQL Server® 2012. Создание запросов. Учебный курс Microsoft: Б46 Пер. с англ. / И. Бен-Ган, Д. Сарка, ...»

-- [ Страница 1 ] --

Ицик Бен-Ган

Деян Сарка

Рон Талмейдж

УДК 004.6

ББК 32.973.26-018.2

Б46

Бен-Ган, И.

Microsoft® SQL Server® 2012. Создание запросов. Учебный курс Microsoft:

Б46

Пер. с англ. / И. Бен-Ган, Д. Сарка, Р. Талмейдж. — М.: Издательство «Русская редакция»,

2014. — 720 с.: ил. + CD-ROM

ISBN 978-5-7502-0432-8

Официальный учебный курс Microsoft рассматривает создание запросов в SQL Server 2012.

Описаны создание объектов баз данных с помощью языка T-SQL, реализация типов данных, формирование вложенных и статистических запросов, запрос и управление XML-данными, модификация данных, устранение неполадок и оптимизация.

Книга является ценным справочником и позволяет самостоятельно подготовиться к сдаче экзамена 70-461 для получения сертификата MCSA: SQL Server 2012. На прилагаемом компакт-диске находится оригинальная английская версия книги, вопросы пробного экзамена и другие справочные материалы на английском языке.

Для квалифицированных пользователей и системных администраторов УДК 004.6 ББК 32.973.26-018.2 © 2014, Translation Russian Edition Publishers.

Authorized Russian translation of the English edition of Training Kit (Exam 70-461): Querying Microsoft® SQL Server® 2012, 1e, ISBN 978-0-7356-6605-4 © SolidQuality Global SL.

This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.



© 2014, перевод ООО «Издательство «Русская редакция».

Авторизованный перевод с английского на русский язык произведения Training Kit (Exam 70-461): Querying Microsoft® SQL Server® 2012, 1e, ISBN 978-0-7356-6605-4 © SolidQuality Global SL.

Этот перевод оригинального издания публикуется и продается с разрешения O’Reilly Media, Inc., которая владеет или распоряжается всеми правами на его публикацию и продажу.

© 2014, оформление и подготовка к изданию, ООО «Издательство «Русская редакция».

Microsoft, а также товарные знаки, перечисленные в списке, расположенном по адресу: http://www.microsoft.com/about/legal/en/us/ IntellectualProperty/Trademarks/EN-US.aspx являются товарными знаками или охраняемыми товарными знаками корпорации Microsoft в США и/или других странах. Все другие товарные знаки являются собственностью соответствующих фирм.

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

–  –  –

ISBN 978-0-7356-6605-4 (англ.) ISBN 978-5-7502-0432-8 Оглавление Учебный курс 70-461. Создание запросов в Microsoft SQL Server 2012

Введение

Системные требования

Требования к программному обеспечению и данным SQL Server

Требования к аппаратному и программному обеспечению

О прилагаемом компакт-диске

Установка заданий пробного экзамена

Использование пробного экзамена

Удаление ПО пробного экзамена

Благодарности

Ошибки и опечатки

Нас интересует ваше мнение

Оставайтесь на связи

Подготовка к экзамену

Глава 1. Основы построения запросов

ЗАНЯТИЕ 1. Основы языка T-SQL

Эволюция языка T-SQL

Использование языка T-SQL в соответствии с реляционной теорией

Использование правильной терминологии

ПРАКТИКУМ. Использование языка T-SQL в соответствии с реляционной теорией........... 18 Задание 1. Определите нереляционные элементы в запросе





Задание 2. Преобразуйте нереляционный запрос в реляционный

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Понимание логической обработки запросов

T-SQL как декларативный англо-подобный язык

Этапы логической обработки запросов

1. Обработка предложения FROM

2. Фильтрация строк на основании предложения WHERE

3. Группирование строк с помощью предложения GROUP BY

4. Фильтрация строк с помощью предложения HAVING

5. Обработка предложения SELECT

6. Управление сортировкой представления

ПРАКТИКУМ. Логическая обработка запроса

Задание 1. Устранение проблемы с группировкой

Задание 2. Устранение проблемы с присвоением псевдонима

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Важность знания теории

Упражнение 2. Собеседование на должность специалиста по анализу кода

Рекомендуемые упражнения

Просмотр общедоступных новостных групп по тематике T-SQL и анализ кода.......... 32 Описание логической обработки запросов

VI Оглавление Глава 2. Начало работы с инструкцией SELECT

ЗАНЯТИЕ 1. Использование предложений FROM и SELECT

Предложение FROM

Предложение SELECT

Разделение идентификаторов

ПРАКТИКУМ. Использование предложений FROM и SELECT

Задание 1. Составление простого запроса и использование псевдонимов таблиц.

....... 40 Задание 2. Использование псевдонимов столбцов и идентификаторов с разделителями

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Работа с типами данных и встроенными функциями

Выбор нужного типа данных

Выбор типов данных для ключей

Функции даты и времени

Текущая дата и время

Составляющие даты и времени

Функции добавления и вычитания даты

Смещение

Функции символьных типов данных

Объединение

Извлечение подстроки и ее позиция

Длина строки

Изменение строк

Форматирование строк

Выражение CASE и связанные с ним функции

ПРАКТИКУМ. Работа с типами данных и встроенными функциями

Задание 1. Применение конкатенации строк и использование функций даты и времени

Задание 2. Использование дополнительных функций даты и времени

Задание 3. Использование строковых данных и функций преобразования

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Анализ использования типов данных

Упражнение 2. Анализ использования функций

Рекомендуемые упражнения

Анализ типов данных в учебной базе данных

Анализ образцов кода из электронной документации по SQL Server 2012

Глава 3. Фильтрация и сортировка данных

ЗАНЯТИЕ 1. Фильтрация данных с помощью предикатов

Предикаты, троичная логика и аргументы поиска

Комбинирование предикатов

Фильтрация символьных данных

Фильтрация данных даты и времени

ПРАКТИКУМ. Фильтрация данных с помощью предикатов

Задание 1. Использование предложения WHERE для фильтрации строк со значением NULL

Задание 2. Использование предложения WHERE для фильтрации диапазона дат.

....... 78 Резюме занятия

Закрепление материала

Оглавление VII ЗАНЯТИЕ 2. Сортировка данных

Как обеспечить порядок сортировки данных

Использование предложения ORDER BY для сортировки данных

ПРАКТИКУМ. Сортировка данных

Задание 1. Использование предложения ORDER BY с недетерминированной сортировкой

Задание 2. Использование предложения ORDER BY с детерминированной сортировкой

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Фильтрация данных с помощью предложений TOP и OFFSET.

..FETCH................. 90 Фильтрация данных с помощью предложения TOP

Фильтрация данных с помощью OFFSET...FETCH

ПРАКТИКУМ. Фильтрация данных с помощью TOP и OFFSET...FETCH

Задание 1. Использование конструкции TOP

Задание 2. Использование конструкции OFFSET.

..FETCH

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Рекомендации по улучшению производительности фильтрации и сортировки

Упражнение 2. Обучение разработчика-стажера

Рекомендуемые упражнения

Перечисление этапов логической обработки запросов и сравнение фильтров............ 102 Что такое детерминизм?

Глава 4. Комбинирование наборов данных

ЗАНЯТИЕ 1. Использование соединений

Перекрестные соединения

Внутренние соединения

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

Запросы с мультисоединениями

ПРАКТИКУМ. Использование соединений

Задание 1. Сопоставление клиентов и заказов с помощью внутреннего соединения.

.... 116 Задание 2. Сопоставление клиентов и заказов с помощью внешнего соединения...... 116 Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Использование подзапросов, табличных выражений и оператора APPLY.

............ 119 Подзапросы

Независимые подзапросы

Коррелированные (связанные) подзапросы

Табличные выражения

Производные таблицы

Обобщенные табличные выражения

Представления и встроенные табличные функции

Оператор APPLY

Оператор CROSS APPLY

Оператор OUTER APPLY

ПРАКТИКУМ. Использование подзапросов, табличных выражений и оператора APPLY..... 135 Задание 1. Формирование списка продуктов с минимальной ценой за единицу в пределах категории

VIII Оглавление Задание 2. Формирование списка из N продуктов с минимальными ценами за единицу для каждого поставщика

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Использование операторов работы с наборами

Операторы UNION и UNION ALL

Оператор INTERSECT

Оператор EXCEPT

ПРАКТИКУМ. Применение операторов работы с наборами

Задание 1. Использование оператора работы с наборами EXCEPT

Задание 2. Использование оператора работы с наборами INTERSECT

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Анализ кода

Упражнение 2. Объяснение операторов работы с наборами

Рекомендуемые упражнения

Комбинирование наборов данных

Глава 5. Группирование и оконные функции

ЗАНЯТИЕ 1. Написание запросов для группировки данных

Работа с одиночным набором группирования

Работа с несколькими наборами группирования

ПРАКТИКУМ. Написание запросов группировки данных

Задание 1. Сбор статистической информации о клиентских заказах

Задание 2. Определение нескольких наборов группирования

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Сведение и отмена сведения данных

Сведение данных

Отмена сведения данных

ПРАКТИКУМ. Сведение данных

Задание 1. Сведение данных с помощью табличного выражения

Задание 2. Сведение данных и расчеты

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Использование оконных функций

Статистические оконные функции

Ранжирующие оконные функции

Оконные функции смещения

ПРАКТИКУМ. Использование оконных функций

Задание 1. Использование статистических оконных функций

Задание 2. Использование оконных ранжирующих функций и функций смещения.

..... 183 Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Усовершенствование операций анализа данных

Упражнение 2. Собеседование на вакансию разработчика

Рекомендуемые упражнения

Логическая обработка запросов

Оглавление IX Глава 6. Запросы с полнотекстовым поиском данных

ЗАНЯТИЕ 1. Создание полнотекстовых каталогов и индексов

Компоненты полнотекстового поиска

Создание и управление полнотекстовыми каталогами и индексами

ПРАКТИКУМ. Создание полнотекстового индекса

Задание 1. Создание таблицы и полнотекстовых компонентов

Задание 2. Установка семантической базы данных и создание полнотекстового индекса

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Использование предикатов CONTAINS и FREETEXT

Предикат CONTAINS

Предикат FREETEXT

ПРАКТИКУМ. Использование предикатов CONTAINS и FREETEXT

Задание 1. Использование предиката CONTAINS

Задание 2. Использование синонимов и предиката FREETEXT

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Использование табличных функций полнотекстового и семантического поиска.

.... 207 Использование функций полнотекстового поиска

Использование функций семантического поиска

ПРАКТИКУМ. Использование функций полнотекстового и семантического поиска......... 210 Задание 1. Использование функций полнотекстового поиска

Задание 2. Использование функций семантического поиска

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Расширение поиска

Упражнение 2. Использование семантического поиска

Рекомендуемые упражнения

Знакомство с динамическими административными представлениями, связанными с полнотекстовым поиском, и создание и восстановление резервных копий полнотекстовых каталогов и индексов

Глава 7. Запрос и управление XML-данными

ЗАНЯТИЕ 1. Возвращение результатов в виде XML с помощью предложения FOR XML.

........ 216 Введение в XML

Получение XML из реляционных данных

Режим FOR XML RAW

Режим FOR XML AUTO

Режим FOR XML PATH

Дробление XML на таблицы

ПРАКТИКУМ. Использование предложения FOR XML

Задание 1. Возвращение XML-документа

Задание 2. Возвращение XML-фрагмента

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Запрос XML-данных с помощью XQuery

Основные понятия XQuery

Типы данных XQuery

Функции XQuery

Навигация

Предикаты

X Оглавление Выражения FLWOR

ПРАКТИКУМ. Использование навигации XQuery/XPath

Задание 1. Использование выражения XPath

Задание 2. Использование выражения XPath с предикатами

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Использование типа данных XML

Когда используется тип данных XML

Методы типа данных XML

Использование типа данных XML для динамической схемы

XML-индексы

ПРАКТИКУМ. Использование методов типа данных XML

Задание 1. Использование методов value() и exist()

Задание 2. Использование методов query(), nodes() и modify()

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Создание отчетов из XML-данных

Упражнение 2. Динамическая схема

Рекомендуемые упражнения

Запрос XML-данных

Глава 8. Создание таблиц и обеспечение целостности данных

ЗАНЯТИЕ 1. Создание и изменение таблиц

Введение

Создание таблицы

Определение схемы базы данных

Именование таблиц и столбцов

Выбор типов данных для столбцов

Значение NULL и значения по умолчанию

Свойство идентификатора и порядковые номера

Вычисляемые столбцы

Сжатие таблиц

Изменение таблицы

Выбор индексов таблицы

ПРАКТИКУМ. Создание и изменение таблиц

Задание 1. Использование команды ALTER TABLE для добавления и изменения столбцов

Задание 2. Работа с NULL-столбцами в таблице

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Обеспечение целостности данных

Использование ограничений

Ограничения первичного ключа

Ограничения уникальности

Ограничения внешнего ключа

Проверочные ограничения

Ограничение по умолчанию

ПРАКТИКУМ. Обеспечение целостности данных

Задание 1. Работа с ограничениями первичного и внешнего ключа

Задание 2. Использование ограничений уникальности

Оглавление XI Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Работа с ограничениями таблиц

Упражнение 2. Использование ограничений уникальности и ограничений по умолчанию

Рекомендуемые упражнения

Создание таблиц и обеспечение целостности данных

Глава 9. Проектирование и создание представлений, встроенных функций и синонимов

ЗАНЯТИЕ 1. Проектирование и реализация представлений и встроенных функций

Введение

Представления

Синтаксис представлений базы данных

Параметры представления

Инструкции SELECT и UNION в представлении

Предложение WITH CHECK OPTION

Имена представлений

Ограничения в представлениях

Индексированные представления

Выполнение запросов из представлений

Изменение представления

Удаление представления

Модификация данных с помощью представления

Секционированные представления

Представления и метаданные

Встроенные функции

Параметры встроенной функции

ПРАКТИКУМ. Работа с представлениями и встроенными функциями

Задание 1. Построение представления для отчета

Задание 2. Преобразование представления во встроенную функцию

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Использование синонимов

Создание синонима

Удаление синонима

Уровень абстракции

Синонимы и ссылки на несуществующие объекты

Разрешения для работы с синонимами

Сравнение синонимов с другими объектами баз данных

ПРАКТИКУМ. Использование синонимов

Задание 1. Использование синонимов для создания более описательных имен отчетов

Задание 2. Использование синонимов для упрощения межбазовых запросов.

............ 312 Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Сравнение представлений, встроенных функций и синонимов

Упражнение 2. Преобразование синонимов в другие объекты

Рекомендуемые упражнения

Проектирование и создание представлений, встроенных функций и синонимов....... 315 XII Оглавление Глава 10. Вставка, обновление и удаление данных

ЗАНЯТИЕ 1. Вставка данных

Демонстрационные данные

Инструкция INSERT VALUES

Инструкция INSERT SELECT

Инструкция INSERT EXEC

Инструкция SELECT INTO

ПРАКТИКУМ. Вставка данных

Задание 1. Вставка данных о клиентах без заказов

Задание 2. Использование инструкции SELECT INTO

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Обновление данных

Демонстрационные данные

Инструкция UPDATE

Обновление с использованием объединения

Недетерминированная инструкция UPDATE

Инструкция UPDATE и табличные выражения

Инструкция UPDATE с использованием переменной

UPDATE и принцип единовременности

ПРАКТИКУМ. Обновление данных

Задание 1. Обновление данных с использованием соединений

Задание 2. Обновление данных с помощью обобщенного табличного выражения.

... 341 Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Удаление данных

Демонстрационные данные

Инструкция DELETE

Инструкция TRUNCATE

Инструкция DELETE на основе объединений

Инструкция DELETE с табличными выражениями

ПРАКТИКУМ. Удаление и усечение данных

Задание 1. Удаление данных с помощью соединений

Задание 2. Усечение данных

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Использование модификаций, поддерживающих оптимизированное ведение журнала

Упражнение 2. Усовершенствование процесса обновления данных

Рекомендуемые упражнения

Сравнение инструкций DELETE и TRUNCATE

Глава 11. Другие виды модификации данных

ЗАНЯТИЕ 1. Использование объекта последовательности и свойства столбца IDENTITY.

........ 353 Использование свойства столбца IDENTITI

Использование объекта последовательности

ПРАКТИКУМ. Использование объекта последовательности

Задание 1. Создание последовательности с параметрами по умолчанию

Задание 2. Создание последовательности со значениями, отличными от значений по умолчанию

Оглавление XIII Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Слияние данных

Использование инструкции MERGE

ПРАКТИКУМ. Использование инструкции MERGE

Задание 1. Использование инструкции MERGE

Задание 2. Выяснение роли предложения ON в инструкции MERGE

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Использование предложения OUTPUT

Работа с предложением OUTPUT

Инструкция INSERT с предложением OUTPUT

Инструкция DELETE с предложением OUTPUT

Инструкция UPDATE с предложением OUTPUT

Инструкция MERGE с предложением OUTPUT

Компонуемый DML

ПРАКТИКУМ. Использование предложения OUTPUT

Задание 1. Использование предложения OUTPUT в инструкции UPDATE.

................ 386 Задание 2. Использование компонуемого DML

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Лучшее решение для генерации ключей

Упражнение 2. Усовершенствование модификаций

Рекомендуемые упражнения

Сравнение старых и новых свойств

Глава 12. Реализация транзакций, обработка ошибок и динамический SQL.

.............. 392 ЗАНЯТИЕ 1. Управление транзакциями и параллелизм

Основные понятия транзакций

Свойства транзакций ACID

Типы транзакций

Команды транзакций

Уровни и состояния транзакций

Режимы транзакций

Режим автоматической фиксации

Режим неявных транзакций

Режим явных транзакций

Вложенные транзакции

Разметка транзакции

Дополнительные параметры транзакции

Основные блокировки

Совместимость блокировок

Блокирование

Взаимоблокировка

Уровни изоляции транзакций

ПРАКТИКУМ. Реализация транзакций

Задание 1. Работа с режимами транзакций

Задание 2. Работа с блокированием и взаимоблокированием

Задание 3. Работа с уровнями изоляции транзакций

Резюме занятия

Закрепление материала

XIV Оглавление ЗАНЯТИЕ 2. Реализация обработки ошибок

Обнаружение и инициирование ошибок

Анализ сообщений об ошибке

Команда RAISERROR

Команда THROW

Функции TRY_CONVERT и TRY_PARSE

Обработка ошибок после их обнаружения

Неструктурированная обработка ошибок с помощью функции @@ERROR............... 422 Использование параметра XACT_ABORT с транзакциями

Структурированная обработка ошибок с помощью конструкции TRY/CATCH........... 423 Выбор между THROW и RAISERROR в блоках TRY/CATCH

Использование параметра XACT_ABORT с блоками TRY/CATCH

ПРАКТИКУМ. Использование обработки ошибок

Задание 1. Работа с неструктурированной обработкой ошибок

Задание 2. Использование параметра XACT_ABORT для обработки ошибок.

............. 428 Задание 3. Структурированная обработка ошибок с помощью блоков TRY/CATCH

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Использование динамического SQL

Обзор динамического SQL

Использование динамического SQL

Генерация строк T-SQL

Инструкция EXECUTE

Внедрение кода SQL

Использование хранимой процедуры sp_executesql

ПРАКТИКУМ. Написание и тестирование динамического SQL

Задание 1. Генерация строки T-SQL и использование функции QUOTENAME.

......... 441 Задание 2. Предупреждение внедрения SQL-кода

Задание 3. Использование выходных параметров с процедурой sp_executesql.

.......... 444 Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Реализация обработки ошибок

Упражнение 2. Реализация транзакций

Рекомендуемые упражнения

Реализация обработки ошибок

Глава 13. Разработка и реализация процедур T-SQL

ЗАНЯТИЕ 1. Разработка и реализация хранимых процедур

Основные сведения о хранимых процедурах

Проверка существования хранимой процедуры

Параметры хранимой процедуры

Блок BEGIN/END

Инструкция SET NOCOUNT ON

Команда RETURN и коды возврата

Выполнение хранимых процедур

Входные параметры

Выходные параметры

Логика ветвления

Конструкция IF/ELSE

Конструкция WHILE

Оглавление XV Команда WAITFOR

Инструкция GOTO

Разработка хранимых процедур

Результаты хранимых процедур

Вызов других хранимых процедур

Хранимые процедуры и обработка ошибок

Динамический SQL в хранимых процедурах

ПРАКТИКУМ. Реализация хранимых процедур

Задание 1. Создание хранимой процедуры для выполнения административных задач

Задание 2. Разработка хранимой процедуры INSERT для уровня доступа к данным.

.... 466 Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Реализация триггеров

Триггеры DML

Триггеры AFTER

Вложенные триггеры AFTER

Триггеры INSTEAD OF

Функции триггеров DML

ПРАКТИКУМ. Написание триггеров DML

Задание 1. Изучение содержимого вставленных и удаленных таблиц

Задание 2. Создание триггера AFTER для выполнения бизнес-правила

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Реализация определяемых пользователем функций

Основные сведения об определяемых пользователем функциях

Скалярные определяемые пользователем функции

Определяемые пользователем функции с табличным значением

Встроенная пользовательская функция с табличным значением

Многооператорная пользовательская функция с табличным значением

Ограничения для определяемых пользователем функций

Аргументы определяемой пользователем функции

Производительность в контексте определяемой пользователем функции

ПРАКТИКУМ. Написание определяемых пользователем функций

Задание 1. Создание скалярной определяемой пользователем функции для вычисления дисконтированной стоимости

Задание 2. Создание определяемых пользователем функций с табличным значением

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Реализация хранимых процедур и определяемых пользователем функций

Упражнение 2. Реализация триггеров

Рекомендуемые упражнения

Использование хранимых процедур, триггеров и определяемых пользователем функций

Глава 14. Использование инструментов анализа производительности запросов.

....... 494 ЗАНЯТИЕ 1. Основные понятия оптимизации запросов

Проблемы оптимизации запросов и оптимизатор запросов

Подсистема расширенных событий SQL Server, трассировка SQL и приложение SQL Server Profiler

XVI Оглавление ПРАКТИКУМ. Использование подсистемы расширенных событий

Задание 1. Подготовка инструкции T-SQL и создание сеанса расширенных событий

Задание 2. Использование сеанса расширенных событий

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Использование параметров сеанса инструкции SET и анализ планов запросов.

.... 506 Параметры сеанса инструкции SET

Планы выполнения

ПРАКТИКУМ. Использование параметров SET на уровне сеанса и планов выполнения...... 514 Задание 1. Подготовка данных

Задание 2. Проанализируйте запрос

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Использование динамических административных объектов

Введение в динамические административные объекты

Наиболее важные динамические административные объекты для настройки объектов...... 518 ПРАКТИКУМ. Использование связанных с индексом динамических административных объектов

Задание 1. Нахождение неиспользованных индексов

Задание 2. Нахождение отсутствующих индексов

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Анализ запросов

Упражнение 2. Непрерывный мониторинг

Рекомендуемые упражнения

Дополнительные сведения о расширенных событиях, планах выполнения и динамических административных объектах

Глава 15. Реализация индексов и статистика

ЗАНЯТИЕ 1. Реализация индексов

Кучи и сбалансированные деревья

Кучи

Кластеризованные индексы

Реализация некластеризованных индексов

Реализация индексированных представлений

ПРАКТИКУМ. Анализ некластеризованных индексов

Задание 1. Реализация некластеризованного индекса в куче

Задание 2. Реализация некластеризованного индекса на кластеризованной таблице

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Использование аргументов поиска

Поддержка запросов с индексами

Аргументы поиска

ПРАКТИКУМ. Использование логических операторов OR и AND

Задание 1. Поддержка логического оператора OR

Задание 2. Поддержка логического оператора AND

Резюме занятия

Закрепление материала

Оглавление XVII ЗАНЯТИЕ 3. Основные понятия статистики

Автоматически создаваемая статистика

Ручная поддержка статистики

ПРАКТИКУМ. Ручная поддержка статистики

Задание 1. Запрещение автоматического создания статистики

Задание 2. Наблюдение эффекта от отключения автоматического создания статистики

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Просмотр таблицы

Упражнение 2. Медленные обновления

Рекомендуемые упражнения

Узнайте больше об индексах и о том, как статистические данные влияют на выполнение запроса

Глава 16. Основные сведения о курсорах, наборах данных и временных таблицах.

... 572 ЗАНЯТИЕ 1. Сравнительная оценка использования решений на основе курсоров/итераций и решений на основе наборов данных

Значение выражения "на основе наборов"

Итерации для операций, которые должны выполняться построчно

Сравнение курсора и решений на основе наборов в задачах манипулирования данными....... 577 ПРАКТИКУМ. Сравнительная оценка решений на основе курсора и решений на основе наборов данных

Задание 1. Расчет статистического выражения с помощью курсора

Задание 2. Расчет статистического выражения с помощью решения на основе наборов данных

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Сравнение использования временных таблиц и табличных переменных.

.............. 584 Область действия

Язык DDL и индексы

Физическое представление в базе данных tempdb

Транзакции

Статистика

ПРАКТИКУМ. Выбор оптимального временного объекта

Задание 1. Сравнение текущего количества заказов с количеством заказов за предыдущий год с использованием CTE

Задание 2. Сравнение текущего количества заказов с количеством заказов за прошлый год с использованием табличных переменных

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Рекомендации по повышению производительности для курсоров и временных объектов

Упражнение 2. Указать неточности в ответах

Рекомендуемые упражнения

Укажите различия

–  –  –

Алгоритмы соединений

Другие итераторы плана выполнения

ПРАКТИКУМ. Определение итераторов плана выполнения

Задание 1. Прогноз плана выполнения

Задание 2. Анализ плана выполнения

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 2. Использование параметризованных запросов и пакетных операций

Параметризованные запросы

Обработка пакетов

ПРАКТИКУМ. Работа с параметризацией запросов и хранимыми процедурами................ 628 Задание 1. Работа с запросами, для которых SQL Server не использует повторно план выполнения

Задание 2. Изучение повторной компиляции хранимой процедуры

Резюме занятия

Закрепление материала

ЗАНЯТИЕ 3. Использование подсказок оптимизатора и структур планов

Подсказки оптимизатора

Структуры планов

ПРАКТИКУМ. Использование подсказок оптимизатора

Задание 1. Создание процедуры с указанием подсказки запроса RECOMPILE.

.......... 639 Задание 2. Тестирование процедуры с указанием запроса RECOMPILE

Резюме занятия

Закрепление материала

УПРАЖНЕНИЯ

Упражнение 1. Оптимизация запроса

Упражнение 2. Табличная подсказка

Рекомендуемые упражнения

Анализ планов выполнения запросов и их принудительное выполнение

Ответы

Глава 1

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Упражнения

Упражнение 1. Важность знания теории

Упражнение 2. Собеседование на должность специалиста по анализу кода............... 645 Глава 2

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Упражнения

Упражнение 1. Анализ использования типов данных

Упражнение 2. Анализ использования функций

Глава 3

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Рекомендации по улучшению производительности фильтрации и сортировки

Упражнение 2. Обучение разработчика-стажера

Оглавление XIX Глава 4

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Анализ кода

Упражнение 2. Объяснение операторов работы с наборами

Глава 5

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Усовершенствование операций анализа данных

Упражнение 2. Прохождение собеседования на позицию разработчика

Глава 6

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Расширение поиска

Упражнение 2. Использование семантического поиска

Глава 7

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Создание отчетов из XML-данных

Упражнение 2. Динамическая схема

Глава 8

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Упражнения

Упражнение 1. Работа с ограничениями таблиц

Упражнение 2. Использование ограничений уникальности и ограничений по умолчанию

Глава 9

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Упражнения

Упражнение 1. Сравнение представлений, встроенных функций и синонимов.......... 668 Упражнение 2. Преобразование синонимов в другие объекты

Глава 10

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Использование модификаций, поддерживающих оптимизированное ведение журнала

Упражнение 2. Усовершенствование процесса обновления данных

Глава 11

Занятие 1. Закрепление материала

XX Оглавление Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Лучшее решение для генерации ключей

Упражнение 2. Усовершенствование модификаций

Глава 12

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Реализация обработки ошибок

Упражнение 2. Реализация транзакций

Глава 13

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Реализация хранимых процедур и определяемых

Упражнение 2. Реализация триггеров

Глава 14

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Анализ запросов

Упражнение 2. Непрерывный мониторинг

Глава 15

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Просмотр таблицы

Упражнение 2. Медленные обновления

Глава 16

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Упражнения

Упражнение 1. Рекомендации по повышению производительности для курсоров и временных объектов

Упражнение 2. Указать неточности в ответах

Глава 17

Занятие 1. Закрепление материала

Занятие 2. Закрепление материала

Занятие 3. Закрепление материала

Упражнения

Упражнение 1. Оптимизация запроса

Упражнение 2. Табличная подсказка

Предметный указатель

Об авторах

Учебный курс 70-461.

Создание запросов в Microsoft SQL Server 2012

–  –  –

ПРИМЕЧАНИЕ Экзаменационные темы Перечисленные здесь темы экзаменов актуальны на дату публикации этой книги. Темы экзаменов могут быть изменены в любое время без предварительного уведомления и по собственному усмотрению корпорации Microsoft.

Для получения последнего списка тем экзамена посетите Web-сайт Microsoft Learning (Центр обучения) по адресу:

http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-461&locale=en-us.

Введение Этот учебный курс предназначен для специалистов в области информационных технологий (information technology, IT), которые работают с запросами данных в Microsoft SQL Server 2012. Он разработан для IT-профессионалов, планирующих сдавать сертификационный экзамен 70-461 "Querying Microsoft SQL Server 2012".

Предполагается, что приступающие к изучению данного учебного курса имеют базовые представления об использовании языка запросов Transact-SQL (T-SQL) для получения данных в SQL Server 2012 и опыт работы с данным продуктом. Хотя эта книга поможет в подготовке к сдаче экзамена 70-461, ее можно рассматривать лишь как часть плана подготовки к экзамену, поскольку для успешной сдачи экзамена необходим практический опыт работы с Microsoft SQL Server 2012.

Рассматриваемый в рамках данного учебного курса и экзамена 70-461 материал относится к технологиям, используемым в Microsoft SQL Server 2012. Разделы данного курса включают все вопросы, необходимые для сдачи экзамена и перечисленные в разделе Skills Measured (Навыки) на странице http://www.microsoft.com/ learning/en/us/exam.aspx?ID=70-461&locale=en-us#tab2.

Изучив этот курс, вы научитесь:

создавать объекты базы данных;

работать с данными;

изменять данные;

выполнять диагностику и оптимизацию кода T-SQL.

Сведения о том, в какой именно части книги обсуждается конкретная экзаменационная тема, см. на страницах тематического содержания.

–  –  –

Требования к программному обеспечению и данным SQL Server Далее приведены минимальные требования к программному обеспечению и данным SQL Server.

SQL Server 2012. Необходим доступ к экземпляру SQL Server 2012 с учетной записью, дающей право на создание новых баз данных — предпочтительно относящейся к роли sysadmin. Для прохождения данного учебного курса можно использовать практически любой выпуск SQL Server (Standard, Enterprise, Business Intelligence или Developer), как 32-разрядный, так и 64-разрядный. При отсутствии доступа к работающему экземпляру в SQL Server можно установить его пробную версию, загрузив ее со страницы http://www.microsoft.com/sqlserver/ en/us/get-sql-server/try-it.aspx.

Выбор режима установки SQL Server 2012.

В диалоговом окне Feature Selection (Выбор компонентов) программы установки SQL Server 2012 выберите по крайней мере следующие компоненты:

• службы Database Engine Services;

• Full-Text and Semantic Extractions for Search (Полнотекстовый и семантический поиск);

• Documentation Components (Компоненты справки);

• Management Tools - Basic (Средства управления - основные) (обязательно);

• Management Tools - Complete (Средства управления - полный набор) (рекомендуется).

Демонстрационная база данных и исходный код TSQL2012. Большинство заданий в этом учебном курсе выполняется с использованием демонстрационной базы данных TSQL2012. К данному учебному курсу прилагается архивный файл, содержащий исходные коды, упражнения и файл сценария с именем TSQL2012.sql, который следует использовать для создания демонстрационной базы данных. Архивный файл можно загрузить по адресу http://go.microsoft.com/ FWLink/?Linkid=263548 и с Web-страницы авторов курса по адресу http://tsql.solidq.com/books/tk70461/. Для удобства доступа к исходному коду создайте локальную папку с именем C:\TK70461\ (или любым другим именем) и распакуйте содержимое архивного файла в эту папку.

–  –  –

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

Пробный экзамен. Проверить и закрепить полученные знания помогут электронные тесты, которые настраиваются в соответствии с вашими потребностями. Можно пройти пробный сертификационный экзамен 70-461. Для этого на диске содержится более 200 вопросов реального экзамена — их достаточно, чтобы познакомиться с процедурой опроса и оценить степень своей готовности к экзамену.

Электронная версия книги. На прилагаемом компакт-диске также находится электронная версия этой книги, которую можно носить с собой вместо печатной копии.

Установка заданий пробного экзамена Чтобы установить программное обеспечение (ПО) с тренировочными тестами пробного экзамена с прилагаемого компакт-диска на жесткий диск своего компьютера, выполните следующие действия.

1. Вставьте прилагаемый компакт-диск в дисковод компьютера и примите условия лицензионного соглашения — откроется меню компакт-диска.

ПРИМЕЧАНИЕ Если меню не открывается Если меню не открывается и лицензионное соглашение не выводится, возможно, на вашем компьютере отключена функция автозапуска. Дополнительные инструкции по установке см. в файле Readme.txt на компакт-диске.

2. Выберите пункт Practice Tests (Тренировочные тесты) и следуйте появившимся на экране инструкциям.

Использование пробного экзамена Для запуска программного обеспечения с пробным экзаменом выполните следующие действия.

1. Нажмите кнопку Start (Пуск), а затем выберите последовательность команд All Programs | Microsoft Press Training Kit Exam Prep (Все программы | Microsoft Press Training Kit Exam Prep). Откроется окно со списком пробных экзаменов учебных курсов Microsoft, установленных на вашем компьютере.

2. Дважды щелкните на тренировочном экзамене, который хотите пройти.

После запуска тренировочного экзамена выберите режим его выполнения:

Certification Mode (Режим сертификации), Study Mode (Режим обучения) или Custom Mode (Настраиваемый режим).

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

6 Введение Study Mode — тест без ограничения по времени с возможностью просмотра правильных ответов с пояснениями для каждого вопроса.

Custom Mode позволяет настраивать параметры теста.

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

При просмотре ответа на отдельный вопрос тренировочного экзамена отображается раздел References (Справочные материалы), в котором указано, где в учебном курсе можно найти информацию, относящуюся к данному вопросу, и приводятся ссылки на другие источники информации. После того как вы нажмете кнопку Test Results (Результаты теста), чтобы оценить выполнение тренировочного теста целиком, можно перейти на вкладку Learning Plan (План обучения) и просмотреть список ссылок по всем темам.

Удаление ПО пробного экзамена Для удаления программного обеспечения с пробным экзаменом из учебного курса используйте компонент Program and Features (Программы и компоненты) из Control Panel (Панель управления).

Благодарности В создании книги принимает участие множество людей, а не только авторы, чьи имена вы видите на ее обложке. Мы хотим выразить признательность следующим людям за всю их работу, позволившую вам сейчас держать эту книгу в руках: Альберту Герберту (Herbert Albert), техническому редактору; Лиле Бен-Ган (Lilach BenGan), руководителю проекта; Кену Джонсу (Ken Jones), рецензенту; Мелани Ярбро (Melanie Yarbrough), выпускающему редактору; Джейми Оделл (Jaime Odell), редактору; Марлен Ламберт (Marlene Lambert), руководителю проекта, Дженни Кравер (Jeanne Craver), художнику; Джин Тренари (Jean Trenary), специалисту по верстке; Кэти Крауз (Kathy Krause), корректору; Кэрин Форсайт (Kerin Forsyth), редактору.

Ошибки и опечатки Мы приложили все усилия, чтобы обеспечить точность информации в этой книге и на сопроводительном компакт-диске.

Все ошибки, о которых стало известно после публикации книги, перечислены на странице по адресу:

http://go.microsoft.com/FWLink/?Linkid=263549 Если вы найдете ошибку, которая еще не отмечена, можно сообщить о ней на той же самой Web-странице.

Если вам нужна дополнительная техническая поддержка, обращайтесь в Microsoft Press Book Support по адресу:

mspinput@microsoft.com Введение 7 Имейте в виду, что по этому адресу не предоставляется техническая поддержка программного обеспечения корпорации Microsoft.

Нас интересует ваше мнение Издательство Microsoft Press стремится удовлетворить запросы своих читателей, и ваши отзывы станут для нас самой главной наградой. Пожалуйста, сообщите нам свое мнение об этой книге на Web-странице http://www.microsoft.com/learning/ booksurvey.

Опрос очень короткий, и мы непременно прочтем все ваши комментарии и предложения. Заранее спасибо за ваш отклик!

Оставайтесь на связи

Давайте продолжим наше общение! Нас можно найти в твиттере:

http://twitter.com/MicrosoftPress.

Подготовка к экзамену Сертификационные экзамены корпорации Microsoft — отличная возможность карьерного роста и демонстрации уровня ваших профессиональных знаний и навыков.

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

Мы советуем дополнить ваш план подготовки к экзамену комбинацией доступных учебных материалов и курсов. Например, вы можете использовать учебный комплект и другое учебное руководство при подготовке дома и записаться на Microsoft Official Curriculum (Официальный курс обучения Microsoft) для занятий в классе.

Выберите наиболее подходящую для вас комбинацию.

ПРИМЕЧАНИЕ Сдача экзамена Найдите одну минуту (ну хорошо, минуту и две секунды), чтобы просмотреть видеоролик "Passing a Microsoft Exam" (Сдача экзамена Microsoft) по адресу http://www.youtube.com/watch?v=Jp5qg2NhgZ0&feature=youtu.be.

ГЛАВА Основы построения запросов Темы экзамена Работа с данными.

Запрос данных с помощью инструкций SELECT.

Язык Transact-SQL (T-SQL) — это основной язык, используемый для управления данными и их обработки в Microsoft SQL Server. В данной главе обсуждаются основы создания запросов с помощью языка T-SQL. В ней описаны базовые понятия языка, терминология и концепции, которым необходимо следовать при написании кода на T-SQL. Далее будет рассмотрен процесс логической обработки запросов, знание которого необходимо для работы с этим языком ВАЖНО! Вы прочли страницу 7?

На ней представлены полезные сведения о навыках, необходимых для сдачи данного экзамена.

В этой главе, в отличие от остальных глав данного учебного курса, напрямую не рассматриваются конкретные темы экзамена, за исключением обсуждения структуры инструкции SELECT — главной инструкции T-SQL, используемой для запроса данных. Тем не менее, представленная в этой главе информация исключительно важна для правильного понимания всей книги.

ПРЕЖДЕ ВСЕГО

Для полного освоения этой главы необходимо иметь:

знания основных концепций работы с базами данных;

опыт работы с SQL Server Management Studio (SSMS);

базовые навыки написания кода на языке T-SQL;

доступ к экземпляру SQL Server 2012 с установленной учебной базой данных TSQL2012 (подробное описание создания образца базы данных представлено во введении к данной книге).

Основы построения запросов 9 Занятие 1. Основы языка T-SQL Многие аспекты информатики, такие как языки программирования, развиваются на основе интуиции и современных тенденций. Без прочных основ их жизненный цикл может быть очень коротким, и даже если им удается выжить, изменения в тенденциях часто ведут к их быстрому видоизменению. Язык T-SQL отличается от других языков прочными математическими основами. Для написания хорошего SQL-кода вовсе не обязательно быть математиком (хотя это не помешает), но имея четкое представление о базовых концепциях языка, вы сможете лучше понять сам язык. Разумеется, можно писать код T-SQL и без этих знаний — и он даже будет успешно работать, но это то же самое, что есть суп вилкой.

Изучив материал этого занятия, вы сможете:

Сформулировать базовые понятия, на которых основывается язык T-SQL Объяснить важность использования T-SQL в соответствии с реляционной теорией Применять правильную терминологию при описании элементов, связанных с T-SQL Продолжительность занятия — 40 минут.

Эволюция языка T-SQL Как уже упоминалось, в отличие от многих объектов информационных технологий, язык T-SQL имеет строгие математические основы. Понимание ключевых компонентов этих основ поможет лучше разобраться с самим языком. Тогда при написании кода на T-SQL вы будете думать в терминах именно T-SQL, а не в терминах процедурных языков.

На рис. 1.1 показано развитие языка T-SQL от его математических основ.

–  –  –

поддерживает другие языки, такие как Microsoft Visual C# и Microsoft Visual Basic, но предпочтительным для управления и обработки данных является именно язык T-SQL.

T-SQL — это диалект стандартного языка SQL, который, в свою очередь, является одновременно стандартом Международной организации по стандартизации (International Organization for Standards, ISO) и Американского национального института стандартов (American National Standards Institute, ANSI). Эти два стандарта практически одинаковы для SQL. Данный стандарт SQL продолжает развиваться.

Далее приведен список главных версий языка SQL до настоящего времени:

SQL-86;

SQL-89;

SQL-92;

SQL:1999;

SQL:2003;

SQL:2006;

SQL:2008;

SQL:2011.

Все ведущие поставщики баз данных, включая Microsoft, реализуют диалект SQL как главный язык для управления и обработки данных в их платформах баз данных.

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

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

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

Например, T-SQL поддерживает два оператора "не равно": и !=. Первый вариант является стандартным, второй — нет. Решение элементарно: используйте стандартный вариант!

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

К ним относятся функции CAST и CONVERT, первая из них является стандартной, вторая — нет. Нестандартная имеет аргумент стиля, не поддерживаемый функцией CAST. Так как CAST — стандартная функция, она должны быть указана как выбор по умолчанию для конвертации. Функцию CONVERT следует выбирать только тогда, когда необходимо использование аргумента стиля.

Основы построения запросов 11 Еще один пример выбора стандартной формы — завершение инструкций T-SQL.

В соответствии со стандартным SQL, инструкции должны завершаться точкой с запятой. Сейчас T-SQL не требует этого для всех инструкций, только в тех случаях, когда возможна неоднозначность элементов кода, как, например, в предложении WITH обобщенного табличного выражения (Common table expression, CTE). Необходимо следовать стандарту и завершать все инструкции точкой с запятой, даже если это не требуется текущей версией.

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

Реляционная модель была создана и предложена Эдгаром Ф. Коддом в 1969 г. С тех пор она разрабатывается и развивается Крисом Дейтом, Хью Дарвеном и др.

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

Отношение в реляционной модели — это то, что в SQL называется таблицей. Эти два понятия не являются синонимами. Можно сказать, что таблица является попыткой SQL представить отношение (в дополнение к переменной отношения, но это неважно в данном контексте). Возможно, это не очень успешная попытка. Хотя SQL основывается на реляционной модели, они имеют множество различий. Но важно иметь в виду, что понимая принципы данной модели, можно использовать SQL, или, точнее говоря, диалект, с которым вы работаете, в реляционном ключе.

Более подробно об этом, в том числе рекомендации читателям, рассказано в разд. "Использование языка T-SQL в соответствии с реляционной теорией" далее в этой главе.

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

Атрибут определяется именем и именем типа. Тело отношения представляет собой множество кортежей (которые SQL пытается представить в виде строк). Каждый заголовок кортежа — это заголовок отношения. Каждое значение атрибута кортежа имеет соответствующий тип.

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

Помните, что заголовок отношения — это набор атрибутов, а его тело — множество кортежей. Что же такое множество? Согласно Георгу Кантору, основателю математической теории множеств, множество определяется следующим образом: "Под множеством понимается объединение в некое целое М определенных и хорошо различимых объектов нашего созерцания либо размышления m, которые называются “элементами” множества М" (Джозеф У. Даубен. Георг Кантор. — Princeton University Press, 1990).

В этом определении заключено несколько очень важных понятий, которые, если в них разобраться, напрямую отразятся на процессе написания кода T-SQL. НаприГлава 1 мер, возьмем слово "целое". Множество должно рассматриваться как единое целое, т. е. взаимодействие осуществляется не с отдельными элементами множества, а с целым множеством.

Давайте рассмотрим термин "хорошо различимых" — множество не содержит дубликатов. Кодд заметил однажды: "Если нечто есть истина, оно не станет более истинным, если повторить это дважды". К примеру, множество{a, b, c} можно рассматривать как равное множеству {a, a, b, c, c, c}.

Другой важный аспект множества не описан явно в вышеупомянутом определении Кантора, скорее, подразумевается — порядок элементов в множестве не имеет значения. Напротив, в последовательности (которая является упорядоченным множеством), например, порядок элементов важен. Комбинация принципов отсутствия дубликатов и независимости от порядка элементов в множестве означает, что множество {a, b, c} равно множеству {b, a, c, c, a, c}.

Еще одна область математики, на которой основывается реляционная модель — это логика предикатов (логика первого порядка). Предикат — это выражение, которое, будучи соотнесенным с некоторым объектом, делает высказывание истинным или ложным. Например, "зарплата более 50 000 долларов" — это предикат. Можно вычислить этот предикат для конкретного работника, получив, таким образом, высказывание. Скажем, у некоего работника зарплата составляет 60 000 долларов. Оценив высказывание для этого работника, мы получим истинное значение. Иными словами, предикат — это параметризованное высказывание.

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

Прежде всего, нужно определить предложения, которые следует сохранить в базе данных. Например, такое: заказ с идентификационным номером 10248 размещен на 12 февраля 2012 г. клиентом с идентификационным номером 7 и обрабатывается сотрудником с идентификационным номером 3. Затем следует создать предикат из этих утверждений, удалив данные и сохранив заголовок. Помните, что заголовок — это множество атрибутов, каждый из которых определяется именем и именем типа.

В данном примере мы имеем orderid INT, orderdate DATE, custid INT и empid INT.

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. На каких областях математики основывается реляционная модель?

2. В чем заключается разница между T-SQL и SQL?

–  –  –

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

К СВЕДЕНИЮ SQL и реляционная теория Подробную информацию о различиях между SQL и реляционной моделью, а также о том, как использовать SQL в реляционной манере можно найти в книге C. J. Date "SQL and Relational Theory, Second Edition" (O’Reilly Media, 2011). Это прекрасная книга, которую следует прочесть всем практически занимающимся базами данных.

Помните, что отношение имеет заголовок и тело. Заголовок представляет собой множество атрибутов, а тело — это множество кортежей. Помните, что, по определению, множество рассматривается как единое целое. Применительно к T-SQL это означает, что следует писать запросы, взаимодействующие с таблицами как единым целым. Необходимо стараться избегать использования итеративных конструкций, таких как курсоры и циклы, которые перебирают строки по одной. Также следует стараться не думать в итерационной манере, поскольку это неизбежно приведет к итерационным решениям.

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

Также необходимо помнить, что множество не имеет дубликатов. Язык T-SQL не всегда следует этому правилу. Например, можно создать таблицу без ключа. В этом случае возможно наличие повторяющихся строк в таблице. Чтобы следовать реляционной теории, надо обеспечить уникальность в таблицах, например, используя первичный ключ или ограничение уникальности.

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

Рассмотрим следующий запрос:

USE TSQL2012;

SELECT country FROM HR.Employees;

–  –  –

Запрос направлен к учебной базе данных TSQL2012. Он возвращает атрибут country для сотрудников, хранящихся в таблице HR.Employees. В соответствии с реляционной моделью, реляционная операция к связи (отношению) должна вернуть связь. В таком случае это должно означать возвращение множества стран, в которых живут сотрудники, с акцентом на множество, как не имеющее дубликатов. Однако T-SQL не удаляет дубликаты по умолчанию. Далее приведен результат этого запроса.

Country

--------------USA USA USA USA UK UK UK USA UK В действительности в языке T-SQL больший упор сделан на теорию мультимножеств, чем на теорию множеств. Мультимножество (также известное как неупорядоченное множество или супермножество) во многих отношениях подобно множеству, но допускает появление дубликатов. Как уже упоминалось, язык T-SQL предоставляет достаточно инструментов, позволяющих при желании следовать реляционной теории. Например, в этом языке есть предложение DISTINCT, позволяющее удалить дубликаты. Далее приведен отредактированный запрос.

SELECT DISTINCT country FROM HR.Employees;

А вот результат отредактированного запроса:Country---------------UKUSA

Другой важнейший аспект множества — порядок элементов — не имеет значения.

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

Таким образом, не предполагается получение результата с каким-то определенным порядком строк, независимо от того, что вы знаете о физическом представлении данных, к примеру, когда данные индексированы.

Рассмотрим в качестве примера следующий запрос.

SELECT empid, lastname FROM HR.Employees;

Основы построения запросов 15

–  –  –

Даже если строки возвращены в другом порядке, результат все равно будет считаться правильным. SQL Server может выбирать между разными методами физического доступа, подразумевая, что нет необходимости обеспечивать определенный порядок в результате запроса. Например, SQL Server мог бы принять решение распараллелить запрос или сканировать данные в порядке их расположения в файле (что противоположно порядку индекса).

Если все-таки требуется обеспечить определенный порядок представления строк в результате, нужно добавить в запросе предложение ORDER BY следующим образом:

SELECT empid, lastname FROM HR.Employees ORDER BY empid;

В этом случае результат не является реляционным — это то, что в стандартном SQL называется курсором. Порядок строк в результате запроса гарантируется атрибутом empid. Результат этого запроса выглядит следующим образом:

empid lastname

------ ------------Davis 2 Funk 3 Lew 4 Peled 5 Buck 6 Suurs 7 King 8 Cameron 9 Dolgopyatova Заголовок отношения — это множество атрибутов, которые должны идентифицироваться именем и именем типа. Для этих атрибутов не существует порядка. Напротив, T-SQL отслеживает порядковые позиции столбцов на основании порядка их появления в определении таблицы. Когда создается запрос с использованием 16 Глава 1

SELECT*, гарантировано получение в результате запроса столбцов в порядке определения. T-SQL также позволяет ссылаться на порядковые позиции столбцов результата в предложении ORDER BY следующим образом:

SELECT empid, lastname FROM HR.Employees ORDER BY 1;

Кроме того, что эта практика не является реляционной, стоит подумать о возможности ошибки, если в какой-то момент вы измените список SELECT и забудете изменить соответственно список ORDER BY. Таким образом, рекомендуется всегда указывать названия атрибутов, которые необходимо упорядочить.

Язык T-SQL имеет еще одно отличие от реляционной модели, позволяющее определять результирующие столбцы на основании выражения без присвоения имени целевому столбцу. Например, следующий запрос допустим в T-SQL.

SELECT empid, firstname + ' ' + lastname FROM HR.Employees;

–  –  –

Но в соответствии с реляционной моделью, все атрибуты должны иметь имена.

Чтобы этот запрос был реляционным, необходимо назначить псевдоним (алиас) целевому атрибуту.

Это можно сделать, используя предложение AS, как показано в следующем примере:

SELECT empid, firstname + ' ' + lastname AS fullname FROM HR.Employees;

Кроме того, T-SQL позволяет запросу возвращать несколько результирующих столбцов с одним и тем же именем. Например, рассмотрим объединение двух таблиц, T1 и T2, каждая из которых имеет столбец с именем keycol.

В T-SQL возможно наличие списка SELECT, который выглядит следующим образом:

SELECT T1.keycol, T2.

keycol...

Чтобы результат был реляционным, все атрибуты должны иметь уникальные имена, поэтому необходимо использовать разные псевдонимы для выходных атрибутов, как в следующем примере:

SELECT T1.keycol AS key1, T2.

keycol AS key2...

Основы построения запросов 17 Что касается предикатов, в соответствии с законом исключенного среднего в математической логике, предикат может принимать значение "истина" или "ложь". Иными словами, предполагается, что предикаты используют двузначную логику. Однако Кодд хотел отразить в своей модели возможность для значений отсутствовать. Он упоминает два вида отсутствующих значений: отсутствующие, но применимые, и отсутствующие, но неприменимые. Возьмем в качестве примера атрибут сотрудника mobilephone. Отсутствующее, но применимое значение будет в том случае, если сотрудник имеет мобильный телефон, но не хочет предоставлять информацию о нем, скажем, из соображений конфиденциальности. Отсутствующее, но неприменимое значение будет тогда, когда сотрудник просто не имеет мобильного телефона. По Кодду, язык, основанный на его модели, должен предоставлять два разных маркера для этих двух случаев. Еще раз: язык T-SQL, основанный на стандартном языке SQL, реализует только один маркер общего назначения, который называется NULL, для любого вида отсутствующих значений. Это ведет уже к троичной логике предикатов. А именно, когда предикат сравнивает два значения, например, мобильные номера mobilephone = '(425) 555-0136'. Если присутствуют оба номера, результатом будет либо истина, либо ложь. Но если один из них равен NULL, результат даст значение троичной логики — неизвестную величину.

Следует заметить, что некоторые считают, будто правильная реляционная модель должна следовать двузначной логике. Но как уже упоминалось, создатель реляционной модели верил в идею поддержки отсутствующих значений и предикатов, что выходит за пределы двузначной логики. Особенно важно с точки зрения написания кода на языке T-SQL понять, что если база данных, к которой создаются запросы, поддерживает NULL-значения, их обработка далеко не тривиальна. Таким образом, следует очень хорошо понимать, что происходит, когда данные, которыми вы манипулируете с помощью различных конструкций запросов, таких как фильтрация, сортировка, группировка, объединение или пересечение, включают NULL-значения.

Следовательно, при написании каждого фрагмента кода на T-SQL надо спросить себя, возможно ли присутствие NULL-значений в данных, с которыми вы будете взаимодействовать. Если да, вы должны быть уверены в том, что понимаете использование NULL-значений в вашем запросе и что ваши тесты специально направлены на проверку NULL-значений.

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Назовите два аспекта, в которых T-SQL отклоняется от реляционной модели.

2. Объясните, как можно обойти эти два аспекта в первом вопросе и использовать T-SQL в реляционной манере.

–  –  –

Использование правильной терминологии Понимание терминологии влияет на знания, поэтому следует приложить все необходимые усилия, чтобы понять и использовать правильную терминологию. Часто при обсуждении связанных с T-SQL тем используется неверная терминология. Но даже правильно понимая терминологию, необходимо хорошо чувствовать разницу между одними и теми же терминами в T-SQL и в реляционной модели.

Вот пример неправильной терминологии в T-SQL. Термины "поле" (field) и "запись" (record) для обозначения того, что в T-SQL называется "столбец" (column) и "строка" (row) соответственно. Поля и записи — это физические понятия. Поля — это то, что отображается в пользовательском интерфейсе в клиентских приложениях, а записи — это то, что имеется в файлах и курсорах. Таблицы являются логическими структурами и имеют логические строки и столбцы.

Еще один пример неверной терминологии связан с "NULL-величинами". NULL — это обозначение отсутствующего значения, а не собственно величины. Поэтому правильное использование этого термина — "NULL-маркер" или просто NULL.

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

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Почему термины "поле" и "запись" некорректны применительно к столбцу и строке?

2. Почему термин "NULL-значение" некорректен?

Ответы на контрольные вопросы

1. Потому что "поле" и "запись" описывают физические понятия, тогда как столбцы и строки являются логическими элементами таблицы.

2. Потому что NULL не является величиной, напротив, это указание отсутствующего значения.

ПРАКТИКУМ Использование языка T-SQL в соответствии с реляционной теорией В этом практикуме вы проверите ваши знания об использовании языка T-SQL в соответствии с реляционной теорией.

–  –  –

1. Откройте SQL Server Management Studio (SSMS) и подключитесь к учебной базе данных TSQL201.

2. Введите следующий запрос в окне запросов и выполните его:

SELECT custid, YEAR(orderdate) FROM Sales.Orders ORDER BY 1, 2;

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

Custid

--- -----Проанализируйте код и выходной результат. Предполагается, что запрос возвратит для каждого клиента и года заказа ID этого клиента (custid) и год заказа (YEAR(orderdate)). Обратите внимание, что в запросе отсутствует требование упорядочения представления. Укажите нереляционные аспекты данного запроса.

Ответ. Запрос не присваивает псевдоним выражению YEAR(orderdate), поэтому результирующий атрибут не имеет имени. Запрос может возвращать дубликаты.

В запросе определено упорядочивание результата и используются порядковые позиции в предложении ORDER BY.

Задание 2. Преобразуйте нереляционный запрос в реляционный Здесь в качестве исходного используйте запрос из задания 1.

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

В шаге 3 задания 1 вы перечислили нереляционные элементы последнего запроса.

Внесите изменения в запрос так, чтобы он стал реляционным.

Для того чтобы сделать данный запрос реляционным, необходимо внести несколько изменений.

1. Определите имя атрибута, назначив псевдоним выражению YEAR(orderdate).

2. Добавьте предложение DISTINCT для удаления дубликатов.

3. Также удалите предложение ORDER BY для возвращения реляционного результата.

20 Глава 1

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

SELECT DISTINCT custid, YEAR(orderdate) AS orderyear FROM Sales.Orders;

Резюме занятия Язык T-SQL имеет строгие математические основы. Он основывается на стандартном SQL, который, в свою очередь, основывается на реляционной модели, в свою очередь основывающейся на теории множеств и логике предикатов.

Важно понимать принципы реляционной модели и применять их при написании кода T-SQL.

При описании концепций в T-SQL необходимо использовать правильную терминологию, поскольку это влияет на ваши знания.

Закрепление материала Для проверки знания материала, изложенного в данном занятии, ответьте на следующие вопросы. Ответы на эти вопросы и пояснения, почему тот или иной ответ верен или неверен, можно найти в приложении "Ответы" в конце книги.

1. Почему важно использовать стандартный SQL-код, где это возможно, и знать, какой код является стандартным, а какой — нет? (Выберите все подходящие варианты.) A. Написание кода с использованием стандартного SQL не является важным.

B. Стандартный SQL-код более переносим между платформами.

C. Стандартный SQL-код является более официальным.

D. Знание, что такое стандартный SQL-код, делает ваши знания более платформенно-независимыми.

2. Что из нижеперечисленного не противоречит реляционной модели?

A. Использование порядковых позиций для столбцов.

B. Возвращение дубликатов строк.

C. Не указание ключа в таблице.

D. Обеспечение того, чтобы все атрибуты в результате запроса имели имена.

3. Какое взаимоотношение существует между SQL и T-SQL?

A. T-SQL является стандартным языком, а SQL — это диалект, используемый в Microsoft SQL Server.

B. SQL является стандартным языком, а T-SQL — это диалект, используемый в Microsoft SQL Server.

Основы построения запросов 21 C. И SQL, и T-SQL являются стандартными языками.

D. И SQL, и T-SQL являются диалектами, используемыми в Microsoft SQL Server.

Занятие 2. Понимание логической обработки запросов У языка T-SQL имеется как физическая, так и логическая сторона.

Логическая сторона — это концептуальная интерпретация запроса, которая объясняет, что является корректным результатом запроса. Физическая сторона — это обработка запроса ядром базы данных (компонентом Database Engine). Физическая обработка должна дать результат, определенный логической обработкой запроса. Для достижения этой цели ядро базы данных может использовать оптимизацию. Оптимизация способна изменить последовательность шагов логической обработки запроса или удалить их вовсе, но только при условии, что результат остается тем, который определен логической обработкой запроса. Данное занятие посвящено логической обработке запросов — концептуальной интерпретации запроса, определяющей правильный результат.

Изучив материал этого занятия, вы сможете:

Понимать логику конструирования языка T-SQL Описать основные этапы логической обработки запросов Объяснить причины некоторых ограничений, принятых в T-SQL Продолжительность занятия — 90 минут.

T-SQL как декларативный англо-подобный язык Язык T-SQL, основой которого является стандартный SQL, является декларативным языком, подобным английскому языку. В этом языке "декларативный" означает, что вы определяете то, что вам нужно, в противоположность императивным языкам, которые также определяют, как достичь того, что вам нужно. Стандартный SQL описывает логическую интерпретацию декларативного запроса (часть "что"), тогда как за выяснение того, как физически обработать запрос (часть "как"), отвечает компонент Database Engine.

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

22 Глава 1 Интересно отметить, что стандартный язык SQL изначально так не назывался, его название звучало как SEQUEL, сокращение от "Structured English QUery Language" (структурированный английский язык запросов). Но затем, в результате несогласия с одной из авиакомпаний по поводу торговой марки, язык был переименован в SQL, что означает Structured Query Language (язык структурированных запросов).

Тем не менее остается фактом, что инструкции составляются в англо-подобной манере. Например, рассмотрим инструкцию "Bring me a soda from the refrigerator" (принесите мне содовой воды из холодильника). Отметим, что в этой инструкции на английском языке объект стоит перед местоположением.

Теперь рассмотрим следующий запрос на языке T-SQL:

SELECT shipperid, phone, companyname FROM Sales.Shippers;

Обратите внимание на сходство между последовательностью элементов в запросе и английским языком. Запрос сначала указывает список SELECT с атрибутами, которые необходимо возвратить, а затем идет предложение FROM с таблицей, к которой направлен запрос.

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

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

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

FROM Sales.Shippers SELECT shipperid, phone, companyname Это элементарный пример запроса всего лишь с двумя предложениями. Разумеется, реальность может быть значительно сложнее. Если вы хорошо разберетесь в принципах логической обработки запросов, вы сможете объяснить многое в способах поведения языка, что в противном случае сделать очень сложно.

Этапы логической обработки запросов Данный раздел рассматривает логическую обработку запросов и ее этапы. Не стоит беспокоиться, если некоторые принципы, обсуждаемые в этом разделе, не вполне понятны. Последующие главы данного учебного курса содержат более подробные описания, так что после ознакомления с ними изложенный в данном разделе материал станет более понятным. Чтобы полностью разобраться в этих принципах, ознакомьтесь с данным разделом сейчас и затем снова вернитесь к нему после изучения материала глав 2—5.

Главная инструкция, используемая для извлечения данных в языке T-SQL, — это инструкция SELECT.

Далее приведены основные предложения, указанные в порядке, в котором они будут вводиться (известном как "порядок ввода с клавиатуры"):

Основы построения запросов 23

1. SELECT.

2. FROM.

3. WHERE.

4. GROUP BY.

5. HAVING.

6. ORDER BY.

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

Далее приведена логическая последовательность обработки запросов шести основных предложений запросов:

1. FROM.

2. WHERE.

3. GROUP BY.

4. HAVING.

5. SELECT.

6. ORDER BY.

Каждый этап работает с одной или более таблицами на входе и возвращает виртуальную таблицу на выходе. Выходная таблица одного этапа рассматривается как входная для следующего этапа. Это полностью согласуется с операциями на отношении, которые дают в результате отношение. Обратите внимание, если указано предложение ORDER BY, результат не является реляционным. Этот факт имеет последствия, которые будут обсуждены позже в данном учебном курсе, в главах 3 и 4.

В качестве примера рассмотрим следующий запрос:

SELECT country, YEAR(hiredate) AS yearhired, COUNT(*) AS numemployees FROM HR.Employees WHERE hiredate = '20030101' GROUP BY country, YEAR(hiredate) HAVING COUNT(*) 1 ORDER BY country, yearhired DESC;

Это запрос к таблице HR.Employees. Он выводит лишь служащих, которые были приняты на работу в 2003 году или позже. Служащие группируются по стране и году найма. Рассматриваются только группы с двумя и более сотрудниками. Для каждой группы запрос возвращает год найма на работу и количество работников, отсортированные по стране и году приема на работу в порядке убывания.

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

–  –  –

торы соединения. Если нужно создать запрос к одной таблице, в этом предложении имя таблицы указывается как входная таблица. На выходе этой фазы будет таблица, содержащая все строки из входной таблицы. Именно так получилось в следующем запросе: на входе мы имеем таблицу HR.Employees (9 строк), и на выходе также таблица, содержащая все 9 строк (показана только часть атрибутов).

empid hireid country

------ ----------- -------USA 2 2002-08-14 USA 3 2002-04-01 USA 4 2003-05-03 USA 5 2003-10-17 UK 6 2003-10-17 UK 7 2004-01-02 UK 8 2004-03-05 USA 9 2004-11-15 UK

2. Фильтрация строк на основании предложения WHERE На следующем этапе выполняется фильтрация строк в соответствии с предикатом в предложении WHERE. Возвращаются только строки, для которых предикат имеет значение true.

СОВЕТ Подготовка к экзамену Строки, в которых предикат имеет значение "ложь" или возвращает неизвестное состояние, не возвращаются.

В данном запросе на этапе фильтрации WHERE фильтруются только строки для служащих, принятых на работу 1 января 2003 года или позже. На этом этапе возвращается 6 строк, которые являются входом для следующего этапа. Далее приведен результат данного этапа.

empid hiredate country

------ ----------- -------USA 5 2003-10-17 UK 6 2003-10-17 UK 7 2004-01-02 UK 8 2004-03-05 USA 9 2004-11-15 UK Типичная ошибка людей, не понимающих логической обработки запросов, — попытка обратиться в предложении WHERE к псевдониму столбца, определенному в предложении SELECT. Это недопустимо, потому что предложение WHERE вычисляется раньше предложения SELECT. Рассмотрим в качестве примера следующий запрос:

SELECT country, YEAR(hiredate) AS yearhired FROM HR.Employees WHERE yearhired = 2003;

Основы построения запросов 25 Запрос не выполняется и возвращает следующую ошибку.

Msg 207, Level 16, State 1, Line 3 Invalid column name 'yearhired'.

Если вы понимаете, что предложение WHERE оценивается перед предложением SELECT, вам понятно, что это неверный запрос, поскольку на этом этапе атрибут yearhired еще не существует. Вы можете указать выражение YEAR(hiredate) = 2003 в предложении WHERE. Будет еще лучше, если с целью оптимизации, которая обсуждается в главах 3 и 15, вы используете выражение hiredate = '20030101', как это сделано в исходном запросе.

–  –  –

Как видите, группе UK, 2003 сопоставлены две строки детализации, содержащие служащих с идентификаторами 5 и 6; группе UK, 2004 также соответствуют две строки детализации, для сотрудников с идентификаторами 7 и 9; группа USA, 2003 имеет одну сопоставленную ей строку с сотрудником номер 4; группе USA, 2004 тоже соответствует одна строка детализации, содержащая сотрудника номер 8.

Конечный результат этого запроса содержит одну строку, представляющую каждую группу (без учета фильтрации). Таким образом, выражения на всех этапах после данного этапа группировки имеют определенные ограничения. Все выражения, обрабатываемые на последующих этапах, должны гарантировать одно значение на группу. При ссылке на элемент из списка GROUP BY (например, country) такая гарантия уже имеется, и поэтому такая ссылка разрешена. Но если требуется ссылка на элемент, не являющийся частью нашего списка GROUP BY (к примеру, empid), он должен содержаться в какой-либо из агрегатных функций, таких как MAX или SUM.

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

26 Глава 1

4. Фильтрация строк с помощью предложения HAVING Этот этап также отвечает за фильтрацию строк на основе предиката, но он оценивается после того, как данные сгруппированы; следовательно, он оценивается по каждой группе и выполняет фильтрацию групп как единого целого. Как это принято в языке T-SQL, фильтрующий предикат может принимать значение "истина", "ложь" или "неизвестно". На этом этапе возвращаются только группы, для которых предикат принимает значение "истина". В этом случае предложение HAVING использует предикат COUNT(*) 1, что означает фильтрацию по стране и году найма на работу только групп, имеющих более одного сотрудника. Если вы посмотрите на количество строк, сопоставленных каждой группе на предыдущем шаге, вы заметите, что остались только группы UK, 2003 и UK, 2004. Следовательно, результатом этого этапа будут следующие оставшиеся группы, показанные далее вместе с сопоставленными им строками детализации.

group group detail detail detail country YEAR(hiredate) empid country hiredate

------- -------------- ------ -------- ----------UK 2003 5 UK 2003-10-17 6 UK 2003-10-17 UK 2004 7 UK 2004-01-02 9 UK 2004-11-15

КОНТРОЛЬНЫЙ ВОПРОС

В чем заключается разница между предложениями WHERE и HAVING?

Ответ на контрольный вопрос Предложение WHERE оценивается до группировки строк, и поэтому оно оценивается построчно. Предложение HAVING оценивается после того, как строки сгруппированы, и, следовательно, оценивается для группы.

5. Обработка предложения SELECT Пятым является этап, ответственный за обработку запроса SELECT. Интересно, что в процессе логической обработки запроса он оценивается почти последним. Это любопытно, учитывая, что предложение SELECT стоит первым в запросе.

Этот этап состоит из двух основных шагов. Первый шаг — оценка выражений в списке SELECT и создание результирующих атрибутов. Сюда входит присвоение атрибутам имен, если они являются производными от выражений. Помните, что если это группированный запрос, каждая группа представлена в результате единственной строкой. В нашем запросе после обработки фильтра HAVING остались 2 группы. Таким образом, данный шаг генерирует две строки. В этом случае список SELECT возвращает для каждой группы "страна — год заказа" строку, имеющую следующие атрибуты: country, YEAR(hiredate) с псевдонимом yearhired и COUNT(*) с псевдонимом numemployees.

Основы построения запросов 27 Следующий шаг на этом этапе возникает, если указано предложение DISTINCT;

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

country yearhired numemployees

-------- ---------- -----------UK 2003 2 UK 2004 2 Если вы хотите вспомнить, как выглядит наш запрос, мы привели его здесь еще раз.

SELECT country, YEAR(hiredate) AS yearhired, COUNT(*) AS numemployees FROM HR.Employees WHERE hiredate = '20030101' GROUP BY country, YEAR(hiredate) HAVING COUNT(*) 1 ORDER BY country, yearhired DESC;

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

Также необходимо помнить, что этот этап присваивает псевдонимы столбцам:

yearhired и numemployees. Это означает, что вновь создаваемые псевдонимы столбцов не видны предложениям, обрабатываемым на предыдущих этапах, таким как FROM, WHERE, GROUP BY и HAVING.

Обратите внимание, что псевдоним, созданный на этапе SELECT, даже невидим для других выражений, которые появляются в том же списке SELECT.

Например, следующий запрос является неверным:

SELECT empid, country, YEAR(hiredate) AS yearhired, yearhired – 1 AS prevyear FROM HR.Employees;

Этот запрос генерирует следующую ошибку:

Msg 207, Level 16, State 1, Line 1 Invalid column name 'yearhired'.

Причина, по которой это невозможно, заключается в том, что концептуально язык T-SQL оценивает все выражения, появляющиеся на том же самом этапе логической обработки запроса, одновременно. Обратите внимание на слово "концептуально".

SQL Server не обязательно будет физически обрабатывать все выражения в один и тот же момент времени, но результат должен быть таким, как если бы он это делал.

Такое поведение отличается от поведения других языков программирования, в коГлава 1 торых выражения, как правило, рассчитываются справа налево, делая результат, сгенерированный в одном выражении, видимым выражению, появляющемуся справа от него. Но язык T-SQL отличается от них.

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Почему нельзя обращаться к псевдониму столбца, определенному предложением SELECT в предложении WHERE?

2. Почему нельзя обращаться к псевдониму столбца, определенному предложением SELECT в том же самом предложении SELECT?

Ответы на контрольные вопросы

1. Потому что предложение WHERE логически оценивается на этапе, предшествующем этапу, который оценивает предложение SELECT.

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

6. Управление сортировкой представления Данный этап возможен, если в запросе используется предложение ORDER BY. Этот этап отвечает за возвращение результата в определенном порядке представления в соответствии с выражениями из списка ORDER BY. Запрос указывает, что результирующие строки должны быть сначала отсортированы по стране (по умолчанию, в порядке возрастания) и затем по убыванию значения yearhired, давая следующий результат:

Country yearhired numemployees

-------- ---------- -----------UK 2004 2 UK 2003 2 Заметьте, что предложение ORDER BY является первым и единственным предложением, которое имеет право ссылаться на псевдонимы столбцов, определенные в предложении SELECT. Причина этого в том, что предложение ORDER BY — единственное, которое оценивается после предложения SELECT.

В отличие от предыдущих этапов, где результат был реляционным, выходные данные этого этапа не являются реляционными из-за гарантированной сортировки. Результат этого этапа в стандартном языке SQL называется курсором. Обратите внимание, использование в данном контексте термина "курсор" является концептуальным. Язык T-SQL также поддерживает объект, называемый курсором, который определяется на основании результата запроса, и это позволяет выбирать строки по одной в указанном порядке.

Вам может быть важно возвращение результата запроса в определенной последовательности для удобства представления или если вызывающая сторона должна использовать результат посредством некоторого механизма курсора, который выбирает строки по одной. Но следует помнить, что такая обработка не является реляционной. Если необходима обработка результата запроса в реляционной манере — Основы построения запросов 29 например, надо определить на основании запроса табличное выражение типа представления (подробнее об этом написано в главе 4), результат должен будет быть реляционным. Сортировка данных также может повысить затраты на обработку запроса. Если для вас не имеет значения последовательность, в которой возвращаются результирующие строки, можно избежать этих необязательных затрат, просто не добавляя предложение ORDER BY.

В запросе могут быть указаны параметры фильтра TOP или OFFSET-FETCH. Если они указаны, то же самое предложение ORDER BY, которое обычно используется для определения сортировки представления, также определяет, какие строки фильтровать для этих параметров. Важно отметить, что такой фильтр обрабатывается после того, как этап SELECT оценивает все выражения и удаляет дубликаты (при условии, что было указано предложение DISTINCT). Можно даже считать, что фильтры TOP и OFFSET-FETCH обрабатываются на своем собственном этапе с номером 7. В рассматриваемом запросе не указан такой фильтр, и, таким образом, эта фаза неприменима в этом случае.

ПРАКТИКУМ Логическая обработка запроса В данном практикуме вам предстоит применить знания о логической обработке запросов.

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

1. Откройте SQL Server Management Studio (SSMS) и подключитесь к учебной базе данных TSQL2012.

2. Введите следующий запрос в окне запросов и выполните его.

SELECT custid, orderid FROM Sales.Orders GROUP BY custid;

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

3. Запрос не выполнился, поскольку величина orderid не указана ни в списке GROUP BY, ни в агрегатной функции. Существует несколько возможных значений orderid для клиента. Для исправления запроса нужно применить агрегатную функцию к атрибуту orderid. Задача запроса — возвратить максимальное значение orderid на клиента. Следовательно, нужно использовать агрегатную функцию MAX. Запрос должен выглядеть следующим образом:

SELECT custid, MAX(orderid) AS maxorderid FROM Sales.Orders GROUP BY custid;

30 Глава 1 Задание 2. Устранение проблемы с присвоением псевдонима В этом задании вам предлагается другой запрос, завершившийся ошибкой, причиной которой на этот раз стала проблема с присвоением псевдонима. Так же как и в первом задании, представлены инструкции по исправлению этого запроса.

1. Очистите окно запросов, введите следующий запрос и выполните его.

SELECT shipperid, SUM(freight) AS totalfreight FROM Sales.Orders WHERE freight 20000.00 GROUP BY shipperid;

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

2. Помните, что фильтр WHERE оценивается построчно — не по группе. Запрос фильтрует индивидуальные заказы со стоимостью поставки более 20 000, а таких не существует. Для исправления запроса нужно применить фильтр по каждой группе грузоотправителей, а не по каждому заказу. Необходима фильтрация полной стоимости поставки на грузоотправителя. Достигнуть этого можно с помощью фильтра HAVING. Попробуйте устранить проблему, используя следующий запрос:

SELECT shipperid, SUM(freight) AS totalfreight FROM Sales.Orders GROUP BY shipperid HAVING totalfreight 20000.00;

Но этот запрос также завершается ошибкой. Постарайтесь определить причину этого и что необходимо сделать для достижения желаемого результата.

3. На этот раз проблема заключается в том, что запрос пытается обратиться в предложении HAVING к псевдониму totalfreight, который определен в предложении SELECT. Предложение HAVING оценивается перед предложением SELECT, поэтому псевдоним столбца невидим для него. Для устранения неисправности нужно обратиться к выражению SUM(freight) в предложении HAVING следующим образом:

SELECT shipperid, SUM(freight) AS totalfreight FROM Sales.Orders GROUP BY shipperid HAVING SUM(freight) 20000.00;

–  –  –

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

Понимание логической обработки запросов является исключительно важным для правильного понимания языка T-SQL.

Закрепление материала Для проверки знания материала, изложенного в данном занятии, ответьте на следующие вопросы. Ответы на эти вопросы и пояснения, почему тот или иной ответ верен или неверен, можно найти в приложении "Ответы" в конце книги.

1. Какой из указанных вариантов правильно представляет порядок логической обработки запросов для различных предложений запросов?

A. SELECT FROM WHERE GROUP BY HAVING ORDER BY.

B. FROM WHERE GROUP BY HAVING SELECT ORDER BY.

C. FROM WHERE GROUP BY HAVING ORDER BY SELECT.

D. SELECT ORDER BY FROM WHERE GROUP BY HAVING.

2. Какой вариант является неправильным? (Выберите все подходящие варианты.) A. Ссылка на атрибут, который сгруппирован в предложении WHERE.

B. Ссылка на выражение в предложении GROUP BY; например, GROUP BY YEAR(orderdate).

C. В запросе с группировкой ссылка в списке SELECT на атрибут, который не является частью списка GROUP BY и не входит в агрегатную функцию.

D. Ссылка на псевдоним, определенный в предложении SELECT, в предложении HAVING.

3. Что справедливо для результата запроса, не содержащего предложение ORDER BY?

A. Он является реляционным, если другие требования реляционности соблюдены.

B. Он не может иметь дубликатов.

C. Гарантирует ту же последовательность строк в выходных данных, что и последовательность ввода.

D. Гарантирует ту же последовательность строк в выходных данных, что и в кластеризованном индексе.

–  –  –

Упражнение 1. Важность знания теории Вы и ваш коллега по команде вступили в дискуссию о важности понимания теоретических основ языка T-SQL. Ваш коллега возражает вам, что понимание этих основ не имеет никакого значения и для того, чтобы быть хорошим разработчиком и писать правильный код, достаточно изучить технические аспекты T-SQL.

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

1. Можете ли вы привести пример элемента теории множеств, который может улучшить ваше понимание языка T-SQL?

2. Можете ли вы объяснить, почему понимание реляционной модели важно для тех, кто пишет код на языке T-SQL?

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

Ответьте на следующие вопросы, заданные вам вашим интервьюером:

1. Важно ли использовать стандартный код, когда это возможно, и почему?

2. У нас есть много запросов, использующих порядковые номера в предложении ORDER BY. Является ли это плохой практикой и, если так, почему?

3. Если в запросе нет предложения ORDER BY, в каком порядке будут возвращены записи?

4. Считаете ли вы правильным использование предложения DISTINCT в каждом запросе?

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

Просмотр общедоступных новостных групп по тематике T-SQL и анализ кода Для тренировки применения знаний об использовании языка T-SQL в реляционной манере вам необходимо проанализировать фрагменты кода, написанные другими.

Задание 1. Перечислите как можно больше примеров вариантов кодирования на языке T-SQL, которые не являются реляционными.

Задание 2. После того как вы создали список в задании 1, посетите общественный форум Microsoft по T-SQL по адресу http://social.

msdn.microsoft.com/ Основы построения запросов 33 Forums/en/transactsql/threads. Проанализируйте фрагменты кода в обсуждениях по T-SQL. Попытайтесь определить случаи, где используются нереляционные элементы. Если такие найдутся, укажите, что нужно изменить, чтобы сделать их реляционными.

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

Задание 1. Создайте документ, содержащий нумерованный список этапов логической обработки запросов в правильной последовательности.

Дайте краткое описание того, что происходит на каждом шаге.

Задание 2. Создайте функциональную диаграмму, представляющую последовательность этапов логической обработки запросов с помощью Microsoft Visio, Microsoft PowerPoint или Microsoft Word.

ГЛАВА Начало работы с инструкцией SELECT Темы экзамена Работа с данными.

• Запрос данных с помощью инструкций SELECT.

• Реализация типов данных.

Модификация данных.

• Использование функций.

Предыдущая глава была посвящена знакомству с основными понятиями языка T-SQL. В данной главе мы сначала рассмотрим два основных предложения, используемых в запросах, — FROM и SELECT. Затем перейдем к типам данных, поддерживаемых Microsoft SQL Server, и обоснованию выбора подходящих типов данных для столбцов. Кроме того, мы поговорим об использовании встроенных скалярных функций, выражения CASE и вариаций, таких как ISNULL и COALESCE.

ПРЕЖДЕ ВСЕГО

Для полного освоения этой главы необходимо иметь:

опыт работы с SQL Server Management Studio (SSMS);

некоторый опыт в написании кода на языке T-SQL;

доступ к экземпляру SQL Server 2012 с установленной учебной базой данных TSQL2012.

Занятие 1. Использование предложений FROM и SELECT Предложения FROM и SELECT — две основные инструкции, появляющиеся почти в каждом запросе, целью которого является извлечение данных.

В этом занятии Начало работы с инструкцией SELECT 35 рассматривается назначение этих предложений, их использование и связанные с ними рекомендации.

Изучив материал этого занятия, вы сможете:

Составлять запросы с использованием предложений FROM и SELECT Определять псевдонимы таблиц и столбцов Разбираться в оптимальных методах использования предложений FROM и SELECT Продолжительность занятия — 30 минут.

Предложение FROM В соответствии с логической обработкой запросов (см. подробное описание концепции в главе 1), предложение FROM — это первое предложение, которое должно оцениваться логически в запросе SELECT.

У предложения FROM две главные роли:

в этом предложении указываются таблицы, к которым будет направлен запрос;

в этом предложении к входным таблицам могут быть применены табличные операторы, такие как соединения.

Данная глава посвящена первой роли. В главах 4 и 5 рассматривается использование табличных операторов. Предполагая, что вы подключены к учебной базе данных TSQL2012, рассмотрим в качестве базового запроса следующий, использующий предложение FROM для того, чтобы указать, что таблица HR.Employees является запрашиваемой таблицей.

SELECT empid, firstname, lastname FROM HR.Employees;

Обратите внимание на использование для обращения к таблице имени, состоящего из двух частей. Первая часть (HR) — это название схемы, вторая часть (Employees) представляет собой имя таблицы. В некоторых случаях T-SQL поддерживает формат с опущенным именем схемы, например FROM Employees, при этом используется неявная схема процесса разрешения имен. Считается хорошей практикой всегда явно указывать имя схемы. В таком случае вам не грозит в итоге прийти к имени схемы, которую вы не планировали использовать, также можно избавиться от затрат, пусть даже небольших, сопровождающих процесс неявного разрешения имен.

В предложении FROM можно задавать запрашиваемым таблицам произвольные имена. Можно использовать для этого форму таблица псевдоним как в выражении HR.Employees E или таблица AS псевдоним как в выражении HR.Employees AS E.

Последний формат лучше читается. Существует соглашение, в соответствии с которым при использовании псевдонимов следует употреблять короткие имена; как правило, это одна буква, которая каким-то образом обозначает запрашиваемую таблицу, например E для Employees.

Причины, по которым может возникнуть желание присваивать псевдонимы таблицам, раскрывается в главе 4. Пока вам достаточно знать, что язык T-SQL поддерживает такие псевдонимы таблиц и синтаксис для их присвоения.

36 Глава 2 Помните, что назначив таблице псевдоним, вы фактически переименовываете таблицу на время запроса. Первоначальное имя таблицы становится невидимым, доступен только ее псевдоним. Как правило, можно перед именем столбца, на который ссылаются, ставить имя таблицы, как в случае Employees.empid.

Однако если таблице Employees присвоен псевдоним E, ссылка Employees.empid является некорректной.

Необходимо использовать выражение E.empid, как показано в следующем примере:

SELECT E.empid, firstname, lastname FROM HR.Employees AS E;

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

Как уже упоминалось ранее, в главе 4 подробно рассказано, почему необходимы псевдонимы таблиц.

Предложение SELECT

Предложение SELECT играет две главные роли в запросе:

оценивает выражения, которые определяют выражения в результате запроса, присваивая им при необходимости псевдонимы;

используя предложение DISTINCT, можно при необходимости избежать дублирования строк в результате запроса.

Начнем с первой роли. В качестве примера рассмотрим следующий запрос:

SELECT empid, firstname, lastname FROM HR.Employees;

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

Язык T-SQL поддерживает использование звездочки (*) как альтернативы перечисления всех атрибутов из входных таблиц, но по ряду причин это считается плохим решением. Часто требуется возвратить только поднабор входных атрибутов, и использование звездочки может быть вызвано только ленью. Возвращая больше атрибутов, чем нужно, вы помешаете SQL Server использовать в отношении интересующего набора атрибутов то, что называют покрывающими индексами. Кроме того, через сеть отправляется больше данных, чем требуется, что вполне может оказать негативное влияние на производительность системы. В дополнение к сказанному, определение базовой таблицы может измениться со временем, и даже если при первоначальном написании запроса * действительно представляла все требуемые атрибуты, позднее это может быть совсем не так. Учитывая эти и другие причины, мы рекомендуем всегда явно перечислять требуемые атрибуты.

В предложении SELECT можно присвоить собственные псевдонимы выражениям, которые определяют результирующие атрибуты. Существует несколько поддерживаемых форм создания псевдонимов: выражение AS псевдоним как в случае empid Начало работы с инструкцией SELECT 37 AS employeeid, выражение псевдоним как в случае empid employeeid и псевдоним = выражение как в случае employeeid = empid.

РЕАЛЬНЫЙ МИР Предпочтительный способ создания псевдонима Мы считаем предпочтительным использование первой формы с предложением AS, поскольку она является стандартной и к тому же более читаемой. Вторая форма не только хуже читается, но и затрудняет нахождение ошибок в коде.

Рассмотрим следующий запрос:

SELECT empid, firstname lastname FROM HR.Employees;

Разработчик, написавший запрос, предполагал, что будут возвращены атрибуты empid, firstname и lastname, но пропустил запятую между firstname и lastname.

Запрос не выдал ошибку, но возвратил следующий результат:

empid lastname

----------- ---------Sara 2 Don 3 Judy...

Вопреки намерениям автора, SQL Server интерпретировал запрос как присвоение псевдонима lastname атрибуту firstname вместо того, чтобы возвратить оба. Если вы привыкли присваивать псевдонимы выражениям в форме с пробелом, локализовать такие ошибки вам будет сложно.

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

Например, если нужно дать результирующему атрибуту имя employeeid вместо empid, как показано в следующем примере:

SELECT empid AS employeeid, firstname, lastname FROM HR.Employees;

Другой случай использования псевдонимов — назначить имя атрибуту, получившемуся из выражения, который в противном случае был бы безымянным. Например, предположим, что нужно сгенерировать результирующий атрибут из выражения путем конкатенации атрибута firstname, пробела и атрибута lastname.

Для этого можно использовать следующий запрос:

SELECT empid, firstname + N' ' + lastname FROM HR.Employees;

–  –  –

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

SELECT empid, firstname + N' ' + lastname AS fullname FROM HR.Employees;

Далее приведен сокращенный вариант результата этого запроса.

empid fullname

------ ------------------------------Sara Davis 2 Don Funk 3 Judy Lew...

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

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

SELECT DISTINCT country, region, city FROM HR.Employees;

–  –  –

Существует интересное различие между стандартным языком SQL и T-SQL с точки зрения минимальных требований запроса SELECT. В соответствии со стандартным языком SQL, запрос должен иметь как минимум предложения FROM и SELECT. Напротив, T-SQL поддерживает запрос SELECT, содержащий только предложение SELECT без предложения FROM. Можно себе представить такой запрос, как если бы он был направлен к воображаемой таблице, состоящей всего из одной строки. Например, приведенный далее запрос является неправильным с точки зрения стандартного SQL, но вполне корректен для T-SQL.

SELECT 10 AS col1, 'ABC' AS col2;

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

col1 col2

----------- ---ABC Начало работы с инструкцией SELECT 39 Разделение идентификаторов При ссылке на идентификаторы атрибутов, схем, таблиц и других объектов возможны случаи, когда требуется использовать разделители, и случаи, когда использование разделителей является необязательным.

T-SQL поддерживает обе формы разделения идентификаторов: стандартную, с использованием двойных кавычек, как в выражении "Sales"."Orders", а также частную форму с использованием квадратных скобок, как в выражении [Sales].[Orders].

Если идентификатор "регулярный", использование разделителей необязательно.

В случае регулярного идентификатора он соответствует правилам форматирования идентификаторов. Эти правила говорят о том, что первым символом должна быть буква, определяемая стандартом Unicode 3.2 (a,..., z, A,..., Z и символы из других языков в кодировке Unicode), подчеркивание (_), значок "at" (@) или знак номера (#).

Последующие символы могут включать буквы, арабские цифры, символ @, знак доллара ($), знак номера или подчеркивание. Идентификатор не может быть зарезервированным ключевым словом языка T-SQL, не может содержать встроенные пробелы и не должен включать дополнительные символы.

Идентификатор, не соответствующий данным правилам, должен быть отделен разделителями. Например, атрибут 2006 считается нерегулярным идентификатором, потому что начинается с цифры, и значит, должен иметь разделители: "2006" или [2006]. На регулярный идентификатор, такой как y2006, можно ссылаться без разделителей, просто указав y2006, или при желании можно использовать разделители.

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

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Назовите формы присвоения псевдонимов атрибутам в T-SQL.

2. Что такое нерегулярный идентификатор?

Ответы на контрольные вопросы

1. Формы присвоения псевдонимов: выражение AS псевдоним, выражение псевдоним и псевдоним = выражение.

2. Идентификатор, не соответствующий правилам форматирования идентификаторов, например, начищающийся с цифры, включающий в себя пробел или являющийся зарезервированным символом T-SQL.

–  –  –

Задание 1. Составление простого запроса и использование псевдонимов таблиц В этом задании вы попробуете свои силы в использовании предложений FROM и SELECT, включая применение псевдонимов таблиц.

1. Откройте SQL Server Management Studio (SSMS) и подключитесь к учебной базе данных TSQL2012.

2. Чтобы попрактиковаться в написании простого запроса, использующего предложения FROM и SELECT, введите следующий запрос и выполните его.

USE TSQL2012;

SELECT shipperid, companyname, phone FROM Sales.Shippers;

–  –  –

3. Если в запросе участвуют две и более таблицы, и в другой таблице имеется атрибут shipperid, необходимо присвоить атрибуту shipperid префикс — имя таблицы, в результате чего получится Shippers.shipperid. Для краткости, можно использовать в качестве псевдонима более короткое имя, например S, и затем обращаться к этому атрибуту как S.shipperid. Далее приведен пример присвоения таблице псевдонима и использования нового имени таблицы в качестве префикса атрибута.

SELECT S.shipperid, companyname, phone FROM Sales.Shippers AS S;

Задание 2. Использование псевдонимов столбцов и идентификаторов с разделителями В этом задании вы попрактикуетесь в использовании псевдонимов столбцов, включая применение идентификаторов с разделителями.

В качестве отправной точки используйте запрос из шага 3 предыдущего задания.

1. Предположим, необходимо переименовать результирующий атрибут phone в phone number. Далее приведен пример присвоения псевдонима атрибуту с идентификатором phone number без использования разделителей.

SELECT S.shipperid, companyname, phone AS phone number FROM Sales.Shippers AS S;

Начало работы с инструкцией SELECT 41

2. Этот код дает ошибку, поскольку номер телефона не является регулярным идентификатором, и поэтому должны использоваться разделители, как показано в следующем примере:

SELECT S.shipperid, companyname, phone AS [phone number] FROM Sales.Shippers AS S;

3. Помните, что T-SQL поддерживает как собственный способ разделения идентификаторов с помощью квадратных скобок, так и стандартную форму, использующую двойные кавычки, например "phone number".

Резюме занятия Предложение FROM — это первое предложение, которое логически обрабатывается в запросе SELECT. В этом предложении указываются таблицы, к которым адресован запрос, и табличные операторы. В предложении FROM можно присваивать таблицам псевдонимы с именами по своему выбору и затем использовать псевдоним таблицы в качестве префикса к именам атрибутов.

С помощью предложения SELECT можно указать выражения, определяющие результирующие атрибуты. Можно присваивать результирующим атрибутам собственные псевдонимы и таким образом получать реляционный результат.

Если в результате запроса возможно получение дубликатов, их следует удалить с помощью предложения DISTINCT.

При использовании регулярных идентификаторов в качестве имен объектов или атрибутов применение разделителей является необязательным. Если используются нерегулярные идентификаторы, разделители обязательны.

Закрепление материала Для проверки знания материала, изложенного в данном занятии, ответьте на следующие вопросы. Ответы на эти вопросы и пояснения, почему тот или иной ответ верен или неверен, можно найти в приложении "Ответы" в конце книги.

1. В чем заключается важность назначения псевдонимов атрибутам в T-SQL? (Выберите все подходящие варианты.) A. Возможность назначать атрибутам псевдонимы является всего лишь эстетическим свойством.

B. Выражение, полученное в результате вычисления, не имеет имени атрибута, ecли его не присвоить с использованием псевдонима, и это нереляционный вариант.

C. Язык T-SQL требует, чтобы все результирующие атрибуты запроса имели имена.

D. С помощью псевдонимов атрибута можно назначить результирующему атрибуту новое имя, если нужно, чтобы оно отличалось от начального имени атрибута.

42 Глава 2

2. Какие предложения, согласно T-SQL, являются обязательными в запросе SELECT?

A. Предложения FROM и SELECT.

B. Предложения SELECT и WHERE.

C. Предложение SELECT.

D. Предложения FROM и WHERE.

3. Какие из следующих методов считаются неправильными? (Выберите все подходящие варианты.) A. Присвоение псевдонимов столбцам с помощью предложения AS.

B. Присвоение псевдонимов таблицам с помощью предложения AS.

C. Не присваивать псевдоним столбцу, если этот столбец является результатом вычисления.

D. Использование знака * в инструкции SELECT.

Занятие 2. Работа с типами данных и встроенными функциями При определении столбцов в процедурах, параметрах процедур и функций, а также переменных в T-SQL необходимо выбрать для них тип данных.

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

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

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

Следует заметить, что эта глава не содержит исчерпывающей информации обо всех типах данных и всех функциях, поддерживаемых языком T-SQL — на это понадобились бы целая книга. В этой главе дается объяснение факторов, которые следует принимать во внимание при выборе типа данных, и ключевые понятия использования функций, как правило, в контексте определенного типа данных, например, данных типа "дата и время" или символьные данные. Подробную информацию и технические подробности о типах данных можно найти в электронной документации по SQL Server 2012 в разделе "Типы данных (Transact-SQL)" по адресу Начало работы с инструкцией SELECT 43 http://msdn.microsoft.com/ru-ru/library/ms187752(v=SQL.110).aspx. Для получения дополнительных сведений о встроенных функциях см. раздел "Встроенные функции (Transact-SQL)" по адресу http://msdn.microsoft.com/ru-ru/library/ ms174318(v=SQL.110).aspx.

Изучив материал этого занятия, вы сможете:

Выбирать нужный тип данных Выбирать тип данных для ключей Работать с датой и временем, а также с символьными данными Работать с выражением CASE и связанными с ним функциями Продолжительность занятия — 50 минут.

Выбор нужного типа данных Выбор подходящих типов данных для атрибутов — возможно, одно из важнейших решений в отношении данных, которое вам предстоит принимать. SQL Server поддерживает множество типов данных из разных категорий: точные числовые типы данных (INT, NUMERIC), символьные строки (CHAR, VARCHAR), символьные строки в кодировке Unicode (NCHAR, NVARCHAR), приблизительные числовые типы данных (FLOAT, REAL), двоичные строки (BINARY, VARBINARY), дата и время (DATE, TIME, DATETIME2, SMALLDATETIME, DATETIME, DATETIMEOFFSET) и др. Из-за огромного числа возможностей эта задача может показаться сложной, но при условии следования определенным принципам можно точно и мастерски выбирать тип данных, что позволит иметь надежную, согласованную и эффективную базу данных.

Одна из самых сильных сторон реляционный модели — это значение, которое она придает целостности данных, как части самой модели, на многих уровнях. Одним из важных моментов при выборе нужного типа данных является необходимость помнить, что тип данных — это ограничение. То есть он имеет определенную область поддерживаемых величин и не допустит присутствия величин вне этой области. Например, тип данных DATE разрешает использование только допустимых дат. Попытка ввести данные, не являющиеся датой, как например 'abc' или '20120230', будет отвергнута. Если вы используете атрибут, который должен представлять дату, скажем, день рождения, и при этом возьмете тип данных INT или CHAR, вы ничего не выиграете от встроенной проверки допустимости дат. Тип INT не помешает использованию такой величины, как 99999999, а тип CHAR не помешает использованию такого значения, как '20120230'.

Подобно тому, что тип данных является ограничением, значение NOT NULL — также ограничение. Если предполагается, что атрибут не должен допускать значения NULL, важно использовать ограничение NOT NULL как часть определения этого атрибута.

В противном случае значения NULL смогут проникнуть в ваш атрибут.

Кроме того, необходимо быть уверенным, что вы не путаете форматирование значения и его тип данных. Иногда, когда есть желание хранить данные в определенном формате, символьная строка используется для хранения дат. За форматироваГлава 2 ние значения отвечает приложение, в котором происходит представление данных.

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

Тип данных формирует поведение. Используя неподходящий тип данных, вы теряете все свойственное этому типу данных поведение, инкапсулированное в форме поддерживающих его операторов и функций. В качестве простого примера можно взять оператор +, который для числовых типов данных представляет сложение, а для символьных строк — объединение (конкатенацию). Если выбран неподходящий тип данных для какого-то значения, иногда приходится конвертировать этот тип (явно или неявно), а иногда и немного искажать значение, чтобы можно было обрабатывать его так, как предполагалось.

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

Если умножить размер типа данных на количество строк в таблице, получаются весьма значительные числа. В качестве примера предположим, что у нас есть атрибут, представляющий экзаменационные баллы, которые являются целыми числами в диапазоне от 0 до 100. Использование для этого типа данных INT является излишеством. Он отводит 4 байта на значение, тогда как тип TINYINT использует только 1 байт и поэтому является более подходящим типом в данном случае. Аналогично для данных, представляющих даты, как правило, применяется тип DATETIME, который использует 8 байт памяти.

Если предполагается использовать дату без времени, следует применять тип DATE, который занимает только 3 байта. Если же значение будет представлять и дату, и время, нужно использовать DATETIME2 или SMALLDATETIME. Первый требует от 6 до 8 байт памяти (в зависимости от точности) и дополнительно обеспечивает более широкий диапазон дат и повышенную, контролируемую точность. Последний использует только 4 байта, поэтому если поддерживаемый им диапазон дат и точность отвечают вашим потребностям, следует использовать этот тип данных. Говоря коротко, нужно использовать наименьший тип данных, удовлетворяющий вашим запросам. Хотя, конечно, следует думать не о сиюминутной ситуации, а о перспективе. Например, не стоит использовать тип INT для ключа таблицы, которая однажды вырастет до миллиардов строк. В таком случае надо остановиться на типе BIGINT.

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

Следует соблюдать осторожность в отношении неточных типов данных, таких как FLOAT и REAL. Два первых предложения в документации, описывающей эти типы Начало работы с инструкцией SELECT 45 данных, дадут вам полное представление об их сущности: типы данных для работы с приближенными числами при использовании с числовыми данными с плавающей точкой. Данные с плавающей точкой являются приближенными; поэтому не все значения в диапазоне такого типа данных могут быть представлены точно. (Эти сведения можно найти в электронной документации для SQL Server 2012 в статье "Типы данных float and real Transact-SQL" по адресу http://msdn.microsoft.com/ruru/library/ms173773.aspx). Преимущество этих типов состоит в том, что они могут представлять очень большие и очень маленькие числа, помимо других числовых типов данных, которые поддерживает и может представлять SQL Server. Поэтому, если в научных целях представить очень большие или очень маленькие числа и не нужна очень большая точность, эти типы данных могут быть вполне подходящими.

Они также достаточно экономичны (4 байта требуется под тип REAL и 8 байт под тип FLOAT). Но использовать их тогда, когда требуется большая точность, не нужно.

РЕАЛЬНЫЙ МИР Проблемы с типом FLOAT Мы помним случай, когда клиент использовал тип данных FLOAT для представления номеров штрихкода продуктов и был очень удивлен, когда при сканировании он получал не тот продукт. Также недавно мы получили запрос о конвертации величины с типом FLOAT в тип NUMERIC, дающий на выходе не ту величину, которая была введена. Вот этот запрос.

DECLARE @f AS FLOAT = '29545428.022495';

SELECT CAST(@f AS NUMERIC(28, 14)) AS value;

Можете догадаться, что получилось на выходе этого кода? Посмотрите.

Value

--------------------------------------Как мы уже говорили, некоторые величины не могут быть представлены точно.

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

Еще один вопрос, который следует рассмотреть при выборе типа данных, — это выбор фиксированных типов (CHAR, NCHAR, BINARY) или динамических типов (VARCHAR, NVARCHAR, VARBINARY). Фиксированные типы используют память для указанного размера данных; например, тип CHAR(30) использует память на 30 символов, независимо от того, действительно вы используете 30 символов или меньше.

Это означает, что обновления данных не потребуют физического расширения строки, и таким образом сдвиг данных не нужен. Итак, для атрибутов, которые часто обновляются, и где важное значение имеет производительность обновлений, необходимо использовать фиксированные типы данных. Обратите внимание, при использовании сжатия — особенно сжатия строк — SQL Server хранит фиксированные типы данных как переменные типы, но с меньшими накладными затратами.

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

При использовании символьных строк возникает вопрос о выборе обычных типов символьных данных (CHAR, VARCHAR) или типов в кодировке Unicode (NCHAR, NVARCHAR). Первый тип данных использует 1 байт памяти на символ и поддерживает только один язык (на основании параметров сортировки), кроме английского. Последний тип данных использует 2 байта памяти на символ (без сжатия) и поддерживает несколько языков. Если будет необходима суррогатная пара, символ потребует 4 байта памяти. Поэтому когда используются данные на нескольких языках, и вам в ваших данных нужен только один язык, кроме английского, выгоднее использовать обычные символьные типы данных с более низкими требованиями к памяти.

В случае многоязычных данных или если приложение по умолчанию работает с данными в кодировке Unicode, следует использовать типы данных в кодировке Unicode, чтобы избежать потери информации. Требования большего количества памяти для хранения данных в кодировке Unicode уменьшились, начиная SQL Server 2008 R2 с введением сжатия данных в Unicode.

При использовании типов данных, которые могут иметь соответствующую им длину, таких как CHAR и VARCHAR, T-SQL позволяет опустить длину, и в таком случае используется длина по умолчанию. Но значения по умолчанию могут быть разными в различных ситуациях. Считается наиболее правильным всегда явно указывать длину, как, например, в выражениях CHAR(1) или VARCHAR(30).

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

Также необходимо быть уверенным, что при указании литерала какого-либо типа вы используете правильную форму. Например, литералы для обычных символьных строк отделяются с помощью одиночных кавычек, как в выражении 'abc', тогда как литералы символьных строк в кодировке Unicode разделяются с помощью заглавной буквы N и затем одиночных кавычек, как в случае N'abc'. Если в выражении присутствуют элементы с разными типами данных, SQL Server должен выполнять неявное преобразование, когда это возможно, а это может привести к снижению производительности. Обратите внимание, в некоторых случаях интерпретация литерала может не соответствовать тому, что вы можете представить себе интуитивно. Чтобы литерал был нужного вам типа, может потребоваться применить явное преобразование с помощью таких функций, как CAST, CONVERT, PARSE или Начало работы с инструкцией SELECT 47 TRY_CAST, TRY_CONVERT и TRY_PARSE. Возьмем в качестве примера литерал 1, который рассматривается SQL Server как INT в любом контексте. Если нужно, чтобы литерал 1 рассматривался, скажем, как BIT, необходимо конвертировать тип этого литерала явно, как, например, в выражении CAST(1 AS BIT). Аналогично, литерал 4000000000 рассматривается как имеющий тип NUMERIC, а не BIGINT. В случае необходимости иметь для этого литерала последний тип данных, следует использовать преобразование CAST(4000000000 AS BIGINT). Разница между функциями без части TRY и их аналогами с этой частью состоит в том, что функции без TRY завершаются ошибкой, если значение невозможно преобразовать, тогда как функции с TRY возвращают в таком случае NULL.

Например, следующий код завершится ошибкой:

SELECT CAST('abc' AS INT);

В свою очередь, этот код возвратит значение NULL:SELECT TRY_CAST('abc' AS INT);



Pages:   || 2 | 3 | 4 | 5 |   ...   | 11 |
Похожие работы:

«РЕГЛАМЕНТ "LADA RALLY CUP" 2017 года 1. ОБЩИЕ ПОЛОЖЕНИЯ 1.1. СТАТУС СОРЕВНОВАНИЙ 1.1.1. На основании решения ПАО "АВТОВАЗ" и по согласованию с Российской Автомобильной Федерацией (РАФ) объявляется многоэтапный Кубок по ралли 2017года – "LADA RALLY CUP" (далее Кубок). Кубок разыгрывается параллельным зачетом на этапах Чемп...»

«Утверждены Минлегпромом СССР от 28 октября 1985 г. N ВЧ-10/14803 Согласованы с Госстроем СССР и ГКНТ от 10 сентября 1985 г. N 45-531 Срок введения в действие ноября 1985 года НОРМЫ ТЕХНОЛОГИЧЕСКОГО ПРОЕКТИРОВАНИЯ ПРЕДПРИЯТИЙ ЛЕГКОЙ ПРОМЫШЛЕННОСТИ РАЗДЕЛ 15. ШВЕЙНАЯ ПРОМЫШЛЕННОСТЬ ВНТП 34-...»

«Муниципальное казенное общеобразовательное учреждение "Средняя общеобразовательная школа с.Прималкинского" Прохладненского района КБР РАБОЧАЯ ПРОГРАММА ПО ЛИТЕРАТУРНОМУ ЧТЕНИЮ ДЛЯ 3 КЛАССОВ МКОУ "СОШ с.Прималкинского" Уровень – базовый (ФГОС) РАБОЧАЯ ПРОГРАММА ПО ПРЕДМЕТУ "ЛИТЕРАТУРНОЕ ЧТЕНИЕ" Н.А. ЧУРАКОВА, О.В. МАЛАХОВСКАЯ Пояснитель...»

«УТВЕРЖДАЮ Председатель Совета судей Самарской области jB.B. Кудинов года 2017 года ЖДАЮ Председатель Региональной Общественной "Самарская ^ация футбола" 1С. Герасимов 2017 года ПОЛОЖЕНИЕ о десятом первенстве с...»

«Юрий Глина Израиль в сердце моём БОСТОН • BOSTON Юрий Глина Израиль в сердце моем Israel in my heart by Yuriy Glina Печатается в авторской редакции Copyright © 2008 by Yuriy Glina All rights reserved. No part of this book may be reproduced or utilized in...»

«Информация для клиентов Руководство по использованию счетчика газа с предварительной оплатой Краткое руководство Счетчик газа с картой предоплаты Стр. На рисунке ниже представлен счетчик газа с картой предоплаты. Инициализация (новой или сменной) карты предоплаты Дисплей и экран с показаниями Приобретение кредита Пере...»

«HD8030, HD8010 (РУССКИЙ) 2 (РУССКИЙ) 3 HD8030, HD8010 e Содержание Введение 4 Общее описание 5 Важно 5 Опасно 5 Предупреждение 5 Внимание 6 Соблюдение стандартов 7 Подготовка к работе 7 Установка кофеварки 7 Установка и снятие емкости для кофейных зерен 7 Подготовка к использованию 8 Наполнение емкости для воды 8 Автоматическое п...»

«Протокол № 55-МТНП/ТПР/7-06.2016/Д от 19.04.2016 стр. 1 из 6 УТВЕРЖДАЮ Председатель конкурсной комиссии _ С.В. Яковлев "19" апреля 2016 года ПРОТОКОЛ № 55-МТНП/ТПР/7-06.2016/Д заседания конкурсной комиссии ОАО "АК "Транснефть" по лоту № 55-МТНП/ТПР/7-06.2016 "Периметральная охранная сигнализация на ППС Плавск. Техперевооружение" (АО "Мостран...»

«ПРОДЛЕННАЯ ГАРАНТИЯ Выберите из списка и кликните Страховой риск, соответствующий произошедшему событию ПОЛОМКА В ПОСТГАРАНТИЙНЫЙ ПЕРИОД АВАРИЯ СИСТЕМ ВОДОСНАБЖЕНИЯ, ОТОПЛЕНИЯ, КА...»

«ISSN 2308-8079. Studia Humanitatis. 2017. № 2. www.st-hum.ru УДК 94(560):070 ТУРЕЦКИЙ ПУТЧ ГЛАЗАМИ ТУРЕЦКОГО НАРОДА: ОБРАЗ НЕУДАВШЕГОСЯ ГОСУДАРСТВЕННОГО ПЕРЕВОРОТА В ОЦЕНКАХ ТУРЕЦКИХ СМИ В ИЮЛЕ 2016 ГОДА Мамедов З.И. В данной статье автор проводит анали...»

«RU МАРРАКЕШ — изучение "общественных интересов" в рамках компетенции ICANN МАРРАКЕШ — изучение "общественных интересов" в рамках компетенции ICANN Понедельник, 07 марта 2016 года, 15:15 – 16:30 по западноевропейскому времени ICANN-55 | Марракеш, Марокко ОЛИВЬЕ КРЕПЕН-ЛЕБЛОН (OLI...»

«БЮЛЛЕТЕНЬ №1 для голосования на внеочередном общем собрании акционеров Открытого акционерного общества "Уралэлектромедь" Российская Федерация, Свердловская область, город Верхняя Пышма, ул. Ленина, д.1 Форма проведения внеочередного общего собрания акционеров: заочное голосование. Дата окончания приема заполненных бюллетеней для...»

«@ С :.; О. ‘Р. Пролетарии всех с т р а н, ; с о е д и н я й т есИэТ Н. К А К У Р ИЖл СОВРЕМЕННАЯ ТАКТИКА РЕКОМЕНДОВАНО УПРАВЛЕНИЕМ ПО БОЕВОЙ ПОДГОТОВКЕ Р.-К.К.А. О (С 8 р и с у н к а м и ) I Государственное Военное Издательство...»

«МАСТЕР-КЛАСС ПО ВЯЗАНИЮ УЛИТКИ РИТЫ 17 страниц описания фотографии процесса Необходимые материалы: "Кружевная" от Пехорки, цвет №483 "Незрелый лимон", 280м/50г, 1. состав: 100% ПАН (акри...»

«Проект Примерная адаптированная основная общеобразовательная программа начального общего образования слабослышащих и позднооглохших обучающихся ОГЛАВЛЕНИЕ 1. ОБЩИЕ ПОЛОЖЕНИЯ..5 2. ПРИМЕРНАЯ АДАПТИРОВАННАЯ ОСНОВНАЯ ОБЩЕОБРАЗОВАТЕЛЬНАЯ ПРОГРАММА НАЧАЛЬНОГО ОБЩЕГО ОБРАЗОВАНИЯ СЛАБОСЛЫШАЩИХ И ПОЗДНООГЛОХШИ...»

«ЛЕКЦИЯ 2 ПОТЕНЦИАЛ ЭЛЕКТРИЧЕСКОГО ПОЛЯ. МЕТОД ИЗОБРАЖЕНИЙ На этой лекции будут рассмотрены понятие потенциала электрического поля и метод изображения. С какой поверхностной плотностью...»

«Xerox Phaser 6600 Color Printer Imprimante couleur Xerox Phaser 6600 ® ® User Guide Guide d'utilisation Svenska etina Anvndarhandbok Italiano Uivatelsk pruka Guida per l’utente Dansk Polski Betjeningsvejledning Deutsch Prz...»

«1. ПОЯСНИТЕЛЬНАЯ ЗАПИСКА МЕСТО ДИСЦИПЛИНЫ В СТРУКТУРЕ ООП 1.1. Дисциплина "Самоменеджмент", относящаяся к циклу дисциплин "Обязательный блок", базируется на знаниях, приобретенных аспирантами при изучении модулей "Основы менеджмента", "Теория организации", "Методы принятия решений", "Управление человеческими ресурсам...»

«Нижегородская государственная областная универсальная научная библиотека им. В.И.Ленина Р.Я.Клыгина ЛЕНИНКА СТРАНИЦЫ ЛЕТОПИСИ к 140-летию Нижегородской государственной областной универсальной научной библиотеки им. В.И.Ленина Нижний Новгород УДК 027 ББК 78.34(2Рос) К-51 Редакционная коллегия:...»

«ПРОГРАММА Дополнительного образования по театральной деятельности дошкольного возраста "МИР ТЕАТРА" Возраст воспитанников 4-7 лет. Срок реализации программы 3 года. Составитель программы Зыкина Елена Владимировна Пояснительная записка "Театрискусство прекрасное. Оно облагораживает, воспитывает человека. Тот...»

«Отношение Автор Дэвид Бетти Пособие для студентов Издание 5-ое Групповые занятия для новообращенных христиан Отношение Пособие для студентов Автор Дэвид Бетти Издание 5-ое Места Писания, использованные в данном курсе, цитиру...»








 
2017 www.kniga.lib-i.ru - «Бесплатная электронная библиотека - онлайн материалы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.