Delphi programming blog
Источник: http://teran.karelia.pro/articles/item_4432.html
 

Ицик Бен-Ган: MS SQL Server 2008. Основны T-SQL #1

Опубликовано 06.08.2010 г. 01:01

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

Глава 1. Основы построения запросов и программирования на языке T-SQL

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

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

В описании целостности данных рассказывается о пяти видах ограничений:

  1. Ограничение Primary Key. тут все просто и понятно, и всем известно. Уникальный набор полей, которые не могут быть неизвестными (NULL).
  2. Ограничение UNIQUE. Обеспечивает уникальность строк, что позволяет создавать "альтернативные" ключи. В отличии от первичный ключей, наборов полей с ограничением UNIQUE может быть несколько, и данные ограничения допускают вхождение одного столбца со значением NULL.
  3. Ограничение Foreign Key, т.н внешний ключ. Значения столбца с ограничением foreign key выбираются из какой либо таблицы (справочника), причем это может быть и она сама (например, реализуя дерево). Так же здесь говорится об ссылочной целостности (т.е каскадное обновление или удаление).
  4. Ограничения Check. Данное ограничение позволяет определить логическое выражение которому должна удовлетворять строка. (например, должны быть только положительные значения поля - Check(aValue > 0) )
  5. Ограничение Default. Не совсем, конечно, ограничение но все таки определено оно именно так. Представляет значение поля по умолчанию. Например, если нам требуется при добавлении строки в таблицу вписывать дату и время, то мы можем сделать поле даты с ограничением DEFAULT(CURRENT_TIMESTAMP), или getDate() и т.п.

Глава 2. Однотабличные запросы

Данная глава посвящена проведению выборок из одной единственной таблицы, рассматривается синтаксис запросов SELECT и т.п. Итак, последовательность выполнения элементов SELECT следующая:
  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY
поэтому алиасы, которые вы описываете в select (например select field_name as value) вы не можете использовать в блоке where (т.к where обрабатывается раньше). Если требуется упорядочить результаты запроса, всегда используйте инструкцию order by. Выполнив какой либо запрос, может сложится впечатление какой то упорядоченности результатов, которая с виду может вас устроить. Такое впечатление часто бывает ошибочным. Для ограничения идентификаторов в SQL-Server используются квадратные скобки, хотя допустима стандартная запись с использованием кавычек. Часто можно наблюдать записи вида [db_name].[dbo].[table name], точка зрения автора (в чем я с ним полностью согласен) - не следует применять ограничители без необходимости, а также имена объектов, например, с пробелами и т.п, что требует использования этих самых ограничителей. Все агрегатные функции кроме count() игнорируют значения NULL. Однако допустим, если у нас есть набор строк, и в нем имеется столбец aValue со значениями 1,1,NULL,3 то count(*) вернет значение 4, а count(aValue) вернет значение 3. Что, в прочем, логично. Если требуется посчитать количество уникальных записей, то можно воспользоваться конструкцией count(distinct aValue), которая для данного примера вернет 2, проигнорировав значение NULL и пропустив повторное значение 1. Подобную запись можно применять и для других агрегатных функций. В конструкции SELECT SQL сервер поддерживает несколько способов определения псевдонимов имен:
  1. fieldName as Alias
  2. Alias = fieldName
  3. fieldName Alias
Последняя конструкция весьма неудобна в использовании. Допустим в вашем запросе из поля даты извлекается год, после чего требуется упорядочить набор строк по этому году. т.е что то вроде
SELECT year(aDate) as myYear
FROM myTable
WHERE year(aDate) > 2000
В таком случае вычисление значение year(aDate) проводится только один раз. Т.е SQL сервер распознает повторное использование выражений и не вычисляет их повторно. Такая же ситуация может возникнуть, например, в таком случае:
select year(aDate) as curYear, year(aDate) + 1 as nextYear 
Данное выражение будет вычисляться также один раз. Использование символа * в запросах - плохой стиль написания запросов, это в некоторых случаях может повлечь ошибки в работе клиентских приложений. В том случае если они обращаются к полям результирующего запроса по их номерам. Хотя с другой стороны, в таком случае это скорее плохой стиль написания клиентских приложений. Инструкция ORDER BY является единственной в которой можно ссылаться на псевдонимы описанные в инструкции SELECT, что очевидно, исходя из того что это единственная инструкция выполняемая после SELECT. Кстати в данной инструкции разрешено использовать номера столбцов, в соответствии с их номером в инструкции SELECT (например, ORDER BY 1, 2). Не забывайте также что атрибут (имя поля, выражение) используемое в инструкции ORDER BY не обязательно должно присутствовать в списке SELECT (однако это не верно, если используется ключевое слово DISTINCT) Элемент TOP (SELCT TOP 5 aValue FROM ... )можно применять с ключевым словом PERCENT, для возвращения указанного процента записей из результирующего набора, например SELECT TOP (5) PERCENT .. На этом заканчиваются первые 55 страниц упомянутой книги, о следующих 55ти в следующий раз (:
Метки:  SQL 

Комментарии

Нет комментариев
- Имя
- e-mail*
- Сайт
вы можете использовать теги [i],[b],[code],[quote]
Дополнительно