Извлечение данных

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

SELECT select_list

[INTO new_table]

FROM table_source

[WHERE search_conditions]

[GROUP BY group_by_expression]

[HAVING search_condition]

[ORDER BY order_expression [ASC | DESC] ]

Раздел SELECT имеет следующий синтаксис:

SELECT [ ALL | DISTINCT ]

TOP n [PERCENT]

<select_list>

Рассмотрим более подробно назначение аргументов:

ALL – при указании этого ключевого слова в результат запроса разрешается включение дублирующихся строк. Параметр ALL используется по умолча­нию.

DISTINCT – это ключевое слово запрещает появление в результате дублирующихся строк.

TOP n PERCENT –использование этой конструкции предписывает серверу выбирать не все строки, а только n первых. Можно также выбирать не фиксированное количество строк, а определенный процент от всех строк, удовлетворяющих условию.

Конструкция <select_list>определяет список и происхождение колонок, которые будут включены в результат.

Аргумент table_name должен содержать имя таблицы, из которой необходимо выбрать все колонки. Имя таблицы необходимо указы­вать, если в запрос включено несколько таблиц. Если же в запросе участвует только одна таблица, то проще применить символ * без указания имени таблицы.

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

Аргумент table_alias указывает псевдоним таблицы, из которой необходимо выбрать все колонки.

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

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

Раздел INTO предназначен для сохранения результата, выполнения запроса в заданной таблице.

Аргумент new_table определяет имя таблицы, в которой будет размещен результат. Сервер автоматически создает таблицу с указанной структурой.

Синтаксис table_source:

Рассмотрим использование каждого из параметров:

table_name [ [AS] table_alias ].Имя связанной таблицы. При необходимости для этой таблицы можно указать псевдоним. Использование псевдонимов необходимо, если в конструкции FROM указано имя изменяемой таблицы. Это требуется, чтобы сервер различал, когда имя таблицы нужно рассматривать как имя изменяемой таблицы, а когда — как имя связанной таблицы.

view_name [ [AS] table_alias]. Имя представления, определяющего критерии выполнения команды UPDATE. При необходимости для представления можно указать псевдоним, который будет использоваться в дальнейшем для ссылки на это представление.

rowset_function [ [AS] table_alias]. Этот блок предполагает использование функций ROWSET (CONTAINSTABLE, FREETEXTTABLE, OPENQUERY и OPENROWSET). С помощью этих функций можно подготовить набор данных, который может быть использован вместо таблицы или представления. Дополнительно можно указать псевдоним, позволяющий обращаться к данным.

derived_table [AS] table_alias [(column_alias [..n]). Определяет имя таблицы, которая может быть использована для построения подзапросов при выполнении обновления. Дополнительно можно указать псевдоним, как для всей таблицы, так и для каждой конкретной колонки. При указании псевдонима для колонок необходимо указывать их в соответствии с физическим порядком колонок в исходной таблице. Кроме того, требуется указание псевдонима для каждой колонки, созданной в исходной таблице.

joined_table – эта конструкция является наиболее сложным методом задания критериев обновления таблицы и используется для связывания при выполнении обновления нескольких таблиц. Структура конструкции <joined_table> следующая:

<table_source>

<join_type>

<table_source> ON

<search_condition>

<table_source>

CROSS JOIN

<table_source>

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

Конструкция <join_type> описывает тип связывания двух таблиц. Исходная таблица указывается слева от конструкции <join_type> (она называется левой таблицей – left table), а справа указывается зависимая таблица (она называется правой таблицей – right table). Структура конструкции <join_type> следующая:

[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]

[ <join_hint> ]

Рассмотрим назначение каждого из аргументов.

INNER – этот тип связи используется по умолчанию. Выбираются пары строк, для которых имеются строки, удовлетворяющие критерию связыва­ния в обеих таблицах. Строки из левой таблицы, для которых не имеется пары в связанной таблице, в результат не включаются. Также не включа­ются строки правой таблицы, для которых нет соответствующей строки в левой таблице.

LEFT [OUTER]. В результат будут включены все строки левой таблицы, неза­висимо от того, есть для них соответствующая строка в правой таблице или нет. Для соответствующих колонок правой таблицы, включенных в запрос, устанавливается значение NULL.

RIGHT [OUTER]. При использовании этого ключевого слова в результат будут включены все строки правой таблицы, независимо от того, есть ли для них соответствующая строка в левой таблице. Для соответствующих колонок левой таблицы, включенных в запрос, устанавливается значение NULL.

FULL [OUTER]. В результат будут включены все строки как правой, так и левой таблицы. Применение ключевого слова FULL [OUTER] можно рассматривать как одновременное применение ключевых слов LEFT [OUTER] и RIGHT[OUTER].

JOIN <tab1e_source>. После этого ключевого слова должна указываться правая таблица.

ON <search_condition>. Логическое условие, определяющее условие связы­вания двух таблиц. Можно использовать операции сравнения (например, =, <, >, <=, >=, !=, <>).

С помощью конструкции WHERE можно сузить количество обрабатываемых строк данных, определив одно или несколько логических условий. В результат будут включены только те строки, которые соответствуют наложенным условиям. Условие может включать константы, переменные и любые выражения, возвра­щающие булево значение (TRUE или FALSE). Можно указать несколько условий, объединив их с помощью логических операндов OR, AND и NOT. Синтаксис раздела WHERE следующий:

WHERE <search_condition> | column_name { *= | =* } column_name

В конструкции <search_condition> можно определить любое логическое усло­вие, при ввие, при выполнении которого строка будет включена в результат. Логическое условие может быть произвольным, в том числе и не связанным с данными.

Раздел GROUP BY позволяет выполнять группировку строк таблиц по определенным критериям. Для каждой группы можно выполнить специальные функции агрегирования, которые будут применены ко всем строкам в группе. Синтаксис раздела GROUP BY следующий:

[ GROUP BY [ALL] group_by_expression [,...n] [ WITH { CUBE | ROLLUP } ]]

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

Раздел HAVING имеет следующую структуру:HAVING <search_condition> .

Этот раздел в основном используется для указания условий поиска при выполнении группирования данных с помощью раздела GROUP BY. Конструкция <search_condition> содержит логические условия, определяющие диапазон строк, обрабатываемых запросом. Правила работы с этой конструкцией были рассмотрены при описании раздела WHERE.

Раздел ORDER BY используется, когда необходимо отсортировать данные в результирующем наборе. Синтаксис этого раздела следующий:

ORDER BY {order_by_expression [ ASC | OESC ] } [,...n]

Аргумент order_by_expression должен содержать имя одной из колонок, включенных в запрос. Можно использовать для сортировки колонку, не включенную в результат. При указании ключевого слова ASC данные будут отсортированы по возрастанию. Если необходимо отсортировать данные по убыванию, нужно использовать ключевое слово DESC. По умолчанию используется сортировка по возрастанию.

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