Манипулирование+данными+в+SQL

Оператор SQL **SELECT**, предназначенного для выборки данных и имеет следующий синтаксис:

SELECT [ ALL | DISTINCT ] select_item_commalist FROM table_reference_commalist [ WHERE conditional_expression ] [ GROUP BY column_name_commalist ] [ HAVING conditional_expression ] [ ORDER BY order_item_commalist ]

Выборка данных производится из одной или нескольких таблиц, указываемых в разделе **FROM** запроса. В последнем случае на первом этапе выполнения оператора **SELECT** образуется одна общая таблица, получаемая из исходных таблиц путем применения операции расширенного декартова умножения. Таблицы могут быть как базовыми, реально хранимыми в базе данных (традиционными или типизированными), так и порожденными, т.е. задаваемыми в виде некоторого оператора **SELECT.** Это допускается, поскольку результатом выполнения оператора **SELECT** в его базовой форме является традиционная таблица. Кроме того, в разделе **FROM** можно указывать выражения соединения базовых и/или порожденных таблиц, результатами которых опять же являются традиционные таблицы. На следующем шаге общая таблица, полученная после выполнения раздела, подвергается фильтрации путем вычисления для каждой ее строки логического выражения, заданного в разделе **WHERE** запроса. В отфильтрованной таблице остаются только те строки общей таблицы, для которых значением логического выражения является //true//. Если в операторе отсутствует раздел **GROUP BY**, то после этого происходит формирование результирующей таблицы запроса путем вычисления выражений, заданных в списке выборки оператора **SELECT**. В этом случае список выборки вычисляется для каждой строки отфильтрованной таблицы, и в результирующей таблице появится ровно столько же строк. При наличии раздела **GROUP BY** из отфильтрованной таблицы получается сгруппированная таблица, в которой каждая группа состоит из кортежей отфильтрованной таблицы с одинаковыми значениями столбцов группировки, задаваемых в разделе **GROUP BY**. Если в запросе отсутствует раздел HAVING, то результирующая таблица строится прямо на основе сгруппированной таблицы. Иначе образуется отфильтрованная сгруппированная таблица, содержащая только те группы, для которых значением логического выражения, заданного в разделе **HAVING,** является //true//. Результирующая таблица на основе сгруппированной или отфильтрованной сгруппированной таблицы строится путем вычисления списка выборки для каждой группы. Тем самым, в результирующей таблице появится ровно столько строк, сколько групп содержалось в сгруппированной или отфильтрованной сгруппированной таблице. Если в запросе присутствует ключевое слово **DISTINCT**, то из результирующей таблицы устраняются строки-дубликаты, т.е. запрос вырабатывает не мультимножество, а множество строк. Наконец, в запросе может присутствовать еще и раздел **ORDER BY**. В этом случае результирующая таблица сортируется в порядке возрастания или убывания в соответствии со значениями ее столбцов, указанных в разделе **ORDER BY**. Результатом такого запроса является не таблица, а отсортированный список, который нельзя сохранить в базе данных. Сам же запрос, содержащий раздел **ORDER BY**, нельзя использовать в разделе **FROM** других запросов. Приведенная характеристика средств манипулирования данными языка SQL является не вполне точной и полной. Кроме того, она отражает //семантику// оператора SQL, а не то, как он обычно исполняется в SQL-ориентированных СУБД.