Синтаксис SQL

В этой статье описывается синтаксис SQL запросов. В следующем операторе задана минимальная структура и синтаксис, необходимый для SELECT.

SELECT [DISTINCT | ALL] {* | список_выбора} 
FROM {table_name [alias] | имя_представления}

Ключевые слова SQL

Ключевые слова (SELECT, GRANT, DELETE или CREATE) прописаны в синтаксисе SQL и имеют в этом языке предопределенное значение. Можно использовать ключевые слова в верхнем или нижнем регистре. Следующие три запроса равнозначны:

SELECT * FROM EMPLOYEES;
Select * FROM EMPLOYEES;
select * FROM EMPLOYEES;

В некоторых случаях ключевые слова могут быть сокращены. Например, ключевое слово DESCRIBE может быть использовано либо в форме DESC, либо DESCRIBE. Если мы выполним следующие запросы, то в обоих случаях получим структуру таблицы сотрудников.

DESCRIBE EMPLOYEES;
DESC EMPLOYEES;

Идентификаторы

Идентификаторы – это имена заданные разработчиками для структурных элементов базы данных: таблицы, столбцы, псевдонимы, индексы, представления. В синтаксисе последнего SQL запроса ‘EMPLOYEES’ — это идентификатор, а ‘SELECT‘ — ключевое слово. Правила для создания идентификаторов указываются в спецификации поставщика. Рассмотрим следующую таблицу:

Правила Платформа Описание
Идентификатор должен содержать до SQL2003 128 символов.
DB2 128 символов, в зависимости от платформы.
MySQL 64 символа.
Oracle 30 байт; имена базы данных до 8 байт.
PostgreSQL 31 символ.
Идентификатор может содержать SQL2003 Любые цифры, символы и нижнее подчеркивание.
DB2 Любые цифры, символы в верхнем регистре или символ нижнего подчеркивания.
MySQL Любые цифры или символы.
Oracle Любые цифры, символы и нижнее подчеркивание (_), знак фунта стерлингов (#) или доллара ($).
PostgreSQL Любые цифры, символы и нижнее подчеркивание (_).
Первый символ должен быть SQL2003 Буквой.
DB2 Буквой.
MySQL Буквой или цифрой (но не должен содержать только цифры).
Oracle Буквой.
PostgreSQL Буквой или нижним подчеркиванием (_).
Идентификатор не может содержать SQL2003 Специальные символы или пробелы.
DB2 Специальные символы или пробелы.
MySQL Точку (.), слэш (/) или ASCII(0) и ASCII(255). Кавычки (‘) и двойные кавычки (") допускаются только в ссылающихся идентификаторах.
Oracle Пробелы, двойные кавычки (") или специальные символы.
PostgreSQL Двойные кавычки (").
В синтаксисе SQL запросов символ идентификатора SQL2003 Двойные кавычки (").
DB2 Двойные кавычки (").
MySQL Кавычки ( ‘ ) или двойные кавычки (" ) в режиме совместимости с ANSI.
Oracle Двойные кавычки (").
PostgreSQL Двойные кавычки (").
Идентификатор может быть зарезервирован SQL2003 Нет, кроме ссылающихся идентификаторов.
DB2 Да.
MySQL Нет, кроме ссылающихся идентификаторов.
Oracle Нет, кроме ссылающихся идентификаторов.
PostgreSQL Нет, кроме ссылающихся идентификаторов.
Адресация к схеме SQL2003 Каталог.схема.объект.
DB2 Схема.объект.
MySQL База_данных.объект.
Oracle Схема.объект.
PostgreSQL База_данных.схема.объект.
Идентификатор должен быть уникальным SQL2003 Да.
DB2 Да.
MySQL Да.
Oracle Да.
PostgreSQL Да.

Конвенции имен

Стандарт SQL не содержит никаких точных указаний по наименованиям, поэтому нужно следовать следующим основным принципам (в том числе и в синтаксисе SQL запросов UPDATE):

  • Выбирайте имя, которое содержит смысл и имеет описательный характер. Например, таблица сотрудников не должна называться emp, а столбец имени сотрудника должен называться first_name, а не fname, хотя и «emp», и «fname» это допустимые идентификаторы;
  • Используйте для всех объектов в базе данных SQL либо заглавные буквы, либо строчные, поскольку некоторые серверы баз данных чувствительны к регистру.

Литералы SQL

Термин литералы относится к фиксированным значениям данных. SQL распознает четыре типа литералов: числовые значения, строки символов, дата или время, логическое значение. Например, 100, -120, 544, 03, -458, 25, 3e2, 5E-2 являются действительными числовыми литералами. ‘США‘, ‘2000‘, ‘SQL Синтаксис‘, ‘1 января 1981‘ являются действительными строками символов (должны быть заключены в одинарные кавычки (‘ ‘)). Логические литералы и литералы даты/времени выглядят следующим образом: TRUE и ‘JAN-28-1976 21:12:40:00‘.

Операторы

Операторы работают с отдельными элементами данных и возвращают результат. Операторы используются в различных операциях SQL, таких как SELECT, INSERT, UPDATE или DELETE. А также при создании различных объектов базы данных, таких как функции, представления, триггеры и хранимые процедуры. MS SQL синтаксис запросов поддерживает различные типы операторов, хотя не все СУБД поддерживают все операторы.

Смотрите таблицу ниже:

Операторы Работают во
Арифметические операторы Всех базах данных.
Операторы присвоения Всех базах данных.
Побитовые операторы Microsoft SQL Server.
Операторы сравнения Всех базах данных.
Логические операторы DB2, Oracle, SQL Server и PostgreSQL.
Унарные операторы DB2, Oracle и SQL Server.

Приоритетность операторов

Приоритетность — это порядок, в котором база данных оценивает различные операторы в одном выражении. В синтаксисе SQL запросов при выполнении выражения, содержащего несколько операторов (например, +, -, /), сначала выполняются операторы с высшей приоритетностью, а затем с более низкой. При оценке операторов с одинаковой приоритетностью операторы выполняются в порядке их расстановки в выражении слева направо.

Если в выражении есть круглые скобки, то операторы в них вычисляется в первую очередь, а остальные части выражения, которые находятся вне скобок, вычисляются после этого. В следующей таблице перечислены уровни приоритетности операторов SQL от высокого к низкому.

Приоритетность операторов
( ) (выполняются в первую очередь).
+, -, ~ (унарные операторы).
*, /, % (математические операторы).
+, — (арифметические операторы).
=, >, <, >=, <=, <>, !=, !>, !< (операторы сравнения).
I^ (Побитовый OR), & (Побитовый AND), | (Побитовый OR).
NOT.
AND.
ALL, ANY, BETWEEN, IN, LIKE, OR, SOME.
= (присвоение переменных).

Следующие выражения в запросе MySQL возвращают разные результаты:

SELECT 12 * 2 + 24;

Результат

12 * 2 + 24
48

Приоритетность операторов

sql-operator-precedence-expression1

SELECT 12 * (2 + 24)

Результат

12 * (2 + 24)
312

Приоритетность операторов

sql-operator-precedence-expression2

Комментарии SQL

Комментарии в синтаксисе SQL запросов — это необязательный текст, который описывает, что делает программа и почему код был изменен. Компилятор всегда игнорирует комментарии. Комментарий вводится через двойное тире и пробел:
— Это комментарий SQL

В качестве альтернативы, можно использовать блок комментариев C-стиля:

/ * Это первая строка комментария
Это вторая строка комментария * /.

Пробелы

Пробелы, как правило, игнорируются в операторах SQL, что позволяет проще форматировать код для удобства чтения.
На следующей диаграмме приведены элементы синтаксиса SQL запросов, которые составляют одиночный оператор:

select-syntax

Список ключевых слов SQL:

ABSOLUTE ACTION ADD ADMIN
AFTER AGGREGATE ALIAS ALL
ALLOCATE ALTER AND ANY
ARE ARRAY AS ASC
ASSERTION ASSERTION AT ATOMIC
AUTHORIZATION BEFORE BEGIN BIGINT
BINARY BIT BLOB BOOLEAN
BOTH BREADTH BY CALL
CASCADE CASCADED CASE CAST
CATALOG CHAR CHARACTER CHECK
CLASS CLOB CLOSE COLLATE
COLLATION COLLECT COLUMN COMMIT
COMPLETION CONDITION CONNECT CONNECTION
CONSTRAINT CONSTRAINTS CONSTRUCTOR CONTAINS
CONTINUE CORRESPONDING CREATE CROSS
CUBE CURRENT CURRENT_DATE CURRENT_PATH
CURRENT_ROLE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER
CURSOR CYCLE DATA DATALINK
DATE DAY DEALLOCATE DEC
DECIMAL DECLARE DEFAULT DEFERRABLE
DELETE DEPTH DEREF DESC
DESCRIPTOR DESTRUCTOR DIAGNOSTICS DICTIONARY
DISCONNECT DO DOMAIN DOUBLE
DROP ELEMENT END-EXEC EQUALS
ESCAPE EXCEPT EXCEPTION EXECUTE
EXIT EXPAND EXPANDING FALSE
FIRST FLOAT FOR FOREIGN
FREE FROM FUNCTION FUSION
GENERAL GET GLOBAL GOTO
GROUP GROUPING HANDLER HASH
HOUR IDENTITY IF IGNORE
IMMEDIATE IN INDICATOR INITIALIZE
INITIALLY INNER INOUT INPUT
INSERT INT INTEGER INTERSECT
INTERSECTION INTERVAL INTO IS
ISOLATION ITERATE JOIN KEY
LANGUAGE LARGE LAST LATERAL
LEADING LEAVE LEFT LESS
LEVEL LIKE LIMIT LOCAL
LOCALTIME LOCALTIMESTAMP LOCATOR LOOP
MATCH MEMBER MEETS MERGE
MINUTE MODIFIES MODIFY MODULE
MONTH MULTISET NAMES NATIONAL
NATURAL NCHAR NCLOB NEW
NEXT NO NONE NORMALIZE
NOT NULL NUMERIC OBJECT
OF OFF OLD ON
ONLY OPEN OPERATION OPTION
OR ORDER ORDINALITY OUT
OUTER OUTPUT PAD PARAMETER
PARAMETERS PARTIAL PATH PERIOD
POSTFIX PRECEDES PRECISION PREFIX
PREORDER PREPARE PRESERVE PRIMARY
PRIOR PRIVILEGES PROCEDURE PUBLIC
READ READS REAL RECURSIVE
REDO REF REFERENCES REFERENCING
RELATIVE REPEAT RESIGNAL RESTRICT
RESULT RETURN RETURNS REVOKE
RIGHT ROLE ROLLBACK ROLLUP
ROUTINE ROW ROWS SAVEPOINT
SCHEMA SCROLL SEARCH SECOND
SECTION SELECT SEQUENCE SESSION
SESSION_USER SET SETS SIGNAL
SIZE SMALLINT SPECIFIC SPECIFICTYPE
SQL SQLEXCEPTION SQLSTATE SQLWARNING
START STATE STATIC STRUCTURE
SUBMULTISET SUCCEEDS SUM SYSTEM_USER
TABLE TABLESAMPLE TEMPORARY TERMINATE
THAN THEN TIME TIMESTAMP
TIMEZONE_HOUR TIMEZONE_MINUTE TO TRAILING
TRANSACTION TRANSLATION TREAT TRIGGER
TRUE UESCAPE UNDER UNDO
UNION UNIQUE UNKNOWN UNTIL
UPDATE USAGE USER USING
VALUE VALUES VARCHAR VARIABLE
VARYING VIEW WHEN WHENEVER
WHERE WHILE WITH WRITE
YEAR ZONE

Перевод статьи «SQL Syntax» был подготовлен дружной командой проекта Сайтостроение от А до Я.