Синтаксис языка программирования SQL определяется и поддерживается ISO/IEC SC 32 как часть ISO/IEC 9075 . Этот стандарт не находится в свободном доступе. Несмотря на существование стандарта, код SQL не полностью переносим между различными системами баз данных без корректировок.
Язык SQL подразделяется на несколько языковых элементов, в том числе:
SELECT
, COUNT
и YEAR
), либо незарезервированы (например ASC
, DOMAIN
и KEY
). Список зарезервированных слов SQL .YEAR
указывается как "YEAR"
.ansi_quotes
режима SQL обеспечивает соблюдение стандартного поведения SQL. Их также можно использовать независимо от этого режима с помощью обратных кавычек: `YEAR`
.Иногда предлагались или реализовывались другие операторы, такие как оператор горизонта (для поиска только тех строк, которые не «хуже», чем любые другие).
В 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, если все операнды равны NULL.
ОБЪЕДИНЯЙТЕСЬ ( x1 , x2 )
эквивалентно:
СЛУЧАЙ , КОГДА x1 НЕ НУЛЬ , ТОГДА x1 ELSE x2 КОНЕЦ
Выражение NULLIF
имеет два операнда и возвращает NULL, если операнды имеют одинаковое значение, в противном случае оно имеет значение первого операнда.
НУЛЛИС ( x1 , x2 )
эквивалентно
СЛУЧАЙ , КОГДА x1 = x2 , ТОГДА НОЛЬ, ИНАЧЕ 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 , в которых столбец цены содержит значение больше 100,00. Результат сортируется в порядке возрастания названия . Звездочка (*) в списке выбора указывает, что все столбцы таблицы Book должны быть включены в набор результатов.
ВЫБЕРИТЕ * ИЗ Забронировать ГДЕ цена > 100 . 00 ПОРЯДОК ПО названию ;
В приведенном ниже примере демонстрируется запрос нескольких таблиц, группировка и агрегирование путем возврата списка книг и количества авторов, связанных с каждой книгой.
ВЫБРАТЬ книгу . title AS Название , количество ( * ) AS Авторы ИЗ Книги ПРИСОЕДИНЯЙТЕСЬ Book_author ON Book . isbn = Автор_книги . isbn ГРУППИРОВАТЬ ПО Книге . заголовок ;
Пример вывода может выглядеть следующим образом:
Название Авторы---------------------- -------Примеры SQL и руководство 4Радость SQL 1Введение в SQL 2Подводные камни SQL 1
При условии, что isbn является единственным общим именем столбца в двух таблицах и что столбец с именем title существует только в таблице Book , можно переписать приведенный выше запрос в следующей форме:
ВЫБРАТЬ название , количество ( * ) КАК Авторы ИЗ Книги ЕСТЕСТВЕННОЕ ПРИСОЕДИНЕНИЕ Автор_книги ГРУППИРОВАТЬ ПО названию ;
Однако многие поставщики [ quantify ] либо не поддерживают этот подход, либо требуют определенных соглашений об именах столбцов для эффективной работы естественных объединений.
SQL включает операторы и функции для вычисления значений хранимых значений. SQL позволяет использовать выражения в списке выбора для проецирования данных, как в следующем примере, который возвращает список книг стоимостью более 100,00 с дополнительным столбцом sales_tax , содержащим сумму налога с продаж, рассчитанную в размере 6% от цены .
ВЫБЕРИТЕ isbn , название , цену , цену * 0 . 06 AS sales_tax ИЗ Книга ГДЕ цена > 100 . 00 ПОРЯДОК ПО названию ;
Запросы могут быть вложенными, чтобы результаты одного запроса можно было использовать в другом запросе с помощью оператора отношения или функции агрегирования. Вложенный запрос также известен как подзапрос . Хотя соединения и другие операции с таблицами во многих случаях обеспечивают превосходные в вычислительном отношении (т.е. более быстрые) альтернативы, использование подзапросов вводит иерархию выполнения, которая может быть полезной или необходимой. В следующем примере функция агрегирования AVG
получает на вход результат подзапроса:
ВЫБЕРИТЕ isbn , название , цену ИЗ книги ГДЕ цена < ( ВЫБЕРИТЕ AVG ( цена ) ИЗ книги ) ПОРЯДОК ПО названию ;
Подзапрос может использовать значения из внешнего запроса, и в этом случае он называется коррелированным подзапросом .
С 1999 года стандарт SQL допускает использование WITH
предложений для подзапросов, т.е. именованных подзапросов, обычно называемых общими табличными выражениями (также называемых факторизацией подзапросов ). CTE также могут быть рекурсивными , ссылаясь на себя; Полученный механизм позволяет осуществлять обход деревьев или графов (когда они представлены в виде отношений) и, в более общем плане, вычисления с фиксированной точкой .
Производная таблица — это использование ссылки на подзапрос SQL в предложении FROM. По сути, производная таблица представляет собой подзапрос, из которого можно выбрать или присоединиться к нему. Функциональность производной таблицы позволяет пользователю ссылаться на подзапрос как на таблицу. Производную таблицу иногда называют встроенным представлением или подвыборкой .
В следующем примере оператор SQL включает соединение исходной таблицы «Книга» с производной таблицей «Продажи». Эта производная таблица собирает связанную информацию о продажах книг с использованием ISBN для присоединения к таблице «Книга». В результате производная таблица предоставляет результирующий набор с дополнительными столбцами (количество проданных товаров и компания, продавшая книги):
ВЫБРАТЬ б . исбн , б . титул , б . цена , продажа . items_sold , продажи . Company_nm FROM Book_Sales GROUP BY Company_Nm , ISBN ) продажи ON продажи . исбн = б . исбн
Концепция Null позволяет SQL обрабатывать недостающую информацию в реляционной модели. Это зарезервированное ключевое слово NULL
в SQL, используемое для идентификации специального нулевого маркера. Сравнения с Null, например равенство (=) в предложениях WHERE, приводят к неизвестному значению истинности. В операторах SELECT SQL возвращает только результаты, для которых предложение WHERE возвращает значение True; т. е. он исключает результаты со значениями False, а также исключает результаты со значением Unknown.
Таким образом, наряду с True и False, Unknown, полученный в результате прямого сравнения с Null, привносит в SQL фрагмент трехзначной логики . Таблицы истинности, которые SQL использует для И, ИЛИ и НЕ, соответствуют общему фрагменту трехзначной логики Клини и Лукасевича (которые различаются определением импликации, однако SQL не определяет такую операцию). [6]
Однако существуют споры по поводу семантической интерпретации нулей в SQL из-за того, что они обрабатываются вне прямых сравнений. Как видно из таблицы выше, прямое сравнение двух значений NULL в SQL (например NULL = NULL
, ) возвращает значение истинности Неизвестно. Это соответствует интерпретации, согласно которой Null не имеет значения (и не является членом какой-либо области данных), а скорее является заполнителем или «меткой» для отсутствующей информации. Однако принцип, согласно которому два значения NULL не равны друг другу, фактически нарушается в спецификации SQL для операторов UNION
и INTERSECT
, которые идентифицируют значения NULL друг с другом. [7] Следовательно, эти операции над множествами в SQL могут давать результаты, не представляющие достоверную информацию, в отличие от операций, включающих явные сравнения с NULL (например, в предложении, WHERE
рассмотренном выше). В предложении Кодда 1979 года (которое в основном было принято в SQL92) это семантическое несоответствие объясняется тем, что удаление дубликатов в операциях над множествами происходит «на более низком уровне детализации, чем проверка на равенство при оценке операций поиска». [6] Однако профессор информатики Рон ван дер Мейден пришел к выводу, что «несоответствия в стандарте SQL означают, что невозможно приписать какую-либо интуитивную логическую семантику обработке нулевых значений в 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. Аналогично, НЕ ОТЛИЧНО ОТ определяется как NOT (<row value expression> IS DISTINCT FROM <row value expression>)
. В SQL:1999 также представлены BOOLEAN
переменные типа, которые согласно стандарту также могут содержать неизвестные значения, если они допускают значение NULL. На практике ряд систем (например, PostgreSQL ) реализуют BOOLEAN Unknown как BOOLEAN NULL, о чем стандарт говорит, что NULL BOOLEAN и UNKNOWN «могут использоваться взаимозаменяемо и означать одно и то же». [12] [13]
Язык манипулирования данными (DML) — это подмножество SQL, используемое для добавления, обновления и удаления данных:
Пример INSERT INTO ( столбец1 , столбец2 , столбец3 ) ЗНАЧЕНИЯ ( 'тест' , 'N' , NULL );
UPDATE
изменяет набор существующих строк таблицы, например:Пример ОБНОВЛЕНИЯ SET columns1 = 'обновленное значение' WHERE columns2 = 'N' ;
DELETE
удаляет существующие строки из таблицы, например:УДАЛИТЬ ИЗ примера WHERE columns2 = 'N' ;
MERGE
используется для объединения данных нескольких таблиц. Он сочетает в себе элементы INSERT
и UPDATE
. Он определен в стандарте SQL:2003; до этого некоторые базы данных предоставляли аналогичную функциональность через другой синтаксис, иногда называемый « upsert ». MERGE INTO имя_таблицы С ИСПОЛЬЗОВАНИЕМ table_reference ON ( условие ) ЕСЛИ СООТВЕТСТВИЕ ТОГДА ОБНОВЛЕНИЕ SET столбец1 = значение1 [, столбец2 = значение2 ...] КОГДА НЕ СООТВЕТСТВУЕТ ТОГДА ВСТАВКА ( столбец1 [, столбец2 ...]) ЗНАЧЕНИЯ ( значение1 [, значение2 ...] ])
Транзакции, если они доступны, оборачивают операции DML:
START TRANSACTION
(или BEGIN WORK
, или BEGIN TRANSACTION
, в зависимости от диалекта SQL) отмечает начало транзакции базы данных , которая либо завершается полностью, либо не завершается вообще.SAVE TRANSACTION
(или SAVEPOINT
) сохраняет состояние базы данных в текущий момент транзакцииСОЗДАТЬ ТАБЛИЦУ tbl_1 ( id int ); ВСТАВИТЬ В tbl_1 ( id ) ЗНАЧЕНИЯ ( 1 ); ВСТАВИТЬ В tbl_1 ( id ) ЗНАЧЕНИЯ ( 2 ); СОВЕРШИТЬ ; UPDATE tbl_1 SET id = 200 WHERE id = 1 ; ТОЧКА СОХРАНЕНИЯ id_1upd ; UPDATE tbl_1 SET id = 1000 WHERE id = 2 ; ОТКАТ до id_1upd ; ВЫБРАТЬ идентификатор из таблицы_1 ;
COMMIT
делает все изменения данных в транзакции постоянными.ROLLBACK
отменяет все изменения данных с момента последнего COMMIT
или ROLLBACK
, оставляя данные такими, какими они были до этих изменений. После COMMIT
завершения оператора изменения транзакции не могут быть отменены.COMMIT
и ROLLBACK
завершить текущую транзакцию и снять блокировки данных. При отсутствии такого START TRANSACTION
или подобного оператора семантика SQL зависит от реализации. В следующем примере показана классическая транзакция перевода средств, при которой деньги снимаются с одного счета и добавляются на другой. Если удаление или добавление завершается неудачей, вся транзакция откатывается.
НАЧАТЬ ТРАНЗАКЦИЮ ; UPDATE Account SET sum = sum - 200 WHERE account_number = 1234 ; UPDATE Account SET sum = sum + 200 WHERE account_number = 2345 ; ЕСЛИ ОШИБКИ = 0 COMMIT ; ЕСЛИ ОШИБКИ <> 0 ОТОТ ;
Язык определения данных (DDL) управляет структурой таблиц и индексов. Самыми основными элементами DDL являются операторы CREATE
, ALTER
, RENAME
и :DROP
TRUNCATE
CREATE
создает объект (например, таблицу) в базе данных, например:Пример CREATE TABLE ( столбец1 INTEGER , столбец2 VARCHAR ( 50 ), столбец3 DATE NOT NULL , ПЕРВИЧНЫЙ КЛЮЧ ( столбец1 , столбец2 ) );
ALTER
изменяет структуру существующего объекта различными способами, например, добавляя столбец в существующую таблицу или ограничение, например:Пример ALTER TABLE ADD columns4 INTEGER DEFAULT 25 NOT NULL ;
TRUNCATE
очень быстро удаляет все данные из таблицы, удаляя данные внутри таблицы, а не саму таблицу. Обычно подразумевает последующую операцию COMMIT, т.е. ее нельзя откатить (данные не записываются в логи для последующего отката, в отличие от DELETE).Пример TRUNCATE TABLE ;
DROP
удаляет объект в базе данных, обычно безвозвратно, т.е. его невозможно откатить, например:Пример DROP TABLE ;
Каждый столбец в таблице 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 | М | г | Т ] символы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 | М | г | Т ] символы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) и (1 099 511 627 776).T
BINARY(n)
: двоичная строка фиксированной длины, максимальная длина n .BINARY VARYING(n)
(или ): двоичная строка переменной длины, максимальная длина n .VARBINARY(n)
BINARY LARGE OBJECT(n [ K | M | G | T ])
(или ): большой двоичный объект максимальной длины n [ K | М | г | Т] .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
: это a DATE
и a, TIME
объединенные в одну переменную (например, 2011-05-03 15:51:36.123456
).TIMESTAMP WITH TIME ZONE
: то же, что и TIMESTAMP
, но включает сведения о часовом поясе.Функцию SQL EXTRACT
можно использовать для извлечения одного поля (например, секунд) значения даты и времени или интервала. Текущую системную дату/время сервера базы данных можно вызвать с помощью таких функций 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 пример TO some_user , other_user ; REVOKE SELECT , UPDATE ON пример FROM some_user , other_user ;
Хотя аргумент UNIQUE идентичен аргументу DISTINCT, он не является стандартом ANSI.
[...] ключевое слово DISTINCT [...] удаляет дубликаты из набора результатов.