Пошук уроків, статей та іншого контенту
Розрізнимо DDL, DML, DQL і DCL та визначимо призначення основних груп SQL-команд.
SQL (Structured Query Language) — мова для роботи з реляційними базами даних. За допомогою SQL можна:
створювати таблиці та інші об’єкти бази даних;
додавати, змінювати й видаляти дані;
отримувати потрібні записи;
керувати правами доступу користувачів.
SQL-команди зазвичай поділяють на категорії за їхнім призначенням:
DDL — опис структури бази даних;
DML — зміна даних;
DQL — отримання даних;
DCL — керування правами доступу.
Цей поділ є практичною класифікацією команд SQL. У різних джерелах окремі команди можуть класифікувати трохи по-різному.
DDL — мова визначення даних. Вона описує структуру бази даних: таблиці, стовпці, обмеження та інші об’єкти.
Основні DDL-команди в PostgreSQL:
CREATE — створити об’єкт;
ALTER — змінити структуру об’єкта;
DROP — видалити об’єкт;
TRUNCATE — швидко видалити всі записи з таблиці.
CREATE TABLE products (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL,
price numeric(10, 2) NOT NULL,
in_stock boolean NOT NULL DEFAULT true
);Ця команда створює таблицю products із такими стовпцями:
id — унікальний ідентифікатор;
name — назва товару;
price — ціна;
in_stock — ознака наявності товару.
PRIMARY KEY означає, що значення id має бути унікальним і не може бути NULL.
NOT NULL забороняє зберігати порожнє значення в стовпці.
DEFAULT true встановлює значення true, якщо його не вказали під час додавання запису.
Додамо до таблиці новий стовпець:
ALTER TABLE products
ADD COLUMN category text;Тепер кожен товар може мати категорію.
DROP TABLE products;Команда DROP TABLE видаляє саму таблицю разом із даними.
Будьте обережні з
DROP: відновлення видаленої таблиці залежить від наявності резервної копії.
TRUNCATE TABLE products;TRUNCATE видаляє всі записи, але залишає саму таблицю та її структуру.
Різниця між командами:
DROP TABLE видаляє таблицю;
TRUNCATE TABLE залишає таблицю, але видаляє всі записи;
DELETE видаляє записи та належить до DML.
DML — мова маніпулювання даними. Команди DML працюють із записами всередині вже створених таблиць.
Основні DML-команди:
INSERT — додати записи;
UPDATE — змінити записи;
DELETE — видалити записи.
INSERT INTO products (name, price, in_stock, category)
VALUES
('Keyboard', 49.99, true, 'accessories'),
('Monitor', 249.90, true, 'displays'),
('Webcam', 79.50, false, 'accessories');У прикладі додано три записи.
Значення id не вказується вручну, оскільки PostgreSQL генерує його автоматично.
UPDATE products
SET price = 229.90
WHERE name = 'Monitor';Команда змінює ціну монітора.
Умова WHERE визначає, які саме записи потрібно змінити. Якщо не вказати WHERE, будуть змінені всі записи:
-- Обережно: змінює ціну всіх товарів
UPDATE products
SET price = 0;DELETE FROM products
WHERE name = 'Webcam';Команда видаляє товар із назвою Webcam.
Як і для UPDATE, відсутність WHERE впливає на всі записи:
-- Обережно: видаляє всі записи, але не саму таблицю
DELETE FROM products;DQL — мова запитів до даних. У практичній класифікації до DQL найчастіше відносять команду SELECT.
SELECT отримує дані з однієї або кількох таблиць, але не змінює їх.
SELECT *
FROM products;Символ * означає «усі стовпці».
У прикладних програмах краще явно вказувати потрібні стовпці:
SELECT id, name, price
FROM products;Це робить запит зрозумілішим і не повертає зайві дані.
SELECT name, price
FROM products
WHERE price < 100;Запит повертає назви та ціни товарів, дешевших за 100.
SELECT name, price
FROM products
ORDER BY price DESC;DESC сортує від більшого значення до меншого. Для сортування за зростанням використовують ASC:
SELECT name, price
FROM products
ORDER BY price ASC;SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 2;Запит повертає два найдорожчі товари.
DCL — мова керування доступом. Вона визначає, які дії користувачі або ролі можуть виконувати з об’єктами бази даних.
Основні DCL-команди:
GRANT — надати права;
REVOKE — забрати права.
У PostgreSQL дозволи зазвичай надають ролям. Роль може представляти окремого користувача або групу користувачів.
Припустімо, у базі вже існує роль analyst. Надамо їй право читати таблицю products:
GRANT SELECT
ON TABLE products
TO analyst;Тепер роль analyst може виконувати запити SELECT до таблиці products.
Можна надати кілька прав одночасно:
GRANT SELECT, INSERT
ON TABLE products
TO analyst;Це дозволяє читати таблицю та додавати нові записи.
Щоб забрати право на додавання записів:
REVOKE INSERT
ON TABLE products
FROM analyst;Після цього роль analyst більше не зможе виконувати INSERT для цієї таблиці, якщо не має такого права з іншого джерела.
Для таблиць часто використовують:
SELECT — читання даних;
INSERT — додавання даних;
UPDATE — зміна даних;
DELETE — видалення даних;
ALL — усі доступні права.
Наприклад:
GRANT SELECT, UPDATE
ON TABLE products
TO analyst;Нижче наведено послідовність команд, яку можна виконати в PostgreSQL у тестовій базі даних:
-- DDL: створюємо таблицю
DROP TABLE IF EXISTS products;
CREATE TABLE products (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL,
price numeric(10, 2) NOT NULL,
in_stock boolean NOT NULL DEFAULT true
);
-- DML: додаємо записи
INSERT INTO products (name, price, in_stock)
VALUES
('Keyboard', 49.99, true),
('Monitor', 249.90, true),
('Webcam', 79.50, false);
-- DQL: отримуємо товари в наявності
SELECT id, name, price
FROM products
WHERE in_stock = true
ORDER BY price ASC;
-- DML: змінюємо ціну клавіатури
UPDATE products
SET price = 44.99
WHERE name = 'Keyboard';
-- DQL: перевіряємо змінені дані
SELECT id, name, price
FROM products
WHERE name = 'Keyboard';
-- DML: видаляємо вебкамеру
DELETE FROM products
WHERE name = 'Webcam';
-- DQL: перевіряємо підсумковий стан таблиці
SELECT id, name, price, in_stock
FROM products
ORDER BY id;Цей приклад демонструє типовий порядок роботи:
створення структури;
додавання даних;
отримання даних;
оновлення даних;
видалення даних;
повторне отримання даних для перевірки результату.
Поставте запитанню просте питання: що саме робить команда?
Змінює структуру таблиці або створює об’єкт? Це DDL.
Додає, змінює або видаляє записи? Це DML.
Лише читає та повертає дані? Це DQL.
Змінює права користувачів і ролей? Це DCL.
| Категорія | Основне призначення | Приклади | |---|---|---| | DDL | Робота зі структурою | CREATE, ALTER, DROP, TRUNCATE | | DML | Зміна записів | INSERT, UPDATE, DELETE | | DQL | Отримання записів | SELECT | | DCL | Керування доступом | GRANT, REVOKE |
DELETE і DROPDELETE FROM products;Видаляє записи, але залишає таблицю.
DROP TABLE products;Видаляє таблицю разом із її структурою.
WHERE в UPDATE і DELETEБез WHERE команда застосовується до всіх записів:
UPDATE products
SET in_stock = false;Такий запит змінить стан кожного товару.
Перед виконанням UPDATE або DELETE корисно спочатку перевірити вибірку:
SELECT *
FROM products
WHERE price < 100;SELECT * без потребиSELECT * зручний для швидкої перевірки, але в реальному коді краще явно перелічувати стовпці:
SELECT id, name, price
FROM products;Так запит зрозуміліший і стабільніший, якщо структура таблиці зміниться.
Додавання нового стовпця — це DDL:
ALTER TABLE products
ADD COLUMN category text;Додавання нового товару — це DML:
INSERT INTO products (name, price)
VALUES ('Mouse', 25.00);У першому випадку змінюється структура таблиці, у другому — її дані.
DDL відповідає за структуру бази даних.
DML змінює записи в таблицях.
DQL отримує дані за допомогою SELECT.
DCL керує правами ролей і користувачів.
DROP видаляє об’єкт, TRUNCATE очищає таблицю, а DELETE видаляє окремі записи або всі записи за умовою.
Перед використанням UPDATE і DELETE потрібно перевіряти умову WHERE.
Категорія SQL-команди визначається її призначенням: структура, дані, читання або доступ.