Все СУБД, претендующие на название "реляционные", реализуют тот или иной диалект SQL. Многие нереляционные системы также имеют в настоящее время средства доступа к реляционным данным. Целью стандартизации является переносимость приложений между различными СУБД. Нужно заметить, что в настоящее время, ни одна система не реализует стандарт SQL в полном объеме. Кроме того, во всех диалектах языка имеются возможности, не являющиеся стандартными. Таким образом, можно сказать, что каждый диалект - это надмножество некоторого подмножества стандарта SQL. Это затрудняет переносимость приложений, разработанных для одних СУБД в другие СУБД. Язык SQL оперирует терминами, несколько отличающимися от терминов реляционной теории, например, вместо "отношений" используются "таблицы", вместо "кортежей" - "строки", вместо "атрибутов" - "колонки" или "столбцы". Стандарт языка SQL, хотя и основан на реляционной теории, но во многих местах отходит он нее. Например, отношение в реляционной модели данных не допускает наличия одинаковых кортежей, а таблицы в терминологии SQL могут иметь одинаковые строки. Имеются и другие отличия. Язык SQL является реляционно полным. Это означает, что любой оператор реляционной алгебры может быть выражен подходящим оператором SQL. Оператор SELECT является фактически самым важным для пользователя и самым сложным оператором SQL. Он предназначен для выборки данных из таблиц, т.е. он, собственно, и реализует одно их основных назначение базы данных - предоставлять информацию пользователю. Оператор SELECT всегда выполняется над некоторыми таблицами, входящими в базу данных. Замечание. На самом деле в базах данных могут быть не только постоянно хранимые таблицы, а также временные таблицы и так называемые представления. Представления - это просто хранящиеся в базе данные SELECT-выражения. С точки зрения пользователей представления - это таблица, которая не хранится постоянно в базе данных, а "возникает" в момент обращения к ней. С точки зрения оператора SELECT и постоянно хранимые таблицы, и временные таблицы и представления выглядят совершенно одинаково. Конечно, при реальном выполнении оператора SELECT системой учитыва-ются различия между хранимыми таблицами и представления-ми, но эти различия скрыты от пользователя. Результатом выполнения оператора SELECT всегда является таблица. Таким образом, по результатам действий оператор SELECT похож на операторы реляционной алгебры. Любой оператор реляционной алгебры может быть выражен подходящим образом сформулированным оператором SELECT. Сложность оператора SELECT определяется тем, что он содержит в себе все возможности реляционной алгебры, а также дополнительные возможности, которых в реляционной алгебре нет. Синтаксис оператора выборкиВ довольно сильно упрощенном виде оператор выборки данных имеет следующий синтаксис (для некоторых элементов мы дадим не BNF-определения, а словесное описание): Оператор выборки ::=Табличное выражение[ORDER BY{{Имя столбца-результата [ASC | DESC]} | {Положительное целое [ASC | DESC]}}.,..]; Табличное выражение ::=Select-выражение[{UNION | INTERSECT | EXCEPT} [ALL]{Select-выражение | TABLE Имя таблицы | Конструктор значений таблицы}] Select-выражение ::=SELECT [ALL | DISTINCT]{{{Скалярное выражение | Функция агрегирования | Select-выражение} [AS Имя столбца]}.,..}| {{Имя таблицы|Имя корреляции}.*}| *FROM {{Имя таблицы [AS] [Имя корреляции] [(Имя столбца.,..)]}| {Select-выражение [AS] Имя корреляции [(Имя столбца.,..)]}| Соединенная таблица }.,..[WHERE Условное выражение][GROUP BY {[{Имя таблицы|Имя корреляции}.]Имя столб-ца}.,..][HAVING Условное выражение]