Синтаксис языка программирования SQL определяется и поддерживается ISO/IEC SC 32 как часть ISO/IEC 9075. Этот стандарт не является свободно доступным. Несмотря на существование стандарта, код SQL не является полностью переносимым между различными системами баз данных без корректировок.
Язык SQL подразделяется на несколько языковых элементов, в том числе:
SELECT
, COUNT
и YEAR
), либо не зарезервированы (например ASC
, DOMAIN
и KEY
). Список зарезервированных слов SQL .YEAR
указан как "YEAR"
.ansi_quotes
режима SQL обеспечивает стандартное поведение SQL. Их также можно использовать независимо от этого режима с помощью обратных кавычек: `YEAR`
.Иногда предлагались или реализовывались другие операторы, например, оператор skyline (для поиска только тех строк, которые не «хуже» других).
SQL имеет case
выражение, которое было введено в SQL-92 . В своей наиболее общей форме, которая в стандарте SQL называется «искомым случаем»:
СЛУЧАЙ КОГДА n > 0 ТО «положительный» КОГДА n < 0 ТО «отрицательный» ИНАЧЕ «ноль» КОНЕЦ
SQL проверяет WHEN
условия в порядке их появления в источнике. Если источник не указывает выражение ELSE
, SQL по умолчанию использует ELSE NULL
. Также можно использовать сокращенный синтаксис, называемый «простой случай»:
СЛУЧАЙ n КОГДА 1 ТО «Один», КОГДА 2 ТО «Два» , ИНАЧЕ «Я не могу так высоко посчитать» КОНЕЦ
В этом синтаксисе используются неявные сравнения на равенство с обычными оговорками для сравнения с NULL .
Существуют две краткие формы специальных CASE
выражений: COALESCE
и NULLIF
.
Выражение COALESCE
возвращает значение первого ненулевого операнда, найденного слева направо, или NULL, если все операнды равны NULL.
ОБЪЕДИНИТЬ ( x1 , x2 )
эквивалентно:
СЛУЧАЙ, КОГДА x1 НЕ NULL , ТО x1 ИНАЧЕ x2 КОНЕЦ
Выражение NULLIF
имеет два операнда и возвращает NULL, если операнды имеют одинаковое значение; в противном случае оно имеет значение первого операнда.
NULLIF ( x1 , x2 )
эквивалентно
СЛУЧАЙ, КОГДА x1 = x2 ТО NULL ИНАЧЕ x1 КОНЕЦ
Стандартный SQL допускает два формата комментариев : -- comment
, который заканчивается первым символом новой строки , и /* comment */
, который может охватывать несколько строк.
Наиболее распространенная операция в 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]OFFSET
указывается количество строк, которые следует пропустить перед началом возврата данных.FETCH FIRST
предложении указывается количество возвращаемых строк. Некоторые базы данных SQL вместо этого имеют нестандартные альтернативы, например LIMIT
, TOP
или ROWNUM
.Пункты запроса имеют определенный порядок выполнения, [5] который обозначается числом с правой стороны. Он выглядит следующим образом:
Следующий пример запроса SELECT
возвращает список дорогих книг. Запрос извлекает все строки из таблицы Book , в которых столбец price содержит значение больше 100.00. Результат сортируется в порядке возрастания по title . Звездочка (*) в списке выбора указывает, что все столбцы таблицы Book должны быть включены в набор результатов.
ВЫБРАТЬ * ИЗ КНИГИ , ГДЕ цена > 100 . 00 УПОРЯДОЧИТЬ ПО названию ;
В приведенном ниже примере демонстрируется запрос к нескольким таблицам, группировка и агрегация, возвращающий список книг и количество авторов, связанных с каждой книгой.
ВЫБРАТЬ Книгу.title КАК Название , количество ( * ) КАК Авторы ИЗ Книги ПРИСОЕДИНИТЬ Автор_книги В Книгу.isbn = Автор_книги.isbn ГРУППИРОВАТЬ ПО Книгу.title ;
Пример вывода может выглядеть следующим образом:
Название Авторы---------------------- -------Примеры и руководство SQL 4Радость SQL 1Введение в SQL 2Подводные камни SQL 1
При условии, что isbn является единственным общим именем столбца в двух таблицах и что столбец с именем title существует только в таблице Book , можно переписать приведенный выше запрос в следующем виде:
ВЫБРАТЬ название , количество ( * ) КАК Авторы ИЗ Книги ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ Автор_книги ГРУППИРОВАТЬ ПО название ;
Однако многие поставщики [ квантификации ] либо не поддерживают этот подход, либо требуют соблюдения определенных соглашений об именовании столбцов для эффективной работы естественных объединений.
SQL включает операторы и функции для вычисления значений на основе сохраненных значений. SQL позволяет использовать выражения в списке выбора для проецирования данных, как в следующем примере, который возвращает список книг стоимостью более 100,00 с дополнительным столбцом sales_tax , содержащим показатель налога с продаж, рассчитанный в размере 6% от цены .
ВЫБРАТЬ isbn , название , цена , цена * 0. 06 КАК налог_с_продаж ИЗ Книги , ГДЕ цена > 100. 00 УПОРЯДОЧИТЬ ПО название ;
Запросы могут быть вложенными, так что результаты одного запроса могут быть использованы в другом запросе через реляционный оператор или функцию агрегации. Вложенный запрос также известен как подзапрос . В то время как соединения и другие табличные операции предоставляют вычислительно превосходящие (т.е. более быстрые) альтернативы во многих случаях, использование подзапросов вводит иерархию в выполнение, которая может быть полезной или необходимой. В следующем примере функция агрегации AVG
получает в качестве входных данных результат подзапроса:
ВЫБРАТЬ isbn , название , цену ИЗ Книги, ГДЕ цена < ( ВЫБРАТЬ СРЕДНЯЯ ( цена ) ИЗ Книги ) УПОРЯДОЧИТЬ ПО название ;
Подзапрос может использовать значения из внешнего запроса, в этом случае он называется коррелированным подзапросом .
С 1999 года стандарт SQL допускает WITH
предложения для подзапросов, т. е. именованные подзапросы, обычно называемые общими табличными выражениями (также называемыми факторизацией подзапросов ). CTE также могут быть рекурсивными , ссылаясь на себя; полученный механизм позволяет выполнять обходы деревьев или графов (при представлении в виде отношений) и, в более общем смысле, вычисления фиксированных точек .
Производная таблица — это использование ссылки на подзапрос SQL в предложении FROM. По сути, производная таблица — это подзапрос, из которого можно выбирать или к которому можно присоединяться. Функционал производной таблицы позволяет пользователю ссылаться на подзапрос как на таблицу. Производную таблицу иногда называют встроенным представлением или подвыборкой .
В следующем примере оператор SQL включает соединение исходной таблицы "Book" с производной таблицей "sales". Эта производная таблица собирает связанную информацию о продажах книг, используя ISBN для соединения с таблицей "Book". В результате производная таблица предоставляет результирующий набор с дополнительными столбцами (количество проданных товаров и компания, продавшая книги):
ВЫБРАТЬ b.isbn , b.title , b.price , sales.items_sold , sales.company_nm ИЗ Книги b ПРИСОЕДИНИТЬСЯ ( ВЫБРАТЬ СУММУ ( Товары_проданы ) Товары_проданы , Company_Nm , ISBN ИЗ Книги СГРУППИРОВАТЬ ПО Company_Nm , ISBN ) продажи В продажи.isbn = b.isbn
Концепция Null позволяет SQL работать с отсутствующей информацией в реляционной модели. Это слово NULL
является зарезервированным ключевым словом в SQL, используемым для идентификации специального маркера Null. Сравнения с Null, например, равенство (=) в предложениях WHERE, приводят к значению истинности Unknown. В операторах SELECT SQL возвращает только результаты, для которых предложение WHERE возвращает значение True; т. е. оно исключает результаты со значениями False, а также исключает те, значение которых Unknown.
Наряду с True и False, Unknown, полученный в результате прямого сравнения с Null, таким образом, привносит фрагмент трехзначной логики в SQL. Таблицы истинности, которые SQL использует для AND, OR и NOT, соответствуют общему фрагменту трехзначной логики Клини и Лукасевича (которые различаются в определении импликации, однако SQL не определяет такую операцию). [6]
Однако существуют споры о семантической интерпретации значений Null в SQL из-за их обработки вне прямых сравнений. Как видно из таблицы выше, прямые сравнения на равенство между двумя значениями NULL в SQL (например, NULL = NULL
) возвращают значение истинности Unknown. Это соответствует интерпретации, что Null не имеет значения (и не является членом какой-либо области данных), а скорее является заполнителем или «меткой» для отсутствующей информации. Однако принцип, согласно которому два значения Null не равны друг другу, фактически нарушается в спецификации SQL для операторов UNION
и INTERSECT
, которые идентифицируют значения Null друг с другом. [7] Следовательно, эти операции над множествами в SQL могут давать результаты, не представляющие точную информацию, в отличие от операций, включающих явные сравнения с NULL (например, тех, что в WHERE
обсуждаемом выше предложении). В предложении Кодда 1979 года (которое было в основном принято SQL92) эта семантическая непоследовательность рационализируется утверждением, что удаление дубликатов в операциях над множествами происходит «на более низком уровне детализации, чем проверка равенства при оценке операций поиска». [6] Однако профессор компьютерных наук Рон ван дер Мейден пришел к выводу, что «Несоответствия в стандарте SQL означают, что невозможно приписать какую-либо интуитивную логическую семантику обработке значений NULL в SQL». [7]
Кроме того, поскольку операторы SQL возвращают Unknown при прямом сравнении чего-либо с Null, SQL предоставляет два специфичных для Null предиката сравнения: IS NULL
и IS NOT NULL
проверка того, являются ли данные Null или нет. [8] SQL явно не поддерживает универсальную квантификацию и должен обрабатывать ее как отрицательную экзистенциальную квантификацию . [9] [10] [11] Существует также <row value expression> IS DISTINCT FROM <row value expression>
инфиксный оператор сравнения, который возвращает TRUE, если оба операнда не равны или оба не равны NULL. Аналогично, IS NOT DISTINCT FROM определяется как NOT (<row value expression> IS DISTINCT FROM <row value expression>)
. SQL:1999 также ввел BOOLEAN
переменные типа, которые согласно стандарту также могут содержать значения Unknown, если они допускают значение NULL. На практике ряд систем (например, PostgreSQL ) реализуют BOOLEAN Unknown как BOOLEAN NULL, о чем стандарт говорит, что NULL BOOLEAN и UNKNOWN «могут использоваться взаимозаменяемо, чтобы означать одно и то же». [12] [13]
Язык манипулирования данными (DML) — это подмножество SQL, используемое для добавления, обновления и удаления данных:
ВСТАВИТЬ В пример ( столбец1 , столбец2 , столбец3 ) ЗНАЧЕНИЯ ( 'тест' , 'N' , NULL );
UPDATE
изменяет набор существующих строк таблицы, например:Пример ОБНОВЛЕНИЯ SET column1 = 'обновленное значение' WHERE column2 = 'N' ;
DELETE
удаляет существующие строки из таблицы, например:УДАЛИТЬ ИЗ примера ГДЕ столбец2 = 'N' ;
MERGE
используется для объединения данных нескольких таблиц. Он объединяет элементы INSERT
и UPDATE
. Он определен в стандарте SQL:2003; до этого некоторые базы данных предоставляли схожую функциональность с помощью другого синтаксиса, иногда называемого « upsert ». ОБЪЕДИНИТЬ В table_name ИСПОЛЬЗОВАНИЕ table_reference ON ( condition ) ЕСЛИ СООТВЕТСТВУЕТ , ТО ОБНОВИТЬ SET column1 = value1 [, column2 = value2 ...] ЕСЛИ НЕ СООТВЕТСТВУЕТ , ТО ВСТАВИТЬ ( column1 [, column2 ...]) ЗНАЧЕНИЯ ( value1 [, value2 ...])
Транзакции, если они доступны, заключают в себе операции DML:
START TRANSACTION
(или BEGIN WORK
, или BEGIN TRANSACTION
, в зависимости от диалекта SQL) обозначает начало транзакции базы данных , которая либо завершается полностью, либо не завершается вообще.SAVE TRANSACTION
(или SAVEPOINT
) сохраняет состояние базы данных на текущий момент транзакцииCREATE TABLE tbl_1 ( id int ); INSERT INTO tbl_1 ( id ) VALUES ( 1 ); INSERT INTO tbl_1 ( id ) VALUES ( 2 ); COMMIT ; UPDATE tbl_1 SET id = 200 WHERE id = 1 ; SAVEPOINT id_1upd ; UPDATE tbl_1 SET id = 1000 WHERE id = 2 ; ROLLBACK to id_1upd ; SELECT id from tbl_1 ;
COMMIT
делает все изменения данных в транзакции постоянными.ROLLBACK
отменяет все изменения данных с момента последнего COMMIT
или ROLLBACK
, оставляя данные такими, какими они были до этих изменений. После COMMIT
завершения оператора изменения транзакции не могут быть откатлены.COMMIT
и ROLLBACK
завершить текущую транзакцию и снять блокировки данных. При отсутствии START TRANSACTION
или аналогичного оператора семантика SQL зависит от реализации. Следующий пример показывает классическую транзакцию перевода средств, где деньги снимаются с одного счета и добавляются на другой. Если удаление или добавление не удается, вся транзакция откатывается.
НАЧАТЬ ТРАНЗАКЦИЮ ; ОБНОВИТЬ УСТАНОВКУ Счета сумма = сумма - 200 ГДЕ account_number = 1234 ; ОБНОВИТЬ УСТАНОВКУ Счета сумма = сумма + 200 ГДЕ account_number = 2345 ; ЕСЛИ ОШИБКИ = 0, ЗАФИКСИРОВАТЬ ; ЕСЛИ ОШИБКИ <> 0, ОТКАТИТЬ ;
Язык определения данных (DDL) управляет структурой таблиц и индексов. Самыми основными элементами DDL являются операторы CREATE
, ALTER
, RENAME
, DROP
и TRUNCATE
:
CREATE
создает объект (например, таблицу) в базе данных, например:Пример CREATE TABLE ( столбец1 INTEGER , столбец2 VARCHAR ( 50 ), столбец3 DATE NOT NULL , PRIMARY KEY ( столбец1 , столбец2 ) );
ALTER
изменяет структуру существующего объекта различными способами, например, добавляя столбец к существующей таблице или ограничению, например:Пример ALTER TABLE ADD column4 INTEGER DEFAULT 25 NOT NULL ;
TRUNCATE
удаляет все данные из таблицы очень быстро, удаляя данные внутри таблицы, а не саму таблицу. Обычно подразумевает последующую операцию COMMIT, т. е. ее нельзя откатить (данные не записываются в журналы для последующего отката, в отличие от DELETE).Пример TRUNCATE TABLE ;
DROP
удаляет объект в базе данных, обычно безвозвратно, т.е. его нельзя отменить, например:Пример удаления таблицы ;
Каждый столбец в таблице SQL объявляет тип(ы), которые может содержать этот столбец. ANSI SQL включает следующие типы данных. [14]
CHARACTER(n)
(или ): строка из n символов фиксированной ширины , дополненная пробелами по мере необходимостиCHAR(n)
CHARACTER VARYING(n)
(или ): строка переменной ширины с максимальным размером n символовVARCHAR(n)
CHARACTER LARGE OBJECT(n [ K | M | G | T ])
(или ): большой символьный объект с максимальным размером n [ K | M | G | T ] символовCLOB(n [ K | M | G | T ])
NATIONAL CHARACTER(n)
(или ): строка фиксированной ширины, поддерживающая международный набор символовNCHAR(n)
NATIONAL CHARACTER VARYING(n)
(или ): строка переменной шириныNVARCHAR(n)
NCHAR
NATIONAL CHARACTER LARGE OBJECT(n [ K | M | G | T ])
(или ): большой объект национального символа с максимальным размером n [ K | M | G | T ] символовNCLOB(n [ K | M | G | T ])
Для типов данных CHARACTER LARGE OBJECT
и NATIONAL CHARACTER LARGE OBJECT
множители K
(1 024), M
(1 048 576), G
(1 073 741 824) и T
(1 099 511 627 776) могут быть опционально использованы при указании длины.
BINARY(n)
: Двоичная строка фиксированной длины, максимальная длина n .BINARY VARYING(n)
(или ): Двоичная строка переменной длины, максимальная длина n .VARBINARY(n)
BINARY LARGE OBJECT(n [ K | M | G | T ])
(или ): большой двоичный объект с максимальной длиной n [ K | M | G | T ] .BLOB(n [ K | M | G | T ])
Для типа данных при указании длины можно опционально использовать BINARY LARGE OBJECT
множители K
(1 024), M
(1 048 576), G
(1 073 741 824) и (1 099 511 627 776).T
BOOLEAN
Тип BOOLEAN
данных может хранить значения TRUE
и FALSE
.
INTEGER
(или INT
), SMALLINT
иBIGINT
FLOAT
, REAL
иDOUBLE PRECISION
NUMERIC(precision, scale)
илиDECIMAL(precision, scale)
DECFLOAT(precision
)Например, число 123,45 имеет точность 5 и масштаб 2. Точность — это положительное целое число, которое определяет количество значимых цифр в определенном основании (двоичном или десятичном). Масштаб — это неотрицательное целое число. Масштаб 0 указывает на то, что число является целым числом. Для десятичного числа с масштабом S точное числовое значение — это целое число значимых цифр, деленное на 10 S .
SQL предоставляет функции CEILING
и FLOOR
для округления числовых значений. (Популярные функции, специфичные для поставщиков: TRUNC
(Informix, DB2, PostgreSQL, Oracle и MySQL) и ROUND
(Informix, SQLite, Sybase, Oracle, PostgreSQL, Microsoft SQL Server и Mimer SQL.))
DATE
: для значений даты (например 2011-05-03
).TIME
: для значений времени (например 15:51:36
).TIME WITH TIME ZONE
: то же, что и TIME
, но включает сведения о рассматриваемом часовом поясе.TIMESTAMP
: Это DATE
и TIME
объединенные в одну переменную (например, 2011-05-03 15:51:36.123456
).TIMESTAMP WITH TIME ZONE
: то же, что и TIMESTAMP
, но включает сведения о рассматриваемом часовом поясе.Функция SQL EXTRACT
может использоваться для извлечения одного поля (например, секунд) из значения datetime или interval. Текущая системная дата/время сервера базы данных может быть вызвана с помощью таких функций, как CURRENT_DATE
, CURRENT_TIMESTAMP
, LOCALTIME
, или LOCALTIMESTAMP
. (Популярные функции, специфичные для поставщика TO_DATE
, TO_TIME
— , TO_TIMESTAMP
, YEAR
, MONTH
, DAY
, HOUR
, MINUTE
, SECOND
, DAYOFYEAR
, DAYOFMONTH
и DAYOFWEEK
.)
YEAR(precision)
: количество летYEAR(precision) TO MONTH
: количество лет и месяцевMONTH(precision)
: количество месяцевDAY(precision)
: количество днейDAY(precision) TO HOUR
: количество дней и часовDAY(precision) TO MINUTE
: количество дней, часов и минутDAY(precision) TO SECOND(scale)
: количество дней, часов, минут и секундHOUR(precision)
: количество часовHOUR(precision) TO MINUTE
: количество часов и минутHOUR(precision) TO SECOND(scale)
: количество часов, минут и секундMINUTE(precision)
: количество минутMINUTE(precision) TO SECOND(scale)
: количество минут и секундЯзык управления данными (DCL) разрешает пользователям доступ к данным и манипулирование ими. Его два основных утверждения:
GRANT
разрешает одному или нескольким пользователям выполнять операцию или набор операций над объектом.REVOKE
устраняет грант, который может быть грантом по умолчанию.Пример:
GRANT SELECT , UPDATE ON example TO some_user , another_user ; REVOKE SELECT , UPDATE ON example FROM some_user , another_user ;
Хотя аргумент UNIQUE идентичен DISTINCT, он не является стандартом ANSI.
[...] ключевое слово DISTINCT [...] исключает дубликаты из набора результатов.