Извлекает строки из базы данных и позволяет делать выборку одной или нескольких строк или столбцов из одной или нескольких таблиц. Полный синтаксис инструкции SELECT сложен, однако основные предложения можно вкратце описать следующим образом:
[ WITH <common_table_expression>]
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
Полный синтаксис
SELECT statement ::=
[WITH <common_table_expression> [,...n]]
<query_expression>
[ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }
[ ,...n ] ]
[ COMPUTE
{ { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,...n ]
[ WITH <backward_compatible_index_option> [ ,...n ] ]
[ ON { filegroup_name | "default" } ]
<object> ::=
{
[ database_name. [ owner_name ] . | owner_name. ]
table_or_view_name
}
<backward_compatible_index_option> ::=
{
PAD_INDEX
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB
| IGNORE_DUP_KEY
| STATISTICS_NORECOMPUTE
| DROP_EXISTING
}
Аргументы
UNIQUE
Создает уникальный индекс для таблицы или представления. Уникальным является индекс, в котором не может быть двух строк с одним и тем же значением ключа индекса. Кластеризованный индекс представления должен быть уникальным.
Компонент SQL Server 2005 Database Engine не позволяет создать уникальный индекс по столбцам, уже содержащим повторяющиеся значения, даже если параметру IGNORE_DUP_KEY присвоено значение ON. При попытке создания такого индекса компонент Database Engine выдает сообщение об ошибке. Прежде чем создавать уникальный индекс по такому столбцу или столбцам, необходимо удалить все повторяющиеся значения. Столбцы, используемые в уникальном индексе, должны иметь свойство NOT NULL, т. к. при создании индекса значения NULL рассматриваются как повторяющиеся.
CLUSTERED
Создает индекс, в котором логический порядок значений ключа определяет физический порядок соответствующих строк в таблице. На нижнем (конечном) уровне такого индекса хранятся действительные строки данных таблицы. Для таблицы или представления в каждый момент времени может существовать только один кластеризованный индекс. Представление с уникальным кластеризованным индексом называется индексированным. Создание уникального кластеризованного индекса физически материализует представление. Уникальный кластеризованный индекс для представлении должен быть создан до того, как для этого же представления будут определены какие-либо другие индексы. Следует создавать кластеризованные индексы до создания любых некластеризованных. При создании кластеризованного индекса все существующие некластеризованные индексы таблицы перестраиваются.
Если аргумент CLUSTERED не указан, создается некластеризованный индекс.
NONCLUSTERED
Создается индекс, который задает логический порядок таблицы. Логический порядок строк данных в некластеризованном индексе не влияет на их физический порядок. Для каждой таблицы можно создать до 249 некластеризованных индексов, независимо от того, каким образом они создаются: неявно с помощью ограничений PRIMARY KEY и UNIQUE или явно с помощью инструкции CREATE INDEX.
Для индексированных представлений некластеризованные индексы могут создаваться только в случае, если уже определен уникальный кластеризованный индекс. По умолчанию, используется значение NONCLUSTERED.
index_name
Имя индекса. Имена индексов должны быть уникальными в пределах таблицы или представления, но не базы данных. Имена индексов должны соответствовать правилам для иеднтификаторов. Имена первичных XML-индексов не должны начинаться со следующих символов: #, ##, @ или @@.
column
Столбец или столбцы, на которых основан индекс. Задайте несколько имен столбцов для создания составного индекса по объединенным значениям указанных столбцов. Столбцы, которые должны быть включены в составной индекс, указываются в скобках за аргументом table_or_view_name в порядке сортировки.
В один составной ключ индекса могут входить до 16 столбцов. Все столбцы составного ключа индекса должны находиться в одной таблице или одном и том же представлении. Максимальный общий размер значений составного индекса равен 900 байт. Дополнительные сведения о столбцах переменной длины в составных индексах см. в разделе «Примечания».
Столбцы с типами данных для больших объектов ntext, text, varchar(max),nvarchar(max), varbinary(max), xml или image не могут быть ключевыми столбцами для индекса. Кроме того, определение представления не может включать столбцы типов ntext, text и image, даже если они указаны в инструкции CREATE INDEX.
Можно создавать индексы на столбцах с пользовательским типом данных CLR, если этот тип поддерживает двоичное упорядочение. Можно также создавать индексы на вычисляемых столбцах, определенных как вызовы методов для столбцов с пользовательскими типами данных, если эти методы помечены как детерминированные и не выполняют операции доступа к данным.
[ ASC | DESC ]
Определяет сортировку значений заданного столбца индекса: по возрастанию или по убыванию. По умолчанию, используется аргумент ASC.
INCLUDE (column [ ,... n ] )
Указывает неключевые столбцы, добавляемые на конечный уровень некластеризованного индекса. Некластеризованный индекс может быть уникальным или неуникальным.
Максимальное количество включенных неключевых столбцов –1023, минимальное – 1.
В списке INCLUDE имена столбцов не могут повторяться и не могут использоваться одновременно как ключевые и неключевые.Допускаются данные всех типов, кроме text, ntext и image. Индекс должен создаваться или перестраиваться в автономном режиме (ONLINE = OFF), если любой из заданных неключевых столбцов имеет тип данных varchar(max), nvarchar(max) или varbinary(max). Включенными столбцами могут быть детерминированные вычисляемые столбцы — как точные, так и неточные. Вычисляемые столбцы, производные от типов данных image, ntext, text, varchar(max), nvarchar(max), varbinary(max) и xml, могут включаться как неключевые, если типы данных вычисляемых столбцов приемлем для включения. ON partition_scheme_name(column_name)
Задает схему секционирования, которая определяет файловые группы соответствующие секциям секционированного индекса. Схема секционирования должна быть уже создана в базе данных с помощью инструкции CREATE PARTITION SCHEME или ALTER PARTITION SCHEME. Аргумент column_name задает столбец, по которому будет секционирован индекс. Этот столбец должен соответствовать типу данных, длине и точности аргумента функции секционирования, которую использует схема partition_scheme_name. Аргумент column_name может указывать на столбцы, не входящие в определение индекса. Можно указать любой столбец базовой таблицы, за исключением случая секционирования индекса UNIQUE, когда столбец column_name должен быть выбран из используемых в уникальном ключе. Это ограничение дает возможность компоненту Database Engine проверять уникальность значений ключа только в одной секции.
Если аргумент partition_scheme_name или filegroup не задан и таблица секционирована, индекс помещается в ту же схему секционирования и с тем же столбцом секционирования, что и для базовой таблицы.
Для XML-индекса задать схему секционирования невозможно. Если базовая таблица секционирована, XML-индекс использует ту же схему секционирования, что и таблица.
ON filegroup_name
Создает заданный индекс в указанной файловой группе. Если местоположение не указано и таблица или представление не секционированы, индекс использует ту же файловую группу, что и базовые таблица или представление. Файловая группа уже должна существовать. XML-индексы используют ту же файловую группу, что и таблица.
ON "default"
Создает заданный индекс в файловой группе, используемой по умолчанию.
Слово «default» в этом контексте не является ключевым. Это идентификатор файловой группы, используемой по умолчанию, который должен быть ограничен, как например в выражении ON "default" или ON [default]. Если задано значение «default», параметр QUOTED_IDENTIFIER в текущем сеансе должен иметь значение ON. Это установка по умолчанию.
[PRIMARY] XML
Создает XML-индекс по заданному столбцу типа xml. Если присутствует ключевое слово PRIMARY, создается кластеризованный индекс с ключом, образованным из ключа кластеризации таблицы пользователя и идентификатора XML-узла. Для каждой таблицы можно создать до 249 XML-индексов. При создании XML-индекса помните следующее.
Кластеризованный индекс должен существовать для первичного ключа таблицы пользователя.
Максимальное количество столбцов в ключе кластеризации таблицы пользователя — 15.
У каждого столбца типа xml в таблице может быть один первичный XML-индекс и несколько вторичных.
Чтобы создать вторичный XML-индекс для столбца типа xml, первичный XML-индекс для этого столбца уже должен существовать.
XML-индекс может быть создан только для одного столбца типа xml. Невозможно создать XML-индекс для столбца, не относящегося к типу xml, а также реляционный индекс для столбца типа xml.
Невозможно создать первичный или вторичный XML-индекс для столбца типа xml в представлении для переменной со столбцами типа xml, возвращающей табличное значение, или для переменных типа xml.
Невозможно создать первичный XML-индекс для вычисляемого столбца типа xml.
Значения параметров SET должны быть теми же, что и для индексированных представлений и индексов вычисляемых столбцов. В частности, параметр ARITHABORT должен быть в значении ON, если создается XML-индекс и если выполняется вставка, удаление или обновление значений в столбце типа xml.
Инструкция CREATE INDEX оптимизируется, как и любой другой запрос. Для уменьшения числа операций ввода-вывода обработчик запросов может вместо таблицы просматривать другой индекс. В некоторых ситуациях можно отказаться от операций сортировки. На многопроцессорных компьютерах с установленным сервером SQL Server 2005 Enterprise Edition инструкция CREATE INDEX, как и другие запросы, может использовать несколько процессоров для операций просмотра и сортировки, связанных с созданием индекса.