Мова Маніпулювання Даними
DML - це підмножина мови SQL, яка використовується для додавання, оновлення та видалення даних у таблицях бази даних.
SELECT
використовується для запиту даних з бази данихINSERT
використовується для вставки нових даних у таблицю„“UPDATE““ використовується для зміни існуючих даних
DELETE
використовується для видалення даних з таблиці
Створення нових записів
Коли таблицю створено, вона не містить даних. Вставлення даних заповнить таблицю значеннями. Дані вставляються по одному рядку за раз. Ви також можете вставити кілька рядків за допомогою однієї команди. Але неможливо вставити щось, що не є повним рядком.
Для створення нового рядка використовується команда INSERT
.
Значення даних перераховані в порядку, в якому стовпці з’являються в таблиці, розділені комами. Цей синтаксис має той недолік, що вам потрібно знати порядок стовпців у таблиці. Щоб уникнути цього, ви також можете перерахувати стовпці явно. Якщо ви не маєте значень для всіх стовпців, ви можете опустити деякі з них. У цьому випадку стовпці будуть заповнені значеннями за замовчуванням.
CREATE TABLE publisher
(
id INTEGER PRIMARY KEY,
name VARCHAR(128) NOT NULL CHECK (LENGTH(name) > 0),
website VARCHAR(255) UNIQUE,
email VARCHAR(255),
phone VARCHAR(32) UNIQUE
);
COMMENT
ON TABLE publisher IS 'publisher registered within a library db';
COMMENT
ON COLUMN publisher.name IS 'non-zero length publisher name';
ALTER TABLE publisher
OWNER TO libms;
INSERT INTO "publisher" ("id", "name", "website", "email", "phone")
VALUES (1, 'Zoonoodle', 'https://sfgate.com', 'bhaile0@blogtalkradio.com', '+55 (465) 224-8652');
INSERT INTO publisher (id, name, website, email, phone)
VALUES (2, 'Brainlounge', 'http://php.net', 'bfindlow1@paginegialle.it', '+389 (482) 470-2463');
INSERT INTO publisher
VALUES (3, 'Tanoodle', 'http://dyndns.org', 'cfleisch2@scribd.com', '+7 (852) 867-5041');
/*
* queries above demonstrate various ways to *insert* data
*/
Ви можете вставити кілька рядків однією командою.
CREATE TABLE author
(
id SERIAL PRIMARY KEY,
first_name VARCHAR(128) NOT NULL,
last_name VARCHAR(128) NOT NULL,
country VARCHAR(255),
dob DATE CHECK (dob < NOW() - INTERVAL '10 years'),
CHECK (LENGTH(first_name) > 0),
CHECK (LENGTH(last_name) > 0)
);
COMMENT
ON TABLE author IS 'authors registered in the library db';
COMMENT
ON COLUMN author.first_name IS 'non-zero length author''s first name';
COMMENT
ON COLUMN author.last_name IS 'non-zero length author''s last name';
COMMENT
ON COLUMN author.dob IS 'date of birth, at least 10 years old';
ALTER TABLE author
OWNER TO libms;
INSERT INTO publisher
VALUES (18, 'Flipopia', 'http://dion.ne.jp', 'fmidsonh@cyberchimps.com', '+351 (187) 901-9626');
INSERT INTO author (first_name, last_name, country, dob)
VALUES ('Letta', 'Casbolt', 'Poland', '1947-04-18'),
('Robbyn', 'Attwoul', 'Poland', '1954-10-17'),
('Hesther', 'Kisby', 'Ukraine', '1941-07-21'),
('Gav', 'Jewett', 'Czech Republic', '1988-02-05'),
('Jorrie', 'Klehyn', 'United States', '1941-08-07'),
('Genevieve', 'Ollington', 'United States', '1921-08-27'),
('Carrissa', 'Arrandale', 'United Kingdom', '1982-08-20'),
('Josepha', 'Dominichelli', 'Poland', '1976-12-03'),
('Montague', 'Duerden', 'Poland', '2003-11-09');
Примітка
Нижче є посилання на таблицю «видавництво». Подумайте про це, як про розміщення інформації про видавця безпосередньо в таблиці «книга».
CREATE TABLE book
(
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
synopsis TEXT,
isbn VARCHAR(16),
publisher_id INTEGER NOT NULL REFERENCES publisher ON DELETE RESTRICT,
publication_date DATE,
language VARCHAR(64),
page_count INTEGER,
keywords TEXT
);
COMMENT
ON TABLE book IS 'available books';
COMMENT
ON COLUMN book.title IS 'non-zero length book''s title';
COMMENT
ON COLUMN book.keywords IS 'whitespace separated keywords';
ALTER TABLE book
ADD CONSTRAINT check_title_length CHECK (LENGTH(title) > 0);
DROP TYPE IF EXISTS book_genre;
CREATE TYPE book_genre AS ENUM (
'Adventure',
'Biography',
'Comedy',
'Crime',
'Drama',
'Fantasy',
'Historical Fiction',
'Horror',
'Mystery',
'Poetry',
'Romance',
'Science Fiction',
'Self-Help',
'Thriller',
'Young Adult'
);
COMMENT
ON TYPE book_genre IS 'registered book genres enumeration';
ALTER TABLE book
ADD COLUMN genre book_genre;
ALTER TABLE book
OWNER TO libms;
-- require superuser access or `pg_read_server_files` role priveleges
COPY book (id, title, synopsis, isbn, publisher_id, publication_date, genre, language, page_count,
keywords) FROM '/var/lib/postgresql/assets/book.csv' DELIMITER ',' CSV HEADER;
-- update id sequence value
SELECT SETVAL('book_id_seq', (SELECT MAX(id) FROM book));
Змінення записів
Зміна даних, які вже є в базі даних, називається оновленням. Щоб оновити існуючі рядки, скористайтеся командою UPDATE
. Для цього потрібні три частини інформації:
Назва таблиці та стовпця(ів) для оновлення
Нове значення стовпця(ів)
Який(і) рядок(и) оновити
UPDATE book SET language = 'uk' WHERE publisher = 3;
Це може призвести до оновлення нульового, одного або багатьох рядків. Синтаксис оновлення досить простий. Спочатку ключове слово UPDATE
, за яким слідує назва таблиці. Далі йде ключове слово SET
, за яким слідує назва стовпця, знак рівності і нове значення стовпця. Нове значення стовпця може бути будь-яким скалярним виразом, а не лише константою. Більш ніж один стовпчик можна оновити за один раз, вказавши більше ніж одне присвоєння у реченні SET
.
Важливо
WHERE
є необов’язковим, але воно обмежує рядки, на які впливає команда UPDATE
. Якщо обмежень не вказано, то всі записи в таблиці буде оновлено новими значеннями.
UPDATE book SET language = 'uk';
Видалення даних
Досі ми пояснювали, як додавати дані до таблиць і як їх змінювати. Залишилося обговорити, як видалити дані, які більше не потрібні. Так само, як додавання даних можливе лише цілими рядками, ви можете видаляти дані з таблиці лише цілими рядками.
Для видалення рядків використовується команда DELETE
, синтаксис якої дуже схожий на команду UPDATE
.
DELETE FROM book WHERE publisher = 3;
Якщо просто писати:
DELETE FROM book;
то всі рядки в таблиці будуть видалені!
Повернення даних зі змінених рядків
Іноді буває корисно отримати дані зі змінених рядків під час маніпуляцій з ними. Команди INSERT
, UPDATE
і DELETE
мають необов’язковий параметр RETURNING
, який підтримує цю можливість. Використання RETURNING
дозволяє уникнути виконання додаткового запиту до бази даних для збору даних і є особливо цінним, коли інакше було б важко достовірно ідентифікувати змінені рядки.
INSERT INTO author (first_name, last_name, country, birthdate)
VALUES ('Wendye', 'Rowbotham', 'Poland', '1932-12-16'),
('Grannie', 'Kidner', 'United States', '1940-02-21'),
('Godart', 'Van Driel', 'United Kingdom', '1980-01-02'),
('Meara', 'Meenehan', 'United States', '1994-12-13')
RETURNING id;
Наприклад, наведений вище запит надає ідентифікатори для нових рядків.