Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Міністерство освіти і науки України
Національний університет «Львівська політехніка»
кафедра САПР
Звіт
до лабораторної роботи №3
з предмету:
«Технологія розробки великих програмних систем»
на тему:
«Побудова нетривіальних запитів»
Виконала:
cтудентка групи ІТП-12м
Бідак Н.В.
Прийняв:
Стех Ю.В.
Львів-2012
Тема: Побудова нетривіальних запитів
Мета: виконати нетривіальні запити використовуючи свою базу даних.
Теоретичні відомості
Часто неможливо вирішити поставлене завдання шляхом одного запиту. Це особливо актуально, коли при використанні умови пошуку в пропозиції WHERE значення, з яким потрібно порівнювати, заздалегідь не визначене і має бути вичислене у момент виконання оператора SELECT. У такому разі приходять на допомогу закінчені оператори SELECT, впроваджені в тіло іншого оператора SELECT. Внутрішній підзапит є також оператор SELECT, а кодування його пропозицій підкоряється тим же правилам, що і основного оператора SELECT. Зовнішній оператор SELECT використовує результат виконання внутрішнього оператора для визначення змісту остаточного результату усієї операції. Внутрішні запити можуть бути поміщені безпосередньо після оператора порівняння ( =,<=, >=, <> ) в пропозиції WHERE і HAVING зовнішнього оператора SELECT - вони отримують назву підзапитів або вкладених запитів. Крім того, внутрішні оператори SELECT можуть застосовуватися в операторах INSERT, UPDATE і DELETE.
Підзапит - це інструмент створення тимчасової таблиці, вміст якої витягається і обробляється зовнішнім оператором. Текст підзапиту має бути поміщений в дужки. До підзапитів застосовуються наступні правила і обмеження :
• фраза ORDER BY не використовується, хоча і може бути присутньою в зовнішньому підзапиті ;
• список в пропозиції SELECT складається з імен окремих стовпців або складених з них виразів - за винятком випадку, коли в підзапиті є присутнім ключове слово EXISTS ;
• за умовчанням імена стовпців в підзапиті відносяться до таблиці, ім'я якої вказане в пропозиції FROM. Проте допускається посилання і на стовпці таблиці, вказаної у фразі FROM зовнішнього запиту, для чого застосовуються кваліфіковані імена стовпців (тобто з вказівкою таблиці);
• якщо підзапит є одним з двох операндів, що беруть участь в операції порівняння, то запит повинен вказуватися в правій частині цієї операції.
Існує два типи підзапитів :
• Скалярний підзапит повертає єдине значення. В принципі, він може використовуватися скрізь, де вимагається вказати єдине значення.
• Табличний підзапит повертає безліч значень, тобто значення одного або декількох стовпців таблиці, розміщені у більш ніж одному рядку. Він можливий скрізь, де допускається наявність таблиці.
У вкладеному підзапиті визначається максимальна кількість товару. У зовнішньому підзапиті - дата, для якої кількість товару виявилася рівною максимальному. Необхідно відмітити, що не можна прямо використовувати пропозицію WHERE Кількість=Max(Кількість), оскільки застосовувати узагальнювальні функції в пропозиціях WHERE заборонено. Для досягнення бажаного результату слідує створити підзапит, що обчислює максимальне значення кількості, а потім використовувати його в зовнішньому операторові SELECT, призначеному для вибірки дат угод, де кількість товару співпала з максимальним значенням.
У багатьох випадках значення, підмет порівнянню в пропозиціях WHERE або HAVING, є не одно, а декілька значень. Вкладені підзапити генерують непойменоване проміжне відношення, тимчасову таблицю. Воно може використовуватися тільки в тому місці, де з'являється в підзапиті. До такого відношення неможливо звернутися по імені з якого-небудь іншого місця запиту. Застосовувані до підзапиту операції засновані на тих операціях, які, у свою чергу, застосовуються до множини, а саме:
• { WHERE | HAVING } вираження [ NOT ] IN ( підзапит );
• { WHERE | HAVING } вираження оператор_порівняння { ALL | SOME | ANY } ( підзапит );
• {WHERE | HAVING } [ NOT ] EXISTS ( підзапит );
Використання операцій IN і NOT IN
Оператор IN використовується для порівняння деякого значення із списком значень, при цьому перевіряється, чи входить значення в наданий список або порівнюване значення не є елементом представленого списку.
В результаті виконання запиту перераховуються угоди, коли клієнтові був проданий товар, виготовлений в його місті, що зовсім не виключає наявність угод цих же клієнтів, пов'язаних з придбанням товару з іншого міста.
Введемо в запит фразу "тільки" - відразу знадобиться залучення операції NOT IN.
У вкладеному запиті визначається безліч фірм, що зробили хоч би одну купівлю товару з чужого міста. Потім визначаються фірми, що не входять в цю множину.
Використання ключових слів ANY і ALL
Ключові слова ANY і ALL можуть використовуватися з підзапитами, що повертають один стовпець чисел.
Якщо підзапиту передуватиме ключове слово ALL, умова порівняння вважається виконаною, тільки коли воно виконується для усіх значень в результуючому стовпці підзапиту.
Якщо запису підзапиту передує ключове слово ANY, то умова порівняння вважається виконаною, коли воно виконується хоч би для одного зі значень в результуючому стовпці підзапиту.
Якщо в результаті виконання підзапиту отримано порожнє значення, то для ключового слова ALL умова порівняння вважатиметься виконаною, а для ключового слова ANY - невиконаним. Ключове слово SOME є синонімом слова ANY.
Використання операцій EXISTS і NOT EXISTS
Ключові слова EXISTS і NOT EXISTS призначені для використання тільки спільно з підзапитами. Результат їх обробки є логічним значенням TRUE або FALSE. Для ключового слова EXISTS результат рівний TRUE в тому і тільки у тому випадку, якщо в поверненій підзапитом результуючій таблиці є присутнім хоч би один рядок. Якщо результуюча таблиця підзапиту порожня, результатом обробки операції EXISTS буде значення FALSE. Для ключового слова NOT EXISTS використовуються правила обробки, зворотні по відношенню до ключового слова EXISTS . Оскільки за ключовими словами EXISTS і NOT EXISTS перевіряється лише наявність рядків в результуючій таблиці підзапиту, то ця таблиця може містити довільну кількість стовпців.
РЕЗУЛЬТАТИ ВИКОНАННЯ
Визначити назви відеокарт, обєм яких перевищив середнє значення і вказати для цих відеокарт перевищення над середнім рівнем.
mysql> SELECT Name,AVG(capacity) AS SER
-> FROM video
-> GROUP BY Name
-> HAVING AVG(capacity)>2048;
+-----------------+-----------+
| Name | SER |
+-----------------+-----------+
| GeForce GTX 690 | 4096.0000 |
+-----------------+-----------+
1 row in set
Визначити назву відеокарти з максимальним обємом памяті.
mysql> SELECT Name,Capacity
-> FROM video
-> WHERE capacity=(SELECT Max(Capacity) FROM video);
+-----------------+----------+
| Name | Capacity |
+-----------------+----------+
| GeForce GTX 690 | 4096 |
+-----------------+----------+
1 row in set
Висновок
Виконавши лабораторну роботу, я навчилась будувати нетривіальні запити.