Введение в MS SQL Server и T-SQL

Реляционное исчисление на доменах

Реляционное исчисление на кортежах

Выражение в реляционном исчислении на кортежах имеют вид:

{S | F(S)} , где S – переменная-кортеж, F -формула.

Пример: все продавцы, получающие зарплату больше 10000

{S | Продавцы(S) & S.Зарплата>10000}

Формулы могут строиться с помощью логических операций конъюнкции, дизъюнкции, отрицания и операций сравнения. Используются кванторы существования и всеобщности, например:

Выбрать все сделки Иванова:

{S | Сделки(S) & (B)(Продавцы(B) & B.N = S.N_Продавца & B.Имя=’Иванов’)}

Выражение имеет вид: {d1, d2,…,dn | F(d1,d2,…, dm)}; m>=n , где d1…dm переменные области определения (домена). F – формула, которая может быть отношением или выражением сравнения.

Пример: Найти номера и имена всех продавцов, зарплата которых > 10000.

{N, Имя | (Город, Отдел, N_Начальника)(Продавцы(N, Имя, Отдел, Город, Зарплата, N_Начальника)& (Зарплата>10000))}

Д/З 5. Для примера реляционной БД из Д/З 4 приведите примеры всех операций, запишите запрос в формах реляционного исчисления на кортежах и на доменах.

Вопросы для самопроверки:

1. Что из трех математических основ требует процедурного программирования (то есть программирования с поэтапным получением результата), а что – декларативного (то есть описания желаемого результата)?

Язык SQL (Structure Query Language – язык структурированных запросов) представляет собой декларативный язык для работы с реляционными БД, основанный на реляционном исчислении на кортежах. Декларативность языка заключается в том, что, в отличие от императивных языков (например, С++), программист не пишет последовательность действий для получения нужного ему результата, а описывает желаемый результат. СУБД сама подбирает алгоритм нахождения результата по его описанию.

Язык SQL состоит из трех подъязыков, которые описаны в Табл. 8:

Табл. 8. Подъязыки языка SQL

Операторы определения и управления данными просты, часто они скрыты от разработчика, если он пользуется мастерами при создании БД. Их рассмотрение выходит за пределы данной книги. Все богатство языка SQL заключено в операторе Select, который используется со вспомогательными операторами, приведенными в Табл. 9.

Табл. 9. Вспомогательные операторы для Select

Группа операторов Описание операторов
Тип выборки All – выбрать все записи Distinct – выбрать записи, удалив повторы
Селекция, сортировка и группировка order by – сортировка по возрастанию или убыванию, Where – селекция записей, group by - группировка, having – селекция групп, join…on – различные виды соединений таблиц
Операторы сравнения и логические операторы =, <>, >, <, >=, <= - операторы сравнения, Or, Аnd, Not – логические И, ИЛИ, отрицание, is null – проверка на (не)пустое значение in, between, like, starting,containing – операторы примерного совпадения полей строковых типов.
Агрегирующие операторы Count – подсчет количества строк, Sum – сумма, Avg – среднее значение, Min – минимальное значение, Max – максимальное значение.
Кванторы Any – какой-нибудь, All – все, Singular – единственный, Exists – существует.
Операции над множествами Union – объединение, Intersect – пересечение, Except – разность.

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

Введение в SQL

Первые языки запросов для реляционных баз данных пояились в 70-е годы. В то время существовало несколько различных языков запросов, что порождало определенные неудобства у производителей СУЬД. Непосредственным предшественником языка SQL явился язык SEQUEL.

Стандарт языка SQL постоянно расширяется, поэтому к настоящему времени имеется несколько официально утвержденных вариантов:

1. SQL-89, первый неполный вариант, практика быстро показала, что он нуждается в расширении.

2. SQL-92 (или SQL-2), значительно расширенная версия, многие СУБД в настоящее время гарантируют полную поддержку SQL-2 и частичную – более поздних стандартов.

3. SQL-99, введены еще некоторые расширения.

4. SQL-2003, самый полный вариант стандарта, в котором учтены многие решения, уже реализованные разработчиками СУБД и ставшие стандартом de-facto (например, стандартизирован объект sequence, который давно используется в некоторых СУБД, например, Oracle, стандартизированы почти все встроенные типы данных, используемые в различных СУБД).

Стардарт SQL-2003 содержит довольно много команд, которые охратывают различные аспекты функционирования ИС и разделены на 7 классов команд. Тем не менее, основу языка SQL составляют два класса команд, которые принято называть языками: язык определения данных и язык манипулирования данными. В оригинале - DDL (data definition language) и DML (data manipulation language).

В данном учебном модуле рассмотрим только эти два класса (DDL и DML). Остальные классы, которые в стандарте SQL-92 объединены общим названием «язык управления доступом» (data control language – DCL), будут частично рассмотрены в следующем учебном модуле.

При изложении материала будем ориентироваться на стандарт SQL 2003, однако следует иметь в виду, что те команды, которые нам предстоит изучить, практически не изменились со времен SQL-92.

Производители СУБД, в целом поддерживая стандарт SQL, тем не менее, иногда допускают незначительные изменения синтаксиса в отдельных командах. Практически все СУБД содержат те или иные расширения языка SQL. Поэтому изучать язык SQL, не привязываясь ни к какой конкретной СУБД, можно только чисто теоретически. Поскольку целью данного модуля является получение компетенций (т.е. умения применить полученные знания на практике), необходимо остановиться на какой-либо конкретной СУБД, которая будет использоваться для отладки демонстрационных примеров и практических заданий модуля.

В качестве такой СУБД была выбрана самая распространенная на мировом рынке Oracle. В диалекте SQL для СУБД Oracle отклонения от стандарта минимальны. Приведенные в главе примеры отлаживались с использованием клиентской консольной утилиты SQL *Plus на сервере Oracle 10g.

Везде в описании команд, где имеется хотя бы небольшое отклонение синтаксиса Oracle от стандарта SQL 2003, это будет отдельно оговариваться. Учитывая широкое распространение таких СУБД как Microsoft SQL Server, MySQL и ряда других, иногда будут оговариваться особенности и этих СУБД.

Формат записи операторов SQL свободный. Везде, где имеется пробел или знак препинания, может быть вставлено любое число пробелов или переходов на новую строку. При работе в консольной утилите SQL *Plus используется символ; (точка с запятой) как признак окончания запроса – текст запроса, завершенный точкой с запятой, немедленно отсылается на сервер для выполнения. Однако точка с запятой не является частью команды SQL, поэтому в приводимых в лекциях примерах она будет отсутствовать.

При описании языка мы сочли возможным не приводить полный синтаксис каждой команды в формальной форме (формы Бэкуса-Наура или синтаксические диаграммы), учитывая лаконичность и относительную простоту синтаксиса, а также наличие отклонений от стандарта в диалектах языка и изменчивость самого стандарта и диалектов. Синтаксис команд описывается неформально, с пропуском некоторых незначительных, с нашей точки зрения, конструкций, но достаточно строго:

· все ключевые слова языка записываются прописными буквами, а имена, формируемые пользователями, - строчными, хотя, с точки зрения лексики языка SQL, различия в регистре символов несущественны;

· все необязательные элементы команды заключаются в квадратные скобки;

· в тех случаях, где пробел может трактоваться неоднозначно, он заменяется знаком подчеркивания;

· при пропуске части команды используется многоточие.

Возможные недостатки неформального подхода к описанию компенсируются большим количеством примеров и дополнительными словесными комментариями.

Некоторые локализованные версии СУБД допускают использование в именах, формируемых пользователями, символов национальных алфавитов, но рекомендуем применять эту возможность с чрезвычайной осторожностью. Ключевые символы языка не могут использоваться в качестве имен (таблиц, столбцов, представлений и т.д.) – большая часть подобных ошибок выявляется при компиляции, но в редких случаях ошибки могут быть непредсказуемыми, особенно в части применения символов национальных алфавитов.

SQL (Structured Query Language) - это сокращенное название структурированного языка запросов, предоставляющего средства создания и обработки данных в реляционных БД. Независимость от специфики компьютерных технологий, а также поддержка SQL лидерами промышленности в области технологии реляционных баз данных сделали его основным стандартным языком БД.

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

Появление теории реляционных БД дало толчок к разработке ряда языков запросов, которые можно отнести к двум классам:

алгебраические языки, позволяющие выражать запросы средствами специализированных операторов, применяемых к отношениям;

языки исчисления предикатов, представляющие собой набор правил для записи выражения, определяющего новое отношение из заданной совокупности существующих отношений. Следовательно, исчисление предикатов есть метод определения того отношения, которое желательно получить, как ответ на запрос из отношений, уже имеющихся в БД.

В 1987 году SQL стал стандартом языков для профессиональных реляционных СУБД и начал внедряться во все распространенные системы. Это связано с рядом следующих моментов. Постоянный рост быстродействия, а также снижение энергопотребления, размеров и стоимости компьютеров привели к резкому расширению возможных рынков их сбыта, круга пользователей, разнообразия типов и цен. Естественно, что расширился спрос на разнообразное программное обеспечение. В борьбе за покупателя фирмы, производящие программное обеспечение, стали выпускать на рынок все более интеллектуальные, а значит, объемные программные комплексы. Приобретая их. многие организации и отдельные пользователи часто не могли разместить их на собственных ЭВМ. Для обмена информацией и ее распространения были созданы сети ЭВМ, где обобщающие программы и данные стали размещать на специальных файловых серверах.


СУБД, работающие с файловыми серверами, позволяют множеству пользователей разных ЭВМ, расположенных достаточно далеко друг от друга, получать доступ к одним и тем же БД. При этом упрощается разработка различных автоматизированных систем управления организациями, учебных комплексов, информационных и других систем, где множество сотрудников или учащихся должны использовать общие данные и обмениваться создаваемой в процессе работы информацией. Однако при таком подходе вся обработка запросов из программ или с терминалов пользовательских ЭВМ на них и выполняется, поэтому для реализации даже простого запроса необходимо считывать из файлового сервера или записывать на сервер целые файлы, а это ведет к конфликтным ситуациям и перегрузке сети, Для исключения указанных недостатков была предложена технология клиент/сервер, однако при этом нужен единый язык общения с сервером - и в его качестве был выбран SQL.

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

предложения определения данных - определение БД, а также определение и уничтожение таблиц и индексов;

запросы на выбор данных - предложение SELECT;

предложения модификации данных - добавление, удаление и изменение данных;

предложения управления данными - предоставление и отмена привилегий на доступ к данным, управление транзакциями и другие.

Кроме того. SQL предоставляет возможность выполнять в этих предложениях:

Арифметические вычисления, включая разнообразные функциональные преобразования, обработку текстовых строк и выполнение операции сравнения значений арифметических выражений и текстов;

Упорядочение строк или столбцов при выводе содержимого таблиц на печать или экран дисплея;

Создание представлений, позволяющих пользователям интерпретировать данные без увеличения их объема в БД;

Сохранение выводимого по запросу содержимого таблицы, нескольких таблиц или представления в другой таблице;

Группирование данных и применение к этим группам таких операций, как среднее, сумма, максимум, минимум, число элементов и т.п.

Стандарт SQL определяется ANSI (американским национальным институтом стандартов) и в данное время также принимается isq (международной организацией по стандартизации). Однако большинство коммерческих программ БД расширяют SQL без уведомления ANSI, добавляя различные другие особенности в этот язык которые, как они считают, будут весьма полезны. Иногда это несколько нарушает стандарт языка, хотя хорошие идеи имеют тенденцию развиваться и вскоре становятся стандартами.

Язык SQL является основой многих СУБД, т.к. он отвечает за физическое структурирование и запись данных на диск, а также за физическое чтение данных с диска и позволяет принимать SQL-запросы от других компонентов СУБД и пользовательских приложений. Таким образом, SQL является мощным инструментом, который обеспечивает пользователям, программам и вычислительным системам доступ к информации, содержащейся в реляционных БД.

Основные достоинства языка SQL заключается в следующем:

Стандартность языка SQL - как уже было сказано, его использование в программах стандартизировано международными организациями;

Независимость от конкретных СУБД - все распространенные СУБД используют SQL, т.к. реляционную БД и программы, которые с ней работают, можно перенести с одной СУБД на другую с минимальными доработками;

Возможность переноса с одной вычислительной системы я другую - СУБД может быть ориентирована на различны, вычислительные системы, однако приложения, созданные с помощью SQL, допускают использование как для локальных БД так и для крупных многопользовательских систем;

Реляционная основа языка - SQL является языком реляционных БД, поэтому он стал популярным тогда- когда популярной стала реляционная модель представления данных. Табличная структура реляционной БД хорошо понятна, поэтому язык SQL является простым и легким для изучения;

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

Обеспечение различного представления данных - с помощью SQL можно предусмотреть такую структуру данных, что тот или иной пользователь будет видеть различные представления данных. Кроме того, данные из разных частей БД могут быть скомбинированы и представлены пользователю в виде одной простой таблицы, а значит, представления можно использовать для усиления защиты БД и ее настройки под конкретные требования отдельных пользователей;

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

Поддержка архитектуры клиент/сервер - SQL одно из лучших средств для реализации приложений на платформе клиент/сервер. При этом SQL служит связующим звеном между клиентской системой, взаимодействующей с пользователем, и серверной системой, управляющей БД, позволяя каждой из них сосредоточиться на выполнении своих прямых функций

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

В SQL определены два подмножества языка:

· SQL-DDL (Data Definition Language) - язык определения структур и ограничений целостности баз данных. Сюда относятся команды создания и удаления баз данных; создания, изменения и удаления таблиц; управления пользователями и т.д.

· SQL-DML (Data Manipulation Language) - язык манипулирования данными: добавление, изменение, удаление и извлечение данных, управления транзакциями

Здесь не дается строгое описание всех возможностей SQL-92. Во-первых, ни одна СУБД не поддерживает их в полной мере, а во-вторых, производители СУБД часто предлагают собственные расширения SQL, несовместимые друг с другом. Поэтому мы рассматриваем некое подмножество языка, которое дает общее представление о его специфике и возможностях. В то же время, этого подмножества достаточно, чтобы начать самостоятельную работу с любой СУБД. Более формальный (и более полный) обзор стандартов SQL сделан в статье С. Д. Кузнецова "Стандарты языка реляционных баз данных SQL: краткий обзор",журнал СУБД N 2, 1996 г. Ознакомится с русским переводом стандарта SQL можно на сервере Центра информационных технологий, сравнительное описание различных версий языка (для СУБД Sybase SQL Server, Sybase SQL Anywhere, Microsoft SQL Server, Informix, Oracle Server) приводится в книге Дж.Боуман, С.Эмерсон, М.Дарновски "Практическое руководство по SQL", Киев, Диалектика, 1997.

Следует также отметить, что в отличие от "теретической" терминологии, используемой при описании реляционной модели (отношение, атрибут, кортеж ), в литературе при описании SQL часто используется терминология "практическая" (соответственно - таблица, столбец, строка ). Здесь мы следуем этой традиции.

Все примеры построены применительно к базе данных publications , содержащей сведения о публикациях (как печатных, так и электронных), относящихся к теме данного курса. Структуру этой базы данных можно посмотреть здесь, ее проектирование описано в разделе 5.4, доступ к ней для практических занятий можно получить через Internet посредством СУБД Leap (реляционная алгебра) или СУБД PostgreSQL. (язык SQL).

структурированный язык запросов. Этот язык дает возможность создавать, редактировать и удалять информацию, хранящуюся в базах данных , создавать новые базы данных и многое другое. SQL является стандартом ANSI (Американский национальный институт стандартов) и ISO (Международная организация по стандартизации).

Немного истории

Первый международный стандарт языка SQL был принят в 1989 г., его часто называют SQL/89 . Среди недостатков этого стандарта выделяют в первую очередь то, что многие важные свойства он устанавливал как определяемые в реализации. Отсюда произошло множество расхождений в реализациях языка разными производителями. Кроме того, высказывались претензии по поводу отсутствия в этом стандарте упоминаний о практических аспектах языка, таких как его встраивание в язык программирования Си.

Следующий международный стандарт языка SQL был принят в конце 1992 г. И стал называться SQL/92 . Он получился гораздо более точным и полным, чем SQL/89 , хотя и не был лишен недостатков. В настоящее время большинство систем почти полностью реализуют этот стандарт. Однако, как известно, прогресс не остановишь, и в 1999 году появился новый стандарт SQL :1999, также известный как SQL3 . SQL3 характеризуется как "объектно-ориентированный SQL " и является основой нескольких объектно-реляционных систем управления базами данных (например, ORACLE8 компании Oracle , Universal Server компании Informix и DB2 Universal Database компании IBM ). Этот стандарт является не просто слиянием SQL-92 и объектной технологии. Он содержит ряд расширений традиционного SQL , а сам документ составлен таким образом, чтобы добиться более эффективной работы в области стандартизации в будущем.

Если говорить о MySQL , то она соответствует начальному уровню SQL92, содержит несколько расширений этого стандарта и стремится к полной поддержке стандарта ANSI SQL99, но без ущерба для скорости и качества кода.

Основные операторы языка SQL

Функции любой СУБД включают:

  1. создание, удаление, изменение базы данных (БД);
  2. добавление, изменение, удаление, назначение прав пользователя;
  3. внесение, удаление и изменение данных в БД (таблиц и записей);
  4. выборку данных из БД.

К первым двум функциям имеют доступ только администраторы СУБД или привилегированные пользователи. Рассмотрим, как решаются последние две задачи (на самом деле это семь задач).

Прежде чем что-либо делать с данными, нужно создать таблицы, в которых эти данные будут храниться, научиться изменять структуру этих таблиц и удалять их, если потребуется. Для этого в языке SQL существуют операторы CREATE TABLE , ALTER TABLE и DROP TABLE .

Оператор CREATE TABLE

Оператор CREATE TABLE создает таблицу с заданным именем в текущей базе данных . Правила для допустимых имен таблицы приведены в документации. Если нет активной текущей базы данных или указанная таблица уже существует, то возникает ошибка выполнения команды.

В версии MySQL 3.22 и более поздних имя таблицы может быть указано как имя_базы_данных.имя_таблицы . Эта форма записи работает независимо от того, является ли указанная база данных текущей.

В версии MySQL 3.23 при создании таблицы можно использовать ключевое слово TEMPORARY . Временная таблица автоматически удаляется по завершении соединения, а ее имя действительно только в течение данного соединения. Это означает, что в двух разных соединениях могут использоваться временные таблицы с одинаковыми именами без конфликта друг с другом или с существующей таблицей с тем же именем (существующая таблица скрыта, пока не удалена временная таблица). В версии MySQL 4.0.2 для создания временных таблиц необходимо иметь привилегии CREATE TEMPORARY TABLES .

В версии MySQL 3.23 и более поздних можно использовать ключевые слова IF NOT EXISTS для того, чтобы не возникала ошибка, если указанная таблица уже существует. Следует учитывать, что при этом идентичность структур этих таблиц не проверяется.

Каждая таблица представлена набором определенных файлов в директории базы данных .

Синтаксис

CREATE TABLE имя_таблицы [(определение_столбца,...)] [опции_таблицы]

В выражении определение_столбца перечисляют, какие столбцы должны быть созданы в таблице. Каждый столбец таблицы может быть пустым (NULL ), иметь значение по умолчанию, являться ключом или автоинкрементом. Кроме того, для каждого столбца обязательно указывается тип данных, которые будут в нем храниться. Если не указывается ни NULL , ни NOT NULL , то столбец интерпретируется так, как будто указано NULL . Если поле помечают как автоинкремент (AUTO_INCREMENT ), то его значение автоматически увеличивается на единицу каждый раз, когда происходит добавление данных в таблицу и в это поле записывается пустое значение (NULL , т.е. ничего не записывается) или 0 . Автоинкремент в таблице может быть только один, и при этом он обязательно должен быть проиндексирован. Последовательность AUTO_INCREMENT начинается с 1 . Наличие автоинкремента является одной из особенностей MySQL . Формально описание столбца (определение_столбца) выглядит так:

имя_столбца тип

Тип столбца (тип в выражении определение_столбца) может быть одним из следующих:

  • целый: INT[(length)] [ UNSIGNED ]
  • действительный: REAL[(length,decimals)] [ UNSIGNED ]
  • символьный: CHAR(length) и VARCHAR(length)
  • дата и время: DATE и TIME
  • для работы с большими объектами: BLOB
  • текстовый: TEXT
  • перечислимое множество: ENUM (value1,value2,value3,...) и SET(value1,value2,value3,...)

Полный список типов смотрите в документации

В предыдущих двух статьях данного цикла, опубликованных в № 6 и 7 нашего журнала, мы рассмотрели различные механизмы доступа к данным, включая ADO, BDE и их альтернативы. Теперь мы знаем, как выбрать технологию доступа к данным для той или иной пары «СУБД - средство разработки».

Располагая технологией доступа к данным, можно наконец подумать и о том, каким образом следует манипулировать самими данными и метаданными. Способы манипуляции могут быть специфичными для данной СУБД (например, использование объектов клиентской части этой СУБД для доступа к объектам баз данных) или для данного механизма доступа к данным. Тем не менее существует более или менее универсальный способ манипуляции данными, поддерживаемый почти всеми серверными реляционными СУБД и большинством универсальных механизмов доступа к данным (в том числе при использовании их совместно с настольными СУБД). Этот способ - применение языка SQL (Structured Query Language - язык структурированных запросов). Ниже мы рассмотрим назначение и особенности этого языка, а также изучим, как с его помощью извлекать и суммировать данные, добавлять, удалять и модифицировать записи, защищать данные от несанкционированного доступа, создавать базы данных. Для более подробного изучения SQL мы можем порекомендовать книги Мартина Грабера «Введение в SQL» (М., Лори, 1996) и «SQL. Справочное руководство» (М., Лори, 1997).

Введение

Structured Query Language представляет собой непроцедурный язык, используемый для управления данными реляционных СУБД. Термин «непроцедурный» означает, что на данном языке можно сформулировать, что нужно сделать с данными, но нельзя проинструктировать, как именно это следует сделать. Иными словами, в этом языке отсутствуют алгоритмические конструкции, такие как метки, операторы цикла, условные переходы и др.

Язык SQL был создан в начале 70-х годов в результате исследовательского проекта IBM, целью которого было создание языка манипуляции реляционными данными. Первоначально он назывался SEQUEL (Structured English Query Language), затем - SEQUEL/2, а затем - просто SQL. Официальный стандарт SQL был опубликован ANSI (American National Standards Institute - Национальный институт стандартизации, США) в 1986 году (это наиболее часто используемая ныне реализация SQL). Данный стандарт был расширен в 1989 и 1992 годах, поэтому последний стандарт SQL носит название SQL92. В настоящее время ведется работа над стандартом SQL3, содержащим некоторые объектно-ориентированные расширения.

Существует три уровня соответствия стандарту ANSI - начальный, промежуточный и полный. Многие производители серверных СУБД, такие как IBM, Informix, Microsoft, Oracle и Sybase, применяют собственные реализации SQL, основанные на стандарте ANSI (отвечающие как минимум начальному уровню соответствия стандарту) и содержащие некоторые расширения, специфические для данной СУБД.

Более подробную информацию о соответствии стандарту версии SQL, используемой в конкретной СУБД, можно найти в документации, поставляемой с этой СУБД.

Как работает SQL

Давайте рассмотрим, как работает SQL. Предположим, что имеется база данных, управляемая с помощью какой-либо СУБД. Для извлечения из нее данных используется запрос, сформулированный на языке SQL. СУБД обрабатывает этот запрос, извлекает запрашиваемые данные и возвращает их. Этот процесс схематически изображен на рис. 1 .

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

Обратите внимание на то, что SQL сам по себе не является ни СУБД, ни отдельным продуктом. Это язык, применяемый для взаимодействия с СУБД и являющийся в определенном смысле ее неотъемлемой частью.

Data Definition Language (DDL)

Data Definition Language содержит операторы, позволяющие создавать, изменять и уничтожать базы данных и объекты внутри них (таблицы, представления и др.). Эти операторы перечислены в табл. 1.

Таблица 1

Оператор

Описание

Применяется для добавления новой таблицы к базе данных

Применяется для удаления таблицы из базы данных

Применяется для изменения структуры имеющейся таблицы

Применяется для добавления нового представления к базе данных

Применяется для удаления представления из базы данных

Применяется для создания индекса для данного поля

Применяется для удаления существующего индекса

Применяется для создания новой схемы в базе данных

Применяется для удаления схемы из базы данных

Применяется для создания нового домена

Применяется для переопределения домена

Применяется для удаления домена из базы данных

Data Manipulation Language (DML)

Data Manipulation Language содержит операторы, позволяющие выбирать, добавлять, удалять и модифицировать данные. Обратите внимание на то, что эти операторы не обязаны завершать транзакцию, внутри которой они вызваны. Операторы DML представлены в табл. 2.

Таблица 2

Иногда оператор SELECT относят к отдельной категории, называемой Data Query Language (DQL).

Cursor Control Language (CCL)

Операторы Cursor Control Language используются для определения курсора, подготовки SQL-предложений для выполнения, а также для некоторых других операторов. Операторы CCL представлены в табл. 5.

Таблица 5

Оператор

Описание

Применяется для определения курсора для запроса

Применяется для описания плана запроса. Этот оператор представляет собой расширение SQL для Microsoft SQL Server 7.0. Он не обязан выполняться в других СУБД. Например, в случае Oracle следует использовать оператор EXPLAIN PLAN

Применяется для открытия курсора при получении результатов запроса

Применяется для получения строки из результатов запроса

Применяется для закрытия курсора

Применяется для подготовки оператора SQL для выполнения

Применяется для выполнения оператора SQL

Применяется для описания подготовленного запроса

Все операторы SQL имеют вид, показанный на рис. 2 .

Каждый оператор SQL начинается с глагола, представляющего собой ключевое слово, определяющее, что именно делает этот оператор (SELECT, INSERT, DELETE...). В операторе содержатся также предложения, содержащие сведения о том, над какими данными производятся операции. Каждое предложение начинается с ключевого слова, такого как FROM, WHERE и др. Структура предложения зависит от его типа - ряд предложений содержит имена таблиц или полей, некоторые могут содержать дополнительные ключевые слова, константы или выражения.

С помощью чего можно выполнить SQL-операторы

Все современные серверные СУБД (а также многие популярные настольные СУБД) содержат в своем составе утилиты, позволяющие выполнить SQL-предложение и ознакомиться с его результатом. В частности, клиентская часть Oracle содержит в своем составе утилиту SQL Plus, а Microsoft SQL Server - утилиту SQL Query Analyzer. Именно этой утилитой мы воспользуемся для демонстрации возможностей SQL, а в качестве базы данных, над которой мы будем «экспериментировать», возьмем базу данных NorthWind, входящую в комплект поставки Microsoft SQL Server 7.0. В принципе, можно использовать другую базу данных и любую другую утилиту, способную выполнять в этой базе данных SQL-предложения и отображать результаты (или даже написать свою, используя какое-либо средство разработки - Visual Basic, Delphi, C++Builder и др.). Однако на всякий случай рекомендуется сделать резервную копию этой базы данных.