24-й час
Расширения стандартного SQL

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

Основными на этом уроке будут следующие темы

• Разные реализации языка

• Различия между реализациями

• Соответствие стандарту ANSI SQL

• Интерактивные операторы SQL

• Использование переменных

• Использование параметров

  Реализации SQL

Имеется целый ряд реализаций SQL, предлагаемых различными производителями. Перечислить здесь всех производителей систем управления базами данных возможности нет, поэтому мы рассмотрим только некоторые программные продукты, предлагаемые лидерами. Мы обсудим реализации SQL, предлагаемые Sybase, dBase, Microsoft SQL Server и Oracle. Кроме них достаточно популярными являются продукты фирм Borland, IBM, Informix, Progress, CA-Ingress и многих других.

  Различия между реализациями

Хотя все реализации, о которых идет речь, предназначены для работы с реляционными базами данных, каждая из этих реализаций немного отличается от других. Эти различия вытекают из различий в дизайне продукта и различий в подходах к обработке данных ядром базы данных. Но в данной книге мы сосредоточимся на различиях в рамках SQL. Как и рекомендовано стандартом ANSI, все реализации в качестве языка взаимодействия с базой данных используют SQL. Но кроме стандартных средств SQL, предлагаются расширения SQL, специфичные для каждой из имеющихся реализаций.

Различия в SQL различных производителей возникают из-за стремления улучшить стандарт ANSI SQL с точки зрения простоты использования и эффективности. Внедрять усовершенствования и делать свои продукты более привлекательными для клиентов производителей заставляет конкуренция.

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

В следующих примерах сравнивается синтаксис операторов SELECT разных производителей со стандартом ANSI.

Стандарт ANSI предлагает следующий синтаксис оператора.

SELECT [DISTINCT ] [* | СТОЛБЕЦ1 [, СТОЛБЕЦ2 ]

FROM ТАБЛИЦА1 [, ТАБЛИЦА2] 

[ WHERE УСЛОВИЕ ПОИСКА ]

GROUP BY [ ПСЕВДОНИМ_ТАБЛИЦЫ | СТОЛБЕЦ1 [, СТОЛБЕЦ2 ] 

[ HAVING УСЛОВИЕ_ПОИСКА ]] 

[{UNION | INTERSECT | EXCEPT}][ ALL ] 

[ CORRESPONDING [ BY (СТОЛБЕЦ! [, СТОЛБЕЦ2 ]) ] 

СПЕЦКФИКАЦИЯ_ЗАПРОСА | SELECT * FROM ТАБЛИЦА |

КОНСТРУКТОР_ТАБЛИЦЫ ] 

[ORDER BY СПИСОК_СОРТИРОВКИ ]

SQLBase предлагает следующий синтаксис оператора.

SELECT [ ALL | DISTINCT ] СТОЛБЕЦ1 [, СТОЛВЕЦ2 ]

FROM ТАБЛИЦА1 [, ТАБЛИЦА2]

[ WHERE УСЛОВИЕ_ПОИСКА ]

[ GROUP BY СТОЛБЕЦ1 [, СТОЛБЕЦ2 ]

[ HAVING УСЛОВИЕ_ ПОИСКА ]]

[ UNION [ ALL ] ] 

[ ORDER BY СПИСОК_СОРТИРОВКИ ]

[ FOR UPDATE OF СТОЛБЕЦ1 [, СТОЛБЕЦ2 ]]

Oracle предлагает следующий синтаксис оператора.

SELECT [ ALL | DISTINCT ] СТОЛБЕЦ1 [, СТОЛБЕЦ2 ] 

FROM ТАБЛИЦА1 [, ТАБЛИЦА2]

[ WHERE УСЛОВИЕ_ПОИСКА ]

[[ START WITH УСЛОВИЕ_ПОИСКА ] 

CONNECT BY УСЛОВИЕ_ПОИСКА ]

[ GROUP BY СТОЛБЕЦ1 [, СТОЛБЕЦ2 ]

[ HAVING УСЛОВИЕ_ПОИСКА ]]

[{UNION [ ALL ] ] INTERSECT | MINUS} СПЕЦИФИКАЦИЯ_ЗАПРОСА ]

[ ORDER BY СТОЛБЕЦ1 [, СТОЛБЕЦ2 ]

[ NOWAIT ]

Informix предлагает следующий синтаксис оператора.

SELECT [ ALL | DISTINCT | UNIQUE ] СТОЛБЕЦ1 [, СТОЛБЕЦ2 ]

FROM ТАБЛИЦА1 [, ТАБЛИЦА2]

[ WHERE УСЛОВИЕ_ПОИСКА ]

[ GROUP BY {СТОЛБЕЦ1 [, СТОЛБЕЦ2 ] | INTEGER}

[ HAVING УСЛОВИЕ_ПОИСКА ]]

[ UNION СПЕЦИФИКАЦИЯ_ЗАПРОСА ]

[ ORDER BY СТОЛБЕЦ1 [, СТОЛБЕЦ2 ]

[INTO TEMP TABLE [WITH NO LOG ]]

Как вы уже, наверное, заметили, синтаксис операторов по сути одинаков. Везде присутствуют ключевые слова SELECT, FROM, WHERE, GROUP BY, HAVING, UNION и ORDER BY. В каждом случае эти ключевые слова выполняют одни и те же задачи, но имеют различные опции в зависимости от реализации. Эти опции и называются усовершенствованиями.

  Соответствие стандарту ANSI SQL

Производители стараются соответствовать стандарту ANSI SQL. но ни один из их продуктов не соответствует стандарту на 100%. Некоторые производители добавит к стандартным свои команды, и многие из этих команд и функций были приняты стандартом ANSI SQL. Для производителя соответствие стандарту выгодно по многим причинам. Например, в случае соответствия стандарту реализацию соответствующего производителя легко освоить, а создаваемый в рамках данной реализации программный код SQL будет легко переносим от одной реализации к другой. Переносимость, очевидно, оказывается важным фактором, когда приходится переводить базу данных из одной системы управления базами данных в другую. Какая причина может sacia-вить компанию потратить кучу денег на переход к реализации, которая не согласуется со стандартами? Компания не станет этого делать, если переход потребует внесения слишком больших изменений в программное обеспечение, а освоение языка новой реализации потребует слишком больших усилий. ПОЭТОМУ соответствие стандарту ANSI SQL в большинстве случаев проблемой не является.

  Расширения SQL

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

Примерами расширений стандартного SQL являются PL/SQL, используемый продуктами Oracle, и Transact-SQL, используемый Sybase и Microsoft SQL Server. Оба эги расширения обсуждаются достаточно подробно в примерах следующих разделов.

  Примеры расширений

И PL/SQL, и Transact-SQL считаются языками программирования четвертого поколения. Оба, в отличие от стандартного SQL, являются процедурно-ориентированными языками. Кроме них, мы рассмотрим также другую реализацию SQL, называемую MySQL, которую можно найти в Internet.

Непроцедурный язык SQL включает следующие операторы.

• INSERT

• UPDATE

• DELETE

• SELECT

• COMMIT

• ROLLBACK

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

• Объявления переменных
• Объявления курсоров
• Условные операторы
• Циклы
• Обработчики ошибок
• Различные приращения
• Преобразования данных
• Знаки подстановки
• Триггеры
• Сохраненные процедуры

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

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

  Transact-SQL

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

Вот пример оператора Transact-SQL:

IF (SELECT AVG(COST) FROM PRODUCTSJTBL) > 50 

BEGIN

PRINT "ПОНИЗИТЬ ВСЕ ЦЕНЫ НА 10 ПРОЦЕНТОВ." 

END 

ELSE

PRINT "ЦЕНЫ ПРИЕМЛЕМЫ." 

END

Это очень простой оператор Transact-SQL. В результате его выполнения, ••'' •"*-"" если средняя стоимость товаров в таблице PRODUCTSJTBL оказывается выше 50, печатается текст "понизить ВСЕ ЦЕНЫ НА 10 ПРОЦЕНТОВ", а если средняя стоимость товаров не превышает 50, печатается текст "ЦЕНЫ ПРИЕМЛЕМЫ".

Обратите внимание на использование здесь оператора IF.. .ELSE для оценки условий, накладываемых на получаемые данные. Новой здесь является и команда PRINT. Эти дополнительные возможности не составят даже капли в море всех возможностей Transact-SQL.

 

  PL/SQL

PL/SQL является расширением SQL, предлагаемым Oracle. Подобно расширению Transact-SQL, PL/SQL является процедурным языком, структурированным в виде логических блоков программного кода. Блок PL/SQL состоит из трех разделов, два из которых необязательны. Первый раздел представляет собой раздел DECLARE (раздел объявлений) и яшшется необязательным. В разделе DECLARE содержатся переменные, курсоры и константы. Второй раздел — это раздел PROCEDURE (раздел выполняемых операторов), состоящий из условных команд и операторов SQL. Именно в этом разделе осуществляется управление всем блоком, поэтому раздел PROCEDURE является в блоке обязательным. Третий раздел называется разделом EXCEPTION (разделом исключительных состояний), и в нем задается реакция программы на ошибки выполнения и заданные программистом исключительные ситуации. Раздел EXCEPTION в блоке является необязательным. В PL/SQL имеется возможность использования переменных, констант, атрибутов, циклов, обработчиков исключительных ситуаций, отображения сообщений для программиста, управления транзакциями, сохранения процедур, триггеров и пакетов.

Вот пример оператора PL/SQL.

DECLARE

CURSOR EMP_CURSOR IS SELECT EMP_ID, LAST_NAME, FIRST_NAME, MID_INIT

                     FROM EMPLOYEE_TBL; 

EMP_REC EMP_CURSOR%ROWTYPE; 

BEGIN

OPEN EMP_CURSOR; 

LOOP

FETCH EMP_CURSOR INTO EMP_REC; 

EXIT WHEN EMP_CURSOR%NOTFOUND; 

IF (EMP_REC.MID_INIT IS NULL) THEN 

UPDATE EMPLOYEE_TBL 

SET MID_INIT = 'X' 

WHERE EMP_ID = EMP_REC.EMP_ID; 

COMMIT; 

END IF; 

END LOOP;

CLOSE EMP_CURSOR; 

END;

В данном операторе представлены два из упомянутых выше разделов блока — разделы DECLARE и PROCEDURE. Сначала с помощью запроса объявляется курсор EMP_CURSOR. После этого объявляется переменная EMP_REC, чей тип данных совпадает с типом данных (%ROWTYPE) столбцов объявленного курсора. Первым шагом в разделе PROCEDURE (начинающемся оператором BEGIN) является открытие курсора. После этого для просмотра всех записей курсора используется оператор LOOP, заканчивающийся ключевыми словами END LOOP. Для всех строк курсора, в которых средний инициал имени служащего пропущен (т. е. равен NULL), данные таблицы EMPLOYEEJTBL должны быть обновлены. Обновление состоит в добавлении среднего инициала 'X'. После этого изменения подтверждаются, и курсор, наконец, закрывается.

  MySQL

MySQL представляет собой многопользовательское многозадачное приложение баз данных SQL типа клиент/сервер. MySQL состоит из сетевого сервера (демона), терминальной программы-клиента, нескольких дополнительных программ-клиентов и ряда библиотек. Главные преимущества MySQL — скорость работы, надежность и простота использования. Изначально приложение MySQL разрабатывалось для обеспечения быстрого доступа к очень большим базам данных.

Приложение MySQL можно найти в Internet по адресу http://www.mysql.com. Чтобы установить программные файлы MySQL, вам потребуется программа gunzip, чтобы разжать предлагаемый бинарный файл, и подходящая версия программы TAR, чтобы распаковать входящие в него файлы Предлагаемый в Internet бинарный файл будет иметь название mysql-VERSiON-os. tar. gz, где VERSION означает идентификатор версии MySQL, а OS — название соответствующей операционной системы.

Вот пример выполнения запроса в системе MySQL.

mysql> SELECT CURRENT_DATE(),VERSION();

 

+----------------+------------+
| current date() | version () |
+----------------+------------+
| 1999-08-09     | 3-22.23b   |
+----------------+------------+
1 row in set (0.00 sec) 
mysql>

  Интерактивные операторы SQL

Интерактивные операторы SQL — это такие операторы SQL, которые сами спрашивают о необходимых переменных, параметрах и других необходимых для их выполнения данных Скажем, у вас имеется интерактивный оператор SQL для создания в базе данных записей с информацией о новых пользователях. Такой оператор SQL может попросить вас ввести учетную запись нового пользователя, его реальное имя и номер контактною телефона. Такой оператор применяется для ввода информации об одном новом пользователе или о многих одновременно. Без такого оператора для каждого из пользователей пришлось бы выполнить свой отдельный оператор CREATE ScR Интерактивный оператор SQL может запросить у вас информацию о привилегиях для создаваемого пользователя Не все производители предлагают интерактивные опера юры SQL. вам придется уточнить это по документации, сопровождающей систему управления базой данных В следующих разделах приводятся примеры использования интерактивных операторов SQL в базах данных Oracle.

  Использование параметров

Параметры представляют собой переменные SQL, размещенные в программе. Параметры можно передавать операторам SQL во время выполнения приложения, что придает этим операторам дополнительную гибкость. Практически все 1лавные реализации SQL допускают использование параметров. Мы рассмотрим примеры передачи параметров в Oracle и Sybase.

  Oracle

В Oracle предусмотрена передача параметров операторам, которые в противном случае оставались бы статическими операторами SQL.

SELECT EMP_ID, LAST_NAME, FIRST_NAME

FROM EMPLOYEEJTBL

WHERE EMP_ID = '&EMP__ID'

Этот оператор возвратит данные столбцов EMP_ID, LAST_NAME, FIRST_NAME таблицы EMPLOYEE_TBL для служащего с любым табельным номером EMP_ID, который вас попросит этот оператор ввести.

SELECT *

FROM EMPLOYEE_TBL 

WHERE CITY = '&CITY' 

AND STATE = '&STATE'

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

  Sybase

В Sybase параметры можно передать сохраненной ранее процедуре

CREATE PROC EMP_SEARCK 

(@EMP_ID) 

AS

SELECT LAST_NAME, FIRST_NAME 

FROM EMPLOYEE_TBL 

WHERE EMP_ID = @EMP__ID

Чтобы выполнить созданную здесь процедуру с передачей ей подходящич параметров, вам придется напечатать что-то похожее на следующий оператор SP_EMP_SEARCH "443679012"

  Резюме

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

В конце этого урока были рассмотрены два конкретных расширения SQL использующиеся тремя системами управления базами данных. Transact-SQL используется Microsoft SQL Server и Sybase, a PL/SQL используется Oracle Принципы, заложенные в основу этих расширений SQL, оказываются достаточно схожими. Например, оба ли расширения имеют стандартные возможности и усовершенствования, позволяющие повысить общую функциональность языка и эффективность работы В главе обсуждался продукт MySQL, специально предназначенный для ускорения работы с очень большими базами данных. Цель этого урока — показать, что расширений SQL существует немало и что одним из важнейших требований ко всем реализациям языка оказывается соответствие стандарту ANSI SQL.

Применив информацию из этой книги к своим конкретным задачам (т. е создав программный код, отладив его и заставив выполнять конкретную работу), вы вступите на путь практического освоения SQL. Компании имеют дело с массой данных, и поэтому не могут обойтись без баз данных. Реляционные базы данных имеются повсюду, а поскольку стандартным языком общения с реляционными базами данных и управления ими является SQL, то ваше решение освоить этот язык, безусловно, было решением правильным. Удачи вам!

  Вопросы и ответы

Почему существуют различные вариации SQL?

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

После изучения основ SQL получаю ли я возможность использовать SQL в различных системах управления базами данных?

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

  Практикум

Задания практических занятий разделены на тесты и упражнения. Тесты предназначены для проверки общего уровня понимания рассмотренного материала. Упражнения дают возможность применить на практике идеи, обсуждавшиеся в ходе текущего урока, в комбинации с идеями из предыдущих уроков. Мы рекомендуем ответить на тестовые вопросы и выполнить упражнения прежде, чем продолжать дальнейшее чтение книги. Ответы можно проверить по Приложению Б, "Ответы".

  Тесты

1. Каким языком является SQL — процедурным или непроцедурным?

2. Почему существуют различия между разными реализациями SQL?

3. Назовите три основные операции, которые выполняются с курсором после его объявления.

4. При использовании какого (процедурного или непроцедурного) языка обращения к базе данных ядро базы данных само принимает решение о том, как обрабатывать и выполнять операторы SQL?

  Упражнения

1. Попробуйте самостоятельно обнаружить различия между реализациями SQL разных производителей. В библиотеке или книжном магазине ознакомьтесь с книгами по соответствующим реализациям языка. Сравните синтаксис соответствующих операторов SQL, в частности, операторов DML (языка манипуляций данными). Сравните формы операторов INSERT, DELETE и UPDATE. При этом для сравнения можно заглянуть также и в книгу по ANSI SQL.

2. Используя таблицу EMPLOYEEJTBL (см. Приложение В, "Операторы CREATE TABLE для примеров книги"), запишите интерактивный оператор SQL, возвращающий имена всех служащих, имеющих ZIP-код, равный 46234.