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()[ред. | ред. код]
Існують різні віконні функції. 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()[ред. | ред. код]
Функція 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.]
|