stringtranslate.com

Выбрать (SQL)

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

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

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

Обзор

SELECT— это наиболее распространенная операция в SQL, называемая «запрос». SELECTизвлекает данные из одной или нескольких таблиц или выражений. Стандартные SELECTоператоры не оказывают постоянного воздействия на базу данных. Некоторые нестандартные реализации SELECTмогут иметь постоянные последствия, например синтаксис, SELECT INTOпредусмотренный в некоторых базах данных. [4]

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

Запрос включает список столбцов, которые должны быть включены в окончательный результат, обычно сразу после SELECTключевого слова. Звездочку (" *") можно использовать, чтобы указать, что запрос должен возвращать все столбцы всех запрошенных таблиц. SELECT— это самый сложный оператор SQL с необязательными ключевыми словами и предложениями, в том числе:

Следующий пример запроса SELECTвозвращает список дорогих книг. Запрос извлекает все строки из таблицы Book , в которых столбец цены содержит значение больше 100,00. Результат сортируется в порядке возрастания названия . Звездочка (*) в списке выбора указывает, что все столбцы таблицы Book должны быть включены в набор результатов.

ВЫБЕРИТЕ * ИЗ Забронировать ГДЕ цена > 100 . 00 ПОРЯДОК ПО названию ;          

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

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

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

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

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

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

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

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

ВЫБЕРИТЕ isbn , название , цену , цену * 0 . 06 AS sales_tax ОТ Книга ГДЕ цена > 100 . 00 ПОРЯДОК ПО названию ;                 

Подзапросы

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

ВЫБЕРИТЕ isbn , название , цену ИЗ книги ГДЕ цена < ( ВЫБЕРИТЕ AVG ( цена ) ИЗ книги ) ПОРЯДОК ПО названию ;               

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

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

Производная таблица

Производная таблица — это подзапрос в предложении FROM. По сути, производная таблица представляет собой подзапрос, который можно выбрать или к которому можно присоединиться. Функциональность производной таблицы позволяет пользователю ссылаться на подзапрос как на таблицу. Производная таблица также называется встроенным представлением или выбором из списка .

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

ВЫБРАТЬ б . исбн , б . титул , б . цена , продажа . items_sold , продажи . Company_nm FROM Book_Sales GROUP BY Company_Nm , ISBN ) продажи ON продажи .исбн = б . исбн                        

Примеры

Учитывая таблицу 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 определяет список свойств (столбцов) по имени или подстановочный знак («*»), обозначающий «все свойства».

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

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

В 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 номер_строки , столбцы ИЗ имени таблицы ) AS foo WHERE номер_строки <= 10                   

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

Оконная функция РАНГ()

The RANK() OVER window function acts like ROW_NUMBER, but may return more or less than n rows in case of tie conditions, e.g. to return the top-10 youngest persons:

SELECT * FROM ( SELECT RANK() OVER (ORDER BY age ASC) AS ranking, person_id, person_name, age FROM person) AS fooWHERE ranking <= 10

The above code could return more than ten rows, e.g. if there are two people of the same age, it could return eleven rows.

FETCH FIRST clause

Since ISO SQL:2008 results limits can be specified as in the following example using the FETCH FIRST clause.

SELECT * FROM T FETCH FIRST 10 ROWS ONLY

This clause currently is supported by CA DATACOM/DB 11, IBM DB2, SAP SQL Anywhere, PostgreSQL, EffiProz, H2, HSQLDB version 2.0, Oracle 12c and Mimer SQL.

Microsoft SQL Server 2008 and higher supports FETCH FIRST, but it is considered part of the ORDER BY clause. The ORDER BY, OFFSET, and FETCH FIRST clauses are all required for this usage.

SELECT * FROM T ORDER BY acolumn DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY

Non-standard syntax

Some DBMSs offer non-standard syntax either instead of or in addition to SQL standard syntax. Below, variants of the simple limit query for different DBMSes are listed:

Rows Pagination

Rows Pagination[9] is an approach used to limit and display only a part of the total data of a query in the database. Instead of showing hundreds or thousands of rows at the same time, the server is requested only one page (a limited set of rows, per example only 10 rows), and the user starts navigating by requesting the next page, and then the next one, and so on. It is very useful, specially in web systems, where there is no dedicated connection between the client and the server, so the client does not have to wait to read and display all the rows of the server.

Data in Pagination approach

Simplest method (but very inefficient)

  1. Select all rows from the database
  2. Read all rows but send to display only when the row_number of the rows read is between {begin_base_0 + 1} and {begin_base_0 + rows}
Select * from {table} order by {unique_key}

Other simple method (a little more efficient than read all rows)

  1. Select all the rows from the beginning of the table to the last row to display ({begin_base_0 + rows})
  2. Read the {begin_base_0 + rows} rows but send to display only when the row_number of the rows read is greater than {begin_base_0}


Method with positioning

  1. Select only {rows} rows starting from the next row to display ({begin_base_0 + 1})
  2. Read and send to display all the rows read from the database


Method with filter (it is more sophisticated but necessary for very big dataset)

  1. Select only then {rows} rows with filter:
    1. First Page: select only the first {rows} rows, depending on the type of database
    2. Next Page: select only the first {rows} rows, depending on the type of database, where the {unique_key} is greater than {last_val} (the value of the {unique_key} of the last row in the current page)
    3. Previous Page: sort the data in the reverse order, select only the first {rows} rows, where the {unique_key} is less than {first_val} (the value of the {unique_key} of the first row in the current page), and sort the result in the correct order
  2. Read and send to display all the rows read from the database

Hierarchical query

Some databases provide specialised syntax for hierarchical data.

A window function in SQL:2003 is an aggregate function applied to a partition of the result set.

For example,

 sum(population) OVER( PARTITION BY city )

calculates the sum of the populations of all rows having the same city value as the current row.

Partitions are specified using the OVER clause which modifies the aggregate. Syntax:

<OVER_CLAUSE> :: = OVER ( [ PARTITION BY <expr>, ... ] [ ORDER BY <expression> ] )

The OVER clause can partition and order the result set. Ordering is used for order-relative functions such as row_number.

Query evaluation ANSI

The processing of a SELECT statement according to ANSI SQL would be the following:[10]

  1. select g.*from users u inner join groups g on g.Userid = u.Useridwhere u.LastName = 'Smith'and u.FirstName = 'John'
  2. the FROM clause is evaluated, a cross join or Cartesian product is produced for the first two tables in the FROM clause resulting in a virtual table as Vtable1
  3. the ON clause is evaluated for vtable1; only records which meet the join condition g.Userid = u.Userid are inserted into Vtable2
  4. If an outer join is specified, records which were dropped from vTable2 are added into VTable 3, for instance if the above query were:
    select u.*from users u left join groups g on g.Userid = u.Useridwhere u.LastName = 'Smith'and u.FirstName = 'John'
    all users who did not belong to any groups would be added back into Vtable3
  5. the WHERE clause is evaluated, in this case only group information for user John Smith would be added to vTable4
  6. the GROUP BY is evaluated; if the above query were:
    select g.GroupName, count(g.*) as NumberOfMembersfrom users u inner join groups g on g.Userid = u.Useridgroup by GroupName
    vTable5 would consist of members returned from vTable4 arranged by the grouping, in this case the GroupName
  7. the HAVING clause is evaluated for groups for which the HAVING clause is true and inserted into vTable6. For example:
    select g.GroupName, count(g.*) as NumberOfMembersfrom users u inner join groups g on g.Userid = u.Useridgroup by GroupNamehaving count(g.*) > 5
  8. the SELECT list is evaluated and returned as Vtable 7
  9. the DISTINCT clause is evaluated; duplicate rows are removed and returned as Vtable 8
  10. the ORDER BY clause is evaluated, ordering the rows and returning VCursor9. This is a cursor and not a table because ANSI defines a cursor as an ordered set of rows (not relational).

Window function support by RDBMS vendors

The implementation of window function features by vendors of relational databases and SQL engines differs wildly. Most databases support at least some flavour of window functions. However, when we take a closer look it becomes clear that most vendors only implement a subset of the standard. Let's take the powerful RANGE clause as an example. Only Oracle, DB2, Spark/Hive, and Google Big Query fully implement this feature. More recently, vendors have added new extensions to the standard, e.g. array aggregation functions. These are particularly useful in the context of running SQL against a distributed file system (Hadoop, Spark, Google BigQuery) where we have weaker data co-locality guarantees than on a distributed relational database (MPP). Rather than evenly distributing the data across all nodes, SQL engines running queries against a distributed filesystem can achieve data co-locality guarantees by nesting data and thus avoiding potentially expensive joins involving heavy shuffling across the network. User-defined aggregate functions that can be used in window functions are another extremely powerful feature.

Generating data in T-SQL

Method to generate data based on the union all

select 1 a, 1 b union allselect 1, 2 union allselect 1, 3 union allselect 2, 1 union allselect 5, 1

SQL Server 2008 supports the "row constructor" feature, specified in the SQL:1999 standard

select *from (values (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) as x(a, b)

References

  1. ^ Microsoft (23 May 2023). "Transact-SQL Syntax Conventions".
  2. ^ MySQL. "SQL SELECT Syntax".
  3. ^ Omitting FROM clause is not standard, but allowed by most major DBMSes.
  4. ^ "Transact-SQL Reference". SQL Server Language Reference. SQL Server 2005 Books Online. Microsoft. 2007-09-15. Retrieved 2007-06-17.
  5. ^ SAS 9.4 SQL Procedure User's Guide. SAS Institute (published 2013). 10 July 2013. p. 248. ISBN 9781612905686. Retrieved 2015-10-21. Although the UNIQUE argument is identical to DISTINCT, it is not an ANSI standard.
  6. ^ Leon, Alexis; Leon, Mathews (1999). "Eliminating duplicates - SELECT using DISTINCT". SQL: A Complete Reference. New Delhi: Tata McGraw-Hill Education (published 2008). p. 143. ISBN 9780074637081. Retrieved 2015-10-21. [...] the keyword DISTINCT [...] eliminates the duplicates from the result set.
  7. ^ PostgreSQL 9.1.24 Documentation - Chapter 3. Advanced Features
  8. ^ OpenLink Software. "9.19.10. The TOP SELECT Option". docs.openlinksw.com. Retrieved 1 October 2019.
  9. ^ Ing. Óscar Bonilla, MBA
  10. ^ Inside Microsoft SQL Server 2005: T-SQL Querying by Itzik Ben-Gan, Lubor Kollar, and Dejan Sarka

Sources

External links