Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 2002.doc
Скачиваний:
44
Добавлен:
15.06.2014
Размер:
335.36 Кб
Скачать

Синтаксис языка sql с использованием языка Бэкуса-Наура.

  1. SELECT

Оператор выборки::=

табличное выражение [ORDER BY

{{ имя_столбца_результата [ASC | DESC]}|

|{положительное_целое [ASC | DESC]}},…];

табличное выражение::=

select_выражение

[{select_выражение | TABLE имя_таблицы |

| конструктор_значений_таблицы}]

select-выражение::=

SELECT [ALL | DISTINCT]

{{{скалярное_выражение | функция_агрегирования |

| select_выражение} [AS имя_столбца]},…} |

{{имя_таблицы | имя_корреляции}.*} | *

FROM

{{имя_таблицы [AS][имя_корреляции]

[(имя_столбца,…)]} |

{select_выражение [AS] имя_корреляции

[(имя_столбца,…)]} |

соединенная_таблица},…

[WHERE условное_выражение]

[GROUP BY [{{имя_таблицы |

имя_корреляции}.имя_столбца},…]

[HAVING условное_выражение]

Замечание

Select-выражение в разделе SELECT должно обязательно возвращать скалярное выражение (т.е. имя столбца таблицы, простые функции, возвращающие скалярное выражение, либо константа (не всегда)).

Условное выражение после WHERE должно вычисляться для каждой строки, являющейся кандидатом в результирующее множество строк. В условном выражении могут использоваться подзапросы.

Раздел HAVING содержит условное выражение, вычисляемое для каждой группы, определяемой списком группировки в разделе GROUP BY. Это условное выражение может содержать функции агрегирования, вычисляемые для каждой группы.

Условное выражение, сформулированное в разделе WHERE, может быть перенесено в раздел HAVING (обратное не возможно, если условное выражение содержит агрегатную функцию).

Если в разделе SELECT присутствуют агрегатные функции, то они вычисляются по-разному, в зависимости от раздела GROUP BY.

Пример:

  1. SELECT AVG (SALARY) FROM EMPLOYEE

  2. SELECT AVG (SALARY) FROM EMPLOYEE

GROUP BY DEPTNO, AVG (SALARY)

В первом случае будет одна строка, а во втором — множество строк, сгруппированных по номеру отдела.

Функция агрегирования::=

COUNT (*) | {{COUNT | MAX | MIN | SUM | AVG}

([ALL | DISTINCT] скалярное_выражение)}

конструктор значений таблицы::=

VALUES конструктор_значений_строки

конструктор_значений_строки::=

элемент_конструктора | (элемент_конструктора,…) |

select_выражение

Замечание

Select-выражение, используемое в конструкторе значений строки должно возвращать только одну строку.

элемент_конструктора::=

выражение | NULL | DEFAULT

соединенная таблица::=

перекрестное_соединение | естественное_соединение |

соединение_посредством_предикатов| соединение_посредством_имен_столбцов| соединение_объединение

тип соединения::=

INNER | LEFT[OUTER] | RIGHT[OUTER] |

FULL[OUTER]

Перекрестное соединение::=

Таблица A CROSS JOIN таблица В

Естественное соединение::=

Таблица А [NATURAL][тип_соединения] JOIN таблицаВ

Соединение посредством предиката::=

Таблица А [тип_соединения] JOIN таблица В

ON предикат

Соединение при помощи имен столбцов::=

Таблица А [тип_соединения] JOIN таблицы В

USING (имя_столбца,…)

Соединение объединения::=

Таблица А UNION JOIN таблица В

CROSS JOIN возвращает декартово произведение таблиц. Такое соединение в разделе FROM может быть заменено списком таблиц через запятую.

NATURAL JOIN производит соединение по всем столбцам А и В. В результирующей таблице одинаковые столбцы присутствуют только один раз.

JOIN...ON посредством предиката соединяет строки таблиц А и В.

JOIN..USING – соединение посредством общих имен столбцов таблиц А и В, которые указаны в списке USING.

Типы соединений:

OUTER — (внешний) необязательное ключевое слово. Не используется ни в каких операциях с данными.

INNER — (внутренний) используется по умолчанию, когда тип явно не задан. В таблицах А и В соединяются только те строки, в которых найдены совпадения.

LEFT OUTER — (левое внешнее) левое соединение таблиц А и В включает в себя все строки из левой таблицы А и только те строки из правой таблицы В, для которых обнаружены совпадения. Для строк из таблицы А, для которых не найдены совпадения из строк таблицы В, в столбцы, извлекаемые из таблицы В, заносятся NULL-значения.

RIGHT OUTER — (правое внешнее) правое соединение таблиц А и В включает в себя все строки из правой таблицы В и только те строки из левой таблицы А, для которых обнаружены совпадения. Для строк из таблицы В, для которых не найдены совпадения из строк таблицы А, в столбцы, извлекаемые из таблицы А, заносятся NULL-значения.

FULL OUTER — (полное внешнее) комбинация левого и правого соединения. В полное соединение включаются все строки из обеих таблиц. Для совпадающих строк поля заполняются реальными значениями, а для несовпадающих строк поля заполняются в соответствии с правилами левого и правого соединения.

UNION JOIN — соединение, обратное к внутреннему соединению. Включает только те строки из таблиц А и В, для которых не найдены совпадения. В них используется NULL-значение для столбцов, полученных из другой таблицы. Альтернативой является полное внешнее соединение с удалением строк, полученных в результате внутреннего соединения.

Условное выражения включает следующие предикаты: сравнение, between, in, like, null, exist, unique, match, overlaps, количественное сравнение.

Лекция №14 (23.05.02)