В.Н.Лукин. Базы данных. Конспект лекций, ред 3.51, 08.12.09
Начальные понятия
Язык, предназначенный для работы с реляционными базами данных – SQL (язык
структурных запросов – Structured Query Language) – был призван продемонстрировать
возможность эффективной работы с множествами, представленными отношениями.
Возможности языка должны быть достаточными для реализации всех операторов реля-
ционной алгебры. Язык должен быть непроцедурным – предполагалось, что таким об-
разом облегчается работа пользователя, не умеющего программировать.
Большинству этих задач разработанный язык отвечает, однако не всем и не в той
степени, как рассчитывали авторы. Во-первых, непонятно, какой смысл вкладывался в
термин «структурный». То, что получилось, имеет очень слабое отношение к устояв-
шемуся понятию «структурное программирование». Далее, может ли язык работать с
множествами? Да, и языковые средства для этого достаточно хороши. Однако об эф-
фективности, особенно на первых порах внедрения языка, следует говорить осторожно.
Первые реализации были столь громоздки, что при появлении СУБД на персональных
ЭВМ об SQL даже речи не было. Более того, в течение значительного периода времени
его считали умирающим языком и немного жалели о его гибели. Автору в это время
приходилось читать лекции по базам данных, на которых слушатели отдавали дань
уважения этому языку, но относились к нему как к исторической реликвии. Но все-таки
языку удалось устоять, чему в немалой степени способствовал рост производительно-
сти ЭВМ, а также более эффективные методы реализации языка. Кроме того, уже су-
ществовал большой контингент специалистов по базам данных, владеющим языком и,
что очень важно, действовал стандарт SQL.
Возвращаясь к оценке языка, заметим, что он действительно позволяет реализо-
вать все операторы реляционной алгебры, но форма представления заметно отличается
от алгебраических выражений. И, наконец, непроцедурность. В то время, когда созда-
вался язык, непроцедурные языки были очень модными. Считалось, что запись реше-
ния задач естественно представлять в виде непроцедурных соотношений, что избавля-
ло от необходимости перечислять в нужной последовательности действия, приводящие
к результату. Предполагалось, что любой постановщик задачи в состоянии сформули-
ровать, что же он хочет получить. Значит, если ему предоставить адекватный язык, он
сможет достаточно легко записать нужные соотношения. Практика показала, что это
далеко не так. Порой пользователь лучше объясняет, что он делает, чем зачем. Даже
для специалистов непроцедурность зачастую порождает значительные трудности, так
как сложный запрос к базе данных трудно понять и еще труднее отладить: он обычно
не делится на простые операторы. Да и переход от привычного процедурного языка к
непроцедурному тоже не так прост.
Стандарт ANSI
Как уже упоминалось, для языка SQL существует стандарт, на самом деле – серия по-
следовательных стандартов. В курсе лекций мы будем обращаться к стандарту ANSI.
Как всегда, промышленные реализации по разным причинам отклоняются от стандар-
тов, причем, не всегда в худшую сторону. Стандарт ANSI регламентирует не все осо-
бенности реализации языка, кроме того, есть распространенные, но не входящие в
стандарт варианты операторов. В подобных случаях будем приводить как версию стан-
дарта, так и промышленную.
Типы данных
Типы данных в различных версиях SQL могут заметно различаться, что связано с набо-
ром типов данных, принятом в конкретной СУБД. В стандарте ANSI рекомендуется
использовать символьные (например, CHAR, VARCHAR) и числовые (INT, DEC) типы
данных. В СУБД FoxPro используется широкий спектр типов данных (различные