Оператор SQL SELECT возвращает результирующий набор записей из одной или нескольких таблиц . [1] [2]
A Выберите оператор получает ноль или несколько строк из одной или нескольких таблиц базы данных или базы данных взглядов . В большинстве приложений SELECT
это наиболее часто используемая команда языка обработки данных (DML). Поскольку SQL является декларативным языком программирования , в SELECT
запросах указывается набор результатов, но не указывается, как его вычислять. База данных переводит запрос в « план запроса », который может варьироваться в зависимости от исполнения, версии базы данных и программного обеспечения базы данных. Эта функция называется « оптимизатором запросов », поскольку она отвечает за поиск наилучшего возможного плана выполнения запроса в рамках применимых ограничений.
Оператор SELECT имеет много необязательных предложений:
SELECT
предложение - это список столбцов или выражений SQL, которые должны быть возвращены запросом. Это примерно операция проекции реляционной алгебры .AS
необязательно предоставляет псевдоним для каждого столбца или выражения вSELECT
предложении. Это операция переименования реляционной алгебры .FROM
указывает, из какой таблицы получить данные. [3]WHERE
указывает, какие строки нужно получить. Это примерно операция выбора реляционной алгебры .GROUP BY
группирует строки, совместно использующие свойство, чтобы к каждой группе можно было применить агрегатную функцию .HAVING
выбирает среди групп, определенных предложением GROUP BY.ORDER BY
указывает, как упорядочить возвращенные строки.
Обзор
SELECT
это самая распространенная операция в SQL, называемая «запрос». SELECT
извлекает данные из одной или нескольких таблиц или выражений. Стандартные SELECT
операторы не оказывают постоянного воздействия на базу данных. Некоторые нестандартные реализации SELECT
могут иметь постоянные эффекты, например SELECT INTO
синтаксис, представленный в некоторых базах данных. [4]
Запросы позволяют пользователю описывать желаемые данные, оставляя систему управления базами данных (СУБД) для выполнения планирования , оптимизации и выполнения физических операций, необходимых для получения желаемого результата.
Запрос включает список столбцов для включения в окончательный результат, обычно сразу после SELECT
ключевого слова. Звездочка (" *
") может использоваться, чтобы указать, что запрос должен возвращать все столбцы запрошенных таблиц. SELECT
- самый сложный оператор в SQL, с необязательными ключевыми словами и предложениями, которые включают:
- Предложение
FROM
, которое указывает таблицы, из которых нужно получить данные. ПредложениеFROM
может включать необязательныеJOIN
подпункты для определения правил объединения таблиц. - Предложение
WHERE
включает предикат сравнения, который ограничивает строки, возвращаемые запросом. ПредложениеWHERE
исключает все строки из набора результатов, в которых предикат сравнения не имеет значения True. - Предложение
GROUP BY
проецирует строки, имеющие общие значения, в меньший набор строк.GROUP BY
часто используется в сочетании с функциями агрегирования SQL или для удаления повторяющихся строк из набора результатов. ПредложениеWHERE
применяется передGROUP BY
предложением. - Предложение
HAVING
включает предикат, используемый для фильтрации строк, являющихся результатомGROUP BY
предложения. Поскольку он действует на результатыGROUP BY
предложения, вHAVING
предикате предложения можно использовать функции агрегирования . - Предложение
ORDER BY
определяет, какой столбец [столбцы] использовать для сортировки результирующих данных и в каком направлении их сортировать (по возрастанию или по убыванию). БезORDER BY
предложения порядок строк, возвращаемых запросом SQL, не определен. DISTINCT
Ключевое слово [5] устраняет дубликаты данных. [6]
В следующем примере SELECT
запроса возвращается список дорогих книг. Запрос извлекает все строки из таблицы Book, в которой столбец цен содержит значение больше 100,00. Результат сортируется по заголовку в порядке возрастания . Звездочка (*) в списке выбора указывает, что все столбцы таблицы Book должны быть включены в набор результатов.
ВЫБЕРИТЕ * ИЗ ЗАКАЗА, ГДЕ цена > 100 . 00 ЗАКАЗАТЬ ПО заголовку ;
В приведенном ниже примере демонстрируется запрос нескольких таблиц, группировки и агрегирования путем возврата списка книг и количества авторов, связанных с каждой книгой.
ВЫБЕРИТЕ книгу . title AS Название , количество ( * ) AS Авторы ИЗ книги ПРИСОЕДИНЯЙТЕСЬ Book_author ON Книга . isbn = Автор_книги . isbn ГРУППА ПО Книга . название ;
Пример вывода может выглядеть следующим образом:
Название Авторы---------------------- -------Примеры SQL и руководство 4Радость SQL 1Введение в SQL 2Подводные камни SQL 1
При предварительном условии, что isbn является единственным общим именем столбца для двух таблиц и что столбец с именем title существует только в таблице Book , можно переписать приведенный выше запрос в следующей форме:
ВЫБРАТЬ заголовок , количество ( * ) КАК Авторы ИЗ книги ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ Book_author ГРУППА ПО заголовку ;
Однако многие поставщики [ количественной оценки ] либо не поддерживают этот подход, либо требуют определенных соглашений об именах столбцов для эффективной работы естественных объединений.
SQL включает в себя операторы и функции для вычисления значений по сохраненным значениям. SQL позволяет использовать выражения в списке выбора для проецирования данных, как в следующем примере, который возвращает список книг стоимостью более 100,00 с дополнительным столбцом sales_tax, содержащим сумму налога с продаж, рассчитанную по ставке 6% от цены .
ВЫБЕРИТЕ isbn , название , цену , цену * 0 . 06 AS sales_tax FROM Книги WHERE цена > 100 . 00 ЗАКАЗАТЬ ПО заголовку ;
Подзапросы
Запросы могут быть вложенными, чтобы результаты одного запроса можно было использовать в другом запросе с помощью реляционного оператора или функции агрегирования. Вложенный запрос также известен как подзапрос . В то время как соединения и другие операции с таблицами во многих случаях предоставляют альтернативы, превосходящие в вычислительном отношении (то есть более быстрые), использование подзапросов вводит иерархию при выполнении, которая может быть полезной или необходимой. В следующем примере функция агрегирования AVG
получает в качестве входных данных результат подзапроса:
ВЫБЕРИТЕ isbn , название , цену ИЗ книги ГДЕ цена < ( ВЫБЕРИТЕ СРЕДНЮЮ ( цену ) ИЗ книги ) ЗАКАЗАТЬ ПО заголовку ;
Подзапрос может использовать значения из внешнего запроса, и в этом случае он называется коррелированным подзапросом .
С 1999 года стандарт SQL разрешает именованные подзапросы, называемые общими табличными выражениями (названные и разработанные в честь реализации IBM DB2 версии 2; Oracle называет эти подзапросы факторингом ). CTE также могут быть рекурсивными , ссылаясь на самих себя; Результирующий механизм позволяет обходы дерева или графа (когда они представлены как отношения) и, в более общем смысле, вычисления фиксированных точек .
Производная таблица
Производная таблица - это использование ссылки на подзапрос SQL в предложении FROM. По сути, производная таблица - это подзапрос, который можно выбрать или присоединить к нему. Функциональность производной таблицы позволяет пользователю ссылаться на подзапрос как на таблицу. Производная таблица также называется встроенным представлением или выбором из списка .
В следующем примере оператор SQL включает соединение исходной таблицы Books с производной таблицей «Sales». Эта производная таблица фиксирует связанную информацию о продажах книг с использованием номера ISBN для присоединения к таблице "Книги". В результате производная таблица предоставляет результирующий набор с дополнительными столбцами (количество проданных товаров и компания, которая продала книги):
ВЫБРАТЬ b . isbn , б . название , б . цена , распродажа . items_sold , продажи . company_nm ИЗ Книги b ПРИСОЕДИНИТЬСЯ ( ВЫБРАТЬ СУММ ( Items_Sold ) Items_Sold , Company_Nm , ISBN FROM Book_Sales GROUP BY Company_Nm , ISBN ) продажи НА продажах . 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
В той же таблице запрос приведет к отображению элементов из столбца C1 всех строк таблицы. Это похоже на проекцию в реляционной алгебре , за исключением того, что в общем случае результат может содержать повторяющиеся строки. В некоторых терминах базы данных это также известно как вертикальное разделение, ограничивающее вывод запроса для просмотра только определенных полей или столбцов.SELECT C1 FROM T
В той же таблице запрос приведет к отображению всех элементов всех строк, в которых значение столбца C1 равно «1» - в терминах реляционной алгебры выбор будет выполнен из-за предложения WHERE. Это также известно как горизонтальное разделение, ограничивающее вывод строк по запросу в соответствии с заданными условиями.SELECT * FROM T WHERE C1 = 1
При наличии более чем одной таблицы набором результатов будет каждая комбинация строк. Таким образом, если две таблицы - это T1 и T2, результатом будет каждая комбинация строк T1 с каждой строкой T2. Например, если в T1 3 строки, а в T2 5 строк, то получится 15 строк.SELECT * FROM T1, T2
Хотя это и не является стандартом, большинство СУБД позволяет использовать предложение select без таблицы, делая вид, что используется воображаемая таблица с одной строкой. В основном это используется для выполнения вычислений, когда таблица не нужна.
Предложение SELECT определяет список свойств (столбцов) по имени или символ подстановки («*»), означающий «все свойства».
Ограничение строк результатов
Часто бывает удобно указать максимальное количество возвращаемых строк. Это можно использовать для тестирования или для предотвращения чрезмерного потребления ресурсов, если запрос возвращает больше информации, чем ожидалось. Подход к этому часто варьируется в зависимости от поставщика.
В ISO SQL: 2003 наборы результатов могут быть ограничены с помощью
- курсоры , или
- добавив оконную функцию SQL к оператору SELECT
ISO SQL: 2008 представил это FETCH FIRST
положение.
Согласно документации PostgreSQL v.9, оконная функция SQL «выполняет вычисление по набору строк таблицы, которые каким-то образом связаны с текущей строкой», аналогично агрегатным функциям. [7] Название напоминает оконные функции обработки сигналов . Вызов оконной функции всегда содержит предложение OVER .
ROW_NUMBER () оконная функция
ROW_NUMBER() OVER
может использоваться для простой таблицы по возвращаемым строкам, например, чтобы вернуть не более десяти строк:
ВЫБРАТЬ * ИЗ ( ВЫБРАТЬ ROW_NUMBER () OVER ( ORDER BY sort_key ASC ) КАК номер_строки , столбцы FROM tablename ) AS foo WHERE row_number <= 10
ROW_NUMBER может быть недетерминированным : если sort_key не уникален, каждый раз, когда вы запускаете запрос, можно получить разные номера строк, назначенные любым строкам, где sort_key одинаков. Когда sort_key уникален, каждая строка всегда получает уникальный номер строки.
Функция окна RANK ()
RANK() OVER
Функция окна действует как ROW_NUMBER, но может вернуться более или менее п строк в случае условий галстуков, например , вернуть топ-10 самых молодых людей:
ВЫБРАТЬ * ИЗ ( ВЫБРАТЬ RANK () OVER ( ORDER BY age ASC ) рейтинг AS , person_id , PERSON_NAME , возраст ОТ человека ) AS обув WHERE рейтинга <= 10
Приведенный выше код может вернуть более десяти строк, например, если есть два человека одного возраста, он может вернуть одиннадцать строк.
Предложение FETCH FIRST
Начиная с ISO SQL: 2008 пределы результатов можно указать, как в следующем примере, с помощью FETCH FIRST
предложения.
ВЫБРАТЬ * ИЗ T FETCH FIRST 10 ROWS ТОЛЬКО
Этот пункт в настоящее время поддерживается 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
положение , все необходимые для этого использования.
ВЫБРАТЬ * ИЗ T ORDER BY acolumn DESC OFFSET 0 РЯДЫ FETCH FIRST 10 РЯДЫ ТОЛЬКО
Нестандартный синтаксис
Некоторые СУБД предлагают нестандартный синтаксис вместо стандартного синтаксиса SQL или в дополнение к нему. Ниже перечислены варианты простого запроса лимита для разных СУБД:
УСТАНОВИТЬ ROWCOUNT 10 ВЫБРАТЬ * ИЗ T | MS SQL Server (это также работает на Microsoft SQL Server 6.5, в то время как выбор из 10 лучших * из T - нет) |
ВЫБРАТЬ * ИЗ T ПРЕДЕЛ 10 СМЕЩЕНИЕ 20 | Netezza , MySQL , MariaDB , SAP SQL Anywhere , PostgreSQL (также поддерживает стандарт, начиная с версии 8.4), SQLite , HSQLDB , H2 , Vertica , Polyhedra , Couchbase Server , Snowflake Computing , OpenLink Virtuoso |
ВЫБРАТЬ * из T ГДЕ ROWNUM <= 10 | Oracle |
SELECT FIRST 10 * from T | Ingres |
SELECT FIRST 10 * FROM T order by a | Informix |
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 |
ВЫБРАТЬ * ИЗ T ОБРАЗЕЦ 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 | Жар-птица |
ВЫБРАТЬ * ИЗ TЧСТРОКИ 20 К 30 | Firebird (начиная с версии 2.1) |
ВЫБРАТЬ * ИЗ TГДЕ ID_T > 10 FETCH FIRST 10 РЯДЫ ТОЛЬКО | DB2 |
ВЫБРАТЬ * ИЗ TГДЕ ID_T > 20 FETCH FIRST 10 РЯДЫ ТОЛЬКО | DB2 (новые строки фильтруются после сравнения с ключевым столбцом таблицы T) |
Пагинация строк
Пагинация строк [9] - это подход, используемый для ограничения и отображения только части общих данных запроса в базе данных. Вместо одновременного отображения сотен или тысяч строк сервер запрашивает только одну страницу (ограниченный набор строк, в примере только 10 строк), и пользователь начинает навигацию, запрашивая следующую страницу, а затем следующую. , и так далее. Это очень полезно, особенно в веб-системах, где нет выделенного соединения между клиентом и сервером, поэтому клиенту не нужно ждать, чтобы прочитать и отобразить все строки сервера.
Данные в подходе разбивки на страницы
{rows}
= Количество строк на странице{page_number}
= Номер текущей страницы{begin_base_0}
= Номер строки - 1, с которой начинается страница = (номер_страницы-1) * строки
Самый простой способ (но очень неэффективный)
- Выбрать все строки из базы данных
- Прочитать все строки, но отправить для отображения только тогда, когда row_number прочитанных строк находится между
{begin_base_0 + 1}
и{begin_base_0 + rows}
Выбрать * из { table }, упорядочить по { unique_key }
Другой простой метод (немного более эффективный, чем чтение всех строк)
- Выберите все строки от начала таблицы до последней строки для отображения (
{begin_base_0 + rows}
) - Прочитать
{begin_base_0 + rows}
строки, но отправить для отображения только тогда, когда row_number прочитанных строк больше, чем{begin_base_0}
SQL | Диалект |
---|---|
выберите * из { table } заказать по { unique_key } FETCH FIRST { begin_base_0 + строк } ROWS ТОЛЬКО | SQL ANSI 2008 PostgreSQL SQL Server 2012 Derby Oracle 12c DB2 12 Mimer SQL |
Выберите * из { table } порядка по { unique_key } LIMIT { begin_base_0 + rows } | MySQL SQLite |
Выберите TOP { begin_base_0 + строк } * из { таблицы } порядка по { unique_key } | SQL Server 2005 |
УСТАНОВИТЬ ROWCOUNT { begin_base_0 + rows } Выбрать * из { table }, упорядочить по { unique_key } УСТАНОВИТЬ ROWCOUNT 0 | Sybase, SQL Server 2000 |
Выберите * FROM ( SELECT * FROM { table } ORDER BY { unique_key } ) a, где rownum <= { begin_base_0 + rows } | Оракул 11 |
Метод с позиционированием
- Выберите
{rows}
для отображения только строки, начиная со следующей строки ({begin_base_0 + 1}
) - Чтение и отправка для отображения всех строк, прочитанных из базы данных
SQL | Диалект |
---|---|
Выберите * из { table } порядка по { unique_key } OFFSET { begin_base_0 } ROWS FETCH NEXT { rows } ROWS ONLY | SQL ANSI 2008 PostgreSQL SQL Server 2012 Derby Oracle 12c DB2 12 Mimer SQL |
Выберите * из { table } порядка по { unique_key } LIMIT { rows } OFFSET { begin_base_0 } | MySQL MariaDB PostgreSQL SQLite |
Выберите * из { table } порядка по { unique_key } LIMIT { begin_base_0 } , { rows } | MySQL MariaDB SQLite |
Выберите TOP { begin_base_0 + rows } * , _offset = identity ( 10 ) в #temp из { table } ЗАКАЗАТЬ ПО { unique_key } select * from #temp, где _offset > { begin_base_0 } DROP TABLE #temp | Sybase 12.5.3: |
УСТАНОВИТЬ ROWCOUNT { begin_base_0 + rows } выберите * , _offset = identity ( 10 ) в #temp из { table } ЗАКАЗАТЬ ПО { unique_key } select * from #temp, где _offset > { begin_base_0 } DROP TABLE #temp УСТАНОВИТЬ ROWCOUNT 0 | Sybase 12.5.2: |
выберите TOP { rows } * из ( выберите * , ROW_NUMBER () поверх ( порядок по { unique_key } ) как _offset из { table } ) xx, где _offset > { begin_base_0 } | SQL Server 2005 |
УСТАНОВИТЬ ROWCOUNT { begin_base_0 + rows } выберите * , _offset = identity ( int , 1 , 1 ) в #temp из { table } ЗАКАЗАТЬ ПО { уникальный - ключ } выберите * из #temp, где _offset > { begin_base_0 } DROP TABLE #temp УСТАНОВИТЬ ROWCOUNT 0 | SQL Server 2000 |
SELECT * FROM ( SELECT rownum - 1 как _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}
первой строки на текущей странице), и отсортируйте результат в правильном порядке.
- Первая страница: выберите только первые
- Чтение и отправка для отображения всех строк, прочитанных из базы данных
Первая страница | Следующая Страница | Предыдущая страница | Диалект |
---|---|---|---|
выберите * из { table } заказа на { unique_key } FETCH FIRST { строк } ROWS ТОЛЬКО | выберите * из { таблицы }, где { unique_key } > { last_val } заказать по { unique_key } FETCH FIRST { строк } ROWS ТОЛЬКО | выберите * из ( выберите * из { таблицы }, где { unique_key } < { first_val } заказать по { unique_key } DESC FETCH FIRST { строк } ROWS ТОЛЬКО ) а заказать по { unique_key } | SQL ANSI 2008 PostgreSQL SQL Server 2012 Derby Oracle 12c DB2 12 Mimer SQL |
выберите * из { таблицы } порядка по { unique_key } ПРЕДЕЛ { строки } | выберите * из { table }, где { unique_key } > { last_val } упорядочить по { unique_key } LIMIT { rows } | выберите * от ( выберите * из { таблицы } , где { unique_key } < { first_val } порядка по { unique_key } DESC LIMIT { строк } ) порядка по { unique_key } | MySQL SQLite |
выберите TOP { строки } * из { таблицы } порядка по { unique_key } | выберите TOP { rows } * from { table }, где { unique_key } > { last_val } заказать по { unique_key } | выберите * из ( выберите TOP { rows } * from { table }, где { unique_key } < { first_val } заказать по { unique_key } DESC ) а заказать по { unique_key } | SQL Server 2005 |
УСТАНОВИТЬ ROWCOUNT { rows } выберите * из { table } заказа на { unique_key } УСТАНОВИТЬ ROWCOUNT 0 | УСТАНОВИТЬ ROWCOUNT { rows } выберите * из { table }, где { unique_key } > { last_val } заказать по { unique_key } УСТАНОВИТЬ ROWCOUNT 0 | УСТАНОВИТЬ ROWCOUNT { rows } выберите * из ( выберите * из { таблицы }, где { unique_key } < { first_val } заказать по { unique_key } DESC ) а заказать по { unique_key } УСТАНОВИТЬ ROWCOUNT 0 | Sybase, SQL Server 2000 |
выберите * от ( выберите * из { таблицы } порядка по { unique_key } ) а , где ROWNUM <= { строк } | выберите * из ( выберите * из { таблицы }, где { unique_key } > { last_val } упорядочить по { unique_key } ) a, где rownum <= { rows } | выбрать * из ( выбрать * из ( выбрать * из { таблицы }, где { unique_key } < { first_val } упорядочить по { unique_key } DESC ) a1, где rownum <= { rows } ) a2, заказать по { unique_key } | Оракул 11 |
Иерархический запрос
Некоторые базы данных предоставляют специальный синтаксис для иерархических данных .
Оконная функция в SQL: 2003 - это агрегатная функция, применяемая к разделу набора результатов.
Например,
сумма (население) ПРЕВЫШАЕТ (РАЗДЕЛЕНИЕ ПО городам)
вычисляет сумму совокупностей всех строк, имеющих то же значение города, что и текущая строка.
Разделы указываются с помощью предложения OVER , которое изменяет агрегат. Синтаксис:
<ЗАКРЫТЬ_КРЫТЬ> :: = ВЫШЕ ([РАЗДЕЛЕНИЕ ПО, ...] [ЗАКАЗАТЬ ПО <выражение>])
Предложение OVER может разбивать и упорядочивать набор результатов. Упорядочивание используется для функций, относящихся к порядку, таких как row_number.
Оценка запроса ANSI
Обработка оператора SELECT в соответствии с ANSI SQL будет следующей: [10]
выберите g . * от пользователей u внутренние присоединяются к группам g на g . Userid = u . Идентификатор пользователя где u . LastName = 'Smith' и u . FirstName = 'Джон'
- оценивается предложение FROM, создается перекрестное соединение или декартово произведение для первых двух таблиц в предложении FROM, в результате чего получается виртуальная таблица как Vtable1
- предложение ON оценивается для vtable1; только записи, которые соответствуют условию соединения g.Userid = u.Userid, вставляются в Vtable2
- Если указано внешнее соединение, записи, которые были отброшены из vTable2, добавляются в VTable 3, например, если вышеуказанный запрос был: все пользователи, которые не принадлежали ни к одной группе, будут добавлены обратно в Vtable3
выберите u . * От пользователей у левого присоединиться к группам г на г . Userid = u . Идентификатор пользователя где u . LastName = 'Smith' и u . FirstName = 'Джон'
- оценивается предложение WHERE, в этом случае в vTable4 будет добавлена только информация о группе для пользователя John Smith.
- оценивается GROUP BY; если бы вышеуказанный запрос был: vTable5 будет состоять из элементов, возвращенных из vTable4, упорядоченных группировкой, в данном случае GroupName
выберите g . GroupName , подсчитайте ( g . * ) Как NumberOfMembers от пользователей u внутренних групп присоединения g на g . Userid = u . Группа идентификаторов пользователей по GroupName
- предложение HAVING оценивается для групп, для которых предложение HAVING истинно, и вставляется в vTable6. Например:
выберите g . GroupName , подсчитайте ( g . * ) Как NumberOfMembers от пользователей u внутренних групп присоединения g на g . Userid = u . Группа идентификаторов пользователей по GroupName, имеющая 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
Метод генерации данных на основе объединения всех
выбрать 1 a , 1 b объединить все выбрать 1 , 2 объединить все выбрать 1 , 3 объединить все выбрать 2 , 1 объединить все выбрать 5 , 1
SQL Server 2008 поддерживает «конструктор строк», указанный в стандарте SQL3 («SQL: 1999»).
выберите * из ( значения ( 1 , 1 ), ( 1 , 2 ), ( 1 , 3 ), ( 2 , 1 ), ( 5 , 1 )) как x ( a , b )
Рекомендации
- ^ Microsoft. «Соглашения о синтаксисе Transact-SQL» .
- ^ MySQL. «Синтаксис SQL SELECT» .
- ^ Пропуск предложения FROM не является стандартным, но разрешен большинством основных СУБД.
- ^ «Справочник по Transact-SQL». Справочник по языку SQL Server . Электронная документация по SQL Server 2005. Microsoft. 2007-09-15 . Проверено 17 июня 2007 .
- ^ Руководство пользователя процедуры SQL SAS 9.4 . Институт САС. 2013. с. 248. ISBN 9781612905686. Проверено 21 октября 2015 .
Хотя аргумент UNIQUE идентичен аргументу DISTINCT, он не является стандартом ANSI.
- ^ Леон, Алексис ; Леон, Мэтьюз (1999). «Устранение дубликатов - ВЫБРАТЬ с помощью DISTINCT». SQL: полный справочник . Нью-Дели: Tata McGraw-Hill Education (опубликовано в 2008 г.). п. 143. ISBN. 9780074637081. Проверено 21 октября 2015 .
[...] ключевое слово DISTINCT [...] удаляет дубликаты из набора результатов.
- ^ Документация по PostgreSQL 9.1.24 - Глава 3. Расширенные функции
- ^ Программное обеспечение OpenLink. «9.19.10. Опция TOP SELECT» . docs.openlinksw.com . Проверено 1 октября 2019 года .
- ^ Ing. Оскар Бонилья, MBA
- ^ Внутри Microsoft SQL Server 2005: запросы T-SQL Ицик Бен-Ган, Любор Коллар и Деян Сарка
Источники
- Горизонтальное и вертикальное разбиение, электронная документация по Microsoft SQL Server 2000.
Внешние ссылки
- Оконные таблицы и оконные функции в SQL , Стефан Деслох
- Синтаксис Oracle SELECT
- Синтаксис Firebird SELECT
- Синтаксис MySQL SELECT
- Синтаксис PostgreSQL SELECT
- Синтаксис SQLite SELECT