Select (SQL)

Материал из Википедии — свободной энциклопедии
Перейти к навигацииПерейти к поиску
У этого термина существуют и другие значения, см.Select (значения).

SELECT (отангл. select — «выбрать») — оператор запроса (DML/DQL) в языкеSQL, возвращающий набор данных (выборку) избазы данных.

Оператор возвращает ноль или более строк. Список возвращаемых столбцов задается в части оператора, называемой предложением SELECT. Поскольку SQL является декларативным языком, запрос SELECT определяет лишь требования к возвращаемому набору данных, но не является точной инструкцией по их вычислению.СУБД транслирует запрос SELECT во внутренний план исполнения («query plan»), который может различаться даже для синтаксически одинаковых запросов и от конкретной СУБД.

Оператор SELECT состоит из нескольких предложений (разделов):

  • SELECT определяет список возвращаемых столбцов (как существующих, так и вычисляемых), их имена, ограничения на уникальность строк в возвращаемом наборе, ограничения на количество строк в возвращаемом наборе;
  • FROM задаёт табличное выражение, которое определяет базовый набор данных для применения операций, определяемых в других предложениях оператора;
  • WHERE задает ограничение на строки табличного выражения из предложения FROM;
  • GROUP BY объединяет ряды, имеющие одинаковое свойство с применением агрегатных функций
  • HAVING выбирает среди групп, определённых параметром GROUP BY
  • ORDER BY задает критерии сортировки строк; отсортированные строки передаются в точку вызова.

Содержание

Структура оператора

[править |править код]

Оператор SELECT имеет следующую структуру:

SELECT[DISTINCT|DISTINCTROW|ALL]select_expression,...FROMtable_references[WHEREwhere_definition][GROUPBY{unsigned_integer|col_name|formula}][HAVINGwhere_definition][ORDERBY{unsigned_integer|col_name|formula}[ASC|DESC],...]

Предложения оператора

[править |править код]

SELECT

[править |править код]

ПредложениеSELECT оператораSELECT предназначено для определения результирующего набора столбцов, получаемого после вычисления табличного выражения в предложенииFROM и группировки в результатеGROUP BY (при наличии). ПредложениеSELECT реализует операцию проекции, то есть указание подмножества столбцов из таблиц табличного выражения, а также операцию переименования столбцов и операцию добавления новых вычислимых столбцов.

FROM

[править |править код]

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

WHERE

[править |править код]

Предложение[[WHERE (SQL)|WHERE]] используется для определения, какие строки должны быть выбраны из табличного выражения в предложенииFROM.

GROUP BY

[править |править код]

[[GROUP BY (SQL)|GROUP BY]] — необязательное предложение оператораSELECT, для группировки строк по результатам агрегатных функций (MAX,SUM,AVG, …).

Необходимо, чтобы в предложенииSELECT были заданы только требуемые в выходном потоке столбцы, перечисленные вGROUP BY и/или агрегированные значения. Распространённая ошибка — указание в предложенииSELECT столбца, пропущенного вGROUP BY.

HAVING

[править |править код]

HAVING — необязательное предложение оператораSELECT для отбора групп, получающихся в результатеGROUP BY.

При указанииHAVING <условия> можно указывать условия на столбцах, указанных вGROUP BY, и значениях агрегатных функций, вычисленных для каждой группы, образованнойGROUP BY.

ORDER BY

[править |править код]

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

Использование предложенияORDER BY является единственным способом отсортировать результирующий набор строк. Без этого предложения СУБД может вернуть строки в любом порядке. Если упорядочение необходимо,ORDER BY должен присутствовать вSELECT,UNION.

Сортировка может производиться как по возрастанию, так и по убыванию значений.

  • ПараметрASC (по умолчанию) устанавливает порядок сортировки по возрастанию, от меньших значений к большим.
  • ПараметрDESC устанавливает порядок сортировки по убыванию, от больших значений к меньшим.

Примеры

[править |править код]
Таблица «T»ЗапросРезультат
C1C2
1a
2b
SELECT*FROMT
C1C2
1a
2b
C1C2
1a
2b
SELECTC1FROMT
C1
1
2
C1C2
1a
2b
SELECT*FROMTWHEREC1=1
C1C2
1a
C1C2
1a
2b
SELECT*FROMTORDERBYC1DESC
C1C2
2b
1a

Для таблицы T запрос

SELECT*FROMT

вернёт все столбцы всех строк данной таблицы.Для той же таблицы запрос

SELECTC1FROMT

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

SELECT*FROMTWHEREC1=1

вернёт значения всех столбцов всех строк таблицы, у которых значение поля C1 равно 1. В терминахреляционной алгебры можно сказать, что была выполненавыборка.Последний запрос

SELECT*FROMTORDERBYC1DESC

вернёт те же строки, что и первый, однако результат будет отсортирован в обратном порядке (Z-A) из-за использования ключевого слова ORDER BY с полем C1 в качестве поля сортировки. Этот запрос не содержит ключевого слова WHERE, поэтому он вернёт всё, что есть в таблице. Несколько элементов ORDER BY могут быть указаны разделённые запятыми [напр. ORDER BY C1 ASC, C2 DESC] для более точной сортировки.

Отбирает все строки, где поле column_name равно одному из перечисленных значений value1, value2,…

SELECT*FROMtable_nameWHEREcolumn_nameIN(value1,value2,...)

Возвращает список идентификаторов отделов, продажи которых превысили 1000 за 1 января 2000 года, вместе с суммами продаж за этот день:

SELECTDeptID,SUM(SaleAmount)FROMSalesWHERESaleDate='01-Jan-2000'GROUPBYDeptIDHAVINGSUM(SaleAmount)>1000

Ограничение возвращаемых строк

[править |править код]

СогласноISOSQL:2003 возвращаемый набор данных может быть ограничен с помощью:

  • курсоров, или
  • введениемоконных функций в оператор SELECT

Оконная функция ROW_NUMBER()

[править |править код]

Существуют различныеоконные функции.ROW_NUMBER() OVER может быть использована дляпростого ограничения числа возвращаемых строк. Например, для возврата не более десяти строк:

SELECT*FROM(SELECTROW_NUMBER()OVER(ORDERBYkeyASC)ASrownumber,columnsFROMtablename)ASfooWHERErownumber<=10

ROW_NUMBER может быть недетерминированным: еслиkey не уникален, каждый раз при выполнении запроса возможно присвоение разных номеров строкам, у которыхkey совпадает. Когдаkey уникален, каждая строка будет всегда получать уникальный номер строки.

Оконная функция RANK()

[править |править код]

ФункцияRANK() OVER работает почти так же, как ROW_NUMBER, но может вернуть более чемn строк при определённых условиях. Например, для получения top-10 самых молодых людей:

SELECT*FROM(SELECTRANK()OVER(ORDERBYageASC)ASranking,person_id,person_name,ageFROMperson)ASfooWHEREranking<=10

Данный код может вернуть более чем 10 строк. Например, если есть два человека с одинаковым возрастом, он вернёт 11 строк.

Нестандартный синтаксис

[править |править код]

Не все СУБД поддерживают вышеуказанные оконные функции. При этом многие имеют нестандартный синтаксис для решения тех же задач. Ниже представлены вариантыпростого ограничения выборки для различных СУБД:

Производитель/СУБДСинтаксис ограничения
DB2(Поддерживает стандарт, начиная с DB2 Version 6)
SELECT*FROM[T]FETCHFIRST10ROWSONLY
Firebird
SELECTFIRST10*FROM[T]
Informix
SELECTFIRST10*FROM[T]
Interbase
SELECT*FROM[T]ROWS10
Microsoft(Поддерживает стандарт, начиная с SQL Server 2005)
Также
SELECTTOP10[PERCENT]*FROMTORDERBYcol
MySQL
SELECT*FROMTLIMIT10
SQLite
SELECT*FROMTLIMIT10
PostgreSQL(Поддерживает стандарт, начиная с PostgreSQL 8.4)
SELECT*FROMTLIMIT10
Oracle(Поддерживает стандарт, начиная с Oracle8i)
Также
SELECT*FROMTWHEREROWNUM<=10
У этой статьиесть 2 проблемы, помогите их исправить:
Информация должна бытьпроверяема, иначе она может быть удалена. Вы можетеотредактировать статью, добавив ссылки наавторитетные источники в видесносок.(20 сентября 2012)
Эту статью необходимоисправить в соответствии справилами Википедии об оформлении статей.
Пожалуйста, помогите улучшить эту статью.(20 сентября 2012)
Пожалуйста, после исправления проблемы удалите соответствующий шаблон. Узнать, как это сделать, можно насправочной странице.

Литература

[править |править код]
  • Chamberlin, Donald D.Early history of SQL. // IEEE Annals of the History of Computing 34.4 (2012): 78-82. (англ.)
  • Alex Kriegel, Boris M. Trukhnov. SQL Bible (2nd ed.). Wiley Publishing, 2008. (англ.)
  • Грубер М. Понимание SQL. — Москва, 1993. — 291 с.
Перейти к шаблону «SQL»
Версии
Ключевые слова
Связанные статьи
Части ISO/IEC SQL
Перейти к шаблону «Базы данных»
Типы
Концепции
Объекты
Ключи
Компоненты
SQL
DML
DDL
DCL
TCL
Источник —https://ru.wikipedia.org/w/index.php?title=Select_(SQL)&oldid=149825398
Категория:
Скрытые категории: