You are on page 1of 13

PostgreSQL: промышленная

разработка баз данных


Лекция 3
Манипуляционные средства языка SQL:
операторы SELECT, UPDATE, INSERT, DELETE.
Основные разделы оператора SELECT.
Операторы SQL


Сегодня будем «препарировать» операторы 
SELECT/INSERT/UPDATE/DELETE


Что нас интересует?

Синтаксис

Семантика

Процесс исполнения (алгоритмы)

PostgreSQL: промышленная разработка баз данных. Лекция 3


Операторы SQL

1. DDL (Data Definition Language): CREATE ..., ALTER ..., DROP ... и пр.

Примечание: в PostgreSQL DDL­операторы можно использовать в 
транзакциях!
2. Операторы манипулирования данными:

1. Выборка: SELECT
2. Удаление: DELETE Используют некоторые принципы образования
SELECT для определения целевого 
3. Обновление: UPDATE множества строк

4. Вставка: INSERT
Может использовать непосредственно оператор
SELECT для определения данных для вставки

PostgreSQL: промышленная разработка баз данных. Лекция 3


Оператор INSERT


Как устроен? Не забываем про \h:
postgres=# \h INSERT
Command: INSERT Можно вставлять сразу несколько строк
Description: create new rows in a table
Syntax:
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
[ RETURNING * | output_expression [ AS output_name ] [, ...] ]

Полезное расширение, позволяет избежать  Может использовать непосредственно оператор
дополнительного вызова SELECT SELECT для определения данных для вставки


Пример:
INSERT INTO person (person_name, person_age)
VALUES ('Сергей', 22)
RETURNING person_id AS id;

PostgreSQL: промышленная разработка баз данных. Лекция 3


Оператор DELETE
Полезно при использовании
механизма наследования Для работы с курсорами (8.3; стандарт)

DELETE FROM [ ONLY ] table [ [ AS ] alias ]


[ USING usinglist ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ AS output_name ] [, ...] ]

Полезное расширение, даёт возможность
ссылаться на другие таблицы в разделе WHERE


Примеры:
DELETE FROM person WHERE person_age < 18;

DELETE FROM person


USING "group"
WHERE person_group_id = group_id AND group_name = 'aaa123';

PostgreSQL: промышленная разработка баз данных. Лекция 3


Оператор UPDATE
Полезно при использовании
механизма наследования Для работы с курсорами (8.3; стандарт)

UPDATE [ ONLY ] table [ [ AS ] alias ]


SET { column = { expression | DEFAULT } |
( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
[ FROM fromlist ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ AS output_name ] [, ...] ]

Полезное расширение, даёт возможность
ссылаться на другие таблицы в разделе WHERE


Примеры:
UPDATE person SET person_status = 'blocked' WHERE person_age < 18;

UPDATE person
SET person_status = 'blocked'
FROM "group"
WHERE person_group_id = group_id AND group_name = 'aaa123';
RETURNING person_id AS id, person_name AS name; -- return IDs&names of
-- affected persons
PostgreSQL: промышленная разработка баз данных. Лекция 3
Оператор SELECT

7
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
4
* | expression [ AS output_name ] [, ...]
1 [ FROM from_item [, ...] ]
2 [ WHERE condition ]
[ GROUP BY expression [, ...] ]
3
[ HAVING condition [, ...] ]
5 [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
6 [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ]
[, ...] ]
[ LIMIT { count | ALL } ]
8
[ OFFSET start ]
9 [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]


Примеры:
SELECT 1;

SELECT CURRENT_TIMESTAMP;

SELECT now();

PostgreSQL: промышленная разработка баз данных. Лекция 3


Оператор SELECT
Примеры:
SELECT
person_name AS "name", person_age AS "age"
FROM
person
WHERE
age > 18;

SELECT
group_name, person_name
FROM
person, "group"
WHERE
person_group_id = group_id
AND group_id IN (10, 11, 12);

SELECT
group_name, person_name
FROM
person
JOIN "group" ON person_group_id = group_id
WHERE
AND group_id IN (10, 11, 12);

PostgreSQL: промышленная разработка баз данных. Лекция 3


Упражнение 1
1. Создайте таблицу "test", состоящую из двух столбцов типов integer (первичный 
ключ) и float (числовые значения).
2. Заполните таблицу десятью случайными значениями, перенумерованными по порядку от 
1 до 10.
1. для нумерования по порядку используйте функцию generate_series(from,
to);
2. для заполнения случайными значениями используйте функцию random();
3. для определения сигнатуры функций используйте команду \df в psql (или 
доступную документацию).
4. поместите функции в раздел FROM оператора SELECT.
3. Произведите выборку всех данных из таблицы и проанализируйте увиденное.
4. Удалите все строки и повторите задание, поместив функцию random() в раздел 
списка выборки оператора SELECT.
5. В чём разница этих двух подходов?

PostgreSQL: промышленная разработка баз данных. Лекция 3


Упражнение 2
1. Создайте таблицу пользователей (произвольная форма), внесите туда 
несколько пользователей. У каждого пользователя должен быть флаг 
«активен» (для возможности блокировки пользователей).

2. Расширьте схему БД: «пользователь­блог(группа)­темы­комментарии»

3. Напишите SQL­запросы:

1. для создания новой темы;
2. для создания комментария к теме;
3. для блокировки пользователей;
4. для удаления всех комментариев всех заблокированных (неактивных) 
пользователей
5. для подсчёта количества тем у каждого пользователя (результат: две 
«колонки»: имя, кол­во тем)

PostgreSQL: промышленная разработка баз данных. Лекция 3


Проверка знаний и навыков

Результаты (ответы на пункты с предыдущих 
слайдов, описанные подчёркнутым текстом) 
присылать на pgedu2008msu@samokhvalov.com

PostgreSQL: промышленная разработка баз данных. Лекция 3


Литература:
рекомендации для данной лекции
● PostgreSQL Reference Manual — II.4-II.8, VI.I (SELECT,
INSERT, UPDATE, DELETE)
● Дейт, К.. Введение в системы баз данных — Главы 4, 7.7,
Приложения А.2, Б.
● Кузнецов, С. Д. Основы баз данных — Лекции 13, 14, 15.

PostgreSQL: промышленная разработка баз данных. Лекция 3


Контакты
● nikolay@samokhvalov.com
● Blog: http://nikolay.samokhvalov.com
● XMPP/GTalk: samokhvalov@gmail.com
● Skype: samokhvalov & postgresmen
● +7 905 783 9804

PostgreSQL: промышленная разработка баз данных. Лекция 3

You might also like