- •Язык запросов sql
- •Общие сведения
- •Insert - запрос на добавление;
- •Инструкция select
- •Синтаксис select
- •Расширения инструкции select в access
- •Порядок выполнения выборки
- •Управление списком выбора
- •Указание источника данных
- •Применение реляционных операторов
- •Применение булевых операторов
- •Обработка неопределенных значений
- •Сортировка данных
- •Вычисление агрегатных функций
- •Группировка данных
- •Ограничение для групп данных
- •Выборка из нескольких таблиц
- •Соединение отношений
- •Выборка из нескольких таблиц
- •Соединение отношений
- •Запрос с соединением, использующий from и where
- •Запрос с соединением join
- •Запрос с соединением, использующий from и where
- •Запрос с соединением join
- •Операции с таблицами
- •Изменение структуры таблицы
- •Удаление таблицы
- •Действия со строками
- •Вставка строк в таблицу
- •Изменение данных в таблице
- •Удаление данных из таблицы
- •Инструкция transform
- •In ("Физика", "Математика");
- •Глава 5 Работа с формами
-
SELECT - запрос на выборку;
-
Insert - запрос на добавление;
-
UPDATE - запрос на обновление;
-
DELETE - запрос на удаление.
Наиболее важной и часто используемой инструкцией является SELECT. Изучению особенностей ее применения будет посвящен следующий раздел.
Инструкция select
Запросы обычно рассматриваются как часть языка DML. Однако так как запрос представляет собой довольно емкий по информации раздел, среди команд DML его можно выделить как самостоятельную категорию.
С помощью команды SELECT осуществляется не только операция реляционной алгебры - «выборка» данных, - но и предварительное соединение двух и более таблиц.
Синтаксис select
Код SELECT - это наиболее сложное и мощное средство SQL. Обобщенный синтаксис этого оператора имеет вид (в квадратных скобках указаны необязательные параметры; символом «|» разделены фрагменты команды, из которых выбирается только один):
SELECT selectionjist
FROM table_name [table_alias] [,...n]
[WHERE condition [,...n]]
[GROUP BY groupjist]
[HAVING condition [,...n]]
[ORDER BY sortingjist [ASC | DESC]]
[WITH OWNERACCESS OPTION]; где: selectionjist - список выбора, в котором могут быть указаны выбираемые имена столбцов или выражения;
column alias - псевдоним столбца, отображаемый в результирующей таблице;
table name - имя одной либо нескольких таблиц, участвующих в операции выборки данных;
table alias - псевдоним таблицы, который можно использовать при указании условий выборки;
condition - условие выборки данных, налагающее ограничение на извлекаемые данные;
groupjist - список группировки извлекаемых данных;
HAVING condition - условие, налагаемое на группируемые данные;
sortingjist - список для выполнения сортировки выбранных данных;
WITH OWNERACCESS OPTION - используется при многопользовательском доступе к базе данных для предоставления дополнительных прав.
Примечание. Порядок предложений в операторе SELECT должен строго соблюдаться и следовать той очередности операторов, которая указана в синтаксисе команды, иначе это приведет к появлению ошибок.
Расширения инструкции select в access
По сравнению со стандартом SQL3, в Access реализованы следующие расширения синтаксиса инструкции SELECT:
-
предложение IN - позволяет указать имена полей перекрестного запроса (или установить связь с удаленной БД);
-
ключевое слово DISTINCTROW - используется для создания выборки строк с уникальными значениями первичных ключей в таблицах-источниках;
-
инструкция TRANSFORM - служит для создания перекрестного запроса;
-
инструкция INTO - предназначена для создания новых элементов БД из результатов запроса;
-
ключевое слово ТОР - используется для вывода нескольких первых элементов, результатов запроса;
-
операция UNION - служит для объединения результатов нескольких запросов или таблиц.
Порядок выполнения выборки
Чтобы показать, как формируется результат выполнения оператора SELECT, рассмотрим схему его выполнения. Эта схема является концептуальной, потому что результат будет именно таким, как если бы он выполнялся шаг за шагом в соответствии с этой схемой. Необходимо также отметить, что получение результата определяется теми алгоритмами, согласно которым действует конкретная СУБД.
Выполнение оператора SELECT условно подразделяется на несколько шагов.
Шаг 1 выполняется на уровне предложения FROM. Вычисляется прямое декартово произведение всех таблиц, указанных в обязательном разделе FROM. В результате получается обобщающая таблица ТаЫе_1.
Шаг 2 задается условиями, которые определены в предложении WHERE. Если в операторе SELECT присутствует раздел WHERE, то сканируется таблица ТаЫе_1, полученная при выполнении первого шага. При этом для каждой строки из этой таблицы вычисляется условное выражение, указанное в предложении WHERE. Строка включается в результат, если для нее условное выражение возвращает значение ИСТИНА. Если в условном выражении участвуют вложенные подзапросы, то они вычисляются в соответствии с такой же концептуальной схемой. В результате шага 2 получаем таблицу ТаЫе_2. Если предложение WHERE отсутствует, то осуществляется переход к шагу 3 (принимается, что ТаЫе_1 -> ТаЫе_2 без изменений).
Шаг 3 определяется предложением GROUP BY. Если присутствует раздел GROUP BY, то строки таблицы ТаЫе_2, полученной на втором шаге, группируются в соответствии со списком группировки раздела GROUP BY. В результате выполнения третьего шага получаем таблицу ТаЫе_3. Если же данный раздел опущен, то
5-8301
выполняется переход к шагу 4 (принимается, что ТаЫе_2 -> ТаЫе_3 без изменений).
Шаг 4 выполняется на уровне раздела HAVING. Если этот раздел присутствует, то группы, не удовлетворяющие заданному в нем условному выражению, исключаются. В результате шага 4 образуется таблица ТаЫе_4. Если раздел HAVING опущен, то идет переход к следующему шагу (принимается, что ТаЫе_3 -> ТаЫе_4 без изменений).
Шаг 5 определяется на уровне оператора SELECT. Каждая группа, полученная на четвертом шаге, генерирует одну строку результата следующим образом. Вычисляются все скалярные выражения, указанные в разделе SELECT, причем они должны быть одинаковыми для всех строк внутри каждой группы. Для каждой группы вычисляются значения агрегатных функций, приведенных в разделе SELECT. Если раздел GROUP BY отсутствует, но в SELECT есть агрегатные функции, то считается, что имеется всего одна группа. Если нет ни раздела GROUP BY, ни агрегатных функций, то считается, что имеется столько групп, сколько строк отобрано к данному моменту.
В результате пятого шага образуется таблица ТаЫе_5, содержащая столько столбцов, сколько элементов приведено в списке выбора SELECT, и столько строк, сколько отобрано групп.
Шаг 6 выполняется на уровне раздела ORDER BY. Если в операторе SELECT присутствует этот раздел, то строки таблицы ТаЫе_5, полученной на предыдущих шагах, упорядочиваются в соответствии со списком, приведенным в данном разделе.
Если рассмотреть приведенный выше концептуальный алгоритм вычисления результата оператора SELECT, то можно прийти к выводу, что выполнение его непосредственно в таком виде чрезвычайно громоздко. Например, если бы на первом шаге вычислялось декартово произведение таблиц, указанных в отношении FROM, системе пришлось бы обрабатывать таблицу огромных размеров, причем большинство строк и столбцов отбрасывалось бы из нее уже на последующих шагах.
На самом деле в реляционных СУБД имеется оптимизатор, основным предназначением которого является нахождение такого оптимального алгоритма выполнения запроса, который гарантирует получение правильного результата. Работу этого оптимизатора можно представить в виде последовательности нескольких шагов:
-
Выполнение синтаксического анализа. На этом шаге определяется, правильно ли с точки зрения синтаксиса SQL сформулирован запрос. В ходе выполнения анализа вырабатывается некоторое внутреннее представление запроса, используемое на последующих шагах.
-
Преобразование запроса в каноническую форму. При преобразовании к канонической форме используются как синтаксические, так и семантические преобразования. Синтаксические преобразования позволяют получить новое внутреннее представление запроса, синтаксически эквивалентное исходному запросу и адаптированное к требованиям СУБД. Семантические преобразования используют дополнительные знания, которыми владеет система, например ограничения целостности. В результате семантических преобразований получается запрос, синтаксически не эквивалентный исходному запросу, но дающий тот же самый результат.
-
Генерация оптимизатором планов выполнения запроса и выбор оптимального плана. Каждый план выполнения строится как комбинация низкоуровневых процедур доступа к данным таблиц. Из всех сгенерированных планов выбирается тот, который обладает минимальной стоимостью. При этом анализируются сведения о наличии у таблиц индексов, статистические данные о распределении значений в таблицах и т.п. Стоимость плана - это, как правило, сумма стоимостей выполнения отдельных низкоуровневых процедур, которые используются для его реализации. В стоимость выполнения отдельной процедуры могут входить оценки количества обращений к дискам, степень загруженности процессора и другие параметры.
-
Выполнение плана запроса. На этом шаге план, выбранный на предыдущем шаге, передается на реальное выполнение.
Качество конкретной СУБД во многом определяется качеством ее оптимизатора. Хороший оптимизатор может повысить скорость выполнения запроса на несколько порядков. Качество оптимизатора определяется тем, какие методы преобразований он может использовать, какой статистической и иной информацией
о таблицах он располагает, какие методы для оценки стоимости выполнения плана он знает.