Синтаксис 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
Приоритетность операторов

SELECT 12 * (2 + 24)
Результат
12 * (2 + 24)
312
Приоритетность операторов

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

Список ключевых слов 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 |