Лекция 8
Раздел 3. Язык sql
Основные понятия языка SQL
SQL (Structured Query Language) – Структурированный Язык Запросов – стандартный язык запросов по работе с реляционными БД. Язык SQL появился после реляционной алгебры, и его прототип был разработан в конце 70-х годов в компании IBM Research. Он был реализован в первом прототипе реляционной СУБД фирмы IBM System R. В дальнейшем этот язык применялся во многих коммерческих СУБД и в силу своего широкого распространения постепенно стал стандартом для языков манипулирования данными в реляционных СУБД. Первый международный Стандарт языка SQL был принят в 1989 г. (далее мы будем называть его SQL/89 или SQL1). Иногда стандарт SQL1 также называют стандартом ANSI/ISO, и подавляющее большинство доступных на рынке СУБД поддерживают этот стандарт полностью. Однако развитие информационных технологий, связанных с базами данных, и необходимость реализации переносимых приложений потребовали в скором времени доработки и расширения первого стандарта SQL.
В конце 1992 г. был принят новый международный стандарт языка SQL, который в дальнейшим будем называть SQL/92 или SQL2. И он не лишен недостатков, но в то же время является существенно более точным и полным, чем SQL/89. В настоящий момент большинство производителей СУБД внесли изменения в свои продукты так, чтобы они в большей степени удовлетворяли стандарту SQL2. В 1999 году появился новый стандарт, названный SQ.L3. Если отличия между стандартами SQL1 и SQL2 во многом были количественными, то стандарт SQL3 соответствует качественным серьезным преобразованиям. В SQL3 введены новые типы данные, при этом предполагается возможность задания сложных структурированных типов данных, которые в большей степени соответствуют объектной ориентации. Наконец, добавлен раздел, который вводит стандарты на события и триггеры, которые ранее не затрагивались в стандартах, хотя давно уже широко использовались в коммерческих СУБД. В стандарте определены возможности четкой спецификации триггеров как совокупности события и действия. В качестве действия могут выступать не только последовательность операторов SQL, но и операторы управления ходом выполнения программы. В рамках управления транзакциями произошел возврат к старой модели транзакций, допускающей точки сохранения (savepoints), и возможность указания в операторе отката R00L6ACK точек возврата позволит откатывать транзакцию не в начало, а в промежуточную ранее сохраненную точку. Такое решение повышает гибкость реализации сложных алгоритмов обработки информации.
SQL (Structured Query Language) – это язык запросов, который используется при работе с реляционными базами данных в современных СУБД (ORACLE, dBASE IY, dBASE Y, Paradoxe, Access и др.).
Язык SQL стал стандартным языком запросов при работе с реляционными базами данных для архитектуры как файл-сервер, так и клиент-сервер, а также в условиях применения системы управления распределенными БД.
Язык SQL использует ограниченный набор команд, но в то же время – это реляционно полный язык, предназначенный для работы с базами данных, создания запросов выборки данных, выполнения вычислений, обеспечения их целостности. Синтаксис версий языка SQL может в определенной степени различаться для отдельных СУБД. Рассмотрим наиболее общие операторы языка SQL.
SQL, хотя и является языком программирования, в силу своей специфической направленности не обладает многими возможностями универсальных языков программирования. В нем отсутствуют традиционные операторы, организующие циклы, позволяющие объявить и использовать внутренние переменные, организовать анализ некоторых условий и возможность изменения хода программы в зависимости от выполненного условия. В общем случае SQL можно назвать подъязыком, который служит исключительно для управления базами данных. Для создания приложений, настоящих программ необходимо использовать другие, базовые языки программирования, в которые операторы языка SQL будут встраиваться.
Процесс выполнения операторов SQL может быть условно разделен на пять этапов (рис. 30).
Рис. 30. Последовательность выполнения операторов SQL
На первом этапе выполняется синтаксический анализ оператора SQL. На этом этапе проверяется корректность записи оператора SQL в соответствии с правилами синтаксиса.
На втором этапе проверяется корректность параметров оператора SQL: имен отношений, имен полей данных, привилегий пользователя по работе с указанными объектами. На этом этапе отыскиваются семантические ошибки.
На третьем этапе проводится оптимизация запроса. СУБД проводит разделение целостного запроса на ряд минимальных операций и оптимизирует последовательность их выполнения с точки зрения временных затрат на выполнения запроса. На этом этапе строится несколько планов выполнения запроса и выбирается из них один – оптимальный для данного состояния БД.
На четвертом этапе СУБД генерирует двоичную версию оптимального плана опроса, подготовленного на третьем этапе. Двоичный план выполнения запроса СУБД фактически является эквивалентом объектного кода программы.
На пятом этапе СУБД реализует разработанный план, тем самым выполняя запрос.
Табл. 1. Операторы определения данных (Data Definition Language, DDL)
Оператор |
Действие |
CREATE TABLE |
Создает новую таблицу БД |
DROP TABLE |
Удаляет таблицу из БД |
ALTER TABLE |
Изменяет структуру существующей таблицы или ограничения целостности, задаваемые для данной таблицы |
CREATE VIEW |
Создает виртуальную таблицу, соответствующую некоторому SQL-запросу |
ALTER VIEW |
Изменяет ранее созданное представление |
DROP VIEW |
Удаляет ранее созданное представление |
CREATE INDEX |
Создает индекс для некоторой таблицы для обеспечения быстрого доступа по атрибутам, входящим в индекс |
DROP INDEX |
Удаляет ранее созданный индекс |
Табл. 2. Операторы манипулирования данными (Data Manipulation Language, DMP)
Оператор |
Действие |
DELETE |
Удаляет одну или несколько строк, соответствующих условиям фильтрации, из базовой таблицы. Применение оператора согласуется с принципами поддержки целостности, поэтому этот оператор не всегда может быть выполнен корректно, даже если синтаксически он записан правильно |
INSERT |
Вставляет одну строку в базовую таблицу. Допустимы модификации оператора, при которых сразу несколько строк могут быть перенесены из одной таблицы или запроса в базовую таблицу |
UPDATE |
Обновляет значения одного или нескольких столбцов в одной или нескольких строках, соответствующих условиям фильтрации |
Табл. 3. Оператор запросов (Data Query Language, DQL)
Оператор |
Действие |
SELECT |
Оператор, заменяющий все операторы реляционной алгебры и позволяющий сформировать результирующее отношение, соответствующее запросу |
Все операторы SQL имеют вид, показанный на рис. 31.
Рис. 31. Структура оператора SQL
Каждый оператор SQL начинается с ключевого слова, определяющего, что именно делает этот оператор (SELECT, INSERT, DELETE...). В операторе содержатся также предложения, содержащие сведения о том, над какими данными производятся операции. Каждое предложение начинается с ключевого слова, такого как FROM, WHERE и др. Структура предложения зависит от его типа.
Примеры команд SQL
Пример 1. Создание таблицы:
CREATE TABLE Студент
([Имя] TEXT,
[Фамилия] TEXT,
[Дата рождения] DATETIME,
CONSTRAINT Инд UNIQUE ([Имя]) )
В результате выполнения данного запроса будет создана таблица СТУДЕНТ, имеющая в своем составе:
два текстовых поля – Имя, Фамилия,
одно поле типа дата/время – Дата рождения.
Будет также создан индекс с именем Инд по значению указанного поля (полей, который будет иметь уникальное значение, так как в таблице не может быть двух записей с одинаковыми значениями полей, образующих его.)
CREATE TABLE Студенты (id COUNTER PRIMARY KEY, Поле2 TEXT(12), Поле3 MONEY, Поле4 INTEGER)
Пример 2. Изменение структуры таблицы:
ALTER TABLE Студент ADD COLUMN [Группа] TEXT(5)
ALTER TABLE Студент DROP COLUMN [Группа] – удаление поля
Пример 3. Создание индекса таблицы:
CREATE INDEX Гр ON Студент([группа]) WITH DISALLOW NULL
Пример 4. Удаление таблицы. Для удаления таблицы (одновременно и структуры, и данных) используется следующая команда:
DROP TABLE имя таблицы, например DROP TABLE Студент
Пример 5. Удаление только индекса Гр таблицы Студент:
Для удаления только индекса таблицы (сами данные при этом не разрушаются) необходимо выполнить следующую команду:
DROP INDEX имя индекса ON имя таблицы
например, DROP INDEX Гр ON Студент
Пример 6. Добавление данных в таблицу:
INSERT INTO Студент (Имя, Фамилия, Дата рождения) VALUES ('Имя 1', Фамилия 1, 07.06.12);
С параметрами
INSERT INTO Студент (Поле2, Поле3, Поле4) VALUES ([Имя], [Стипендия], [Баллы]);
Пример 7. Добавление / удаление ключевого поля:
ALTER TABLE Студент ADD PRIMARY KEY ([Имя])
ALTER TABLE Студент DROP PRIMARY KEY ([Имя])
Пример 8. Запрос на выборку
Показать все данные таблицы
SELECT * FROM Студент
Показать определенные поля таблицы
SELECT Поле1, Поле2 FROM Студент
Запрос с условиями (с фильтрацией)
SELECT * FROM Студенты WHERE Поле4 > 50
SELECT Поле1, Поле2, Поле3 FROM Студенты WHERE Поле4 < 50
SELECT * FROM Студенты WHERE Поле4 between 1 and 100
SELECT * FROM Студенты WHERE Поле2 like "В*"
SELECT * FROM Студенты WHERE Поле4 is null
SELECT * FROM Студенты WHERE Поле3 > 200 And Поле3 <= 300
