Лекции. Язык запросов SQL. 17 часов.
1 Язык запросов SQL
1.1 Введение в SQL(1-2)
1.1.1 Аннотация к лекции
Лекция представляет собой краткое введение в язык SQL.
Язык SQL является стандартным языком реляционных СУБД. Междуна-
родная организация стандартизации (ISO) и Американский национальный ин-
ститут стандартов (ANSI) уже более двадцати лет ведут работы по поддержа-
нию стандарта этого языка, и практически все современные реляционные СУБД используют его в качестве языка интерфейса пользователей с базами данных.
Таким образом, знание SQL открывает путь к успешному освоению и ис-
пользованию практически любой современной реляционной СУБД.
Цели лекции:
раскрыть значение и вклад языка SQL в развитие современных реляци-
онных БД;
познакомить слушателя с историей развития языка SQL;
перечислить основные возможности языка SQL;
перечислить основные понятия языка SQL (ключевые слова, предложе-
ния, типы данных и т.д.).
1.1.2 Краткая история развития SQL
Первая публикация описания языка SQL относится к 1974 году, когда в ис-
следовательской лаборатории компании IBM в штате Калифорния была разра-
ботана его первая версия, используемая в экспериментальной реляционной СУБД System/R. В то время язык назвали SEQUEL (Structured English Query Language — структурированный английский язык запросов). Затем язык был переименован в SQL. Исследовательский проект System/R был завершен в 1979
году. Он подтвердил возможность создания эффективных промышленных ре-
ляционных СУБД. (Андон Ф., 2006).
В 1977 г. фирмой Oracle балы выпущена промышленная реляционная СУБД с одноименным названием. С тех пор фирма Oracle является крупней-
шим поставщиком реляционных СУБД на базе SQL.
2
Одновременно с этим в середине 70-х годов в исследовательской лабора-
тории Калифорнийского университета в Беркли был открыт проект по созда-
нию экспериментальной реляционной СУБД, получившую название Ingress, на которой отрабатывались результаты научных исследований в области реляци-
онных БД. Затем в 1981 г. была выпущена промышленная версия СУБД Ingres.
Затем в 1986 г. СУБД Ingres была переведена на SQL.
В 1980 году компания IBM на основании опыта, полученного при разра-
ботке экспериментальной System/R, приступила к созданию собственной про-
мышленной СУБД реляционного типа, которая начала поставляться в 1982 году под названием SQL/DS. Затем в компании был разработан более совершенный продукт - DB2, поставки которого начались в 1985 году. Эта СУБД стала стра-
тегическим программным продуктом компании IBM. (Андон Ф., 2006)
Ксередине 80-х годов SQL уже общепризнан как язык реляционных СУБД, а его диалект, поддерживаемый СУБД DB2, фактически стал стандартом для управления реляционными базами данных. К этому времени реляционные базы данных господствовали среди СУБД других типов и считались основной технологией баз данных будущего.
Кначалу 80-х годов в связи с широким распространением реляционных СУБД появилась необходимость анализа возможной стандартизации языка для управления реляционными базами данных и разработки такого стандарта, если это будет признано целесообразным.
В с связи с широким распространением реляционных СУБД 1982 году американским национальным институтом стандартов (American National Standards Institute — ANSI) был создан специальный комитет (X3H2), перед которым была поставлена задача разработки стандарта языка для управления реляцион-
ными базами данных. Учитывая широкую распространенность SQL в промыш-
ленных СУБД и тот факт, что он фактически уже стал стандартом к тому вре-
мени, комитет остановился на этом языке. Взяв за основу его диалект, реализо-
ванный в СУБД DB2, комитет постарался его обобщить, учитывая реализован-
ные в других реляционных СУБД возможности. После четырех лет работы,
3
в 1986 году предложенный комитетом вариант SQL был официально утвержден как стандарт ANSI. В 1987 году он был принят в качестве стандарта Международной организацией стандартов (International Standards Organization
— ISO). Затем стандарт ANSI/ISO приняло правительство США как федераль-
ный стандарт в области обработки информации (Federal Information Processing Standard — FIPS). В 1989 году стандарт был незначительно изменен и получил название SQL-89 (или SQL1). (Андон Ф., 2006)
В 1992 году ANSI принял новый стандарт, который был назван SQL-92 (или SQL2). Далее комитет приступил к решительным изменениям в SQL, ко-
торые отразились в стандарте SQL-99 (или SQL3). Наконец, в 2003 году был опубликован последний стандарт — SQL-2003.
1.1.3 Возможности языка
В начале 70-х годов SQL являлся лишь языком запросов (ЯЗ). Он, по сути,
содержал только предложение SELECT, которое позволяло формулировать за-
просы для выборки данных из базы. Затем язык был дополнен двумя другими компонентами, необходимыми для работы с базами данных. Первый из них — средства для определения структуры базы данных, которые в терминологии теории баз данных называются языком определения данных (ЯОД). Второй — средства, позволяющие заполнять базу данными, изменять их и удалять. Этот компонент в теории баз данных называется языком манипулирования данными
(ЯМД). Также было принято решение, что весь интерфейс с базами данных должен обеспечиваться одним языком, вследствие чего SQL оброс множеством функций, необходимых для управления базами данных.
Основные возможности:
определение, переопределение и удаление таблиц базы данных и других
ееобъектов (доменов, представлений, индексов и т. д.);
указание физической организации данных;
поддержка ограничений целостности и непротиворечивости БД;
защита данных от несанкционированного доступа;
4
манипулирование данными в таблицах БД, включая вставку, изменение
иудаление значений;
поиск данных в нескольких таблицах и упорядочение полученных ре-
зультатов;
организация резервного копирования и восстановления БД;
поддержка целостности транзакций;
поддержка пользовательских процедур и функций, расширяющих
функциональные возможности SQL.
SQL существует в двух формах:
в интерактивном SQL пользователь непосредственно вводит команды и получает результат;
команды встроенного SQL включаются в тексты программ на других языках; в этом случае обращение к базе данных, а также обработка результатов производится этими программами.
1.1.4 Основы SQL
Язык SQL является нечувствительным к регистру букв. Все его фразы и выражения могут быть написаны как прописными, так и строчными буквами.
Например:
Пример 1
SELECT Номер, Наименование
FROM Товыры
WHERE Наименование = 'ШОКОЛАД';
Однако этот же запрос можно записать следующим образом:
Select Номер, Наименование from Товыры
where Наименование = ‘ШОКОЛАД’;
Строки символов, ссылающиеся на данные, необходимо записывать в та-
ком же виде, в каком они были введены в базу (см пример 1 – литерал ‘Масло’,
имена таблиц и столбцов).
5
Второе синтаксическое правило заключается в следующем — в любом ме-
сте, где согласно синтаксису языка должен стоять пробел, можно использовать любое количество пробелов и табуляций, а также начинать новую строку.
Например, предыдущий запрос может быть записан и так:
Пример 2
SELECT Номер, Наименование FROM Товыры WHERE Наименование =
'ШОКОЛАД';
При описании языка мы будем часто пользоваться такими понятиями, как
ключевые слова, фразы и предложения.
Ключевое слово — слово, которое в SQL зарезервировано для специально-
го использования и является частью его синтаксиса. В приведенных выше при-
мерах ключевыми словами являются «Select Номер, Наименование». В зависи-
мости от предложения SQL ключевое слово может быть обязательным или не обязательным.
Фраза — часть предложения SQL, имеющая самостоятельный смысл, но не имеющая возможности независимой интерпретации. Любая фраза обязательно включает в себя ключевое слово, по которому она и называется, а также другие конструкции языка. Примером фразы может быть «Select Номер, Наименова-
ние». Она называется фразой SELECT. Другой пример — фраза «where Наиме-
нование = ‘ШОКОЛАД’», которая называется фразой WHERE.
Предложение (команда) — конструкция SQL, которая имеет возможность самостоятельной интерпретации. Предложения SQL состоят из фраз, одна из которых считается базовой и по ее имени называется предложение. Примером предложения является «SELECT Номер, Наименование FROM Товыры WHERE
Наименование = 'ШОКОЛАД';» Оно состоит из трех фраз: SELECT, FROM и WHERE. Базовой в этом предложении является фраза SELECT, поэтому и предложение называется предложением SELECT.
6
1.1.5 Типы данных SQL
Типы данных SQL.
Категория |
Описание |
Тип |
|
|
|
Строковые типы |
Строка символов постоянной длины |
CHAR (количество_символов) |
|
Строка символов переменной длины |
VARCHAR (количество_символов) |
|
Большая строка символов перемен- |
CLOB |
|
ной длины |
|
|
Большой двоичный |
BLOB |
|
объект переменной |
|
|
длины |
|
Числовые точные |
Целое число |
INTEGER | INT |
типы |
|
|
Целое число. Количество разрядов |
BIGINT |
|
|
больше или равно INTEGER |
|
|
Целое число. Количество разрядов |
SMALLINT |
|
меньше или равно INTEGER |
|
|
Число с фиксированной запятой |
{NUMERIC | DECIMAL | DEC} |
|
(количество_разрядов – общее число |
(кол-во разрядов, масштаб) |
|
знаков, масштаб — знаков после за- |
|
|
пятой) |
|
Числовые неточ- |
Число с плавающей запятой |
REAL |
ные типы |
|
|
Число с плавающей запятой. Коли- |
DOUBLE PRECISION |
|
|
чество разрядов больше или равно |
|
|
REAL |
|
|
Число с плавающей запятой |
FLOAT (кол-во разрядов) |
Временные типы |
Дата. Содержит год, месяц и день |
DATE |
|
Временная отметка. Содержит год, |
TIMESTAMP (масштаб) |
|
месяц, день, час, минуты и секунды |
|
|
Время. Содержит час, минуты и се- |
TIME (масштаб) |
|
кунды (масштаб — количество |
|
|
знаков в дробной части секунд). |
|
|
Возможно указание временной зоны |
|
|
Временной промежуток. |
INTERVAL |
Логический тип |
Принимает логические значения |
BOOLEAN |
1.1.6 Литералы
Литералы – это простейшие выражения, являющиеся значениями соответ-
ствующих типов. Каждый тип данных имеет способ представления литералов своего типа. В SQL имеются следующие литералы:
символьных строк (пример: 'Символьная строка'),
двоичных строк (пример: X'1AFFD561'),
7
чисел (примеры: 27 -863 0.173 .8582 -9572.5619 11.54Е7 .94Е194 93Е-12 - 29.629Е27),
временные (DATE '2005-12-07' TIME 'HH:MI:SS' TIMESTAMP 'YYYY- MM-DD HH:MI:SS'),
логические (TRUE, FALSE, UNKNOWN).
1.1.7 Операторы и выражения
Операторы — это конструкции языка, указывающие операции над эле-
ментами данных и возвращающие в качестве результата новое значение. Эле-
менты данных, используемые в операторах, называются операндами или аргу-
ментами. Операторы представляются в виде специальных символов или ключе-
вых слов. Например, оператор умножения представляется звездочкой (*), а
оператор проверки на неопределенное значение — ключевым словом IS NULL.
Есть два основных вида операторов. Унарные имеют только один операнд и обычно представляются в следующем формате:
операнд оператор
Бинарные оперируют двумя операндами и представляются таким образом:
операнд оператор операнд
Кроме того, существуют специальные операторы, использующие более двух операндов. Тип оператора определяется типом используемых аргументов
итипом возвращаемого результата. Имеются операторы следующих типов:
строковые (||);
арифметические;
логические;
предикаты сравнения;
специальные предикаты;
операторы над множествами (таблицами).
1.1.8 Именование объектов
В соответствии со стандартом SQL, имена объектов базы данных могут со-
стоять из прописных и строчных букв латинского алфавита, цифр и символа подчеркивания (_), причем первым символом должна быть буква. Если нужно
8
использовать имя, не отвечающее указанным правилам, его следует заключать в двойные кавычки.
Однако многие СУБД расширяют набор допустимых символов, включая в них, например, символы национальных алфавитов.
1.1.9 Комментарии
В текстах на языке SQL можно использовать комментарии, которые предо-
ставляют возможность указывать авторство, приводить объяснения и любую другую полезную информацию. Комментарий может содержать любые печата-
емые символы. На выполнение команд SQL комментарии не влияют и могут располагаться между ключевыми словами, параметрами и в любом другом ме-
сте, где в соответствии с правилами языка должен быть разделитель.
Имеются два типа комментариев:
многострочный начинается с символов /*, за которыми следует одна или несколько строк комментария, и завершается символом *;
однострочный располагается в конце строки и начинается с символов -- за которыми следует текст комментария.
Предложение SQL может содержать комментарии обоих типов.
1.1.10 Итоги лекции
На лекции студенты изучили:
краткую историю развития SQL;
основные возможности SQL;
основные синтаксические правила SQL;
понятия ключевое слово, фраза и предложение;
типы данных SQL;
правила написания литералов;
операторы и выражения SQL;
правила именования объектов;
использование комментариев.
9
1.2 Простейшие запросы (3-4)
1.2.1 Аннотация к лекции
В этой лекции мы приступаем к изучению возможностей SQL по выборке данных из базы. В подавляющем большинстве случаев SQL используют именно для поиска информации в базе, а не для чего-нибудь другого. В этой лекции мы начнем с самых простых возможностей и последовательно переходя к все более сложным конструкциям в следующих лекциях, мы изучим практически все ука-
занные в стандарте SQL средства поиска и выборки данных.
Что мы будем подразумевать под словом «запрос»? Запрос – это команда,
которой вы сообщаете СУБД, что она должна найти и показать определенную информацию из базы данных. Эта информация обычно посылается непосред-
ственно на экран компьютера, хотя в большинстве случаев ее можно также по-
слать на принтер, сохранить в файле, представить как исходную информацию для другой команды или процесса или вернуть назад в программу, из которой было инициировано выполнение запроса.
1.2.2 О предложении SELECT
Все запросы в SQL состоят из единственной команды или, как принято го-
ворить в SQL, предложения. Структура этого предложения проста, элегантна,
однако оно обладает внушительными возможностями по выборке данных из ба-
зы. Это предложение называется SELECT. По отношению к нему мы также бу-
дем применять термин «команда», подразумевая, что это предложение выпол-
няет определенные действия. Предложение SELECT может состоять из многих фраз и в упрощенном виде имеет следующий синтаксис:
SELECT {* | [DISTINCT | ALL] список_выражений_выбора} [INTO список переменных]
FROM список_спецификаций_таблиц
[WHERE условие]
[GROUP BY список_выражений_группировки [HAVING групповое_условие]] [ORDER BY список_выражений_упорядочения];
10