Мова Маніпулювання Даними

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. Для цього потрібні три частини інформації:

  1. Назва таблиці та стовпця(ів) для оновлення

  2. Нове значення стовпця(ів)

  3. Який(і) рядок(и) оновити

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;

Наприклад, наведений вище запит надає ідентифікатори для нових рядків.