Язык SQL – Structured Query Language – был разработан в 1974 г. в ходе работы над System R. В период становления технологий баз данных SQL был не единственным и, возможно, не самым лучшим языком запросов реляционных баз данных, но со временем стал стандартом в этой области. Такая "победа" языка SQL обусловлена, во-первых, ориентацией на него первых и ведущих производителей коммерческих СУБД, во-вторых, тем, что уже в своей версии для System R он был достаточно хорошо развит не только как язык запросов, но и обеспечивал в полном объеме описание и управление данными. Коммерческие продукты далеко не сразу обеспечили свойства исходной версии SQL в полном объеме.
SQL является реляционно-полным языком в том смысле, что он обеспечивает все операции реляционной алгебры. Но вместе с тем, в самих концепциях SQL есть и некоторые отступления от реляционной теории. Нельзя строго говорить, что SQL основывается на реляционной алгебре или реляционном исчислении. По нашему субъективному впечатлению, в нем больше от реляционной алгебры, но некоторые свойства SQL напрямую происходят из реляционного исчисления.
Разработкой стандартов языка SQL занимается Американский национальный комитет по стандартизации (ANSI) при поддержке Международной Организации Стандартов (ISO). Стандарты SQL принимались в 1987 г. (уточнен в 1989 г.), в 1992 г и в 1999 г. Однако даже ведущие СУБД сертифицированы только на уровень "Entry" стандарта SQL-92. В реальных СУБД применяются "диалекты" SQL. Процесс стандартизации динамичный и трудный – то, что сегодня является диалектом одной СУБД, завтра может стать стандартом. Язык SQL состоит из трех подмножеств:
- языка определения данных;
- языка манипулирования данными;
- языка управления данными.
Различия в диалектах разных СУБД для этих подмножеств незначительны. Язык управления данными более подвержен диалектным различиям.
Предложение SELECT
Все запросы на получение данных из одной или нескольких таблиц выполняются с помощью единственного предложения SELECT. Результатом предложения SELECT является другая таблица.
Предложение SELECT может использоваться как:
- самостоятельная команда на получение и вывод строк таблицы, сформированной из столбцов и строк одной или нескольких таблиц
- элемент WHERE- или HAVING-условия ("вложенный запрос");
- фраза выбора в командах CREAT VIEW, DECLARE CURSOR или INSERT;
- средство присвоения глобальным переменным значений из строк сформированной таблицы (INTO-фраза).
Здесь будут рассмотрены только две первые функции предложения SELECT.
Предложение SELECT (выбрать) имеет следующий формат:
подзапрос [UNION [ALL] подзапрос] ...
[ORDER BY {[таблица.]столбец | номер_элемента_SELECT} [[ASC] | DESC]
[,{[таблица.]столбец | номер_элемента_SELECT} [[ASC] | DESC]] ...;
и позволяет объединить (UNION) а затем упорядочить (ORDER BY) результаты выбора данных, полученных с помощью нескольких "подзапросов". При этом упорядочение можно производить в порядке возрастания - ASC или убывания - DESC
Подзапрос позволяет указать условия для выбора нужных данных и (если требуется) их обработки
- SELECT(выбрать) данные из указанных столбцов и (если необходимо) выполнить перед выводом их преобразование в соответствии с указанными выражениями и (или) функциями
- FROM(из) перечисленных таблиц, в которых расположены эти столбцы
- WHERE(где) строки из указанных таблиц должны удовлетворять указанному перечню условий отбора строк
- GROUP BY(группируя по) указанному перечню столбцов с тем, чтобы получить для каждой группы единственное агрегированное значение, используя во фразе SELECT SQL-функции SUM(сумма), COUNT(количество), MIN(минимальное значение), MAX(максимальное значение) или AVG(среднее значение)
- HAVING(имея) в результате лишь те группы, которые удовлетворяют указанному перечню условий отбора групп
Подзапрос имеет формат
SELECT [ DISTINCT]{ * | элемент_SELECT [,элемент_SELECT] ...}
FROM {базовая_таблица | представление} [псевдоним]
[,{базовая_таблица | представление} [псевдоним]] ...
[WHERE фраза]
[GROUP BY фраза [HAVING фраза]];
Синтаксис выражений имеет вид
( {[ [+] | - ] {значение | функция_СУБД} [ + | - | * | ** ]}... )
а синтаксис SQL_функций - одна из следующих конструкций:
{SUM|AVG|MIN|MAX|COUNT} ( [[ALL]|DISTINCT][таблица.]столбец )
{SUM|AVG|MIN|MAX|COUNT} ( [ALL] выражение )
COUNT(*)
Фраза WHERE включает набор условий для отбора строк:
WHERE [NOT] WHERE_условие [[AND|OR][NOT] WHERE_условие]...
где WHERE_условие - одна из следующих конструкций:
значение { = | | | >= } { значение | ( подзапрос ) }
значение_1 [NOT] BETWEEN значение_2 AND значение_3
значение [NOT] IN { ( константа [,константа]... ) | ( подзапрос ) }
значение IS [NOT] NULL
[таблица.]столбец [NOT] LIKE 'строка_символов' [ESCAPE 'символ']
EXISTS ( подзапрос )
Нетрадиционные условия отбора: BETWEEN (между), LIKE (похоже на), IN (принадлежит), IS NULL (не определено) и EXISTS (существует). В условиях могут употребляться логические операции: NOT, AND, OR.
Cинтаксис фразы GROUP BY имеет вид
GROUP BY [таблица.]столбец [,[таблица.]столбец] ...
[HAVING фраза]
GROUP BY инициирует перекомпоновку формируемой таблицы по группам, каждая из которых имеет одинаковое значение в столбцах, включенных в перечень GROUP BY. Далее к этим группам применяются агрегирующие функции, указанные во фразе SELECT. С помощью фразы HAVING, синтаксис которой:
HAVING _условие [[AND|OR][NOT] HAVING_условие]...
можно исключить из результата группы, не удовлетворяющие заданным условиям.