stringtranslate.com

Синтаксис SQL

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

Элементы языка

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

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

Операторы

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

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

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

Концепция 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 );         
Пример ОБНОВЛЕНИЯ SET column1 = 'обновленное значение' WHERE column2 = 'N' ;         
УДАЛИТЬ ИЗ примера ГДЕ столбец2 = 'N' ;      
 ОБЪЕДИНИТЬ В table_name ИСПОЛЬЗОВАНИЕ table_reference ON ( condition ) ЕСЛИ СООТВЕТСТВУЕТ , ТО ОБНОВИТЬ SET column1 = value1 [, column2 = value2 ...] ЕСЛИ НЕ СООТВЕТСТВУЕТ , ТО ВСТАВИТЬ ( column1 [, column2 ...]) ЗНАЧЕНИЯ ( value1 [, value2 ...])                                 

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

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

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завершить текущую транзакцию и снять блокировки данных. При отсутствии START TRANSACTIONили аналогичного оператора семантика SQL зависит от реализации. Следующий пример показывает классическую транзакцию перевода средств, где деньги снимаются с одного счета и добавляются на другой. Если удаление или добавление не удается, вся транзакция откатывается.

НАЧАТЬ ТРАНЗАКЦИЮ ; ОБНОВИТЬ УСТАНОВКУ Счета сумма = сумма - 200 ГДЕ account_number = 1234 ; ОБНОВИТЬ УСТАНОВКУ Счета сумма = сумма + 200 ГДЕ account_number = 2345 ;             ЕСЛИ ОШИБКИ = 0, ЗАФИКСИРОВАТЬ ; ЕСЛИ ОШИБКИ <> 0, ОТКАТИТЬ ;    

Определение данных

Язык определения данных (DDL) управляет структурой таблиц и индексов. Самыми основными элементами DDL являются операторы CREATE, ALTER, RENAME, DROPи TRUNCATE:

Пример CREATE TABLE ( столбец1 INTEGER , столбец2 VARCHAR ( 50 ), столбец3 DATE NOT NULL , PRIMARY KEY ( столбец1 , столбец2 ) );              
Пример ALTER TABLE ADD column4 INTEGER DEFAULT 25 NOT NULL ;         
Пример TRUNCATE TABLE ;  
Пример удаления таблицы ;  

Типы данных

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

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

Для типов данных 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 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может использоваться для извлечения одного поля (например, секунд) из значения datetime или interval. Текущая системная дата/время сервера базы данных может быть вызвана с помощью таких функций, как 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 example TO some_user , another_user ;       REVOKE SELECT , UPDATE ON example FROM some_user , another_user ;       

Примечания

Ссылки

  1. ^ Международный стандарт ANSI/ISO/IEC (IS). Язык баз данных SQL — Часть 2: Основы (SQL/Основы). 1999.
  2. ^ "Transact-SQL Reference". Справочник по языку SQL Server. Электронная литература по SQL Server 2005. Microsoft. 2007-09-15 . Получено 2007-06-17 .
  3. ^ Руководство пользователя процедуры SQL SAS 9.4. Институт SAS. 2013. стр. 248. ISBN 9781612905686. Получено 21.10.2015 . Хотя аргумент UNIQUE идентичен DISTINCT, он не является стандартом ANSI.
  4. ^ Леон, Алексис ; Леон, Мэтьюз (1999). "Устранение дубликатов - SELECT с использованием DISTINCT". SQL: Полный справочник. Нью-Дели: Tata McGraw-Hill Education (опубликовано в 2008 г.). стр. 143. ISBN 9780074637081. Получено 21.10.2015 . [...] ключевое слово DISTINCT [...] исключает дубликаты из набора результатов.
  5. ^ «Каков порядок выполнения SQL-запроса? - Designcise.com». www.designcise.com . 29 июня 2015 г. Получено 04.02.2018 .
  6. ^ ab Hans-Joachim, K. (2003). "Null Values ​​in Relational Databases and Sure Information Answers". Семантика в базах данных. Второй международный семинар в замке Дагштуль, Германия, 7–12 января 2001 г. Пересмотренные статьи. Lecture Notes in Computer Science. Том 2582. С. 119–138. doi :10.1007/3-540-36596-6_7. ISBN 978-3-540-00957-3.
  7. ^ ab Рон ван дер Мейден, «Логические подходы к неполной информации: обзор» в Chomicki, Jan; Saake, Gunter (ред.) Logics for Databases and Information Systems, Kluwer Academic Publishers ISBN 978-0-7923-8129-7 , стр. 344 
  8. ^ ИСО/МЭК. ИСО/МЭК 9075-2:2003, «SQL/Основы» . ИСО/МЭК.
  9. ^ Negri, M.; Pelagatti, G.; Sbattella, L. (февраль 1989). «Семантика и проблемы универсальной квантификации в SQL». The Computer Journal . 32 (1): 90–91. doi : 10.1093/comjnl/32.1.90 . Получено 16.01.2017 .
  10. ^ Fratarcangeli, Claudio (1991). «Метод универсальной квантификации в SQL». ACM SIGMOD Record . 20 (3): 16–24. doi :10.1145/126482.126484. S2CID  18326990. Получено 16.01.2017 .
  11. ^ Каваш, Джалал (2004) Комплексная квантификация в языке структурированных запросов (SQL): учебник с использованием реляционного исчисления; Журнал «Компьютеры в преподавании математики и естественных наук» ISSN  0731-9258 Том 23, Выпуск 2, 2004 AACE Норфолк, Вирджиния. Thefreelibrary.com
  12. ^ C. Date (2011). SQL и реляционная теория: как писать точный код SQL. O'Reilly Media, Inc. стр. 83. ISBN 978-1-4493-1640-2.
  13. ^ ИСО/МЭК 9075-2:2011 §4.5
  14. ^ "ISO/IEC 9075-1:2016: Информационные технологии — Языки баз данных — SQL — Часть 1: Фреймворк (SQL/Framework)".

Внешние ссылки