Урок 15 Інформатика 11(ІКТ)
Основи мови SQL.
Мета.
Навчальна. Ознайомити з основами мови SQL, структура SQL-запиту.
Розвиваюча. Розвивати логічне та алгоритмічне мислення.
Виховна. Виховувати культуру мовлення.
Тип уроку. Урок засвоєння нових знань.
Учні повинні знати:
Учні повинні уміти:
Матеріали для роботи з учнями:
План
Хід уроку
1. Організація початку уроку.
3. Актуалізація опорних знань.
Тестування “Основи баз даних”
4. Мотивація навчальної діяльності.
Як ми вже зазначали, практично в усіх реляційних СКБД для маніпулювання даними застосовують мову SQL (англ. Structured Query Language — мова структурованих запитів), а такі автоматизовані засоби створення запитів, як ми розглядали в попередньому розділі, представлені лише в поодиноких системах керування базами даних. Тобто основний спосіб конструювання запитів до баз даних — це їх запис у текстовому вигляді, чимось подібний до написання невеличких програм. Однак мова SQL не є мовою програмування, вона декларативна, тобто дозволяє користувачу описати, що він хоче отримати, не описуючи, як саме комп’ютер має обчислити потрібний результат. Тому писати запити мовою SQL значно легше, ніж програми будь-якою мовою програмування. Загалом є кілька різновидів запитів: на вибирання даних, їх додавання, видалення, оновлення та деякі інші. Сьогодні навчимося описувати мовою SQL нескладні запити на вибирання даних.
5. Вивчення нового матеріалу.
Загальна структура SQL-запиту
Ви вже вмієте створювати запити на вибирання даних, або вибіркові запити за допомогою конструктора запитів MS Access.
Відмінною рисою цього типу запитів є те, що вони не змінюють дані в базі, а лише вибирають їх з таблиць за певними умовами. Результатом виконання будь-якого вибіркового запиту, нагадаємо, є віртуальна таблиця, що існує нетривалий час, поки ви її не закриєте.
Зрозуміти структуру вибіркового SQL-запиту найлегше на конкретному прикладі, розглянутому у вправі 9.1.
Вправа 9.1
Запишіть мовою SQL і виконайте запит визначити прізвища та імена учнів хлопців.
SELECT
FROM Учні;
У цій заготовці ви бачите два ключових слова: SELECT і FROM. Після слова FROM вказують назви таблиць, з яких вибиратимуться дані. У нашому випадку це буде таблиця Учні; її назву вже введено автоматично.
SELECT прізвище, [ім'я]
FROM Учні;
Зазначимо, що у квадратні дужки беруться також назви, які містять пробіл.
SELECT прізвище, [ім'я]
FROM Учні
WHERE стать="ч";
Загалом вибірковий SQL-запит має такий формат:
SELECT список полів, значення яких потрібно отримати
FROM список таблиць, з яких вибираються дані
WHERE умова, яку мають задовольняти записи, що вибираються
Зазначимо, що вирази, які починаються з ключових слів, часто називають фразами, наприклад фраза SELECT. Регістр ключових слів неважливий, але їх прийнято записувати великими літерами.
Зауважимо також, що мова SQL англізована, тобто її вирази дещо нагадують англійські речення. Слово SELECT перекладається як «вибрати», слово FROM — «з», a WHERE — «де», або «для яких». У цілому простий SQL-запит потрібно читати за такою схемою.
Запит SELECT х FROM у WHERE z слід інтерпретувати так: «вибрати поля х тих записів таблиці у, які задовольняють умову z».
Для допитливих.
Якщо запит із вправи 9.1 скласти в конструкторі, а потім перейти в режим SQL, то ми побачимо такий текст, автоматично сконструйований СКБД:
SELECT Учні.прізвище, Учні.[ім'я]
FROM Учні І
WHERE (((Учні.стать)="ч"));
За змістом він нічим не відрізняється від тексту, записаного нами в SQL-редакторі, але виглядає складнішим через те, що під час автоматичної побудови SQL-виразів MS Access вводить деякі зайві позначення. Так, після слова WHERE поставлено непотрібні дужки, а перед назвами атрибутів записано назву таблиці з символом крапки. Вираз Учні. прізвище можна читати як «поле прізвище таблиці Учні». Проте якщо у запиті всього одна таблиця, то поле прізвище ніякій іншій таблиці не може належати і тому специфікатор Учні . можна опустити.
Завдання 9.2
Запишіть мовою SQL запит визначити прізвища та номери паспортів учителів-математиків. Як перейти в режим уведення SQL-коду, описано у вправі 9.1.
З’єднання таблиць
Розглянемо запит визначити прізвища та імена вчителів, що викладають в НА класіу який ми вже реалізовували за допомогою конструктора запитів (див. рис. 8.7). Якщо створити цей запит у конструкторі, а потім відобразити його SQL-код та видалити зайві дужки і специфікатори, результат буде таким:
SELECT прізвище,[ім'я]
FROM Учителі INNER JOIN Викладання ON
Учителі.паспорт = Викладання.учитель
WHERE клас="11А"
У фразі FROM ми бачимо не назву таблиці і не список назв, а оператор INNER JOIN (у перекладі з англійської — внутрішнє з’єднання), призначений для з’єднання таблиць. Загальний синтаксис цього оператора такий:
Таблиця1 INNER JOIN Таблиця2 ON умова
Умова зазвичай стосується обох таблиць, вказаних до і після слів INNER JOIN (у прикладі вище — таблиць Учителі та Викладання). Оператор «зчіплює» ті записи таблиці 1 і таблиці 2, які, разом узяті, відповідають умові. У результаті з таких зчіпок формується нова таблиця, до якої вже застосовується відбір рядків згідно з фразою WHERE, а потім — відбір стовпців згідно з фразою SELECT.
Опишемо детальніше алгоритм, за яким СКБД виконує запит.
Оскільки у зв’язку між таблицями Учителі та Викладання таблиця Учителі є головною, а Викладання — підлеглою, то оператор Учителі INNER JOIN Викладання можна інтерпретувати так: «до кожного вчителя дописати інформацію про його викладання».
У загальному випадку SQL-запит виконується так:
Більшість вибіркових запитів до реляційних баз даних (але не всі) виконуються саме за цією схемою: з’єднання таблиць — вибірка записів — проекція на поля.
Для допитливих.
З’єднання, вибірка і проекція — три з восьми операцій реляційноі алгебри Кодда. Як уже згадувалося в розділі 1, реляційна алгебра — це мова маніпулювання даними, запропонована автором реляційної моделі Е. Код- дом. Багато її рис увібрала в себе мова SQL.
Завдання 9.2
Запишіть оператори INNER JOIN, які дозволять отримати в базі даних школа такі з’єднання таблиць, як показано на рис. 9.4, а-б
Завдання 9.3
Реалізуйте мовою SQL запит визначити, у якому класі клас ним керівником є Сошко Катерина Миколаївна.
Для допитливих.
З’єднувати таблиці можна і без оператора INNER JOIN. Для цього слід перелічити їхні назви через кому у фразі FROM, а у фразі WHERE записати умову з’єднання записів, долучивши її до інших умов сполучником AND. Наприклад, запит визначити прізвища та імена вчителів, що викладають в 11А класі можна реалізувати так:
SELECT прізвище,[ім'я]
FROM Учителі, Викладання
WHERE клас="11А" AND Учителі.паспорт =
Викладання.учитель
Підзапити
У попередньому розділі ми згадували про властивість реляцій- ної замкненості мови SQL. Вона полягає в тому, що результатом будь-якого запиту є таблиця, а отже, одні запити можна підставляти в інші замість таблиць. Загалом є два способи підстановки одного запиту в інший:
Підстановку можна здійснювати у фразах FROM та WHERE. Особливо важливий і цікавий той випадок, коли у фразі WHERE одного запиту записують повний текст іншого запиту. Розглянемо цей випадок детально, реалізувавши запит визначити прізвища та імена вчителів, що викладають в 11А класі, з використанням підзапиту. SQL-текст запиту буде таким:
SELECT прізвище,[ім'я]
FROM Учителі
WHERE паспорт IN (SELECT учитель FROM Викладання WHERE клас="11А")
У фразі WHERE цього запиту вжито оператор IN (англ. «в», «належить»). Його загальний формат такий:
значення IN (підзапит)
Результатом підзапиту має бути таблиця з одним стовпцем. Якщо вказане перед словом IN значення в цьому стовпці є, то весь вираз значення IN (підзапит) вважається істинним, інакше — хибним. Щоб краще зрозуміти принцип дії оператора IN, розглянемо крок за кроком виконання запиту визначити прізвища та імена вчителів, що викладають в 11А класі з точки зору СКБД.
2а. Виконуємо підзапит. Його результат — це набір номерів паспортів учителів НА класу (згадайте структуру таблиці Викладання).
2б. Перевіряємо, чи належить значення поля паспорт з поточного запису таблиці Учителі набору значень, отриманому на кроці 2а. Якщо належить, то запис у таблиці Учителі залишаємо, інакше — відкидаємо.
Таким чином, оператор IN дає змогу перевірити, чи належить значення множині результатів підзапиту. Зазначимо, що у фразу WHERE підзапит можна вставляти лише за допомогою логічного оператора, формуючи вираз, значення якого істинне або хибне. Однак це не обов’язково має бути оператор IN; є ще оператори EXISTS (англ. «існує»), ANY (англ. «будь-який»), ALL (усі). Так, значення виразу EXISTS (підзапит) буде істинним, якщо результат підзапиту містить хоча б один запис, і хибним, якщо результат підзапиту порожній.
Завдання 9.4
Використовуючи підзапит в операторі IN, реалізуйте мовою SQL запит визначити класи, у яких викладають вчителі на ім’я Петро.
Віднімання множин записів
Можливості мови SQL значно ширші за можливості конструктора запитів MS Access і тому далеко не кожен SQL-запит може бути створений у вікні конструктора. Зараз ми розглянемо найпростіший різновид запитів, які не можуть бути створені за допомогою конструктора. Це запити з запереченням, наприклад визначити прізвища та імена вчителів, які не викладають в 11А класі. Цей запит відрізняється від того, який ми розглядали раніше, наявністю частки «не». Якби її не було, ми би просто з’єднали таблицю вчителів із таблицею викладання, відібрали ті записи, які відповідають 10А класу, та спроектували результат на поля прізвище та ім'я. Але в запиті із часткою «не» нам потрібні не ці, а якраз всі інші вчителі. Тобто від множини всіх учителів нам потрібно відняти тих, які викладають у 10А класі. Найлегше це зробити за допомогою оператора NOT IN (англ. «не належить»):
SELECT прізвище,[ім'я]
FROM Учителі
WHERE паспорт NOT IN (SELECT учитель FROM Викладання WHERE клас=”11A")
Буквально запит читається так: «вибрати прізвища та імена тих учителів, які не належать множині вчителів, що викладають в 11А класі».
Завдання 9.5
Реалізуйте мовою SQL запит визначити назви класів, у яких не вчиться жодної дівчини.
6. Висновки.
SELECT список полів, значення яких потрібно отримати
FROM список таблиць, з яких вибираються дані
WHERE умова, яку мають задовольняти записи, що вибираються
7. Завдання для самостійного виконання
Реалізуйте мовою SQL такі запити.
8. Питання для роздумів
Формулювання
Реалізації
SELECT прізвище --А
FROM Учителі
WHERE NOT EXISTS (SELECT * FROM Викладання
WHERE клас Like "*11" AND клас NOT IN (SELECT клас FROM Викладання WHERE учитель=Учителі.паспорт))
SELECT прізвище --Б
FROM Учителі
WHERE EXISTS (SELECT * FROM Викладання
WHERE клас Like "*11" AND клас NOT IN (SELECT клас
FROM Викладання WHERE учитель=Учителі.паспорт))
SELECT прізвище - -В
FROM Учителі
WHERE EXISTS (SELECT * FROM Викладання
WHERE клас Like "*11" AND клас IN (SELECT клас
FROM Викладання WHERE учитель=
Учителі.паспорт))
SELECT прізвище --Г
FROM Учителі
WHERE NOT EXISTS (SELECT * FROM Викладання
WHERE клас Like "*11" AND клас IN (SELECT клас
FROM Викладання WHERE учитель=Учителі.паспорт))
Сформулюйте для цієї бази даних запити, які:
а) неможливо реалізувати за допомогою конструктора запитів;
б*) неможливо реалізувати засобами мови SQL.
9. Завдання для досліджень.
10. Домашнє завдання.