Язык 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;
Вы также можете почитать