Синтаксис 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]

Зноски[ред. | ред. код]

  1. ANSI/ISO/IEC International Standard (IS).
  2. Transact-SQL Reference. SQL Server Language Reference. SQL Server 2005 Books Online. Microsoft. 2007-09-15. Процитовано 2007-06-17. 
  3. SAS 9.4 SQL Procedure User's Guide. SAS Institute. с. 248. ISBN 9781612905686. Процитовано 2015-10-21. «Although the UNIQUE argument is identical to DISTINCT, it is not an ANSI standard.» 
  4. Leon, Alexis; Leon, Mathews (1999). Eliminating duplicates - SELECT using DISTINCT. SQL: A Complete Reference. New Delhi: Tata McGraw-Hill Education. с. 143. ISBN 9780074637081. Процитовано 2015-10-21. «[...] the keyword DISTINCT [...] eliminates the duplicates from the result set.»