(SQL) SQL (2000 год)

Эта страничка посвящена общему синтаксису SQL-операторов.


На изготовление нижеследующих диаграмм синтаксиса SQL-операторов меня подвинула полнейшая бестолковость литературы об SQL-сервере и бестолковость даже Books Online (в котором даже не выделены толком четыре основополагающих конструкции SQL-языка).









Как вы видите, для манипулирования данными в реляционных базах используется в основном всего четыре оператора SQL. Причина такой простоты такая - ПОРЯДОК ЗАПИСЕЙ В РЕЛЯЦИОННОЙ БАЗЕ НЕ ИМЕЕТ ЗНАЧЕНИЯ. Если вам где-то нужен порядок записей - значит вы просто неправильно построили базу!

Помимо этих четырех команд отборов и манипулирования реляционными множествами, SQL сервер имеет довольно приличное команд других типов:

Сводную таблицу всех команд посмотреть можно в BOL (к сожалению в явном виде там они не выделены), или например здесь. На приведенных выше рисунках конструкция OPTIONS опущена - ибо она одинакова, как правило там указывается режимы для оптимизации и блокировок.

Однако в этих, четырех основных операторах SQL, участвует множество понятий, без понимания которых SQL-оператор не составить никогда, например SEARCH_CONDITION, JOINED_TABLE, DerivedTable - результат вложенных SUBQUERY, транзакции, обычные и замещающие триггеры, троичная SQL-логика и т.д. Конечно, все это рассмотреть подробно просто невозможно, но все же дальше будет показан порядок составления Expression (т.е. выражений), из которых строятся SEARCH_CONDITION - условия отбора нужного документа, а также то самое итоговое скалярное выражение, которое будет вписано в нужное поле отобранного документа...

Кроме того, каждый из операторов имеет множество различных форм. Для примера рассмотрим INSERT, который кажется самым простым на приведенных выше рисунках:

Кроме того, вставка записей часто выполняется и другими способами:

Как видите, даже для простейшего оператора вставки данных - такое огромное количество вариантов использования. В этом и заключается невероятная гибкость языка SQL.


Очень интересная штука - сам по себе компилятор SQL. Этот так называемый COST-BASED компилятор, те компилятор, который не просто компилирует запрос в специальные внутренние инструкции SQL-сервера, а ПЕРЕБИРАЕТ ВАРИАНТЫ ПЛАНОВ ЗАПРОСОВ до тех пор, пока не найдет наиболее быстрый способ исполнить ваш запрос. Итоговый сформированный план запроса можно посмотреть по команде SET SHOWPLAN ON, которая распространяется на следующую за ней команду. В этом деле есть много хитростей. Например, часто этот компилятор чрезмерно мудрит и простой динамический запрос работает быстрее сложного. Особенно замедляют отборы сложные ORDER, для которых таблицы могут копироватся в TempDB и там пересортировыватся.


Важнейшая особенность языка SQL - и отличие от других языков программирования - в SQL данные бывают трех разновидностей. В других языках бывают другие виды данных, например, массивы, стеки, структуры и пр. - но в SQL все по-другому. Слева указаны три вида данных в SQL, а справа указаны конструкции языка, создающие и менящие данные этой разновидности:

  • DECLARE TABLE
  • используется везде вместо имени таблицы как обновляемое представление
  • + 30 функции типа Table (из них девять документированных)

Конечно, наполнение этих переменных может быть весьма разное, а иногда и очень специфическое. Например, в переменную типа Varbin(16) - 16-ти байтовое число - часто присваивается GUID, число типа {F74B8089-254C-403C-9C25-C65649DFC9F7}, возвращаемое функцией NewID(). Другое часто используемое значение, для переменной этого типа - значение возвращаемое функцией TEXTPTR. Без этого значения не работают три важные функции READTEXT, UPDATETEXT, WRITETEXT. Значение этой функции устанавливается обычно так: select @ptr=TEXTPTR(MyColumn) from MyTable. Иногда некоторые переменные не сохраняют свое значение и теряют смысл по завершении каждой транзакции, как например переменная @Handler типа INT в такой проге.

В микрософтовском SQL помимо 30-х табличных, 164-х скалярных функций, 6-ти RowSet-функций существует еще 14 агрегатных функций, которые вызываются по всему набору строк сразу, 926 встроенных процедур и 174 расширенных процедуры упакованные в семь библиотек. Плюс множество самодельных расширений - типа вот этого моего. Часть функций вызывается без скобок, так что сразу даже тяжело понять что это именно функции, а не просто ключевые слова. Самое интересное, что в огромном перечне ключевых слов, поставляемом с документацией, указана лишь малая их часть. Дополнительные ключевые слова выплывают совершенно неожиданно во многих местах - например 20 ключевых слов иформационной схемы. Существует также немало спецсимволов, наделенных особым смыслом. Не желая повторятся, я даю здесь ссылку на отличный учебник по SQL для начинающих.

Конечно, чтобы во всем этом ориентироватся - нужен многолетний опыт. Но все же начать надо с составления простейших скалярных выражений. Ну типа x=1+1. Без этого никак не получится составить тот самый один из четырех SQL-операторов, которыми можно манипулировать данными. А чтобы составить такое скалярное выражение (т.е. Expression на схемах выше) надо понять, что эти самые Expression состоят из операторов и операндов, т.е. что делаем и над чем - соответственно. Операнды в SQL могут быть шести типов, а операторы семи типов.

Как видите язык SQL - штука преинтереснейшая и к тому же чрезвычайно полезная. К сожалению, очень сильно отличается от платформы к платформе. При переходе, скажем из MS SQL на MySQL сохраняются только самые общие подходы. Все, начиная от обычных рабочих функций, правил построение выражений, коннекта к базе, физического расположения базы в файловой системе, ее обслуживания и т.д. изменяется до неузнаваемости...




Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20>  <21>  <22>  <23
Link to this page: //www.vb-net.com/sql/syntax.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <CHAT ME>  <ABOUT ME>  < THANKS ME>