<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://www.wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%2F%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_1</id>
	<title>Базы данных/Лабораторная работа 1 - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://www.wikicshse.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%2F%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_1"/>
	<link rel="alternate" type="text/html" href="https://www.wikicshse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_1&amp;action=history"/>
	<updated>2026-06-06T22:24:16Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://www.wikicshse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_1&amp;diff=1980&amp;oldid=prev</id>
		<title>imported&gt;Luc1ph3r: Добавлена информация о том, где находятся логи.</title>
		<link rel="alternate" type="text/html" href="https://www.wikicshse.ru/index.php?title=%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/%D0%9B%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_1&amp;diff=1980&amp;oldid=prev"/>
		<updated>2016-06-04T11:08:05Z</updated>

		<summary type="html">&lt;p&gt;Добавлена информация о том, где находятся логи.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Задачи: освоить самые необходимые навыки настройки СУБД, получения данных и манипуляции с ними, а также составления простых отчетов.&lt;br /&gt;
&lt;br /&gt;
=== Введение ===&lt;br /&gt;
&lt;br /&gt;
Так как у некоторых групп лабораторные работы начинаются раньше первой лекции, то предлагается [http://wiki.cs.hse.ru/%D0%91%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D1%8B краткий список терминов], используемых в лабораторной работе.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL - популярная реляционная система управления базами данных. Эта СУБД используется многими крупными компаниями, являясь единственной хорошо развитой свободной альтернативой наряду с MySQL. Но по сравнению с MySQL, PostgreSQL предоставляет больше возможностей для работы с большими объемами данных (не &amp;quot;big data&amp;quot;, но до терабайта).&lt;br /&gt;
&lt;br /&gt;
В качестве базы данных в лабораторных работах будет использоваться база фильмов IMDB (сам сайт также использует эту СУБД). Дамп базы достаточно большой, поэтому, если у вас есть возможность, скачайте и импортируйте его заранее.&lt;br /&gt;
&lt;br /&gt;
Рекомендуется использовать Ubuntu 14.04 и PostgreSQL 8.1+. Также нужно примерно 10 Гб места на диске.&lt;br /&gt;
&lt;br /&gt;
Для выполнения запросов подойдет и терминал, но можно использовать IDE (например, DataGrip или любую другую от JetBrains с аналогичным плагином).&lt;br /&gt;
&lt;br /&gt;
База данных, которая используется в лабораторных работах: https://yadi.sk/d/EVhJUiroqgzWj&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Часть 1: Установка PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Первая задача состоит в том, чтобы установить СУБД и проверить ее работоспособность.&lt;br /&gt;
&lt;br /&gt;
Выполните в терминале:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install postgresql postgresql-contrib&lt;br /&gt;
&lt;br /&gt;
Сервер PostgreSQL создает отдельно пользователя в системе для доступа к базе. Чтобы переключиться на этого пользователя, выполните:&lt;br /&gt;
&lt;br /&gt;
 sudo -i -u postgres &lt;br /&gt;
&lt;br /&gt;
Теперь вы можете войти в интерактивный режим работы с СУБД:&lt;br /&gt;
&lt;br /&gt;
 psql&lt;br /&gt;
&lt;br /&gt;
Приглашение в интерактивном режиме выглядит так:&lt;br /&gt;
&lt;br /&gt;
 postgres=# &lt;br /&gt;
&lt;br /&gt;
Чтобы посмотреть, какие базы уже есть в системе, наберите:&lt;br /&gt;
&lt;br /&gt;
 \l&lt;br /&gt;
&lt;br /&gt;
Примерный результат:&lt;br /&gt;
&lt;br /&gt;
 postgres=# \l&lt;br /&gt;
                                  List of databases&lt;br /&gt;
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   &lt;br /&gt;
 -----------+----------+----------+-------------+-------------+-----------------------&lt;br /&gt;
  postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | &lt;br /&gt;
  template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +&lt;br /&gt;
            |          |          |             |             | postgres=CTc/postgres&lt;br /&gt;
  template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +&lt;br /&gt;
            |          |          |             |             | postgres=CTc/postgres&lt;br /&gt;
 (3 rows)&lt;br /&gt;
&lt;br /&gt;
Альтернативно, можно выполнить запрос:&lt;br /&gt;
&lt;br /&gt;
 SELECT datname FROM pg_database;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Чтобы работать с конкретной базой, ее нужно выбрать. Выполните \c database_name:&lt;br /&gt;
&lt;br /&gt;
 postgres=# \c imdb&lt;br /&gt;
 You are now connected to database &amp;quot;imdb&amp;quot; as user &amp;quot;postgres&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Чтобы узнать, какие таблицы есть базе, выполните:&lt;br /&gt;
&lt;br /&gt;
 \d&lt;br /&gt;
&lt;br /&gt;
Альтернативный запрос:&lt;br /&gt;
&lt;br /&gt;
 SELECT table_name FROM information_schema.tables WHERE table_schema = &amp;#039;public&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Чтобы узнать, какие есть колонки в таблице:&lt;br /&gt;
&lt;br /&gt;
 \d+ table&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
 \d table&lt;br /&gt;
&lt;br /&gt;
Альтернативный запрос:...&lt;br /&gt;
&lt;br /&gt;
 SELECT column_name FROM information_schema.columns WHERE table_name =&amp;#039;table&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Часть 2: Основы администрирования PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Следующая задача состоит в том, чтобы настроить два важный параметра:&lt;br /&gt;
&lt;br /&gt;
* логирование запросов - чтобы подтвердить, что вы честно выполняли лабу&lt;br /&gt;
* ручное подтверждение вносимых изменений - чтобы в случае некорректных запросов вы могли откатить свои изменения простым способом.&lt;br /&gt;
&lt;br /&gt;
Про второй механизм подробнее. Когда вы вносите изменения в данные, они не сразу вступают в силу. СУБД создает diff аналогичный тому, который можно видеть в git. После этого вы начинаете работать с измененной версией, но в других сессиях данные по-прежнему старые. Если вы что-то сделали неправильно, вы можете откатить изменения в своей сессии с помощью команды rollback. Если же все изменения корректны, подтвердите их, выполнив commit. Закоммиченные изменения откатить намного сложнее, поэтому как правило в СУБД отключают опцию autocommit, которая подтверждает изменения автоматически.&lt;br /&gt;
&lt;br /&gt;
Когда вы завершаете сессию, выполняется rollback. Если вы убиваете процесс, то он может еще некоторое время &amp;quot;держать&amp;quot; данные, не давая их изменить.&lt;br /&gt;
&lt;br /&gt;
Приступим к конфигурированию.&lt;br /&gt;
&lt;br /&gt;
PostgreSQL представлен в системе в виде сервиса, управлять которым можно как и обычно через команду service. Как правило, для внесения каких-либо изменений нужно перезапустить сервис.&lt;br /&gt;
&lt;br /&gt;
Конфигурационный файл:&lt;br /&gt;
&lt;br /&gt;
 sudo vim /etc/postgresql/9.*/main/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
Допишите или раскомментируйте:&lt;br /&gt;
&lt;br /&gt;
 log_line_prefix = &amp;#039;%t %c %u &amp;#039; # time sessionid user&lt;br /&gt;
 log_statement = &amp;#039;all&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Управлять некоторыми параметрами можно прямо из сессии с СУБД. Например включение подробного логирования:&lt;br /&gt;
&lt;br /&gt;
 SELECT set_config(&amp;#039;log_statement&amp;#039;, &amp;#039;all&amp;#039;, true);&lt;br /&gt;
&lt;br /&gt;
Если вы используете Ubuntu, то по умолчанию лог-файлы могут быть найдены по пути &amp;lt;code&amp;gt;/var/log/postgresql/*&amp;lt;/code&amp;gt;. Если же у вас другой дистрибутив, то конфигурация может отличаться. (Например, для &amp;lt;code&amp;gt;ArchLinux&amp;lt;/code&amp;gt; нужно в конфигурационном файле &amp;lt;code&amp;gt;/var/lib/postgres/data/postgresql.conf&amp;lt;/code&amp;gt; указать режим логированния с помощью &amp;lt;code&amp;gt;log_destination=&amp;#039;stderr&amp;#039;&amp;lt;/code&amp;gt; и включить запись в файл &amp;lt;code&amp;gt;logging_collector=on&amp;lt;/code&amp;gt;. На самом деле, лучше найти эти строчки в конфигурационном файле и почитать, что они значат. Внутри конфига всё хорошо объяснено).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Чтобы отключить автокоммит, от пользователя postgres допишите в файл или создайте новый, если его нет ~/.psqlrc:&lt;br /&gt;
&lt;br /&gt;
 \set AUTOCOMMIT off &lt;br /&gt;
&lt;br /&gt;
Также можно инициировать процедуру, которая внесет изменения глобально только в случае выполнения commit:&lt;br /&gt;
&lt;br /&gt;
 BEGIN;&lt;br /&gt;
 -- манипуляции с данными&lt;br /&gt;
 COMMIT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Часть 3: импорт и экспорт базы данных IMDB ===&lt;br /&gt;
&lt;br /&gt;
Две наиболее важные операции. Выполняйте в сессии пользователя postgres.&lt;br /&gt;
&lt;br /&gt;
Экспортировать базу данных:&lt;br /&gt;
&lt;br /&gt;
 pg_dump dbname | gzip &amp;gt; filename.gz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Импортировать базу:&lt;br /&gt;
&lt;br /&gt;
 gunzip -c filename.gz | psql dbname&lt;br /&gt;
&lt;br /&gt;
Попробуйте импортировать базу IMDB:&lt;br /&gt;
&lt;br /&gt;
https://yadi.sk/d/EVhJUiroqgzWj&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Важно:&amp;#039;&amp;#039;&amp;#039; прежде чем импортировать дамп, нужно создать базу данных:&lt;br /&gt;
&lt;br /&gt;
В psql выполните:&lt;br /&gt;
&lt;br /&gt;
 create database imdb;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Важно: прежде чем импортировать дамп, нужно включить автокоммит.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Это займет некоторое время (20 минут - норм). &lt;br /&gt;
&lt;br /&gt;
Также можно отдельно импортировать схему и данные частями:&lt;br /&gt;
&lt;br /&gt;
https://yadi.sk/d/759CTPxpqoCs2&lt;br /&gt;
&lt;br /&gt;
Используйте, например: ls imdb3*.gz | xargs gunzip | psql dbname&lt;br /&gt;
&lt;br /&gt;
Также можно импортировать только конкретные таблицы, указав их через ключ  --table.&lt;br /&gt;
&lt;br /&gt;
Можно импортировать только схему: --schema-only или только данные: --data-only&lt;br /&gt;
&lt;br /&gt;
==== Структура базы IMDB ====&lt;br /&gt;
&lt;br /&gt;
У каждой таблицы есть идентификатор, указанный как первичный ключ (id). По нему выбирать быстрее всего.&lt;br /&gt;
&lt;br /&gt;
Основные таблицы и их описание:&lt;br /&gt;
* title - названия фильмов (поле title) и год выпуска (поле production_year); если это сериал, то также здесь можно найти номер эпизода&lt;br /&gt;
* movie_info - характеристики и факты о фильме: movie_id - идентификатор из таблицы title (далее для краткой записи: title.id), info_type_id - идентификатор из таблицы info_type (info_type.id), info - текстовое поле со значением характеристики.&lt;br /&gt;
* name - актеры (имя и пол)&lt;br /&gt;
* person_info - характеристики и факты об актерах также с названиями характеристик из (info_type.id)&lt;br /&gt;
* char_name - роли (имена персонажей)&lt;br /&gt;
* cast_info - таблица со связью ролей (person_role_id), актеров (person_id) и фильмов (movie_id)&lt;br /&gt;
&lt;br /&gt;
=== Часть 4: Простые операции CRUD ===&lt;br /&gt;
&lt;br /&gt;
К простым операциям манипуляции данными (Create, Read, Update, Delete) относятся:&lt;br /&gt;
&lt;br /&gt;
* Добавление: INSERT&lt;br /&gt;
* Выборка: SELECT &lt;br /&gt;
* Обновление: UPDATE&lt;br /&gt;
* Удаление: DELETE&lt;br /&gt;
&lt;br /&gt;
==== Добавление данных INSERT ====&lt;br /&gt;
&lt;br /&gt;
Чтобы добавить новую запись в таблицу, нужно вычислить ее идентификатор. Для этого в PostgreSQL используются последовательности - числа, которые меняются по заданным правилам (обычно просто инкрементируются на единицу). &lt;br /&gt;
&lt;br /&gt;
Чтобы посмотреть список всех последовательностей выполните:&lt;br /&gt;
&lt;br /&gt;
 SELECT c.relname FROM pg_class c WHERE c.relkind = &amp;#039;S&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
Именование последовательностей обычно выбирают предсказуемым, чтобы легко было понять, к какой таблице они относятся. &lt;br /&gt;
&lt;br /&gt;
Синтаксис INSERT выглядит так: сначала в скобках перечисляются атрибуты, которые будут вставлены, а затем после VALUES в скобках указываются значения. Можно также не перечислять атрибуты, тогда в VALUES нужно по порядку указать значения для всех. &lt;br /&gt;
&lt;br /&gt;
Попробуйте добавить себя в список актеров:&lt;br /&gt;
&lt;br /&gt;
 insert into name (id, name, gender) values(nextval(&amp;#039;name_id_seq&amp;#039;), &amp;#039;Ivan Savin&amp;#039;, &amp;#039;m&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
Здесь nextval(&amp;#039;name_id_seq&amp;#039;) генерирует следующее значение для последовательности name_id_seq.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Важно:&amp;#039;&amp;#039;&amp;#039; В предлагаемом дампе базы последовательности обнулены и не могут сгенерировать уникальный идентификатор сразу. Чтобы это исправить, укажите текущее значение последовательности максимальным идентификатором в таблице, к которой она относится. Пример:&lt;br /&gt;
&lt;br /&gt;
 select max(id) from name;&lt;br /&gt;
 select setval(&amp;#039;name_id_seq&amp;#039;, 5555233);&lt;br /&gt;
&lt;br /&gt;
Если вы отключили автокоммит, то, так как вы вносите изменения в данные, завершите операцию, выполнив:&lt;br /&gt;
&lt;br /&gt;
 commit;&lt;br /&gt;
&lt;br /&gt;
Если вы не уверены в своих изменениях, выполните:&lt;br /&gt;
&lt;br /&gt;
 rollback;&lt;br /&gt;
&lt;br /&gt;
За одну операцию INSERT можно вставлять несколько строк данных. Для этого после VALUES нужно перечислить кортежи данных через запятую:&lt;br /&gt;
&lt;br /&gt;
 insert into name (id, name, gender) &lt;br /&gt;
 values(nextval(&amp;#039;name_id_seq&amp;#039;), &amp;#039;Dmitry Burmistrov&amp;#039;, &amp;#039;m&amp;#039;), &lt;br /&gt;
 (nextval(&amp;#039;name_id_seq&amp;#039;), &amp;#039;Victor Yakovlev&amp;#039;, &amp;#039;m&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
==== Выборка данных SELECT ====&lt;br /&gt;
&lt;br /&gt;
Для чтения данных из базы используется ключевое слово SELECT, после которого указывается список атрибутов, которые нужно получить в выборке. Если указать вместо списка атрибутов &amp;quot;*&amp;quot;, то выберутся все. Самый простой запрос выборки из базы данных выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
 select * from info_type;&lt;br /&gt;
&lt;br /&gt;
Не пробуйте выбрать все данные из больших таблиц (title, name) - это займет много времени. Если вы хотите выбрать несколько кортежей данных для примера, то ограничьте результаты с помощью LIMIT:&lt;br /&gt;
&lt;br /&gt;
 select * from title limit 10;&lt;br /&gt;
&lt;br /&gt;
Условия выборки указываются после ключевого слова WHERE. Условия можно комбинировать с помощью скобок и слов OR и AND. Примеры условий:&lt;br /&gt;
&lt;br /&gt;
* WHERE title=&amp;#039;Databases&amp;#039; - простое условие равенства&lt;br /&gt;
* WHERE title like &amp;#039;%base%&amp;#039; - поиск по подстроке, &amp;quot;%&amp;quot; - любое количество любых символов&lt;br /&gt;
* WHERE created_date &amp;gt; now() - сравнение даты с текущим моментом; см. также http://www.postgresql.org/docs/8.3/static/functions-datetime.html&lt;br /&gt;
* WHERE title not in (&amp;#039;Databases&amp;#039;, &amp;#039;Networks&amp;#039;) - значение не входит в список&lt;br /&gt;
* WHERE not exists (SELECT * FROM ...) - выполняется, если подзапрос вернул хотя бы одну запись&lt;br /&gt;
* WHERE artist_id in (SELECT id FROM artist...) - подзапрос определяет множество значений.&lt;br /&gt;
&lt;br /&gt;
Пример запроса с условиями:&lt;br /&gt;
&lt;br /&gt;
 select * from title where title like &amp;#039;%Matrix&amp;#039; and production_year=1999;&lt;br /&gt;
&lt;br /&gt;
Также в блоке с перечислением атрибутов можно указывать подзапросы. Подзапрос будет выполняться в последнюю очередь для каждого кортежа, удовлетворяющего остальным условиям. Также, чтобы использовать условия из основного запроса в этом подзапросе, лучше указывать название атрибута вместе с таблицей, в которой он принадлежит:&lt;br /&gt;
&lt;br /&gt;
 select (select info from info_type where info_type.id=person_info.info_type_id), person_info.info from person_info where person_id=1732058;&lt;br /&gt;
&lt;br /&gt;
Если нужно вывести только уникальные кортежи, используйте distinct:&lt;br /&gt;
&lt;br /&gt;
  select distinct production_year from title;&lt;br /&gt;
&lt;br /&gt;
Попробуйте найти ваши любимые фильмы, указывая часть названия и комбинируя условия, указывая год выхода. Попробуйте найти ваших любимых актеров и факты о них.&lt;br /&gt;
&lt;br /&gt;
==== Обновление данных UPDATE ====&lt;br /&gt;
&lt;br /&gt;
Чтобы обновить данные, нужно указать, какие параметры вы хотите обновить и условия выборки обновляемых данных:&lt;br /&gt;
&lt;br /&gt;
 update cast_info set person_id=1732058 where movie_id=3514559;&lt;br /&gt;
&lt;br /&gt;
Если вы не укажите условия, то обновятся значения во всей таблице, обычно это не нужно.&lt;br /&gt;
&lt;br /&gt;
В запросе на обновление также можно использовать подзапросы. Единственное ограничение: нельзя в подзапросе использовать обновляемую таблицу, так как СУБД в этом случае можно ввести в бесконечный цикл обновления. Пример более понятного запроса на обновление:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Предостережение&amp;#039;&amp;#039;&amp;#039;: не выполняйте следующий запрос, пока не разберетесь, что именно он делает.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 update cast_info set person_id=(select id from name where name=&amp;#039;Savin Ivan&amp;#039;) &lt;br /&gt;
 where movie_id=(select id from title where title like &amp;#039;The Matrix&amp;#039; and production_year=1999);&lt;br /&gt;
&lt;br /&gt;
Если вы не закоммитите изменения, то обновляемые записи останутся залоченными, то есть их невозможно будет обновить в других сессиях. Попробуйте не выполняя коммит, открыть новую сессию и попытаться обновить те же данные. В результате новая сессия зависнет, ожидая завершения транзакции в первой сессии. Закоммитьте изменения в первой сессии.&lt;br /&gt;
&lt;br /&gt;
Попробуйте назначить себя и своих друзей на подходящие роли в ваших любимых фильмах. Составьте запрос, который будет демонстрировать, кто где и какую роль играет (используя подзапросы).&lt;br /&gt;
&lt;br /&gt;
==== Удаление данных DELETE ====&lt;br /&gt;
&lt;br /&gt;
Синтаксис удаления данных аналогичен синтаксису выборки за исключением того, что вместо &amp;quot;SELECT * FROM&amp;quot; достаточно написать &amp;quot;DELETE FROM&amp;quot;. Будьте внимательны, удаляя данные и проверяйте условия перед отправкой коммита.&lt;br /&gt;
&lt;br /&gt;
Удалите актеров, которые вам не нравятся (или актера, выбранного случайно). Это сделать не так просто, как может показаться, потому что их идентификаторы используются в других таблицах, а нарушать целостность данных нельзя. Для корректного удаления, нужно найти все связи актера с фильмами и удалить сначала их, после этого удалить информацию о них из таблицы фактов, после этого станет доступно удаление.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Часть 5: Агрегация данных ===&lt;br /&gt;
&lt;br /&gt;
Часто с помощью СУБД генерируют различные полезные отчеты. В любой популярной СУБД есть агрегирующие функции, с помощью которых, можно собрать статистику о данных. Самая простая статистика: количество записей, удовлетворяющих заданным условиям. Пример выбора количества фильмов в базе:&lt;br /&gt;
&lt;br /&gt;
 select count(1) from title where kind_id=(select id from kind_type where kind=&amp;#039;movie&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
Для числовых атрибутов также помимо COUNT можно использовать SUM, AVG и другие востребованные функции.&lt;br /&gt;
&lt;br /&gt;
Попробуйте вывести, в скольких фильмах снимались ваши любимые актеры.&lt;br /&gt;
&lt;br /&gt;
==== Преобразование атрибутов по некоторым правилам ====&lt;br /&gt;
&lt;br /&gt;
Если нужно преобразовать какой-либо атрибут по правилам (условиям), то можно использоваться конструкцию CASE ... WHEN ... THEN ... END.&lt;br /&gt;
В этом случае данная конструкция будет обозначать новый атрибут у записи. Рассмотрим её детальнее.&lt;br /&gt;
&lt;br /&gt;
 case &lt;br /&gt;
     when &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;condition1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; then &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;result1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     when &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;condition2&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; then &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;result2&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
     else &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;result3&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Если условие &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;condition1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; верно (т.е. &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039;), то атрибуту будет&lt;br /&gt;
присвоено значение &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;result1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Если &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;condition1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; неверно, то &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt; перейдёт&lt;br /&gt;
к следующему &amp;lt;code&amp;gt;when&amp;lt;/code&amp;gt;. Если ни один из &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;condition&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; не выполняется, то атрибуту будет &lt;br /&gt;
присвоено значение, указанное в &amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt; (если в этом случае отсутствует &amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;, то&lt;br /&gt;
атрибут будет равен &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Представим таблицу &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! a&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Добавим теперь к каждой записи новый атрибут, который будет обозначать значение атрибута &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; словами:&lt;br /&gt;
 select&lt;br /&gt;
    a,&lt;br /&gt;
    case&lt;br /&gt;
        when a = 1 then &amp;#039;one&amp;#039;&lt;br /&gt;
        when a = 2 then &amp;#039;two&amp;#039;&lt;br /&gt;
        when a = 3 then &amp;#039;three&amp;#039;&lt;br /&gt;
        else &amp;#039;other&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
 from t;&lt;br /&gt;
&lt;br /&gt;
Результат:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! a&lt;br /&gt;
! case&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| one&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| two&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| three&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из результата, новый атрибут получил название &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt;. Если мы хотим переименовать его в &lt;br /&gt;
желаемый вариант, то это можно сделать с помощью &amp;lt;code&amp;gt;as&amp;lt;/code&amp;gt;:&lt;br /&gt;
 select&lt;br /&gt;
    a,&lt;br /&gt;
    case&lt;br /&gt;
        when a = 1 then &amp;#039;one&amp;#039;&lt;br /&gt;
        when a = 2 then &amp;#039;two&amp;#039;&lt;br /&gt;
        when a = 3 then &amp;#039;three&amp;#039;&lt;br /&gt;
        else &amp;#039;other&amp;#039;&lt;br /&gt;
    end as new_attribute&lt;br /&gt;
 from t;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! a&lt;br /&gt;
! new_attribute&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| one&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| two&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| three&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Также, чтобы каждый раз не писать &amp;lt;code&amp;gt;when a = &amp;lt;/code&amp;gt;, можно сразу указать, по какому атрибуту мы бежим:&lt;br /&gt;
 select&lt;br /&gt;
    a,&lt;br /&gt;
    case a&lt;br /&gt;
        when 1 then &amp;#039;one&amp;#039;&lt;br /&gt;
        when 2 then &amp;#039;two&amp;#039;&lt;br /&gt;
        when 3 then &amp;#039;three&amp;#039;&lt;br /&gt;
        else &amp;#039;other&amp;#039;&lt;br /&gt;
    end as new_attribute&lt;br /&gt;
 from t;&lt;br /&gt;
&lt;br /&gt;
Таким образом, используя &amp;lt;code&amp;gt;case..when..&amp;lt;/code&amp;gt; можно помечать нужные нам записи для дальнейшей обработки данных. &lt;br /&gt;
Например, добавить к фильму атрибут, обозначающий, относится фильм к 20 или 21 веку.&lt;br /&gt;
&lt;br /&gt;
 select&lt;br /&gt;
   *, &lt;br /&gt;
   case&lt;br /&gt;
     when production_year &amp;gt;= 1900 and production_year &amp;lt; 2000 then &amp;#039;XX&amp;#039;&lt;br /&gt;
     when production_year &amp;gt;= 2000 and production_year &amp;lt; 2100 then &amp;#039;XXI&amp;#039;&lt;br /&gt;
   end as century&lt;br /&gt;
 from title&lt;br /&gt;
&lt;br /&gt;
Сокращённый результат:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| id&lt;br /&gt;
| 2395294&lt;br /&gt;
|-&lt;br /&gt;
| title&lt;br /&gt;
| (1979-03-11)&lt;br /&gt;
|-&lt;br /&gt;
| production_year&lt;br /&gt;
| 1979&lt;br /&gt;
|-&lt;br /&gt;
| century&lt;br /&gt;
| XX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Группировка агрегированных данных GROUP BY ====&lt;br /&gt;
&lt;br /&gt;
Статистику можно также сгруппировать по некоторому атрибуту, который возвращается запросом. Например, чтобы вывести количества фильмов, выпущенных в каждый год, выполните запрос:&lt;br /&gt;
&lt;br /&gt;
 select production_year, count(1) from title&lt;br /&gt;
 where kind_id=(select id from kind_type where kind=&amp;#039;movie&amp;#039;)&lt;br /&gt;
 group by production_year&lt;br /&gt;
 order by production_year;&lt;br /&gt;
&lt;br /&gt;
В запросе также результаты отсортированы по году выпуска с помощью ORDER BY.&lt;br /&gt;
&lt;br /&gt;
Попробуйте собрать следующие статистики: количество актеров и актрис; среднее количество фильмов в год, выпущенных в XX веке, и, выпущенных в XXI веке (с учетом текущего года). &lt;br /&gt;
&lt;br /&gt;
Попробуйте также узнать среднее количество ролей в фильмах в различные годы. Этот запрос может выполняться долго, поэтому рекомендуется сначала отлаживать его на небольшом количестве данных, используя LIMIT или какие-либо условия.&lt;br /&gt;
&lt;br /&gt;
=== Защита лабораторной работы ===&lt;br /&gt;
# Показать логи выполнения запросов. &lt;br /&gt;
# Прокомментировать для агрегаций, что и как происходит. &lt;br /&gt;
# Написать запрос по просьбе преподавателя.&lt;br /&gt;
&lt;br /&gt;
=== Полезные материалы ===&lt;br /&gt;
&lt;br /&gt;
Интерактивный урок по основам SQL запросов (видео лекции + задания): https://www.codeschool.com/courses/try-sql&lt;/div&gt;</summary>
		<author><name>imported&gt;Luc1ph3r</name></author>
	</entry>
</feed>