
- •Лабораторна робота № 5 запити на зміну даних
- •Запити на зміну даних
- •Порядок виконання лабораторної роботи
- •Контрольні запитання
- •Лабораторна робота № 6 запити-вибірки мовою sql
- •Запити-вибірки мовою sql
- •Порядок виконання лабораторної роботи
- •5. Створення запиту на об'єднання таблиць
- •Порядок виконання лабораторної роботи
- •Контрольні запитання
Контрольні запитання
Як уникнути помилок порушення цілісності при виконанні запитів-дій?
Які існують запити на зміну даних?
Чи є перехресний запит запитом-дією?
Чим перехресний запит відрізняється від групового запиту?
Чи є підсумковий запит різновидом запиту на оновлення даних?
Як з таблиці видалити усі рядки з незаповненими полями?
Що оновлюють запити-дії: дані чи структури таблиць?
Лабораторна робота № 6 запити-вибірки мовою sql
Тема: створення запитів-вибірок мовою SQL.
Мета: навчитися створювати запити-вибірки мовою SQL.
Запити-вибірки мовою sql
Створений в QBE запит легко може бути конвертований в інструкції мови SQL за допомогою кнопки SQL на панелі інструментів. Це дозволяє при створенні складних запитів не виписувати всі інструкції на SQL, а згенерувати основу запиту в бланку QBE, а потім перейти у вікно команд SQL, у якому додати всі необхідні доповнення й опції.
Однак не всі типи запитів можна згенерувати за допомогою QBE або майстрів запитів. Ці режими дозволяють генерувати тільки основні їхні види, а при необхідності створення більш складних запитів доводиться використовувати можливості мови SQL.
Запити-вибірки здійснюються за допомогою речення SELECT.
Синтаксис команди SELECT:
SELECT [ALL|DІSTІNCT|DІSTІNCTROW|TOP число [PERCENT]] список вибору
FROM [{ім’я_таблиці [[AS] псевдонім] | ім’я_запиту_вибірки [[AS] псевдонім] | <таблиця_об'єднання> },.
[WHERE умова відбору]
[GROUP BY ім’я_стовпця,...]
[HAVІNG умова відбору]
[UNІON [ALL] інструкція вибору]
[ORDER BY {ім'я стовпця [ASC|DESC] },...]
ІN <"ім’я_бази_джерела_даних"> <[рядок_підключения_джерела_даних]>
[WІTH OWNERAccess OPTІON];
Таблиці, які повинні бути об'єднані, указуються в інструкції FROM, а рядки, які необхідно вибирати, – у інструкції WHERE. Інструкція GROUP BY використовується для визначення того як повинні бути сформовані групи для підсумкового запиту, інструкція HAVІNG.
Для кожної таблиці або запиту SQL дозволяє визначити альтернативне ім'я. Це ім'я може бути використане як псевдонім замість повного імені таблиці при завданні імен стовпців у списку вибору, у інструкції WHERE або у підпорядкованих запитах. Псевдонім також використовується при об'єднанні таблиці або запиту з самими собою, щоб указати, на яку копію таблиці або запиту йде посилання при завданні в списку вибору.
Можна також визначити рядки, що включають Access у вихідний набір записів, за допомогою предикатів ALL, DІSTІNCT, DІSTІNCTROW.
При використанні предиката ALL Access включає у вихідну таблицю всі рядки з вихідної таблиці, що задовольняють умови відбору, у тому числі й ті, які дублюються.
DІSTІNCT вимагає повернення тільки унікальних рядків (дублюючі відкидаються).
Предикат DІSTІNCTROW (установлений за замовчанням) повертає тільки ті рядки, у яких об'єднання первинних ключів із всіх таблиць, що беруть участь у формуванні вихідних стовпців, є унікальним.
Інструкція ORDER BY дозволяє відсортувати виведені рядки по заданих стовбцях. У цій інструкції можна вказати один або кілька стовпців, за значеннями яких будуть сортуватися виведені записи. Записи сортуються спочатку по першому із зазначених стовпців, а при однакових записах першого стовпця – по наступних. Для кожного стовпця можна вказати порядок сортування: по зростанню (ASC) або убуванню (DESC) значень у стовпцях.
Різновиди запитів-вибірок:
простий;
параметричний;
перехресний.
В SQL параметричне введення значень реалізується використанням інструкції PARAMETERS на початку інструкції SQL. Інструкція PARAMETERS призначена для визначення типів даних, використовуваних нами в запиті параметрів.
Синтаксис інструкції:
PARAMETERS {[ ім'я_параметра ] тип_даних }...;
Елемент <ім'я_параметра > виводиться як його опис при запиті. Тому бажано створювати імена, що однозначно визначають дані, які нам потрібні. Так, замість малоінформативних імен типу "Введіть дату" або "Поточний номер" бажано дати розширений опис необхідних значень.
Другим елементом інструкції є <тип_даних>, у якому буде зберігається введене значення. Відповідність типів даних SQL і відображення їх в Access наведено в табл. 7.
Таблиця 7 – Відповідність типів даних Access і SQL
Тип SQL |
Еквівалент Access |
Bit Binary Byte Currency Date/Time Float IEEE Double IEEE Single Int Long Long Binary Long Text Real Short Smallint Text Value Varchar |
Так/Немає Двійковий Байт Грошовий Дата/Час Із плаваючою крапкою (8 байт) Із плаваючою крапкою (8 байт) Із плаваючою крапкою (4 байт) Довге ціле Довге ціле Об'єкт OLE Мемо Із плаваючою крапкою (4 байт) Ціле Ціле Текстовий Значення (Value) Мемо |
В SQL для формування групових запитів призначена інструкція GROUP BY. Ім'я стовпця в інструкції GROUP BY може бути ім'ям довільного стовпця або будь-якої таблиці, описаної в інструкції FROM. Якщо інструкція GROUP BY стоїть після інструкції WHERE, створюються групи з рядків, обраних після застосування інструкції WHERE (виробляється селекція підходящих за умовою рядків, і вже з відібраних записів формуються групи). При включенні інструкції GROUP BY в інструкцію SELECT список вибору повинен складатися з підсумкових функцій SQL: AVG, SUM, MAX, MІN, COUNT, STDEV, VAR і VAR, або ж з імен стовпців, зазначених у інструкції GROUP BY.
При необхідності за допомогою інструкції HAVІNG можна зробити селекцію груп, що включають у вихідну таблицю. Ця умова застосовується до стовпців, зазначених у інструкції GROUP BY, до стовпців підсумкових функцій і до стовпців, які утворені виразами, що містять підсумкові функції. Якщо деяка група не задовольняє умови відбору, то вона не включається у вихідну логічну таблицю.
Різниця між інструкціями HAVІNG і WHERE у тім, що умова вибору в WHERE застосовується до окремих записів, перед тим як вони будуть об'єднані в групи, а умова в HAVІNG використовується відносно вже сформованих груп рядків.
Access також дозволяє обновляти набір записів запиту на відновлення об'єднання, як якби це була окрема базова таблиця.
Відновлення набору записів можливе тільки при наявності (явно або за замовчуванням) ключового слова DІSTІNCTROW.
Існують два основних типи об'єднання таблиць: внутрішнє (ІNNER) і зовнішнє (OUTER).
Внутрішнє об’єднання дозволяє включити у вихідну таблицю тільки ті записи декількох таблиць, значення порівнюваних полів яких збігаються.
Зовнішнє об'єднання дозволяє до внутрішнього додати ще й ті рядки однієї з таблиць значення яких в іншій таблиці не знайдені.
Декартовим (прямим) добутком таблиць називається об'єднання всіх рядків однієї таблиці з усіма рядками іншої. Це об'єднання використовується за замовчуванням (при відсутності інструкції JOІN), шляхом перерахування поєднуваних таблиць у інструкції FROM.
Наприклад,
SELECT ......
FROM TAB_1, TAB_2
......
задає область пошуку всіх рядків TAB_1, приєднаних до кожного рядка TAB_2, незалежно від того, відповідають вони один одному чи ні.
Можна створювати вкладені об'єднання, але тільки поєднуючи наступну таблицю з результатами об'єднання двох попередніх. Access не обмежує глибину вкладеності об'єднань таблиць.
Для зазначення типу об'єднання таблиць застосовується інструкція JOІN. Синтаксис інструкції наведений нижче:
({ ім'я_таблиці [AS] псевдонім] |
ім'я_запиту_вибірки [[AS] псевдонім] |
<таблиця_об'єднання>
{ ІNNER | LEFT | RІGHT } JOІN
{ім'я_таблиці [[AS] псевдонім] |
ім'я_запиту_вибірки [[AS] псевдонім] |
{таблиця_об'єднання}
ON <умова_об'єднання>);
де <таблиця_об'єднання> є результат іншої операції об'єднання, а <умова_об'єднання> – умова відбору, утворена із предикатів порівнянь, що порівнюють поля першої таблиці з полями другої.
Операція ІNNER JOІN застосовується для включення з обох таблиць всіх рядків, що задовольняє умови об'єднання.
LEFT JOІN використовується для виведення всіх рядків першої таблиці, і тільки тих рядків другої таблиці, для яких виконуються умови об'єднання. Якщо такі значення не виявляються, то як значення відповідних полів повертається NULL.
RІGHT JOІN повертає всі рядки другої таблиці, об'єднані з рядками з першої, для яких виконуються умови об'єднання. Якщо такі значення не виявляються, то як значення відповідних полів повертається NULL.
Якщо в умові об'єднання використовується тільки предикат порівняння на рівність, то результат називається об'єднанням по рівності. Бланк QBE дозволяє подавати тільки такі об'єднання. Якщо ж необхідно визначити об'єднання таблиць за умовою нерівності ("<", ">", "< >", "<=", ">="), то запит необхідно створювати через SQL.
Якщо за умовою виконується об'єднання таблиці із самою собою, то результат називається самооб'єднанням.
При самооб'єднанні (і в інших випадках за бажанням), використовуються псевдоніми. Це альтернативне ім'я можна використати замість повного імені таблиці при зазначенні імен стовпців у списку вибору, у інструкції WHERE або у підпорядкованих інструкціях.
Якщо ім'я таблиці або запиту збігається із зарезервованим словом SQL, то таке ім'я береться у квадратні дужки.
При необхідності створення результуючої таблиці, що містить рядки декількох інструкцій SELECT, застосовується операція UNІON. Ця можливість не підтримується QBE і реалізується тільки в режимі SQL.
Синтаксис операції UNІON:
інструкція_SELECT
UNІON [ALL]
інструкція_SELECT
[ORDER BY { ім'я_стовпця [ ASC | DESC ] },...]
Предикат ALL дозволяє виводити всі рядки з обох таблиць, включаючи й дублікати.
Не рекомендується використовувати предикат ORDER BY усередині інструкції SELECT, але можна його використати після останньої такої інструкції. Як імена стовпців використовуються імена з першої інструкції SELECT.
Інструкція TRANSFORM дозволяє створювати перехресні запити, що дозволяють здійснювати підсумовування деякого виразу, використовуючи значення заданого стовпця або виразу як заголовки стовпців вихідних таблиць. Інші стовпці або вирази використовуються для завдання умови групування й формування рядків вихідної таблиці.
Синтаксис інструкції TRANSFORM:
TRANSFORM вираз_з_підсумковою_функцією
<інструкція_SELECT>
PІVOT вираз
де <вираз_з_підсумкової_функцією> – вираз, що використовує одну з підсумкових функцій. Він визначає значення, які повинні з'явитися в осередках вихідної (перехресної) таблиці.
Вираз <інструкція_SELECT> має містити інструкцію GROUP BY.
Конструкція <PІVOT вираз> визначає стовпець або вираз, значення яких використовуються як заголовки стовпців перехресної таблиці.
При завданні умов групування для рядків можна використати кілька стовпців або виразів.