- •1. Форматирование выходных данных запросов. 39
- •Тема 1.
- •1. Введение. История развития баз данных.
- •1. Введение. История развития баз данных
- •2. Основные понятия и определения
- •Тема 2.
- •1. Архитектура базы данных. Физическая и логическая независимость.
- •1. Архитектура базы данных. Физическая и логическая независимость
- •2. Разработка приложений в среде Microsoft Windows. Системы быстрой разработки приложений. Субд. Модели данных.
- •3. Основные этапы проектирование базы данных.
- •Тема 3.
- •1. Дополнительные общие рекомендации по проектированию базы данных.
- •2. Разработка приложений в среде Microsoft Windows.
- •1. Дополнительные общие рекомендации по проектированию базы данных.
- •2. Разработка приложений в среде Microsoft Windows.
- •Тема 4.
- •1. Построение таблиц.
- •2. Запросы в Microsoft Access. Параметры запросов на выборку данных.
- •3. Операции реляционной алгебры.
- •1. Построение таблиц
- •2. Запросы в Microsoft Access. Параметры запросов на выборку данных.
- •3. Операции реляционной алгебры.
- •Тема 5.
- •1. Понятие технологии «Клиент-сервер». Общие сведения о языке запросов sql.
- •2. Структура sql.
- •1. Понятие технологии «Клиент-сервер». Общие сведения о языке запросов sql.
- •2. Структура sql.
- •Тема 6.
- •1. Запрос выборки в языке sql. Выборка из одной таблицы.
- •2. Суммирование данных с помощью функций агрегирования (групповых функций).
- •1. Запрос выборки в языке sql. Выборка из одной таблицы.
- •2.Суммирование данных с помощью функций агрегирования (групповых функций).
- •Тема 7.
- •1. Форматирование выходных данных запросов.
- •2.Соединение таблиц
- •3.Вложенные подзапросы
- •4.Связанные подзапросы. Оператор exists
- •5.Вложенные и связанные подзапросы. Операторы any, all, come
- •Тема 8.
- •1. Форматирование выходных данных запросов.
- •1. Форматирование выходных данных запросов.
- •Тема 9.
- •1. Запросы обновления таблиц.
- •2. Создание, модификация и уничтожение таблиц. Ограничение на множество допустимых значений данных. Значение по умолчанию.
- •3. Создание и уничтожение индексов. Поддержка ссылочной целостности.
- •1. Запросы обновления таблиц.
- •2. Создание, модификация и уничтожение таблиц. Ограничение на множество допустимых значений данных. Значение по умолчанию.
- •3. Создание и уничтожение индексов. Поддержка ссылочной целостности.
- •Тема 10.
- •1. Создание представлений .
- •2. Определение правд доступа к данным.
- •1. Создание представлений.
- •2. Определение правд доступа к данным.
- •Тема 11.
- •1. Определение синонимов объектов. Понятие транзакций. Управление параллелизмом.
- •Тема 12.
- •1. Встроенный sql, основные понятия
- •1. Встроенный sql, основные понятия.
3.Вложенные подзапросы
SQL позволяет вкладывать запросы друг в друга. Обычно внутренний запрос генерирует значения, которые тестируются на предмет истинности логического выражения.
Sname |
C-1 |
C-2 |
SELECT sname FROM СТУДЕНТ
WHERE spdp=
(SELECT pnum FROM ПРЕПОДАВАТЕЛЬ
WHERE pname = ”П-1”);
В данном примере, чтобы выполнить основной (внешний) запрос SQL сначала выполняет внутренний запрос (подзапрос) в предложении WHERE основного запроса.
В результате будет получен код преподавателя с его фамилией. Затем выполняется основной запрос с предложением WHERE.
Существенным в этом случае является то, что подзапрос возвращает не более одного значения.
Например: пусть требуется получить фамилии дипломника для определенной кафедры.
SELECT sname FROM СТУДЕНТ
WHERE spdp=
(SELECT pnum FROM ПРЕПОДАВАТЕЛЬ
WHERE Pcaf = “K-1”);
Запрос такого типа приведет к ошибке, потому что будет возвращать два значения. Иногда проблему единственности можно решить с помощью параметра DISTINCT в предложении SELECT.
Пример: получить фамилию преподавателя, принимавшего экзамен 11/01/01.
Pname |
П-1 |
WHERE pnum=
(SELECT DISTINCT opnum
FROM оценка WHERE odate = “11/01/01”);
Без параметра DISTINCT запрос был бы ошибочным. Потому что возвращал бы 2 значения, хотя и совпадающие. С помощью DISTINCT эта ошибка устраняется. Однако, в данном примере возможна ошибка, если 2 преподавателя принимают экзамен в один день. Следует отметить, что по стандарту SQL логические выражения с использование подзапросов, должны иметь вид:
WHERE скалярное_выражение = (подзапрос)
а не наоборот.
Одним из видов функций, которые всегда выдают единственное значение для любого количества строк, является функции агрегирования. Таким образом, единственность значения подзапросов генерируется при использовании в нем единственной агрегатной функции без предложения GROUP BY.
Пример: получить коды студентов, имеющих у преподавателя П-1 оценки не ниже среднего балла, полученного всеми студентами у этого преподавателя.
SELECT osnum, odate,ocen FROM оценка
WHERE ocen >=
osnum |
Odate |
Ocen |
001 |
10/01/01 |
5 |
002 |
11/01/01 |
4 |
WHERE opnum=
(SELECT pnum FROM преподаватель
WHERE pname = “П-1”))
AND opnum =
(SELECT pnum FROM преподаватель
WHERE pname = “П-1”);
Сгруппированные, т.е. примененные предложением GROUP BY, агрегатные функции могут дать множество значений, поэтому их нельзя применять в подзапросах. Такие команды отвергаются в принципе. Можно применять подзапросы, которые возвращают любое количество строк, при использовании в нем специального оператора IN.
Пример: получить фамилии дипломников для преподавателя определенной кафедры.
sname |
Sgrp |
C-1 |
Г-1 |
C-2 |
Г-2 |
C-3 |
Г-2 |
WHERE spdp IN
(SELECT pnum FROM преподаватель
WHERE pcaf = “K-1”);
Когда IN используется в подзапросе, множество значений IN, строится по результатам подзапроса. Это позволяет во многих случаях оптимизировать запросы, отказавшись от построения декартова произведения таблиц. Так этот запрос можно было бы реализовать по-другому:
SELECT sname FROM студент, преподаватель
WHERE spdp = pnum AND
Pcaf = “K-1”;
Или:
SELECT sname FROM студент INNER JOIN
Преподаватель ON spdp=pnum
WHERE pcaf = “K-1”;
Оба эти варианта тоже дадут правильный ответ, только они менее эффективны, чем с использованием подзапросов.
Пусть в таблице студент n-записей, а в таблице преподавателей m-записей. Для последнего примера, условие spd=pnum WHERE pcaf = “K-1” проверяется n*m количество раз.
В результате с подзапросом требуется однократная проверка таблицы преподаватель, по которому строится подмножество значений кодов преподавателей. Следует отметить, что практически во всех коммерческих реализациях SQL есть оптимизатор, который стремится найти самые эффективные способы выполнения запросов. Хороший оптимизатор сам преобразует версию запроса с соединением таблиц в версию с подзапросом. Однако, способа проверки сделано это или нет – не существует.