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

Посилання

[ред. | ред. код]