Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекц14 Мова SQL Укр!.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
419.84 Кб
Скачать

14.3. Багатотабличні і вкладені запити

Багатотабличні запити працюють з даними, що знаходяться в декількох таблицях.

При об'єднанні відношень використовуються умови, що задаються в частині WHERE. Таке об'єднання таблиць називається внутрішнім. У цьому випадку в результуюче відношення попадають тільки зчеплені по заданих умовах кортежі вихідних відношень, для яких ці умови були визначені і правильні.

Запрос: Вивести прізвища студентів, що учаться на третьому курсі.

SELECT Табл.Група.ПІБ, ТаблКурс.Курс

FROM Табл.Група, ТаблКурс

WHERE ТаблГрупа.Група= ТаблКурс.Група AND(ТаблКурс.Курс)=3;

Тут об'єднані дві таблиці по збігу значень у стовпці Група.

ПІБ

Курс

Стєпанова К. Е.

3

Владіміров В. А.

3

Крилова Т. С.

3

Міронов А. В.

3

Сідоров К. А.

3

Петров Ф. І.

3

Результат:

Запит: Вивести прізвища студентів з 104 групи, що здавали іспити.

SELECT ТаблСтудент.ПІБ, ТаблСтудент.Дисципліна, ТаблСтудент.Оцінка

FROM ТаблСтудент, ТаблГрупа

WHERE ТаблСтудент.ПІБ = ТаблГруппа.ПІБ AND((ТаблГрупа.Група)=104);

Результат:

ПІБ

Дисципліна

Оцінка

Уткіна Н.В.

Мережі

5

Іванова Е.А.

Мережі

5

Трофімов П.А.

Мережі

4

Цей запит складений не чітко, тому що якби в групі були студенти, що за якимись причинами не здавали іспити, то вони також були б відібрані. По-цьому запит необхідно доповнити ще умовою на відсутність порожніх значень у полі Оцінка.

Запит: Вивести прізвища студентів з 103 групи, що здавали іспити.

SELECT ТаблСтудент.ПІБ,

ТаблСтудент.Дисципліна, ТаблСтудент.Оцінка

FROM ТаблСтудент, ТаблГрупа

WHERE ТаблСтудент.ПІБ =

ТаблГруппа.ПІБ

AND((ТаблГруппа.Група)=103) AND((ТаблСтудент.Оцінка)<> NULL);

Тут об'єднані дві таблиці по збігу значень у стовпці Група.

Результат:

ПІБ

Дисципліна

Оцінка

Стєпанова К.Е.

Англійська мова

3

Крилова Т.С.

Англійська мова

4

Міронов А.В.

Англійська мова

3

Петров Ф.І.

Англійська мова

5

Владіміров В.А.

Інформатика

4

Стєпанова К.Е.

Інформатика

2

Крилова Т.С.

Інформатика

5

Сідоров К.А.

Інформатика

4

Петров Ф.І.

Інформатика

5

Владіміров В.А.

Бази даних

5

Стєпанова К.Е.

Бази даних

2

Крилова Т.С.

Бази даних

5

Міронов А.В.

Бази даних

2

Сідоров К.А.

Бази даних

4

Петров Ф.І.

Бази даних

5

Владіміров В.А.

Англійська мова

4

Раніше було зазначено, що для введення даних у таблиці оператором ІNSERT ІNTO може використовуватися оператор SELECT. Це зручно, коли для заповнення полів однієї таблиці використовуються значення полів інших таблиць.

Запит: Заповнити ТаблСтудент прізвищами студентів і назвами дисциплін по який вони повинні здавати іспити використовуючи дані ТаблГрупа і ТаблДисципліна

INSERT INTO ТаблСтудент(ПІБ,

Дисципліна)

SELECT ТаблГрупа.ПІБ,

ТаблПредмет.Дисципліна

FROM ТаблГрупа, ТаблПредмет

WHERE (((ТаблГрупа.Група) =ТаблПредмет.Група)

And ((ТаблПредмет.ВидКонтролю)='Іспит'));

ПІБ

Дисципліна

Оцінка

Степанова К.Е.

Англійська мова

Крылова Т.С.

Англійська мова

Миронов А.В.

Англійська мова

Сидоров К.А.

Англійська мова

Петров Ф.И.

Англійська мова

Уткина Н.В.

Мережі

Иванова Е.А.

Мережі

Трофимов П.А.

Мережі

Владимиров В.А.

Інформатика

Степанова К.Е.

Інформатика

Крылова Т.С.

Інформатика

Миронов А.В.

Інформатика

Сидоров К.А.

Інформатика

Петров Ф.И.

Інформатика

Владимиров В.А.

Бази даних

Степанова К.Е.

Бази даних

Крылова Т.С.

Бази даних

Миронов А.В.

Бази даних

Сидоров К.А.

Бази даних

Петров Ф.И.

Бази даних

Владимиров В.А.

Англійська мова

Результат:

Агрегатні функції можуть застосовуватися як у вираженні виводу результатів рядка SELECT, так і у вираженні умови обробки сформованих груп HAVІNG. Тут агрегатна функція обчислюється для кожної виділеної групи. Значення, отримані при обчисленні агрегатних функцій, можуть бути використані, для виводу результатів чи для умови добору груп.

Запит: вивести номера груп, у яких отримані двійки.

SELECT DISTINCT ТаблГрупа.Група

FROM ТаблСтудент, ТаблГрупа

WHERE ((ТаблСтудент.ПІБ)=( ТаблГрупа.ПІБ)

AND ((ТаблСтудент.Оцінка)=2)

GROUP BY ТаблГрупа.Група

HAVING ((Count(*))<>False);

Результат:

Група

103