Публикации
Последние новости:
 
Высокие технологии
Technology
Компьютерное железо
Программное обеспечение
Компьютерная безопасность
Операционные системы
Компьютерный справочник
БД
Интернет сегодня
AudioТехника
Средства связи
Весь спектр цифровой техники
Мир авто
Бизнес-финансы
Всё о культуре
ПроСпорт
Всё о компьютерах
Детское чтение
Мировые телекоммуникации
Пресс-релизы
 
Статьи
Мир культуры
Интересно о спорте
Покупаем:
ТурТранс
Для прекрасных дам
Усадьба, дом
 

Платный хостинг от провайдера HostSpace.com.ua - хостинг, регистрация доменов. Поддержка PHP, MySQL, почта - в каждом тарифном плане.





Краткое сравнение Oracle SQL и ANSI SQL


Целью данной статьи является выявление различий между реализацией SQL в СУБД Oracle 8 и ANSI SQL92. В частности делается анализ языка обработки данных (DML) и не рассматривается язык определения данных (DDL), также не рассматривается объектное расширение языка SQL, предназначенного для работы с объектными таблицами Oracle и отсутствующее в стандарте ANSI. Язык SQL СУБД Oracle 8 (далее Oracle SQL), по заявлению фирмы-производителя , соответствует начальному уровню ANSI SQL (entry level), однако некоторые особенности реализации его превосходят, а некоторые отличаются. Статья делает попытку описать отличия и дополнения и будет полезна для написания приложений более легко переносимых с СУБД Oracle на другую СУБД, удовлетворяющую стандарту ANSI. Хотя и существует мнение что нельзя перенести приложение с одной СУБД на другую без изменения кода, информация данной статьи поможет это сделать в случае необходимости более легко.








NULL значения

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

 INSERT INTO TEST(COL1) VALUES(NULL) и
 INSERT INTO TEST(COL1) VALUES() 

полностью идентичны и вставят в таблицу значения NULL, а не пустые строки.

В Oracle вообще нельзя вставить пустую строку, так как она будет рассматриваться как NULL. Это отклонение особенно актуально при сравнении строк, например пусть есть следующая таблица:

TEST
 COL1 COL2
1 Str1
2 a Str2

тогда оператор SELECT * FROM TEST WHERE COL1=в Oracle будет интерпретироваться как SELECT * FROM TEST WHERE COL=NULL и не вернет НИОДНОЙ строчки, в тоже время в ANSI SQL данный оператор вернет первую строку.

Оператор SELECT * FROM TEST WHERE COL1<>в Oracle будет интерпретироваться как SELECT * FROM TEST WHERE COL<>NULL и также не вернет НИОДНОЙ строчки, в ANSI SQL данный оператор вернет вторую строку.

Чтобы операторы отработал корректно его следует заменить на:

SELECT * FROM TEST WHERE COL1 IS NULL и
SELECT * FROM TEST WHERE COL1 IS NOT NULL.

Таким образом при сравнении величины с пустой строкой в Oracle следует пользоваться предложениями IS NULL и IS NOT NULL.

Оператор UPDATE

Оператор UPDATE в Oracle полностью соответствует требованиям начального уровня ANSI SQL. Однако имеются некоторые дополнительные возможности. Если отбросить возможности предназначенные для работы с объектными таблицами вот они:

  • использование табличных алиасов для ссылок на обновляемую таблицу в подзапросах
  • подзапросы в правой части предложения SET в отличие от только выражений в ANSI SQL
  • список обновляемых колонок в левой части предложения SET, в отличии от одной колонки в ANSI SQL
  • подзапросы в предложении SET или WHERE могут ссылаться на обновляемую таблицу
  • Оператор UPDATE поддерживает обновление подзапросов

    Проиллюстрируем эти возможности на примере:

    1 UPDATE emp aaa 
    2 SET deptno =(SELECT deptno FROM dept WHERE loc=Москва),
    3 SET (sal,comm)=(SELECT 1.1*AVG(sal),1.5*AVG(comm)
    4 FROM emp bbb WHERE aaa.deptno=bbb.deptno)
    

  • 1. таблице emp присваивается алиас aaa для последующей ссылки на обновляемую таблицу в подзапросе
  • 2. значение столбца deptno берется из подзапроса, возвращающего одно значение
  • 3. значение столбцов sal и col ,берется из подзапроса, возвращающего два значения
  • 4. делается выборка из таблицы emp, которая обновляется этим же оператором
  • 5 UPDATE emp SET comm=NULL WHERE job=управляющий
    

    этот запрос будет аналогичен следующему запросу:

    UPDATE (SELECT * FROM emp )SET comm=NULL WHERE job=управляющий
    

  • 5. в данном примере Oracle будет обновлять временное представление SELECT * FROM emp. После предложения UPDATE в круглых скобках может следовать любой оператор SELECT. На основе этого оператора строится временное представление. Если это представление удовлетворяет условиям на обновляемые представления Oracle выполнит запрос.
  • Оператор DELETE

    Оператор DELETE в Oracle полностью соответствует требованиям начального уровня ANSI SQL. Однако имеются некоторые дополнительные возможности:

  • Ключевое слово FROM не обязательно
  • использование табличных алиасов для ссылок на обновляемую таблицу в подзапросах
  • подзапросы в предложении WHERE могут ссылаться на обновляемую таблицу
  • Оператор DELETE поддерживает удаление из подзапросов

    1,2 DELETE emp aaa 
    WHERE sal IN (SELECT AVG(sal)
    3 FROM emp bbb WHERE aaa.deptno=bbb.deptno)
    

  • 1. в предложении DELETE отсутствует ключевое слово FROM
  • 2. таблице emp присваивается алиас aaa для последующей ссылки на обновляемую таблицу в подзапросе
  • 3. делается выборка из таблицы emp, из которой делается удаление этим же оператором
  • 4. Оператор:
  •  DELETE FROM emp WHERE job=управляющий
    аналогичен оператору:
     DELETE FROM (SELECT * FROM emp) WHERE job=управляющий
    

    Оператор INSERT

    В Oracle имеются следующие дополнительные возможности по сравнению с ANSI SQL:

    1. Оператор INSERT поддерживает подзапросы в предложении INTO
    Оператор:

     INSERT INTO dept VALUES (50,продукция,Москва) 

    аналогичен оператору:

     INSERT INTO (SELECT deptno, ndept, loc FROM dept)
     VALUES (50,продукция,Москва)

    Оператор SELECT

    В операторе SELECT имеются следующие дополнительные возможности по сравнению с ANSI SQL:

  • NULL в списке выборки
  • Запрос из запроса (SELECT FROM (SELECT….))
  • Левая часть оператора IN может быть списком выражений в отличии от одиночного выражения в ANSI SQL
  • Не только столбец, а любое выражение может быть использовано с оператором LIKE
  • Любое выражение, а не только отдельный столбец может быть использован в операторах сравнения IS NULL и IS NOT NULL
  • В предложении ORDER BY может быть использовано любое выражение содержащее любые столбцы любых таблиц предложения FROM в отличии от только имен, алиасов, номеров позиций столбцов списка выборки
  • В предложении GROUP BY может быть использовано любое выражение содержащее любые столбцы любых таблиц предложения FROM в отличии от только имен, алиасов столбцов списка выборки
  • Вложенные агрегатные функции MIN(MAX(col1)) (уровень вложенности не более 2)
  • Оператор внешнего соединения (+)
  • Древовидные запросы

    1 SELECT ename, job, sal, deptno, NULL
     FROM
    2 (SELECT * FROM emp WHERE deptno=30)
    3 WHERE (ename,job) IN (SELECT ename,job FROM …. );
     SELECT ename,ename2,sal,sal2
     FROM emp
    4 WHERE ename LIKE %||ename2||% AND
    5 sal+sal2IS NOT NULL 
    6 ORDER BY sal+sal2
    

  • в списке выборки присутствует NULL-значение
  • в предложении FROM указан подзапрос
  • слева от оператора IN указан список из двух столбцов, а справа - запрос, возвращающий два столбца
  • с оператором LIKE использовано выражение %||ename2||%, содержащее ссылку на столбец
  • С оператором сравнения IS NOT NULL используется выражение sal+sal2
  • Сортировка осуществляется по значению выражения sal+sal2

    Внешние соединения

    В ANSI SQL внешние объединения реализованы посредством расширенной формы предложения FROM:

     SELECT * FROM tab1 FULL JOIN tab2 ON col1=col2 - полное внешнее объединение
     SELECT * FROM tab1 LEFT JOIN tab2 ON col1=col2 - полное левое объединение
     SELECT * FROM tab1 RIGHT JOIN tab2 ON col1=col2 - полное правое объединение
    

    В Oracle не реализовано расширенное предложение FROM для реализации внешних соединений (начальный уровень ANSI SQL этого не требует) как это сделано в ANSI. Однако реализован свой собственный синтаксис для получения левых и правых внешних объединений. Полные внешние объединения в Oracle не реализованы.

    Для реализации левого внешнего объединения используется оператор (+) в предложении WHERE, который ставиться справа от столбца, по которому осуществляется соединение, справа от знака =. Аналогично для правого объединения оператор (+) ставиться справа от столбца слева от знака равенства.

     SELECT * FROM tab1 LEFT JOIN tab2 ON col1=col2 - аналогичен запросу:
     SELECT * FROM tab,tab2 WHERE col1=col2 (+)
     SELECT * FROM tab1 RIGHT JOIN tab2 ON col1=col2 - аналогичен запросу:
     SELECT * FROM tab,tab2 WHERE col1 (+)=col2 
    

    Древовидные запросы

    В Oracle также реализованы так называемые древовидные запросы, предназначенные для работы с данными, организованными в виде дерева. Для реализации дерева в виде таблицы в ней должно быть дополнительных два поля: id узла и id родительского узла. Также должен быть корень (корни). Для реализации древовидных запросов имеются два дополнительных предложения:

     START WITH - для идентификации коренных строк
     CONNECT BY - для связи строк-потомков и строк-предков
    

    В предложении CONNECT BY реализован также оператор PRIOR который используется для обозначения выражения-родителя.

    Оператор SELECT, осуществляющий древовидный запрос, может использовать псевдостолбец LEVEL, содержащий уровень вложенности для каждой строки. Для коренных записей LEVEL=1, для потомков коренных записей LEVEL=2 и и.д.

    SELECT LPAD( ,2*(LEVEL-1)) || ename org_chart, empno, mgr, job
    FROM emp
    START WITH job = PRESIDENT
    CONNECT BY PRIOR empno = mgr;
    ORG_CHART EMPNO MGR JOB
    ------------ ---------- ---------- ---------
    KING 7839 PRESIDENT
     JONES 7566 7839 MANAGER
     SCOTT 7788 7566 ANALYST
     ADAMS 7876 7788 CLERK
     FORD 7902 7566 ANALYST
     SMITH 7369 7902 CLERK
     BLAKE 7698 7839 MANAGER
     ALLEN 7499 7698 SALESMAN
     WARD 7521 7698 SALESMAN
     MARTIN 7654 7698 SALESMAN
     TURNER 7844 7698 SALESMAN
     JAMES 7900 7698 CLERK
     CLARK 7782 7839 MANAGER
     MILLER 7934 7782 CLERK
    




    www.sdteam.com

    БД 08-09-2006

    Microsoft создает крупное дополнение для SQL Server 2008 07-10-2008 БД
    Корпорация Microsoft начала работу над новым и самым крупным из всех существующих аддонов для СУБД SQL Server 2008, пока разработка фигурирует под кодовым названием Kilimanjaro. В Microsoft говорят, что Kilimanjaro призвана существенно повысить масштабируемость SQL Server 2008 и позволит ему работать с чрезвычайно крупными хранилищами данных.В основе аддона лежат разработки и технологии компании DATAllegro, купленной Microsoft около двух месяцев ...


    SAP покупает компанию Visiprise 07-07-2008 БД
    Европейский производитель корпоративного программного обеспечения SAP планирует купить компанию Visiprise, занимающуюся созданием софта для корпоративного и производственного планирования. Сделка, финансовые условия которой не разглашаются, будет закрыта в июле этого года.После завершения покупки, все разработки Visiprise будут интегрированы в программное обеспечение SAP для автоматизации бизнес-процессов и комплексной интеграции производственных...


    SAP занялась продажей индивидуальных лицензий 08-10-2007 БД
    SAP представила новый тип лицензии на программное обеспечение NetWeaver, используемое для автоматизации деятельности компаний. Новая лицензия представляет собой годовую подписку и ориентирована она на индивидуальных разработчиков.В компании говорят, что ранее SAP занималась лишь продажей лицензий компаниям, теперь индивидуальные пользователи смогут купить годовую лицензию. Для этого им необходимо будет присоединиться к сети SAP developer network ...


    Oracle купила компанию Netsure Telecom 05-09-2007 БД
    Oracle сегодня сообщила о покупке компании Netsure Telecom Limited, производителя средств для обеспечения безопасности сетей, исследования данных в сетях и общего анализа корпоративных сетей.Основная задача программного обеспечения Netsure Teleocm - это комплексная диагностика критически важных крупных сетей. Среди клиентов купленной компании есть и крупнейшие операторы связи - Vodafone, Cable&Wireless, Eircom и ряд других.Компания Netsure являет...

    Москву посетил Президент Oracle Чарльз Филлипс 19-08-2007 БД
    Сегодня в рамках московской пресс-конференции Президента Oracle Чарльза Филлипса было объявлено об итогах 30-летнего развития корпорации и ее продуктов, а также представлена глобальная стратегия Oracle.В программе четырехдневного визита руководителя Oracle в Москву и Санкт-Петербург - встречи с ключевыми клиентами и партнерами, эффективно использующими технологии и бизнес-приложения Oracle в России.По итогам 2007 финансового года, годовой доход O...

    Вооруженные силы Грузии внедрили систему управления ресурсами SAP 13-07-2007 БД
    Специалисты украинского НИИ автоматизированных компьютерных систем «Экотех» (НИИ АКС «Экотех») совместно со специалистами главного исполнителя проекта – грузинской компании «UGT», при участии «SAP Украина», завершили этап создания Концептуального проекта по внедрению интегрированной системы управления ресурсами предприятия SAP ERP в Вооруженных Силах (ВС) Грузии.По словам министра обороны  Грузии Давида Кезерашвили, прое...
  •  
    При любом использовании материалов сайта ссылка на сайт www.archive.com.ua обязательна.
    Rambler's Top100 Рейтинг@Mail.ru