Створювати свої бази даних, таблиці та наповнювати їх даними можна прямо з системи управління базами даних, але для виконання цих операцій спершу доведеться познайомитися зі ще однією мовою програмування - SQL.
👉 Система управління базами даних (СУБД) - це окрема програма, яка працює як сервер, незалежно від PHP.
SQL або Structured Query Language (мова структурованих запитів) - мова програмування, призначена для управління даними в СУБД. Усі сучасні СУБД підтримують SQL.
Мовою SQL виражаються всі дії, які можна провести з даними: від запису і читання даних, до адміністрування самого сервера СУБД. Для повсякденної роботи зовсім не обов'язково знати всю цю мову; достатньо ознайомитися лише з основними поняттями синтаксису і ключовими словами.
Крім того, SQL дуже проста мова за своєю структурою, тому її освоєння не складе великих труднощів.
Мова SQL - це насамперед мова запитів, а крім того вона дуже схожа на природну мову. Щоразу, коли потрібно прочитати або записати будь-яку інформацію в БД, потрібно скласти коректний запит. Такий запит має бути виражений у термінах SQL.
Наприклад, щоб вивести на екран усі записи з таблиці міста, складемо такий запит:
ПРОЧИТАТИ все З ТАБЛИЦІ 'міста'
Якщо перекласти цей запит мовою SQL, то коректним результатом буде:
SELECT * FROM 'cities'
Тепер напишемо запит на додавання в таблицю міста нового міста:
ЗАПИСАТИ В ТАБЛИЦЮ 'міста' ЗНАЧЕННЯ `ім'я міста` = 'Київ'
Переклад SQL:
INSERT INTO 'cities' SET 'name' = 'Київ'
Ця команда створить у таблиці міста новий запис, де полю ім'я міста буде присвоєно значення Київ.
За допомогою SQL можна не тільки додавати і читати дані, а й:
видаляти й оновлювати записи в таблицях;
створювати і редагувати самі таблиці;
здійснювати операції над даними: рахувати суму, отримувати найбільше або найменше значення, тощо;
налаштовувати роботу сервера СУБД.
Існує безліч різних реляційних СУБД. Найвідоміша СУБД - це Microsoft Access, що входить до складу офісного пакета додатків Microsoft Office. Немає жодних перешкод для використання як СУБД MS Access, але для завдань веб-програмування набагато краще підходить альтернативна програма - MySQL.
На відміну від MS Access, MySQL абсолютно безкоштовна, може працювати на серверах з Linux, має набагато більшу продуктивність і безпеку, що робить її ідеальним кандидатом на роль бази даних у веб-розробці.
Переважна більшість сайтів і додатків на PHP використовують як СУБД саме MySQL.
Остання версія MySQL доступна для завантаження за посиланням: https://dev.mysql.com/downloads/mysql/. На цій сторінці слід вибрати MySQL Installer for Windows і натиснути на кнопку Download для завантаження.
У процесі встановлення запам'ятайте директорію, куди ви встановлюєте MySQL (ховається під посиланням Advanced options). На кроці Accounts and Roles установник попросить придумати пароль для доступу до БД (MySQL Root Password) - обов'язково запам'ятайте або запишіть цей пароль - він вам ще знадобиться.
Якщо для своєї роботи ви використовуєте програмне середовище OpenServer, то цей розділ можна сміливо пропустити, оскільки до складу OpenServer вже входить свіжа версія MySQL.
За замовчуванням, якщо ви не встановлювали додаткові програми, у MySQL немає графічного інтерфейсу користувача. Це означає, що єдиний спосіб роботи з нею - це використання командного рядка.
Відкрийте командний рядок (Виконати - cmd.exe).
Перейдіть до каталогу зі встановленою MySQL: cd d:\<каталог встановлення>\bin.
Виконайте: mysql -uroot -p.
Введіть пароль, заданий під час встановлення.
Якщо ви все виконали правильно, то в командному рядку запуститься клієнт для роботи з MySQL (ви зрозумієте це за рядком запрошення "mysql>"). З цього моменту можна вводити будь-які SQL запити, але кожен запит обов'язково повинен закінчуватися крапкою з комою ;.
Далі для роботи комфортніше буде використовувати кліент MySQL з графічною оболонкою. Наприклад, можна використовувати MySQL Workbench. Скачати його можно за цим посиланням: https://dev.mysql.com/downloads/workbench/
Приступимо до практики - почнемо створювати базу даних для ведення погодного щоденника.
Почати слід зі створення нової бази даних для нашого сайту. Нова БД у MySQL створюється простою командою:
CREATE DATABASE <ім'я бази даних>;
Після цього MySQL створить для нас нову БД, у якій відбуватиметься вся подальша робота. Це важливо: після створення БД її неможливо буде перейменувати, а тільки видалити і створити заново. З цієї причини вкрай уважно підійдіть до вибору імені для бази даних.
Навіщо потрібен: створення таблиць
Створивши нову БД, повідомимо MySQL, що тепер ми збираємося працювати саме з нею. Вибір активної БД виконується командою:
USE <ім'я бази>;
Настав час створити перші таблиці! Для ведення щоденника за всіма правилами знадобиться створити три таблиці: міста (cities), користувачі (users) і записи про погоду weather_log. У підрозділі "Запис" цього розділу описано, який вигляд має мати структура таблиці weather_log. Перекладемо цей опис мовою SQL:
CREATE TABLE weather_log (
id INT AUTO_INCREMENT PRIMARY KEY,
city_id INT,
day DATE,
temperature INT,
cloud TINYINT DEFAULT 0
);
Тепер створимо таблицю міст:
CREATE TABLE cities (
id INT AUTO_INCREMENT PRIMARY KEY,
name CHAR(128)
);
MySQL може показати створену таблицю, якщо попросити про це командою:
SHOW COLUMNS FROM weather_log
У відповіді буде перераховано всі поля таблиці, їхній тип та інші характеристики.
У прикладі зі створенням нової таблиці під час перерахування необхідних полів першим полем іде id INT AUTO_INCREMENT PRIMARY KEY. Це поле називається первинним ключем. Обов'язково створювати первинний ключ у кожній таблиці.
👉 Первинний ключ - це особливе поле, в якому зберігається унікальний ідентифікатор запису.
Первинний ключ потрібен, щоб у програміста і бази даних завжди була можливість однозначно звернутися до одного конкретного запису для його читання, оновлення або видалення. Якщо призначити поле первинним ключем, то БД стежитиме за тим, щоб значення в цьому полі більше не повторювалося в таблиці.
А якщо ще й додати атрибут AUTO_INCREMENT, то MySQL під час додавання нових записів заповнюватиме це поле сама. AUTO_INCREMENT відіграватиме роль лічильника - кожен новий запис у таблиці отримає значення на одиницю більше максимального наявного значення.
Навіщо потрібен: додавання запису в таблицю
Почнемо з додавання нових даних у таблицю. Для додавання запису використовується такий синтаксис:
INSERT INTO <назва таблиці> SET <ім'я стовпця1> = <значення1>, <ім'я стовпця2> = <значення2>...
Спочатку додамо місто в таблицю міст:
INSERT INTO cities SET name = 'Київ';
Під час додавання запису необов'язково вказувати значення для всіх полів. Багато з полів мають значення за замовчуванням, які самі заповнюються під час збереження.
Тепер створимо запис про погоду за сьогодні.
Під час визначення таблиці weather_log ми вирішили посилатися на місто, шляхом запису в поле city_id ідентифікатора міста з таблиці cities. Оскільки ми щойно додали нове місто, нічого не заважає використовувати його ідентифікатор у записі про погоду.
Ідентифікатором міста буде первинний ключ, який також був визначений як перше поле таблиці. Нумерація цього поля починається з одиниці, отже, перший доданий запис має ідентифікатор 1. Знаючи це, запит на додавання запису про погоду в Києві за третє вересня 2017 року має такий вигляд:
INSERT INTO weather_log SET city_id = 1, day = '2017-09-03', temperature = 5, cloud = 1;
Читання інформації з БД
Для виведення інформації з БД використовуються запити типу SELECT.
У запиті потрібно вказати ім'я таблиці, необхідні поля, а також додаткові параметри (будуть розглянуті в наступному уроці).
SELECT <перелік полів> FROM <ім'я таблиці>;
Наприклад, щоб отримати список усіх доступних міст:
SELECT id, name FROM cities
Усі погодні записи:
SELECT id, day, city_id, temperature, cloud FROM weather_log
Замість перерахування всіх стовпців можна використовувати знак зірочки - *.
Під час додавання запису дуже легко припуститися помилки: зробити друкарську помилку, не вказати значення для одного з полів тощо. Природно, мова SQL пропонує можливості для редагування вже створених записів.
Припустимо, що під час додавання погодного запису користувач помилився і ввів неправильну дату. Щоб виправити цю помилку, потрібно використовувати оператор оновлення - UPDATE. Запит із цим оператором дає змогу оновити значення одного або декількох полів в наявному записі. Виглядає він так:
UPDATE <ім'я таблиці> SET <ім'я стовпця1> = <значення1>, <ім'я стовпця2> = <значення2>... WHERE <ім'я стовпця> = <значення>;
Але щоб правильно скласти запит, необхідно визначити умову для пошуку запису, який пропонується оновити. В іншому разі, якщо не вказати цю умову, то буде оновлено абсолютно всі записи в таблиці.
Як таку умову найкраще використовувати первинний ідентифікатор запису. Тому, перш ніж виконувати запит оновлення, потрібно виконати запит на читання інформації з таблиці, щоб дізнатися, під яким ідентифікатором зберігся помилковий запис. Припустимо, цей ідентифікатор - одиниця, а правильна дата - сьоме грудня 2022 року.
Запит на оновлення:
UPDATE weather_log SET day = '2022-12-07' WHERE id = 1;
У нашій таблиці для зберігання погодного щоденника місто зберігається як ідентифікатор, тому під час звичайного читання даних із цієї таблиці замість назви міста стоїть незрозуміле число. Щоб підставити на місце числа дійсне значення, а конкретніше - назву міста, в SQL існують оператори об'єднання - JOIN. Підтримка операторів об'єднання і дозволяє базі даних називатися реляційною.
Змінимо запит на показ погодних записів, щоб він об'єднував дві таблиці, а в полі міста показувалася його назва, а не ідентифікатор:
SELECT day, cities.name, temperature, cloud FROM weather_log JOIN cities ON weather_log.city_id = cities.id
Важливо засвоїти три найголовніші моменти:
Під час читання з об'єднаних таблиць, у перерахуванні полів після SELECT потрібно явно вказувати в полі імені також ім'я таблиці, з якою проводиться об'єднання.
Завжди є основна таблиця (tb1), з якої читається більшість полів, і приєднувана (tb2), ім'я якої визначається після оператора JOIN.
Крім зазначення імені другої таблиці, обов'язково слід вказати умову, за якою відбуватиметься об'єднання. У цьому прикладі такою умовою буде відповідність ідентифікатора міста з tb1 (weather_log.city_id) первинному ключу міста з tb2 (cities.id).