Выберите (SQL) - Select (SQL)

В SQL ВЫБРАТЬ инструкция возвращает набор результатов записей, из одного или нескольких столы.[1][2]

Оператор SELECT извлекает ноль или несколько строк из одного или нескольких таблицы базы данных или база данных взгляды. В большинстве приложений ВЫБРАТЬ это наиболее часто используемый язык обработки данных (DML) команда. Поскольку SQL - это декларативное программирование язык ВЫБРАТЬ в запросах указывается набор результатов, но не указывается, как его вычислить. База данных переводит запрос в "план запроса "которые могут различаться в зависимости от исполнения, версии базы данных и программного обеспечения базы данных. Эта функция называется"оптимизатор запросов "поскольку он отвечает за поиск наилучшего возможного плана выполнения запроса в рамках применимых ограничений.

Оператор SELECT имеет много необязательных предложений:

  • ВЫБРАТЬ предложение - это список столбцов или выражений SQL, которые должны быть возвращены запросом. Это примерно реляционная алгебра проекция операция.
  • ТАК КАК необязательно предоставляет псевдоним для каждого столбца или выражения в ВЫБРАТЬ пункт. Это реляционная алгебра переименовать операция.
  • ОТ указывает, из какой таблицы получить данные.[3]
  • ГДЕ указывает, какие строки нужно получить. Это примерно реляционная алгебра отбор операция.
  • ГРУППА ПО группирует строки, совместно использующие свойство, так что агрегатная функция может применяться к каждой группе.
  • ИМЕЕТ выбирает среди групп, определенных предложением GROUP BY.
  • СОРТИРОВАТЬ ПО указывает, как упорядочить возвращаемые строки.

Обзор

ВЫБРАТЬ это самая распространенная операция в SQL, называемая «запрос». ВЫБРАТЬ извлекает данные из одного или нескольких столы, или выражения. Стандарт ВЫБРАТЬ операторы не имеют постоянного воздействия на базу данных. Некоторые нестандартные реализации ВЫБРАТЬ могут иметь стойкие эффекты, такие как ВЫБРАТЬ В синтаксис предусмотрен в некоторых базах данных.[4]

Запросы позволяют пользователю описывать желаемые данные, оставляя система управления базами данных (СУБД) выполнять планирование, оптимизация, и выполнение физических операций, необходимых для получения желаемого результата.

Запрос включает список столбцов для включения в окончательный результат, обычно сразу после ВЫБРАТЬ ключевое слово. Звездочка ("*") можно использовать, чтобы указать, что запрос должен возвращать все столбцы запрошенных таблиц. ВЫБРАТЬ - это самый сложный оператор SQL с дополнительными ключевыми словами и предложениями, которые включают:

  • В ОТ предложение, которое указывает таблицы, из которых нужно получить данные. В ОТ предложение может включать необязательные ПРИСОЕДИНИТЬСЯ подпункты, чтобы указать правила объединения таблиц.
  • В ГДЕ Предложение включает предикат сравнения, который ограничивает строки, возвращаемые запросом. В ГДЕ Предложение удаляет все строки из набора результатов, в которых предикат сравнения не имеет значения True.
  • В ГРУППА ПО Предложение проецирует строки, имеющие общие значения, в меньший набор строк. ГРУППА ПО часто используется в сочетании с функциями агрегирования SQL или для удаления повторяющихся строк из набора результатов. В ГДЕ оговорка применяется до ГРУППА ПО пункт.
  • В ИМЕЕТ предложение включает предикат, используемый для фильтрации строк, полученных в результате ГРУППА ПО пункт. Потому что он действует на результаты ГРУППА ПО предложения, функции агрегирования могут использоваться в ИМЕЕТ предикат предложения.
  • В СОРТИРОВАТЬ ПО Предложение определяет, какой столбец [столбцы] использовать для сортировки результирующих данных и в каком направлении их сортировать (по возрастанию или по убыванию). Без СОРТИРОВАТЬ ПО предложение, порядок строк, возвращаемых запросом SQL, не определен.
  • В ОТЛИЧИТЕЛЬНЫЙ ключевое слово[5] устраняет повторяющиеся данные.[6] Обратите внимание, что ОТЛИЧИТЕЛЬНЫЙ это пример синтаксический сахар: можно достичь того же результата, перечислив все выбранные столбцы (но не агрегатные функции, если таковые имеются) в ГРУППА ПО пункт.

Следующий пример ВЫБРАТЬ query возвращает список дорогих книг. Запрос извлекает все строки из Книга таблица, в которой цена столбец содержит значение больше 100,00. Результат сортируется в порядке возрастания по заглавие. Звездочка (*) в выберите список указывает, что все столбцы Книга таблица должна быть включена в набор результатов.

ВЫБРАТЬ * ОТ  Книга ГДЕ цена > 100.00 ПОРЯДОК ОТ заглавие;

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

ВЫБРАТЬ Книга.заглавие ТАК КАК заглавие,       считать(*) ТАК КАК Авторы ОТ  Книга ПРИСОЕДИНИТЬСЯ  Book_author   НА  Книга.isbn = Book_author.isbn ГРУППА ОТ Книга.заглавие;

Пример вывода может выглядеть следующим образом:

Название Авторы ---------------------- ------- Примеры SQL и руководство 4 Радость SQL 1 Введение в SQL 2 Ловушки SQL 1

При условии, что isbn - единственное общее имя столбца для двух таблиц и что столбец с именем заглавие существует только в Книга table, можно было бы переписать приведенный выше запрос в следующей форме:

ВЫБРАТЬ заглавие,       считать(*) ТАК КАК Авторы ОТ  Книга НАТУРАЛЬНЫЙ ПРИСОЕДИНИТЬСЯ Book_author ГРУППА ОТ заглавие;

Однако многие[количественно оценить ] поставщики либо не поддерживают этот подход, либо требуют определенных соглашений об именах столбцов для эффективной работы естественных объединений.

SQL включает в себя операторы и функции для вычисления значений для сохраненных значений. SQL позволяет использовать выражения в выберите список для проецирования данных, как в следующем примере, который возвращает список книг стоимостью более 100,00 с дополнительным налог с продаж столбец, содержащий сумму налога с продаж, рассчитанную в размере 6% от цена.

ВЫБРАТЬ isbn,       заглавие,       цена,       цена * 0.06 ТАК КАК налог с продаж ОТ  Книга ГДЕ цена > 100.00 ПОРЯДОК ОТ заглавие;

Подзапросы

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

ВЫБРАТЬ isbn,       заглавие,       цена ОТ  Книга ГДЕ цена < (ВЫБРАТЬ AVG(цена) ОТ Книга) ПОРЯДОК ОТ заглавие;

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

С 1999 года стандарт SQL позволяет именованные подзапросы, называемые общие табличные выражения (назван и разработан в честь реализации IBM DB2 версии 2; Oracle называет их факторинг подзапросов ). CTE также могут быть рекурсивный ссылаясь на себя; результирующий механизм позволяет обход дерева или графа (когда они представлены как отношения) и в более общем плане фиксированная точка вычисления.

Встроенный вид

Встроенное представление - это использование ссылки на подзапрос SQL в предложении FROM. По сути, встроенное представление - это подзапрос, который можно выбрать или присоединить к нему. Функциональность встроенного просмотра позволяет пользователю ссылаться на подзапрос как на таблицу. Встроенное представление также называется производная таблица или подвыбор. Функциональность встроенного представления была представлена ​​в Oracle 9i.[7]

В следующем примере оператор SQL включает объединение исходной таблицы Books со встроенным представлением «Продажи». Это встроенное представление фиксирует связанную информацию о продажах книг с использованием номера ISBN для присоединения к таблице "Книги". В результате встроенное представление предоставляет набор результатов с дополнительными столбцами (количество проданных товаров и компания, которая продала книги):

ВЫБРАТЬ б.isbn, б.заглавие, б.цена, продажи.items_sold, продажи.company_nmОТ Книга б  ПРИСОЕДИНИТЬСЯ (ВЫБРАТЬ СУММ(Items_Sold) Items_Sold, Company_Nm, ISBN        ОТ Book_Sales        ГРУППА ОТ Company_Nm, ISBN) продажи  НА продажи.isbn = б.isbn

Примеры

Стол "Т"ЗапросРезультат
C1C2
1а
2б
ВЫБРАТЬ * ОТ Т;
C1C2
1а
2б
C1C2
1а
2б
ВЫБРАТЬ C1 ОТ Т;
C1
1
2
C1C2
1а
2б
ВЫБРАТЬ * ОТ Т ГДЕ C1 = 1;
C1C2
1а
C1C2
1а
2б
ВЫБРАТЬ * ОТ Т ПОРЯДОК ОТ C1 DESC;
C1C2
2б
1а
не существуетВЫБРАТЬ 1+1, 3*2;
`1+1``3*2`
26

Учитывая таблицу T, запрос ВЫБРАТЬ * ОТ Т приведет к отображению всех элементов всех строк таблицы.

С той же таблицей запрос ВЫБРАТЬ C1 ОТ Т приведет к отображению элементов из столбца C1 всех строк таблицы. Это похоже на проекция в реляционная алгебра, за исключением того, что в общем случае результат может содержать повторяющиеся строки. В некоторых терминах базы данных это также известно как вертикальное разделение, ограничивающее вывод запроса для просмотра только определенных полей или столбцов.

С той же таблицей запрос ВЫБРАТЬ * ОТ Т ГДЕ C1 = 1 приведет к отображению всех элементов всех строк, в которых значение столбца C1 равно '1' - в реляционная алгебра условия, а отбор будет выполняться из-за предложения WHERE. Это также известно как горизонтальное разделение, ограничивающее вывод строк по запросу в соответствии с заданными условиями.

При наличии нескольких таблиц набором результатов будет каждая комбинация строк. Итак, если две таблицы - это T1 и T2, ВЫБРАТЬ * ОТ Т1, Т2 приведет к каждой комбинации строк T1 с каждой строкой T2. Например, если в T1 3 строки, а в T2 5 строк, то получится 15 строк.

Хотя это и не является стандартом, большинство СУБД позволяет использовать предложение select без таблицы, делая вид, что используется воображаемая таблица с одной строкой. В основном это используется для выполнения вычислений, когда таблица не нужна.

Предложение SELECT определяет список свойств (столбцов) по имени или подстановочный знак («*») для обозначения «всех свойств».

Ограничение строк результатов

Часто бывает удобно указать максимальное количество возвращаемых строк. Это можно использовать для тестирования или для предотвращения чрезмерного потребления ресурсов, если запрос возвращает больше информации, чем ожидалось. Подход к этому часто варьируется в зависимости от поставщика.

В ISO SQL: 2003, наборы результатов могут быть ограничены с помощью

ISO SQL: 2008 представил ПОЛУЧИТЬ ПЕРВЫЙ пункт.

Согласно документации PostgreSQL v.9, Функция окна SQL выполняет вычисление по набору строк таблицы, которые так или иначе связаны с текущей строкой, аналогично агрегатным функциям.[8]Название напоминает обработку сигнала оконные функции. Вызов оконной функции всегда содержит НАД пункт.

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

ROW_NUMBER () ВЫШЕ может использоваться для простой стол в возвращаемых строках, например вернуть не более десяти строк:

ВЫБРАТЬ * ОТ( ВЫБРАТЬ    ROW_NUMBER() НАД (ПОРЯДОК ОТ sort_key ASC) ТАК КАК row_number,    столбцы  ОТ имя таблицы) ТАК КАК фуГДЕ row_number <= 10

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

Функция окна RANK ()

В РАНГ () ВЫШЕ оконная функция действует как ROW_NUMBER, но может возвращать больше или меньше п строки в случае условий связи, например вернуться в топ-10 самых молодых:

ВЫБРАТЬ * ОТ (  ВЫБРАТЬ    РАНГ() НАД (ПОРЯДОК ОТ возраст ASC) ТАК КАК рейтинг,    person_id,    person_name,    возраст  ОТ человек) ТАК КАК фуГДЕ рейтинг <= 10

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

Предложение FETCH FIRST

Поскольку ISO SQL: 2008 пределы результатов можно указать, как в следующем примере, с помощью ПОИСК ПЕРВЫЙ пункт.

ВЫБРАТЬ * ОТ Т ПОЛУЧИТЬ ПЕРВЫЙ 10 РЯДЫ ТОЛЬКО

Этот пункт в настоящее время поддерживается CA DATACOM / DB 11, IBM DB2, SAP SQL Anywhere, PostgreSQL, EffiProz, H2, HSQLDB версии 2.0, Oracle 12c и Mimer SQL.

Microsoft SQL Server 2008 и выше поддерживает ПОЛУЧИТЬ ПЕРВЫЙ, но считается частью СОРТИРОВАТЬ ПО пункт. В СОРТИРОВАТЬ ПО, СМЕЩЕНИЕ, и ПОЛУЧИТЬ ПЕРВЫЙ для этого использования требуются все пункты.

ВЫБРАТЬ*ОТТПОРЯДОКОТколоннаDESCСМЕЩЕНИЕ0РЯДЫПОЛУЧИТЬПЕРВЫЙ10РЯДЫТОЛЬКО

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

Некоторые СУБД предлагают нестандартный синтаксис вместо стандартного синтаксиса SQL или в дополнение к нему. Ниже представлены варианты простой предел список запросов для разных СУБД:

НАБОРROWCOUNT10ВЫБРАТЬ*ОТТ
MS SQL Server (Это также работает на Microsoft SQL Server 6.5, в то время как Выберите 10 лучших * из T не)
ВЫБРАТЬ * ОТ Т LIMIT 10 СМЕЩЕНИЕ 20
Netezza, MySQL, MariaDB, SAP SQL Anywhere, PostgreSQL (также поддерживает стандарт, начиная с версии 8.4), SQLite, HSQLDB, H2, Vertica, Многогранники, Couchbase Сервер, Snowflake Computing, OpenLink Virtuoso
ВЫБРАТЬ * от Т ГДЕ ROWNUM <= 10
Oracle
ВЫБРАТЬ ПЕРВЫЙ 10 * от Т Ingres
ВЫБРАТЬ ПЕРВЫЙ 10 * ОТ Т заказ на Informix
ВЫБРАТЬ ПЕРЕПУСТИТЬ 20 ПЕРВЫЙ 10 * Заказ ОТ T по c, d Informix (номера строк фильтруются после оценки порядка. Предложение SKIP было введено в пакете исправлений v10.00.xC4)
ВЫБРАТЬ ТОП 10 * ОТ ТMS SQL Server, SAP ASE, MS доступ, SAP IQ, Терадата
ВЫБРАТЬ * ОТ Т ОБРАЗЕЦ 10
Терадата
ВЫБРАТЬ ТОП 20, 10 * ОТ ТOpenLink Virtuoso (пропускает 20, доставляет следующие 10)[9]
ВЫБРАТЬ ТОП 10 СТАРТ С 20 * ОТ ТSAP SQL Anywhere (также поддерживает стандарт, начиная с версии 9.0.1)
ВЫБРАТЬ ПЕРВЫЙ 10 ПРОПУСК 20 * ОТ ТЖар-птица
ВЫБРАТЬ * ОТ ТРЯДЫ 20 К 30
Жар-птица (начиная с версии 2.1)
ВЫБРАТЬ * ОТ ТГДЕ ID_T > 10 ПОЛУЧИТЬ ПЕРВЫЙ 10 РЯДЫ ТОЛЬКО
DB2
ВЫБРАТЬ * ОТ ТГДЕ ID_T > 20 ПОЛУЧИТЬ ПЕРВЫЙ 10 РЯДЫ ТОЛЬКО
DB2 (новые строки фильтруются после сравнения с ключевым столбцом таблицы T)

Пагинация строк

Пагинация строк[10] - это подход, используемый для ограничения и отображения только части общих данных запроса в базе данных. Вместо одновременного отображения сотен или тысяч строк, сервер запрашивает только одну страницу (ограниченный набор строк, в примере только 10 строк), и пользователь начинает навигацию, запрашивая следующую страницу, а затем следующую. , и так далее. Это очень полезно, особенно в веб-системах, где нет выделенного соединения между клиентом и сервером, поэтому клиенту не нужно ждать, чтобы прочитать и отобразить все строки сервера.

Данные в подходе разбивки на страницы

  • {rows} = Количество строк на странице
  • {номер страницы} = Номер текущей страницы
  • {begin_base_0} = Номер строки - 1, с которой начинается страница = (page_number-1) * строк

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

  1. Выбрать все строки из базы данных
  2. Прочитать все строки, но отправить для отображения только тогда, когда row_number прочитанных строк находится между {begin_base_0 + 1} и {begin_base_0 + rows}
Выбрать * от {Таблица} порядок от {unique_key}

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

  1. Выберите все строки от начала таблицы до последней строки для отображения ({begin_base_0 + rows})
  2. Прочтите {begin_base_0 + rows} строк, но отправляются для отображения только тогда, когда row_number прочитанных строк больше, чем {begin_base_0}
SQLДиалект
Выбрать*от{Таблица}порядокот{unique_key}ПОЛУЧИТЬПЕРВЫЙ{begin_base_0+ряды}РЯДЫТОЛЬКО
SQL ANSI 2008
PostgreSQL
SQL Server 2012
дерби
Oracle 12c
DB2 12
Выбрать *от {Таблица}порядок от {unique_key}LIMIT {begin_base_0 + ряды}
MySQL
SQLite
ВыбратьВЕРХ{begin_base_0+ряды}*от{Таблица}порядокот{unique_key}
SQL Server 2005
НАБОРROWCOUNT{begin_base_0+ряды}Выбрать*от{Таблица}порядокот{unique_key}НАБОРROWCOUNT0
Sybase, SQL Server 2000
Выбрать *    ОТ (        ВЫБРАТЬ *         ОТ {Таблица}         ПОРЯДОК ОТ {unique_key}    ) а где Rownum <= {begin_base_0 + ряды}
Оракул 11


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

  1. Выбрать только {rows} строки, начиная со следующей строки для отображения ({begin_base_0 + 1})
  2. Чтение и отправка для отображения всех строк, прочитанных из базы данных
SQLДиалект
Выбрать *от {Таблица}порядок от {unique_key}СМЕЩЕНИЕ {begin_base_0} РЯДЫПОЛУЧИТЬ СЛЕДУЮЩИЙ {ряды} РЯДЫ ТОЛЬКО
SQL ANSI 2008
PostgreSQL
SQL Server 2012
дерби
Oracle 12c
DB2 12
Выбрать *от {Таблица}порядок от {unique_key}LIMIT {ряды} СМЕЩЕНИЕ {begin_base_0}
MySQL
MariaDB
PostgreSQL
SQLite
Выбрать * от {Таблица} порядок от {unique_key}LIMIT {begin_base_0}, {ряды}
MySQL
MariaDB
SQLite
ВыбратьВЕРХ{begin_base_0+ряды}*,_offset=идентичность(10)в#tempот{Таблица}ПОРЯДОКОТ{unique_key}Выбрать*от#tempгде_offset>{begin_base_0}УДАЛИТЬТАБЛИЦА#temp
Sybase 12.5.3:
НАБОРROWCOUNT{begin_base_0+ряды}Выбрать*,_offset=идентичность(10)в#tempот{Таблица}ПОРЯДОКОТ{unique_key}Выбрать*от#tempгде_offset>{begin_base_0}УДАЛИТЬТАБЛИЦА#tempНАБОРROWCOUNT0
Sybase 12.5.2:
ВыбратьВЕРХ{ряды}*от(Выбрать*,ROW_NUMBER()над(порядокот{unique_key})так как_offsetот{Таблица})ххгде_offset>{begin_base_0}


SQL Server 2005
НАБОРROWCOUNT{begin_base_0+ряды}Выбрать*,_offset=идентичность(int,1,1)в#tempот{Таблица}ПОРЯДОКОТ{уникальный-ключ}Выбрать*от#tempгде_offset>{begin_base_0}УДАЛИТЬТАБЛИЦА#tempНАБОРROWCOUNT0
SQL Server 2000
ВЫБРАТЬ * ОТ (    ВЫБРАТЬ Rownum-1 так как _offset, а.*     ОТ(        ВЫБРАТЬ *         ОТ {Таблица}         ПОРЯДОК ОТ {unique_key}    ) а     ГДЕ Rownum <= {begin_base_0 + cant_regs})ГДЕ _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. Чтение и отправка для отображения всех строк, прочитанных из базы данных
Первая страницаСледующая СтраницаПредыдущая страницаДиалект
Выбрать*от{Таблица}порядокот{unique_key}ПОЛУЧИТЬПЕРВЫЙ{ряды}РЯДЫТОЛЬКО
Выбрать*от{Таблица}где{unique_key}>{last_val}порядокот{unique_key}ПОЛУЧИТЬПЕРВЫЙ{ряды}РЯДЫТОЛЬКО
Выбрать*от(Выбрать*от{Таблица}где{unique_key}<{first_val}порядокот{unique_key}DESCПОЛУЧИТЬПЕРВЫЙ{ряды}РЯДЫТОЛЬКО)апорядокот{unique_key}
SQL ANSI 2008
PostgreSQL
SQL Server 2012
дерби
Oracle 12c
DB2 12
Выбрать *от {Таблица}порядок от {unique_key}LIMIT {ряды}
Выбрать * от {Таблица} где {unique_key} > {last_val}порядок от {unique_key}LIMIT {ряды}
Выбрать *  от (   Выбрать *    от {Таблица}    где {unique_key} < {first_val}   порядок от {unique_key} DESC   LIMIT {ряды} ) а порядок от {unique_key}
MySQL
SQLite
ВыбратьВЕРХ{ряды}*от{Таблица}порядокот{unique_key}
ВыбратьВЕРХ{ряды}*от{Таблица}где{unique_key}>{last_val}порядокот{unique_key}
Выбрать*от(ВыбратьВЕРХ{ряды}*от{Таблица}где{unique_key}<{first_val}порядокот{unique_key}DESC)апорядокот{unique_key}
SQL Server 2005
НАБОРROWCOUNT{ряды}Выбрать*от{Таблица}порядокот{unique_key}НАБОРROWCOUNT0
НАБОРROWCOUNT{ряды}Выбрать*от{Таблица}где{unique_key}>{last_val}порядокот{unique_key}НАБОРROWCOUNT0
НАБОРROWCOUNT{ряды}Выбрать*от(Выбрать*от{Таблица}где{unique_key}<{first_val}порядокот{unique_key}DESC)апорядокот{unique_key}НАБОРROWCOUNT0
Sybase, SQL Server 2000
Выбрать *от (    Выбрать *     от {Таблица}     порядок от {unique_key}  ) а где Rownum <= {ряды}
Выбрать *от (  Выбрать *   от {Таблица}   где {unique_key} > {last_val}  порядок от {unique_key}) а где Rownum <= {ряды}
Выбрать *  от (   Выбрать *   от (     Выбрать *      от {Таблица}      где {unique_key} < {first_val}     порядок от {unique_key} DESC   ) а1   где Rownum <= {ряды} ) а2 порядок от {unique_key}
Оракул 11

Иерархический запрос

Некоторые базы данных предоставляют специализированный синтаксис для иерархические данные.

Оконная функция в SQL: 2003 является агрегатная функция применяется к разделу набора результатов.

Например,

сумма (население) ПРЕВЫШАЕТ (РАЗДЕЛЕНИЕ ПО городам)

вычисляет сумму совокупностей всех строк, имеющих одинаковые город значение как текущая строка.

Разделы указываются с помощью НАД предложение, изменяющее агрегат. Синтаксис:

 :: = OVER ([РАЗДЕЛЕНИЕ ПО <ВЫРАЖЕНИЕ>, ...] [ПОРЯДОК ПО <ВЫРАЖЕНИЕ>])

Предложение OVER может разбивать и упорядочивать набор результатов. Упорядочивание используется для функций, относящихся к порядку, таких как row_number.

Оценка запроса ANSI

Обработка оператора SELECT в соответствии с ANSI SQL будет следующей:[11]

  1. Выбрать г.*от пользователи ты внутренний присоединиться группы г на г.Логин пользователя = ты.Логин пользователягде ты.Фамилия = 'Смит'и ты.Имя = 'Джон'
  2. оценивается предложение FROM, создается перекрестное соединение или декартово произведение для первых двух таблиц в предложении FROM, в результате чего получается виртуальная таблица как Vtable1
  3. предложение ON оценивается для vtable1; только записи, которые соответствуют условию соединения g.Userid = u.Userid, вставляются в Vtable2
  4. Если указано внешнее соединение, записи, которые были удалены из vTable2, добавляются в VTable 3, например, если вышеуказанный запрос был:
    Выбрать ты.*от пользователи ты осталось присоединиться группы г на г.Логин пользователя = ты.Логин пользователягде ты.Фамилия = 'Смит'и ты.Имя = 'Джон'
    все пользователи, которые не принадлежат ни к одной группе, будут добавлены обратно в Vtable3
  5. оценивается предложение WHERE, в этом случае в vTable4 будет добавлена ​​только информация о группе для пользователя John Smith
  6. GROUP BY оценивается; если вышеуказанный запрос был:
    Выбрать г.Название группы, считать(г.*) так как NumberOfMembersот пользователи ты внутренний присоединиться группы г на г.Логин пользователя = ты.Логин пользователягруппа от Название группы
    vTable5 будет состоять из элементов, возвращенных из vTable4, упорядоченных группировкой, в данном случае GroupName
  7. предложение HAVING оценивается для групп, для которых предложение HAVING истинно, и вставляется в vTable6. Например:
    Выбрать г.Название группы, считать(г.*) так как NumberOfMembersот пользователи ты внутренний присоединиться группы г на г.Логин пользователя = ты.Логин пользователягруппа от Название группыимея считать(г.*) > 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

Метод генерации данных на основе объединения всех

Выбрать 1 а, 1 б союз всеВыбрать 1, 2 союз всеВыбрать 1, 3 союз всеВыбрать 2, 1 союз всеВыбрать 5, 1

SQL Server 2008 поддерживает «конструктор строк», указанный в стандарте SQL3 («SQL: 1999»).

Выбрать *от (ценности (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) так как Икс(а, б)

использованная литература

  1. ^ Microsoft. «Соглашения о синтаксисе Transact-SQL».
  2. ^ MySQL. "Синтаксис SQL SELECT".
  3. ^ Пропуск предложения FROM не является стандартным, но разрешен большинством основных СУБД.
  4. ^ «Справочник по Transact-SQL». Справочник по языку SQL Server. Электронная документация по SQL Server 2005. Microsoft. 2007-09-15. Получено 2007-06-17.
  5. ^ Руководство пользователя процедуры SQL SAS 9.4. Институт САС. 2013. с. 248. ISBN  9781612905686. Получено 2015-10-21. Хотя аргумент UNIQUE идентичен аргументу DISTINCT, он не является стандартом ANSI.
  6. ^ Леон, Алексис; Леон, Мэтьюз (1999). «Устранение дубликатов - ВЫБЕРИТЕ с помощью DISTINCT». SQL: полный справочник. Нью-Дели: Tata McGraw-Hill Education (опубликовано в 2008 г.). п. 143. ISBN  9780074637081. Получено 2015-10-21. [...] ключевое слово DISTINCT [...] удаляет дубликаты из набора результатов.
  7. ^ Ошибка цитирования: указанная ссылка Встроенный просмотр / производная таблица был вызван, но не определен (см. страница помощи).
  8. ^ Документация по PostgreSQL 9.1.24 - Глава 3. Расширенные функции
  9. ^ Программное обеспечение OpenLink. «9.19.10. Вариант TOP SELECT». docs.openlinksw.com. Получено 1 октября 2019.
  10. ^ Ing. Оскар Бонилья, MBA
  11. ^ Внутри Microsoft SQL Server 2005: запросы T-SQL от Ицика Бен-Гана, Любора Коллара и Деяна Сарка

Источники

  • Горизонтальное и вертикальное разбиение, электронная документация по Microsoft SQL Server 2000.

внешние ссылки