Синтаксис SQL
Синтаксис ISO языка SQL программирования определяется и поддерживается /IEC SC 32 как часть ISO/IEC 9075 . Этот стандарт не находится в свободном доступе. Несмотря на существование стандарта, код SQL не полностью переносим между различными системами баз данных без корректировок.
Языковые элементы
[ редактировать ]Язык SQL подразделяется на несколько языковых элементов, в том числе:
- Ключевые слова — это слова, определенные в языке SQL. Они либо зарезервированы (например,
SELECT
,COUNT
иYEAR
) или незарезервированные (например,ASC
,DOMAIN
иKEY
). Список зарезервированных слов SQL . - Идентификаторы — это имена объектов базы данных, таких как таблицы , столбцы и схемы. Идентификатор не может быть равен зарезервированному ключевому слову, если только он не является идентификатором с разделителями. Идентификаторы с разделителями означают идентификаторы, заключенные в двойные кавычки. Они могут содержать символы, обычно не поддерживаемые в идентификаторах SQL, и могут быть идентичны зарезервированному слову, например, столбцу с именем
YEAR
указывается как"YEAR"
.- В MySQL двойные кавычки являются разделителями строковых литералов вместо этого по умолчанию . Включение
ansi_quotes
Режим SQL обеспечивает стандартное поведение SQL. Их также можно использовать независимо от этого режима с помощью обратных кавычек:`YEAR`
.
- В MySQL двойные кавычки являются разделителями строковых литералов вместо этого по умолчанию . Включение
- Предложения , являющиеся составными компонентами операторов и запросов. (В некоторых случаях это необязательно.) [1]
- Выражения , которые могут создавать либо скалярные значения, либо таблицы, состоящие из столбцов и строк данных.
- Предикаты , которые определяют условия, которые могут быть оценены с помощью трехзначной логики SQL (3VL) (истина/ложь/неизвестно) или логических значений истинности и используются для ограничения эффектов операторов и запросов или для изменения хода программы.
- Запросы , которые извлекают данные на основе определенных критериев. Это важный элемент SQL .
- Операторы , которые могут оказывать постоянное влияние на схемы и данные или могут управлять транзакциями , потоком программы , соединениями, сеансами или диагностикой.
- Операторы SQL также включают в себя точку с запятой (";"). Хотя он не требуется на каждой платформе, он определяется как стандартная часть грамматики SQL.
- Незначительные пробелы обычно игнорируются в операторах и запросах SQL, что упрощает форматирование кода SQL для удобства чтения.
Операторы
[ редактировать ]Оператор | Описание | Пример |
---|---|---|
=
|
Равно | Author = 'Alcott'
|
<>
|
Не равно (многие диалекты также принимают != )
|
Dept <> 'Sales'
|
>
|
Больше, чем | Hire_Date > '2012-01-31'
|
<
|
Меньше, чем | Bonus < 50000.00
|
>=
|
Больше или равно | Dependents >= 2
|
<=
|
Меньше или равно | Rate <= 0.05
|
[NOT] BETWEEN [SYMMETRIC]
|
Между инклюзивным диапазоном. SYMMETRIC инвертирует границы диапазона, если первая выше второй. | Cost BETWEEN 100.00 AND 500.00
|
[NOT] LIKE [ESCAPE]
|
Начинается с шаблона символов | Full_Name LIKE 'Will%'
|
Содержит шаблон символов | Full_Name LIKE '%Will%'
| |
[NOT] IN
|
Равно одному из нескольких возможных значений | DeptCode IN (101, 103, 209)
|
IS [NOT] NULL
|
Сравнить с нулем (отсутствуют данные) | Address IS NOT NULL
|
IS [NOT] TRUE или IS [NOT] FALSE
|
Булева проверка истинности | PaidVacation IS TRUE
|
IS NOT DISTINCT FROM
|
Равно значению или оба значения равны нулю (отсутствуют данные). | Debt IS NOT DISTINCT FROM - Receivables
|
AS
|
Используется для изменения имени столбца при просмотре результатов. | SELECT employee AS department1
|
Иногда предлагались или реализовывались другие операторы, такие как оператор горизонта (для поиска только тех строк, которые не «хуже», чем любые другие).
SQL имеет case
выражение, которое было введено в SQL-92 . В наиболее общей форме, которая в стандарте SQL называется «поисковым случаем»:
CASE WHEN n > 0
THEN 'positive'
WHEN n < 0
THEN 'negative'
ELSE 'zero'
END
SQL-тесты WHEN
условия в том порядке, в котором они указаны в источнике. Если в источнике не указано ELSE
выражение, SQL по умолчанию имеет значение ELSE NULL
. Также можно использовать сокращенный синтаксис, называемый «простым случаем»:
CASE n WHEN 1
THEN 'One'
WHEN 2
THEN 'Two'
ELSE 'I cannot count that high'
END
Этот синтаксис использует неявное сравнение на равенство с обычными оговорками для сравнения с NULL .
Есть две короткие формы для специальных CASE
выражения: COALESCE
и NULLIF
.
The COALESCE
Выражение возвращает значение первого операнда, отличного от NULL, найденного слева направо, или NULL, если все операнды равны NULL.
COALESCE(x1,x2)
эквивалентно:
CASE WHEN x1 IS NOT NULL THEN x1
ELSE x2
END
The NULLIF
Выражение имеет два операнда и возвращает NULL, если операнды имеют одинаковое значение, в противном случае оно имеет значение первого операнда.
NULLIF(x1, x2)
эквивалентно
CASE WHEN x1 = x2 THEN NULL ELSE x1 END
Комментарии
[ редактировать ]Стандартный SQL допускает два формата комментариев : -- comment
, который заканчивается первой новой строкой , и /* comment */
, который может занимать несколько строк.
Запросы
[ редактировать ]Самая распространенная операция SQL — запрос — использует декларативный подход. SELECT
заявление. SELECT
извлекает данные из одной или нескольких таблиц или выражений. Стандартный SELECT
операторы не оказывают постоянного воздействия на базу данных. Некоторые нестандартные реализации SELECT
может иметь стойкие последствия, такие как SELECT INTO
синтаксис, предусмотренный в некоторых базах данных. [2]
Запросы позволяют пользователю описывать желаемые данные, предоставляя системе управления базами данных (СУБД) выполнение планирования , оптимизации и выполнения физических операций, необходимых для получения результата по ее выбору.
Запрос включает список столбцов, которые должны быть включены в окончательный результат, обычно сразу после SELECT
ключевое слово. Звездочка (" *
") можно использовать, чтобы указать, что запрос должен возвращать все столбцы запрошенных таблиц. SELECT
— это самый сложный оператор SQL с необязательными ключевыми словами и предложениями, в том числе:
- The
FROM
предложение, которое указывает таблицу(и), из которой нужно получить данные.FROM
пункт может включать необязательныйJOIN
подпункты для указания правил объединения таблиц. - The
WHERE
Предложение включает предикат сравнения, который ограничивает строки, возвращаемые запросом.WHERE
все строки Предикат удаляет из набора результатов , в которых предикат сравнения не имеет значения True. - The
GROUP BY
В этом предложении строки, имеющие общие значения, проецируются на меньший набор строк. [ нужны разъяснения ]GROUP BY
часто используется в сочетании с функциями агрегации SQL или для исключения повторяющихся строк из набора результатов.WHERE
оговорка применяется доGROUP BY
пункт. - The
HAVING
Предложение включает предикат, используемый для фильтрации строк, полученных в результатеGROUP BY
пункт. Поскольку он действует на основе результатовGROUP BY
функции агрегирования могут использоваться вHAVING
Предикат предложения. - The
ORDER BY
Предложение определяет, какие столбцы следует использовать для сортировки результирующих данных и в каком направлении их сортировать (по возрастанию или по убыванию). БезORDER BY
предложение, порядок строк, возвращаемых SQL-запросом, не определен. - The
DISTINCT
ключевое слово [3] исключает дублирование данных. [4] - The
OFFSET
Предложение указывает количество строк, которые нужно пропустить, прежде чем начать возвращать данные. - The
FETCH FIRST
Предложение указывает количество возвращаемых строк. Вместо этого некоторые базы данных SQL имеют нестандартные альтернативы, напримерLIMIT
,TOP
илиROWNUM
.
Предложения запроса имеют определенный порядок выполнения, [5] что обозначается цифрой справа. Это происходит следующим образом:
SELECT <columns> |
5. |
FROM <table> |
1. |
WHERE <predicate on rows> |
2. |
GROUP BY <columns> |
3. |
HAVING <predicate on groups> |
4. |
ORDER BY <columns> |
6. |
OFFSET |
7. |
FETCH FIRST |
8. |
Следующий пример SELECT
запрос возвращает список дорогих книг. Запрос извлекает все строки из таблицы Book , в которых столбец цены содержит значение больше 100,00. Результат сортируется в порядке возрастания названия . Звездочка (*) в списке выбора указывает, что все столбцы таблицы Book должны быть включены в набор результатов.
SELECT *
FROM Book
WHERE price > 100.00
ORDER BY title;
В приведенном ниже примере демонстрируется запрос нескольких таблиц, группировка и агрегирование путем возврата списка книг и количества авторов, связанных с каждой книгой.
SELECT Book.title AS Title,
count(*) AS Authors
FROM Book
JOIN Book_author
ON Book.isbn = Book_author.isbn
GROUP BY Book.title;
Пример вывода может выглядеть следующим образом:
Title Authors ---------------------- ------- SQL Examples and Guide 4 The Joy of SQL 1 An Introduction to SQL 2 Pitfalls of SQL 1
При условии, что isbn является единственным общим именем столбца в двух таблицах и что столбец с именем title существует только в таблице Book , можно переписать приведенный выше запрос в следующей форме:
SELECT title,
count(*) AS Authors
FROM Book
NATURAL JOIN Book_author
GROUP BY title;
Однако многие [ количественно ] Поставщики либо не поддерживают этот подход, либо требуют определенных соглашений об именах столбцов для эффективной работы естественных объединений.
SQL включает операторы и функции для вычисления значений хранимых значений. SQL позволяет использовать выражения в списке выбора для проецирования данных, как в следующем примере, который возвращает список книг стоимостью более 100,00 с дополнительным столбцом sales_tax , содержащим сумму налога с продаж, рассчитанную в размере 6% от цены .
SELECT isbn,
title,
price,
price * 0.06 AS sales_tax
FROM Book
WHERE price > 100.00
ORDER BY title;
Подзапросы
[ редактировать ]Запросы могут быть вложенными, чтобы результаты одного запроса можно было использовать в другом запросе с помощью оператора отношения или функции агрегирования. Вложенный запрос также известен как подзапрос . Хотя соединения и другие операции с таблицами во многих случаях обеспечивают превосходные в вычислительном отношении (то есть более быстрые) альтернативы, использование подзапросов вводит иерархию выполнения, которая может быть полезной или необходимой. В следующем примере функция агрегирования AVG
получает на вход результат подзапроса:
SELECT isbn,
title,
price
FROM Book
WHERE price < (SELECT AVG(price) FROM Book)
ORDER BY title;
Подзапрос может использовать значения из внешнего запроса, и в этом случае он называется коррелированным подзапросом .
С 1999 года стандарт SQL позволяет WITH
предложения для подзапросов, т.е. именованные подзапросы, обычно называемые общими табличными выражениями (также называемые факторингом подзапросов ). CTE также могут быть рекурсивными, ссылаясь на себя; Получающийся в результате механизм позволяет обход дерева или графа (когда он представлен в виде отношений) и, в более общем плане, с фиксированной точкой вычисления .
Производная таблица
[ редактировать ]— Производная таблица это использование ссылки на подзапрос SQL в предложении FROM. По сути, производная таблица представляет собой подзапрос, из которого можно выбрать или присоединиться к нему. Функциональность производной таблицы позволяет пользователю ссылаться на подзапрос как на таблицу. Производную таблицу иногда называют встроенным представлением или подвыборкой .
В следующем примере оператор SQL включает соединение исходной таблицы «Книга» с производной таблицей «Продажи». Эта производная таблица собирает связанную информацию о продажах книг с использованием ISBN для присоединения к таблице «Книга». В результате производная таблица предоставляет результирующий набор с дополнительными столбцами (количество проданных товаров и компания, продавшая книги):
SELECT b.isbn, b.title, b.price, sales.items_sold, sales.company_nm
FROM Book b
JOIN (SELECT SUM(Items_Sold) Items_Sold, Company_Nm, ISBN
FROM Book_Sales
GROUP BY Company_Nm, ISBN) sales
ON sales.isbn = b.isbn
Нулевая или трехзначная логика (3VL)
[ редактировать ]Концепция Null позволяет SQL обрабатывать недостающую информацию в реляционной модели. Слово NULL
— это зарезервированное ключевое слово в SQL, используемое для идентификации специального маркера Null. Сравнения с 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
операторы, которые идентифицируют нули друг с другом. [7] Следовательно, эти операции над множествами в SQL могут давать результаты, не представляющие достоверную информацию, в отличие от операций, включающих явные сравнения с NULL (например, в WHERE
пункт, рассмотренный выше). В предложении Кодда 1979 года (которое в основном было принято в SQL92) это семантическое несоответствие объясняется тем, что удаление дубликатов в операциях над множествами происходит «на более низком уровне детализации, чем проверка на равенство при оценке операций поиска». [6] Однако профессор информатики Рон ван дер Мейден пришел к выводу, что «несоответствия в стандарте SQL означают, что невозможно приписать какую-либо интуитивную логическую семантику обработке нулей в SQL». [7]
Кроме того, поскольку операторы SQL возвращают Unknown при прямом сравнении чего-либо с Null, SQL предоставляет два предиката сравнения, специфичных для Null: IS NULL
и IS NOT 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 example
(column1, column2, column3)
VALUES
('test', 'N', NULL);
UPDATE
изменяет набор существующих строк таблицы, например:
UPDATE example
SET column1 = 'updated value'
WHERE column2 = 'N';
DELETE
удаляет существующие строки из таблицы, например:
DELETE FROM example
WHERE column2 = 'N';
MERGE
используется для объединения данных нескольких таблиц. Он сочетает в себеINSERT
иUPDATE
элементы. Он определен в стандарте SQL:2003; до этого некоторые базы данных предоставляли аналогичную функциональность через другой синтаксис, иногда называемый « upsert ».
MERGE INTO table_name USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (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 зависит от реализации.
В следующем примере показана классическая транзакция перевода средств, при которой деньги снимаются с одного счета и добавляются на другой. Если удаление или добавление завершается неудачей, вся транзакция откатывается.
START TRANSACTION;
UPDATE Account SET amount=amount-200 WHERE account_number=1234;
UPDATE Account SET amount=amount+200 WHERE account_number=2345;
IF ERRORS=0 COMMIT;
IF ERRORS<>0 ROLLBACK;
Определение данных
[ редактировать ]Язык определения данных (DDL) управляет структурой таблиц и индексов. Самыми основными элементами DDL являются CREATE
, ALTER
, RENAME
, DROP
и TRUNCATE
заявления:
CREATE
создает объект (например, таблицу) в базе данных, например:
CREATE TABLE example(
column1 INTEGER,
column2 VARCHAR(50),
column3 DATE NOT NULL,
PRIMARY KEY (column1, column2)
);
ALTER
изменяет структуру существующего объекта различными способами, например, добавляя столбец в существующую таблицу или ограничение, например:
ALTER TABLE example ADD column4 INTEGER DEFAULT 25 NOT NULL;
TRUNCATE
очень быстро удаляет все данные из таблицы, удаляя данные внутри таблицы, а не саму таблицу. Обычно подразумевает последующую операцию COMMIT, т.е. ее нельзя откатить (данные не записываются в логи для последующего отката, в отличие от DELETE).
TRUNCATE TABLE example;
DROP
удаляет объект в базе данных, обычно безвозвратно, т.е. его невозможно откатить, например:
DROP TABLE example;
Типы данных
[ редактировать ]Каждый столбец в таблице SQL объявляет тип(ы), которые может содержать этот столбец. ANSI SQL включает следующие типы данных. [14]
- Строки символов и строки национальных символов
CHARACTER(n)
(илиCHAR(n)
символов фиксированной ширины ): строка из n , дополненная пробелами по мере необходимости.CHARACTER VARYING(n)
(илиVARCHAR(n)
): строка переменной ширины с максимальным размером n символов.CHARACTER LARGE OBJECT(n [ K | M | G | T ])
(илиCLOB(n [ K | M | G | T ])
): символ большого объекта с максимальным размером n [ K | М | г | Т ] символыNATIONAL CHARACTER(n)
(илиNCHAR(n)
): строка фиксированной ширины, поддерживающая международный набор символов.NATIONAL CHARACTER VARYING(n)
(илиNVARCHAR(n)
): переменная ширинаNCHAR
нитьNATIONAL CHARACTER LARGE OBJECT(n [ K | M | G | T ])
(илиNCLOB(n [ K | M | G | T ])
): крупный объект национального характера с максимальным размером n [ K | М | г | Т ] символы
Для 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)
(илиVARBINARY(n)
): Двоичная строка переменной длины, максимальная длина n .BINARY LARGE OBJECT(n [ K | M | G | T ])
(илиBLOB(n [ K | M | G | T ])
): большой бинарный объект максимальной длины n [ K | М | г | Т] .
Для BINARY LARGE OBJECT
тип данных, множители K
(1 024), M
(1 048 576), G
(1 073 741 824) и T
(1 099 511 627 776) можно дополнительно использовать при указании длины.
- логическое значение
BOOLEAN
The 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. С .
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
может использоваться для извлечения одного поля (например, секунд) значения даты и времени или интервала. Текущую системную дату/время сервера базы данных можно вызвать с помощью таких функций, как 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;
Примечания
[ редактировать ]- ^ Международный стандарт ANSI/ISO/IEC (IS). Язык базы данных SQL. Часть 2. Основа (SQL/Foundation). 1999.
- ^ «Справочник по Transact-SQL». Справочник по языку SQL Server . Электронная документация по SQL Server 2005. Майкрософт. 15 сентября 2007 г. Проверено 17 июня 2007 г.
- ^
Руководство пользователя по процедурам SAS 9.4 SQL . Институт САС. 2013. с. 248. ИСБН 9781612905686 . Проверено 21 октября 2015 г.
Хотя аргумент UNIQUE идентичен аргументу DISTINCT, он не является стандартом ANSI.
- ^
Леон, Алексис ; Леон, Мэтьюз (1999). «Устранение дубликатов — ВЫБРАТЬ с помощью DISTINCT». SQL: Полный справочник . Нью-Дели: Tata McGraw-Hill Education (опубликовано в 2008 г.). п. 143. ИСБН 9780074637081 . Проверено 21 октября 2015 г.
[...] ключевое слово DISTINCT [...] удаляет дубликаты из набора результатов.
- ^ «Каков порядок выполнения SQL-запроса? - Designsized.com» . www.designcision.com . 29 июня 2015 года . Проверено 4 февраля 2018 г.
- ^ Перейти обратно: а б Ханс-Иоахим, К. (2003). «Нулевые значения в реляционных базах данных и достоверные информационные ответы». Семантика в базах данных. Второй международный семинар в замке Дагштуль, Германия, 7–12 января 2001 г. Пересмотренные статьи . Конспекты лекций по информатике. Том. 2582. стр. 119–138. дои : 10.1007/3-540-36596-6_7 . ISBN 978-3-540-00957-3 .
- ^ Перейти обратно: а б Рон ван дер Мейден, «Логические подходы к неполной информации: обзор» в Хомицки, январь; Сааке, Гюнтер (ред.) Логика для баз данных и информационных систем , Kluwer Academic Publishers ISBN 978-0-7923-8129-7 , с. 344
- ^ ИСО/МЭК. ISO/IEC 9075-2:2003, «SQL/Foundation» . ИСО/МЭК.
- ^ Негри, М.; Пелагатти, Г.; Сбаттелла, Л. (февраль 1989 г.). «Семантика и проблемы количественной оценки универсальности в SQL» . Компьютерный журнал . 32 (1): 90–91. дои : 10.1093/comjnl/32.1.90 . Проверено 16 января 2017 г.
- ^ Фратарканджели, Клаудио (1991). «Техника универсального количественного определения в SQL» . Запись ACM SIGMOD . 20 (3): 16–24. дои : 10.1145/126482.126484 . S2CID 18326990 . Проверено 16 января 2017 г.
- ^ Каваш, Джалал (2004) Сложная количественная оценка на языке структурированных запросов (SQL): учебное пособие по реляционному исчислению ; Журнал компьютеров в преподавании математики и естественных наук ISSN 0731-9258 Том 23, выпуск 2, 2004 г., AACE, Норфолк, Вирджиния. Thefreelibrary.com
- ^ С. Дата (2011). SQL и реляционная теория: как писать точный код SQL . О'Рейли Медиа, Инк. с. 83. ИСБН 978-1-4493-1640-2 .
- ^ ИСО/МЭК 9075-2:2011 §4.5
- ^ «ISO/IEC 9075-1:2016: Информационные технологии. Языки баз данных. SQL. Часть 1. Структура (SQL/Framework)» .