Язык SQL. Структура SQL - Санкт-Петербург, 2012

Страница создана Ксения Боброва
 
ПРОДОЛЖИТЬ ЧТЕНИЕ
Язык SQL. Структура SQL

Санкт-Петербургский государственный электротехнический университет
               «ЛЭТИ» им. В. И. Ульянова (Ленина)

                   Санкт-Петербург, 2012
Немного истории

  SQL (Structured Query Language) — стандартный язык запросов
  по работе с реляционными БД. Язык SQL появился после
  реляционной алгебры, и его прототип был разработан в конце
  70-х годов в компании IBM Research.

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

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

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

  Начало разработки
  В 1983 году Международная организация по стандартизации
  (ISO) и Американский национальный институт стандартов
  (ANSI) приступили к разработке стандарта языка SQL.
Стандарт 1989-го года

    1   Во многих частях имеет чрезвычайно общий характер и
        допускает очень широкое толкование.
    2   Отсутствуют важные разделы (манипулирование схемой
        БД, динамический SQL1 ).
    3   Стандартизация синтаксиса и семантики операторов
        выборки и манипулирования данными, фиксация средств
        ограничений целостности БД: определение первичного и
        внешнего ключей отношений, проверочные ограничения
        целостности.

    1 Динамический SQL — это расширение какого-либо базового языка
  программирования, позволяющее встраивать команды языка
  структурированных запросов SQL непосредственно в текст программы.
Динамический SQL
Пример на Java. Библиотека Squiggle

   Код, представленный ниже

   SelectQuery select = new SelectQuery();
   Table people = new Table("people");
   select.addColumn(people, "firstname");
   select.addColumn(people, "lastname");
   select.addOrder(people, "age", Order.DESCENDING);

   аналогичен запросу

   SELECT
      people.firstname,
      people.lastname
   FROM
        people
   ORDER BY
        people.age DESC
Стандарт 1992-го года (SQL2)

       Расширено манипулирование таблицами.
       Расширено манипулирование схемой БД.
       Возможность управления доменами.
       Новые типы данных и новые функции.
       Управление транзакциями2 и сессиями3 .
       Развитие динамического SQL.

    2 Транзакцией называется последовательность действий, которая или
  полностью фиксируется в базе данных, или полностью отменяется.
     3 Сессией называется последовательность транзакций, в пределах
  которой сохраняются временные отношения
Транзакции
Пример на Python. Библиотека Django

   try:
       a.save()
       b.save()
       c.save()
   except:
       transaction.rollback()
   else:
       transaction.commit()

   Пытаемся сохранить в базе данных объекты a, b и c. Если
   сохранение проходит удачно, то фиксируем изменения
   (commit), иначе отменяем транзакцию (rollback).
Стандарт SQL3

      Механизм триггеров4 (стандарт синтаксиса триггеров и
      процедур).
      Абстрактные типы данных.
      Расширение модели транзакций (контрольные точки,
      многозвенные транзакций).

     4 Триггеры являются одной из разновидностей хранимых процедур. Их
  исполнение происходит при выполнении для таблицы какого-либо
  оператора языка манипулирования данными (DML). Их можно
  рассматривать как своего рода фильтры, вступающие в действие после
  выполнения всех операций.
Триггеры
Пример для MySQL

   CREATE TRIGGER ‘update_trigger‘
   AFTER INSERT ON ‘test‘
   FOR EACH ROW BEGIN
        INSERT INTO log SET
            message = ’inserted’,
            id = NEW.id;
   END;

   После каждого добавления строки в таблицу test в log
   автоматически вставляется строка с идентификатором новой
   записи. Таким образом, можно организовать журналирование.
Контрольные точки
Пример на Python. Библиотека Django

   a.save()

   point = transaction.savepoint()

   b.save()

   if want_to_keep_b:
       # Обновили контрольную точку.
       transaction.savepoint_commit(point)
   else:
       # Откатили транзакцию. Сохранится только a.
       transaction.savepoint_rollback(point)

   transaction.commit()
Достоинства SQL ,

       Повсеместная распространенность.
       Быстрое обучение в простых случаях.
       Связывание с различными языками программирования.
       Поддержка ODBC5 и JDBC6 .
       Фактор времени: научились хорошо реализовывать.

    5 ODBC (Open DataBase Connectivity) — это программный интерфейс
  доступа к базам данных, разработанный фирмой Microsoft, в
  сотрудничестве с Simba Technologies.
     6 JDBC (Java DataBase Connectivity) — платформенно-независимый
  промышленный стандарт взаимодействия Java-приложений с различными
  СУБД, реализованный в виде пакета java.sql, входящего в состав Java SE.
Недостатки SQL /

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

    7 Неопределенное значение (NULL) — специальное значение, которое
  может быть записано в поле таблицы базы данных. Введено для того,
  чтобы различать в полях БД отсутствующие значения (когда в поле не
  записано вообще никакого значения, даже пустого). Есть мнение, что
  использование неопределенного значения является следствием ошибки
  проектирования БД.
Структура SQL
Операторы описания данных (Data Definition Language, DDL)

   В отличие от реляционной алгебры SQL является полным
   языком, в нем присутствуют не только операции запросов, но и
   операторы, соответствующие DDL — Data Definition Language —
   языку описания данных:
        CREATE создает объект БД (саму базу данных, таблицу,
        представление8 , пользователя, индекс9 и т. д.);
        ALTER изменяет объект;
        DROP удаляет объект.

      8 Представления — это таблицы чье содержание выбирается или
   получается из других таблиц.
      9 Индекс — объект базы данных (на основе одного или более столбцов),
   создаваемый с целью повышения производительности поиска данных.
   Ускорение работы достигается за счёт того, что индекс имеет структуру,
   оптимизированную под поиск — например, сбалансированного дерева.
Структура SQL
Пример представления
Структура SQL
Операторы манипуляции данными (Data Manipulation Language, DML)

        SELECT считывает данные, удовлетворяющие заданным
        условиям;
        INSERT добавляет новые данные;
        UPDATE изменяет существующие данные;
        DELETE удаляет данные.
   Пример простого запроса (выбираем данные о поставщиках):
   SELECT name, city, state
       FROM suppliers
       WHERE supplier_id > 1000;
   Еще пример (изменения данных о поставщике):
   UPDATE suppliers
       SET name = ’Apple’, product = ’iPhone’
       WHERE name = ’Калужский турбинный завод’;
Структура SQL
Операторы определения доступа к данным (Data Control Language, DCL)

        GRANT предоставляет пользователю (группе) разрешения
        на определенные операции с объектом;
        REVOKE отзывает ранее выданные разрешения;
        DENY задает запрет, имеющий приоритет над разрешением.
   Операторы определения доступа позволяют ограничить доступ
   пользователей к отдельным таблицам.
Структура SQL
Операторы управления транзакциями (Transaction Control Language, TCL)

        COMMIT применяет транзакцию;
        ROLLBACK откатывает все изменения, сделанные в
        контексте текущей транзакции;
        SAVEPOINT делит транзакцию на более мелкие участки.
Структура SQL
Программный SQL

       DECLARE задает некоторое имя и определяет связанный с
       ним запрос к БД, который соответствует виртуальному
       набору данных;
       OPEN формирует виртуальный набор данных,
       соответствующий описанию указанного курсора и
       текущему состоянию БД;
       FETCH считывает очередную строку, заданную параметром
       команды из виртуального набора данных,
       соответствующего открытому курсору;
       CLOSE прекращает доступ к виртуальному набору данных,
       соответствующему указанному курсору;
       PREPARE генерирует план выполнения запроса,
       соответствующего заданному оператору SQL;
       EXECUTE выполняет ранее подготовленный план запроса.
Структура SQL
Операторы манипуляции данными. Простой пример

   Вычислим длину гипотенузы прямоугольного треугольник:

   PREPARE stmt1 FROM
       ’SELECT SQRT(POW(?,2) + POW(?,2))
       AS hypotenuse’;
   SET @a = 3;
   SET @b = 4;
   EXECUTE stmt1 USING @a, @b;
Структура SQL
Операторы манипуляции данными. Сложный пример M

   CREATE PROCEDURE curdemo()
   BEGIN
     DECLARE done INT DEFAULT FALSE;
     DECLARE a CHAR(16);
     DECLARE b, c INT;
     DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
     DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

     OPEN cur1;
     OPEN cur2;
     ...
     CLOSE cur1;
     CLOSE cur2;
   END;
Структура SQL
Операторы манипуляции данными. Сложный пример. Продолжение

     read_loop: LOOP
       FETCH cur1 INTO a, b;
       FETCH cur2 INTO c;

       IF done THEN
         LEAVE read_loop;
       END IF;

       IF b < c THEN
         INSERT INTO test.t3 VALUES (a,b);
       ELSE
         INSERT INTO test.t3 VALUES (a,c);
       END IF;
     END LOOP;
Вы также можете почитать