Слайд 1Основы языка SQL
I. Стандарты языка SQL
Первые попытки практического применения основных
положений реляционной модели данных (в т.ч. и операций РА) сразу
же показали, что нужен специальный язык для работы с реляционными БД.
Причем требовался простой непроцедурный язык, пригодный даже для пользователей, которые не имеют навыков программирования.
В результате к концу 1970-х годов появилось несколько версий такого языка:
SEQUEL и SQUARE – фирма IBM;
SQL – СУБД Oracle;
QUEL – СУБД INGRES (Калифорнийский университет в Беркли).
Слайд 2Первый стандарт по языку SQL вышел в США (1986 г.),
что способствовало достижению совместимости разных СУБД.
В 1989 г. этот документ
получил статус международного стандарта.
Затем с участием ANSI и ISO были приняты и опубликованы стандарты SQL:1992, SQL:1999 и SQL:2003.
Для каждого нового стандарта характерно:
улучшение синтаксиса;
расширение типов данных;
появление дополнительных возможностей языка.
Слайд 3Подавляющее большинство существующих СУБД поддерживают эти стандарты, однако с разной
степенью соответствия.
Здесь важно понимать, что в стандартах фиксируются только основные
концепции языка после их признания большинством специалистов.
Параллельно существует большое количество диалектов этого языка.
Причем дополнительные возможности (расширения) языка SQL первоначально появляются именно в диалектах, развиваемых отдельными разработчиками коммерческих СУБД.
Слайд 4II. Язык запросов по образцу (QBE)
Язык QBE (Query-By-Example) – это
визуальное средство, которое помогает непрофессиональным пользователям при работе с БД.
Средства
QBE позволяют на экране компьютера заполнить бланк (шаблон) запроса, в т.ч. путем перетаскивания (Drag-and-Drop) отдельных элементов графического интерфейса.
При этом эквивалентная директива языка SQL генерируется автоматически.
Есть возможность просмотреть ее и даже исправить.
Средства QBE присутствуют во многих современных СУБД: MS Access, Oracle и др.
Обычно возможности QBE существенно ниже полных возможностей языка SQL.
Слайд 5III. Возможности современного языка SQL
a) Средства определения данных (DDL)
b) Средства
манипулирования данными (DML)
VIEW – представление (виртуальная таблицa)
SELECT, DELETE,
INSERT, UPDATE
с) Средства управления транзакциями
COMMIT – завершить транзакцию, т.е. зафиксировать ее результаты
ROLLBACK – откатить транзакцию
SAVEPOINT – сохранить промежуточную точку (на случай отката транзакции)
Слайд 6d) Средства административного управления
е) Процедурные расширения языка
DBAREA – область хранения
данных
GRANT – предоставить права
REVOKE – отменить права
Поддерживают средства программирования для
построения сложных процедур работы с БД (например, хранимые процедуры).
Здесь пока не достигнут высокий уровень стандартизации.
Поэтому практически каждая СУБД использует свой процедурный язык.
Слайд 7IV. Создание таблиц БД с помощью языка SQL
В простейшем виде
команда CREATE TABLE имеет следующий синтаксис:
CREATE TABLE tab_name ( {
col_def ⎟ tab_cnstr } [, …] )
В этой синтаксической формуле применяются следующие обозначения:
фигурные скобки { } определяют обязательный элемент;
вертикальная черта ⏐ означает выбор одного из приведенных вариантов;
квадратные скобки [ ] определяют необязательный элемент;
многоточие … указывает возможность неоднократного повторения конструкции.
Слайд 8Элемент col_def обозначает определение отдельной колонки таблицы.
col_def ::= { col_name
data_type }
[ DEFAULT const_expr ] [ col_cnstr ]
[, …]
Прежде всего, нужно обязательно определить имя колонки (col_name), а также тип данных (data_type) для этой колонки.
Этот элемент имеет следующий синтаксис:
Слайд 9Современные СУБД позволяют обрабатывать данные разных типов:
INT, SMALLINT — целые
числа;
NUMERIC, DECIMAL — числа с фиксированной точкой;
REAL, FLOAT — числа
с плавающей точкой;
CHAR, VARCHAR — строки символов постоянной и переменной длины;
MONEY, SMALLMONEY — денежные значения;
DATE, DATETIME — дата и время;
BIT — логические значения.
Слайд 10Необязательное ключевое слово DEFAULT определяет значение по умолчанию – const_expr.
Это
значение будет использовано, если при вводе записи явно не указано
другое значение.
Кроме того, для колонки можно определить набор ограничений – col_cnstr.
Эти ограничения повышают качество данных, которые хранятся в БД, а также поддерживают ссылочную целостность для взаимосвязанных таблиц.
Может использоваться несколько видов ограничений.
Слайд 11а) Обязательные значения
Это ограничение применяется в случае, если для некоторого
столбца в каждой строке таблицы требуется наличие конкретного значения (NOT
NULL).
Например, каждый сотрудник обязательно занимает ту или иную должность (Position).
Тогда столбец Position должен определяться следующим образом:
Position VARCHAR(10) NOT NULL
При установке такого ограничения СУБД препятствует появлению в этом столбце пустых значений (NULL).
Слайд 12b) Простой первичный ключ
Определяется с помощью спецификатора PRIMARY KEY.
Например:
Object_ID INTEGER PRIMARY KEY
При этом для столбца Sub_ID
автоматически гарантируется уникальность значений, а также становятся запрещенными неопределенные значения (NULL).
В таблице можно определить только один первичный ключ.
Слайд 13c) Простой альтернативный ключ
Иногда в дополнение к первичному ключу необходимо
иметь альтернативные ключи, которые обеспечивают уникальность значений для других столбцов.
В
этом случае применяется спецификатор UNIQUE. Например:
Object_name VARCHAR(20) NOT NULL UNIQUE
Слайд 14d) Проверочные ограничения
С помощью спецификатора CHECK(log_expr) можно задать ограниченный диапазон
возможных значений для некоторого столбца.
Логическое выражение log_expr может объединять несколько
условий контроля при вводе данных. Например:
Kurs INTEGER NOT NULL
CHECK ((Kurs >= 1) OR (Kurs <= 5))
Слайд 15e) Простой внешний ключ
Объявляется в дочерней (подчиненной) таблице с помощью
конструкции
[ FOREIGN KEY ] REFERENCES ref_table
[ (ref_col) ]
Если в родительской
таблице ref_table ссылка осуществляется на первичный ключ, то параметр ref_col можно не указывать.
Этот параметр является обязательным при ссылке на альтернативный ключ (столбец с атрибутом UNIQUE).
Слайд 16Ограничения на уровне всей таблицы
В директиве CREATE TABLE такие ограничения
объявляются с помощью синтаксического элемента tab_cnstr.
Этот элемент может присутствовать
в общем списке вместе с определениями отдельных столбцов.
Такой вариант ограничений обычно применяется в случае составных ключей.
При этом используются те же самые ключевые слова, хотя синтаксис немного изменяется.
Слайд 17Объявление составного первичного или альтернативного ключа:
FOREIGN KEY ( col_name [,
…] )
REFERENCES ref_tab [ ( ref_col [, …] ) ]
{
PRIMARY KEY ⎜ UNIQUE } { ( col_name [, …] ) }
Объявление составного внешнего ключа:
Пример создания таблицы с составным первичным ключом:
CREATE TABLE Рецепты (
Код_блюда INTEGER, Код_продукта INTEGER,
Вес_брутто REAL, Вес_нетто REAL,
PRIMARY KEY (Код_блюда, Код_продукта) )
Слайд 18V. Выборка данных с помощью языка SQL
Команда SELECT позволяет извлечь
данные из одной или нескольких таблиц, а также (в случае
необходимости) вычислить по этим данным производные значения.
При формировании этой команды описывается только необходимый результат, т.е. набор выходных данных в виде таблицы.
Когда СУБД начинает выполнять конкретную команду SELECT, с помощью оптимизатора запросов строится определенная последовательность операций РА, которая приведет к получению требуемого результата.
Слайд 19В структуре этой мощной команды, которая имеет достаточно сложный синтаксис,
можно выделить несколько основных разделов:
SELECT 〈 Список_выбора 〉
[ INTO 〈
Новая_таблица 〉 ]
FROM 〈 Набор_источников_данных 〉
[ WHERE 〈 Условия_отбора_записей 〉 ]
[ GROUP BY 〈 Ключи_группировки 〉 ]
[ HAVING 〈 Условия_отбора_групп 〉 ]
[ ORDER BY 〈 Ключи_сортировки 〉 ]
Обязательными являются только два раздела:
SELECT, где указываются столбцы, которые должны присутствовать в выходной таблице;
FROM, где задается перечень таблиц и других источников данных запроса
Слайд 201) Полное отображение таблицы
SELECT * FROM 〈 имя_исх_таб 〉
Рассмотрим
наиболее распространенные варианты применения команды SELECT.
В списке столбцов могут присутствовать
выражения языка SQL, что означает включение вычисляемых полей в выходную таблицу.
Здесь символ * означает «все столбцы».
2) Отображение конкретных столбцов таблицы
SELECT 〈 список_столбцов 〉
FROM 〈 имя_исх_таб 〉
Слайд 213) Выборка записей по заданному условию
В эти выражения обычно входят
константы и названия полей (только числовых типов), а также арифметические
операции.
SELECT 〈 список_столбцов 〉
FROM 〈 имя_исх_таб 〉
WHERE 〈 условие_отбора 〉
Для построения сложных выражений разрешено применять круглые скобки.
В условие отбора могут входить простые операции сравнения: =, <, > и т.п.
Более сложные условия строятся с помощью логических операций AND, OR или NOT.
Слайд 224) Сортировка результатов запроса
Кроме того, в условии отбора можно:
SELECT 〈
список_столбцов 〉
FROM 〈 имя_исх_таб 〉
ORDER BY 〈 Ключи_сортировки 〉
указать шаблон поиска (LIKE);
проверить принадлежность к диапазону (BETWEEN) или множеству (IN).
Каждый ключ сортировки содержит название столбца выходной таблицы (обязательно), а также указатель порядка сортировки:
ASC – возрастающий порядок (по умолчанию);
DESC – убывающий порядок.
Слайд 235) Применение агрегатных (итоговых) функций
При выборке данных из таблиц БД
агрегатные функции позволяют произвести статистическую обработку, что важно для подсчета
итогов.
Кроме специального случая COUNT(*), каждая из этих функций работает с отдельным столбцом, указанным в аргументе функции.
Слайд 24Пример 1. Усреднение значений для заданного столбца:
SELECT COUNT(*)
FROM 〈 имя_исх_таб
〉
WHERE 〈 условия_отбора 〉
Пример 3. Подсчет неповторяющихся значений в
заданном столбце:
SELECT COUNT( DISTINCT 〈имя_столбца〉 )
FROM 〈 имя_исх_таб 〉
Пример 2. Подсчет общего числа записей в выходной таблице:
SELECT AVG( 〈имя_столбца〉 )
FROM 〈 имя_исх_таб 〉
Слайд 256) Запросы с группировкой
Часто при анализе табличных данных требуется выполнить
их группировку, т.е. сделать так, чтобы в одну группу попадали
записи с одинаковыми значениями для заданных атрибутов (ключи группировки).
В этом случае применяется следующая команда:
SELECT 〈 список_столбцов 〉
FROM 〈 имя_исх_таб 〉
GROUP BY 〈 Ключи_группировки 〉
Логика работы запросов с группировкой требует тесной связи между разделами SELECT и GROUP BY.
Слайд 26В частности, любой элемент списка столбцов в разделе SELECT должен
иметь единственное значение для каждой группы.
Следовательно, в этом списке могут
быть только:
имена столбцов, которые являются ключами группировки;
агрегатные функции;
выражения, состоящие из перечисленных выше элементов.
Пример. Пусть имеется таблица ПРЕПОДАВАТЕЛИ, где содержатся следующие данные: Таб_номер, ФИО, Должность, Зарплата, Кафедра.
С помощью этих данных требуется по каждой кафедре определить количество преподавателей и их суммарную зарплату.
Слайд 27В разделе WHERE оператора SELECT может присутствовать вложенный запрос.
Результат выполнения
этого внутреннего запроса (подзапроса) передается внешнему запросу.
Пример. Список преподавателей, которые
получают зарплату выше средней, формируется с помощью следующего запроса:
Решение этой задачи дает следующий запрос:
SELECT Кафедра, COUNT(*), SUM(Зарплата)
FROM ПРЕПОДАВАТЕЛИ
GROUP BY Кафедра
7) Вложенные запросы (подзапросы)
Слайд 288) Многотабличные запросы
SELECT ФИО, Должность
FROM ПРЕПОДАВАТЕЛИ
WHERE Зарплата
>
( SELECT AVG(Зарплата)
FROM ПРЕПОДАВАТЕЛИ )
Для выборки данных
из нескольких таблиц применяется механизм соединения этих таблиц (операция JOIN).
При внутреннем соединении исходные таблицы можно через запятую указать в разделе FROM.
В дополнение к этому, раздел WHERE должен содержать условия для соединения строк из отдельных таблиц.
Слайд 29В этом запросе для сокращенного обозначения таблиц используются их псевдонимы
– а и b.
Пример 1.
SELECT ФИО, Название, Телефон
FROM
ПРЕПОДАВАТЕЛИ a, КАФЕДРЫ b
WHERE a.Код_каф = b.Код_каф
По таблицам КАФЕДРЫ и ПРЕПОДАВАТЕЛИ нужно получить общий список преподавателей с указанием названия кафедры, на которой работает преподаватель, и телефона этой кафедры.
Выполняем следующий запрос:
Слайд 30Эта конструкция применяется для соединения таблиц 〈left_tab〉 и 〈right_tab〉, причем
условия 〈join_cond〉 для соединения строк переносятся внутрь раздела FROM.
Дополнительные условия
для отбора записей по другим критериям остаются в разделе WHERE, что делает текст запроса более понятным.
Начиная с СУБД Oracle 9i и стандарта SQL:1992, стало возможным в разделе FROM оператора SELECT использовать следующую конструкцию:
〈left_tab〉 〈join_type〉 〈right_tab〉 ON 〈join_cond〉
Слайд 31[ INNER ] JOIN — внутреннее соединение (применяется по умолчанию);
LEFT
[ OUTER ] JOIN — левое внешнее соединение;
RIGHT [ OUTER
] JOIN — правое внешнее соединение;
FULL [ OUTER ] JOIN — полное внешнее соединение.
Синтаксический элемент 〈join_cond〉 может принимать следующие значения:
Слайд 32Ключевое слово NATURAL означает, что соединение должно проводиться по равенству
значений в столбцах с одинаковыми названиями.
Это слово позволяет полностью исключить
из запроса условия соединения строк.
Пример 2.
SELECT ФИО, Название, Телефон
FROM ПРЕПОДАВАТЕЛИ
NATURAL JOIN КАФЕДРЫ
Запрос из примера 1 можно записать так: