Поделиться через


Части инструкции SELECT

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

SELECT select_list

[ INTO new_table_name ]

FROM table_list

[ WHERE search_conditions ]

[ GROUP BY group_by_list ]

[ HAVING search_conditions ]

[ ORDER BY order_list [ ASC | DESC ] ]

  • select_list
    Описывает столбцы результирующего набора. Это список выражений, разделенных запятыми. Каждое выражение определяет как формат (тип данных и размер), так и источник данных для столбца результирующего набора. Каждое выражение списка выборки обычно ссылается на столбец в исходной таблице или представлении, предоставляющем данные, но может быть любым другим выражением, например константой или функцией Transact-SQL. Использование выражения * в списке выбора указывает, что должны быть возвращены все столбцы исходной таблицы.
  • INTO new_table_name
    Указывает, что результирующий набор используется для создания новой таблицы. Параметр new_table_name указывает имя новой таблицы.
  • FROM table_list
    Содержит список таблиц, из которых будут извлечены данные результирующего набора. Этими источниками могут быть:

    • Базовые таблицы на локальном сервере, где работает SQL Server 2005.
    • Представления в локальном экземпляре SQL Server. Внутри SQL Server разрешаются ссылки на представления относительно базовых таблиц, на которых построено представление.
    • Связанные таблицы. Это таблицы в источниках данных OLE DB, к которым можно обратиться с помощью SQL Server. Это упоминается как распределенный запрос. К источникам данных OLE DB можно обратиться из SQL Server, связывая их как связанный сервер, или сослаться на источник данных в функции OPENROWSET или OPENQUERY.

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

    Предложение FROM также используется в инструкциях DELETE и UPDATE, чтобы определить таблицы, которые будут изменены.

  • WHERE search_conditions
    Предложение WHERE является фильтром, задающим условия, которым каждая строка в исходных таблицах должна соответствовать, чтобы быть выбранной инструкцией SELECT. Только строки, удовлетворяющие условиям, вносят данные в результирующий набор. Данные из строк, не удовлетворяющих условиям, не используются.

    Предложение WHERE также используется в инструкциях DELETE и UPDATE, чтобы определить строки в целевой таблице, которые будут изменены.

  • GROUP BY group_by_list
    Предложение GROUP BY делит результирующий набор на группы на основании значений в столбцах group_by_list. Например, таблица Sales.SalesOrderHeader базы данных AdventureWorks имеет десять значений в TerritoryID. Предложение GROUP BY TerritoryID делит результирующий набор на 10 групп, по одной для каждого значения TerritoryID.
  • HAVING search_conditions
    Предложение HAVING является дополнительным фильтром, который применяется к результирующему набору. Логически предложение HAVING фильтрует строки из промежуточного результирующего набора, построенного путем выполнения любого из предложений FROM, WHERE или GROUP BY в инструкции SELECT. Предложения HAVING обычно используются с предложением GROUP BY, хотя предложение GROUP BY не требуется перед предложением HAVING.
  • ORDER BY order_list[ ASC | DESC ]
    Предложение ORDER BY определяет порядок, в котором отсортированы строки в результирующем наборе. Параметр order_list указывает столбцы результирующего набора, которые составляют список сортировки. Ключевые слова ASC и DESC используются для указания того, в какой последовательности сортируются строки — возрастающей или убывающей.

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

Предложения в инструкции SELECT должны быть указаны в соответствующем порядке.

Каждая ссылка на объект базы данных должна быть однозначной. Двусмысленность может исходить из следующих источников:

  • Может быть несколько объектов с одинаковым именем в системе. Например, как Schema1, так и Schema2 могут иметь таблицу по имени TableX. Чтобы разрешить эту двусмысленность и указать, что TableX принадлежит схеме Schema1, задайте имя таблицы вместе с именем схемы:

    SELECT *
    FROM Schema1.TableX
    
  • База данных, в которой находится объект, не всегда может быть текущей базой данных при выполнении инструкции SELECT. Чтобы быть уверенным в том, что всегда используется правильный объект, независимо от настройки текущей базы данных, указывайте имя объекта с базой данных и схемой:

    SELECT *
    FROM AdventureWorks.Purchasing.ShipMethod
    
  • Таблицы и представления, указанные в предложении FROM могут иметь дубликаты имен столбцов. Часто внешние ключи будут иметь то же самое имя столбца, какое имеет соответствующий первичный ключ. Чтобы разрешить эту двусмысленность с дублирующими именами, имя столбца должно быть указано с именем таблицы или представления:

    SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name
    FROM Sales.Customer JOIN Sales.Store ON
           ( Sales.Customer.CustomerID = Sales.Store.CustomerID)
    WHERE Sales.Customer.TerritoryID = 1
    

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

    SELECT DISTINCT c.CustomerID, s.Name
    FROM Sales.Customer AS c
       JOIN
         Sales.Store AS s
       ON ( c.CustomerID = s.CustomerID)
    WHERE c.TerritoryID = 1
    

Дополнительные сведения о квалификаторах объекта см. в разделе Идентификаторы.

В электронной документации SQL Server многие примеры Transact-SQL упрощены путем отказа от использования составных имен. Хотя эти элементы опущены в примерах для удобства чтения, рекомендуем использовать составные имена в инструкциях Transact-SQL в промышленных системах.

См. также

Другие ресурсы

Выражения (Transact-SQL)
SELECT (Transact-SQL)
IDENTITY (свойство) (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005