Select (SQL)
SELECT — оператор мови SQL, котрий повертає рядки з однієї чи багатьох таблиць. Повний синтаксис оператора SELECT є складним, проте його можна описати так:
SELECT список_вибірки [ INTO нова_таблиця ] FROM таблиця [ WHERE умови_пошуку ] [ GROUP BY умова_групування ] [ HAVING умови_пошуку ] [ ORDER BY умова_сортування [ ASC | DESC ] ]
Повертає нуль або більше рядків з однієї або більше таблиць, тимчасових таблиць, або ж представлень бази даних. У більшості застосунків, SELECT — найчастіша команда Data Manipulation Language (DML). Оскільки, SQL не є процедурною мовою, запит SELECT описує кінцеві дані, однак, не вказує, які саме операції слід виконати для отримання цих даних: завдання покладається на систему керування базами даних, яка здатна самостійно оптимізовувати необхідні для отримання результату операції.
Ключові слова, пов'язані із запитом SELECT:
- FROM — оператор мови SQL, котрий вживається із оператором SELECT, і вказує, з якої таблиці провадиться вибірка даних.
- WHERE вказує, які рядки слід вибрати.
- GROUP BY гуртує рядки, що мають спільну властивість таким чином, щоб функція агрегації могла бути застосована до кожної групи.
- HAVING вибирає з груп означених оператором GROUP BY.
- ORDER BY вказує порядок повернення рядків.
Таблиця «T» | Запит | Результат | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
SELECT * FROM T;
|
| ||||||||||||
|
SELECT C1 FROM T;
|
| ||||||||||||
|
SELECT * FROM T WHERE C1 = 1;
|
| ||||||||||||
|
SELECT * FROM T ORDER BY C1 DESC;
|
|
В даній таблиці «Т», при запиті
SELECT * FROM T;
результатом будуть показані всі елементи всіх рядків таблиці. При запиті
SELECT C1 FROM T;
результатом буде показаний стовпчик С1 та всі рядки в ньому. Термінами реляційної алгебри можна сказати, що була виконана проєкція. Результатом на запит
SELECT * FROM T WHERE C1 = 1;
будуть показані всі елементи всіх рядків де стовпчик C1 має значення 1. Термінами реляційної алгебри можна сказати, що була виконана вибірка так як присутнє ключове слово WHERE. Останній запит
SELECT * FROM T ORDER BY C1 DESC;
покаже в результаті ті ж самі рядки що й перший запит, але результат буде відсортовано в зворотному порядку (Z-A), тому що було використане ключове слово ORDER BY з полем С1 як сортуванням.
Формування таблиці на льоту:
SELECT *
FROM (
SELECT 0 as id
UNION SELECT 1
UNION SELECT 2
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
)
Згідно з ISO SQL:2003 кількість отриманих даних може бути обмежена за допомогою:
- курсорів, або
- введенням віконних функцій в оператор SELECT
Існують різні віконні функції. ROW_NUMBER() OVER
може бути використана для простого обмеження кількості отриманих рядків. Наприклад, для повернення не більше 10 рядків:
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
columns
FROM tablename
) AS foo
WHERE rownumber <= 10
ROW_NUMBER може бути недетермінованим: якщо key не унікальний, кожен раз при виконанні запиту можливе присвоєння різних номерів рядкам, у яких key збігається. Коли key унікальний, кожен рядок буде завжди отримувати унікальний номер рядка.
Функція 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
Цей код може повернути більш ніж 10 рядків. Наприклад, якщо є дві людини з однаковим віком, то він поверне 11 рядків.
Не всі СКБД підтримують вище вказані віконні функції. При цьому більшість мають не стандартний синтаксис для рішення тих самих задач. Нижче представлені варіанти простого обмеження вибірки для різних СКБД:
Виробник/СКБД | Синтаксис обмеження |
---|---|
DB2 | (Підтримує стандарт починаючи з DB2 Version 6) |
Firebird | SELECT FIRST 10 * FROM T
|
Informix | SELECT FIRST 10 * FROM T
|
Interbase | SELECT * FROM T ROWS 10
|
Microsoft | (Підтримує стандарт починаючи з SQL Server 2005) |
Також SELECT TOP 10 [PERCENT] * FROM T ORDER BY col
| |
MySQL | SELECT * FROM T LIMIT 10
|
SQLite | SELECT * FROM T LIMIT 10
|
PostgreSQL | SELECT * FROM T LIMIT 10
|
Oracle | (Підтримує стандарт починаючи з Oracle8i) |
Також SELECT * from T WHERE ROWNUM <= 10
|
- Windowed Tables and Window function in SQL [Архівовано 1 червня 2010 у Wayback Machine.], Stefan Deßloch
- Oracle SELECT Syntax. [Архівовано 30 березня 2009 у Wayback Machine.]
- Firebird SELECT Syntax. [Архівовано 23 березня 2021 у Wayback Machine.]