Синтаксис SQL
Синтаксис мови програмування SQL описується комітетом ISO/IEC SC 32 як частина стандарту ISO/IEC 9075. Цей стандарт не знаходиться у вільному доступі. Незважаючи на існування стандарту, код SQL неможливо переносити між різними системами баз даних без змін.
Мова SQL поділяється на кілька видів елементів:
- Пункти (диз'юнкти) (англ. Clauses), що є складовими частинами інструкцій та запитів. (Іноді вони не обов'язкові.)[1]
- Вирази (англ. Expressions), які можуть генерувати скалярні значення, або таблиці з стовпчиками і рядками даних
- Предикати (англ. Predicates), які описують умови, результатом яких є значення тризначної логіки SQL (true/false/unknown) або Булеві значення істинності і які використовуються для обмеження ефекту інструкцій та запитів, або для зміни потоку виконання програми.
- Запити (англ. Queries), які отримують дані на основі заданих критеріїв.
- Інструкції (англ. Statements), які чинять дію на схему даних чи самі дані, або контролюють транзакції, потік виконання програми, з'єднання, сесії, та виконують діагностику.
- Інструкції SQL також включають крапку з комою (";") для позначення кінця інструкції. Хоча вона не є обов'язковою на кожній платформі, вона описується як стандартна частина граматики SQL.
- Незначимі пропуски загалом ігноруються в інструкціях і запитах SQL, дозволяючи форматувати код SQL з метою покращення читабельності.
Оператор | Опис | Приклад |
---|---|---|
=
|
дорівнює | Author = 'Alcott'
|
<>
|
не дорівнює (багато СКБД приймають крім <> також != )
|
Dept <> 'Sales'
|
>
|
більше ніж | Hire_Date > '2012-01-31'
|
<
|
менше ніж | Bonus < 50000.00
|
>=
|
більше або дорівнює | Dependents >= 2
|
<=
|
менше або дорівнює | Rate <= 0.05
|
BETWEEN
|
між двома величинами включно | Cost BETWEEN 100.00 AND 500.00
|
LIKE
|
співставлення тексту з шаблоном | First_Name LIKE 'Will%'
|
IN
|
одне з багатьох можливих значень | DeptCode IN (101, 103, 209)
|
IS or IS NOT
|
Порівняння з null (відсутністю даних) | Address IS NOT NULL
|
IS [NOT] TRUE or IS [NOT] FALSE
|
булева перевірка істинності | PaidVacation IS TRUE
|
IS NOT DISTINCT FROM
|
значення рівні або обоє null (обоє відсутні) | Debt IS NOT DISTINCT FROM - Receivables
|
AS
|
використовується для зміни назви колонки в результаті запиту | SELECT employee AS "department1"
|
Іноді пропонувались та розроблялись інші оператори, такі як Skyline operator[en] (для знаходження лише записів які не "гірші" за будь-які інші)s
SQL має вираз case/when/then/else/end
, який був впроваджений в SQL-92. В найзагальнішій формі, яка називається стандартом SQL "searched case":
CASE WHEN n > 0
THEN 'positive'
WHEN n < 0
THEN 'negative'
ELSE 'zero'
END
SQL перевіряє умови WHEN
в порядку в якому вони з'являються в коді. Якщо в коді не задано виразу ELSE
, SQL за замовчуванням припускає ELSE NULL
. Скорочений синтаксис, названий в стандарті SQL простим case (англ. "simple case"), схожий на інструкцію перемикач в інших мовах:
CASE n WHEN 1
THEN 'One'
WHEN 2
THEN 'Two'
ELSE 'I cannot count that high'
END
Такий синтаксис використовує неявні перевірки рівності, зі звичними пересторогами щодо порівняння з NULL.
Є два скорочення для окремих випадків CASE
: COALESCE
та NULLIF
.
Вираз COALESCE
повертає значення першого зліва операнда який не є NULL, або NULL якщо всі операнди є NULL.
COALESCE(x1,x2)
еквівалентно до:
CASE WHEN x1 IS NOT NULL THEN x1
ELSE x2
END
Вираз NULLIF
має два операнди і повертає NULL якщо операнди мають однакове значення, інакше повертає значення першого.
NULLIF(x1, x2)
еквівалентно до:
CASE WHEN x1 = x2 THEN NULL ELSE x1 END
Запит - найчастіше виконувана операція в SQL. Для здійснення запитів використовується декларативна інструкція SELECT
. SELECT
отримує дані з однієї чи більше таблиць, або виразів. Стандартна інструкція SELECT
не здійснює постійних змін бази даних. Деякі нестандартні реалізації SELECT
можуть мати постійні ефекти, такі як варіант SELECT INTO
що зустрічається в деяких базах даних.[2]
Запити дозволяють користувачу описати бажані дані, залишаючи базі даних створення плану запиту, його оптимізацію, і виконання фізичних операцій необхідних для отримання бажаних результатів.
До запиту входить список колонок, які повинні включатись в кінцевий результат, зазвичай одразу після ключового слова SELECT
. Можна використати символ "зірочка" ("*
"), щоб описати, що запит повинен повертати всі колонки всіх таблиць з якими працює. SELECT
- найкладніша інструкція SQL, з необов'язковими ключовими словами і пунктами до яких входять:
- Пункт
FROM
, який задає таблиці з яких треба отримати дані.FROM
може включати необов'язкові підпунктиJOIN
щоб задати правила для з'єднаних таблиць. - Пункт
WHERE
що містить предикат який обмежує рядки що повертаються запитом.WHERE
видаляє всі рядки з результуючої множини, де предикат порівняння не дорівнює True. - Пункт
GROUP BY
відображає рядки що містять спільні значення в меншу множину рядків.GROUP BY
часто використовують в поєднанні з функціями агрегації SQL, або для видалення повторюватих рядків з результуючої множини. ПунктWHERE
застосовується доGROUP BY
. - Пункт
HAVING
включає предикат що використовується для фільтрування рядків отриманих в результаті обчисленняGROUP BY
. Через те що він працює з результатамиGROUP BY
, функції агрегації можуть використовуватись в предикаті пунктуHAVING
. - Пункт
ORDER BY
визначає які колонки використати для сортування даних результату, і в якому порядку здійснити сортування (зростаючому чи спадаючому). Без пунктуORDER BY
, порядок рядків що повертається запитом SQL не визначений. - Ключове слово
DISTINCT
[3] усуває повторення даних.[4]
- ↑ ANSI/ISO/IEC International Standard (IS).
- ↑ Transact-SQL Reference. SQL Server Language Reference. SQL Server 2005 Books Online. Microsoft. 15 вересня 2007. Процитовано 17 червня 2007.
- ↑ SAS 9.4 SQL Procedure User's Guide. SAS Institute. с. 248. ISBN 9781612905686. Процитовано 21 жовтня 2015.
Although the UNIQUE argument is identical to DISTINCT, it is not an ANSI standard.
- ↑ Leon, Alexis; Leon, Mathews (1999). Eliminating duplicates - SELECT using DISTINCT. SQL: A Complete Reference. New Delhi: Tata McGraw-Hill Education. с. 143. ISBN 9780074637081. Процитовано 21 жовтня 2015.
[...] the keyword DISTINCT [...] eliminates the duplicates from the result set.