A) Прості вибірки з фільтром
Наприклад, необхідно отримати результати тестування авто (див. Додаток А), які включають: або тестування несправності з кодом 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, викликають відповідні зміни у бланку запита у режимі конструктора.
b) Прості вибірка з упорядкуванням
Наприклад, побудуємо однотабличний запит, у якому в алфавітному порядку по прізвищам контролерів буде створено перелік несправностей автомобілів, виявлених контролерами:
SELECT [Довідник несправностей].[Код_несправності#], [Довідник несправностей].Назва_несправності, [Довідник несправностей].Контролер, [Довідник несправностей].[Ціна тестування]
FROM [Довідник несправностей]
ORDER BY [Довідник несправностей].Контролер;
Пояснення:
· ORDER BY вказує на упорядкування списку за значенням поля, яке вказано далі (за прізвищем контролера). DESC означає сортування за зменшенням , ASC- сортування за зростанням. Якщо опція DESC/ ASC не вказується, то по замовчуванню, записи результуючої таблиці упорядковуються за зростанням значень зазначеного після ORDER BY.
Зауваження. Якщо у режимі SQL замість переліку полів в інструкції SELECT поставити “*”, то у нашому прикладі на результат роботи це не вплине. Поясніть чому.
c) Запити з параметрами
Організувати оперативну довідку про результати тестування групи авто, код якої вводитися у процесі виконання запиту
SELECT [Результати тестування].Код_автомобіля, [Результати тестування].[Код_несправності#], [Результати тестування].[Код_системи_двигуна#]
FROM [Результати тестування]
WHERE ((([Результати тестування].Код_автомобіля)=[Введіть код автомобіля]))
ORDER BY [Результати тестування].[Код_несправності#];
5.1.2. Фільтрація та сортування у запитах
a) Наприклад, необхідно одержати перелік груп автомобілей та коди несправностей в кривошипно – шатунному механізмі (Код _частини _двигуна# =1)
SELECT [Результати тестування].[Код_автомобіля], [Результати тестування].[Код_несправності#]
FROM [Результати тестування]
WHERE ([Результати тестування].[Код_системи_двигуна#] =1)
ORDER BY [Результати тестування].Код_автомобіля;
Результуюча вибірка може включати дублюючі записи:
Код_автомобіля | Код несправності# | |
b) Списки без дублюючих записів.
Щоб у список не включати повторення, вносимо зміни у SQL-інструкцію за допомогою ключового слова DISTINCT.
Вносимо зміни у SQL-інструкцію (у режимі SQL)
SELECT DISTINCT [Результати тестування].Код_автомобіля, [Результати тестування].[Код_несправності#]
FROM [Результати тестування]
WHERE ([Результати тестування].[Код_системи_двигуна#]=1)
ORDER BY [Результати тестування].[Код_автомобіля];
Запускаємо запит на виконання, отримуємо наступний список без дублюючих записів.
Код_автомобіля | Код несправності# |
Пояснення та зауваження:
· Щоб упорядкувати записи результуючого набора, можна виконати сортування по будь-якому числу полів, але вони мають бути вказані у реченні SELECT.
· Речення ORDER BY <список полів> використовується для сортування і завжди має бути останнім в операторі SELECT.
· У списку полів речення ORDER BY можуть бути або імена полів, або їх порядкові позиції у списку речення SELECT.
· Якщо упорядковання проводиться за зростанням, то ключове слово ASC- може бути відсутнім (приймається по замовчуванню)
· Горизонтальну вибірку реалізує речення WHERE, яке завжди записують після речення FROM
· Предикати являють собою вирази, які можуть бути як простими виразами порівняння, так і являти собою комбінацію із будь-якого (скінченного) числа виразів, об’ єднаних логічними операторами AND, OR, NOT.
· У предикатах може використовуватись SQL-оператор IS та круглі дужки для зміни порядку виконання операцій.
· Предикат у мові SQL може приймати такі значення:
1. TRUE- истина –вірно, причому у числовому виразі- набуває значення 1;
2. FALSE- ложь- невірно, у числовому виразі набуває значення 0;
3. UNNOWN -неизвестно- невідомо у числовому виразі набуває значення 0,5.
Вкажемо правила комбінування:
· TRUE AND UNNOWN = UNNOWN,
· FALSE OR UNNOWN = UNNOWN,
· NOT UNNOWN= UNNOWN.
Для символьних виразів (у SQL тип даних CHARACTERE) може застосовуватись предикат порівняння. Дані типу Дата порівнюються у хронологічному порядку.
5.1.3. Проста вибірки з умовою на діапазон значень
Наприклад, необхідно створити перелік несправностей автомобіля, тестування яких коштує від 60 до 180 грошових одиниць. Перелік упорядкувати по спаданню ціни.
SELECT [Довідник несправностей].[Код_несправності#], [Довідник несправностей].[Назва_несправності], [Довідник несправностей].[Контролер], [Довідник несправностей].[Ціна тестування]
FROM [Довідник несправностей]
WHERE (([Довідник несправностей].[Ціна тестування]) Between 60 And 180)
ORDER BY [Довідник несправностей].[Ціна тестування] DESC;
Пояснення:
· Предикат Between перевіряє чи належать вказаному діапазону значення виразу, що перевіряється.
· Значення виразу, що перевіряється, та значення пограничних виразів повинні бути сумісними за типами даних.
5.1.4. Вибірки за зразком (з предикатом Like) та з використанням оператора IN
Розглянемо приклади:
a) Нехай необхідно вивести усі несправності, що вказують на гіперфункції роботи двигунів, що проходили тестування.
SELECT [Довідник несправностей].[Назва_несправності], [Довідник несправностей].[Контролер], [Довідник несправностей].[Ціна тестування]
FROM [Довідник несправностей]
WHERE ((([Довідник несправностей].Назва_несправності) Like "З*"));
Пояснення:
· Оператор Like призначено для порівняння рядкового виразу зі зразком, який потрібно задати після оператора Like у виразі SQL.
· Синтаксис оператора Like
выражение Like "образец"
· выражение – це вираз SQL, що використовується у реченні WHERE,
· образец це текст, з яким порівнююється вираз. Текст може включати маскуючі символи. Найбільш часто використовують наступні з них:
- символ “*” - замінює будь-які символи у будь-якій кількості символів, наприклад : а*, *а, *авс* , тощо;
- Символ “?”- замінює тільки один символ, , наприклад,: а??, ?арка, с???, a?с*, тощо.
Зауваження: У стандарті мови SQL замість знака “*” використовується знак “_”, а замість “?” використовують знак “%”.
b) Наведемо ще один приклад відбору даних за умовою:
SELECT [Системи двигуна].[Код_системи_двигуна#],
[Системи двигуна].Назва_системи
FROM [Системи двигуна]
WHERE (([Системи двигуна].Назва_системи) Not Like "Система*");
$ Рекомендується переглянути приклад та вказати призначення запиту самостійно.
Зауваження:
· У тих випадках, коли або вираз, що перевіряють, або зразок є порожніми величинами (мають значення NULL), то предикат приймає значення “ TRUE “.
· Якщо вираз і зразок мають одночасно довжину 0, то предикат приймає значення “TRUE”.
c) Оператор IN
Оператор IN використовують, у випадках необхідності перевірки співпадання значення виразу з одним із елементів вказанного списка.
Синтаксис оператора IN:
выражение [Not] In(значение_1, значение_2, . . .)
Аргументи оператора In:
· Выражение: Вираз, який визначає поле, значення якого потрібно знайти у списку;
· Значение_1, значение_2, …: Вираз або список виразів, з якими порів-нюється выражение.
Якщо выражение є у списку значень, оператор In повертає значення True; інакше - False. За допомогою логічного оператора Not можно перевірити обернену умову (выражение не належить списку значень).
Розглянемо приклад: Необхідно отримати перелік несправностей, тестування яких коштує 30, 34 та 50 одиниць.
SELECT [Довідник несправностей].Назва_несправності, [Довідник несправностей].[Ціна тестування]
FROM [Довідник несправностей]
WHERE ((([Довідник несправностей].[Ціна тестування]) In (30,50,34)));
5.1.5. Вибірки з пошуком відсутніх даних
Для перевіки заповненості таблиці Результати тестування підготувати перелік незаповнених кодів. Зазначимо, що інколи для зручності користування знімається властивість Обязательное поле, тому важливі дані можуть бути не внесені у документ. Тому потрібно автоматизувати пошук відсутності даних у таких полях.
SELECT [Результати тестування].Код_автомобіля, [Результати тестування].[Код_несправності#], [Результати тестування].[Код_системи_двигуна#]
FROM [Результати тестування]
WHERE ((([Результати тестування].Код_автомобіля) Is Null)) OR ((([Результати тестування].Код_автомобіля) Is Null)) OR ((([Результати тестування].[Код_несправності#]) Is Null)) OR ((([Результати тестування].[Код_системи_двигуна#]) Is Null));
Пояснення:
· Якщо ім’я поля не є ключовим (а отже зустрічається лише в одній із таблиць бази даних), то таке ім’я поля можна не заключати у квадратні дужки.
· Предикат Is [Not] Null дозволяє перевірити наявність/відсутність даних у полях таблиці.
· Is [Not] Null може використовуватись для аналізу даних про виконання певних робіт (наприклад, при складанні переліка боржників).
·
5.1.6. Запити з агрегованими ми функціями
Стандартом передбачено наступні агрегованіі функції:
СOUNT(*), СOUNT(<поле>), AVG, MIN, MAX,
де AVG, MIN, MAX мають загальноприйняті значення.
Функція СOUNT(*) підраховує кількість значень, без враховання порожніх комірок.
СOUNT(<поле>)- підраховує кількість значень.
У простому запиті (без підзапитів) аргументом агрегованої функції не може бути інша агрегована функція, наприклад, не можна одержати максимальне значення серед середніх. Агреговані функції включаються у речення SELECT. Наведемо приклади розробки запитів з агрегованими функціями:
a) Вибрати із бази даних максимальну ціну тестування автомобіля і середню ціну для усіх тестувань, окрім тих, які проводять контролери, що мають прізвище, що не починається літерою “І”.
SELECT Max([Довідник несправностей].[Ціна тестування]) AS Найдорожче, Avg([Довідник несправностей].[Ціна тестування]) AS Середня_ціна
FROM [Довідник несправностей]
WHERE (([Довідник несправностей].Контролер) Not Like "І*");
Результати відбору даних:
Найдорожче | Середня_ціна |
53,8 |
Пояснення:
· Якщо у задачі не вимагається виводити значення полів, а потрібно одержати лише єдине значення, розраховане за агрегованою функцію, то останню записують відразу після слова SELECT.
· Агреговані функції своїми аргументами мають імена відповідних полів.
· Результуючим полям можна задати нові імена, використавши ключове слово AS, яке записуємо відразу після даних, для яких вводитися псевдонім ( у нашому прикладі це – “Найдорожче” та “Середня_ціна”).
· Якщо нове ім’я складається з кількох слів, то останні записуються через підкреслювання “_”, наприклад Середня_ціна.
b) Використання агрегованих функцій при визначенні груп записів (групування).
Групи визначаються у реченні GROUP BY. Розглянемо приклад: Підготувати перелік кодів несправностей, визначити кількість протестованих несправностей та представити дані у спадаючому порядку по кількості.
SELECT [Результати тестування].[Код_несправності#], Count(*) AS [Кількість]
FROM [Результати тестування]
GROUP BY [Результати тестування].[Код_несправності#]
ORDER BY Count(*) DESC;
Пояснення:
· Агреговані функції, включені у речення SELECT.
· Інструкції без речення GROUP BY виконуються над усіма результуючими рядками цього запиту.
· Якщо у запиті є речення GROUP BY, то кожен набір рядків, який має однакові значення стовбчика чи групи стовбчиків, які задано у реченні GROUP BY, складають групу, агреговані функції виконуються для кожної групи.
Результат
Код несправності# | Кількість |
· Count(*), повертає кількість записів у кожній сформованій у реченні GROUP BY групі. Сортування проводиться саме за вказаними значеннями коду групи автомобілей. Тобто у прикладі ми отримали відомості про кількістьвипробувань у кожній групі авто.
· Агреговані функції включаються у речення SELECT. При необхідності агрегованим функціям присвоюється псевдонім за допомогою AS.
Зауваження: Не лише теоретичні положення, але і ряд переглянутих нами запитів, вказують на те, що знак “ ; ” завжди повинен бути присутнім у кінці інструкції SQL.
c) Запити з підсумками та формуванням груп за змінною умовою
Розглянемо задачу: “Розробити запит для отримання оперативних даних про число проведених тестувань для даної групи автомобілів, номер якої задається у режимі виконання запиту”.
SELECT [Результати тестування].Код_автомобіля, Count([Результати тестування].[Код_несправності#]) AS [Кількість протестованих авто групи#]
FROM [Результати тестування]
GROUP BY [Результати тестування].Код_автомобіля
HAVING (([Результати тестування].Код_автомобіля)=[Введіть код автомобіля]);
Пояснення:
· Підрахувати кількість авто, що належать до певної групи (мають відповідний код), які пройшли тестування у групі, можна за допомогою функції Count, ця функція має аргумент – стовпчик, у якому ми підраховуємо кількість записів.
· Необхідно відібрати із стовпчика Код_несправності# (в таблиці Результати тестування ) за умовою, що коди авто мають певне значення, яке не є відомим заздалегідь.
· Із сказаного випливає, що потрібно сформувати групу, включивши у неї весь стовпчик Код_несправності#, а потім, залежно від введеного кода авто, відібрати із групи потрібні записи та підрахувати кількість таких записів.
Речення HAVING застосовуєтьсяпісля групування для визначення предиката, для фільтрування групи за вказаними у HAVING умовами відбору, наприклад
HAVING (([Результати тестування].Код_автомобіля)=[Введіть код автомобіля]);
Такий запит формує умови відбору по, введеному при виконанні запита, коду авто.
· Агрегована функція підраховує кількість записів у одержаній вибірці.
· У предикаті HAVING не можна використовувати псевдоніми для агрегованих функцій
· Предикат у HAVING можевикористовувати різні оператори порівняння, логічні опратори, тобто все, що відповідає побудові предикатів для речення WHERE, відноситься і до предиката речення HAVING.
Багатотабличні запити
Зазначимо, що на практиці більш часто вирішуються задачі, що потребують даних, які зберігаються у кількох Таблицях бази даних і пройшли певну обробку.
У синтаксисі інструкції SELECT (див. Розділ 3, стр. 18) у реченні FROM допускаєтьсявведення кількох таблиць, це означає, що можна створювати запити, що використовують дані кількох таблиць. Такі запити прийнято називати: “багатотабличними запитами”. Зазначимо, що у багатотабличних запитах, для таблиць бази даних можна використовувати псевдоніми.
5.2.1. Правило встановлення відповідності записів, що вибираються із різних Таблиць
Зазначимо, що просте перечислення Таблиць у реченні FROM відповідає реляційній операції декартового об’єднання, за допомогою якого число відібраних записів із вказаних Таблиць значно зростає і не відповідає вимогам користувача.
Тому потрібно вказувати правило встановлення відповідності об’єднання записів із різних таблиць.
Часто таким правилом може бути співпадання значень ключових полів. Вказане правило умови вибору відповідних даних з двох Таблиць (наприклад, імена таблиць будуть А та В) схематично можна представити наступним чином:
SELECT *
FROM А,В
WHERE a# =b#;
За таких умов об’єднуватись будуть тільки ті рядки, у яких співпадають значення ключових полів а# та b#. У процесі побудови логічної моделі умов доступа до даних можуть використовуватись і інші умови, але найчастіше використовується зазначена вище умова.
Розглянемо приклади:
Вибірка більше ніж з однієї таблиці
Приклад 1. Розв’яжемо задачу: “Підготувати дані про результати тестування перших трьох груп автомобілів, якщо тестування проводили контролери, прізвища яких починаються на літери від А до П, а коди частин двигуна, у яких виявлено несправності, можуть приймати значення 1, 2, 3”.
Для зручності викладу спочатку запишемо всю інструкцію, а потім розглянемо основні принципи побудови останньої.
SQL-інструкція для вирішення вказаної задачі може бути записана наступним чином:
SELECT [Результати тестування].[Код_автомобіля], [Довідник несправностей].Назва_несправності, [Результати тестування].[Код_несправності#], [Результати тестування].Довідка, [Результати тестування].[Код_системи_двигуна#], [Контролер].Пр
FROM [Контролер] INNER JOIN ([Довідник несправностей] INNER JOIN [Результати тестування] ON [Довідник несправностей].[Код_несправності#] = [Результати тестування].[Код_несправності#]) ON Контролер.[Код контролера] = [Довідник несправностей].Контролер
WHERE ((([Результати тестування].Код_автомобіля)<4) AND (([Результати тестування].[Код_системи_двигуна#])<4) AND ((Контролер.Пр)<"Р*"));
Результат відбору даних надано у наступній таблиці:
Код_автомобіля | Назва_несправності | Код несправності# | Довідка | Код_системи_двигуна | Контролер |
Перегрівання двигуна | 05.08.2010 | Іваненко А. А. | |||
Перегрівання двигуна | 01.09.2010 | Іваненко А. А. | |||
Перегрівання двигуна | 01.09.2010 | Іваненко А. А. | |||
Перегрівання двигуна | 05.08.2010 | Іваненко А. А. | |||
Збільшення витрат масла | 01.05.2010 | Іванчук К. І. | |||
Збільшення витрат масла | 01.05.2010 | Іванчук К. І. |
Пояснення до задачі:
· В запиті дані відбираються із трьох таблиць [Довідник несправностей] , [Результати тестування], [Контролер].
· Відібрані записи використовують для формування результуючої таблиці.
· Для нашого прикладу відібрані записи із таблиць вважаються відповідними, якщо співпадають значення ключових полів, тобто виконується умова:
[Довідник несправностей].[Код_несправності#]=[Результати тестування].[Код_несправності#].
Як слідує із вимог задачі, записи, що задовольняють вказаній вище умові, можуть бути відібраними у результуючу таблицю, але не усі, а лише ті із них, які відповідають “додатковим” умовам. Звичайно назва “додаткові умови “ є досить умовною і вказує лише на той факт, що за цими умовами записи відбираються лише із записів, для яких виконануються вказані умови відповідності .
· Для нашого прикладу всі “додаткові” умови вибору виконуються одночасно і тому можуть бути записані наступним чином:
((([Результати тестування].Код_автомобіля)<=3) AND (([Довідник несправностей].Контролер)<"Р*") AND (([Результати тестування].[Код_системи_двигуна#])<4));
· Як зазначалось раніше, вказані умови повинні виконуватись одночасно з основними умовами вибору відповідних записів із таблиць.
Об’єднання основних та “додаткових” умов логічним AND утворює предикат, який записуємо у реченні WHERE.
Якщо дані вибираються із двох (і більше) таблиць і встановлено правило відповідності вибраних записів, то говорять, що проведено операції з’єднання таблиць, а про таблиці говорять, що таблиці – є з’язаними.
Способи операцій з’єднання двох таблиць передбачено у синтаксисі SELECT.