PostgreSQL: промышленная разработка баз данных. Лекция 3
-
Upload
nikolay-samokhvalov -
Category
Documents
-
view
525 -
download
0
Transcript of PostgreSQL: промышленная разработка баз данных. Лекция 3
PostgreSQL: промышленнаяразработка баз данных
Лекция 3
Манипуляционные средства языка SQL: операторы SELECT, UPDATE, INSERT, DELETE. Основные разделы оператора SELECT.
PostgreSQL: промышленная разработка баз данных. Лекция 3
Операторы SQL
Сегодня будем «препарировать» операторы SELECT/INSERT/UPDATE/DELETE
Что нас интересует? Синтаксис Семантика Процесс исполнения (алгоритмы)
PostgreSQL: промышленная разработка баз данных. Лекция 3
Операторы SQL
1. DDL (Data Definition Language): CREATE ..., ALTER ..., DROP ... и пр.
Примечание: в PostgreSQL DDLоператоры можно использовать в транзакциях!
2. Операторы манипулирования данными:
1. Выборка: SELECT
2. Удаление: DELETE
3. Обновление: UPDATE
4. Вставка: INSERT
Используют некоторые принципы образованияSELECT для определения целевого множества строк
Может использовать непосредственно операторSELECT для определения данных для вставки
PostgreSQL: промышленная разработка баз данных. Лекция 3
Оператор INSERT
Как устроен? Не забываем про \h:postgres=# \h INSERTCommand: INSERTDescription: create new rows in a tableSyntax:INSERT INTO table [ ( column [, ...] ) ] { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query } [ RETURNING * | output_expression [ AS output_name ] [, ...] ]
Пример:INSERT INTO person (person_name, person_age)VALUES ('Сергей', 22)RETURNING person_id AS id;
Может использовать непосредственно операторSELECT для определения данных для вставки
Полезное расширение, позволяет избежать дополнительного вызова SELECT
Можно вставлять сразу несколько строк
PostgreSQL: промышленная разработка баз данных. Лекция 3
Оператор DELETE
DELETE FROM [ ONLY ] table [ [ AS ] alias ] [ USING usinglist ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ RETURNING * | output_expression [ AS output_name ] [, ...] ]
Примеры:DELETE FROM person WHERE person_age < 18;
DELETE FROM personUSING "group"WHERE person_group_id = group_id AND group_name = 'aaa123';
Полезное расширение, даёт возможностьссылаться на другие таблицы в разделе WHERE
Для работы с курсорами (8.3; стандарт)Полезно при использованиимеханизма наследования
PostgreSQL: промышленная разработка баз данных. Лекция 3
Оператор UPDATE
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 ] [, ...] ]
Примеры:UPDATE person SET person_status = 'blocked' WHERE person_age < 18;
UPDATE personSET 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
Полезное расширение, даёт возможностьссылаться на другие таблицы в разделе WHERE
Для работы с курсорами (8.3; стандарт)Полезно при использованиимеханизма наследования
PostgreSQL: промышленная разработка баз данных. Лекция 3
Оператор SELECT
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ] [ HAVING condition [, ...] ] [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ] [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ] [ LIMIT { count | ALL } ] [ OFFSET start ] [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]
Примеры:SELECT 1;
SELECT CURRENT_TIMESTAMP;
SELECT now();
12
4
3
556
7
8
9
PostgreSQL: промышленная разработка баз данных. Лекция 3
Оператор SELECT
Примеры:SELECT person_name AS "name", person_age AS "age"FROM personWHERE age > 18;
SELECT group_name, person_nameFROM person, "group"WHERE person_group_id = group_id AND group_id IN (10, 11, 12);
SELECT group_name, person_nameFROM person JOIN "group" ON person_group_id = group_idWHERE 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
Проверка знаний и навыков
Результаты (ответы на пункты с предыдущих слайдов, описанные подчёркнутым текстом) присылать на [email protected]
PostgreSQL: промышленная разработка баз данных. Лекция 3
Литература: рекомендации для данной лекции
● PostgreSQL Reference Manual — II.4-II.8, VI.I (SELECT, INSERT, UPDATE, DELETE)
● Дейт, К.. Введение в системы баз данных — Главы 4, 7.7, Приложения А.2, Б.
● Кузнецов, С. Д. Основы баз данных — Лекции 13, 14, 15.
PostgreSQL: промышленная разработка баз данных. Лекция 3
Контакты
● Blog: http://nikolay.samokhvalov.com
● XMPP/GTalk: [email protected]
● Skype: samokhvalov & postgresmen
● +7 905 783 9804