- •1. Короткі відомості про моделі даних
- •1.1. Реляційна алгебра
- •1.2. Основні поняття та нормалізація відношень реляційної бази даних
- •Сутність та особливості мови запитів sql
- •2.1. Структурована мова запитів
- •2.2. Особливості використання мовиSql
- •Оператори та синтаксис мови sql
- •Синтаксис sql
- •3.2.Ключові слова.
- •3.3. Створення sql-інструкцій (на стадії ознайомлення)
- •3.4. Групи sql – інструкцій
- •3.5. Методи виконання sql-операторів
- •4. Принципи застосування мови sql в системі управління базами данних Access
- •4.1. Використання інструкцій sql у об’єктах Access
- •4.1.2. Створення запитів sql
- •5. Використання sql для розробки запитів в Access
- •5.1. Звичайні вибірки sql та вибірки з умовою для однотабличних запитів
- •Багатотабличні запити
- •5.2.2. Запити з операціями з’єднання Таблиць
- •5.3. Додатові відомості про зв’язування таблиць
- •Вибранні питання роботи з операторами sql, що змінюють структуру бази даних
- •6.1. Створення таблиці
- •Типи даних
- •6.2. Спеціальні запити sql об’єднання
- •6.3. Короткі відомости про використання Ассеss як сервераDde
- •7. Лабораторні роботи
- •7.1.Лабораторна робота №1 Тема «Використання інструкцій sql при розробці об’єктів в системах управління базами данних ассess
- •Лабораторне завдання:
- •7.2. Лабораторна робота № 2
- •Лабораторне завдання №2
- •Хід виконання роботи:
- •7.3. Лабораторна робота № 3 Тема: Використання мови sql для розробки параметричних запитів та різних варіантів простих вибірок з фільтрацією і сортуванням.
- •Лабораторне завдання №3
- •7.4. Лабораторна робота № 4 Тема: Використання мови sql для розробки запитів на пошук відсутніх даних про об’єкти предметної області та вибірки за зразком
- •Лабораторне завдання №4
- •7.5. Лабораторна робота № 5 Тема: Запити з агрегованими функціями
- •Лабораторне завдання №5
- •Індивідуальні завдання
- •7.6. Лабораторна робота № 6 Тема: Використання мови sql для розробки багатотабличних запитів
- •Лабораторне завдання №6
- •7.7. Лабораторна робота № 7 Тема: Використання мови sql для створення структури нової таблицї бази даних
- •Лабораторне завдання №7
- •8. Питання до контролю
- •Додаток а. Приклад реляційної моделі даних
- •Додаток б. Послідовні нормальні форми та вимоги до них
- •Додаток в.Приклади використання інструкцій sql для організаціїDde із інших додатків
- •Контрольні питання
- •Література
5. Використання sql для розробки запитів в Access
У запитах здійснюється відбір даних із бази даних та проведення доступних операцій над відібраними даними. Вибірку із бази даних здійснює, в основному, ператор SELECТ. Він має складний синтаксис і майже невичерпну множину варіантів застосування. Синтаксис оператора наведено у розділі 3.1., див стр.18
5.1. Звичайні вибірки sql та вибірки з умовою для однотабличних запитів
Прості вибірки
Інструкціії SQL автоматично створюються при розробці фільтрів і розширених фільтрів та при автоматичному створенні фільтру у вигляді запиту.
При створенні фільтру за виділенним значенням (відкрити таблицю у режимі Таблиці, виділити потрібне значення, натиснути кнопку Фильтр по выделенному) отримуємо відфільтрований список. Далі допустимими є наступні дії: натискаємо кнопку Изменить фильтр; у вікні запису фільтра вказуємо ще одну умову відбору даних; натикаємо на кнопку Сохранить как запрос, вказуємо ім'я запита. Запит створено автоматично. Відкриваємо створений запит у конструкторі запитів, та переглядаємо у режимі SQL (Вид, режим SQL).
Розглянемо приклади:
За тренінгову базу даних візьмемо базу “Тестування авто”, див. Додаток А.
Прості вибірки з фільтром
Наприклад, необхідно отримати результати тестування авто (див. Додаток А), які включають: або тестування несправності з кодом 3, тобто Код_несправності# =3, або результати лише автомобілів з кодом 5, тобто Код_автомобіля=5 , тоді фільтр буде записано так:
SELECT *
FROM [Результати тестування]
WHERE (([Результати тестування].[Код_несправності#])=3)) OR (([Результати тестування].Код_автомобіля)=5));
Пояснення:
Відповідно до вимог базової мови імена таблиці включено у квадратні дужки (не плутати з квадратними дужками у синтаксисі SQL). При посиланні на поле таблиці, з тієї ж причини, вказується Таблиця та ім’я поля (у квадратних дужках), розділених крапкою.
Знак “*” після SELECT вказує на те, що потрібно відібрати усі поля (без вертикального відбору) із таблиці, яка вказана у реченні FROM, та відібрати записи (горизонтальний відбір), які відповідають умовам, вказаним після WHERE.
Предикат, який іде за WHERE, може включати оператори порівняння (=, <,= >, <, >=, <>),бульові оператори AND, NOT, OR, а також дужки для того, щоб зазначити потрібний порядк обчислення, тобто для однозначної інтерпретації умови відбору.
Речення WHERE може мати простіші умови, залежно від умов горизонтального відбору, наприклад:
SELECT *
FROM [Результати тестування]
WHERE ((([Результати тестування].[Код_несправності#])=3));
Коли користувач розроблює запит у режимі конструктора запитів, Microsoft Access автоматично створює еквівалентну інструкцію SQL.
Користувач має можливість переглядати та змінювати інструкції SQL у режимі SQL (команда меню Вид, Режм SQL). Зміни, що внесені у запит у режимі SQL, викликають відповідні зміни у бланку запита у режимі конструктора.
Прості вибірка з упорядкуванням
Наприклад, побудуємо однотабличний запит, у якому в алфавітному порядку по прізвищам контролерів буде створено перелік несправностей автомобілів, виявлених контролерами:
SELECT [Довідник несправностей].[Код_несправності#], [Довідник несправностей].Назва_несправності, [Довідник несправностей].Контролер, [Довідник несправностей].[Ціна тестування]
FROM [Довідник несправностей]
ORDER BY [Довідник несправностей].Контролер;
Пояснення:
ORDER BY вказує на упорядкування списку за значенням поля, яке вказано далі (за прізвищем контролера). DESC означає сортування за зменшенням , ASC- сортування за зростанням. Якщо опція DESC/ ASC не вказується, то по замовчуванню, записи результуючої таблиці упорядковуються за зростанням значень зазначеного після ORDER BY.
Зауваження. Якщо у режимі SQL замість переліку полів в інструкції SELECT поставити “*”, то у нашому прикладі на результат роботи це не вплине. Поясніть чому.
Запити з параметрами
Організувати оперативну довідку про результати тестування групи авто, код якої вводитися у процесі виконання запиту
SELECT [Результати тестування].Код_автомобіля, [Результати тестування].[Код_несправності#], [Результати тестування].[Код_системи_двигуна#]
FROM [Результати тестування]
WHERE ((([Результати тестування].Код_автомобіля)=[Введіть код автомобіля]))
ORDER BY [Результати тестування].[Код_несправності#];
Фільтрація та сортування у запитах
Наприклад, необхідно одержати перелік груп автомобілей та коди несправностей в кривошипно – шатунному механізмі (Код _частини _двигуна# =1)
SELECT [Результати тестування].[Код_автомобіля], [Результати тестування].[Код_несправності#]
FROM [Результати тестування]
WHERE ([Результати тестування].[Код_системи_двигуна#] =1)
ORDER BY [Результати тестування].Код_автомобіля;
Результуюча вибірка може включати дублюючі записи:
-
Код_автомобіля
Код несправності#
1
5
1
5
2
3
3
3
5
3
9
3
Списки без дублюючих записів.
Щоб у список не включати повторення, вносимо зміни у SQL-інструкцію за допомогою ключового слова DISTINCT.
Вносимо зміни у SQL-інструкцію (у режимі SQL)
SELECT DISTINCT [Результати тестування].Код_автомобіля, [Результати тестування].[Код_несправності#]
FROM [Результати тестування]
WHERE ([Результати тестування].[Код_системи_двигуна#]=1)
ORDER BY [Результати тестування].[Код_автомобіля];
Запускаємо запит на виконання, отримуємо наступний список без дублюючих записів.
-
Код_автомобіля
Код несправності#
1
5
2
3
3
3
5
3
9
3
Пояснення та зауваження:
Щоб упорядкувати записи результуючого набора, можна виконати сортування по будь-якому числу полів, але вони мають бути вказані у реченні SELECT.
Речення ORDER BY <список полів> використовується для сортування і завжди має бути останнім в операторі SELECT.
У списку полів речення ORDER BY можуть бути або імена полів, або їх порядкові позиції у списку речення SELECT.
Якщо упорядковання проводиться за зростанням, то ключове слово ASC- може бути відсутнім (приймається по замовчуванню)
Горизонтальну вибірку реалізує речення WHERE, яке завжди записують після речення FROM
Предикати являють собою вирази, які можуть бути як простими виразами порівняння, так і являти собою комбінацію із будь-якого (скінченного) числа виразів, об’ єднаних логічними операторами AND, OR, NOT.
У предикатах може використовуватись SQL-оператор IS та круглі дужки для зміни порядку виконання операцій.
Предикат у мові SQL може приймати такі значення:
TRUE- истина –вірно, причому у числовому виразі- набуває значення 1;
FALSE- ложь- невірно, у числовому виразі набуває значення 0;
UNNOWN -неизвестно- невідомо у числовому виразі набуває значення 0,5.
Вкажемо правила комбінування:
TRUE AND UNNOWN = UNNOWN,
FALSE OR UNNOWN = UNNOWN,
NOT UNNOWN= UNNOWN.
Для символьних виразів (у SQL тип даних CHARACTERE) може застосовуватись предикат порівняння. Дані типу Дата порівнюються у хронологічному порядку.
Проста вибірки з умовою на діапазон значень
Наприклад, необхідно створити перелік несправностей автомобіля, тестування яких коштує від 60 до 180 грошових одиниць. Перелік упорядкувати по спаданню ціни.
SELECT [Довідник несправностей].[Код_несправності#], [Довідник несправностей].[Назва_несправності], [Довідник несправностей].[Контролер], [Довідник несправностей].[Ціна тестування]
FROM [Довідник несправностей]
WHERE (([Довідник несправностей].[Ціна тестування]) Between 60 And 180)
ORDER BY [Довідник несправностей].[Ціна тестування] DESC;
Пояснення:
Предикат Between перевіряє чи належать вказаному діапазону значення виразу, що перевіряється.
Значення виразу, що перевіряється, та значення пограничних виразів повинні бути сумісними за типами даних.
Вибірки за зразком (з предикатом Like) та з використанням оператора IN
Розглянемо приклади:
Нехай необхідно вивести усі несправності, що вказують на гіперфункції роботи двигунів, що проходили тестування.
SELECT [Довідник несправностей].[Назва_несправності], [Довідник несправностей].[Контролер], [Довідник несправностей].[Ціна тестування]
FROM [Довідник несправностей]
WHERE ((([Довідник несправностей].Назва_несправності) Like "З*"));
Пояснення:
Оператор Like призначено для порівняння рядкового виразу зі зразком, який потрібно задати після оператора Like у виразі SQL.
Синтаксис оператора Like
выражение Like "образец"
выражение – це вираз SQL, що використовується у реченні WHERE,
образец це текст, з яким порівнююється вираз. Текст може включати маскуючі символи. Найбільш часто використовують наступні з них:
символ “*” - замінює будь-які символи у будь-якій кількості символів, наприклад : а*, *а, *авс* , тощо;
Символ “?”- замінює тільки один символ, , наприклад,: а??, ?арка, с???, a?с*, тощо.
Зауваження: У стандарті мови SQL замість знака “*” використовується знак “_”, а замість “?” використовують знак “%”.
Наведемо ще один приклад відбору даних за умовою:
SELECT [Системи двигуна].[Код_системи_двигуна#],
[Системи двигуна].Назва_системи
FROM [Системи двигуна]
WHERE (([Системи двигуна].Назва_системи) Not Like "Система*");
Рекомендується переглянути приклад та вказати призначення запиту самостійно.
Зауваження:
У тих випадках, коли або вираз, що перевіряють, або зразок є порожніми величинами (мають значення NULL), то предикат приймає значення “ TRUE “.
Якщо вираз і зразок мають одночасно довжину 0, то предикат приймає значення “TRUE”.
Оператор IN
Оператор IN використовують, у випадках необхідності перевірки співпадання значення виразу з одним із елементів вказанного списка.
Синтаксис оператора IN:
выражение [Not] In(значение_1, значение_2, . . .)
Аргументи оператора In:
Выражение: Вираз, який визначає поле, значення якого потрібно знайти у списку;
Значение_1, значение_2, …: Вираз або список виразів, з якими порів-нюється выражение.
Якщо выражение є у списку значень, оператор In повертає значення True; інакше - False. За допомогою логічного оператора Not можно перевірити обернену умову (выражение не належить списку значень).
Розглянемо приклад: Необхідно отримати перелік несправностей, тестування яких коштує 30, 34 та 50 одиниць.
SELECT [Довідник несправностей].Назва_несправності, [Довідник несправностей].[Ціна тестування]
FROM [Довідник несправностей]
WHERE ((([Довідник несправностей].[Ціна тестування]) In (30,50,34)));
Вибірки з пошуком відсутніх даних
Для перевіки заповненості таблиці Результати тестування підготувати перелік незаповнених кодів. Зазначимо, що інколи для зручності користування знімається властивість Обязательное поле, тому важливі дані можуть бути не внесені у документ. Тому потрібно автоматизувати пошук відсутності даних у таких полях.
SELECT [Результати тестування].Код_автомобіля, [Результати тестування].[Код_несправності#], [Результати тестування].[Код_системи_двигуна#]
FROM [Результати тестування]
WHERE ((([Результати тестування].Код_автомобіля) Is Null)) OR ((([Результати тестування].Код_автомобіля) Is Null)) OR ((([Результати тестування].[Код_несправності#]) Is Null)) OR ((([Результати тестування].[Код_системи_двигуна#]) Is Null));
Пояснення:
Якщо ім’я поля не є ключовим (а отже зустрічається лише в одній із таблиць бази даних), то таке ім’я поля можна не заключати у квадратні дужки.
Предикат Is [Not] Null дозволяє перевірити наявність/відсутність даних у полях таблиці.
Is [Not] Null може використовуватись для аналізу даних про виконання певних робіт (наприклад, при складанні переліка боржників).
Запити з агрегованими ми функціями
Стандартом передбачено наступні агрегованіі функції:
СOUNT(*), СOUNT(<поле>), AVG, MIN, MAX,
де AVG, MIN, MAX мають загальноприйняті значення.
Функція СOUNT(*) підраховує кількість значень, без враховання порожніх комірок.
СOUNT(<поле>)- підраховує кількість значень.
У простому запиті (без підзапитів) аргументом агрегованої функції не може бути інша агрегована функція, наприклад, не можна одержати максимальне значення серед середніх. Агреговані функції включаються у речення SELECT. Наведемо приклади розробки запитів з агрегованими функціями:
Вибрати із бази даних максимальну ціну тестування автомобіля і середню ціну для усіх тестувань, окрім тих, які проводять контролери, що мають прізвище, що не починається літерою “І”.
SELECT Max([Довідник несправностей].[Ціна тестування]) AS Найдорожче, Avg([Довідник несправностей].[Ціна тестування]) AS Середня_ціна
FROM [Довідник несправностей]
WHERE (([Довідник несправностей].Контролер) Not Like "І*");
Результати відбору даних:
-
Найдорожче
Середня_ціна
130
53,8
Пояснення:
Якщо у задачі не вимагається виводити значення полів, а потрібно одержати лише єдине значення, розраховане за агрегованою функцію, то останню записують відразу після слова SELECT.
Агреговані функції своїми аргументами мають імена відповідних полів.
Результуючим полям можна задати нові імена, використавши ключове слово AS, яке записуємо відразу після даних, для яких вводитися псевдонім ( у нашому прикладі це – “Найдорожче” та “Середня_ціна”).
Якщо нове ім’я складається з кількох слів, то останні записуються через підкреслювання “_”, наприклад Середня_ціна.
Використання агрегованих функцій при визначенні груп записів (групування).
Групи визначаються у реченні GROUP BY. Розглянемо приклад: Підготувати перелік кодів несправностей, визначити кількість протестованих несправностей та представити дані у спадаючому порядку по кількості.
SELECT [Результати тестування].[Код_несправності#], Count(*) AS [Кількість]
FROM [Результати тестування]
GROUP BY [Результати тестування].[Код_несправності#]
ORDER BY Count(*) DESC;
Пояснення:
Агреговані функції, включені у речення SELECT.
Інструкції без речення GROUP BY виконуються над усіма результуючими рядками цього запиту.
Якщо у запиті є речення GROUP BY, то кожен набір рядків, який має однакові значення стовбчика чи групи стовбчиків, які задано у реченні GROUP BY, складають групу, агреговані функції виконуються для кожної групи.
Результат
-
Код несправності#
Кількість
2
6
5
4
4
4
3
4
7
2
10
1
6
1
Count(*), повертає кількість записів у кожній сформованій у реченні GROUP BY групі. Сортування проводиться саме за вказаними значеннями коду групи автомобілей. Тобто у прикладі ми отримали відомості про кількістьвипробувань у кожній групі авто.
Агреговані функції включаються у речення SELECT. При необхідності агрегованим функціям присвоюється псевдонім за допомогою AS.
Зауваження: Не лише теоретичні положення, але і ряд переглянутих нами запитів, вказують на те, що знак “ ; ” завжди повинен бути присутнім у кінці інструкції SQL.
Запити з підсумками та формуванням груп за змінною умовою
Розглянемо задачу: “Розробити запит для отримання оперативних даних про число проведених тестувань для даної групи автомобілів, номер якої задається у режимі виконання запиту”.
SELECT [Результати тестування].Код_автомобіля, Count([Результати тестування].[Код_несправності#]) AS [Кількість протестованих авто групи#]
FROM [Результати тестування]
GROUP BY [Результати тестування].Код_автомобіля
HAVING (([Результати тестування].Код_автомобіля)=[Введіть код автомобіля]);
Пояснення:
Підрахувати кількість авто, що належать до певної групи (мають відповідний код), які пройшли тестування у групі, можна за допомогою функції Count, ця функція має аргумент – стовпчик, у якому ми підраховуємо кількість записів.
Необхідно відібрати із стовпчика Код_несправності# (в таблиці Результати тестування ) за умовою, що коди авто мають певне значення, яке не є відомим заздалегідь.
Із сказаного випливає, що потрібно сформувати групу, включивши у неї весь стовпчик Код_несправності#, а потім, залежно від введеного кода авто, відібрати із групи потрібні записи та підрахувати кількість таких записів.
Речення HAVING застосовується після групування для визначення предиката, для фільтрування групи за вказаними у HAVING умовами відбору, наприклад
HAVING (([Результати тестування].Код_автомобіля)=[Введіть код автомобіля]);
Такий запит формує умови відбору по, введеному при виконанні запита, коду авто.
Агрегована функція підраховує кількість записів у одержаній вибірці.
У предикаті HAVING не можна використовувати псевдоніми для агрегованих функцій
Предикат у HAVING може використовувати різні оператори порівняння, логічні опратори, тобто все, що відповідає побудові предикатів для речення WHERE, відноситься і до предиката речення HAVING.