Select (SQL)

Поделись знанием:
Перейти к: навигация, поиск

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

В большинстве случаев, выборка осуществляется из одной или нескольких таблиц. В последнем случае говорят об операции слияния — JOIN. В тех СУБД, где реализованы представления (англ. view) и хранимые процедуры (англ. stored procedure), также возможно получение соответствующих наборов данных.

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

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

Особую роль играет обработка NULL-значений, когда при слиянии, например, двух таблиц — главной (англ. master) и подчинённой (англ. detail) — имеются или отсутствуют соответствия между записями таблиц, участвующих в слиянии. Для решения этой задачи используются механизмы внутреннего (англ. inner) и внешнего (англ. outer) слияния.

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





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

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

SELECT 
       [DISTINCT | DISTINCTROW | ALL]
       select_expression,...
   FROM table_references
     [WHERE where_definition]
     [GROUP BY {unsigned_integer | col_name | formula}]
     [HAVING where_definition]
     [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]

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

SELECT список полей FROM список таблиц WHERE условия…

Основные ключевые слова, относящиеся к запросу SELECT:

  • WHERE — используется для определения, какие строки должны быть выбраны или включены в GROUP BY.
  • GROUP BY — используется для объединения строк с общими значениями в элементы меньшего набора строк.
  • HAVING — используется для определения, какие строки после GROUP BY должны быть выбраны.
  • ORDER BY — используется для определения, какие столбцы используются для сортировки результирующего набора данных.

Примеры

Таблица «T» Запрос Результат
C1 C2
1 a
2 b
SELECT * FROM T;
C1 C2
1 a
2 b
C1 C2
1 a
2 b
SELECT C1 FROM T;
C1
1
2
C1 C2
1 a
2 b
SELECT * FROM T WHERE C1 = 1;
C1 C2
1 a
C1 C2
1 a
2 b
SELECT * FROM T ORDER BY C1 DESC;
C1 C2
2 b
1 a
Для таблицы T запрос
SELECT * FROM T;
вернёт все столбцы всех строк данной таблицы. Для той же таблицы запрос
SELECT C1 FROM T;
вернёт значения столбца C1 всех строк таблицы— в терминах реляционной алгебры можно сказать, что была выполнена проекция. Для той же таблицы запрос
SELECT * FROM T WHERE C1 = 1;
вернёт значения всех столбцов всех строк таблицы, у которых значение поля C1 равно '1'— в терминах реляционной алгебры можно сказать, что была выполнена выборка, так как присутствует ключевое слово WHERE. Последний запрос
SELECT * FROM T ORDER BY C1 DESC;
вернёт те же строки, что и первый, однако результат будет отсортирован в обратном порядке (Z-A) из-за использования ключевого слова ORDER BY с полем C1 в качестве поля сортировки. Этот запрос не содержит ключевого слова WHERE, поэтому он вернёт всё, что есть в таблице. Несколько элементов ORDER BY могут быть указаны разделённые запятыми [напр. ORDER BY C1 ASC, C2 DESC] для более точной сортировки.


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

SELECT *
FROM table_name
WHERE column_name IN (value1,value2,...)

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

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

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

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

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

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
    columns
  FROM tablename
) AS foo
WHERE rownumber <= 10

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

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

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

SELECT * FROM (
  SELECT
    RANK() OVER (ORDER BY age ASC) AS ranking,
    person_id,
    person_name,
    age
  FROM person
) AS foo
WHERE ranking <= 10

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

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

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

Производитель/СУБД Синтаксис ограничения
DB2 (Поддерживает стандарт, начиная с DB2 Version 6)
SELECT * FROM [T] FETCH FIRST 10 ROWS ONLY
Firebird SELECT FIRST 10 * FROM [T]
Informix SELECT FIRST 10 * FROM [T]
Interbase SELECT * FROM [T] ROWS 10
Microsoft (Поддерживает стандарт, начиная с SQL Server 2005)
Также SELECT TOP 10 [PERCENT] * FROM T ORDER BY col
MySQL SELECT * FROM T LIMIT 10
SQLite SELECT * FROM T LIMIT 10
PostgreSQL (Поддерживает стандарт, начиная с PostgreSQL 8.4)
SELECT * FROM T LIMIT 10
Oracle (Поддерживает стандарт, начиная с Oracle8i)
Также SELECT * from T WHERE ROWNUM <= 10

Напишите отзыв о статье "Select (SQL)"

Отрывок, характеризующий Select (SQL)

В числе всех мыслей и голосов в этом огромном, беспокойном, блестящем и гордом мире князь Андрей видел следующие, более резкие, подразделения направлений и партий.
Первая партия была: Пфуль и его последователи, теоретики войны, верящие в то, что есть наука войны и что в этой науке есть свои неизменные законы, законы облического движения, обхода и т. п. Пфуль и последователи его требовали отступления в глубь страны, отступления по точным законам, предписанным мнимой теорией войны, и во всяком отступлении от этой теории видели только варварство, необразованность или злонамеренность. К этой партии принадлежали немецкие принцы, Вольцоген, Винцингероде и другие, преимущественно немцы.
Вторая партия была противуположная первой. Как и всегда бывает, при одной крайности были представители другой крайности. Люди этой партии были те, которые еще с Вильны требовали наступления в Польшу и свободы от всяких вперед составленных планов. Кроме того, что представители этой партии были представители смелых действий, они вместе с тем и были представителями национальности, вследствие чего становились еще одностороннее в споре. Эти были русские: Багратион, начинавший возвышаться Ермолов и другие. В это время была распространена известная шутка Ермолова, будто бы просившего государя об одной милости – производства его в немцы. Люди этой партии говорили, вспоминая Суворова, что надо не думать, не накалывать иголками карту, а драться, бить неприятеля, не впускать его в Россию и не давать унывать войску.
К третьей партии, к которой более всего имел доверия государь, принадлежали придворные делатели сделок между обоими направлениями. Люди этой партии, большей частью не военные и к которой принадлежал Аракчеев, думали и говорили, что говорят обыкновенно люди, не имеющие убеждений, но желающие казаться за таковых. Они говорили, что, без сомнения, война, особенно с таким гением, как Бонапарте (его опять называли Бонапарте), требует глубокомысленнейших соображений, глубокого знания науки, и в этом деле Пфуль гениален; но вместе с тем нельзя не признать того, что теоретики часто односторонни, и потому не надо вполне доверять им, надо прислушиваться и к тому, что говорят противники Пфуля, и к тому, что говорят люди практические, опытные в военном деле, и изо всего взять среднее. Люди этой партии настояли на том, чтобы, удержав Дрисский лагерь по плану Пфуля, изменить движения других армий. Хотя этим образом действий не достигалась ни та, ни другая цель, но людям этой партии казалось так лучше.
Четвертое направление было направление, которого самым видным представителем был великий князь, наследник цесаревич, не могший забыть своего аустерлицкого разочарования, где он, как на смотр, выехал перед гвардиею в каске и колете, рассчитывая молодецки раздавить французов, и, попав неожиданно в первую линию, насилу ушел в общем смятении. Люди этой партии имели в своих суждениях и качество и недостаток искренности. Они боялись Наполеона, видели в нем силу, в себе слабость и прямо высказывали это. Они говорили: «Ничего, кроме горя, срама и погибели, из всего этого не выйдет! Вот мы оставили Вильну, оставили Витебск, оставим и Дриссу. Одно, что нам остается умного сделать, это заключить мир, и как можно скорее, пока не выгнали нас из Петербурга!»
Воззрение это, сильно распространенное в высших сферах армии, находило себе поддержку и в Петербурге, и в канцлере Румянцеве, по другим государственным причинам стоявшем тоже за мир.
Пятые были приверженцы Барклая де Толли, не столько как человека, сколько как военного министра и главнокомандующего. Они говорили: «Какой он ни есть (всегда так начинали), но он честный, дельный человек, и лучше его нет. Дайте ему настоящую власть, потому что война не может идти успешно без единства начальствования, и он покажет то, что он может сделать, как он показал себя в Финляндии. Ежели армия наша устроена и сильна и отступила до Дриссы, не понесши никаких поражений, то мы обязаны этим только Барклаю. Ежели теперь заменят Барклая Бенигсеном, то все погибнет, потому что Бенигсен уже показал свою неспособность в 1807 году», – говорили люди этой партии.
Шестые, бенигсенисты, говорили, напротив, что все таки не было никого дельнее и опытнее Бенигсена, и, как ни вертись, все таки придешь к нему. И люди этой партии доказывали, что все наше отступление до Дриссы было постыднейшее поражение и беспрерывный ряд ошибок. «Чем больше наделают ошибок, – говорили они, – тем лучше: по крайней мере, скорее поймут, что так не может идти. А нужен не какой нибудь Барклай, а человек, как Бенигсен, который показал уже себя в 1807 м году, которому отдал справедливость сам Наполеон, и такой человек, за которым бы охотно признавали власть, – и таковой есть только один Бенигсен».
Седьмые – были лица, которые всегда есть, в особенности при молодых государях, и которых особенно много было при императоре Александре, – лица генералов и флигель адъютантов, страстно преданные государю не как императору, но как человека обожающие его искренно и бескорыстно, как его обожал Ростов в 1805 м году, и видящие в нем не только все добродетели, но и все качества человеческие. Эти лица хотя и восхищались скромностью государя, отказывавшегося от командования войсками, но осуждали эту излишнюю скромность и желали только одного и настаивали на том, чтобы обожаемый государь, оставив излишнее недоверие к себе, объявил открыто, что он становится во главе войска, составил бы при себе штаб квартиру главнокомандующего и, советуясь, где нужно, с опытными теоретиками и практиками, сам бы вел свои войска, которых одно это довело бы до высшего состояния воодушевления.
Восьмая, самая большая группа людей, которая по своему огромному количеству относилась к другим, как 99 к 1 му, состояла из людей, не желавших ни мира, ни войны, ни наступательных движений, ни оборонительного лагеря ни при Дриссе, ни где бы то ни было, ни Барклая, ни государя, ни Пфуля, ни Бенигсена, но желающих только одного, и самого существенного: наибольших для себя выгод и удовольствий. В той мутной воде перекрещивающихся и перепутывающихся интриг, которые кишели при главной квартире государя, в весьма многом можно было успеть в таком, что немыслимо бы было в другое время. Один, не желая только потерять своего выгодного положения, нынче соглашался с Пфулем, завтра с противником его, послезавтра утверждал, что не имеет никакого мнения об известном предмете, только для того, чтобы избежать ответственности и угодить государю. Другой, желающий приобрести выгоды, обращал на себя внимание государя, громко крича то самое, на что намекнул государь накануне, спорил и кричал в совете, ударяя себя в грудь и вызывая несоглашающихся на дуэль и тем показывая, что он готов быть жертвою общей пользы. Третий просто выпрашивал себе, между двух советов и в отсутствие врагов, единовременное пособие за свою верную службу, зная, что теперь некогда будет отказать ему. Четвертый нечаянно все попадался на глаза государю, отягченный работой. Пятый, для того чтобы достигнуть давно желанной цели – обеда у государя, ожесточенно доказывал правоту или неправоту вновь выступившего мнения и для этого приводил более или менее сильные и справедливые доказательства.