Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_укр_2008.doc
Скачиваний:
6
Добавлен:
15.11.2019
Размер:
974.85 Кб
Скачать

Лабораторна робота №6

Тема: «Підпорядковані запити»

Мета: Навчити студентів створювати підпорядковані запити.

Зміст роботи: створити підпорядковані запити мовою sql

Форма звіту:

  1. створені запити

  2. протокол лабораторної роботи

Теоретичні відомості

Підпорядковані запити - це SELECT - запити упроваджені в тіло іншого SELECT - запиту. Зовнішній оператор SELECT використовує результат виконання внутрішнього оператора для визначення змісту остаточного результату всієї операції. Внутрішні запити можуть бути поміщені в пропозиції WHERE і HAVING зовнішнього оператора SELECT - в цьому випадку вони одержують назву підзапитів або вкладених запитів. Крім того, внутрішні оператори SELECT можуть використовуватися в операторах INSERT, UPDATE, DELETE.

Існує три типу підзапитів:

  • скалярний підзапит; повертає єдине значення.

  • строковий підзапит; повертає значення декількох стовпців таблиці, але у вигляді єдиного рядка.

  • табличний підзапит; повертає значення одного або більше стовпців таблиці, розміщені в більш ніж одному рядку. Табличний підзапит може використовуватися скрізь, де допускається указувати таблицю - наприклад, як операнд предиката IN.

Правила запису:

  • Текст підзапиту записується в круглих дужках.

  • У підзапитах не можна використовувати пропозицію ORDER BY.

  • У основному запиті не можна використовувати BETWEEN.

  • Підзапити, що повертають більше одного запису, можуть використовуватися тільки з багатозначними функціями.

  • Якщо підзапит є одним з двох операндів, що беруть участь в операції порівняння, то запит указується в правій частині порівняння.

Синтаксис вкладеного запиту нічим не відрізняється від синтаксиса головного запиту, і, отже, вкладений запит може, у свою чергу, містити підзапит.

Приклади.

1. Наступний запит повертає дату, на яку доводиться максимальна відпустка товарів

SELECT KOLVO, DATRASH

FROM RASHOD

WHERE KOLVO = (SELECT MAX (KOLVO) FROM RASHOD)

2. Ускладнимо попередній приклад. Визначити дату, коли з складу було відвантажено максимальну кількість товару, і реквізити покупця, який цей товар купив.

SELECT R.KOLVO, R.DATRASH, P.POKUP, P.GOROD, P.ADRES

FROM RASHOD R, POKUPATELI P

WHERE (R.POKUP = P.POKUP) AND KOLVO = (SELECT MAX (KOLVO) FROM RASHOD)

В порівнянні з попереднім прикладом в запит включено внутрішнє з'єднання таблиць RASHOD і POKUPATELI.

Розглянемо відношення Співробітники (таб_номер, ПІБ, оклад, номер_відділу)

3. Скласти список всіх співробітників, що мають оклад вищий за середній по підприємству.

SELECT ПІБ

FROM Співробітники

WHERE Оклад>(SELECT AVG(оклад)

FROM співробітники);

4. Одержати список співробітників, одержуючих оклад вище за хоч би одного співробітника відділу №1.

SELECT ПІБ

FROM Співробітники

WHERE Оклад>ANY (SELECT оклад

FROM співробітники

WHERE номер_відділу=1);

ANY - умова пошуку істинна, коли порівнюване значення знаходиться в потрібному відношенні хоча б з одним значенням, підзапитом, що повертається

5. Скласти список всіх співробітників, чий оклад більше окладу будь-якого співробітника відділу №2.

SELECT ПІБ

FROM Співробітники

WHERE Оклад>ALL (SELECT оклад

FROM співробітники

WHERE номер_відділу=2);

ALL указує, що умова пошуку буде істинна тоді, коли порівнюване значення знаходиться в потрібному відношенні зі всіма значеннями, що повертаються підзапитом

З табличними підзапитами використовуються ключові слова EXISTS і NOT EXISTS. Результат їх обробки є логічним значенням TRUE або FALSE. Для ключового слова EXISTS результат рівний TRUE тільки в тому випадку, якщо в повертаному підзапитом результуючій таблиці присутній хоч би 1 рядок. Інакше - буде значення FALSE. Для NOT EXISTS - навпаки. Тобто за ключовими словами EXISTS і NOT EXISTS перевіряється наявність рядків в таблиці підзапиту ( ця таблиця може містити довільне число стовпців).

Приклад. Скласти список всіх покупців, які хоча б один раз одержували товар зі складу.

SELECT P.POKUP

FROM POKUPATELI P

WHERE

EXISTS

(SELECT R.POKUP

FROM RASHOD R, POKUPATELI P

WHERE (R.POKUP = P.POKUP))

Приклад. Хай необхідно знайти в таблиці POKUPATELI покупця, у якого поле GOROD містить „Москва", і показати з таблиці RASHOD всі здійснені їм покупки товарів. Може бути написаний наступний помилковий запит:

SELECT R.KOLVO, R.DATRASH, R.POKUP, R.TOVAR

FROM RASHOD R

WHERE R.POKUP = (SELECT P.POKUP

FROM POKUPATELI P

WHERE P.GOROD= "Москва")

Помилка полягає в том, що стовпець GOROD містить неунікальне значення і таких покупців -,например, 2. Таким чином, одиничному значенню RASHOD.POKUP в умові пошуку вимагається поставити у відповідність (оператор „=") відразу два значення POKUPATELI.POKUP. Спроба виконання такого запиту викличе помилку. Тому якщо вкладений запит здатний повертати список значень, то знак рівності (=) в умові пошуку замінюється на вибір з декількох значень (IN).

SELECT R.KOLVO, R.DATRASH, R.POKUP, R.TOVAR

FROM RASHOD R

WHERE R.POKUP

IN

(SELECT P.POKUP

FROM POKUPATELI P

WHERE P.GOROD= “Москва”)

Контрольні питання

  1. Що таке вкладений запит?

  2. Коли використовуються підзапити?

  3. Як включити до головного запиту вкладений запит?

  4. Чому в деяких випадках невожливо використовувати знак рівності в запитах з вложеними запитами?

  5. Коли використовуються оператор EXISTS?

Варианти завдань

Вариант 1

1. Отримати список видань, на які не підписалось жодного передплатника.

2. Отримати список видань, вартість номеру яких не перевищує середню вартість номерів всіх типів видань.

Вариант 2

  1. Отримати назви незамовлених виробів.

  2. Отримати назви виробів, на які витрачається минимальна кількість метрів тканини.

Вариант 3

1. Отримати назву команди з максимальною кількістю персоналу.

2. Отримати прізвище найстарішого гравця.

Вариант 4

  1. Отримати прізвище наймолодшого майстра.

  2. Отримати прізвище майстра, який виробив максимальну кількість виробів.

Вариант 5

  1. Знайти номер аудиторії з максимальною кількістю місць.

  2. Отримати назву кафедри з мінімальною кількістю викладачів.

Вариант 6

  1. Отримати назву найдорожчого виробу.

  2. Отримати список виробів, які випускає фірма «Одеса_Люкс».

Вариант 7

  1. Отримати назву книги, максимальна кількість екземплярів якої була випущена в 2007 році.

  2. Отримати назву найдорожчої книги.

Вариант 8

  1. Отримати назву найдорожчого товару.

  2. Отримати номери накладних з максимальною кількістю одиниць вказаного товару.

Вариант 9

  1. Отримати назву типа замовлень з мінімальною вартістю.

  2. Отримати список виконавців, які не виконували замовлення в вересні поточного року.

Вариант 10

  1. Отримати назву найдорожчого матеріалу.

  2. Отримати назву об’єкта, на який витрачається мінімальна кількість цеглі.

Вариант 11

  1. Отримати назву найдорожчої книги.

  2. Які книги були замовлені в вересні поточного року мінімальним тиражем.

Вариант 12

  1. Отримати назву відділу з мінімальною кількістю робітників.

  2. Отримати ПІБ останнього прийнятого на роботу.

Вариант 13

  1. Отримати ПІБ наймолодшого спортсмена.

  2. Отримати назви видів спорту, на яких немає тренерів із званням «майстер спорту».

Вариант 14

  1. Отримати дані про найдешевше авто.

  2. Які авто не були продані в жовтні поточного року.

Вариант 15

  1. Які кімнатні рослини не були замовлені?

  2. Отримати назву найдорожчої рослини.

Вариант 16

  1. На яких мовах не було доповідей?

  2. Хто доповідав останнім на конференції?

Вариант 17

  1. Отримати назву найдорожчого товару.

  2. Товари яких категорій не куплялись в першому кварталі поточного року?

Вариант 18

  1. Отримати ПІБ наймолодшого пацієнта.

  2. Які лікарі не були на викликах у жовтні поточного року?

Вариант 19

  1. У яких викладачів кафедри програмування не було видань в 2008 році?

  2. Отримати ПІБ наймолодшого викладача.