Лабораторна робота №5 на тему Створення запитів мовою SQL, Бази даних та інформаційні системи, ЗНТУ
« НазадЛабораторна робота №5 на тему Створення запитів мовою SQLМета роботи: вивчити деякі команди мови SQL та навчитися за їх допомогою створювати запити в Access. 5.1 Інструкція SELECT мови SQLПри створенні запитів в режимі конструктора автоматично створюється інструкція на мові SQL. Її можна переглянути за допомогою меню і внести зміни. Оптимізатор запитів (QueryOptimizer) обробляє запит після запуску і будує найефективніший план його виконання. Оптимізатор може навіть змінити структуру запиту. Інструкція Select має такі розділи: SELECT перелік полів або виразів INTO ім’я нової таблиці FROM перелік таблиць, з яких вибрані поля WHERE умови відбору записів GROUP BY поля або вирази для угруповання даних HAVING умови відбору записів після угруповання UNION ORDER BY перелік полів для сортування Обов’язковими є тільки розділи SELECT та FROM. Інші розділи краще використовувати в тому порядку, в якому вони тут записані. 5.1.1 Розділ SELECTВін визначає потрібні для запиту поля та вирази. Полю можна надати нове ім’я – псевдонім (alias). Можна створювати обчислювальні поля. Синтаксис розділу: SELECT [ ALL | DISTINCT | DISTINCTROW] <список полів > ;
Задача 5.1. Створити запит на вибірку даних, до якого увійдуть усі відомості про робітника з таблиці tvidom. SELECT * FROM tvidom ; Такий вигляд матиме інструкція SQL. Результати роботи запиту матимуть майже такий самий вигляд, як таблиця 1.6, тільки вибірка даних буде упорядкована за табельним номером. Access за замовчанням упорядковує дані за ключовим полем, якщо не вказаний якийсь інший варіант. Символ * використовується, якщо вибираються всі поля таблиці. Ім’я таблиці tvidom вказується у розділі FROM. Задача 5.2. Вивести прізвища тих робітників, яким була нарахована заробітна плата. SELECT DISTINCT tzarobitok.tn FROM tzarobitok; Така інструкція створює вибірку табельних номерів з таблиці tzarobitok. Але замість них виводяться прізвища, тому що в конструкторі таблиці tzarobitok була використана підстановка. Кожне прізвище виводиться лише один раз завдяки використанню ключового слова DISTINCT. Якщо його НЕ писати, то кожне прізвище буде виведено стільки разів, скільки воно зустрічається в таблиці. 5.1.2 Розділ FROMВ цьому розділі через кому записуються імена або псевдоніми таблиць та представлень, з яких вибираються дані. Якщо до запиту входить декілька таблиць, то треба вказувати типи їх з'єднання. Синтаксис: Головна таблиця JOIN TYPE дочірня таблиця ON умови зв’язку таблиць ON умови зв’язку таблиць вказує які поля таблиць треба порівнювати і яким чином. Найчастіше використовується оператор =. Інші оператори порівняння <, >, <=, >=, <> можна використовувати тільки в інструкції SQL, в режимі конструктора запитів це неможливо. JOINTYPE – тип з'єднання таблиць. Можливі такі типи: 1) INNER JOIN – встановлюється за замовчанням. До запиту включаються лише ті записи з обох таблиць, в яких співпадають значення відповідних полів. Задача 5.3. Створити запит на вибірку даних, до якого увійдуть прізвище робітника, його табельний номер, дата та сума заробітку. SELECT tvidom.tn, tvidom.fio, tzarobitok.dat, tzarobitok.zar FROM tvidom INNER JOIN tzarobitok ON tvidom.tn = tzarobitok.tn ORDER BY tzarobitok.dat ; З обох таблиць відбираються тільки ті записи, у яких співпадають значення табельних номерів. Розділ ORDER BY забезпечує сортування вибірки за датою. Інструкція відповідає запиту для задачі 2.1. 2) LEFT [OUTER] JOIN – до запиту включаються всі записи головної (лівої) таблиці, незалежно від того чи існують для них відповідні записи в дочірній (правій) таблиці. Якщо в правій таблиці немає даних для вибірки, в стовпці запиту їхнє місце вільне. Якщо в попередньому прикладі змінити тип зв’язку, то виведуться й прізвища тих робітників, які ще не працювали. Задача 5.4. Знайти відомості про робітників, які ще не працювали, тобто їхні заробітки відсутні в таблиці tzarobitok. SELECT tvidom.pidrozdil, tvidom.fio FROM tvidom LEFT JOIN tzarobitok ON tvidom.tn = tzarobitok.tn WHERE (((tzarobitok.tn) Is Null)) ; Ця інструкція відповідає запиту для задачі 2.6. З таблиці tvidom спочатку вибираються всі записи, а потім розділ WHERE уточнює умову відбору.Умова Is Nullзалишає у виборці тільки ті записи з таблиці tvidom, які не мають зв’язаних з ними записів у таблиці tzarobitok. 3) RIGHT [OUTER] JOIN – до запиту включаються всі записи правої таблиці, незалежно від того чи існують для них відповідні записи в лівій таблиці. 4) FULL [OUTER] JOIN – в MS Access відсутній. В SQL Server до запиту ввійдуть усі записи з двох таблиць: ті, що задовольняють умові з’єднання, і ті, що не задовольняють. 5.1.3 Розділ WHEREТут вказується логічна умова, від виконання якої залежить чи ввійде запис до вибірки. Можна вказати декілька умов, об’єднаних логічними операторами AND, OR або іншими. WHERE в невеликих запитах може замінити конструкцію INNER JOIN, але це суттєво зменшує швидкість виконання запиту. Задача 5.5. Вивести перелік заробітків, які знаходяться в межах від 30 грн. до 50 грн. (див. задачу 2.2) SELECT tvidom.tn, tvidom.fio, tzarobitok.dat, tzarobitok.zar FROM tvidom INNER JOIN tzarobitok ON tvidom.tn = tzarobitok.tn WHERE (((tzarobitok.zar)>=30 And (tzarobitok.zar)<=50)) ; Задача 5.6. Створити запит про заробітки, які були нараховані в певному місяці. Номер місяця вводити як параметр. PARAMETERS [Введіть номер місяця] Short ; SELECT tvidom.tn, tvidom.fio, tzarobitok.dat, tzarobitok.zar FROM tvidom INNER JOIN tzarobitok ON tvidom.tn = tzarobitok.tn WHERE (((Month([tzarobitok]![dat]))=[Введіть номер місяця])) ORDER BY tzarobitok.dat; Тип параметру вказують після службового слова PARAMETERS. 5.1.4 Розділ GROUP BYВін використовується для підсумкових запитів В списку полів розділу SELECT без змін дозволяється використовувати імена тільки тих полів, які входять до розділу GROUP BY. Усі інші поля повинні бути використані як аргументи підсумкових функцій AVG(), MAX(), MIN(), SUM(), COUNT() або інших. Задача 5.7. Створити запит про заробітки всіх робітників. Ця інструкція відповідає запиту для задачі 3.1. SELECT tvidom.tn, tvidom.fio, Sum(tzarobitok.zar) AS [Усього], Avg(tzarobitok.zar) AS [Середнє за день] FROM tvidom LEFT JOIN tzarobitok ON tvidom.tn = tzarobitok.tn GROUP BY tvidom.tn, tvidom.fio; 5.1.5 Розділ HAVINGВін дуже схожий на розділ WHERE. В них однакові правила запису логічних умов. Але умови, задані в розділі WHERE, перевіряються для окремих записів перед угрупованням, а умови розділу HAVING перевіряються для груп записів після угруповання стовпців, вказаних в розділі GROUP BY і звичайно містять підсумкові функції. Задача 5.8. Створити запит про заробітки тих робітників, які заробили більше 200 грн. (див. задачу 3.2) SELECT tvidom.tn, tvidom.fio, Sum(tzarobitok.zar) AS [Усього] FROM tvidom INNER JOIN tzarobitok ON tvidom.tn = tzarobitok.tn GROUP BY tvidom.tn, tvidom.fio HAVING (((Sum(tzarobitok.zar))>200)) ORDER BY tvidom.fio; Задача 5.9. Для кожного робітника підрахувати кількість днів, коли їхні заробітки становили більше 40 грн. (див. задачу 3.3) SELECT tvidom.fio, Count(tzarobitok.zar) as [Кількість днів] FROM tvidom INNER JOIN tzarobitok ON tvidom.tn = tzarobitok.tn WHERE (((tzarobitok.zar)>40)) GROUP BY tvidom.fio ORDER BY tvidom.fio; 5.1.6 Розділ ORDER BYВ цьому розділі вказуються імена полів або їх номери в списку полів даного запиту (нумерація починається з 1). За замовчанням встановлений порядок сортування за зростанням (ASC). Для сортування за зменшенням використовується службове слово DESC. 5.1.7 Оператор UNIONЗапит з використанням UNION можна створити тільки в режимі SQL. В результаті роботи створюється вибірка, яка містить рядки, що вибирає як перша, так і друга інструкція Select. Синтаксис: Інструкція SELECT UNION [ALL] Інструкція SELECT [ORDER BY …] Кількість стовпців в обох інструкціях SELECT повинна бути однаковою. Типи даних в стовпцях повинні бути ідентичними. Імена стовпців беруться з першої інструкції SELECT. Якщо вказаний предикат ALL, то будуть виведені всі рядки обох запитів, інакше співпадаючі рядки виводитися не будуть. Інструкцій SELECT може бути декілька, тоді треба вживати круглі дужки. Упорядкування ORDER BY можна використати єдиний раз після останньої інструкції, воно діє на всю вибірку. В ньому треба використовувати номери стовпців або їхні імена з першої вибірки. Задача 5.10. Створити запит на об'єднання інформації про всі заробітки робітників з таблиці arhiv та відомості за вказаний рік з таблиці tzarobitok. Рік задавати як параметр. Архівна таблиця arhiv (див. задачу 4.3) містить поля fio, tn та pidrozdil з таблиці tvidomі поля dat та zar з таблиці tzarobitok. Спочатку виберемо дані за вказаний рік і приєднаємо до них інформацію з таблиці arhiv. Однакові рядки повторюватися не будуть, тому що не вказаний предикат ALL. PARAMETERS [Введіть рік] Short ; SELECT tvidom.pidrozdil AS [Підрозділ], tvidom.fio AS [Прізвище], tvidom.tn AS [Табельний номер], tzarobitok.dat AS [Дата], tzarobitok.zar AS [Заробіток] FROM tvidom INNER JOIN tzarobitok ON tvidom.tn = tzarobitok.tn WHERE (((Year([tzarobitok.dat]))=[Введіть рік])) UNION SELECT arhiv.pidrozdil, arhiv.fio, arhiv.tn, arhiv.dat, arhiv.zar FROM arhiv ORDER BY [Підрозділ], [Прізвище] ; 5.1.8 Розділ INTOСинтаксис: INTO нова таблиця Результати запиту будуть записані в нову таблицю з вказаним іменем і потрібною структурою, яка створюється автоматично. Якщо таблиця з таким іменем вже існує, то вона буде вилучена. Задача 5.11. Записати до нової таблиці відомості про загальні заробітки всіх робітників (див. задачі 3.1 та 4.2). SELECT tvidom.tn AS [Табельний №], tvidom.fio AS Прізвище, Sum(tzarobitok.zar) AS Сума, Avg(tzarobitok.zar) AS [Середнє за день] INTO itogo FROM tvidom LEFT JOIN tzarobitok ON tvidom.tn = tzarobitok.tn GROUP BY tvidom.tn, tvidom.fio ORDER BY tvidom.fio ; 5.2 Інструкція INSERTЦя інструкція використовується для вставки нових рядків до існуючої таблиці. Таблиця з вказаним іменем повинна бути створена заздалегідь, або треба використовувати команду SELECT INTO. Синтаксис команди: INSERT INTO ім’я існуючої таблиці SELECT тіло запиту Вираз SELECT тіло запиту – це запит на вибірку з однієї або декількох таблиць, записаний за звичайними правилами. Задача 5.12. Записати до архівної таблиці itogo, яка містить відомості про загальні заробітки всіх робітників (див. задачу 5.11) дані про заробітки робітників за період з 1.1.2006р. до 30.6.2006р. INSERT INTO itogo SELECT tvidom.tn AS [Табельний №], tvidom.fio AS Прізвище, (tzarobitok.zar) AS Сума, (tzarobitok.zar) AS [Середнє за день] FROM tvidom INNER JOIN tzarobitok ON tvidom.tn=tzarobitok.tn WHERE tzarobitok.dat BETWEEN #1/1/2006# AND #6/30/2006# ORDER BY tvidom.fio; Дату запишемо в американському форматі в символах # і використаємо функцію BETWEEN для завдання проміжку дат. Інструкція INSERT може використовуватися й для вставки конкретних значень до одного рядка. Тоді вона має вигляд: Синтаксис команди: INSERT INTO ім’я існуючої таблиці (перелік стовпців) VALUES (перелік значень) Можна не вказувати перелік стовпців, тоді значення будуть вставлені до всіх стовпців, починаючи з першого. Самі значення вказуються після ключового слова VALUES. Кількість стовпців в переліку та кількість значень повинні співпадати. Значення повинні мати той же тип, що й стовпці, до яких вони повинні бути вставлені. Не можна задавати значення стовпців–лічильників. Задача 5.13. Вставити нові дані до таблиці tzarobitok. INSERT INTO tzarobitok Values (42 , #02/02/2006# , 100) В таблиці tzarobitok записані табельний номер, дата роботи та заробіток. В цьому випадку перелік полів можна не вказувати. INSERT INTO tzarobitok (tn , zar) VALUES (42 , 100) Якщо за замовчанням в конструкторі таблиці встановлено, що дата роботи дорівнює поточній даті, то це поле буде заповнено. Якщо значення за замовчанням не визначено, це поле залишиться вільним. 5.3 Інструкція UPDATEЦя інструкція виконує запит на оновлення даних в таблиці. Синтаксис команди: UPDATE ім’я таблиці SET ім’я поля = вираз WHERE критерій відбору Зі слова SET починається блок, що визначає список полів, для яких виконуватимуться зміни. В одній команді дозволяється змінювати значення декількох полів. Вираз може містити константи, змінні та поля, навіть ті, що змінюються. Змінення до таблиці вносяться після виконання команди, тобто вираз використовує старі значення полів. Дані змінюються тільки в рядках, які задовольняють умовам, записаним після слова WHERE. Задача 5.14. Робітникам, які мають дітей, збільшити нараховану суму на 20 грн. Перший спосіб. Використаємо існуючий зв’язок по полю tn (табельний номер) між таблицями tvidom і tzarobitok. Обмеження на кількість дітей вкажемо в умові відбору WHERE UPDATE tvidom INNER JOIN tzarobitok ON tvidom.tn = tzarobitok.tn SET tzarobitok.zar = [tzarobitok]![zar]+20 WHERE (((tvidom.ditej)>0)) ; Другий спосіб. Поле, для якого встановлений зв’язок між таблицями tvidom і tzarobitok, вкажемо в умові відбору WHERE. UPDATE tzarobitok, tvidom SET tzarobitok.zar = tzarobitok!zar+20 WHERE (((tzarobitok.tn)=[tvidom].[tn]) AND ((tvidom.ditej)>0)); 5.4 Інструкція DELETEІнструкція вилучає рядки з вказаної таблиці. Синтаксис: DELETE [список полів] FROM ім’я таблиці AS псевдонім WHERE умови вибору В список полів треба включати поля, які входять до умов вибору. Якщо в конструкції FROM вказане ім’я однієї таблиці і відсутній розділ WHERE, список полів можна не вказувати. Якщо в конструкції FROM вказуються імена декількох таблиць, то треба вказати , з якої саме таблиці вилучати дані. Якщо між таблицями встановлено зв’язок типу "один–до–одного", то можна вилучати дані з однієї з них. Якщо між таблицями встановлено зв’язок типу "один–до–багатьох", то можна вилучати дані тільки з боку "багатьох". Задача 5.15. Вилучити з таблиці tzarobitok відомості про заробітки робітників за вказаний рік. Рік вводити як параметр. PARAMETERS [Введіть рік] Short; DELETE tzarobitok .*, Year([tzarobitok]![dat]) FROM tzarobitok WHERE (((Year([tzarobitok]![dat]))=[Введіть рік])); 5.5 Інструкція TRANSFORMЦя інструкція створює перехресний запит. Синтаксис: TRANSFORM вираз із підсумковою функцією Інструкція SELECT PIVOT вираз [ IN список заголовків стовпчиків] Вираз із підсумковою функцією вказує, які саме підсумки та для яких полів будуть знайдені і записані до клітинок таблиці. Інструкція SELECT записується за звичайними правилами, але обов’язково повинна мати розділ GROUP BY. Значення полів, вибраних для угруповання, визначають заголовки підсумкових рядків. Їх може бути декілька. PIVOT вираз – задає стовпець або вираз, значення якого використовуються для заголовків стовпчиків. Список заголовків стовпчиків після слова IN пишеться через кому і може містити перелік значень в лапках, який визначає їхній вигляд та порядок. Конструкція IN – необов’язкова. Задача 5.16. Створити перехресний запит, до якого увійдуть загальні суми заробітку по кварталах для кожного підрозділу. TRANSFORM Sum(tzarobitok.zar) AS [сума] SELECT tvidom.pidrozdil, Sum(tzarobitok.zar) AS [Загальна сума] FROM tvidom INNER JOIN tzarobitok ON tvidom.tn = tzarobitok.tn GROUP BY tvidom.pidrozdil PIVOT "Квартал " & Format([dat],"q"); Інструкція відповідає запиту 3.4, результати роботи – рис. 3.8. 5.6 ПредикатиПредикат EXISTS Він перевіряє, що в підпорядкованому запиті існує бодай один рядок, який задовольняє умовам вибірки. В цьому випадку предикат приймає значення True (істина), а інакше – False (хибність). Немає значення, які саме значення повертає підпорядкований запит. Тому в підзапиті можна використовувати символ * замість конкретних полів. Використання підпорядкованих запитів – це не найкращий спосіб. Краще створювати запит на запиті. Приклад 5.17. Вивести прізвища людей, яким була нарахована заробітна плата. SELECT tvidom.fio FROM tvidom WHERE (((EXISTS (SELECT * FROM tzarobitok WHERE tvidom.tn = tzarobitok.tn)) = True)); Предикати SOME, ANY, ALL Синтаксис: Вираз знак порівняння [SOME | ANY | ALL] (підпорядкований-запит) Тип даних виразу повинен бути сумісним з типом даних стовпця, який повертає підпорядкований запит. Регістр при порівнянні не враховується.
5.7 Контрольні питання1. Яку структуру має команда SELECT ? 2. Які розділи команди SELECT є обов’язковими? Для чого вони призначені? Створення обчислювальних полів. 3. Створення запитів з кількох таблиць. Використання розділу JOIN. Які існують типи з'єднання таблиць? 4. Сортування даних вибірки. 5. Використання розділів GROUP BY та HAVING. 6. Використання розділу UNION. 7. Створення перехресного запиту. 8. Як створити нову таблицю для результатів вибірки за допомогою команди SELECT ? 9. Яка команда використовується для оновлення даних в таблиці? 10. Використання команди INSERT. 11. Вилучення даних з таблиці за допомогою SQL. 5.8 Індивідуальні завдання
Варіант 11. Об’єднати інформацію з архівної таблиці підсумків про продаж добрив за місяць з даними за поточний місяць про продаж добрив, обсяг замовлення на які становив більше 200 тон. 2. Для вказаного виробника збільшити вартість однієї тони добрива на 7%. Назву виробника вводити як параметр. Варіант 21. Об’єднати дані архівної таблиці загальної вартості перевезень за січень минулого року з інформацією про перевезення в поточному місяці. Упорядкувати вибірку за датою. 2. Створити нову таблицю з інформацією про замовлення на певний вид транспорту. Вид транспорту вводити як параметр. Варіант 31. Об’єднати інформацію з архівної таблиці про суми, сплачені в грудні минулого року, з даними про суми, сплачені в цьому році гостями, що зупинялися в готелях більше, ніж на 5 днів. 2. Створити перехресний запит, в якому для кожного рівня сервісу готелю та кожного типу номера підрахувати на скільки днів в середньому замовлявся номер. Варіант 41. Об’єднати інформацію з архівної таблиці про поставки матеріалів за лютий минулого року з інформацією про поставки матеріалів за лютий місяць цього року. 2. Для кожного з матеріалів 9вказати назву) підрахувати загальну замовлену кількість. Варіант 51. Об’єднати дані з архівної таблиці про всі сплачені в минулому році суми з інформацією про суми, сплачені в цьому році споживачами, які мають пільги. Упорядкувати вибірку за прізвищем споживача. 2. Вилучити з архівної таблиці інформацію про сплачені споживачами суми за минулий рік. Варіант 61. Об’єднати дані з архівної таблиці про загальну вартість замовлень за минулий рік для кожного з магазинів з інформацією про вартість замовлень для першого магазину в цьому році. Упорядкувати вибірку за назвою або кодом магазину. 2. Створити перехресний запит, в якому для кожного виробника та кожної назви продукції підрахувати середній обсяг замовленої партії. Варіант 71. Об’єднати дані з архівної таблиці про загальну вартість замовлень для одного з вузлів та інформацію про вартість замовлень для цього ж вузла в цьому році. 2. Вилучити з таблиці інформацію про замовлення, які вже виконані, тобто дата їхнього постачання вже минула. Варіант 81. Об’єднати дані з архівної таблиці про загальну вартість проданих квитків за останні 3 місяці минулого року з інформацією про вартість квитків, проданих в січні цього року. Упорядкувати вибірку за назвою аеропорту призначення. 2. Створити нову таблицю з інформацією про продаж квитків працівникам авіасервісу в цьому році. Варіант 91. Об’єднати дані з архівної таблиці про вартість лікування тих пацієнтів, що обслуговувались безкоштовно в минулому році, з інформацією про реальну вартість лікування в цьому році пацієнтів тієї ж пільгової категорії, які вже виписані з лікарні. Упорядкувати вибірку за прізвищем пацієнта. 2. До таблиці пацієнтів першої категорії добавити інформацію про пацієнтів другої пільгової категорії. Варіант 101. Об’єднати дані з таблиці про замовлення, що вимагають допоставки, з інформацією про замовлення цього року, обсяг яких становить 1000 примірників та більше. Упорядкувати вибірку за прізвищем автора та назвою книги. 2. Збільшити вдвічі замовлену та відправлену кількість книг, які видані в цьому році. Варіант 111. Об’єднати дані з архівної таблиці про продукцію, поставлену на склад в березні минулого року, з інформацією про продукцію, поставлену в березні цього року. Упорядкувати вибірку за номером цеху. 2. Для кожної назви продукції підрахувати її загальну кількість, що зберігається на складі. Варіант 121. Об’єднати дані з архівної таблиці про сплати абонентів, розмір яких становив більше 100 грн. на місяць, з інформацією про сплати абонентів, які мають пільги, за поточний місяць. Упорядкувати вибірку за номером телефону. 2. До таблиці з відомостями про абонентів однієї з пільгових категорій дописати відомості про абонентів ще однієї пільгової категорії. ЛІТЕРАТУРА
З повагою ІЦ "KURSOVIKS"! |