Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sql.doc
Скачиваний:
41
Добавлен:
28.02.2016
Размер:
924.16 Кб
Скачать

5. Використання sql для розробки запитів в Access

У запитах здійснюється відбір даних із бази даних та проведення доступних операцій над відібраними даними. Вибірку із бази даних здійснює, в основному, ператор SELECТ. Він має складний синтаксис і майже невичерпну множину варіантів застосування. Синтаксис оператора наведено у розділі 3.1., див стр.18

5.1. Звичайні вибірки sql та вибірки з умовою для однотабличних запитів

      1. Прості вибірки

Інструкціії SQL автоматично створюються при розробці фільтрів і розширених фільтрів та при автоматичному створенні фільтру у вигляді запиту.

При створенні фільтру за виділенним значенням (відкрити таблицю у режимі Таблиці, виділити потрібне значення, натиснути кнопку Фильтр по выделенному) отримуємо відфільтрований список. Далі допустимими є наступні дії: натискаємо кнопку Изменить фильтр; у вікні запису фільтра вказуємо ще одну умову відбору даних; натикаємо на кнопку Сохранить как запрос, вказуємо ім'я запита. Запит створено автоматично. Відкриваємо створений запит у конструкторі запитів, та переглядаємо у режимі SQL (Вид, режим SQL).

Розглянемо приклади:

За тренінгову базу даних візьмемо базу “Тестування авто”, див. Додаток А.

  1. Прості вибірки з фільтром

Наприклад, необхідно отримати результати тестування авто (див. Додаток А), які включають: або тестування несправності з кодом 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, викликають відповідні зміни у бланку запита у режимі конструктора.

  1. Прості вибірка з упорядкуванням

Наприклад, побудуємо однотабличний запит, у якому в алфавітному порядку по прізвищам контролерів буде створено перелік несправностей автомобілів, виявлених контролерами:

SELECT [Довідник несправностей].[Код_несправності#], [Довідник несправностей].Назва_несправності, [Довідник несправностей].Контролер, [Довідник несправностей].[Ціна тестування]

FROM [Довідник несправностей]

ORDER BY [Довідник несправностей].Контролер;

Пояснення:

  • ORDER BY вказує на упорядкування списку за значенням поля, яке вказано далі (за прізвищем контролера). DESC означає сортування за зменшенням , ASC- сортування за зростанням. Якщо опція DESC/ ASC не вказується, то по замовчуванню, записи результуючої таблиці упорядковуються за зростанням значень зазначеного після ORDER BY.

Зауваження. Якщо у режимі SQL замість переліку полів в інструкції SELECT поставити “*”, то у нашому прикладі на результат роботи це не вплине. Поясніть чому.

  1. Запити з параметрами

Організувати оперативну довідку про результати тестування групи авто, код якої вводитися у процесі виконання запиту

SELECT [Результати тестування].Код_автомобіля, [Результати тестування].[Код_несправності#], [Результати тестування].[Код_системи_двигуна#]

FROM [Результати тестування]

WHERE ((([Результати тестування].Код_автомобіля)=[Введіть код автомобіля]))

ORDER BY [Результати тестування].[Код_несправності#];

      1. Фільтрація та сортування у запитах

  1. Наприклад, необхідно одержати перелік груп автомобілей та коди несправностей в кривошипно – шатунному механізмі (Код _частини _двигуна# =1)

SELECT [Результати тестування].[Код_автомобіля], [Результати тестування].[Код_несправності#]

FROM [Результати тестування]

WHERE ([Результати тестування].[Код_системи_двигуна#] =1)

ORDER BY [Результати тестування].Код_автомобіля;

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

Код_автомобіля

Код несправності#

1

5

1

5

2

3

3

3

5

3

9

3

  1. Списки без дублюючих записів.

Щоб у список не включати повторення, вносимо зміни у 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 може приймати такі значення:

  1. TRUE- истина –вірно, причому у числовому виразі- набуває значення 1;

  2. FALSE- ложь- невірно, у числовому виразі набуває значення 0;

  3. UNNOWN -неизвестно- невідомо у числовому виразі набуває значення 0,5.

Вкажемо правила комбінування:

  • TRUE AND UNNOWN = UNNOWN,

  • FALSE OR UNNOWN = UNNOWN,

  • NOT UNNOWN= UNNOWN.

Для символьних виразів (у SQL тип даних CHARACTERE) може застосовуватись предикат порівняння. Дані типу Дата порівнюються у хронологічному порядку.

      1. Проста вибірки з умовою на діапазон значень

Наприклад, необхідно створити перелік несправностей автомобіля, тестування яких коштує від 60 до 180 грошових одиниць. Перелік упорядкувати по спаданню ціни.

SELECT [Довідник несправностей].[Код_несправності#], [Довідник несправностей].[Назва_несправності], [Довідник несправностей].[Контролер], [Довідник несправностей].[Ціна тестування]

FROM [Довідник несправностей]

WHERE (([Довідник несправностей].[Ціна тестування]) Between 60 And 180)

ORDER BY [Довідник несправностей].[Ціна тестування] DESC;

Пояснення:

  • Предикат Between перевіряє чи належать вказаному діапазону значення виразу, що перевіряється.

  • Значення виразу, що перевіряється, та значення пограничних виразів повинні бути сумісними за типами даних.

      1. Вибірки за зразком (з предикатом Like) та з використанням оператора IN

Розглянемо приклади:

  1. Нехай необхідно вивести усі несправності, що вказують на гіперфункції роботи двигунів, що проходили тестування.

SELECT [Довідник несправностей].[Назва_несправності], [Довідник несправностей].[Контролер], [Довідник несправностей].[Ціна тестування]

FROM [Довідник несправностей]

WHERE ((([Довідник несправностей].Назва_несправності) Like "З*"));

Пояснення:

  • Оператор Like призначено для порівняння рядкового виразу зі зразком, який потрібно задати після оператора Like у виразі SQL.

  • Синтаксис оператора Like

выражение Like "образец"

  • выражение – це вираз SQL, що використовується у реченні WHERE,

  • образец це текст, з яким порівнююється вираз. Текст може включати маскуючі символи. Найбільш часто використовують наступні з них:

  • символ “*” - замінює будь-які символи у будь-якій кількості символів, наприклад : а*, *а, *авс* , тощо;

  • Символ “?”- замінює тільки один символ, , наприклад,: а??, ?арка, с???, a?с*, тощо.

Зауваження: У стандарті мови SQL замість знака “*” використовується знак “_”, а замість “?” використовують знак “%”.

  1. Наведемо ще один приклад відбору даних за умовою:

SELECT [Системи двигуна].[Код_системи_двигуна#],

[Системи двигуна].Назва_системи

FROM [Системи двигуна]

WHERE (([Системи двигуна].Назва_системи) Not Like "Система*");

 Рекомендується переглянути приклад та вказати призначення запиту самостійно.

Зауваження:

  • У тих випадках, коли або вираз, що перевіряють, або зразок є порожніми величинами (мають значення NULL), то предикат приймає значення “ TRUE “.

  • Якщо вираз і зразок мають одночасно довжину 0, то предикат приймає значення “TRUE”.

  1. Оператор IN

Оператор IN використовують, у випадках необхідності перевірки співпадання значення виразу з одним із елементів вказанного списка.

Синтаксис оператора IN:

выражение [Not] In(значение_1, значение_2, . . .)

Аргументи оператора In:

  • Выражение: Вираз, який визначає поле, значення якого потрібно знайти у списку;

  • Значение_1, значение_2, …: Вираз або список виразів, з якими порів-нюється выражение.

Якщо выражение є у списку значень, оператор In повертає значення True; інакше - False. За допомогою логічного оператора Not можно перевірити обернену умову (выражение не належить списку значень).

Розглянемо приклад: Необхідно отримати перелік несправностей, тестування яких коштує 30, 34 та 50 одиниць.

SELECT [Довідник несправностей].Назва_несправності, [Довідник несправностей].[Ціна тестування]

FROM [Довідник несправностей]

WHERE ((([Довідник несправностей].[Ціна тестування]) In (30,50,34)));

      1. Вибірки з пошуком відсутніх даних

Для перевіки заповненості таблиці Результати тестування підготувати перелік незаповнених кодів. Зазначимо, що інколи для зручності користування знімається властивість Обязательное поле, тому важливі дані можуть бути не внесені у документ. Тому потрібно автоматизувати пошук відсутності даних у таких полях.

SELECT [Результати тестування].Код_автомобіля, [Результати тестування].[Код_несправності#], [Результати тестування].[Код_системи_двигуна#]

FROM [Результати тестування]

WHERE ((([Результати тестування].Код_автомобіля) Is Null)) OR ((([Результати тестування].Код_автомобіля) Is Null)) OR ((([Результати тестування].[Код_несправності#]) Is Null)) OR ((([Результати тестування].[Код_системи_двигуна#]) Is Null));

Пояснення:

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

  • Предикат Is [Not] Null дозволяє перевірити наявність/відсутність даних у полях таблиці.

  • Is [Not] Null може використовуватись для аналізу даних про виконання певних робіт (наприклад, при складанні переліка боржників).

      1. Запити з агрегованими ми функціями

Стандартом передбачено наступні агрегованіі функції:

СOUNT(*), СOUNT(<поле>), AVG, MIN, MAX,

де AVG, MIN, MAX мають загальноприйняті значення.

Функція СOUNT(*) підраховує кількість значень, без враховання порожніх комірок.

СOUNT(<поле>)- підраховує кількість значень.

У простому запиті (без підзапитів) аргументом агрегованої функції не може бути інша агрегована функція, наприклад, не можна одержати максимальне значення серед середніх. Агреговані функції включаються у речення SELECT. Наведемо приклади розробки запитів з агрегованими функціями:

  1. Вибрати із бази даних максимальну ціну тестування автомобіля і середню ціну для усіх тестувань, окрім тих, які проводять контролери, що мають прізвище, що не починається літерою “І”.

SELECT Max([Довідник несправностей].[Ціна тестування]) AS Найдорожче, Avg([Довідник несправностей].[Ціна тестування]) AS Середня_ціна

FROM [Довідник несправностей]

WHERE (([Довідник несправностей].Контролер) Not Like "І*");

Результати відбору даних:

Найдорожче

Середня_ціна

130

53,8

Пояснення:

  • Якщо у задачі не вимагається виводити значення полів, а потрібно одержати лише єдине значення, розраховане за агрегованою функцію, то останню записують відразу після слова SELECT.

  • Агреговані функції своїми аргументами мають імена відповідних полів.

  • Результуючим полям можна задати нові імена, використавши ключове слово AS, яке записуємо відразу після даних, для яких вводитися псевдонім ( у нашому прикладі це – “Найдорожче” та “Середня_ціна”).

  • Якщо нове ім’я складається з кількох слів, то останні записуються через підкреслювання “_”, наприклад Середня_ціна.

  1. Використання агрегованих функцій при визначенні груп записів (групування).

Групи визначаються у реченні 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.

  1. Запити з підсумками та формуванням груп за змінною умовою

Розглянемо задачу: “Розробити запит для отримання оперативних даних про число проведених тестувань для даної групи автомобілів, номер якої задається у режимі виконання запиту”.

SELECT [Результати тестування].Код_автомобіля, Count([Результати тестування].[Код_несправності#]) AS [Кількість протестованих авто групи#]

FROM [Результати тестування]

GROUP BY [Результати тестування].Код_автомобіля

HAVING (([Результати тестування].Код_автомобіля)=[Введіть код автомобіля]);

Пояснення:

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

  • Необхідно відібрати із стовпчика Код_несправності# (в таблиці Результати тестування ) за умовою, що коди авто мають певне значення, яке не є відомим заздалегідь.

  • Із сказаного випливає, що потрібно сформувати групу, включивши у неї весь стовпчик Код_несправності#, а потім, залежно від введеного кода авто, відібрати із групи потрібні записи та підрахувати кількість таких записів.

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

HAVING (([Результати тестування].Код_автомобіля)=[Введіть код автомобіля]);

Такий запит формує умови відбору по, введеному при виконанні запита, коду авто.

  • Агрегована функція підраховує кількість записів у одержаній вибірці.

  • У предикаті HAVING не можна використовувати псевдоніми для агрегованих функцій

  • Предикат у HAVING може використовувати різні оператори порівняння, логічні опратори, тобто все, що відповідає побудові предикатів для речення WHERE, відноситься і до предиката речення HAVING.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]