Select (SQL)
- Правильный заголовок этой статьи — SELECT (SQL). Он показан некорректно из-за технических ограничений.
| Эту страницу предлагается объединить с Having (SQL), GROUP BY (SQL), ORDER BY (SQL).
Пояснение причин и обсуждение — на странице Википедия:К объединению/19 апреля 2015.
Обсуждение длится одну неделю (или дольше, если оно идёт медленно). Дата начала обсуждения — 2015-04-19. Если обсуждение не требуется (очевидный случай), используйте другие шаблоны. Не удаляйте шаблон до подведения итога обсуждения. |
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» | Запрос | Результат | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
SELECT * FROM T;
|
|
||||||||||||
|
SELECT C1 FROM T;
|
|
||||||||||||
|
SELECT * FROM T WHERE C1 = 1;
|
|
||||||||||||
|
SELECT * FROM T ORDER BY C1 DESC;
|
|
Для таблицы 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 |
Для улучшения этой статьи желательно?:
|
| SQL | |
|---|---|
| Версии | SQL-86 • SQL-89 • SQL-92 • SQL:1999 • SQL:2003 • SQL:2006 • SQL:2008 • SQL:2011 |
| Ключевые слова | As • Case • Create • Delete • From • Group by • Having • Insert • Join • Merge • Null • Order by • Prepare • Select • Truncate • Union • Update • Where • With |
| Связанные статьи | Эдгар Кодд • Реляционная база данных |
| Части ISO/IEC SQL | Framework • Foundation • Call-Level Interface • Persistent Stored Modules • Management of External Data • Object Language Bindings • Information and Definition Schemas • SQL Routines and Types for the Java Programming Language • XML-Related Specifications |
| Базы данных | |
|---|---|
| Концепции |
Модель данных • Реляционная (модель • алгебра • Нормальная форма • Ссылочная целостность • БД • СУБД) • Иерархическая модель • Сетевая (модель • СУБД) • Объектно-ориентированная (БД • СУБД) • Транзакция • Журнализация • Секционирование |
| Объекты | |
| Ключи |
Потенциальный • Первичный • Внешний • Естественный • Суррогатный (искусственный) • Суперключ |
| SQL | |
| СУБД |
IMS • DB2 • Informix • Oracle Database • Microsoft SQL Server • Adaptive Server Enterprise • Teradata Database • Firebird • PostgreSQL • MySQL • SQLite • Microsoft Access • Visual FoxPro • ЛИНТЕР • CouchDB • MongoDB • Caché |
| Компоненты | |



