Основы языка SQL
SQL — язык структурных запросов, созданный сотрудниками фирмы IBM для реляционных баз данных в начале 1970-х гг., а затем реализованный в рамках реляционных СУБД других фирм-разработчиков. Впоследствии SQL фактически стал стандартом в области языков запросов к реляционным базам данных.
В 1989 г. Американский национальный институт стандартов (American National Standards — ANSI) на основе анализа различных реализаций SQL разработал стандарт SQL-86. В 1992 г. появилась его новая версия — SQL-92, или SQL2. Эта версия реализована практически во всех современных СУБД. В настоящее время разрабатывается версия стандарта SQL3.
SQL представляет собой набор операторов, позволяющих осуществлять выборку (оператор SELECT) данных, их модификацию (оператор UPDATE) и удаление (оператор DELETE), а также ввод новых данных (оператор INSERT). Кроме того, в данный язык входят операторы определения переменных, создания и вызова хранимых процедур, функций и специальных процедур — триггеров. Всего SQL содержит более 100 операторов и позволяет разрабатывать сложные приложения. Одним из основных операторов SQL является SELECT.
Оператор SELECT предназначен для осуществления запросов по выборке данных из БД. Его синтаксис приведен далее:
SELECT [DISTINCT] Ссписок выбираемых полей>
FROM <список таблиц>|<условие соединения> [WHERE <условие выборки>]
[GROUPBY <условие группировки>
[HAVING <условие выборки группы>]]
[ORDERBY <условие упорядочивания> ASCI DESC] [UNION Сподзапрос >]
[INTO Сполучатель >] .
В данном описании использованы следующие обозначения:
- ? ссписок таблиц> — синтаксическая конструкция, требующая дальнейшего уточнения;
- ? [DICTINCT] — синтаксическая конструкция внутри квадратных скобок (является необязательной и, в зависимости от ситуации, может использоваться или отсутствовать);
- ? ASC | DESC — наличие символа “|” означает, что может использоваться синтаксическая конструкция, находящаяся слева или справа от этого символа;
- ? DICTINCT — указывает на необходимость исключения из результата одинаковых кортежей (записей);
- ? ссписок выбираемых полей> — список атрибутов (полей), которые входят в состав результирующего отношения. Кроме атрибутов здесь могут быть представлены и выражения;
- ? ссписок таблиц> — список отношений (таблиц), которые используются в запросе;
- ? <условие выборки> = [<условие связи> [сусловие связи>]...]
- ? [АЫБсусловие отбора> [А]>Ш|(Ж<условие отбора>]...]
- ? сусловие связи> — используется для связи таблиц, используемых в запросе;
- ? сусловие отбора> — выражение, определяющее, какие кортежи (записи) будут включены в результат. При составлении этого выражения можно использовать арифметические (+, -, х, /) и логические операции (AND, OR, NOT), а также встроенные функции SQL.
Текст запроса заканчивается знаком «;».
Сформулируем запрос: «Вывести следующую информацию о поставках контрагентом с кодом 1: номер накладной, дата поставки».
SELECT №накладной, ДатаПоставки
FROM Поставка
WHERE КодКонтрагента=1;
В этом запросе ссписок выбираемых полей> представлен атрибутами (полями) Мнакладной, ДатаПоставки, ссписок таблиц> — одним отношением (таблицей) Поставка, а сусловие выборки> включает одно сусловие отбора> — КодКонтрагента=1.
В связи с тем, что здесь используется только одна таблица, сусловие связи> отсутствует; сусловие соединения> будет рассмотрено далее.
Рассмотрим пример с использованием нескольких отношений (таблиц). Переформулируем первый запрос: «Вывести следующую информацию о поставках товаров контрагентами: номер накладной, наименование контрагента, дата поставки». В SQL он представляется следующим образом:
SELECT №накладной, ДатаПоставки, НаимКонтрагента FROM Контрагент INNER JOIN Поставка ON Контрагент. КодКонтрагента = Поставка.КодКонтрагента;
Здесь сусловие связи> представлено выражением (Контрагент.Код- Контрагента = Поставка. Код Контрагента). Оно указывает, при помощи каких атрибутов (полей) осуществляется связывание таблиц.
SQL позволяет получать при помощи запросов вычисляемые атрибуты — результаты вычислений над другими атрибутами. Запрос «Вывести следующую информацию о поставках товаров: номер накладной, дата поставки, код товара, сумма позиции» имеет вид:
SELECT №накладной, ДатаПоставки, КодТовара, Цена- Поставщика х Количество AS суммаПозиции FROM Поставка INNER JOIN СпецПоставки ON Поставка. №накладной = СпецПоставки.№накладнойПоставки;
При составлении вычисляемых атрибутов могут использоваться встроенные функции:
COUNT(*) — подсчитывает количество кортежей (записей); MAX(Atr) — выдает наибольшее значение атрибута Atr;
MIN(Atr) — выдает наименьшее значение атрибута Atr. Рассмотрим пример.
Необходимо определить общее количество поставленных товаров:
SELECT КодТовара, Sum(Количество) AS Поставлено FROM СпецПоставки GROUP BY КодТовара;
В таких случаях в СУБД используется так называемая группировка данных. Все кортежи (записи) автоматически делятся на группы по заданным признакам, для каждой группы производятся одни и те же вычисления. Признаки группировки задаются при помощи следующей конструкции:
GROOPBY <условие группировки>.
Кроме того, SQL позволяет упорядочить результаты запросов по возрастанию или убыванию нескольких атрибутов (полей) при помощи конструкции вида
[ORDERBY <условие упорядочивания> ASC | DESC] , где <условие упорядочивания> — перечень атрибутов (полей), в соответствии с которыми производится сортировка результата запроса; AS С (DESC) — признак упорядочивания по возрастанию (убыванию).
Упорядочим записи результата запроса по убыванию:
SELECT КодТовара, Sum(Количество) AS Поставлено
FROM СпецПоставки
GROUP BY КодТовара
ORDER BY Sum (Количество) DESC;
Конструкция <условие соединения:» расширяет возможности языка SQL при использовании в запросах нескольких отношений (таблиц):
<условие соединения> = <табл1> <тип соединения> Join <табл2> on <условие связи>, где <табл1>, <табл2> — связываемые отношения (таблицы);
<тип соединения> — определяет внешнее (левое — left и правое — right) или внутреннее (inner) соединение отношений (таблиц).
Внутреннее соединение включает в результирующее отношение (таблицу) только те кортежи (записи) обоих отношений (таблиц), для которых выполняется <условие связи>.
Рассмотрим внутреннее соединение на примере запроса: «Определить количество поставок каждым контрагентом из справочника». С использованием конструкции <условие соединения:» он представляется следующим образом:
SELECT НаимКонтрагента, Count(№накладной) AS Количество
FROM Контрагент LEFT JOIN Поставка ON Контрагент. КодКонтрагента = Поставка.КодКонтрагента GROUP BY Контрагент.НаимКонтрагента;
Внешнее левое соединение включает в результирующее отношение (таблицу) все кортежи (записи) левого отношения (таблицы). Из правого отношения (таблицы) в результат включаются только те кортежи (записи), для которых выполняется <условие связи>. В тех случаях, когда это условие не выполняется, вместо кортежей (записей) правого отношения (таблицы) в результат записываются значения NULL.
На этом обзор основных конструкций языка SQL завершается. Сложные SQL-запросы, а также ряд других параметров будут рассматриваться далее при решении конкретных задач в п. 3.4.5 и 3.4.6.