
На вводном занятии мы познакомимся с такими понятиями как базы данных, СУБД, SQL. Попробуем разобраться зачем они в принципе нужны в реальных приложениях, как с ними общаются другие приложение и почему без них никак не обойтись.
00:00 - Приветствие
00:32 - Зачем и где используют базы данных
03:09 - Внутреннее устройство СУБД
05:45 - Книга PostgreSQL для начинающих
06:00 - Резюме
08:05 - Таблицы баз данных
09:18 - Типы данных
Для того, чтобы начать знакомиться с SQL и работой баз данных, нам необходимо установить необходимое программное обеспечение: саму выбранную СУБД и клиент для отправки SQL запросов к СУБД. Покажу все возможные варианты программного обеспечения, которые вы можете использовать у себя. В свою очередь, я буду использовать именно IntelliJ IDEA.
00:00 - Введение
00:38 - Скачивание СУБД PostgreSQL
02:27 - Установка СУБД PostgreSQL
03:31 - Клиенты для PostgreSQL
06:03 - Плагин Database Navigator (не рекомендуется)
После того, как мы установили все необходимое программное обеспечение, настала пора научиться подключаться к базе данных из нашего клиента - IntelliJ IDEA. Смысл подключения в любых клиентах будет один и тот же, отличаться будет лишь визуальная часть: нужно указать хост, порт, пользователя, его пароль и название базы данных, к которой вы хотите подключиться. Подробно разберем каждую из составляющих.
00:00 - Введение
00:48 - Подключение к СУБД PostgreSQL
01:51 - Поля host и port
05:04 - Поля user, password и database
Все запросы SQL разбиваются на два больших подраздела: DDL and DML. На занятии поговорим, какие запросы к каким разделам относятся и начнем с базовых операций по созданию базы данных и схем в них. Также попробуем выполнить операции удаления созданных структур.
00:00 - Введение
00:15 - DDL
01:43 - DML
03:05 - CREATE DATABASE
05:30 - 3 схемы БД по умолчанию в PostgreSQL
06:53 - pg_catalog и information_schema схемы БД
08:20 - CREATE SCHEMA
11:08 - DROP SCHEMA/DATABASE
Наконец-то мы дошли до создания таблиц, в которых мы можешь хранить свои данные для последующей обработки или выборки. Познакомимся с синтаксисом создания таблиц и основными типами данных в СУБД PostgreSQL.
00:00 - Введение
00:13 - CREATE TABLE
03:26 - Как указать схему для таблицы
04:35 - Комментарии в SQL скриптах
05:15 - Типы данных в PostgreSQL
07:50 - Резюме
На видео познакомимся с первой DML операцией, которая используется для вставки строк в таблицы - это Insert. Также затронем тему ограничений - Constraints. Разберем большинство из них и проверим на нашей созданной таблице company.
00:00 - Введение
00:26 - INSERT для вставки одной строки
03:24 - INSERT для вставки нескольких строк
05:12 - Ограничения (Constraints)
05:56 - NOT NULL constraint
06:40 - UNIQUE constraint
07:05 - CHECK constraint
08:02 - PRIMARY KEY и FOREIGN KEY constraints
08:55 - Тестирование ограничений
11:12 - Где можно создавать Constraints
Поговорим более подробно про первичные ключи и как удобно их генерировать автоматически, чтобы не нужно было вручную что-то изобретать для определения следующего идентификатора при вставке новой записи в таблицу.
00:00 - Введение
00:39 - Создание таблицы с PRIMARY KEY
03:26 - INSERT в созданную таблицу
04:33 - Тип данных SERIAL в PostgreSQL
06:52 - Последовательности (Sequences)
08:10 - PRIMARY KEY на не SERIAL поля
09:22 - UNIQUE на составные поля
Вот мы и дошли до самого используемого DML оператора - SELECT, который используется для выборки данных. Определим основной синтаксис, как устанавливать псевдонимы для полей и таблиц (alias), как ограничивать выборку с помощью LIMIT и OFFSET, а также затронем тему сортировки выборки с помощью ключевого слова ORDER BY, потому что для правильного использования ограничения LIMIT/OFFSET необходимо обязательно сортировать множество.
00:00 - Введение
00:46 - SELECT операция
02:13 - Alias (псевдонимы) для полей и таблиц
04:29 - DISTINCT
06:03 - LIMIT и OFFSET
08:07 - ORDER BY (Сортировка)
На самом деле реальные запросы очень редко выбирают данные из всей таблицы. Чаще всего необходимо данные отфильтровать, т.е. получить только часть от целого. Для этого и используется ключевое слово WHERE, про которое мы и поговорим более подробно в этом видео.
00:00 - Введение
00:26 - WHERE (фильтрация)
02:21 - LIKE и ILIKE операторы
04:33 - BETWEEN оператор
05:15 - IN оператор
06:00 - AND и OR операторы
Очень часто на практике нужно что-то просуммировать, найти среднее или количество записей. Для этого в SQL есть 5 стандартных агрегирующих функций: sum - найти сумму элементов, min - найти минимальный элемент, max - найти максимальный, avg - средний и count - количество записей в выборке. Более того, каждая СУБД имеет свой набор встроенных функций на все случаи жизни. Например, в PostgreSQL их более 100. На видео разберем все эти функции и продемонстрируем, где все они лежат в СУБД.
00:00 - Введение
01:09 - Агрегирующие функции SUM, AVG, MAX, MIN, COUNT
02:46 - INSERT строк через IntelliJ IDEA
03:55 - Встроенные функции UPPER, LOWER, CONCAT
05:01 - Конкaтенация строк в SQL
05:25 - NOW() - текущее время
05:40 - pg_catalog - содержит все функции
07:10 - Как проверять функции через SELECT
На занятии разберем последний из пяти основных ограничений (constraint), который мы когда-то специально опустили ввиду его сложности по сравнению с остальными: внешний ключ (FOREIGN KEY). Узнаем, как он связан в принципе со связями между таблицами и как обезопашивает нас от вставки невалидных значений, которые по сути являются ссылками на первичные ключи других таблиц.
00:00 - Введение
00:44 - FOREIGN KEY (внешний ключ)
03:04 - Второй вариант создания FOREIGN KEY
05:26 - FOREIGN KEY не создает индексов
06:16 - Тестирование FOREIGN KEY
На практике иногда есть необходимость объединять выборки из разных запросов в один общий запрос, и для этого используется ключевое слово UNION. К сожалению, с этим есть много ограничений, которые мы конечно же все разберем на видео.
00:00 - Введение
00:50 - IS NULL и NOT оператор
01:56 - UNION ALL для объединения SELECT
04:30 - UNION vs UNION ALL
06:13 - Резюме
Необходимо воспринимать SQL запрос как просто средство получения данных, т.е. в результате его выполнения у нас будет какой-то набор или множество каких-то данных. Следовательно, мы можем продолжить выбирать из этого набора данных с помощью других SQL запросов и т.д. Поэтому мы разберем с вами такое понятие как подзапрос и увидим, что его можно использовать практически где угодно в конструировании других SQL запросов через ключевое слово SELECT.
00:00 - Введение
00:58 - Подзапросы во FROM
05:24 - Подзапросы в полях выборок
07:48 - Подзапросы в условиях WHERE
09:05 - Резюме
Естественно кроме добавления или получения данных в таблице мы иногда хотим и как-то удалить их оттуда. Для этого во всех СУБД есть DML операция DELETE, которую мы и постараемся разобрать на видео, а также разобрать все нюансы и проблемы, с которыми мы можем столкнуться во время удалению строк в таблице.
00:00 - Введение
00:44 - DELETE операция
03:59 - Удаление записей с FOREIGN KEY на них
05:24 - ON DELETE CASCADE
Для того, чтобы обновлять существующие записи в таблицах в SQL есть специальная DML операция - UPDATE. Синтаксис ее немного сложнее, чем операции DELETE. Тем не менее, на видео мы без труда его разберем, а также познакомимся с нюансами обновления, с которыми также можем столкнуться.
00:00 - Введение
00:45 - UPDATE операция
03:20 - RETURNING для UPDATE и DELETE операций
05:57 - Осторожно быть с Constraints
Уже пройден довольно большой объем материала, поэтому мы все повторим и попрактикуемся на этом видео. Заново попробуем создать новую базу данных, подключимся к ней и выполним DDL и DML операции.
00:00 - Введение
00:29 - Создание базы данных и подключение
03:22 - Задание №1
08:02 - Задание №2
09:15 - Задание №3
11:17 - Задание №4
15:56 - Задание №5
18:08 - Задание №6
20:01 - Задание №7
23:48 - Задание №8
26:16 - Задание №9
Довольно долго мы на практике изучали SQL и как работать с реляционными базами данных. Теперь нам нужно немного наверстать теоретическую часть, на основании которой правильно строится структура баз данных, связи между таблицами и т.д. На видео поговорим про нормализацию баз данных и для чего она нужна.
00:00 - Введение
00:37 - Реляционные базы данных
01:48 - Нормализация и избыточных данных
02:42 - Аномалии в базах данных
04:08 - FOREIGN KEY как решение для аномалий
05:42 - 9 нормальных форм баз данных
07:26 - Резюме
Продолжаем разбираться с нормализацией реляционных баз данных и обсудим три основные нормальные формы, которые используются на практике: 1НФ, 2НФ и 3НФ. Каждая последующая НФ содержит требования предыдущей, что делает ее еще более строгой формой. Это несет за собой не только плюсы, но и минусы, которые мы также разберем, поэтому мы и ограничиваемся на практике 3НФ.
00:00 - Введение
00:29 - Первая нормальная форма
02:37 - Вторая нормальная форма
05:23 - Третья нормальная форма
07:21 - Декомпозиция
09:00 - Резюме
Для решения проблемы дублирования строк, с которой мы столкнулись на предыдущем видео, нам необходимо знать про различные виды связей между таблицами. В зависимости от выбора той или иной связи, мы можем по-разному решить эту проблему, что и будет продемонстрировано в видео.
00:00 - Введение
01:37 - 3 связи между таблицами
01:55 - Один ко многим
03:15 - Один к одному
05:00 - Многие ко многим
07:43 - UML диаграммы
09:50 - Генерация ERD в IntelliJ IDEA
Мы уже знаем про различные виды связей между таблицами, осталось лишь разобраться в том, как мы можем извлекать всю необходимую нам информацию с такого множества взаимосвязанных таблиц. К счастью, ничего изобретать не придется, ибо в SQL есть специальное средство для этого - соединения (JOINs). Их бывает 5 разных видов, и на видео мы разберем первые два.
00:00 - Введение
00:42 - Указывать несколько таблиц во FROM
04:10 - 5 видов JOIN
05:04 - INNER JOIN
10:03 - CROSS JOIN
11:10 - Резюме
Продолжаем разбираться с различными видами JOINs и на очереди у нас внешние соединения: OUTER JOINs. На примерах узнаем как работает каждый из них. Естественно на следующем практическом занятии мы вновь вернемся к теме соединений и углубимся в их использовании.
00:00 - Введение
00:23 - Что значит OUTER
01:30 - LEFT JOIN
04:07 - RIGHT JOIN
06:04 - FULL JOIN
06:59 - Резюме
Мы уже знаем, что такое агрегирующие функции и даже можем их использовать. К сожалению, получать информацию с помощью таких функций мы можем лишь для какой-то одной сущности, потому что результат выборки должен быть одной лишь строкой. С другой стороны, мы можем использовать группировки для извлечения нужной нам информации с помощью агрегирующих функций для более чем одной сущности (строки). Более того, мы также можем фильтровать групповые запросы, что и разберем на примерах в видео.
00:00 - Введение
00:56 - Зачем использовать группировки
04:25 - GROUP BY
07:19 - HAVING
08:48 - Внимательно делать условия в OUTER JOINs
Продолжая тему группировок запросов, мы разберем еще более мощную возможность SQL, которая очень похожа по смыслу с группировками, и называется она - оконные функции (window functions). Окно - это и есть та группа строк в выборке, которую мы определили по какому-то полю или набору полей, только в случае оконных функций не происходит схлопывания значений в одно и мы можем делать очень интересные и сложные вещи благодаря этому.
00:00 - Введение
00:20 - Суть оконных функции
02:40 - OVER() и агрегирующие функции
05:15 - Чисто оконные функции
07:10 - ORDER BY в OVER(), nulls last/first
08:57 - PARTITION BY в OVER()
Представление - это еще одна сущность реляционных баз данных на ряду с таблицами, которая строится на основании обычных запросов (SELECT) к этим таблицам. Эти запросы могут быть совершенно любые, что позволяет инкапсулировать (скрывать) сложность этих запросов и обращаться к этим представлениям как к тем же таблицам. Они бывают двух разных видов - обычные и материализованные. Оба вида имеют свои достоинства и недостатки, которые и разберем на видео.
00:00 - Введение
01:14 - CREATE VIEW
03:33 - CREATE MATERIALIZED VIEW
06:24 - REFRESH MATERIALIZED VIEW
06:57 - Использование представлений на практике
Вот мы и дошли до последней DDL операции, которая позволяет нам изменять уже существующие таблицы и все, что с ними связано - это ALTER. Она довольно проста, но не менее важная при использовании в работающих приложениях.
00:00 - Введение
00:51 - ALTER TABLE
02:20 - Как добавить NOT NULL поле
04:40 - Документация по синтаксису ALTER TABLE
В заключительном видео по второй части SQL мы как обычно попрактикуемся в написании более сложных запросов с группировками, подзапросами и оконными функциями, предварительно спроектировав базу данных авиаперелетов.
00:00 - Введение
00:29 - Структура базы данных перелетов
02:19 - Задание №1
13:34 - Задание №2
14:15 - INSERT INTO ... SELECT
15:48 - Задание №3
18:44 - Тип данных INTERVAL
20:04 - Приведение типов в PostgreSQL
21:54 - Задание №4
28:10 - Оператор EXISTS
31:40 - Задание №5
33:29 - Задание №6
38:35 - Задание №7
42:32 - Что такое функция
44:06 - Задание №8
48:32 - Задание №9
54:02 - Резюме
Мы уже сталкивались с таким ключевым словом как UNION и UNION ALL, и теперь настал момент более подробно разобрать, как работают эти операторы, углубляюсь в основы - в теорию множеств. Ведь выборки из таблиц баз данных - это и есть множества, которые подчиняются общей теории, на основании которой и работают остальные операторы SQL: INTERSECT (пересечение множеств) и EXCEPT (исключение множеств). На видео разберем каждый из них.
00:00 - Введение
01:05 - UNION (ALL) - объединение множеств
03:15 - INTERSECT - пересечение множеств
03:42 - EXCEPT - исключение множеств
04:50 - Практика со всеми 4-мя типами множеств
Мы уже не раз говори про индексы в базах данных и то, что они автоматически у нас создаются, когда мы используем для определения полей таблиц такие ключевые слова как PRIMARY KEY and UNIQUE. Теперь мы наконец-то более подробно разберемся, что из себя представляют эти индексы, как выглядят и для чего используются.
00:00 - Введение
01:00 - Как БД производит обычный поиск строк
03:01 - Какие бывают индексы в БД
03:52 - B-Tree индекс
09:03 - Сегменты жесткого диска
10:36 - Элемент индекса - это ссылка на строку в таблице
11:53 - Кластерные индексы (Clustered index)
Продолжаем разбираться с индексами, рассмотрим более подробно варианты их создания в виде SQL команд, а также в чем разница между кластернем (CLUSTERED) индексом и обычным не кластерным.
00:00 - Введение
00:35 - PRIMARY KEY - это B-Tree
02:49 - Поиск по нескольким полям таблицы
04:27 - CREATE (UNIQUE) INDEX
07:30 - Порядок полей составного индекса важен!
10:01 - Селективность полей
12:01 - Изменение данных в таблицах - обновляет индексы
Для получения одного и того же результирующего множества, можно написать SQL запрос разными способами. Но чтобы определить, какой из них будет наилучший и самый быстрый - нужно понимать, как СУБД выполняет его, разбивая на составные части. Начнем в видео разбираться в основах разбора плана выполнения запросов.
00:00 - Введение
00:30 - Explain - план выполнения
01:50 - Стоимостной оптимизатор
08:18 - Width - количество байт в строке
12:12 - Filter - фильтрация запросов
14:00 - План выполнения читается снизу вверх
15:52 - Резюме
Продолжаем разбираться с планами выполнения запросов и на очереди у нас - работа с индексами. Есть три разных варианта, как СУБД может использовать индексы (B-Tree) для наилучшего получения результата выборки. На видео рассмотрим каждый из них и разберем на примерах.
00:00 - Введение
00:27 - Почему СУБД не всегда использует индекс
03:20 - Заполнение таблицы 100.000 записями
08:08 - Index Scan
11:01 - Index Only Scan
14:33 - Bitmap Scan (Index и Heap Scan)
19:48 - BitmapAnd и BitmapOr (объединение индексов)
Мы уже довольно много знаем о планах выполнения запросов, но все еще не вдавались в подробности того, как реляционные базы данных связывают таблицы друг с другом с помощью соединений (JOINs). В этом заключительном видео по планам выполнения запросов разберем на примерах более подробно три основных варианта того, как СУБД связывают таблицы.
00:00 - Введение
00:34 - Analyze - статистика уже выполненного запроса
02:52 - Заполнение второй таблицы 100.000 записями
04:57 - Nested Loop
08:50 - Hash Join
12:01 - Merge Join
16:12 - Лучше создавать индексы на FOREIGN KEY
17:18 - Резюме
Для работы с СУБД мы всегда используем какой-то клиент, чтобы отправлять SQL запросы. Часто в практике разработчика приходится использовать командную строку в качестве этого самого клиента, потому что это средство идет из коробки со всеми СУБД при установке. Разберем на примерах основные команды и нюансы при работе с командной строкой с помощью таких инструментов как psql and pg_dump.
00:00 - Введение
00:30 - Клиенты к СУБД
03:00 - Как вызвать psql
06:53 - Подключение к СУБД через psql
10:29 - Команды описания структуры базы данных
13:27 - Выполнение SQL команд
16:28 - Переключение между базами данных
17:03 - pg_dump - создание дампа базы данных
20:48 - Создание базы данных из дампа
Для отправки SQL запросов любой СУБД необходимо открывать транзакции. Даже если мы явно этого не делали, за нас СУБД при выполнении одного запроса открывает транзакцию с уровнем изолированности по умолчанию, выполняет запрос и фиксирует транзакцию (commit) в случае успешного выполнения запроса и, наоборот, откатывает (rollback) в случае каких-то ошибок. Более подробно разберемся со всеми уровнями изолированности транзакций и также с такой аббревиатурой как ACID.
00:00 - Введение
00:16 - Что такое транзакция. ACID
01:48 - ACID. Atomicity
02:31 - ACID. Consistency
03:09 - ACID. Isolation
04:02 - ACID. Durability
04:58 - Transaction isolation issues
05:31 - Lost Update
07:00 - Dirty Read
08:42 - Non-Repeatable Read
10:02 - Last commit wins
12:10 - Phantom Read
14:19 - Уровни изолированности транзакций
На предыдущем занятии мы в теории разобрались с таким понятием как транзакции и что такое за аббревиатура ACID. На сегодняшнем занятии мы на практике проверим и увидим проблеми параллельного выполнения транзакций и как их можно решить, подняв уровни изолированности при открытии транзакций.
00:00 - Введение
01:16 - Dirty Read
04:40 - Show transaction isolation level
05:30 - Non-Repeatable Read
09:01 - Last commit wins
11:15 - Phantom Read
14:36 - Row-level и table-level locks
Триггеры довольно редко встречаются на реальной практике, тем не менее есть отличное им применения - аудит изменений, т.е. отслеживания времени и пользователя, кто сделал операции UPDATE, INSERT, DELETE каких строк в базе данных. Аудит есть практически в каждом приложении, потому что это увеличивает безопасность в вашей системе и не только.
00:00 - Введение
00:13 - Что такое триггер
01:32 - CREATE TRIGGER
04:49 - Пример аудита таблицы aircraft
Аналитика всех ваших данных системы - это неотъемлимая и одна из важнейших составляющих успешной компании. Обсудим на занятии, что она из себя представляет, как это связано с аббревиатурой DWH и конечно же сделаем простой практический пример в таком хранилище от компании Google как BigQuery, которое является в настоящий момент одним из лучших.
00:00 - Введение
00:17 - DWH vs RDBMS
06:04 - BigQuery
07:20 - GCP
12:52 - SQL запросы в BigQuery
15:35 - Резюме
Один сервер базы данных - это конечно просто и легко, но не всегда хорошо для пользователей, потому что если что-то с ним пойдет не так, то никто не сможет работать с нашей системой. Разберем на видео такие интересные понятия как репликация, фрагментация и как это может помочь решить нашу проблему с одним сервером. Более того, узнаем новые виды баз данных - это нереляционные хранилища NoSQL. А также очень интересную и познавательную теорему CAP, которая непосредственно связана с распределенными системами (базы данных с более чем одним сервером).
00:00 - Введение
00:21 - Репликация баз данных
04:24 - 2 варианта репликации БД
05:34 - Фрагментация баз данных
08:00 - Распределенные базы данных
08:51 - Теорема CAP
12:10 - NoSQL
15:07 - Резюме
По традиции в заключительном видео по курсу SQL поговорим о дальнейшем развитии и что изучать дальше.
00:00 - Введение
00:56 - Backend путь развития
01:40 - Business Intelligence (BI) путь развития
02:26 - Database Engineer (DBE) путь развития
03:27 - Резюме
Курс не требует каких-то базовых понятий для его прохождения, потому что дает подробные и актуальные знания по реляционным базам данных на примере одной из лучших в настоящее время СУБД PostgreSQL, и языку для работы с ними - SQL. Хотя стандарт SQL будет применим для любых других реляционных баз данных, поэтому не стоит переживать, что вы используете другую СУБД на своем проекте.
Сам курс разбит на 3 основные части:
- базовый уровень
- стандартный уровень
- продвинутый уровень
Для начинающих можно закончить на первых двух уровнях и в последующем вернуться к последнему, но обязательно нужно понимать со временем все из перечисленных!
Курс содержит много практических занятий и покрывает полностью все аспекты реляционных баз данных:
- определения и создания баз данных, схем, таблиц и полей этих таблиц (DDL)
- создание SQL запросов для получения данных (DML)
- оконные функции
- B-Tree индексы
- планы выполнения запросов
- работа через командную строку с СУБД
- создание dump базы данных и, наоборот, накатывание схемы и данных СУБД из него
- что такое DWH и ее лучшим представителем от компании Google - BigQuery
- затронем тему NoSQL с теоремой CAP.
После окончания всех уровней этого курса, вы будете уверенно владеть реляционными базами данных, иметь представление о NoSQL хранилищах и почему они все больше набирают популярность (но никогда не заменять реляционные!) и спокойно себя чувствовать на любом реальном проекте.