Neueste Videos
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-m...
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/tema-15-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
У транзакций в реляционных базах данных есть четыре свойства. Можно еще сказать, что это не четыре свойства, а четыре требования к транзакциям в базах данных. Этих четыре требования получили название ACID. Каждая буква аббревиатуры ACID – это первая буква того или иного требования: Atomicity, Consistency, Isolation, Durability. В русском языке свойства транзакции имеют аналогичную аббревиатуру: АСИД, это можно расшифровать как: атомарность, согласованность, изолированность и долговечность.
Давайте перечислим четыре свойства транзакции ACID и посмотрим, какие требования предъявляются к транзакциям в базах данных:
Atomicity или свойство атомарности транзакции гарантирует, то что ни одна транзакция в базе данных не будет выполнена частично. Вы не сможете честным путем забрать товар из магазина, отдав треть стоимости товара, а честный продавец не возьмет с вас денег за испорченный или разбитый товар. Поэтому внутри транзакции выполняются, либо все операции, и она успешно завершается, либо, если происходит сбой на одной из операций, происходит откат всех ранее выполненных операций. Таким образом обеспечивается целостность данных и поддерживается их согласованность.
Consistency или требование согласованности базы данных до и после выполнения транзакции. Перед тем, как начинается транзакция, база данных находится в согласованном состояние (в спокойном состояние, чуть ниже это объясню на примере). Например, вы оплатили покупку, вам пришло уведомление, что списали деньги, но продавец не видит поступивших на счет денег, и не отдает вам товар. Естественно, вы выйдете в этом случае из своего согласованного состояния и будете не очень спокойным (база данных в этом случае будет находиться так же в не согласованном состоянии: деньги с одного счета были списаны, а на другой не зачислены). Обратите внимание: что в процессе выполнения транзакции (когда выполняются операции) база данных может находиться в несогласованном состоянии, но как только транзакция завершена данное состояние недопустимо.
Isolation или свойство изолированности транзакций. Это одно из самых дорогих требований к транзакциям в базе данных. Оно гарантирует то, что параллельно выполняемые транзакции не будут мешать друг другу. Из-за того, что свойство изолированности транзакций забирает большое количество ресурсов, в реальных СУБД созданы различные уровни изоляции транзакций, чем выше этот уровень, тем более изолированы транзакции.
Durability или свойство долговечности транзакции. Перевод durability, как долговечность, в данном случае не совсем точно характеризует требование к транзакции, более точным будет свойство устойчивости транзакции. Требование устойчивости транзакции или долговечности гарантирует то, что база данных останется в согласованном состоянии вне зависимости от проблем на других уровнях модели OSI. Например, вы оплачиваете покупку, а в этот момент в здании выключается свет или происходит обрыв линии связи. База данных должна остаться согласованной в этом случае, то есть деньги должны остаться на вашем счету, но покупку вы забрать не сможете. Если же транзакция была выполнена успешно до возникновения технических проблем, то все устройства, работающие с базой данных, получат данные в согласованном состоянии, как только проблема будет устранена.
Обращу ваше внимание на то, что в каждой реализации СУБД свойства ACID реализуются по-разному. Но результат работы свойств ACID всегда один: база данных всегда находится в согласованном состоянии до и после выполнения транзакции. Если требования ACID выполняются, то транзакции могут работать параллельно, не мешая друг другу. Благодаря требованиям ACID транзакции не выполняются частично и, наконец, если транзакция подтверждена, то она подтверждена и никакие технические сбои этому не помешают.
Таблицы в базах данных бывают избыточными и строки в таких таблицах повторяются или дублируются. Команда SELECT решает проблему вывода дублей при помощи двух ключевых слов: ALL и DISTINCT.
Ключевое слово ALL считается в SQLite значением по умолчанию и его можно не писать, как и в других СУБД. Если запрос SELECT имеет модификатор ALL, то мы видим все строки вместе с дублями.
Ключевое DISTINCT позволяет исключить дублирующиеся строки из результирующей таблицы.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/isklyuch
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Иногда бывает необходимость вывести данные из базы данных не в каком-то конкретном диапазоне, а получить только те строки, которые соответствуют определенным критериям или набору значений. Другими словами, нам нужно определить совпадает ли искомое значение с какими-то исходными значениями.
Для решения подобной задачи существует оператор IN, который используется вместе с уточняющими фразами HAVING и WHERE. Данный оператор можно использовать для написания подзапросов, но об этом чуть позже.
Оператор IN бинарный: левым операндом ему служит значение столбца, в котором происходит поиск, а в правой части указывает набор значений, с которыми выполняется сравнение.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/chast-12
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Ранее мы рассмотрели оператор IN и тогда мы сказали, что данный оператор может быть использован для написания подзапросов. Также для подзапросов очень часто используется SQL оператор EXISTS. Оператор EXISTS переводится на русский язык как "существует".
Когда мы работали с объектами базы данных, то очень часто использовали конструкции: IF EXISTS и IF NOT EXISTS.
Когда оператор EXISTS используется вместе с SQL командой SELECT, то выполняется "проверка на существование" и СУБД определяет: выводить результаты нам на экран или нет.
Вообще, подзапросы в SQL можно использовать с любыми операторами и даже использовать подзапрос вместо имени таблицы или имени столбца, так как SELECT всегда нам в качестве результата возвращает таблицу.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/ispolzov
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Результаты SQL запросов SELECT можно объединять при помощи ключевого слова UNION. Не путайте объединение запросов с объединением таблиц (вторая операция выполняется при помощи JOIN).
Объединение запросов не стоит путать с подзапросами, так как обычно подзапросы выполняются для связанных таблиц. А вот объединять результаты запросов мы можем для двух и более не связанных таблиц, главное, чтобы их структура была схожей.
По умолчанию любая СУБД делает объединение запросов, исключая повторяющиеся строки из результата, но мы можем использовать модификатор ALL, который позволяет включить дублирующиеся строки в результирующую таблицу.
Запрос без ALL выполняется несколько более медленно, так как в процессе такого запроса система управления базами данных сравнивает строки перевого запроса со строками второго запроса.
Для успешного выполнения операции UNION важно помнить, что результирующие таблицы запросов должны иметь одинаковое количество столбцов, столбцы должны быть в одинаковой последовательности и с одинаковым типом данных(хотя в отношении SQLite это не совсем так, так как здесь типизация динамическая).
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/obedinen
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Язык SQL позволяет сравнивать результаты двух запросов SELECT. Делается это при помощи двух ключевых слов INTERSECT и EXCEPT.
В результате запрос SELECT INTERSECT мы можем получить из двух таблиц одну, причем результирующая таблица будет содежрать только пересекающиеся строки двух промежуточных табилц. Операцию SELECT INTERSECT иногда еще называют пересечением запросов и ее можно сравнить со сложением в математике.
А SQL запрос SELECT EXCEPT даст нам в результате таблицу, которая будет содержать все строки первой промежуточной таблицы, которых нет во второй промежуточной таблице. Такую операцию называют разностью двух запросов и ее можно сравнить с операцией вычитания.
Работу SQL запросов SELECT INTERSECT и EXCEPT можно хорошо и понятно описать при помощи диаграмм Эйлера—Венна.
Нам стоит отметить, что запрос SELECT INTERSECT симметричный, а это означает, что не имеет значения какую таблицу указывать слева от INTERSECT, а какую справа. Симметричные запросы позволяют менять таблицы местами и при этом результаты никак не меняются (как сложение в математике).
А запрос SELECT EXCEPT несимметричный. Так как результаты такого запроса зависят от того какая табилца будет находиться слева от EXCEPT, а какая таблица будет написана справа. Если поменять таблицы местами, то результаты, соответственно, изменятся.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/sravneni
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Рассмотрим более подробно операцию пересечения строк, которая выполняется при помощи SQL запроса SELECT INTERSECT.
Напомню, что операция SELECT INTERSECT симметрична, а этом означает, что не имеет значения какая таблица будет слева от ключевого слова, а какая справа - результат будет одинаковым.
Также нам стоит заметить, что при выполнении запроса INTERSECT SQlite будет сравнивать строки из первой промежуточной таблицы со строками второй таблицы, поэтому операция SELECT INTERSECT довольно-таки дорогая.
Стоит обратить внимание на то, что в сравниваемых запросах мы можем использовать любые уточняющие фразы: HAVING, WHERE, ORDER BY, LIMIT, GROUP BY и другие.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/sravneni
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Разность строк в базах данных реализуется при помощи SQL запроса SELECT EXCEPT. Напомню, что запрос SELECT EXCEPT несимметричный и результат его работы зависит от того какая таблица указана справа, а какая слева (как вычитание в математике).
Также нам стоит заметить, что при выполнении запроса EXCEPT SQLite будет сравнивать строки из первой промежуточной таблицы со строками второй таблицы, поэтому операция SELECT EXCEPT считается дорогой.
В сравниваемых запросах мы можем использовать любые уточняющие фразы: HAVING, WHERE, ORDER BY, LIMIT, GROUP BY и другие.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/sravneni
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
JOIN - это одно из самых мощных, но в то же время ресурсоемких средств языка SQL. Запросы SELECT JOIN позволяют объединять таблицы в реляционных базах данных. Не путайте операцию объединения таблиц с объединением запросов, второе выполняется при помощи ключевого слова UNION.
В языке SQL можно выделить три вида объединения таблиц: внутреннее, внешнее и перекрестное. Принцип работы этих объединений схож, но результаты их зачастую отличаются.
К внешнему объединению относятся такие запросы как: LEFT OUTER JOIN, RIGHT OUTER JOIN и FULL JOIN. Ключевое слово OUTER можно не писать, SQLite и другие реляционные СУБД вас поймут и простят.
Внутреннее объединение таблиц в базах данных SQL реализуется при помощи конструкции INNER JOIN. А перекрестное объединение таблиц реализовано в SQL при помощи CROSS JOIN.
Принцип работы объединения таблиц в базах данных очень прост: мы выполняем SQL запрос SELECT, который состоит из двух и более подзапросов (в зависимости от того, сколько таблиц нам нужно объединить). А сами подзапросы соединяются друг с другом при помощи ключевого слова JOIN. У этого JOIN есть ограничение ON (во всяком случае официальная документация SQLite называет ON ограничением), которое называют предикатом объединения. Предикат объединения – это всегда какое-то условие, с помощью которого СУБД определяет какие строки из двух таблиц ей нужно объединять. А вот с тем, как объединять строки, SQLite разбирается специальным модификаторам: INNER, LEFT и CROSS.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/obedinen
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
Начнем с внутреннего объединения таблиц в базах данных. Внутреннее объединение таблиц реализуется в SQL при помощи ключевой фразы INNER JOIN.
Конструкция INNER JOIN работает симметрично, а это значит, что не имеет никакого значения, какая таблица будет использована слева от INNER JOIN, а какая справа.
Когда вы хотите сделать внутреннее объединение таблиц в базах данных SQLite, то можете опускать ключевое слово INNER, так как конструкция INNER JOIN – это объединение таблиц по умолчанию в SQLite3.
INNER JOIN в базах данных SQLite3, как и в других СУБД работает довольно просто: SQL запрос SELECT сравнивает строки из левой таблицы со строками правой таблицы, после сравнения SQLite3 выполняет проверку условия соединения или, как еще говорят, вычисляется предикат соединения. Если это вычисление дает значение TRUE, то в результирующую таблицу будет добавлена новая строка, если результат FALSE, то строка в объединённую таблицу добавлена не будет.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/obedinen
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В базах данных SQLite есть только один вид внешнего объединения таблиц: LEFT JOIN или LEFT OUTER JOIN.
Внешнее объединение таблиц работает точно так же, как и внутреннее объединение таблиц, но есть разница в выводе строк после проверки предиката соединения. Давайте разберемся в чем отличие LEFT JOIN от INNER JOIN, а также поймем особенность внешнего объединения таблиц в SQL.
При внешнем объединение LEFT OUTER JOIN в результирующей таблицы окажутся все строки левой таблицы, а к ним, если существуют, добавятся строки правой таблицы, поэтому такой SELECT запрос является несимметричным.
Других способов внешнего объединения в базах данных SQLite3 не реализовано.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/obedinen
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В этом видео мы посмотрим для чего нужно и как реализуется каскадное удаление данных в языке SQL и реляционных базах данных на примере библиотеки SQLite. Каскадное удаление реализуется правилом/ограничением ON DELETE CASCADE.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/kaskadno
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R28827266698
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В этом видео уроке по основам SQL и базам данных для начинающих мы поговорим о том как вывести данные на экран в SQL или как сделать простую выборку данных из таблицы базы данных.
Напомню, что операция выборки данных из базы данных выполняется при помощи команды SELECT. Команде SELECT мы уделим довольно большой объем времени, так как эта команда делает язык SQL таким мощным и удобным средством.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/prostaya
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В этом видео уроке по основам SQL и базам данных для начинающих мы поговорим о том задать условие при выборке данных при помощи клаузулы или уточняющей фразы WHERE.
Уточняющая фраза WHERE в SQL используется для того, чтобы отфильтровать данные и чаще всего WHERE используется с командой SELECT, хотя SQLite, как и другие СУБД, позволяет использовать WHERE с другими SQL командами, выполняя запросы на модификацию или обновление данных и при этом задавать различные условия.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/usloviya
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В этом видео уроке по основам SQL и базам данных для начинающих мы поговорим о том как сгруппировать данные при выборке данных из базы данных.
Отметим, что операция группировки реализована в SQL при помощи клаузулы GROUP BY. SQL запросы SELECT GROUP BY бывают очень полезны, особенно при избыточности данных, например, у нас есть таблица, в которой хранятся данные о зарплате и есть сотрудники, которые занимают две ставки, чтобы получить информацию о суммарном доходе всех сотрудников, нам нужно выполнить запрос SELECT GROUP BY.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/sql-grup
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В этом видео уроке по основам SQL и базам данных для начинающих мы поговорим о том как сделать фильтрацию данных после группировки.
HAVING - это третья уточняющая фраза и используется она в SQL запросах SELECT только после группировки. Чтобы SQL команда SELECT была успешно выполнена, а данные были отфильтрованы клаузулой HAVING, ее нужно использовать после GROUP BY.
Порядок следующий: SELECT WHERE GROUP BY HAVING. Клаузула HAVING работает точно так же, как и WHERE с той лишь разницей, что HAVING используется для фильтрации данных после группировки.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/dopolnit
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В этом видео уроке по основам SQL и базам данных для начинающих мы поговорим о том как отсортировать данные при выборке при помощи уточняющей фразы ORDER BY.
Чаще всего в SQL клаузула ORDER BY используется вместе с командой SELECT, чтобы выполнить сортировку при выборке данных из базы данных. Но ORDER BY может быть использована и с другими SQL запросами, например при модификации данных или удалении данных из базы данных.
В базах данных SQLite ORDER BY может использовать сортирующие последовательности, для этого необходимо использовать ключевое слово COLLATE.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/sortirov
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В этом видео уроке по основам SQL и базам данных для начинающих мы поговорим о том как сказать СУБД сколько строк вывести на экран в результате запроса SELECT. Или, проще говоря, как ограничить количество строк при помощи клаузулы LIMIT.
Уточняющая фраза LIMIT очень часто используется в SQL запросах SELECT вместе с ORDER BY. Также стоит сказать, что LIMIT - это последняя уточняющая фраза, которая есть в SQL. Нам следует добавить, что в базах данных SQLite вместе с LIMIT можно использовать ключевое слово OFFSET.
Ключевое слово OFFSET в SQL используется для того, чтобы сказать СУБД о том сколько строк нужно пропустить и не показывать. И LIMIT, и OFFSET в качестве параметра принимают целые положительные числа.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/ogranich
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В этом видео уроке по основам SQL и базам данных для начинающих мы поговорим о том как усложнять условия выборки данных из базы данных при помощи логических SQL операторов AND и OR.
Вы будете очень часто использовать операторы AND и OR не только с командой SELECT, но и в других SQLзапросах, например, при удалении или обновлении данных. SQL операторы AND и OR относятся к группе логических операторов. AND - это логическое умножение, а OR - это логическое сложение.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/chast-12
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223
В этом видео уроке по основам SQL и базам данных для начинающих мы рассмотрим реализацию SQL оператора BETWEEN в базах данных на примере библиотеки SQLite. Вы будете часто использовать оператор BETWEEN вместе с SQL командой SELECT, хотя иногда BETWEEN используют и в других DML запросах.
BETWEEN позволяет задать диапазон, из которого нужно получить значение. Оператор BETWEEN используется вместе с оператором AND, который позволяет указать верхнюю и нижнюю границу диапазона выборки данных.
Рубрика SQLite на сайте: http://zametkinapolyah.ru/zametki-o-mysql/sqlite/
Текстовая версия: http://zametkinapolyah.ru/zame....tki-o-mysql/between-
Паблик блога в ВК: https://vk.com/zametkinapolyah
Тематическая группа в ВК: https://vk.com/zametki_bd
Помощь проекту:
WMR: R288272666982
WMZ: Z293550531456
Яндекс.Деньги: 410011531129223