Jump to content

Выбрать (SQL)

(Перенаправлено из SQL-запросов )

Инструкция SQL SELECT возвращает результирующий набор строк из одной или нескольких таблиц . [1] [2]

Инструкция SELECT извлекает ноль или несколько строк из одной или нескольких таблиц или представлений базы данных . В большинстве приложений SELECT — наиболее часто используемая команда языка манипулирования данными (DML). Поскольку SQL является декларативным языком программирования , SELECT запросы указывают набор результатов, но не указывают, как его вычислить. База данных преобразует запрос в « план запроса », который может различаться в зависимости от исполнения, версии базы данных и программного обеспечения базы данных. Эта функция называется « оптимизатором запросов », поскольку она отвечает за поиск наилучшего плана выполнения запроса в рамках применимых ограничений.

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

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
Стол «Т» Запрос Результат
С1 С2
1 а
2 б
SELECT * FROM T;
С1 С2
1 а
2 б
С1 С2
1 а
2 б
SELECT C1 FROM T;
С1
1
2
С1 С2
1 а
2 б
SELECT * FROM T WHERE C1 = 1;
С1 С2
1 а
С1 С2
1 а
2 б
SELECT * FROM T ORDER BY C1 DESC;
С1 С2
2 б
1 а
не существует SELECT 1+1, 3*2;
`1+1` `3*2`
2 6

Учитывая таблицу 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 наборы результатов могут быть ограничены с помощью

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) * строки

Самый простой метод (но очень неэффективный)

[ редактировать ]
  1. Выбрать все строки из базы данных
  2. Прочитайте все строки, но отправьте их на отображение только тогда, когда row_number считанных строк находится между {begin_base_0 + 1} и {begin_base_0 + rows}
Select * 
from {table} 
order by {unique_key}

Другой простой метод (немного более эффективный, чем чтение всех строк)

[ редактировать ]
  1. Выберите все строки от начала таблицы до последней строки для отображения ( {begin_base_0 + rows})
  2. Прочтите {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


Метод с позиционированием

[ редактировать ]
  1. Выбрать только {rows} строки, начиная со следующей строки для отображения ( {begin_base_0 + 1})
  2. Чтение и отправка для отображения всех строк, прочитанных из базы данных.
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


Метод с фильтром (более сложный, но необходимый для очень большого набора данных)

[ редактировать ]
  1. Выбирайте только тогда {rows} строки с фильтром:
    1. Первая страница: выберите только первую {rows} строки, в зависимости от типа базы данных
    2. Следующая страница: выберите только первую {rows} строк, в зависимости от типа базы данных, в которой {unique_key} больше, чем {last_val} (стоимость {unique_key} последней строки на текущей странице)
    3. Предыдущая страница: отсортируйте данные в обратном порядке, выберите только первые {rows} ряды, где {unique_key} меньше, чем {first_val} (стоимость {unique_key} первой строки на текущей странице) и отсортируйте результат в правильном порядке.
  2. Чтение и отправка для отображения всех строк, прочитанных из базы данных.
Первая страница Следующая страница Предыдущая страница Диалект
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]

  1. select g.*
    from users u inner join groups g on g.Userid = u.Userid
    where u.LastName = 'Smith'
    and u.FirstName = 'John'
    
  2. оценивается предложение FROM, для первых двух таблиц в предложении FROM создается перекрестное соединение или декартово произведение, в результате чего получается виртуальная таблица как Vtable1.
  3. предложение ON оценивается для vtable1; в Vtable2 вставляются только записи, соответствующие условию объединения g.Userid = u.Userid.
  4. Если указано внешнее соединение, записи, удаленные из vTable2, добавляются в VTable 3, например, если приведенный выше запрос был:
    select u.*
    from users u left join groups g on g.Userid = u.Userid
    where u.LastName = 'Smith'
    and u.FirstName = 'John'
    
    все пользователи, не входящие ни в одну группу, будут добавлены обратно в Vtable3
  5. оценивается предложение WHERE, в этом случае в vTable4 будет добавлена ​​только информация о группе для пользователя John Smith.
  6. оценивается GROUP BY; если бы приведенный выше запрос был:
    select g.GroupName, count(g.*) as NumberOfMembers
    from users u inner join groups g on g.Userid = u.Userid
    group by GroupName
    
    vTable5 будет состоять из элементов, возвращенных из vTable4, упорядоченных по группам, в данном случае GroupName.
  7. предложение 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
    
  8. список SELECT оценивается и возвращается как Vtable 7
  9. оценивается предложение DISTINCT; повторяющиеся строки удаляются и возвращаются как Vtable 8.
  10. предложение 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)
  1. ^ Microsoft (23 мая 2023 г.). «Соглашения о синтаксисе Transact-SQL» .
  2. ^ MySQL. «Синтаксис SQL SELECT» .
  3. ^ Пропуск предложения FROM не является стандартным, но допускается большинством основных СУБД.
  4. ^ «Справочник по Transact-SQL». Справочник по языку SQL Server . Электронная документация по SQL Server 2005. Майкрософт. 15 сентября 2007 г. Проверено 17 июня 2007 г.
  5. ^ Руководство пользователя по процедурам SAS 9.4 SQL . Институт SAS (опубликовано в 2013 г.). 10 июля 2013 г. с. 248. ИСБН  9781612905686 . Проверено 21 октября 2015 г. Хотя аргумент UNIQUE идентичен аргументу DISTINCT, он не является стандартом ANSI.
  6. ^ Леон, Алексис ; Леон, Мэтьюз (1999). «Устранение дубликатов — ВЫБРАТЬ с помощью DISTINCT». SQL: Полный справочник . Нью-Дели: Tata McGraw-Hill Education (опубликовано в 2008 г.). п. 143. ИСБН  9780074637081 . Проверено 21 октября 2015 г. [...] ключевое слово DISTINCT [...] удаляет дубликаты из набора результатов.
  7. ^ Документация PostgreSQL 9.1.24 — Глава 3. Расширенные функции.
  8. ^ Программное обеспечение OpenLink. «19.9.10. Опция TOP SELECT» . docs.openlinksw.com . Проверено 1 октября 2019 г.
  9. ^ Оскар Бонилья, MBA.
  10. ^ Внутри Microsoft SQL Server 2005: Запросы T-SQL, Ицик Бен-Ган, Любор Коллар и Деян Сарка

Источники

[ редактировать ]
  • Горизонтальное и вертикальное секционирование, Электронная документация по Microsoft SQL Server 2000.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c349d3fc03624d36ceed6df143762777__1718142720
URL1:https://arc.ask3.ru/arc/aa/c3/77/c349d3fc03624d36ceed6df143762777.html
Заголовок, (Title) документа по адресу, URL1:
Select (SQL) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)