Роздрукувати сторінку

Мова QBE

« Назад

Мова QBE

QBE (Query By EXAMPLE –запит за зразком) є  графічною мовою запитів до реляційних баз даних. Формулюючи QBE -запит , користувач вписує у бланки таблиць бази даних одну з можливих відповідей на запит, а інтерпретуюча система за аналогією відшуковує всі  можливі відповіді.  Операції задаються в табличній формі, тому можна сказати , що QBEмає двовімірний синтаксис. У мові  є можливість , якої не надають інші мови реляційної моделі, зокрема алгебра й числення,- можливість формулювати запити ієрархічної структури.

Розглянемо як засобами цієї мови виразаються операції реляційної алгебри та деякі конструкції мови SQL. Приклади будемо формулювати , користуючись базой даних в СУБД Access, розглянутою в попередніх розділах.

Вибирання даних

Засобами мови QBE можна змоделювати майже всі конструкції реляційної алгебри, числення та мови SQL. Відповідні запити будуть розглянуті в підрозділах 1.1.1-1.1.13. Крім того, QBE дозволяє формулювати ієрархічні запити, про які йтиметься в підрозділі 1.1.14

1.1.1. Вибирання окремих стовпців

Щоб вибрати значения з окремих стовпців таблиці (за терінологією реляційної алгебри _ виконати операцию проекції), ці стовпці потребно позначити символами Р. (print) у бланку таблиці.

Приклад 1. Розглянемо створення запиту, що відбирає з таблиці  Книги відомості про автора та назву книг, рік їх виданная.

Наведемо приклад виконання даного типу запитів в СУБД Access:

Перейдіть на вкладку Запити. Натисніть кнопку Створити. Виберіть у меню Конструктор. У вікні діалогу Додавання таблиці на вкладці Таблиці виберіть таблицю, з якої потрібно відібрати дані. Для нашого випадку це - Книги. Натисніть кнопку Додати. Закрийте вікно Додавання таблиці.  Тепер потрібно вибрати ті поля, які необхідно включити в запит. Виберемо поля: Автор, Назва, Рік,. Для того, щоб помістити ці поля в бланк запиту, потрібно двічі нажати кнопкою миші на імені поля в таблиці. Є й інші можливості: перетягнути назва поля з таблиці в бланк запиту або вибрати необхідні поля в списку назв полів у бланку запиту.

Наведена вище умова зображується так:

1.1.2. Вибирання за умовою

Коньюктивна селекция

У найпростішому випадку умова вибирання має такий вигляд:

<Ім’я поля 1> Ө<значения 1> and <Ім’я поля 2> Ө<значения 2> and … and <Ім’я поля n> Ө<значения n>

Де Ө - один з предикатів порівняння (=, !=, >, <, =>, <=). Умова записується

так, що предикати (умови) разом за своїми  значениями вказуються у відповідних полях бланка таблиці

Приклад 2. Розглянемо приклад створення запиту, що відбирає з таблиці  Книги ті екземпляри, ціна яких більше 10 гривень і рік виданная  1998.

Наведемо приклад виконання даного типу запитів в СУБД Access.

Перейдіть на вкладку Запити. Натисніть кнопку Створити. Виберіть у меню Конструктор. У вікні діалогу Додавання таблиці на вкладці Таблиці виберіть таблицю, з якої потрібно відібрати дані. Для нашого випадку це - Книги. Натисніть кнопку Додати. Закрийте вікно Додавання таблиці. Тепер потрібно вибрати ті поля, які необхідно включити в запит. Виберемо поля: Автор, Назва, Рік, Вартість. Для того, щоб помістити ці поля в бланк запиту, потрібно двічі нажати кнопкою миші на імені поля в таблиці. Є й інші можливості: перетягнути назва поля з таблиці в бланк запиту або вибрати необхідні поля в списку назв полів у бланку запиту.

Далі необхідно поставити умови, по яких буде вестися відбір. Для цього в рядку Умова відбору для Вартості ставимо умову ”>10”. Для поля Рікр ставимо умову =1998. Для перегляду результату натисніть кнопку “!” або виберіть у пункті меню ВИД -режим таблиці.

Наведена вище умова зображується так:

Якщо всі компоненти запиту розташовані в одному рядку, інтерпретуюча система QBE вважатиме, що всі елементарні умови зв’язані логічними зв’язками «і» (and).

Дизюктивна селекція

Якщо  умова містить  логічні зв’язки AND, OR I NOT, вираз треба записати в диз’юктивній нормальній формі:

(<літерал 1l> and … and <літерал 1k> ) or …or (<літерал p1> and … and <літерал pn> )

Тут <літерал ij> позначає елементарний предикат вигляду  <Ім’я поля 1> Ө<значения 1> чи його заперечення. Кожну з кон’юнкцій  потрібно записати в окремому рядку бланка.

Приклад 3. Вивести прізвища читачів, що: (мають номер читацького <600 й працюють на кафедрі фізики) або (працюють на кафедрі ВМ і номер читацького, більше 800).

Наведена вище умова зображується так:

Якщо заповнено два чи більше рядків, які не пов’язані між собою однією й тією ж змінною, то умови, що задаються на цих рядках, з’єднується логічним «або». Елементарні умови, що задаються в межах одного рядка,  з’єднуються логічним «і», як і у випадку однорядкового запиту. Інтерпретуюча система QBE об’єднує в один потік всі значения, що отримуються в одному стовбці за умовами різних рядків.

Дизюктивна селекція  на одному полі

Диз’юктивна селекція, що застосовується   на одному полі, має такий вигляд:

(<літерал 1l> and … and <літерал 1k> ) or …or (<літерал p1> and … and <літерал pn>)

Тут літерали містять ім’я лише одного поля. Така умова може бути записана з використанням змінних.

Приклад 4. Вивести прізвища читачів (таб.Читичі), NB яких (більше 600 і менше 800) або (більше 500 і менше 1000 і не дорівнює 880).

Отже, потрібно  реалізувати таку диз’юктивну нормальну форму:

(BN>600 and BN<800 ) or (BN>500 and BN <1000 AND BN !=880)

Отже, наведена вище умова зображується так:

Предикат IN, застосований до переліку констант

Приклад 5. Умова має вигляд: номер читацького білету (NB) дорівнює 660, або 555, або 700

Наведена вище умова зображується так:

Ця умова також може бути задана за допомогою предиката IN:

BN (555; 660; 700)

 

1.1.3. Використання змінних

Змінні в мові QBE потрібні для зв'язування значень, що задаються різними ряд­ками одного чи кількох бланків таблиць. Змінні записуються у вигляді рядкових літералів, яким передує символ підкреслення. У цьому підрозділі розглянемо ви­користання змінних для виявлення зв'язків усередині однієї таблиці.

Запит 6. Вказати прізвища читачів, що мають той номер  телефону що і Біла Н.І.

Інший метод розв’язку поставленої задачі: використання Запиту типу «Повторяющиєся записи.

Приклад 12

Читачі Біла та Цокотун мають однаковий номер телефону, вивести його  


5.1.4. Запити за кількома таблицями

Засобами QBE можна формулювати запити, що передбачають з'єднання двох чи кількох таблиць. Для цього слід заповнити бланки таблиць, використовуючи спільні змінні для їхнього зв'язування.

Розглянемо кілька прикладів виконання даного типу запитів в СУБД Access.

Методика реалізації запиту:

При створенні таких запитів до верхньої частини вікна конструктора запитів вибираємо кілька таблиць. Якщо зв'язку між таблицями були створені у вікні “Схема даних”, то в цьому вікні вони з'являться автоматично.

Тепер можна вибирати в один запит поля з декількох таблиць. Існує два різних типи об'єднання двох таблиць - внутрішнє й зовнішнє. Якщо об'єднання внутрішнє (саме його ви встановили), то в один запит будуть об'єднані записи, у яких збігаються значення в полях зв'язку. Якщо який-небудь запис в одній таблиці не має відповідного запису в іншій таблиці, то цей запис не буде включена в запит. Зовнішнє об'єднання буде розглянуто пізніше.

5.1.5. Використання бланка умови

Інколи незручно або неможливо задавати умову в полях бланка однієї чи кількох таблиць. Якщо в

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

умову неможливо записати в одному полі бланка. Прикладом подібної умови мо­же бути: Надбавка > 2 * Зарплата.

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

Розглянемо кілька прикладів виконання даного типу запитів в СУБД Access.

Створення полів, які обчислюються. У таблицях баз даних ніколи не зберігають дані, які можуть бути обчислені за даними з таблиць. Всі необхідні обчислення виконують у запитах, створюючи поля, які обчислюються. Для створення таких полів у вільному стовпці конструктора запитів записують нове ім'я поля, знак “:”, а потім вираз, що використає імена інших полів й обчислює необхідне значення. Наприклад, обчислимо вартість замовлення, якщо є поля Вартість одиниці  й Кількість одиниць. У новому стовпці запишемо:    

Вартість замовлення: [Вартість одиниці]*[Кількість одиниць]

Імена полів записуються у квадратних дужках.

При записі виразу можна використати вбудовані функції Access. Імена цих функцій, на відміну від Excel, не переведені на росіянин, вони пишуться по-англійському, але за змістом багато хто з них збігаються з функціями Excel. Приведемо кілька функцій:

Iif(умова; виразення1; виразення2) – обчислює вираз1, якщо умова виконується, і вираз 2, якщо умова не виконується (збігається з функцією ЯКЩО в Excel).

DateDiff(“d”; дата1; дата2)  - обчислює різницю між двома датами в днях. Якщо перший аргумент “m” – різниця дат обчислюється в місяцях, якщо “y”  - у літах.

Повний список всіх функцій ви знайдете у вікні «Построитель виражений».

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

Створимо запит, що відбирає й поєднує запису із двох таблиць - Книги й ЧитКниги, щоб показати, які книги були видані читачам. Створимо обчислює поле, що, з ім'ям Пеня, що нараховується на кожну книгу, що не повертається вчасно. Розмір пені дорівнює 1% від вартості книги за кожний прострочений день. Створимо запит з ім'ям Список1. Для створення запиту Список1

  • Перейдіть на вкладку Запити й виберіть кнопку Створити.

Додайте в запит таблиці Книги й ЧитКниги.

  • У вікні схеми даних повинна бути показана зв'язок між таблицями по полю Инв№ - інвентарний номер книги.

  • Перетягніть мишею в нижню половину вікна поля, які необхідно включити в запит: Автор, Назва, Вартість, Инв№, Дата видачі, Дата повернення, NB. Останнє поле буде потрібно для зв'язку запиту з таблицею Читачі.

  • У першому вільному стовпчику нижньої частини вікна створіть поле, що обчислюється, з ім'ям  Пеня.  Для цього наберіть у верхньому рядку (де розташовується ім'я поля) такий текст:

Пеня: iif([Дата повернення]>Date(); DateDiff(“d”; [Дата повернення]; Date())*0,01*[Вартість]; 0).

Для створення такого виразення можна використати Построитель виражений. Для цього натисніть кнопку Побудувати на панелі інструментів. На екрані відкривається вікно Построителя виражений. У цьому вікні створюється вираз послідовним додаванням до нього полів таблиць або запитів, функцій, констант й операторів (малюнок 13). Імена полів записуються у квадратних дужках.

Розмір пені, залежить від поточної дати, на яку він обчислювався

Малюнок 14. Результат виконання запиту Список1

Приклад 2.2. 3 Створити список книг, які не видані на руки читачам.

Створення запиту  на пошук записів, які не мають зв'язаних в іншому списку. Такі запити називаються «Записи без підлеглих». Для створення таких запитів необхідно змінювати тип об'єднання таблиць на зовнішній. При такому типі об'єднання в запит обов'язково включаються всі записи з першої таблиці й до них додаються поля із другої таблиці, якщо в другій таблиці є запис, для якої значення зв'язаних полів збігаються. Якщо в другій таблиці такого запису ні, то до запису з першої таблиці додаються поля з порожніми значеннями. Зовнішнє об'єднання в конструкторі таблиць зображується лінією з стрілкою.

У запит включимо дві таблиці Книги й ЧитКниги. Включимо в запит поля Инв№, Шифр, Автор, Назва з таблиці Книги й Инв№ з таблиці ЧитКниги. Знайдемо ті записи, які присутні в таблиці Книги й відсутні в таблиці ЧитКниги. Змінимо Параметри об'єднання. Необхідно створити Зовнішнє об'єднання. Для цього двічі натисніть на лінії зв'язку між таблицями. У вікні діалогу виберіть другий тип – “Об'єднання ВСІХ записів з ‘Книги' і тільки тих записів з 'ЧитКниги', у яких зв'язані поля збігаються”. Тепер створене зовнішнє об'єднання, у яке включені всі книги з таблиці Книги. Для тих книг, які не мають записів з таблиці ЧитКниги встановлюється значення ‘Null’, тому для поляИнв№ з таблиці Чит Книги встановимо такі параметри Умова відборуIs Null і Висновок на екран
відсутній.

Переконаєтеся, що запит вибирає необхідну інформацію.

1.1.1.1. Агрегатні функції

Мова QBE надає можливість використання агрегатних функций:

SUM- обчислення суми значень для групи;

AVG - середнє значення поля для даних із групи записів;

MIN - мінімальне значення для даних із групи записів;

MAX - максимальне значення для даних із групи записів;

COUNT- кількість записів, у яких є значення із групи;

STDEV - стандартне відхилення;

VAR - дисперсія;

FIRST - значення в першому записі групи;

LAST - значення в останньому записі групи.

Щоб використати одну з таких функций, потрібно вказати, що вона застосовується до множини значень поля.

Наведемо приклади виконання даного типу запитів в СУБД Access.

Методика реалізації запиту:

  • Вибираємо таблицю (Читачі),

  • включаємо поля (Кафедра) і  (Прізвище)

  • Для створення підсумкового запиту на панелі інструментів вибираємо піктограму Групові операції (значок S  чи )

  • У бланку запиту з'являється рядок Групові операції.

У списку, що розкривається, цього рядка є список можливих обчислень для груп записав. Вибираємо операцию.

Для того, щоб при перегляді запиту кожне поле мало зрозумілий підпис, визначимо властивості поля. Для цього вибираємо ВИД - Властивості й ставимо Підпис – Кількість читачів.

Приклад 111. Визначимо мінімальну вартість книги в нашій бібліотеці.

Наведена вище умова зображується так:

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

Для цього виберіть таблиці Книги, Читачі йзапит Список1. У бланк запиту включите поля Прізвище з таблиці Читачі, Инв№ з таблиці Книги, Вартість із таблиці Книги й Пеня із запиту Список1.  Для створення підсумкового запиту на панелі інструментів вибираємо піктограму Групові операції. У бланку запиту з'являється рядок Групові операції. Для першого поля запиту Прізвище з таблиці Читачі вибираємо Угруповання, для Вартість із таблиці Книги – SUM (підрахунок суми), для поля Инв№ з таблиці Книги- CountідляПеня із запиту Список1- SUM. Для того, щоб при перегляді запиту кожне поле мало зрозумілий підпис, визначимо властивості полів. Для цього вибираємо Виду-властивості й задаємо Підпис для кожного поля -кількість  книг, Загальна вартість книг і Загальна сума пені.

Приклад 1113.

Порахувати кількість читачів кожної кафедри.

Вибираємо таблицю Читачі, включаємо поля Кафедра й Прізвище. Для створення підсумкового запиту на панелі інструментів вибираємо піктограму Групові операції (зі значком S). У бланку запиту з'являється рядок Групові операції. У списку, що розкривається, цього рядка є список можливих обчислень для груп записів:

SUM- обчислення суми значень для групи;

AVG - середнє значення поля для даних із групи записів;

MIN - мінімальне значення для даних із групи записів;

MAX - максимальне значення для даних із групи записів;

COUNT- кількість записів, у яких є значення із групи;

STDEV - стандартне відхилення;

VAR - дисперсія;

FIRST - значення в першому записі групи;

LAST - значення в останньому записі групи.

Малюнок 9. Результат виконання запиту 1.2

За значенням першого поля Кафедра створюємо групу, а для другого вибираємо COUNT (підрахунок кількості записів у групі). Для того, щоб при перегляді запиту кожне поле мало зрозумілий підпис, визначимо властивості поля. Для цього вибираємо ВИД - Властивості й ставимо Підпис – Кількість читачів.

З повагою ІЦ “KURSOVIKS”!