Выбрать (SQL)
Инструкция SQL SELECT возвращает результирующий набор строк из одной или нескольких таблиц . [1] [2]
Инструкция SELECT извлекает ноль или несколько строк из одной или нескольких таблиц или представлений базы данных . В большинстве приложений SELECT
— наиболее часто используемая команда языка манипулирования данными (DML). Поскольку SQL является декларативным языком программирования , SELECT
запросы указывают набор результатов, но не указывают, как его вычислить. База данных преобразует запрос в « план запроса », который может различаться в зависимости от исполнения, версии базы данных и программного обеспечения базы данных. Эта функция называется « оптимизатором запросов », поскольку она отвечает за поиск наилучшего плана выполнения запроса в рамках применимых ограничений.
Инструкция SELECT имеет множество необязательных предложений:
SELECT
list — это список столбцов или выражений SQL, возвращаемых запросом. Это примерно реляционной алгебры операция проецирования .AS
опционально предоставляет псевдоним для каждого столбца или выражения вSELECT
список. Это операция переименования реляционной алгебры .FROM
указывает, из какой таблицы следует получить данные. [3]WHERE
указывает, какие строки следует получить. Это примерно операция выбора реляционной алгебры .GROUP BY
группирует строки, имеющие общее свойство, чтобы агрегатную функцию . к каждой группе можно было применитьHAVING
выбирает одну из групп, определенных предложением GROUP BY.ORDER BY
указывает, как упорядочить возвращаемые строки.
Обзор
[ редактировать ]SELECT
— это наиболее распространенная операция в SQL, называемая «запрос». SELECT
извлекает данные из одной или нескольких таблиц или выражений. Стандартный SELECT
операторы не оказывают постоянного воздействия на базу данных. Некоторые нестандартные реализации SELECT
может иметь стойкие последствия, такие как SELECT INTO
синтаксис, предусмотренный в некоторых базах данных. [4]
Запросы позволяют пользователю описывать желаемые данные, предоставляя системе управления базами данных (СУБД) выполнение планирования , оптимизации и выполнения физических операций, необходимых для получения результата по ее выбору.
Запрос включает список столбцов, которые должны быть включены в окончательный результат, обычно сразу после SELECT
ключевое слово. Звездочка (" *
") можно использовать, чтобы указать, что запрос должен возвращать все столбцы всех запрошенных таблиц. SELECT
— это самый сложный оператор SQL с необязательными ключевыми словами и предложениями, в том числе:
- The
FROM
предложение, которое указывает таблицу(и), из которой нужно получить данные.FROM
пункт может включать необязательныйJOIN
подпункты для указания правил объединения таблиц. - The
WHERE
Предложение включает предикат сравнения, который ограничивает строки, возвращаемые запросом.WHERE
Предикат удаляет из набора результатов все строки, в которых предикат сравнения не имеет значения True. - The
GROUP BY
В этом предложении строки, имеющие общие значения, проецируются на меньший набор строк.GROUP BY
часто используется в сочетании с функциями агрегации SQL или для исключения повторяющихся строк из набора результатов.WHERE
оговорка применяется доGROUP BY
пункт. - The
HAVING
Предложение включает предикат, используемый для фильтрации строк, полученных в результатеGROUP BY
пункт. Поскольку он действует на основе результатовGROUP BY
функции агрегирования могут использоваться вHAVING
Предикат предложения. - The
ORDER BY
Предложение определяет, какие столбцы следует использовать для сортировки результирующих данных и в каком направлении их сортировать (по возрастанию или по убыванию). БезORDER BY
предложение, порядок строк, возвращаемых SQL-запросом, не определен. - The
DISTINCT
ключевое слово [5] исключает дублирование данных. [6]
Следующий пример SELECT
запрос возвращает список дорогих книг. Запрос извлекает все строки из таблицы Book , в которых столбец цены содержит значение больше 100,00. Результат сортируется в порядке возрастания названия . Звездочка (*) в списке выбора указывает, что все столбцы таблицы Book должны быть включены в набор результатов.
SELECT *
FROM Book
WHERE price > 100.00
ORDER BY title;
В приведенном ниже примере демонстрируется запрос нескольких таблиц, группировка и агрегирование путем возврата списка книг и количества авторов, связанных с каждой книгой.
SELECT Book.title AS Title,
count(*) AS Authors
FROM Book
JOIN Book_author
ON Book.isbn = Book_author.isbn
GROUP BY Book.title;
Пример вывода может выглядеть следующим образом:
Title Authors ---------------------- ------- SQL Examples and Guide 4 The Joy of SQL 1 An Introduction to SQL 2 Pitfalls of SQL 1
При условии, что isbn является единственным общим именем столбца в двух таблицах и что столбец с именем title существует только в таблице Book , можно переписать приведенный выше запрос в следующей форме:
SELECT title,
count(*) AS Authors
FROM Book
NATURAL JOIN Book_author
GROUP BY title;
Однако многие [ количественно ] Поставщики либо не поддерживают этот подход, либо требуют определенных соглашений об именах столбцов для эффективной работы естественных объединений.
SQL включает операторы и функции для вычисления значений хранимых значений. SQL позволяет использовать выражения в списке выбора для проецирования данных, как в следующем примере, который возвращает список книг стоимостью более 100,00 с дополнительным столбцом sales_tax , содержащим сумму налога с продаж, рассчитанную в размере 6% от цены .
SELECT isbn,
title,
price,
price * 0.06 AS sales_tax
FROM Book
WHERE price > 100.00
ORDER BY title;
Подзапросы
[ редактировать ]Запросы могут быть вложенными, чтобы результаты одного запроса можно было использовать в другом запросе с помощью оператора отношения или функции агрегирования. Вложенный запрос также известен как подзапрос . В то время как соединения и другие табличные операции во многих случаях обеспечивают превосходные в вычислительном отношении (то есть более быстрые) альтернативы (все зависит от реализации), использование подзапросов вводит иерархию в выполнении, которая может быть полезной или необходимой. В следующем примере функция агрегирования AVG
получает на вход результат подзапроса:
SELECT isbn,
title,
price
FROM Book
WHERE price < (SELECT AVG(price) FROM Book)
ORDER BY title;
Подзапрос может использовать значения из внешнего запроса, и в этом случае он называется коррелированным подзапросом .
С 1999 года стандарт SQL допускает предложения With, т.е. именованные подзапросы, часто называемые общими табличными выражениями (названные и разработанные в честь реализации IBM DB2 версии 2; Oracle называет их факторингом подзапросов ). CTE также могут быть рекурсивными, ссылаясь на себя; Получающийся в результате механизм позволяет обход дерева или графа (когда он представлен в виде отношений) и, в более общем плане, с фиксированной точкой вычисления .
Производная таблица
[ редактировать ]Производная таблица — это подзапрос в предложении FROM. По сути, производная таблица представляет собой подзапрос, из которого можно выбрать или присоединиться к нему. Функциональность производной таблицы позволяет пользователю ссылаться на подзапрос как на таблицу. Производная таблица также называется встроенным представлением или выбором из списка .
В следующем примере оператор SQL включает соединение исходной таблицы «Книги» с производной таблицей «Продажи». Эта производная таблица собирает связанную информацию о продажах книг с использованием ISBN для присоединения к таблице «Книги». В результате производная таблица предоставляет результирующий набор с дополнительными столбцами (количество проданных товаров и компания, продавшая книги):
SELECT b.isbn, b.title, b.price, sales.items_sold, sales.company_nm
FROM Book b
JOIN (SELECT SUM(Items_Sold) Items_Sold, Company_Nm, ISBN
FROM Book_Sales
GROUP BY Company_Nm, ISBN) sales
ON sales.isbn = b.isbn
Примеры
[ редактировать ]Стол «Т» | Запрос | Результат | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
SELECT * FROM T;
|
| ||||||||||||
|
SELECT C1 FROM T;
|
| ||||||||||||
|
SELECT * FROM T WHERE C1 = 1;
|
| ||||||||||||
|
SELECT * FROM T ORDER BY C1 DESC;
|
| ||||||||||||
не существует | SELECT 1+1, 3*2;
|
|
Учитывая таблицу T, запрос SELECT * FROM T
приведет к отображению всех элементов всех строк таблицы.
Для той же таблицы запрос SELECT C1 FROM T
приведет к отображению элементов из столбца C1 всех строк таблицы. Это похоже на проекцию в реляционной алгебре , за исключением того, что в общем случае результат может содержать повторяющиеся строки. В некоторых терминах базы данных это также известно как вертикальное разделение, ограничивающее вывод запроса для просмотра только указанных полей или столбцов.
Для той же таблицы запрос SELECT * FROM T WHERE C1 = 1
приведет к отображению всех элементов всех строк, где значение столбца C1 равно «1» — в реляционной алгебры терминах выбор будет выполнен из-за предложения WHERE. Это также известно как горизонтальное разделение, ограничивающее вывод строк по запросу в соответствии с указанными условиями.
Если таблиц несколько, результирующим набором будет каждая комбинация строк. Итак, если две таблицы — T1 и T2, SELECT * FROM T1, T2
приведет к каждой комбинации строк T1 с каждой строкой T2. Например, если T1 имеет 3 строки, а T2 — 5 строк, то в результате получится 15 строк.
Хотя это и не является стандартом, большинство СУБД позволяют использовать предложение выбора без таблицы, делая вид, что используется воображаемая таблица с одной строкой. В основном это используется для выполнения расчетов, где таблица не нужна.
Предложение SELECT определяет список свойств (столбцов) по имени или подстановочный знак («*»), обозначающий «все свойства».
Ограничение строк результатов
[ редактировать ]Часто бывает удобно указать максимальное количество возвращаемых строк. Это можно использовать для тестирования или для предотвращения чрезмерного потребления ресурсов, если запрос возвращает больше информации, чем ожидалось. Подход к этому часто варьируется в зависимости от поставщика.
В ISO SQL:2003 наборы результатов могут быть ограничены с помощью
- курсоры или
- добавив оконную функцию SQL в оператор SELECT
ISO SQL:2008 представил FETCH FIRST
пункт.
Согласно документации PostgreSQL v.9, оконная функция SQL «выполняет вычисления для набора строк таблицы, которые каким-то образом связаны с текущей строкой», аналогично агрегатным функциям. [7] Название напоминает оконные функции обработки сигналов . Вызов оконной функции всегда содержит предложение OVER .
Оконная функция ROW_NUMBER()
[ редактировать ]ROW_NUMBER() OVER
может использоваться для простой таблицы с возвращаемыми строками, например, для возврата не более десяти строк:
SELECT * FROM
( SELECT
ROW_NUMBER() OVER (ORDER BY sort_key ASC) AS row_number,
columns
FROM tablename
) AS foo
WHERE row_number <= 10
ROW_NUMBER может быть недетерминированным : если sort_key не уникален, каждый раз при выполнении запроса можно получить разные номера строк, назначенные любым строкам, где sort_key один и тот же. Если sort_key уникален, каждая строка всегда будет иметь уникальный номер строки.
Оконная функция РАНГ()
[ редактировать ]The RANK() OVER
оконная функция действует как ROW_NUMBER, но может возвращать больше или меньше n строк в случае равенства, например, чтобы вернуть 10 самых молодых людей:
SELECT * FROM (
SELECT
RANK() OVER (ORDER BY age ASC) AS ranking,
person_id,
person_name,
age
FROM person
) AS foo
WHERE ranking <= 10
Приведенный выше код может возвращать более десяти строк, например, если есть два человека одного возраста, он может возвращать одиннадцать строк.
FETCH FIRST предложение
[ редактировать ]Поскольку пределы результатов ISO SQL:2008 можно указать, как в следующем примере, с помощью FETCH FIRST
пункт.
SELECT * FROM T
FETCH FIRST 10 ROWS ONLY
В настоящее время это предложение поддерживается CA DATACOM/DB 11, IBM DB2, SAP SQL Anywhere, PostgreSQL, EffiProz, H2, HSQLDB версии 2.0, Oracle 12c и Mimer SQL .
Microsoft SQL Server 2008 и более поздних версий поддерживает FETCH FIRST
, но считается частью ORDER BY
пункт. ORDER BY
, OFFSET
, и FETCH FIRST
все предложения необходимы для этого использования.
SELECT * FROM T
ORDER BY acolumn DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY
Нестандартный синтаксис
[ редактировать ]Некоторые СУБД предлагают нестандартный синтаксис вместо стандартного синтаксиса SQL или в дополнение к нему. Ниже варианты простого запроса лимита приведены для разных СУБД:
SET ROWCOUNT 10
SELECT * FROM T
|
MS SQL Server (это также работает на Microsoft SQL Server 6.5, а опция « Выбрать верхние 10 * из T» — нет) |
SELECT * FROM T
LIMIT 10 OFFSET 20
|
Netezza , MySQL , MariaDB (также поддерживает стандартную версию, начиная с версии 10.6), SAP SQL Anywhere , PostgreSQL (также поддерживает стандарт, начиная с версии 8.4), SQLite , HSQLDB , H2 , Vertica , Polyhedra , Couchbase Server , Snowflake Computing , OpenLink Виртуоз |
SELECT * from T
WHERE ROWNUM <= 10
|
Оракул |
SELECT FIRST 10 * from T
|
Энгр |
SELECT FIRST 10 * FROM T order by a
|
Информикс |
SELECT SKIP 20 FIRST 10 * FROM T order by c, d
|
Informix (номера строк фильтруются после оценки порядка по. Предложение SKIP было введено в пакете исправлений v10.00.xC4) |
SELECT TOP 10 * FROM T
|
MS SQL Server , SAP ASE , MS Access , SAP IQ , Teradata |
SELECT * FROM T
SAMPLE 10
|
Терадата |
SELECT TOP 20, 10 * FROM T
|
OpenLink Virtuoso (пропускает 20, доставляет следующие 10) [8] |
SELECT TOP 10 START AT 20 * FROM T
|
SAP SQL Anywhere (также поддерживает стандарт, начиная с версии 9.0.1) |
SELECT FIRST 10 SKIP 20 * FROM T
|
Жар-птица |
SELECT * FROM T
ROWS 20 TO 30
|
Жар-птица (начиная с версии 2.1) |
SELECT * FROM T
WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY
|
IBM DB2 |
SELECT * FROM T
WHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY
|
IBM Db2 (новые строки фильтруются после сравнения с ключевым столбцом таблицы T) |
Пагинация строк
[ редактировать ]Пагинация строк [9] — это подход, используемый для ограничения и отображения только части общих данных запроса в базе данных. Вместо одновременного отображения сотен или тысяч строк серверу запрашивается только одна страница (ограниченный набор строк, например только 10 строк), и пользователь начинает навигацию, запрашивая следующую страницу, а затем следующую. , и так далее. Это очень полезно, особенно в веб-системах, где нет выделенного соединения между клиентом и сервером, поэтому клиенту не приходится ждать, чтобы прочитать и отобразить все строки сервера.
Данные в подходе к разбиению на страницы
[ редактировать ]{rows}
= Количество строк на странице{page_number}
= Номер текущей страницы{begin_base_0}
= Номер строки – 1, где начинается страница = (номер_страницы-1) * строки
Самый простой метод (но очень неэффективный)
[ редактировать ]- Выбрать все строки из базы данных
- Прочитайте все строки, но отправьте их на отображение только тогда, когда row_number считанных строк находится между
{begin_base_0 + 1}
и{begin_base_0 + rows}
Select *
from {table}
order by {unique_key}
Другой простой метод (немного более эффективный, чем чтение всех строк)
[ редактировать ]- Выберите все строки от начала таблицы до последней строки для отображения (
{begin_base_0 + rows}
) - Прочтите
{begin_base_0 + rows}
строки, но отправляются на отображение только тогда, когда row_number считанных строк больше, чем{begin_base_0}
SQL | Диалект |
---|---|
select *
from {table}
order by {unique_key}
FETCH FIRST {begin_base_0 + rows} ROWS ONLY
|
SQL ANSI 2008 PostgreSQL SQL-сервер 2012 дерби Оракул 12с ДБ2 12 Мимер SQL |
Select *
from {table}
order by {unique_key}
LIMIT {begin_base_0 + rows}
|
MySQL SQLite |
Select TOP {begin_base_0 + rows} *
from {table}
order by {unique_key}
|
SQL-сервер 2005 |
Select *
from {table}
order by {unique_key}
ROWS LIMIT {begin_base_0 + rows}
|
Sybase, ASE 16 SP2 |
SET ROWCOUNT {begin_base_0 + rows}
Select *
from {table}
order by {unique_key}
SET ROWCOUNT 0
|
Sybase, SQL Server 2000. |
Select *
FROM (
SELECT *
FROM {table}
ORDER BY {unique_key}
) a
where rownum <= {begin_base_0 + rows}
|
Оракул 11 |
Метод с позиционированием
[ редактировать ]- Выбрать только
{rows}
строки, начиная со следующей строки для отображения ({begin_base_0 + 1}
) - Чтение и отправка для отображения всех строк, прочитанных из базы данных.
SQL | Диалект |
---|---|
Select *
from {table}
order by {unique_key}
OFFSET {begin_base_0} ROWS
FETCH NEXT {rows} ROWS ONLY
|
SQL ANSI 2008 PostgreSQL SQL-сервер 2012 дерби Оракул 12с ДБ2 12 Мимер SQL |
Select *
from {table}
order by {unique_key}
LIMIT {rows} OFFSET {begin_base_0}
|
MySQL МарияДБ PostgreSQL SQLite |
Select *
from {table}
order by {unique_key}
LIMIT {begin_base_0}, {rows}
|
MySQL МарияДБ SQLite |
Select *
from {table}
order by {unique_key}
ROWS LIMIT {rows} OFFSET {begin_base_0}
|
Sybase, ASE 16 SP2 |
Select TOP {begin_base_0 + rows}
*, _offset=identity(10)
into #temp
from {table}
ORDER BY {unique_key}
select * from #temp where _offset > {begin_base_0}
DROP TABLE #temp
|
Сибас 12.5.3: |
SET ROWCOUNT {begin_base_0 + rows}
select *, _offset=identity(10)
into #temp
from {table}
ORDER BY {unique_key}
select * from #temp where _offset > {begin_base_0}
DROP TABLE #temp
SET ROWCOUNT 0
|
Сибас 12.5.2: |
select TOP {rows} *
from (
select *, ROW_NUMBER() over (order by {unique_key}) as _offset
from {table}
) xx
where _offset > {begin_base_0}
|
SQL-сервер 2005 |
SET ROWCOUNT {begin_base_0 + rows}
select *, _offset=identity(int,1,1)
into #temp
from {table}
ORDER BY {unique-key}
select * from #temp where _offset > {begin_base_0}
DROP TABLE #temp
SET ROWCOUNT 0
|
SQL-сервер 2000 |
SELECT * FROM (
SELECT rownum-1 as _offset, a.*
FROM(
SELECT *
FROM {table}
ORDER BY {unique_key}
) a
WHERE rownum <= {begin_base_0 + cant_regs}
)
WHERE _offset >= {begin_base_0}
|
Оракул 11 |
Метод с фильтром (более сложный, но необходимый для очень большого набора данных)
[ редактировать ]- Выбирайте только тогда
{rows}
строки с фильтром:- Первая страница: выберите только первую
{rows}
строки, в зависимости от типа базы данных - Следующая страница: выберите только первую
{rows}
строк, в зависимости от типа базы данных, в которой{unique_key}
больше, чем{last_val}
(стоимость{unique_key}
последней строки на текущей странице) - Предыдущая страница: отсортируйте данные в обратном порядке, выберите только первые
{rows}
ряды, где{unique_key}
меньше, чем{first_val}
(стоимость{unique_key}
первой строки на текущей странице) и отсортируйте результат в правильном порядке.
- Первая страница: выберите только первую
- Чтение и отправка для отображения всех строк, прочитанных из базы данных.
Первая страница | Следующая страница | Предыдущая страница | Диалект |
---|---|---|---|
select *
from {table}
order by {unique_key}
FETCH FIRST {rows} ROWS ONLY
|
select *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
FETCH FIRST {rows} ROWS ONLY
|
select *
from (
select *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
FETCH FIRST {rows} ROWS ONLY
) a
order by {unique_key}
|
SQL ANSI 2008 PostgreSQL SQL-сервер 2012 дерби Оракул 12с ДБ2 12 Мимер SQL |
select *
from {table}
order by {unique_key}
LIMIT {rows}
|
select *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
LIMIT {rows}
|
select *
from (
select *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
LIMIT {rows}
) a
order by {unique_key}
|
MySQL SQLite |
select TOP {rows} *
from {table}
order by {unique_key}
|
select TOP {rows} *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
|
select *
from (
select TOP {rows} *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
) a
order by {unique_key}
|
SQL-сервер 2005 |
SET ROWCOUNT {rows}
select *
from {table}
order by {unique_key}
SET ROWCOUNT 0
|
SET ROWCOUNT {rows}
select *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
SET ROWCOUNT 0
|
SET ROWCOUNT {rows}
select *
from (
select *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
) a
order by {unique_key}
SET ROWCOUNT 0
|
Sybase, SQL Server 2000. |
select *
from (
select *
from {table}
order by {unique_key}
) a
where rownum <= {rows}
|
select *
from (
select *
from {table}
where {unique_key} > {last_val}
order by {unique_key}
) a
where rownum <= {rows}
|
select *
from (
select *
from (
select *
from {table}
where {unique_key} < {first_val}
order by {unique_key} DESC
) a1
where rownum <= {rows}
) a2
order by {unique_key}
|
Оракул 11 |
Иерархический запрос
[ редактировать ]Некоторые базы данных предоставляют специальный синтаксис для иерархических данных .
Оконная функция в SQL:2003 — это агрегатная функция, применяемая к разделу набора результатов.
Например,
sum(population) OVER( PARTITION BY city )
вычисляет сумму населения всех строк, имеющих то же значение города , что и текущая строка.
Разделы указываются с помощью предложения OVER , которое изменяет агрегат. Синтаксис:
<OVER_CLAUSE> :: =
OVER ( [ PARTITION BY <expr>, ... ]
[ ORDER BY <expression> ] )
Предложение OVER позволяет разделить и упорядочить набор результатов. Порядок используется для функций, относящихся к порядку, таких как row_number.
Оценка запроса ANSI
[ редактировать ]Обработка оператора SELECT в соответствии с ANSI SQL будет следующей: [10]
select g.* from users u inner join groups g on g.Userid = u.Userid where u.LastName = 'Smith' and u.FirstName = 'John'
- оценивается предложение FROM, для первых двух таблиц в предложении FROM создается перекрестное соединение или декартово произведение, в результате чего получается виртуальная таблица как Vtable1.
- предложение ON оценивается для vtable1; в Vtable2 вставляются только записи, соответствующие условию объединения g.Userid = u.Userid.
- Если указано внешнее соединение, записи, удаленные из vTable2, добавляются в VTable 3, например, если приведенный выше запрос был:
все пользователи, не входящие ни в одну группу, будут добавлены обратно в Vtable3
select u.* from users u left join groups g on g.Userid = u.Userid where u.LastName = 'Smith' and u.FirstName = 'John'
- оценивается предложение WHERE, в этом случае в vTable4 будет добавлена только информация о группе для пользователя John Smith.
- оценивается GROUP BY; если бы приведенный выше запрос был:
vTable5 будет состоять из элементов, возвращенных из vTable4, упорядоченных по группам, в данном случае GroupName.
select g.GroupName, count(g.*) as NumberOfMembers from users u inner join groups g on g.Userid = u.Userid group by GroupName
- предложение HAVING оценивается для групп, для которых предложение HAVING истинно, и вставляется в vTable6. Например:
select g.GroupName, count(g.*) as NumberOfMembers from users u inner join groups g on g.Userid = u.Userid group by GroupName having count(g.*) > 5
- список SELECT оценивается и возвращается как Vtable 7
- оценивается предложение DISTINCT; повторяющиеся строки удаляются и возвращаются как Vtable 8.
- предложение ORDER BY оценивается, упорядочивая строки и возвращая VCursor9. Это курсор, а не таблица, поскольку ANSI определяет курсор как упорядоченный набор строк (не реляционный).
Поддержка оконных функций поставщиками СУРБД
[ редактировать ]Реализация оконных функций поставщиками реляционных баз данных и механизмов SQL сильно различается. Большинство баз данных поддерживают по крайней мере некоторые разновидности оконных функций. Однако если мы присмотримся повнимательнее, станет ясно, что большинство поставщиков реализуют лишь часть стандарта. Давайте возьмем в качестве примера мощное предложение RANGE. Только Oracle, DB2, Spark/Hive и Google Big Query полностью реализуют эту функцию. Совсем недавно поставщики добавили к стандарту новые расширения, например, функции агрегирования массивов. Это особенно полезно в контексте запуска SQL в распределенной файловой системе (Hadoop, Spark, Google BigQuery), где у нас более слабые гарантии совместной локальности данных, чем в распределенной реляционной базе данных (MPP). Вместо того, чтобы равномерно распределять данные по всем узлам, механизмы SQL, выполняющие запросы к распределенной файловой системе, могут обеспечить гарантии совместной локальности данных за счет вложения данных и, таким образом, избегая потенциально дорогостоящих объединений, связанных с тяжелым перетасовкой по сети. Пользовательские агрегатные функции, которые можно использовать в оконных функциях, являются еще одной чрезвычайно мощной функцией.
Генерация данных в T-SQL
[ редактировать ]Метод генерации данных на основе объединения всех
select 1 a, 1 b union all
select 1, 2 union all
select 1, 3 union all
select 2, 1 union all
select 5, 1
SQL Server 2008 поддерживает функцию «конструктора строк», указанную в SQL:1999. стандарте
select *
from (values (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) as x(a, b)
Ссылки
[ редактировать ]- ^ Microsoft (23 мая 2023 г.). «Соглашения о синтаксисе Transact-SQL» .
- ^ MySQL. «Синтаксис SQL SELECT» .
- ^ Пропуск предложения FROM не является стандартным, но допускается большинством основных СУБД.
- ^ «Справочник по Transact-SQL». Справочник по языку SQL Server . Электронная документация по SQL Server 2005. Майкрософт. 15 сентября 2007 г. Проверено 17 июня 2007 г.
- ^
Руководство пользователя по процедурам SAS 9.4 SQL . Институт SAS (опубликовано в 2013 г.). 10 июля 2013 г. с. 248. ИСБН 9781612905686 . Проверено 21 октября 2015 г.
Хотя аргумент UNIQUE идентичен аргументу DISTINCT, он не является стандартом ANSI.
- ^
Леон, Алексис ; Леон, Мэтьюз (1999). «Устранение дубликатов — ВЫБРАТЬ с помощью DISTINCT». SQL: Полный справочник . Нью-Дели: Tata McGraw-Hill Education (опубликовано в 2008 г.). п. 143. ИСБН 9780074637081 . Проверено 21 октября 2015 г.
[...] ключевое слово DISTINCT [...] удаляет дубликаты из набора результатов.
- ^ Документация PostgreSQL 9.1.24 — Глава 3. Расширенные функции.
- ^ Программное обеспечение OpenLink. «19.9.10. Опция TOP SELECT» . docs.openlinksw.com . Проверено 1 октября 2019 г.
- ^ Оскар Бонилья, MBA.
- ^ Внутри Microsoft SQL Server 2005: Запросы T-SQL, Ицик Бен-Ган, Любор Коллар и Деян Сарка
Источники
[ редактировать ]- Горизонтальное и вертикальное секционирование, Электронная документация по Microsoft SQL Server 2000.