Відкрити головне меню

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» Запит Результат
C1 C2
1 a
2 b
SELECT * FROM T;
C1 C2
1 a
2 b
C1 C2
1 a
2 b
SELECT C1 FROM T;
C1
1
2
C1 C2
1 a
2 b
SELECT * FROM T WHERE C1 = 1;
C1 C2
1 a
C1 C2
1 a
2 b
SELECT * FROM T ORDER BY C1 DESC;
C1 C2
2 b
1 a

В даній таблиці «Т», при запиті

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

ПосиланняРедагувати