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» Запит Результат
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

Посилання[ред.ред. код]