Browse Source

импорт данных

Евгений Колесников 4 years ago
parent
commit
30e0c4e056

+ 17 - 5
articles/sql_for_beginner.md

@@ -1,5 +1,15 @@
+<table style="width: 100%;"><tr><td style="width: 40%;">
+<a href="../articles/5_1_1_1_erd_workbench.md">Создание ER-диаграммы в среде MySQL Workbench
+</a></td><td style="width: 20%;">
+<a href="../readme.md">Содержание
+</a></td><td style="width: 40%;">
+<a href="../articles/sql_import.md">Создание базы данных. Импорт данных.
+</a></td><tr></table>
+
 # Основы SQL
 
+<!-- добавтить count и функции работы со временем (between) -->
+
 **Structured Query Language (SQL)** — язык структурированных запросов, с помощью него пишутся специальные запросы (SQL инструкции) к базе данных с целью получения этих данных из базы и для манипулирования этими данными.
 
 С точки зрения реализации язык SQL представляет собой набор операторов, которые делятся на определенные группы и у каждой группы есть свое назначение. В сокращенном виде эти группы называются **DDL**, **DML**, **DCL** и **TCL**.
@@ -642,8 +652,10 @@ INSERT INTO Goods VALUES (NULL, 'Table', 2);
     ```
 
 
-<!-- ## Практическое задание
-
-В каталоге `data` этого репозитория находится структура БД (`ms.sql`) и файлы для импорта: `products_k_import.csv`, `materials_short_k_import.txt`, `productmaterial_k_import.xlsx`.
-
-Необходимо **во-первых**, восстановить структуру БД из скрипта,  **во-вторых**, импортировать исходные данные в **Excel**, **в-третьих** исправить данные (смотрите на структуру таблиц в БД, где-то надо явно указать тип данных, где-то вырезать лишние данные...) и **в-четвёртых** загрузить исправленные данные в БД (сначала просто импорт во временные таблицы, потом разнести SQL-запросами по нужным таблицам) -->
+<table style="width: 100%;"><tr><td style="width: 40%;">
+<a href="../articles/5_1_1_1_erd_workbench.md">Создание ER-диаграммы в среде MySQL Workbench
+</a></td><td style="width: 20%;">
+<a href="../readme.md">Содержание
+</a></td><td style="width: 40%;">
+<a href="../articles/sql_import.md">Создание базы данных. Импорт данных.
+</a></td><tr></table>

+ 136 - 0
articles/sql_import.md

@@ -0,0 +1,136 @@
+<table style="width: 100%;"><tr><td style="width: 40%;">
+<a href="../articles/sql_for_beginner.md">Основы SQL
+</a></td><td style="width: 20%;">
+<a href="../readme.md">Содержание
+</a></td><td style="width: 40%;">
+<a href="../articles/wpf_filtering.md">&nbsp;
+</a></td><tr></table>
+
+# Создание базы данных. 
+
+## Подключение к базе данных
+
+Прежде чем что-то сделать с базой данных нужно к ней подключиться:
+
+1. Запустите программу *MySQL Workbench*
+
+2. На стартовом окне программы кликните по значку "+"
+
+    ![](../img/01022.png)
+
+3. В параметрах подключения заполните поля:
+
+    ![](../img/01023.png)
+
+    * *Connection name* - название подключения. Тут может быть что угодно, но лучше указать свой логин (см. ниже)
+    * *Host name* - IP-адрес или доменное имя сервера. В рамках лабораторных работ мы будем работать на удаленном сервере **kolei.ru**, на демо-экзамене будет сервер в локальной сети.
+    * *Username* - имя пользователя. Присваивается преподавателем. 
+    * *Store in vault* - открывает окно для ввода и СОХРАНЕНИЯ пароля. Дома можете настроить, чтобы каждый раз не вводить пароль, но в классе лучше не использовать.
+    * *Test connection* - тест соединения. Программа запросит пароль и попытается подключиться к серверу используя введенные параметры. Если все параметры введены правильно, то появится окно подтверждения.
+
+        ![](../img/01024.png)
+
+    * В окне настроек соединения жмите "OK"
+
+## Создание БД используя скрипт
+
+1. Окройте EER-диаграмму
+2. Переименуйте (правый клик мышкой) базу данных в соответствии со своим *Username* (см. выше)
+
+    ![](../img/01025.png)
+
+3. Сформируйте скрипт для создания БД: **File** -> **Export** -> **Forward Engineer SQL CREATE Script**. В окнах настроек и объектов пока всё оставляем по-умолчанию. Скопируйте скрипт в буфер обмена.
+4. Откройте ранее созданное подключение к БД. Обычно при открытии БД одновременно открывается окно **Query** (запросы). Если его нет, но откройте новое:
+
+    ![](../img/01026.png)
+
+5. Вставьте в окно запросов скрипт из буфера обмена и закомментируйте строку с созданием схемы (у вас нет прав на создание новых схем)
+
+    ![](../img/01027.png)
+
+6. Выполните скрипт
+
+    ![](../img/01028.png)
+
+7. Если всё нормально, то будут созданы все таблицы и связи, которые вы описали в EER
+
+    ![](../img/01029.png)
+
+
+>На демо-экзамене в ресурсах будет аналогичный файл скрипта базы данных, но в нём не укзана база данных. Нужно в начале скрипта вписать команду `use <название вашей базы>`
+
+# Импорт данных.
+
+Стандартом *де-факто* для импорта/экспорта данных является формат CSV.
+
+## Что такое CSV-файлы
+
+Формат CSV используют, чтобы хранить таблицы в текстовых файлах. Данные очень часто упаковывают именно в таблицы, поэтому CSV-файлы очень популярны.
+
+CSV расшифровывается как comma-separated values — «значения, разделенные запятыми». Но разделителями столбцов в CSV-файле могут служить и точки с запятой, и знаки табуляции. Это все равно будет CSV-файл.
+
+У CSV куча плюсов перед тем же форматом Excel: текстовые файлы просты как пуговица, открываются быстро, читаются на любом устройстве и в любой среде без дополнительных инструментов.
+
+Из-за своих преимуществ CSV — сверхпопулярный формат обмена данными, хотя ему уже лет 40. CSV используют прикладные промышленные программы, в него выгружают данные из баз.
+
+Одна беда — текстового редактора для работы с CSV мало. Еще ничего, если таблица простая: в первом поле ID одной длины, во втором дата одного формата, а в третьем какой-нибудь адрес. Но когда поля разной длины и их больше трех, начинаются мучения.
+
+Еще хуже с анализом данных — попробуй «Блокнотом» хотя бы сложить все числа в столбце. Я уж не говорю о красивых графиках.
+
+Поэтому CSV-файлы анализируют и редактируют в Excel и аналогах: Open Office, LibreOffice и прочих.
+
+## Как Excel портит данные: из классики
+
+Все бы ничего, но Excel, едва открыв CSV-файл, начинает свои лукавые выкрутасы. Он без спроса меняет данные так, что те приходят в негодность. Причем делает это совершенно незаметно. Из-за этого в свое время мы схватили ворох проблем.
+
+Большинство казусов связано с тем, что программа без спроса преобразует строки с набором цифр в числа.
+
+**Округляет**. Например, в исходной ячейке два телефона хранятся через запятую без пробелов: «5235834,5235835». Что сделает Excel? Лихо превратит номера́ в одно число и округлит до двух цифр после запятой: «5235834,52». Так мы потеряем второй телефон.
+
+**Приводит к экспоненциальной форме**. Excel заботливо преобразует «123456789012345» в число «1,2E+15». Исходное значение потеряем напрочь.
+
+Проблема актуальна для длинных, символов по пятнадцать, цифровых строк. Например, КЛАДР-кодов (это такой государственный идентификатор адресного объекта: го́рода, у́лицы, до́ма).
+
+**Удаляет лидирующие плюсы**. Excel считает, что плюс в начале строки с цифрами — совершенно лишний символ. Мол, и так ясно, что число положительное, коль перед ним не стоит минус. Поэтому лидирующий плюс в номере «+74955235834» будет отброшен за ненадобностью — получится «74955235834». (В реальности номер пострадает еще сильнее, но для наглядности обойдусь плюсом).
+
+Потеря плюса критична, например, если данные пойдут в стороннюю систему, а та при импорте жестко проверяет формат.
+
+**Разбивает по три цифры**. Цифровую строку длиннее трех символов Excel, добрая душа, аккуратно разберет. Например, «8 495 5235834» превратит в «84 955 235 834».
+
+Форматирование важно как минимум для телефонных номеров: пробелы отделяют коды страны и города от остального номера и друг от друга. Excel запросто нарушает правильное членение телефона.
+
+**Удаляет лидирующие нули**. Строку «00523446» Excel превратит в «523446».
+А в ИНН, например, первые две цифры — это код региона. Для Республики Алтай он начинается с нуля — «04». Без нуля смысл номера исказится, а проверку формата ИНН вообще не пройдет.
+
+**Меняет даты под локальные настройки**. Excel с удовольствием исправит номер дома «1/2» на «01.фев». Потому что Windows подсказал, что в таком виде вам удобнее считывать даты.
+
+## Побеждаем порчу данных правильным импортом
+
+Если серьезно, в бедах виноват не Excel целиком, а неочевидный способ импорта данных в программу.
+
+По умолчанию Excel применяет к данным в загруженном CSV-файле тип «General» — общий. Из-за него программа распознает цифровые строки как числа. Такой порядок можно победить, используя встроенный инструмент импорта.
+
+**Запускаем** встроенный в Excel механизм импорта.
+
+**Выбирем** CSV-файл с данными, открывается диалог. В диалоге кликем на тип файла Delimited (с разделителями). Кодировка — та, что в файле, обычно определяется автоматом. Если первая строка файла — шапка, отмечем «My Data Has Headers».
+
+**Переходим** ко второму шагу диалога. Выбираем разделитель полей (обычно это запятая). Отключаем «Treat consecutive delimiters as one», а «Text qualifier» выставляем в «{none}». (Text qualifier — это символ начала и конца текста. Если разделитель в CSV — запятая, то text qualifier нужен, чтобы отличать запятые внутри текста от запятых-разделителей.)
+
+На третьем шаге выбираем формат полей, ради него все и затевалось. Для всех столбцов выставляем тип «Text». Кстати, если кликнуть на первую колонку, зажать шифт и кликнуть на последнюю, выделятся сразу все столбцы. Удобно.
+
+Дальше Excel спросит, куда вставлять данные из CSV — можно просто нажать «OK», и данные появятся в открытом листе.
+
+**Но! Если мы планируем экспортировать данные в CSV из Excel, придется сделать еще кое-что.**
+
+После импорта нужно принудительно привести все-все ячейки на листе к формату «Text». Иначе новые поля приобретут все тот же тип «General».
+
+* Нажимаем два раза Ctrl+A, Excel выбирает все ячейки на листе;
+* кликаем правой кнопкой мыши;
+* выбираем в контекстном меню «Format Cells»;
+* в открывшемся диалоге выбираем слева тип данных «Text».
+
+<!-- ## Практическое задание
+
+В каталоге `data` этого репозитория находится структура БД (`ms.sql`) и файлы для импорта: `products_k_import.csv`, `materials_short_k_import.txt`, `productmaterial_k_import.xlsx`.
+
+Необходимо **во-первых**, восстановить структуру БД из скрипта,  **во-вторых**, импортировать исходные данные в **Excel**, **в-третьих** исправить данные (смотрите на структуру таблиц в БД, где-то надо явно указать тип данных, где-то вырезать лишние данные...) и **в-четвёртых** загрузить исправленные данные в БД (сначала просто импорт во временные таблицы, потом разнести SQL-запросами по нужным таблицам) -->

+ 51 - 0
data/materials_short_k_import.txt

@@ -0,0 +1,51 @@
+Наименование материала, Тип материала, Количество в упаковке, Единица измерения, Количество на складе, Минимальный возможный остаток, Стоимость
+Шипы для льда 3x2, Шипы, 3, г, 470, 26, 6511.00 ₽
+Резина для льда 0x2, Резина, 2, кг, 816, 21, 48785
+Шипы для льда 2x2, Шипы, 1, г, 479, 22, 13077.00
+Шипы для льда 3x0, Шипы, 9, г, 885, 5, 52272 руб.
+Шипы для пустыни 3x2, Шипы, 2, г, 923, 19, 28748 рублей
+Шипы для лета 3x1, Шипы, 6, кг, 184, 40, 51974
+Резина для зимы 2x3, Резина, 3, м, 344, 12, 53323
+Резина для зимы 3x3, Резина, 2, кг, 275, 28, 31356.00
+Шипы для льда 1x0, Шипы, 10, г, 914, 22, 25538
+Резина для лета 0x1, Резина, 9, кг, 127, 17, 23936 руб.
+Резина для лета 2x2, Резина, 2, м, 542, 20, 54298.00 ₽
+Резина для зимы 3x1, Резина, 9, кг, 690, 24, 25844
+Шипы для зимы 0x1, Шипы, 3, г, 255, 25, 6484 рублей
+Шипы для льда 2x0, Шипы, 4, шт, 214, 15, 17996.00
+Резина для пустыни 3x2, Резина, 1, м, 931, 43, 5854.00 ₽
+Шипы для зимы 3x0, Шипы, 6, г, 192, 48, 9260.00 ₽
+Резина для пустыни 2x0, Резина, 5, кг, 769, 14, 17425.00
+Шипы для лета 3x2, Шипы, 1, г, 547, 11, 43288 рублей
+Резина для зимы 0x3, Резина, 4, м, 726, 46, 37293 руб.
+Шипы для льда 0x0, Шипы, 2, кг, 585, 37, 21188.00
+Шипы для льда 0x1, Шипы, 2, шт, 147, 8, 49557.00 ₽
+Резина для льда 1x3, Резина, 2, кг, 286, 39, 23551.00 ₽
+Резина для пустыни 1x3, Резина, 5, кг, 222, 9, 21546 рублей
+Шипы для зимы 3x3, Шипы, 4, г, 652, 33, 15159.00
+Шипы для пустыни 0x2, Шипы, 4, г, 792, 46, 8571 рублей
+Шипы для лета 2x0, Шипы, 1, г, 68, 43, 8206.00
+Резина для пустыни 3x3, Резина, 9, м, 840, 11, 5144.00 ₽
+Резина для льда 0x1, Резина, 5, м, 964, 34, 53394.00 ₽
+Резина для лета 0x2, Резина, 4, кг, 753, 33, 9069
+Резина для зимы 1x0, Резина, 5, кг, 929, 48, 43046.00 ₽
+Резина для лета 3x3, Резина, 6, м, 652, 28, 6764.00
+Резина для пустыни 1x1, Резина, 6, кг, 120, 21, 11642
+Шипы для пустыни 0x1, Шипы, 4, шт, 612, 24, 55689.00
+Шипы для льда 3x1, Шипы, 8, г, 123, 43, 42668.00 ₽
+Резина для льда 3x3, Резина, 7, кг, 909, 35, 23174
+Шипы для льда 2x3, Шипы, 10, шт, 237, 7, 27105.00
+Шипы для лета 2x2, Шипы, 4, г, 15, 10, 44506
+Резина для пустыни 2x3, Резина, 5, м, 103, 38, 55679.00 ₽
+Резина для зимы 1x3, Резина, 9, м, 84, 50, 27823 рублей
+Резина для лета 1x0, Резина, 5, м, 234, 32, 25499 рублей
+Резина для пустыни 0x3, Резина, 8, м, 761, 7, 8094.00
+Резина для лета 2x1, Резина, 2, м, 561, 39, 47610 рублей
+Резина для пустыни 2x1, Резина, 10, кг, 918, 12, 34518.00 ₽
+Шипы для пустыни 3x1, Шипы, 4, г, 37, 43, 27104 рублей
+Шипы для льда 1x1, Шипы, 7, г, 335, 33, 48279
+Шипы для зимы 2x0, Шипы, 3, шт, 466, 8, 34841 рублей
+Резина для пустыни 1x2, Резина, 9, кг, 496, 36, 24876 рублей
+Резина для льда 2x0, Резина, 6, м, 86, 8, 24767.00
+Шипы для лета 0x1, Шипы, 2, кг, 974, 35, 28825.00
+Шипы для льда 2x1, Шипы, 10, шт, 634, 25, 23287 рублей

+ 222 - 0
data/my.sql

@@ -0,0 +1,222 @@
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.AgentType
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `AgentType` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `Title` VARCHAR(50) CHARACTER SET 'utf8mb4' NOT NULL,
+  `Image` VARCHAR(100) CHARACTER SET 'utf8mb4' NULL,
+  PRIMARY KEY (`ID`));
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.Supplier
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Supplier` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `Title` VARCHAR(150) CHARACTER SET 'utf8mb4' NOT NULL,
+  `INN` VARCHAR(12) NOT NULL,
+  `StartDate` DATE NOT NULL,
+  `QualityRating` INT NULL,
+  `SupplierType` VARCHAR(20) CHARACTER SET 'utf8mb4' NULL,
+  PRIMARY KEY (`ID`));
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.ProductType
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `ProductType` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `Title` VARCHAR(50) CHARACTER SET 'utf8mb4' NOT NULL,
+  `DefectedPercent` DOUBLE NOT NULL,
+  PRIMARY KEY (`ID`));
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.Product
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Product` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `Title` VARCHAR(100) CHARACTER SET 'utf8mb4' NOT NULL,
+  `ProductTypeID` INT NULL,
+  `ArticleNumber` VARCHAR(10) CHARACTER SET 'utf8mb4' NOT NULL,
+  `Description` LONGTEXT CHARACTER SET 'utf8mb4' NULL,
+  `Image` VARCHAR(100) CHARACTER SET 'utf8mb4' NULL,
+  `ProductionPersonCount` INT NULL,
+  `ProductionWorkshopNumber` INT NULL,
+  `MinCostForAgent` DECIMAL(10,2) NOT NULL,
+  PRIMARY KEY (`ID`),
+  CONSTRAINT `FK_Product_ProductType`
+    FOREIGN KEY (`ProductTypeID`)
+    REFERENCES `ProductType` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.MaterialSupplier
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `MaterialSupplier` (
+  `MaterialID` INT NOT NULL,
+  `SupplierID` INT NOT NULL,
+  PRIMARY KEY (`MaterialID`, `SupplierID`),
+  CONSTRAINT `FK_MaterialSupplier_Supplier`
+    FOREIGN KEY (`SupplierID`)
+    REFERENCES `Supplier` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `FK_MaterialSupplier_Material`
+    FOREIGN KEY (`MaterialID`)
+    REFERENCES `Material` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.MaterialType
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `MaterialType` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `Title` VARCHAR(50) CHARACTER SET 'utf8mb4' NOT NULL,
+  `DefectedPercent` DOUBLE NOT NULL,
+  PRIMARY KEY (`ID`));
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.Material
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Material` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `Title` VARCHAR(100) CHARACTER SET 'utf8mb4' NOT NULL,
+  `CountInPack` INT NOT NULL,
+  `Unit` VARCHAR(10) CHARACTER SET 'utf8mb4' NOT NULL,
+  `CountInStock` DOUBLE NULL,
+  `MinCount` DOUBLE NOT NULL,
+  `Description` LONGTEXT CHARACTER SET 'utf8mb4' NULL,
+  `Cost` DECIMAL(10,2) NOT NULL,
+  `Image` VARCHAR(100) CHARACTER SET 'utf8mb4' NULL,
+  `MaterialTypeID` INT NOT NULL,
+  PRIMARY KEY (`ID`),
+  CONSTRAINT `FK_Material_MaterialType`
+    FOREIGN KEY (`MaterialTypeID`)
+    REFERENCES `MaterialType` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.ProductMaterial
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `ProductMaterial` (
+  `ProductID` INT NOT NULL,
+  `MaterialID` INT NOT NULL,
+  `Count` DOUBLE NULL,
+  PRIMARY KEY (`ProductID`, `MaterialID`),
+  CONSTRAINT `FK_ProductMaterial_Material`
+    FOREIGN KEY (`MaterialID`)
+    REFERENCES `Material` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `FK_ProductMaterial_Product`
+    FOREIGN KEY (`ProductID`)
+    REFERENCES `Product` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.ProductSale
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `ProductSale` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `AgentID` INT NOT NULL,
+  `ProductID` INT NOT NULL,
+  `SaleDate` DATE NOT NULL,
+  `ProductCount` INT NOT NULL,
+  PRIMARY KEY (`ID`),
+  CONSTRAINT `FK_ProductSale_Agent`
+    FOREIGN KEY (`AgentID`)
+    REFERENCES `Agent` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION,
+  CONSTRAINT `FK_ProductSale_Product`
+    FOREIGN KEY (`ProductID`)
+    REFERENCES `Product` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.Agent
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Agent` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `Title` VARCHAR(150) CHARACTER SET 'utf8mb4' NOT NULL,
+  `AgentTypeID` INT NOT NULL,
+  `Address` VARCHAR(300) CHARACTER SET 'utf8mb4' NULL,
+  `INN` VARCHAR(12) NOT NULL,
+  `KPP` VARCHAR(9) NULL,
+  `DirectorName` VARCHAR(100) CHARACTER SET 'utf8mb4' NULL,
+  `Phone` VARCHAR(20) CHARACTER SET 'utf8mb4' NOT NULL,
+  `Email` VARCHAR(255) CHARACTER SET 'utf8mb4' NULL,
+  `Logo` VARCHAR(100) CHARACTER SET 'utf8mb4' NULL,
+  `Priority` INT NOT NULL,
+  PRIMARY KEY (`ID`),
+  CONSTRAINT `FK_Agent_AgentType`
+    FOREIGN KEY (`AgentTypeID`)
+    REFERENCES `AgentType` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.Shop
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `Shop` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `Title` VARCHAR(150) CHARACTER SET 'utf8mb4' NOT NULL,
+  `Address` VARCHAR(300) CHARACTER SET 'utf8mb4' NULL,
+  `AgentID` INT NOT NULL,
+  PRIMARY KEY (`ID`),
+  CONSTRAINT `FK_Shop_Agent`
+    FOREIGN KEY (`AgentID`)
+    REFERENCES `Agent` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.MaterialCountHistory
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `MaterialCountHistory` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `MaterialID` INT NOT NULL,
+  `ChangeDate` DATETIME(6) NOT NULL,
+  `CountValue` DOUBLE NOT NULL,
+  PRIMARY KEY (`ID`),
+  CONSTRAINT `FK_MaterialCountHistory_Material`
+    FOREIGN KEY (`MaterialID`)
+    REFERENCES `Material` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.ProductCostHistory
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `ProductCostHistory` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `ProductID` INT NOT NULL,
+  `ChangeDate` DATETIME(6) NOT NULL,
+  `CostValue` DECIMAL(10,2) NOT NULL,
+  PRIMARY KEY (`ID`),
+  CONSTRAINT `FK_ProductCostHistory_Product`
+    FOREIGN KEY (`ProductID`)
+    REFERENCES `Product` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+
+-- ----------------------------------------------------------------------------
+-- Table dbo.AgentPriorityHistory
+-- ----------------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `AgentPriorityHistory` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `AgentID` INT NOT NULL,
+  `ChangeDate` DATETIME(6) NOT NULL,
+  `PriorityValue` INT NOT NULL,
+  PRIMARY KEY (`ID`),
+  CONSTRAINT `FK_AgentPriorityHistory_Agent`
+    FOREIGN KEY (`AgentID`)
+    REFERENCES `Agent` (`ID`)
+    ON DELETE NO ACTION
+    ON UPDATE NO ACTION);
+SET FOREIGN_KEY_CHECKS = 1;

BIN
data/productmaterial_k_import.xlsx


+ 101 - 0
data/products_k_import.csv

@@ -0,0 +1,101 @@
+Наименование продукции;Артикул;Минимальная стоимость для агента;Изображение;Тип продукции;Количество человек для производства;Номер цеха для производства
+Колесо R18 Кованый;241659;11509 рублей;\products\tire_15.jpg;Колесо;4;Цех № 10
+Запаска R15 Кованый;327657;8667;\products\tire_64.jpg;Запаска;2;8
+Шина R21 Лето;266521;10561;\products\tire_6.jpg;Шина;4;№1
+Шина R21 Кованый;329576;7989.00;\products\tire_59.jpg;Шина;2;Цех № 2
+Диск R17 Лето;400508;12941 рублей;\products\tire_24.jpg;Диск;1;4
+Шина R14 Липучка;331598;13879 рублей;\products\tire_17.jpg;Шина;4;Цех № 1
+Диск R16 Кованый;440075;9068 рублей;\products\tire_25.jpg;Диск;3;9
+Запаска R14 Лето;448396;12878.00;\products\tire_32.jpg;Запаска;1;5
+Диск R22 Липучка;418286;10670.00 ₽;\products\tire_4.jpg;Диск;4;2
+Запаска R15 Лето;348910;4969.00;\products\tire_50.jpg;Запаска;1;Цех № 9
+Шина R15 Липучка;349418;6393 рублей;\products\tire_48.jpg;Шина;1;№4
+Колесо R15 Кованый;376388;9439;не указано;Колесо;3;№4
+Колесо R20 Кованый;445217;9569 руб.;\products\tire_1.jpg;Колесо;3;10
+Диск R19 Лето;243152;6264 руб.;\products\tire_0.jpg;Диск;1;9
+Колесо R18 Лето;412238;13892.00;\products\tire_14.jpg;Колесо;2;№7
+Диск R20 Зима;252453;14526.00 ₽;нет;Диск;4;Цех № 9
+Диск R17 Зима;343841;12768.00;нет;Диск;3;9
+Запаска R21 Липучка;247470;10139.00;\products\tire_62.jpg;Запаска;1;2
+Запаска R20 Липучка;335226;9988 руб.;не указано;Запаска;1;№2
+Шина R17 Кованый;299692;11463;\products\tire_58.jpg;Шина;3;Цех № 10
+Диск R20 Липучка;447543;11661.00;\products\tire_3.jpg;Диск;4;№8
+Запаска R20 Кованый;249737;7509 рублей;не указано;Запаска;5;№5
+Колесо R14 Кованый;429265;11838 руб.;отсутствует;Колесо;3;Цех № 6
+Диск R21 Кованый;299085;4757.00 ₽;\products\tire_61.jpg;Диск;3;Цех № 3
+Шина R20 Кованый;330937;10928 руб.;\products\tire_45.jpg;Шина;3;Цех № 1
+Диск R16 Липучка;435703;9934;нет;Диск;5;2
+Запаска R18 Лето;305509;5192.00;\products\tire_41.jpg;Запаска;1;Цех № 3
+Запаска R19 Кованый;390434;14258 рублей;\products\tire_46.jpg;Запаска;5;Цех № 8
+Диск R18 Лето;317858;8435 руб.;\products\tire_52.jpg;Диск;5;Цех № 3
+Запаска R14 Кованый;412235;12891.00 ₽;\products\tire_47.jpg;Запаска;4;Цех № 6
+Запаска R22 Липучка;328305;10116.00;\products\tire_13.jpg;Запаска;2;1
+Колесо R21 Липучка;403378;3626.00 ₽;\products\tire_55.jpg;Колесо;3;№10
+Шина R18 Лето;425463;11625;нет;Шина;4;Цех № 10
+Запаска R17 Липучка;327883;12332;\products\tire_10.jpg;Запаска;2;2
+Диск R22 Кованый;388520;7498 рублей;\products\tire_19.jpg;Диск;3;2
+Шина R18 Липучка;319450;4951 руб.;не указано;Шина;3;6
+Шина R16 Кованый;421321;14691.00 ₽;отсутствует;Шина;1;№2
+Диск R17 Липучка;282569;12356 руб.;\products\tire_42.jpg;Диск;5;5
+Запаска R23 Зима;394768;13019.00 ₽;\products\tire_8.jpg;Запаска;1;9
+Диск R21 Зима;250714;8762 рублей;\products\tire_11.jpg;Диск;5;№5
+Диск R16 Лето;251201;8149;не указано;Диск;3;10
+Шина R14 Кованый;274477;9527 рублей;\products\tire_34.jpg;Шина;5;Цех № 5
+Диск R19 Зима;358851;5695.00;\products\tire_16.jpg;Диск;5;6
+Диск R21 Лето;449834;2698.00;\products\tire_35.jpg;Диск;4;№8
+Запаска R19 Липучка;438383;12000.00 ₽;нет;Запаска;3;1
+Колесо R19 Лето;298778;7493 рублей;\products\tire_38.jpg;Колесо;1;10
+Колесо R16 Лето;337577;10161.00;\products\tire_2.jpg;Колесо;1;№9
+Запаска R21 Зима;365509;14556;нет;Запаска;5;6
+Шина R20 Липучка;348553;3508;нет;Шина;2;2
+Диск R20 Лето;300047;10323 рублей;\products\tire_56.jpg;Диск;3;№10
+Запаска R18 Липучка;279256;9759 рублей;\products\tire_53.jpg;Запаска;4;5
+Шина R22 Лето;406784;14692 руб.;\products\tire_37.jpg;Шина;3;Цех № 5
+Колесо R21 Лето;276905;10343.00 ₽;нет;Колесо;1;Цех № 2
+Диск R19 Липучка;318661;5544;нет;Диск;1;6
+Запаска R14 Зима;440993;6020 руб.;нет;Запаска;5;№2
+Запаска R22 Кованый;341800;5447.00 ₽;не указано;Запаска;2;Цех № 4
+Диск R22 Зима;453650;11459;\products\tire_22.jpg;Диск;5;Цех № 3
+Запаска R17 Кованый;372287;5808 рублей;\products\tire_57.jpg;Запаска;5;№3
+Диск R15 Лето;347427;5071.00;нет;Диск;1;№1
+Шина R15 Кованый;274665;13101 руб.;\products\tire_63.jpg;Шина;2;Цех № 10
+Запаска R19 Лето;283112;3362 руб.;\products\tire_33.jpg;Запаска;3;№4
+Колесо R20 Липучка;363664;12681.00 ₽;не указано;Колесо;1;№8
+Шина R19 Зима;444141;2741;отсутствует;Шина;2;Цех № 8
+Шина R22 Кованый;416324;13841.00 ₽;\products\tire_30.jpg;Шина;2;№8
+Колесо R18 Зима;387609;3445 рублей;\products\tire_9.jpg;Колесо;1;№4
+Запаска R16 Кованый;432234;13556.00 ₽;нет;Запаска;3;7
+Колесо R17 Зима;381949;5902.00;отсутствует;Колесо;4;№6
+Запаска R16 Зима;394413;12679 рублей;\products\tire_49.jpg;Запаска;3;№10
+Колесо R20 Лето;434626;11959;\products\tire_31.jpg;Колесо;5;8
+Шина R17 Липучка;280863;11695 руб.;нет;Шина;4;8
+Шина R18 Зима;444280;13168 руб.;\products\tire_44.jpg;Шина;4;№6
+Запаска R17 Лето;331576;4803.00 ₽;\products\tire_39.jpg;Запаска;3;№8
+Запаска R22 Зима;268886;13471 руб.;отсутствует;Запаска;3;Цех № 2
+Колесо R20 Зима;427198;2397;нет;Колесо;4;№10
+Шина R17 Лето;354738;11329.00 ₽;\products\tire_20.jpg;Шина;2;Цех № 10
+Шина R14 Лето;330951;6786.00;\products\tire_29.jpg;Шина;4;№7
+Запаска R20 Зима;241577;9125.00 ₽;\products\tire_51.jpg;Запаска;2;№6
+Колесо R17 Липучка;281537;4365 руб.;не указано;Колесо;1;№2
+Шина R16 Зима;300433;2570 рублей;отсутствует;Шина;4;№2
+Запаска R19 Зима;254860;5568.00 ₽;отсутствует;Запаска;2;№5
+Диск R22 Лето;406411;2904.00 ₽;\products\tire_23.jpg;Диск;2;Цех № 4
+Колесо R19 Липучка;440973;8439 руб.;\products\tire_5.jpg;Колесо;4;Цех № 4
+Шина R21 Липучка;308647;12830 рублей;\products\tire_26.jpg;Шина;4;Цех № 6
+Шина R17 Зима;291319;6426.00;\products\tire_54.jpg;Шина;2;4
+Диск R18 Зима;255211;13239;\products\tire_21.jpg;Диск;1;6
+Шина R18 Кованый;275809;3258 руб.;\products\tire_40.jpg;Шина;4;10
+Колесо R17 Лето;332936;11145.00;\products\tire_28.jpg;Колесо;2;Цех № 1
+Шина R22 Зима;382661;10373 рублей;не указано;Шина;1;№2
+Шина R19 Лето;335030;4870 руб.;не указано;Шина;4;Цех № 10
+Шина R19 Кованый;291359;14682.00;\products\tire_27.jpg;Шина;5;Цех № 10
+Колесо R18 Липучка;332858;14804 рублей;\products\tire_12.jpg;Колесо;3;№7
+Запаска R15 Липучка;237228;5510.00 ₽;\products\tire_18.jpg;Запаска;3;8
+Шина R15 Зима;312952;4039;отсутствует;Шина;2;5
+Шина R19 Липучка;341034;13063.00;\products\tire_36.jpg;Шина;1;5
+Запаска R15 Зима;251241;3874 руб.;отсутствует;Запаска;3;Цех № 10
+Шина R16 Лето;437927;7181 руб.;отсутствует;Шина;3;6
+Колесо R16 Липучка;263261;14521;нет;Колесо;4;Цех № 1
+Запаска R21 Лето;299112;3694.00 ₽;\products\tire_43.jpg;Запаска;2;Цех № 8
+Шина R21 Зима;398710;9378.00;\products\tire_7.jpg;Шина;2;№2
+Шина R16 Липучка;320970;2264.00;\products\tire_60.jpg;Шина;1;2

BIN
img/01022.png


BIN
img/01023.png


BIN
img/01024.png


BIN
img/01025.png


BIN
img/01026.png


BIN
img/01027.png


BIN
img/01028.png


BIN
img/01029.png


+ 7 - 0
readme.md

@@ -91,6 +91,13 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 
 8. [Основы SQL](./articles/sql_for_beginner.md)
 
+<!-- 
+В "основах" оставить только SELECT, добавив count и функции работы со временем (between)  
+INSERT, UPDATE, DELETE вынести в отдельную лекцию
+-->
+
+9. [Создание базы данных. Импорт данных.](./articles/sql_import.md)
+
 ### Контрольные вопросы
 
 * назовите основные элементы диаграммы прецедентов