stringtranslate.com

Синтаксис SQL

Синтаксис языка программирования SQL определяется и поддерживается ISO/IEC SC 32 как часть ISO/IEC 9075 . Этот стандарт не находится в свободном доступе. Несмотря на существование стандарта, код SQL не полностью переносим между различными системами баз данных без корректировок.

Языковые элементы

Диаграмма, показывающая несколько элементов языка SQL, составляющих один оператор. Это добавляет единицу к населению США в таблице стран.

Язык SQL подразделяется на несколько языковых элементов, в том числе:

Операторы

Иногда предлагались или реализовывались другие операторы, такие как оператор горизонта (для поиска только тех строк, которые не «хуже», чем любые другие).

В 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 с необязательными ключевыми словами и предложениями, в том числе:

Предложения запроса имеют определенный порядок выполнения [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 продажи .исбн = б . исбн                        

Нулевая или трехзначная логика (3VL)

Концепция 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 );         
Пример ОБНОВЛЕНИЯ SET columns1 = 'обновленное значение' WHERE columns2 = 'N' ;         
УДАЛИТЬ ИЗ примера WHERE columns2 = 'N' ;      
 MERGE INTO имя_таблицы С ИСПОЛЬЗОВАНИЕМ table_reference ON ( условие ) ЕСЛИ СООТВЕТСТВИЕ ТОГДА ОБНОВЛЕНИЕ SET столбец1 = значение1 [, столбец2 = значение2 ...] КОГДА НЕ СООТВЕТСТВУЕТ ТОГДА ВСТАВКА ( столбец1 [, столбец2 ...]) ЗНАЧЕНИЯ ( значение1 [, значение2 ...] ])                                 

Контроль транзакций

Транзакции, если они доступны, оборачивают операции DML:

СОЗДАТЬ ТАБЛИЦУ 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завершить текущую транзакцию и снять блокировки данных. При отсутствии такого 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и :DROPTRUNCATE

Пример CREATE TABLE ( столбец1 INTEGER , столбец2 VARCHAR ( 50 ), столбец3 DATE NOT NULL , ПЕРВИЧНЫЙ КЛЮЧ ( столбец1 , столбец2 ) );              
Пример ALTER TABLE ADD columns4 INTEGER DEFAULT 25 NOT NULL ;         
Пример TRUNCATE TABLE ;  
Пример DROP TABLE ;  

Типы данных

Каждый столбец в таблице SQL объявляет тип(ы), которые может содержать этот столбец. ANSI SQL включает следующие типы данных. [14]

Строки символов и строки национальных символов

Для типов данных 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 LARGE OBJECTмножители K(1 024), M(1 048 576), G(1 073 741 824) и (1 099 511 627 776).T

логическое значение

Тип BOOLEANданных может хранить значения TRUEи FALSE.

Числовой

Например, число 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.))

Временной (дата и время)

Функцию SQL EXTRACTможно использовать для извлечения одного поля (например, секунд) значения даты и времени или интервала. Текущую системную дату/время сервера базы данных можно вызвать с помощью таких функций CURRENT_DATE, как CURRENT_TIMESTAMP, LOCALTIME, или LOCALTIMESTAMP. (Популярные функции, специфичные для поставщиков: TO_DATE, TO_TIME, TO_TIMESTAMP, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, DAYOFYEAR, DAYOFMONTHи DAYOFWEEK.)

Интервал (дата-время)

Контроль данных

Язык управления данными (DCL) разрешает пользователям получать доступ к данным и манипулировать ими. Два его основных утверждения таковы:

Пример:

GRANT SELECT , UPDATE ON пример TO some_user , other_user ;       REVOKE SELECT , UPDATE ON пример FROM some_user , other_user ;       

Примечания

  1. ^ Международный стандарт ANSI/ISO/IEC (IS). Язык базы данных SQL. Часть 2. Основа (SQL/Foundation). 1999.
  2. ^ «Справочник по Transact-SQL». Справочник по языку SQL Server. Электронная документация по SQL Server 2005. Майкрософт. 15 сентября 2007 г. Проверено 17 июня 2007 г.
  3. ^ Руководство пользователя по процедурам SQL SAS 9.4. Институт САС. 2013. с. 248. ИСБН 9781612905686. Проверено 21 октября 2015 г. Хотя аргумент UNIQUE идентичен аргументу DISTINCT, он не является стандартом ANSI.
  4. ^ Леон, Алексис ; Леон, Мэтьюз (1999). «Устранение дубликатов — ВЫБРАТЬ с помощью DISTINCT». SQL: полный справочник. Нью-Дели: Tata McGraw-Hill Education (опубликовано в 2008 г.). п. 143. ИСБН 9780074637081. Проверено 21 октября 2015 г. [...] ключевое слово DISTINCT [...] удаляет дубликаты из набора результатов.
  5. ^ «Каков порядок выполнения SQL-запроса? - Designsized.com» . www.designcision.com . 29 июня 2015 года . Проверено 4 февраля 2018 г.
  6. ^ аб Ханс-Иоахим, К. (2003). «Нулевые значения в реляционных базах данных и достоверные информационные ответы». Семантика в базах данных. Второй международный семинар в замке Дагштуль, Германия, 7–12 января 2001 г. Пересмотренные статьи. Конспекты лекций по информатике. Том. 2582. стр. 119–138. дои : 10.1007/3-540-36596-6_7. ISBN 978-3-540-00957-3.
  7. ^ Аб Рон ван дер Мейден, «Логические подходы к неполной информации: обзор» в Хомицки, январь; Сааке, Гюнтер (ред.) Логика для баз данных и информационных систем, ISBN Kluwer Academic Publishers 978-0-7923-8129-7 , стр. 344 
  8. ^ ИСО/МЭК. ISO/IEC 9075-2:2003, «SQL/Foundation» . ИСО/МЭК.
  9. ^ Негри, М.; Пелагатти, Г.; Сбаттелла, Л. (февраль 1989 г.). «Семантика и проблемы количественной оценки универсальности в SQL». Компьютерный журнал . 32 (1): 90–91. дои : 10.1093/comjnl/32.1.90 . Проверено 16 января 2017 г.
  10. ^ Фратарканджели, Клаудио (1991). «Методика универсальной количественной оценки в SQL». Запись ACM SIGMOD . 20 (3): 16–24. дои : 10.1145/126482.126484. S2CID  18326990 . Проверено 16 января 2017 г.
  11. ^ Каваш, Джалал (2004) Комплексная количественная оценка на языке структурированных запросов (SQL): учебное пособие по реляционному исчислению; Журнал «Компьютеры в преподавании математики и естественных наук ISSN  0731-9258», том 23, выпуск 2, 2004 г., AACE, Норфолк, Вирджиния. Thefreelibrary.com
  12. ^ C. Дата (2011). SQL и реляционная теория: как писать точный код SQL. О'Рейли Медиа, Инк. с. 83. ИСБН 978-1-4493-1640-2.
  13. ^ ИСО/МЭК 9075-2:2011 §4.5
  14. ^ «ISO/IEC 9075-1:2016: Информационные технологии. Языки баз данных. SQL. Часть 1. Структура (SQL/Framework)».