Евгений Колесников 3 éve
szülő
commit
df138a2328
6 módosított fájl, 496 hozzáadás és 702 törlés
  1. 1 1
      articles/5_1_1_1_erd2.md
  2. 231 143
      articles/sql_for_beginner.md
  3. 83 61
      articles/weather.md
  4. 75 135
      articles/weather2.md
  5. BIN
      img/sql004.png
  6. 106 362
      readme.md

+ 1 - 1
articles/5_1_1_1_erd2.md

@@ -22,7 +22,7 @@
 
 В настоящее время для проектирования БД активно используются CASE-средства, в основном ориентированные на использование **ERD (Entity – Relationship Diagrams, диаграммы «сущность–связь»)**. С их помощью определяются важные для предметной области объекты (сущности), отношения друг с другом (связи) и их свойства (атрибуты). Следует отметить, что средства проектирования ERD в основном ориентированы на реляционные базы данных (РБД), и если существует необходимость проектирования другой системы, скажем объектно-ориентированной, то лучше избрать другие методы проектирования.
 
-ERD были впервые предложены П. Ченом в 1976 г. Основные элементы ERD перечислены ниже.
+**ERD** были впервые предложены П. Ченом в 1976 г. Основные элементы **ERD** перечислены ниже.
 
 **Сущность (таблица, в РБД – отношение)** – набор (класс) однотипных реальных либо воображаемых объектов, имеющих существенное значение для рассматриваемой предметной области, информация о которых подлежит хранению. Примеры сущностей: работник, деталь, ведомость, результаты сдачи экзамена и т.д.
 

+ 231 - 143
articles/sql_for_beginner.md

@@ -6,57 +6,49 @@
 <a href="../articles/sql_import.md">Создание базы данных. Импорт данных.
 </a></td><tr></table>
 
-# Основы SQL
+# Основы SQL (синтаксис MySQL)
 
 <!-- добавтить count и функции работы со временем (between) -->
 
 **Structured Query Language (SQL)** — язык структурированных запросов, с помощью него пишутся специальные запросы (SQL инструкции) к базе данных с целью получения этих данных из базы и для манипулирования этими данными.
 
-С точки зрения реализации язык SQL представляет собой набор операторов, которые делятся на определенные группы и у каждой группы есть свое назначение. В сокращенном виде эти группы называются **DDL**, **DML**, **DCL** и **TCL**.
+С точки зрения реализации язык SQL представляет собой набор операторов, которые делятся на определенные группы и у каждой группы есть свое назначение. В сокращенном виде эти группы называются **DDL**, **DML**, **DCL** и **TCL**:
 
-## DDL – Data Definition Language
+* **Data Definition Language (DDL)** – это группа операторов **определения** данных. Другими словами, с помощью операторов, входящих в эту группы, мы определяем структуру базы данных и работаем с объектами этой базы, т.е. создаем, изменяем и удаляем их.
 
-**Data Definition Language (DDL)** – это группа операторов **определения** данных. Другими словами, с помощью операторов, входящих в эту группы, мы определяем структуру базы данных и работаем с объектами этой базы, т.е. создаем, изменяем и удаляем их.
+    В эту группу входят следующие операторы:
 
-В эту группу входят следующие операторы:
+    * **CREATE** – используется для создания объектов базы данных;
+    * **ALTER** – используется для изменения объектов базы данных;
+    * **DROP** – используется для удаления объектов базы данных.
 
-* **CREATE** – используется для создания объектов базы данных;
-* **ALTER** – используется для изменения объектов базы данных;
-* **DROP** – используется для удаления объектов базы данных.
+* **Data Manipulation Language (DML)** – это группа операторов для манипуляции данными. С помощью этих операторов мы можем добавлять, изменять, удалять и выгружать данные из базы, т.е. манипулировать ими.
 
-## DML – Data Manipulation Language
+    В эту группу входят самые распространённые операторы языка SQL:
 
-**Data Manipulation Language (DML)** – это группа операторов для манипуляции данными. С помощью этих операторов мы можем добавлять, изменять, удалять и выгружать данные из базы, т.е. манипулировать ими.
+    * **SELECT** – осуществляет выборку данных;
+    * **INSERT** – добавляет новые данные;
+    * **UPDATE** – изменяет существующие данные;
+    * **DELETE** – удаляет данные.
 
-В эту группу входят самые распространённые операторы языка SQL:
+* **Data Control Language (DCL)** – группа операторов определения доступа к данным. Иными словами, это операторы для управления разрешениями, с помощью них мы можем разрешать или запрещать выполнение определенных операций над объектами базы данных.
 
-* **SELECT** – осуществляет выборку данных;
-* **INSERT** – добавляет новые данные;
-* **UPDATE** – изменяет существующие данные;
-* **DELETE** – удаляет данные.
-
-## DCL – Data Control Language
-
-**Data Control Language (DCL)** – группа операторов определения доступа к данным. Иными словами, это операторы для управления разрешениями, с помощью них мы можем разрешать или запрещать выполнение определенных операций над объектами базы данных.
-
-## TCL – Transaction Control Language
-
-**Transaction Control Language (TCL)** – группа операторов для управления транзакциями. Транзакция – это команда или блок команд (инструкций), которые успешно завершаются как единое целое, при этом в базе данных все внесенные изменения фиксируются на постоянной основе или отменяются, т.е. все изменения, внесенные любой командой, входящей в транзакцию, будут отменены.
+* **Transaction Control Language (TCL)** – группа операторов для управления транзакциями. Транзакция – это команда или блок команд (инструкций), которые успешно завершаются как единое целое, при этом в базе данных все внесенные изменения фиксируются на постоянной основе или отменяются, т.е. все изменения, внесенные любой командой, входящей в транзакцию, будут отменены.
 
 ## Базовый синтаксис SQL команды SELECT
 
 Одна из основных функций SQL — получение данных из СУБД. Для построения всевозможных запросов к базе данных используется оператор **SELECT**. Он позволяет выполнять сложные проверки и обработку данных.
 
-Общая структура запроса
+Общая структура запроса:
 
 ```sql
 SELECT [DISTINCT | ALL] поля_таблиц 
-[FROM список_таблиц] 
-[WHERE условия_на_ограничения_строк]
-[GROUP BY условия_группировки]
-[HAVING условия_на_ограничения_строк_после_группировки]
-[ORDER BY порядок_сортировки [ASC | DESC]]
-[LIMIT ограничение_количества_записей]
+    [FROM список_таблиц] 
+    [WHERE условия_на_ограничения_строк]
+    [GROUP BY условия_группировки]
+    [HAVING условия_на_ограничения_строк_после_группировки]
+    [ORDER BY порядок_сортировки [ASC | DESC]]
+    [LIMIT ограничение_количества_записей]
 ```
 
 В описанной структуре запроса необязательные параметры указаны в квадратных скобках.
@@ -78,27 +70,27 @@ SELECT [DISTINCT | ALL] поля_таблиц
 
 Псевдонимы используются для представления столбцов или таблиц с именем отличным от оригинального. Это может быть полезно для улучшения читабельности имён и создания более короткого наименования столбца или таблицы.
 
-Например, если в вашей таблице есть столбец **good_type_id**, вы можете переименовать его просто в **id**, для того, чтобы сделать его более коротким и удобным в использовании в будущем.
+Например, если в вашей таблице есть столбец **goodTypeId**, вы можете переименовать его просто в **id**, для того, чтобы сделать его более коротким и удобным в использовании в будущем.
 
 Для создания псевдонимов используется оператор AS:
 
 ```sql
 SELECT 
-    good_type_id AS id 
+    goodTypeId AS id 
 FROM 
     GoodTypes;
 ```
 
 ### Примеры использования
 
-Вы можете выводить любые строки и числа вместо столбцов:
+Вы можете выводить любые строки и числа (литералы) вместо столбцов:
 
 ```sql
 SELECT 
     "Hello world", 1;
 ```
 
-Для того, чтобы вывести **все данные** из таблицы Company, вы можете использовать символ «*», который буквально означает «все столбцы»:
+Для того, чтобы вывести **все данные** из таблицы **Company**, вы можете использовать символ «*», который буквально означает «все столбцы»:
 
 ```sql
 SELECT 
@@ -107,11 +99,11 @@ FROM
     Company;
 ```
 
-Вы можете вывести любой столбец, определённый в таблице, например, town_to из таблицы Trip:
+Вы можете вывести любой столбец, определённый в таблице, например, townTo из таблицы Trip:
 
 ```sql
 SELECT 
-    town_to 
+    townTo 
 FROM 
     Trip;
 ```
@@ -120,57 +112,62 @@ FROM
 
 ```sql
 SELECT 
-    member_name, status 
+    memberName, `status`
 FROM 
     FamilyMembers;
 ```
 
-Иногда возникают ситуации, в которых нужно получить только уникальные записи. Для этого вы можете использовать DISTINCT. Например, выведем список городов без повторений, в которые летали самолеты:
+>Поле **status** подсвечивается как зарезервированное слово SQL - экранируем его обратными кавычками.
+
+### Distinct - выбор уникальных значений
+
+Иногда возникают ситуации, в которых нужно получить только уникальные записи. Для этого вы можете использовать **DISTINCT**. Например, выведем список городов без повторений, в которые летали самолеты:
 
 ```sql
 SELECT 
-    DISTINCT town_to 
+    DISTINCT townTo 
 FROM 
     Trip;
 ```
 
 Эта конструкция используется для формирования словарей, примеры рассмотрим в главе про команду **INSERT**
 
-## Условный оператор WHERE
+### Условный оператор WHERE
 
 Ситуация, когда требуется сделать выборку по определенному условию, встречается очень часто. Для этого в операторе **SELECT** существует параметр **WHERE**, после которого следует условие для ограничения строк. Если запись удовлетворяет этому условию, то попадает в результат, иначе отбрасывается.
 
 Общая структура запроса с оператором WHERE
 
 ```sql
-SELECT поля_таблиц FROM список_таблиц 
-WHERE условия_на_ограничения_строк
-[логический_оператор другое_условия_на_ограничения_строк];
+SELECT поля_таблиц 
+    FROM список_таблиц 
+    WHERE условия_на_ограничения_строк
+        [логический_оператор другое_условия_на_ограничения_строк];
 ```
 
 В описанной структуре запроса необязательные параметры указаны в квадратных скобках.
 
 В условном операторе применяются операторы сравнения, специальные и логические операторы.
 
-### Операторы сравнения
+#### Операторы сравнения
 
-Операторы сравнения служат для сравнения 2 выражений, их результатом может являться ИСТИНА (1), ЛОЖЬ (0) и NULL.
+Операторы сравнения служат для сравнения 2 выражений, их результатом может являться **ИСТИНА (1)**, **ЛОЖЬ (0)** и **NULL**.
 
 >Результат сравнения с NULL является NULL. Исключением является оператор эквивалентности.
 
 Оператор | Описание
 :--:|---
-\= | Оператор равенство
-\<\=\> | Оператор эквивалентность<br/>Аналогичный оператору равенства, с одним лишь исключением: в отличие от него, оператор эквивалентности вернет ИСТИНУ при сравнении NULL <=> NULL
-\<\><br/>или<br/>!= | Оператор неравенство
-\< | Оператор меньше
-\<\= | Оператор меньше или равно
-\> | Оператор больше
-\>\= | Оператор больше или равно
+`=` | Оператор равенство
+`<=>` | Оператор эквивалентность<br/>Аналогичный оператору равенства, с одним лишь исключением: в отличие от него, оператор эквивалентности вернет ИСТИНУ при сравнении NULL `<=>` NULL
+`<>`<br/>или<br/>`!=` | Оператор неравенство
+`<` | Оператор меньше
+`<=` | Оператор меньше или равно
+`>` | Оператор больше
+`>=` | Оператор больше или равно
 
-### Специальные операторы
+#### Специальные операторы
 
-1. `IS [NOT] NULL` — позволяет узнать равно ли проверяемое значение NULL.
+1. `IS [NOT] NULL` — позволяет узнать равно (не равно) ли проверяемое значение NULL.
 
     Для примера выведем всех членов семьи, у которых статус в семье не равен NULL:
 
@@ -180,10 +177,10 @@ WHERE условия_на_ограничения_строк
     FROM 
         FamilyMembers
     WHERE 
-        status IS NOT NULL;
+        `status` IS NOT NULL;
     ```
 
-2. `[NOT] BETWEEN min AND max` — позволяет узнать расположено ли проверяемое значение столбца в интервале между min и max.
+2. `[NOT] BETWEEN min AND max` — позволяет узнать расположено ли проверяемое значение столбца в интервале между **min** и **max**.
 
     Выведем все данные о покупках с ценой от 100 до 500 рублей из таблицы Payments:
 
@@ -193,57 +190,57 @@ WHERE условия_на_ограничения_строк
     FROM 
         Payments
     WHERE 
-        unit_price BETWEEN 100 AND 500;
+        unitPrice BETWEEN 100 AND 500;
     ```
 
-3. `[NOT] IN` — позволяет узнать входит ли проверяемое значение столбца в список определённых значений.
+3. `[NOT] IN` — позволяет узнать входит (не входит) ли проверяемое значение столбца в список определённых значений.
 
     Выведем имена членов семьи, чей статус равен «father» или «mother»:
 
     ```sql
     SELECT 
-        member_name 
+        memberName 
     FROM 
         FamilyMembers
     WHERE 
-        status IN ('father', 'mother');
+        `status` IN ('father', 'mother');
     ```
 
-4. `[NOT] LIKE шаблон [ESCAPE символ]` — позволяет узнать соответствует ли строка определённому шаблону.
+4. `[NOT] LIKE шаблон [ESCAPE символ]` — позволяет узнать соответствует ли строка определённому шаблону. **ESCAPE символ** - это так называемый трафаретный символ, вместо которого может быть что один (`_`) или несколько (`%`) любых символов.
 
     Например, выведем всех людей с фамилией «Quincey»:
 
     ```sql
     SELECT 
-        member_name 
+        memberName 
     FROM 
         FamilyMembers
     WHERE 
-        member_name LIKE '% Quincey';
+        memberName LIKE '% Quincey';
     ```
 
-### Трафаретные символы
+#### Трафаретные символы
 
 В шаблоне разрешается использовать два трафаретных символа:
 
-* символ подчеркивания (_), который можно применять вместо любого единичного символа в проверяемом значении
-* символ процента (%) заменяет последовательность любых символов (число символов в последовательности может быть от 0 и более) в проверяемом значении.
+* символ подчеркивания (`_`), который можно применять вместо любого единичного символа в проверяемом значении
+* символ процента (`%`) заменяет последовательность любых символов (число символов в последовательности может быть от 0 и более) в проверяемом значении.
 
 Шаблон | Описание
 :--:|--
-never% | Сопоставляется любым строкам, начинающимся на «never».
-%ing | Сопоставляется любым строкам, заканчивающимся на «ing».
-_ing | Сопоставляется строкам, имеющим длину 4 символа, при этом 3 последних обязательно должны быть «ing». Например, слова «sing» и «wing».
+never`%` | Сопоставляется любым строкам, начинающимся на «never».
+`%`ing | Сопоставляется любым строкам, заканчивающимся на «ing».
+`_`ing | Сопоставляется строкам, имеющим длину 4 символа, при этом 3 последних обязательно должны быть «ing». Например, слова «sing» и «wing».
 
-### ESCAPE-символ
+#### ESCAPE-символ
 
 ESCAPE-символ используется для экранирования трафаретных символов. В случае если вам нужно найти строки, содержащие проценты (а процент — это зарезервированный символ), вы можете использовать ESCAPE-символ.
 
-Например, вы хотите получить идентификаторы задач, прогресс которых равен 3%:
+Например, вы хотите получить идентификаторы задач, прогресс которых равен `3%`:
 
 ```sql
 SELECT 
-    job_id 
+    jobId 
 FROM 
     Jobs
 WHERE 
@@ -253,7 +250,7 @@ ESCAPE '!';
 
 Если бы мы не экранировали трафаретный символ, то в выборку попало бы всё, что начинается на 3.
 
-### Логические операторы
+#### Логические операторы
 
 Логические операторы необходимы для связывания нескольких условий ограничения строк.
 
@@ -270,10 +267,10 @@ SELECT
 FROM 
     Trip
 WHERE 
-    plane = 'Boeing' AND NOT town_from = 'London';
+    plane = 'Boeing' AND NOT townFrom = 'London';
 ```
 
-## Выборка сводных данных (из двух и более таблиц)
+### Выборка сводных данных (из двух и более таблиц)
 
 При формировании сводной выборки данные беруться из нескольких таблиц. В операторе **FROM** исходные таблицы перечисляются через запятую. Также им могут быть присвоены алиасы. Синтаксис запроса выглядит следующийм образом:
 
@@ -288,12 +285,12 @@ FROM
 
 При выборке сводных таблиц нужно учитывать, что исходные таблицы перемножаются. Т.е. если на входе у нас были таблицы:
 
-id | Name
+id | name
 :-:|--
 1 | Иванов
 2 | Петров
 
-id | Name | Phone
+id | name | phone
 :-:|------|-----
 1 | Иванов | 322223
 2 | Петров | 111111
@@ -308,31 +305,31 @@ FROM
 
 Получим примерно следующее:
 
-id | Name | id2 | Name2 | Phone
-:-:|------|:---:|-------|------
-1  | Иванов| 1 | Иванов | 322223
-1  | Иванов| 2 | Петров | 111111
-2  | Петров| 1 | Иванов | 322223
-2  | Петров| 2 | Петров | 111111
+id | name  | id2 | name2  | phone
+:-:|-------|:---:|--------|------
+1  | Иванов| 1   | Иванов | 322223
+1  | Иванов| 2   | Петров | 111111
+2  | Петров| 1   | Иванов | 322223
+2  | Петров| 2   | Петров | 111111
 
 Чтобы выбрать уникальные значения, нам нужно использовать оператор **WHERE** для связи этих таблиц
 
 ```sql
-SELECT a.*, b.Phone
+SELECT a.*, b.phone
 FROM 
     Table1 a, Table2 b
 WHERE
-    a.Name=b.Name    
+    a.name=b.name    
 ```
 
-id | Name | Phone
-:-:|------|------
+id | name  | phone
+:-:|-------|------
 1  | Иванов| 322223
 2  | Петров| 111111
 
-Сводные выборки нужны при импорте данных в базу. Сначала вы выделяете из таблиц импорта словари. А потом из таблиц импорта и словарей формируете запрос `INSERT ... SELECT` для записи данных в основную таблицу.
+>Сводные выборки нам понадобятся при импорте данных в базу. Сначала вы выделяете из таблиц импорта словари. А потом из таблиц импорта и словарей формируете запрос `INSERT ... SELECT` для записи данных в основную таблицу.
 
-## Вложенные SQL запросы
+### Вложенные SQL запросы
 
 Вложенный запрос — это запрос на выборку, который используется внутри инструкции SELECT, INSERT, UPDATE или DELETE или внутри другого вложенного запроса. Подзапрос может быть использован везде, где разрешены выражения.
 
@@ -340,10 +337,10 @@ id | Name | Phone
 
 ```sql
 SELECT поля_таблиц 
-FROM список_таблиц 
-WHERE конкретное_поле IN (
-    SELECT поле_таблицы FROM таблица
-)
+    FROM список_таблиц 
+    WHERE конкретное_поле IN (
+        SELECT поле_таблицы FROM таблица
+    )
 ```
 
 Здесь, `SELECT поля_таблиц FROM список_таблиц WHERE конкретное_поле IN (...)` — внешний запрос, а `SELECT поле_таблицы FROM таблица` — вложенный (внутренний) запрос.
@@ -354,7 +351,7 @@ WHERE конкретное_поле IN (
 
 Подзапрос может возвращать скаляр (одно значение), одну строку, один столбец или таблицу (одну или несколько строк из одного или нескольких столбцов). Они называются скалярными, столбцовыми, строковыми и табличными подзапросами.
 
-### Подзапрос как скалярный операнд
+#### Подзапрос как скалярный операнд
 
 Скалярный подзапрос — запрос, возвращающий единственное скалярное значение (строку, число и т.д.).
 
@@ -378,35 +375,35 @@ SELECT
 FROM 
     FamilyMembers 
 WHERE 
-    birthday = (
+    birthDay = (
         SELECT 
-            MAX(birthday) 
+            MAX(birthDay) 
         FROM 
             FamilyMembers
     );
 ```
 
-С помощью данного запроса возможно получить самого младшего члена семьи. Здесь используется подзапрос для получения максимальной даты рождения, которая затем используется для фильтрации строк.
+С помощью данного запроса возможно получить самого старшего члена семьи. Здесь используется подзапрос для получения максимальной даты рождения, которая затем используется для фильтрации строк.
 
-### Подзапросы с ANY, IN, ALL
+#### Подзапросы с ANY, IN, ALL
 
-ANY — ключевое слово, которое должно следовать за операцией сравнения (>, <, <>, = и т.д.), возвращающее TRUE, если хотя бы одно из значений столбца подзапроса удовлетворяет обозначенному условию.
+**ANY** — ключевое слово, которое должно следовать за операцией сравнения (>, <, <>, = и т.д.), возвращающее TRUE, если хотя бы одно из значений столбца подзапроса удовлетворяет обозначенному условию.
 
 ```sql
 SELECT поля_таблицы_1 
-FROM таблица_1 
-WHERE поле_таблицы_1 <= ANY (SELECT поле_таблицы_2 FROM таблица_2);
+    FROM таблица_1 
+    WHERE поле_таблицы_1 <= ANY (SELECT поле_таблицы_2 FROM таблица_2);
 ```
 
-ALL — ключевое слово, которое должно следовать за операцией сравнения, возвращающее TRUE, если все значения столбца подзапроса удовлетворяет обозначенному условию.
+**ALL** — ключевое слово, которое должно следовать за операцией сравнения, возвращающее TRUE, если все значения столбца подзапроса удовлетворяет обозначенному условию.
 
 ```sql
 SELECT поля_таблицы_1 
-FROM таблица_1 
-WHERE поле_таблицы_1 > ALL (SELECT поле_таблицы_2 FROM таблица_2);
+    FROM таблица_1 
+    WHERE поле_таблицы_1 > ALL (SELECT поле_таблицы_2 FROM таблица_2);
 ```
 
-IN — ключевое слово, являющееся псевдонимом ключевому слову ANY с оператором сравнения = (эквивалентность), либо <> ALL для NOT IN. Например, следующие запросы равнозначны:
+**IN** — ключевое слово, являющееся псевдонимом ключевому слову **ANY** с оператором сравнения = (эквивалентность), либо <> ALL для NOT IN. Например, следующие запросы равнозначны:
 
 ```sql
 ...
@@ -418,14 +415,14 @@ WHERE поле_таблицы_1 = ANY (SELECT поле_таблицы_2 FROM т
 WHERE поле_таблицы_1 IN (SELECT поле_таблицы_2 FROM таблица_2);
 ```
 
-### Строковые подзапросы
+#### Строковые подзапросы
 
 Строковый подзапрос — это подзапрос, возвращающий единственную строку с более чем одной колонкой. Например, следующий запрос получает в подзапросе единственную строку, после чего по порядку попарно сравнивает полученные значения со значениями во внешнем запросе.
 
 ```sql
 SELECT поля_таблицы_1 
-FROM таблица_1
-WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) = 
+    FROM таблица_1
+    WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) = 
     (
         SELECT первое_поле_таблицы_2, второе_поле_таблицы_2 
         FROM таблица_2 
@@ -436,70 +433,80 @@ WHERE (первое_поле_таблицы_1, второе_поле_табли
 Данную конструкцию удобно использовать для замены логических операторов. Так, следующие два запроса полностью эквивалентны:
 
 ```sql
-SELECT поля_таблицы_1 FROM таблица_1 WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) = (1, 1);
-SELECT поля_таблицы_1 FROM таблица_1 WHERE первое_поле_таблицы_1 = 1 AND второе_поле_таблицы_1 = 1;
+SELECT поля_таблицы_1 
+    FROM таблица_1 
+    WHERE (первое_поле_таблицы_1, второе_поле_таблицы_1) = (1, 1);
+
+SELECT поля_таблицы_1 
+    FROM таблица_1 
+    WHERE первое_поле_таблицы_1 = 1 AND второе_поле_таблицы_1 = 1;
 ```
 
-### Связанные подзапросы
+#### Связанные подзапросы
 
 Связанным подзапросом является подзапрос, который содержит ссылку на таблицу, которая была объявлена во внешнем запросе. Здесь вложенный запрос ссылается на внешюю таблицу "таблица_1":
 
 ```sql
 SELECT поля_таблицы_1 FROM таблица_1
-WHERE поле_таблицы_1 IN 
+    WHERE поле_таблицы_1 IN 
     (
         SELECT поле_таблицы_2 FROM таблица_2
         WHERE таблица_2.поле_таблицы_2 = таблица_1.поле_таблицы_1
     );
 ```
 
-### Подзапросы как производные таблицы
+#### Подзапросы как производные таблицы
 
-Производная таблица — выражение, которое генерирует временную таблицу в предложении FROM, которая работает так же, как и обычные таблицы, которые вы указываете через запятую. Так выглядит общий синтаксис запроса с использованием производных таблиц:
+Производная таблица — выражение, которое генерирует временную таблицу в предложении **FROM**, которая работает так же, как и обычные таблицы, которые вы указываете через запятую. Так выглядит общий синтаксис запроса с использованием производных таблиц:
 
 ```sql
-SELECT поля_таблицы_1 FROM (подзапрос) [AS] псевдоним_производной_таблицы
+SELECT поля_таблицы_1 
+    FROM (подзапрос) [AS] псевдоним_производной_таблицы
 ```
 
 Обратите внимание на то, что для производной таблицы обязательно должен указываться её псевдоним, для того, чтобы имелась возможность обратиться к ней в других частях запроса.
 
-### Обработка вложенных запросов
+#### Обработка вложенных запросов
 
 Вложенные подзапросы обрабатываются «снизу вверх». То есть сначала обрабатывается вложенный запрос самого нижнего уровня. Далее значения, полученные по результату его выполнения, передаются и используются при реализации подзапроса более высокого уровня и т.д.
 
 ## Добавление данных, оператор INSERT
 
-Для добавления новых записей в таблицу предназначен оператор INSERT.
+Для добавления новых записей в таблицу предназначен оператор **INSERT**.
 
-Общая структура запроса с оператором INSERT
+Общая структура запроса с оператором **INSERT**
 
 ```sql
 INSERT INTO имя_таблицы [(поле_таблицы, ...)]
-VALUES (значение_поля_таблицы, ...)
-| SELECT поле_таблицы, ... FROM имя_таблицы ...
+    VALUES (значение_поля_таблицы, ...)
+    | SELECT поле_таблицы, ... FROM имя_таблицы ...
 ```
 
-В описанной структуре запроса необязательные параметры указаны в квадратных скобках. Вертикальной чертой обозначен альтернативный синтаксис.
+>В описанной структуре запроса необязательные параметры указаны в квадратных скобках. Вертикальной чертой обозначен альтернативный синтаксис.
+
+>Список полей таблицы не обязателен, но только если заполняются все имеющиеся поля. Можно не заполнять не обязательные поля, но в этом случае список нужно указывать и порядок полей должен соответсвовать значениям.
 
-Значения можно вставлять перечислением с помощью слова values, перечислив их в круглых скобках через запятую или c помощью оператора select. Таким образом, добавить новые записей можно следующими способами:
+Значения можно вставлять перечислением с помощью слова **VALUES**, перечислив их в круглых скобках через запятую или c помощью оператора **SELECT**. Таким образом, добавить новые записей можно следующими способами:
 
 ```sql
-INSERT INTO Goods (good_id, good_name, type)
-VALUES (5, 'Table', 2);
+INSERT INTO Goods (goodId, goodName, `type`)
+    VALUES (5, 'Table', 2);
 ```
 
 ```sql
-INSERT INTO Goods VALUES (5, 'Table', 2);
+-- заполняются все поля в таблице
+INSERT INTO Goods 
+    VALUES (5, 'Table', 2);
 ```
 
 ```SQL
 INSERT INTO Goods 
-SELECT 
-    good_id, good_name, type 
-FROM 
-    Goods 
-where 
-    good_name = 2;
+    SELECT 
+        goodId, goodName, `type`
+    FROM 
+        Goods 
+    where 
+        `type` = 2;
 ```
 
 ### Первичный ключ при добавлении новой записи
@@ -510,26 +517,107 @@ where
 
 ```sql
 INSERT INTO Goods 
-SELECT 
-    COUNT(*) + 1, 'Table', 2 
-FROM 
-    Goods;
+    SELECT 
+        COUNT(*) + 1, 'Table', 2 
+    FROM 
+        Goods;
 ```
 
-В SQL введен механизм его автоматической генерации. Для этого достаточно снабдить первичный ключ good_id атрибутом AUTO_INCREMENT. Тогда при создании новой записи в качестве значения good_id достаточно передать NULL или 0 — поле автоматически получит значение, равное максимальному значению столбца good_id, плюс единица.
+В SQL введен механизм его автоматической генерации. Для этого достаточно снабдить первичный ключ goodId атрибутом **AUTO_INCREMENT**. Тогда при создании новой записи в качестве значения goodId достаточно передать **NULL** или **0** — поле автоматически получит значение, равное максимальному значению столбца goodId, плюс единица.
 
 ```sql
 CREATE TABLE Goods (
-	good_id INT NOT NULL AUTO_INCREMENT
+	goodId INT NOT NULL AUTO_INCREMENT
 	...
 );
 ```
 
 ```sql
-INSERT INTO Goods VALUES (NULL, 'Table', 2);
+INSERT INTO Goods 
+    VALUES (NULL, 'Table', 2);
+```
+
+## Редактирование данных, команда UPDATE
+
+Команда **UPDATE** применяется для обновления уже имеющихся строк. Она имеет следующий формальный синтаксис:
+
+```sql
+UPDATE имя_таблицы
+    SET столбец1 = значение1, столбец2 = значение2, ... столбецN = значениеN
+    [WHERE условие_обновления]
+```
+
+Например, увеличим у всех товаров цену на 3000:
+
+```sql
+UPDATE Products
+SET Price = Price + 3000;
+```
+
+Однако при выполнении данного запроса в MySQL Workbench мы можем столкнуться с ошибкой "You are using safe update..."
+
+Ошибка говорит о том, что мы находимся в *безопасном режиме*. И чтобы его отключить, в **MySQL Workbench** надо перейти в меню **Edit -> Preferences** и в открывшемся окне перейти к пункту **SQL Editor**:
+
+![](../img/sql004.png)
+
+В открывшейся вкладке в самом низу надо снять флажок с поля "Safe Updates (reject UPDATEs and DELETEs with no restrictions)" и затем сохранить изменения, нажав на кнопку OK. После этого надо переподключиться к серверу.
+
+Используем выражение **WHERE** и изменим название производителя с "Samsung" на "Samsung Inc.":
+
+```sql
+UPDATE Products
+    SET Manufacturer = 'Samsung Inc.'
+    WHERE Manufacturer = 'Samsung';
+```
+
+Также можно обновлять сразу несколько столбцов:
+
+```sql
+UPDATE Products
+    SET Manufacturer = 'Samsung',
+        ProductCount = ProductCount + 3
+    WHERE Manufacturer = 'Samsung Inc.';
+```
+
+При обновлении вместо конкретных значений и выражений мы можем использовать ключевые слова **DEFAULT** и **NULL** для установки соответственно значения по умолчанию или NULL:
+
+```sql
+UPDATE Products
+    SET ProductCount= DEFAULT
+    WHERE Manufacturer = 'Huawei';
+```    
+
+## Удаление данных, команда DELETE
+
+Команда **DELETE** удаляет данные из БД. Она имеет следующий формальный синтаксис:
+
+```sql
+DELETE FROM имя_таблицы
+    [WHERE условие_удаления]
+```
+
+Например, удалим строки, у которых производитель - Huawei:
+
+```sql
+DELETE FROM Products
+    WHERE Manufacturer='Huawei';
+```
+
+Или удалим все товары, производителем которых является Apple и которые имеют цену меньше 60000:
+
+```sql
+DELETE FROM Products
+    WHERE Manufacturer='Apple' AND Price < 60000;
+```
+
+Если необходимо вовсе удалить все строки вне зависимости от условия, то условие можно не указывать:
+
+```sql
+DELETE FROM Products;
 ```
 
-### Пример
+<!--
+## Импорт данных (старые скрины из MSSQL)
 
 Теперь, зная синткасис команд INSERT и SELECT, можем разобраться как создать из исходного набора данных словари и загрузить данные в БД с учетом внешних ключей
 
@@ -548,7 +636,7 @@ INSERT INTO Goods VALUES (NULL, 'Table', 2);
 
 Для добавления "типов агентов" в таблицу **AgentType** мы будем использовать альтернативный синтаксис `INSERT ... SELECT` 
 
-1. Пишем инструкцию SELECT, которая выбирает уникальные записи из *таблицы импорта*:
+1. Пишем инструкцию **SELECT**, которая выбирает уникальные записи из *таблицы импорта*:
 
     ```sql
     SELECT 
@@ -573,9 +661,9 @@ INSERT INTO Goods VALUES (NULL, 'Table', 2);
     ```
 
     1. Поле **ID** можно пропустить, оно автоинкрементное и создастся само
-    2. Количество и порядок вставляемых полей (Title) должно быть равным количеству выбираемых полей (Тип_агента)  
+    2. Количество и порядок вставляемых полей `(Title)` должно быть равным количеству выбираемых полей `(Тип_агента)`
        
-    Если в таблице есть обязательные поля, а нем неоткуда взять для них данные, то мы можем в **SELECT** вставить фиксированные значения (в примере пустая строка): 
+    Если в таблице есть обязательные поля, а нам неоткуда взять для них данные, то мы можем в **SELECT** вставить фиксированные значения (в примере пустая строка): 
 
         ```sql
         INSERT INTO AgentType (Title, Image)
@@ -650,7 +738,7 @@ INSERT INTO Goods VALUES (NULL, 'Table', 2);
     WHERE 
         asi.Тип_агента=att.Title
     ```
-
+-->
 
 <table style="width: 100%;"><tr><td style="width: 40%;">
 <a href="../articles/5_1_1_1_erd_workbench.md">Создание ER-диаграммы в среде MySQL Workbench

+ 83 - 61
articles/weather.md

@@ -267,47 +267,75 @@ implementation 'com.squareup.okhttp3:okhttp:4.10.0'
 
 >Неизвестные методы **Android Studio** показывает красным цветом. Чтобы добавить пакет, в котором описан такой метод, нужно поместить курсор на этот метод и, либо через контекстное меню, либо нажатием **Alt+Enter** добавить пакет в импортируемые (если вариантов импорта несколько, то смотрите по контексту - в нашем случае в названии пакета должно быть что-то про **okhttp**)
 
+В примерах из [OkHttp](https://square.github.io/okhttp/) нет обработки исключительных ситуаций, я написал метод, который принимает на вход строку **url** или готовый **Request** и возвращает callback с ответом или исключением (если связи физически нет):
+
 ```kt
 // в классе объявите свойство client
 private val client = OkHttpClient()
-...
 
-fun onGetCoordinates(lat: Double, lon: Double){
-    ...
-
-    // сформируйте запрос
-    val request = Request.Builder()
-        .url("https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${appid}&lang=ru&units=metric")
-        .build()
-
-    // и выполните его
+fun httpGet(
+    url: Any, // тип Any - тут может быть строка для GET запроса, или готовый Request
+    callback: (response: Response?, error: Exception?)->Unit
+) {
+    var request: Request = when (url) {
+        is String -> Request.Builder()
+            .url(url)
+            .build()
+        is Request -> url as Request
+        else -> {
+            callback.invoke(null, Exception("Не верный тип параметра \"url\""))
+            return
+        }
+    }
     client.newCall(request).enqueue(object : Callback {
-        // метод будет вызван при ошибке
         override fun onFailure(call: Call, e: IOException) {
-            e.printStackTrace()
+            callback.invoke(null, Exception(e.message!!))
         }
 
-        // при успешном запросе
         override fun onResponse(call: Call, response: Response) {
             response.use {
-                if (!response.isSuccessful) 
-                    throw IOException("Unexpected code $response")
+                callback.invoke(response, null)
+            }
+        }
+    })
+}
+```
+
+Как выглядит вызов этого метода:
 
-                // for ((name, value) in response.headers) {
-                //     Log.d("weather","$name: $value")
-                // }
-                // Log.d("weather", response.body!!.string())
+```kt
+fun onGetCoordinates(lat: Double, lon: Double){
+    ...
 
-                val json = JSONObject(response.body!!.string())
-                val wheather = json.getJSONArray("weather")
-                val icoName = wheather.getJSONObject(0).getString("icon")
+    httpGet("https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${appid}&lang=ru&units=metric")
+    {response, error ->
+        try {
+            // если в запросе получено исключение, то "выбрасываем" его
+            if (error != null) throw error
 
-                runOnUiThread {
-                    textView.text = json.getString("name")
-                }
+            // если ответ получен, но код не 200, то тоже "выбрасываем" исключение
+            if (!response!!.isSuccessful) throw Exception(response.message)
+
+            // начинаем обработку ответа    
+
+            val json = JSONObject(response.body!!.string())
+
+            // обращение к UI должно быть в контексте UiThread
+            runOnUiThread {
+                textView.text = json.getString("name")
+            }
+        } catch (e: Exception) {
+            // любую ошибку показываем на экране
+            runOnUiThread {
+                AlertDialog.Builder(this)
+                    .setTitle("Ошибка")
+                    .setMessage(e.message)
+                    .setPositiveButton("OK", null)
+                    .create()
+                    .show()
             }
         }
-    })
+    }
 }
 ```
 
@@ -395,50 +423,44 @@ val temp = json.getJSONObject("main").getDouble("temp")
 val icoUrl = "https://openweathermap.org/img/w/${icoName}.png"
 ```
 
-Для загрузки картинок напишем отдельный метод:
+Для загрузки картинок воспользуемся тем же методом **httpGet**:
 
-```
-fun loadImage(icoUrl: String, callback: (result: Bitmap?)->Unit) {
-    val request = Request.Builder()
-        .url(icoUrl)
-        .build()
+>Вызов этого метода нужно вставить в предыдущий callback
 
-    client.newCall(request).enqueue(object : Callback {
-        override fun onFailure(call: Call, e: IOException) {
-            e.printStackTrace()
-        }
+```kt
+...
+runOnUiThread {
+    textView.text = json.getString("name")
+}
 
-        override fun onResponse(call: Call, response: Response) {
-            response.use {
-                if (!response.isSuccessful) 
-                    throw IOException("Unexpected code $response")
+httpGet("https://openweathermap.org/img/w/${icoName}.png")
+{response, error ->
+    try {
+        // если в запросе получено исключение, то "выбрасываем" его
+        if (error != null) throw error
+
+        // если ответ получен, но код не 200, то тоже "выбрасываем" исключение
+        if (!response!!.isSuccessful) throw Exception(response.message)
 
-                // тело запроса считваем как поток байт и передаем его в построитель изображений (BitmapFactory)
-                val bitmap = BitmapFactory
+        runOnUiThread {
+            ico.setImageBitmap(
+                BitmapFactory
                     .decodeStream(
                         response.body!!.byteStream()
                     )
-                    
-                callback.invoke(bitmap)
-            }
+            )
         }
-    })
-}
-```
-
-Первый параметр URL изображения, второй - лямбда выражение для функции обратного вызова, которое возвращает Bitmap
-
-Вызов этого метода можно вставить в предыдущий callback
-
-```kt
-...
-runOnUiThread {
-    textView.text = json.getString("name")
-}
 
-loadImage("https://openweathermap.org/img/w/${icoName}.png") {
-    runOnUiThread {
-        ico.setImageBitmap(it)
+    } catch (e: Exception) {
+        // любую ошибку показываем на экране
+        runOnUiThread {
+            AlertDialog.Builder(this)
+                .setTitle("Ошибка")
+                .setMessage(e.message)
+                .setPositiveButton("OK", null)
+                .create()
+                .show()
+        }
     }
 }
 ```

+ 75 - 135
articles/weather2.md

@@ -157,7 +157,7 @@
         val name = data.getStringExtra("cityName")
 
         // тут запускаем http-запрос по имени города
-        getWeather(
+        httpGet(
             "https://api.openweathermap.org/data/2.5/weather?q=${name}&appid=${appid}&lang=ru&units=metric", 
             callback)
     }
@@ -173,83 +173,82 @@
 
 ## Выделение лямбда-выражения в отдельную переменную
 
-Для обработки результатов мы пользовались такой конструкцией - результаты запроса обрабатывли в месте получения. 
+Для обработки результатов мы результаты запроса обрабатывли в месте получения. 
+
+Но теперь тот же код будет использоваться для получения погоды по городу. Поэтому имеет смысл обработку результата оформить отдельной лямбда-функцией:
 
 ```kt
-client.newCall(request).enqueue(object : Callback {
-    override fun onFailure(call: Call, e: IOException) {
-        e.printStackTrace()
-    }
+// weatherCallback - свойство класса, объявляется в теле класса
+private val weatherCallback: (response: Response?, error: Exception?)->Unit = {
+    response, error ->
+        try {
+            // если в запросе получено исключение, то "выбрасываем" его
+            if (error != null) throw error
 
-    override fun onResponse(call: Call, response: Response) {
-        response.use {
-            if (!response.isSuccessful) throw IOException("Unexpected code $response")
+            // если ответ получен, но код не 200, то тоже "выбрасываем" исключение
+            if (!response!!.isSuccessful) throw Exception(response.message)
+
+            // начинаем обработку ответа    
 
             val json = JSONObject(response.body!!.string())
             val wheather = json.getJSONArray("weather")
             val icoName = wheather.getJSONObject(0).getString("icon")
 
-            loadImage(icoName) {
-                runOnUiThread {
-                    ico.setImageBitmap(it)
-                }
-            }
-
+            // обращение к UI должно быть в контексте UiThread
             runOnUiThread {
                 textView.text = json.getString("name")
             }
-        }
-    }
-})
-```
-
-Но теперь тот же код будет использоваться для получения погоды по городу. Поэтому имеет смысл вынести код запроса в отдельный метод, обработку результата оформить отдельной лямбда-функцией:
 
-```kt
-// отдельный метод для запроса погоды
-fun getWeather(url: String, callback: (result: String?)->Unit) {
-    val request = Request.Builder()
-        .url(url)
-        .build()
-    client.newCall(request).enqueue(object : Callback {
-        override fun onFailure(call: Call, e: IOException) {
-            e.printStackTrace()
-        }
+            httpGet("https://openweathermap.org/img/w/${icoName}.png")
+            {response, error ->
+                try {
+                    // если в запросе получено исключение, то "выбрасываем" его
+                    if (error != null) throw error
+
+                    // если ответ получен, но код не 200, то тоже "выбрасываем" исключение
+                    if (!response!!.isSuccessful) throw Exception(response.message)
+
+                    runOnUiThread {
+                        ico.setImageBitmap(
+                            BitmapFactory
+                                .decodeStream(
+                                    response.body!!.byteStream()
+                                )
+                        )
+                    }
 
-        override fun onResponse(call: Call, response: Response) {
-            response.use {
-                if (!response.isSuccessful) throw IOException("Unexpected code $response")
-                callback.invoke(response.body!!.string())
+                } catch (e: Exception) {
+                    // любую ошибку показываем на экране
+                    runOnUiThread {
+                        AlertDialog.Builder(this)
+                            .setTitle("Ошибка")
+                            .setMessage(e.message)
+                            .setPositiveButton("OK", null)
+                            .create()
+                            .show()
+                    }
+                }
+            }
+        } catch (e: Exception) {
+            // любую ошибку показываем на экране
+            runOnUiThread {
+                AlertDialog.Builder(this)
+                    .setTitle("Ошибка")
+                    .setMessage(e.message)
+                    .setPositiveButton("OK", null)
+                    .create()
+                    .show()
             }
         }
-    })
-}
-```
-
-```kt
-// callback - свойство класса, объявляется в теле класса
-private val callback: (result: String?) -> Unit = {
-    val json = JSONObject(it)
-    val wheather = json.getJSONArray("weather")
-    val icoName = wheather.getJSONObject(0).getString("icon")
-
-    loadImage(icoName) {bmp ->
-        runOnUiThread {
-            ico.setImageBitmap(bmp)
-        }
-    }
-
-    runOnUiThread {
-        textView.text = json.getString("name")
     }
 }
 
 ...
 
 // при запросе погоды используем переменную, объявленную выше
-getWeather(
+httpGet(
     "https://api.openweathermap.org/data/2.5/weather?lat=56.638372&lon=47.892991&appid=${appid}&lang=ru&units=metric", 
-    callback)
+    weatherCallback)
 ```
 
 ## Получение и разбор массива данных. Вывод списка на экран.
@@ -302,12 +301,18 @@ GET https://api.openweathermap.org/data/2.5/forecast?lat={{lat}}&lon={{lon}}&app
 
     ```kt
     val url = "https://api.openweathermap.org/data/2.5/forecast?lat=${lat}&lon=${lon}&appid=${token}&lang=ru&units=metric"
-    getWeather(url) {result ->
-        if(result != null) {
-            // перед заполнением очищаем список
+    httpGet(url)
+    {response, error ->
+        try {
+            // если в запросе получено исключение, то "выбрасываем" его
+            if (error != null) throw error
+
+            // если ответ получен, но код не 200, то тоже "выбрасываем" исключение
+            if (!response!!.isSuccessful) throw Exception(response.message)            
+            
             weatherList.clear()
 
-            val json = JSONObject(result)
+            val json = JSONObject(response.body!!.string())
             val list = json.getJSONArray("list")
 
             // перебираем json массив
@@ -334,6 +339,16 @@ GET https://api.openweathermap.org/data/2.5/forecast?lat={{lat}}&lon={{lon}}&app
                 // уведомляем визуальный элемент, что данные изменились
                 dailyInfoRecyclerView.adapter?.notifyDataSetChanged()
             }
+        } catch (e: Exception) {
+            // любую ошибку показываем на экране
+            runOnUiThread {
+                AlertDialog.Builder(this)
+                    .setTitle("Ошибка")
+                    .setMessage(e.message)
+                    .setPositiveButton("OK", null)
+                    .create()
+                    .show()
+            }
         }
     }
     ```
@@ -451,81 +466,6 @@ dailyInfoRecyclerView.adapter = weatherAdapter
 
     Не забудьте при получении данных установить `ready=true`. Хотя ничего страшного не произойдёт, если забудете - просто будут смотреть на заставку чуть подольше.
 
-## Вывод сообщений
-
->В шпоры положил
-
-В принципе тут простой телескопический конструктор
-
-```kt
-AlertDialog.Builder(this)
-    .setTitle("Заголовок")
-    .setMessage("Текст сообщения")
-    .setPositiveButton("OK", null)
-    .create()
-    .show()
-```
-
-## Пример с обработкой ошибок
-
-```kt
-fun httpGet(
-    url: String, 
-    callback: (response: Response?, error: Exception?)->Unit
-){
-    val request = Request.Builder()
-        .url(url)
-        .build()
-
-    client.newCall(request).enqueue(object : Callback {
-        override fun onFailure(call: Call, e: IOException) {
-            callback.invoke(null, Exception(e.message!!))
-        }
-
-        override fun onResponse(call: Call, response: Response) {
-            response.use {
-                callback.invoke(response, null)
-            }
-        }
-    })
-}
-```
-
-Оба варианта ответа (ошибка связи или что-то реально получено) возвращают результат в функции обратного вызова. Разбор ответа на вызывающей стороне:
-
-```kt
-httpGet("https://api.openweathermap.org/data/2.5/weather?lat=56.638372&lon=47.892991&appid=${appid}&lang=ru&units=metric") 
-{response, error ->
-    try {
-        if (error != null) throw error
-        if (!response!!.isSuccessful) throw java.lang.Exception(response.message)
-
-        val json = JSONObject(response.body!!.string())
-        val wheather = json.getJSONArray("weather")
-        val icoName = wheather.getJSONObject(0).getString("icon")
-
-        loadImage(icoName) {bmp ->
-            runOnUiThread {
-                ico.setImageBitmap(bmp)
-            }
-        }
-
-        runOnUiThread {
-            textView.text = json.getString("name")
-        }
-    } catch (e: Exception) {
-        runOnUiThread {
-            AlertDialog.Builder(this)
-                .setTitle("Ошибка")
-                .setMessage(e.message)
-                .setPositiveButton("OK", null)
-                .create()
-                .show()
-        }
-    }
-}
-```
-
 ## Разбор XML
 
 Маловероятно, мо может встретиться XML-формат в данных. Разберёмся с ним на примере погоды. В URL добавьте параметр `&mode=xml`.

BIN
img/sql004.png


+ 106 - 362
readme.md

@@ -77,8 +77,24 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 
 1. [Основные понятия и определения ИС.](articles/5_1_1_1_intro2.md)
     
+1. [~~Жизненный цикл информационных систем.~~](articles/5_1_1_2_lifecycle.md)
+
+1. [~~Организация и методы сбора информации.~~](articles/5_1_1_3_get_info.md)
+
 1. [Анализ предметной области. Основные понятия системного и структурного анализа.](articles/5_1_1_4_analiz.md)
 
+1. [~~Постановка задачи обработки информации. Основные виды, алгоритмы и процедуры обработки информации, модели и методы решения задач обработки информации.~~](articles/5_1_1_5_obr_inf.md)
+
+1. [~~Основные модели построения информационных систем, их структура, особенности и области применения.~~](articles/5_1_1_6_models.md)
+
+1. [~~Сервисно - ориентированные архитектуры. Анализ интересов клиента. Выбор вариантов решений~~](articles/5_1_1_7_soa.md)
+
+1. [~~Методы и средства проектирования информационных систем.~~](articles/5_1_1_8_methods.md)
+
+1. [~~Case-средства для моделирования деловых процессов (бизнес-процессов).~~](articles/5_1_1_9_case.md)
+
+1. [~~Проектирование информационных систем на основе унифицированного языка моделирования UML~~](articles/5_1_1_10_uml.md)
+
 1. [UML](./articles/uml.md)
 
 1. [Диаграмма вариантов использования (прецедентов, use case)](articles/5_1_1_10_uml_use_case.md)
@@ -99,6 +115,12 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 
 1. [НЕ ДОПИСАНО! Модель проектирования (диаграммы классов, диаграммы деятельности)](articles/uml_mp_dc_dd.md)
 
+1. [~~Особенности информационного, программного и технического обеспечения различных видов информационных систем. Экспертные системы. Системы реального времени~~](articles/5_1_1_11.md)
+
+1. [~~Оценка экономической эффективности информационной системы. Стоимостная оценка проекта. Классификация типов оценок стоимости: оценка порядка величины, концептуальная оценка, предварительная оценка, окончательная оценка, контрольная оценка.~~](articles/5_1_1_12.md)
+
+1. [~~Основные процессы управления проектом. Средства управления проектами~~](articles/5_1_1_13.md)
+
 ### Контрольные вопросы
 
 * назовите основные элементы диаграммы прецедентов
@@ -109,28 +131,27 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 
 ### Лекции
 
-<!-- диаграмма сущностей и связей, нормализация, словарь данных -->
-
 1. [Основы проектирования баз данных.](articles/5_1_1_1_erd2.md)
 
-2. [Словарь данных](articles/5_1_1_1_data_dictionary.md)
+1. [Словарь данных](articles/5_1_1_1_data_dictionary.md)
+
+1. [Создание ER-диаграммы в среде MySQL Workbench](articles/5_1_1_1_erd_workbench.md)
 
-3. [Создание ER-диаграммы в среде MySQL Workbench](articles/5_1_1_1_erd_workbench.md)
+1. [Основы SQL](./articles/sql_for_beginner.md)
 
-4. [Основы SQL](./articles/sql_for_beginner.md)
+1. [Представления (View)](./articles/sql_view.md)
+
+1. [Создание базы данных. Импорт данных.](./articles/sql_import.md)
+
+1. [Хранимые процедуры. Триггеры.](./articles/sql_trigger.md)
 
 <!-- 
+https://office-menu.ru/uroki-sql Уроки SQL
+
 В "основы" добавить 
 - count и функции работы со временем (between)  
-- UPDATE, DELETE 
 -->
 
-5. [Представления (View)](./articles/sql_view.md)
-
-6. [Создание базы данных. Импорт данных.](./articles/sql_import.md)
-
-7. [Хранимые процедуры. Триггеры.](./articles/sql_trigger.md)
-
 ### Контрольные вопросы
 
 * Что такое **домен**?
@@ -138,21 +159,76 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 * Какие виды **ключей** Вы знаете?
 * Назовите этапы проектирования БД.
 
-## Тема 5.1.3. C# и MySQL.
+### ~~Лабораторные~~
 
-1. [Создание подключения к БД MySQL. Получение данных с сервера.](./articles/cs_mysql_connection2.md)
+1. ~~Практическая работа «Анализ предметной области различными методами: контент-анализ, вебометрический анализ, анализ ситуаций, моделирование и др.»~~
+1. ~~Практическая работа «Изучение устройств автоматизированного сбора информации»~~
+1. ~~Практическая работа «Оценка экономической эффективности информационной системы»~~
+1. ~~Практическая работа «Разработка модели архитектуры информационной системы»~~
+1. ~~Практическая работа «Обоснование выбора средств проектирования информационной системы»~~
+1. ~~Практическая работа «Описание бизнес-процессов заданной предметной области»~~
+
+## ~~Тема 5.1.2. Система обеспечения качества информационных систем~~
+
+### ~~Лекции~~
+
+1. [~~Основные понятия качества информационной системы. Национальный стандарт обеспечения качества автоматизированных информационных систем~~](articles/5_1_2_1.md)
+
+1. ~~Международная система стандартизации и сертификации качества продукции. Стандарты группы ISO.~~
+
+1. ~~Методы контроля качества в информационных системах. Особенности контроля в различных видах систем~~
 
-2. [Вывод данных согласно макету (ListView, Image). Вывод данных плиткой.](./articles/cs_layout.md)
+1. ~~Автоматизация систем управления качеством разработки.~~
 
-<!-- сюда же добавить разметку "плиткой" -->
+1. [~~Обеспечение безопасности функционирования информационных систем~~](articles/5_1_2_5.md)
 
-3. [Пагинация, сортировка, фильтрация, поиск](./articles/cs_pagination.md)
+1. ~~Стратегия развития бизнес-процессов. Критерии оценивания предметной области и методы определения стратегии развития бизнес-процессов. Модернизация в информационных системах~~
 
-<!-- datepicker -->
+<!-- [не дописано про госты]: _ -->
+<!-- [https://sites.google.com/site/anisimovkhv/learning/pris/lecture/tema1#p12]: _ -->
 
-4. [Подсветка элементов по условию. Дополнительные выборки. Массовая смена цены продукции.](./articles/cs_coloring.md)
+### ~~Лабораторные~~
+1. ~~Практическая работа «Построение модели управления качеством процесса изучения модуля «Проектирование и разработка информационных систем»»~~
+2. ~~Практическая работа «Реинжиниринг методом интеграции»~~
+3. ~~Практическая работа «Разработка требований безопасности информационной системы»~~
+4. ~~Практическая работа «Реинжиниринг бизнес-процессов методом горизонтального и/или вертикального сжатия»~~
 
-5. [Создание, изменение продукции](./articles/cs_edit_product.md)
+## ~~Тема 5.1.3. Разработка документации информационных систем~~
+
+### ~~Лекции~~
+
+1. ~~Перечень и комплектность документов на информационные системы согласно ЕСПД и ЕСКД. Задачи документирования.~~
+
+1. ~~Предпроектная стадия разработки. Техническое задание на разработку: основные разделы.~~
+
+1. ~~Построение и оптимизация сетевого графика.~~
+
+1. ~~Проектная документация. Техническая документация. Отчетная документация~~
+
+1. [~~Пользовательская документация.~~](./articles/5_1_3_5.md) ~~Маркетинговая документация.~~ 
+
+1. ~~Самодокументирующиеся программы.~~ 
+
+1. ~~Назначение, виды и оформление сертификатов.~~
+
+### ~~Лабораторные~~
+1. ~~Практическая работа «Проектирование спецификации информационной системы индивидуальному заданию»~~
+1. ~~Практическая работа «Разработка общего функционального описания программного средства по индивидуальному заданию»~~
+1. ~~Практическая работа «Разработка руководства по инсталляции программного средства по индивидуальному заданию»~~
+1. ~~Практическая работа «Разработка руководства пользователя программного средства по индивидуальному заданию»~~
+1. ~~Лабораторная работа «Изучение средств автоматизированного документирования»~~
+
+## Тема 5.1.4. C# и MySQL.
+
+1. [Создание подключения к БД MySQL. Получение данных с сервера.](./articles/cs_mysql_connection2.md)
+
+1. [Вывод данных согласно макету (ListView, Image). Вывод данных плиткой.](./articles/cs_layout.md)<!-- сюда же добавить разметку "плиткой" -->
+
+1. [Пагинация, сортировка, фильтрация, поиск](./articles/cs_pagination.md)<!-- datepicker -->
+
+1. [Подсветка элементов по условию. Дополнительные выборки. Массовая смена цены продукции.](./articles/cs_coloring.md)
+
+1. [Создание, изменение продукции](./articles/cs_edit_product.md)
 
 ## Тема 5.1.5. Разработка своего API.
 
@@ -189,181 +265,6 @@ ER-диаграмма
 
 1. [Руководство пользователя](./articles/user_manual.md)
 
-<!--
-
-https://office-menu.ru/uroki-sql Уроки SQL
-
-2. [Жизненный цикл информационных систем.](articles/5_1_1_2_lifecycle.md)
-
-[4+0 => 8+0]: _
-
-3. [Организация и методы сбора информации.](articles/5_1_1_3_get_info.md)
-
-
-[4+0 => 12+0]: _
-
-
-[4+0 => 16+0]: _
-
-5. [Постановка задачи обработки информации. Основные виды, алгоритмы и процедуры обработки информации, модели и методы решения задач обработки информации.](articles/5_1_1_5_obr_inf.md)
-
-[6+0 => 22+0]: _
-
-6. [Основные модели построения информационных систем, их структура, особенности и области применения.](articles/5_1_1_6_models.md)
-
-[6+0 => 28+0]: _
-
-7. [Сервисно - ориентированные архитектуры. Анализ интересов клиента. Выбор вариантов решений](articles/5_1_1_7_soa.md)
-
-[4+0 => 32+0]: _
-
-8. [Методы и средства проектирования информационных систем.](articles/5_1_1_8_methods.md)
-
-[4+0 => 36+0]: _
-
-9. [Case-средства для моделирования деловых процессов (бизнес-процессов).](articles/5_1_1_9_case.md)
-
-[4+0 => 40+0]: _
-
-[Инструментальная среда – структура, интерфейс, элементы управления.]: //TODO
-
-[Принципы построения модели IDEF0: контекстная диаграмма, субъект моделирования, цель и точка зрения.]: ВМЕСТО_ЭТОГО_UML
-
-[Диаграммы IDEF0: диаграммы декомпозиции, диаграммы дерева узлов, диаграммы только для экспозиции (FEO).]: ВМЕСТО_ЭТОГО_UML
-
-[Работы (Activity). Стрелки (Arrow). Туннелирование стрелок. Нумерация работ и диаграмм. Каркас диаграммы.]: ВМЕСТО_ЭТОГО_UML
-
-[Слияние и расщепление моделей.]: ВМЕСТО_ЭТОГО_UML
-
-10. [Проектирование информационных систем на основе унифицированного языка моделирования UML](articles/5_1_1_10_uml.md)
-
-[4+0 => 44+0]: ВМЕСТО_IDEF
-
-
-[4+0 => 48+0]: ВМЕСТО_IDEF
-
-11. UML. Диаграмма последовательности
-
-[4+0 => 52+0]: ВМЕСТО_IDEF
-
-
-[4+0 => 56+0]: ВМЕСТО_IDEF
-
-11. [Особенности информационного, программного и технического обеспечения различных видов информационных систем. Экспертные системы. Системы реального времени](articles/5_1_1_11.md)
-
-[6+0 => 62+0]: _
-
-12. [Оценка экономической эффективности информационной системы. Стоимостная оценка проекта. Классификация типов оценок стоимости: оценка порядка величины, концептуальная оценка, предварительная оценка, окончательная оценка, контрольная оценка.](articles/5_1_1_12.md)
-
-[8+0 => 70+0]: _
-
-13. [Основные процессы управления проектом. Средства управления проектами](articles/5_1_1_13.md)
-
-[4+0 => 74+0]: _
-
-### Лабораторные
-
-1. Практическая работа «Анализ предметной области различными методами: контент-анализ, вебометрический анализ, анализ ситуаций, моделирование и др.»
-2. Практическая работа «Изучение устройств автоматизированного сбора информации»
-3. Практическая работа «Оценка экономической эффективности информационной системы»
-4. Практическая работа «Разработка модели архитектуры информационной системы»
-Дополнительно для квалификаций " Специалист по информационным системам" и "Разработчик web и мультимедийных приложений":
-5. Практическая работа «Обоснование выбора средств проектирования информационной системы»
-Дополнительно для квалификаций " Специалист по информационным системам" и "Разработчик web и мультимедийных приложений": 
-6. Практическая работа «Описание бизнес-процессов заданной предметной области»
-
-## Тема 5.1.2. Система обеспечения качества информационных систем
-
-### Лекции
-
-1. [Основные понятия качества информационной системы. Национальный стандарт обеспечения качества автоматизированных информационных систем](articles/5_1_2_1.md)
-
-[не дописано про госты]: _
-
-[https://sites.google.com/site/anisimovkhv/learning/pris/lecture/tema1#p12]: _
-
-[4+0 => 78+0]: _
-
-2. Международная система стандартизации и сертификации качества продукции. Стандарты группы ISO.
-
-[4+0 => 82+0]: _
-
-3. Методы контроля качества в информационных системах. Особенности контроля в различных видах систем
-
-[4+0 => 86+0]: _
-
-4. Автоматизация систем управления качеством разработки.
-
-[4+0 => 90+0]: _
-
-5. [Обеспечение безопасности функционирования информационных систем](articles/5_1_2_5.md)
-
-[4+0 => 94+0]: _
-
-6. Стратегия развития бизнес-процессов. Критерии оценивания предметной области и методы определения стратегии развития бизнес-процессов. Модернизация в информационных системах
-
-[6+0 => 100+0]: _
-
-### Лабораторные
-1. Практическая работа «Построение модели управления качеством процесса изучения модуля «Проектирование и разработка информационных систем»»
-Дополнительно для квалификаций "Специалист по информационным системам" и "Разработчик web и мультимедийных приложений": 
-2. Практическая работа «Реинжиниринг методом интеграции»
-3. Практическая работа «Разработка требований безопасности информационной системы»
-Дополнительно для квалификаций "Специалист по информационным системам" и "Разработчик web и мультимедийных приложений": 
-4. Практическая работа «Реинжиниринг бизнес-процессов методом горизонтального и/или вертикального сжатия»
-
-
-## Тема 5.1.3. Разработка документации информационных систем
-
-### Лекции
-
-1. Перечень и комплектность документов на информационные системы согласно ЕСПД и ЕСКД. Задачи документирования.
-
-[4+0 => 104+0]: _
-
-2. Предпроектная стадия разработки. Техническое задание на разработку: основные разделы.
-
-[4+0 => 108+0]: _
-
-3. Построение и оптимизация сетевого графика.
-
-[4+0 => 112+0]: _
-
-4. Проектная документация. Техническая документация. Отчетная документация
-
-[6+0 => 118+0]: _
-
-5. [Пользовательская документация.](./articles/5_1_3_5.md) Маркетинговая документация. 
-
-[4+0 => 122+0]: _
-
-6. Самодокументирующиеся программы. 
-
-[4+0 => 126+0]: _
-
-7. Назначение, виды и оформление сертификатов.
-
-[4+0 => 130+0]: _
-
-### Лабораторные
-1. Практическая работа «Проектирование спецификации информационной системы индивидуальному заданию» 
-2. Практическая работа «Разработка общего функционального описания программного средства по индивидуальному заданию»
-3. Практическая работа «Разработка руководства по инсталляции программного средства по индивидуальному заданию»
-4. Практическая работа «Разработка руководства пользователя программного средства по индивидуальному заданию»
-5. Лабораторная работа «Изучение средств автоматизированного документирования»
-
-# МДК. 05.02 Разработка кода ИС
-
-## Работа с БД
-
-1. [Знакомство с SQL](https://github.com/kolei/yotc/blob/master/articles/sql_for_beginner.md)
--->
-
-<!--  
-ERD,
-импорт данных 
-дописать про update, delete -->
-
 # МДК. 05.02 Разработка кода информационных систем
 
 ## Тема 5.1.4. Разработка мобильных приложений. Android Studio. Kotlin.
@@ -412,8 +313,6 @@ swype to delete
 swype вниз (обновление списка)
 tablayout
 
-kerio
-
 кнопки с картинками (нижнее или боковое меню)(фрагменты)
 поиск (фильтрация) - строка поиска и выпадающий список
 операции с датой
@@ -431,39 +330,29 @@ tablayout
 
 # МДК. 05.03 Тестирование информационных систем
 
-[46+24]: ФГОС
-
 ## Тема 5.3.1 Отладка и тестирование информационных систем
 
 ### Лекции
 
-1. [Тестирование и тестировщики](articles/5_3_1_1_intro.md)
-
-[6+0]: тут_ещё_вспомнаем_про_библиотеку_классов
+1. [Тестирование и тестировщики](articles/5_3_1_1_intro.md)<!-- тут_ещё_вспомнаем_про_библиотеку_классов -->
 
-2. [Жизненный цикл тестирования](articles/5_3_1_2_lifecycle.md)
+1. [Жизненный цикл тестирования](articles/5_3_1_2_lifecycle.md)<!-- большой_объем -->
 
-[6(12)+0]: большой_объем
+1. [Виды и методы тестирования](articles/5_3_1_3_vidy.md) (в том числе автоматизированные)
 
-3. [Виды и методы тестирования](articles/5_3_1_3_vidy.md) (в том числе автоматизированные)
+1. [Тестовые сценарии, тестовые варианты. Оформление результатов тестирования.](articles/5_3_1_4_testcase.md)
 
-4. [Тестовые сценарии, тестовые варианты. Оформление результатов тестирования.](articles/5_3_1_4_testcase.md)
+1. Инструментарии анализа качества программных продуктов в среде разработки.
 
-<!-- [(+12)]: _ -->
+1. [Обработка исключительных ситуаций. Методы и способы идентификации сбоев и ошибок.](articles/5_3_1_6_exceptions.md)<!-- 1. Выявление ошибок системных компонентов. - по ФГОС, но не представляю что давать -->
 
-5. Инструментарии анализа качества программных продуктов в среде разработки.
+1. [Реинжиниринг бизнес-процессов в информационных системах.](articles/5_3_1_8_reengeniring.md)
 
-6. [Обработка исключительных ситуаций. Методы и способы идентификации сбоев и ошибок.](articles/5_3_1_6_exceptions.md)
+1. [Создание библиотеки классов](articles/5_3_1_9_classlib.md)
 
-[7. Выявление ошибок системных компонентов. - по ФГОС, но не представляю что давать]: _
+1. [Создание UNIT-тестов](./articles/5_3_1_10_unit_test.md)
 
-8. [Реинжиниринг бизнес-процессов в информационных системах.](articles/5_3_1_8_reengeniring.md)
-
-9. [Создание библиотеки классов](articles/5_3_1_9_classlib.md)
-
-10. [Создание UNIT-тестов](./articles/5_3_1_10_unit_test.md)
-
-11. [Fake data. Тестирование методов получающих внешние данные из удалённых источников](./articles/fake_unit_test.md)
+1. [Fake data. Тестирование методов получающих внешние данные из удалённых источников](./articles/fake_unit_test.md)
 
 ### Лабораторнo-практические работы
 1. [Создание проекта по индивидуальному заданию. Разработка Unit-тестов для проекта](./articles/5_3_1_10_unit_test_lab.md)
@@ -483,151 +372,6 @@ tablayout
 
 # [Курсовой проект](articles/kp2.md)
 
-<!-- ПООП
-
-Раздел 1. Технологии проектирования и дизайн информационных систем
-
-Тема 5.1.1. Основы проектирования информационных систем
-
-Содержание 
-
-    1. Основные понятия и определения ИС. Жизненный цикл информационных систем
-
-    2. Организация и методы сбора информации. Анализ предметной области. Основные понятия системного и структурного анализа.
-
-    3. Постановка задачи обработки информации. Основные виды, алгоритмы и процедуры обработки информации, модели и методы решения задач обработки информации.
-
-    4. Основные модели построения информационных систем, их структура, особенности и области применения.
-
-    5. Сервисно - ориентированные архитектуры. Анализ интересов клиента. Выбор вариантов решений
-
-    6. Методы и средства проектирования информационных систем. Case-средства для моделирования деловых процессов (бизнес-процессов). Инструментальная среда –структура, интерфейс, элементы управления.
-
-    7. Принципы построения модели IDEF0: контекстная диаграмма, субъект моделирования, цель и точка зрения. 
-
-    8. Диаграммы IDEF0: диаграммы декомпозиции, диаграммы дерева узлов, диаграммы только для экспозиции (FEO). 
-
-    9. Работы (Activity). Стрелки (Arrow). Туннелирование стрелок. Нумерация работ и диаграмм. Каркас диаграммы.
-
-    10. Слияние и расщепление моделей.
-
-    11. Особенности информационного, программного и технического обеспечения различных видов информационных систем. Экспертные системы. Системы реального времени
-
-    12. Оценка экономической эффективности информационной системы. Стоимостная оценка проекта. Классификация типов оценок стоимости: оценка порядка величины, концептуальная оценка, предварительная оценка, окончательная оценка, контрольная оценка.
-
-    13. Основные процессы управления проектом. Средства управления проектами
-
-В том числе практических занятий и лабораторных работ 
-
-    1. Практическая работа «Анализ предметной области различными методами: контент-анализ, вебометрический анализ, анализ ситуаций, моделирование и др.»
-
-    2. Практическая работа «Изучение устройств автоматизированного сбора информации»
-
-    3. Практическая работа «Оценка экономической эффективности информационной системы»
-
-    4. Практическая работа «Разработка модели архитектуры информационной системы»
-
-    5. Практическая работа «Обоснование выбора средств проектирования информационной системы»
-
-    6. Практическая работа «Описание бизнес-процессов заданной предметной области»
-
-Тема 5.1.2. Система обеспечения качества информационных систем
-Содержание 
-
-    1. Основные понятия качества информационной системы. Национальный стандарт обеспечения качества автоматизированных информационных систем.
-
-    2. Международная система стандартизации и сертификации качества продукции. Стандарты группы ISO.
-
-    3. Методы контроля качества в информационных системах. Особенности контроля в различных видах систем
-
-    4. Автоматизация систем управления качеством разработки.
-
-    5. Обеспечение безопасности функционирования информационных систем
-
-    6. Стратегия развития бизнес-процессов. Критерии оценивания предметной области и методы определения стратегии развития бизнес-процессов. Модернизация в информационных системах
-
-В том числе практических занятий и лабораторных работ
-
-    1. Практическая работа «Построение модели управления качеством процесса изучения модуля «Проектирование и разработка информационных систем»»
-
-    2. Практическая работа «Реинжиниринг методом интеграции»
-
-    3. Практическая работа «Разработка требований безопасности информационной системы»
-
-    4. Практическая работа «Реинжиниринг бизнес-процессов методом горизонтального и/или вертикального сжатия»
-
-Тема 5.1.3. Разработка документации информационных систем
-Содержание
-
-    1. Перечень и комплектность документов на информационные системы согласно ЕСПД и ЕСКД. Задачи документирования
-
-    2. Предпроектная стадия разработки. Техническое задание на разработку: основные разделы. 
-
-    3. Построение и оптимизация сетевого графика.
-
-    4. Проектная документация. Техническая документация. Отчетная документация
-
-    5. Пользовательская документация. Маркетинговая документация
-
-    6. Самодокументирующиеся программы. 
-
-    7. Назначение, виды и оформление сертификатов.
-
-В том числе практических занятий и лабораторных работ
-
-    1. Практическая работа «Проектирование спецификации информационной системы индивидуальному заданию» 
-
-    2. Практическая работа «Разработка общего функционального описания программного средства по индивидуальному заданию»
-
-    3. Практическая работа «Разработка руководства по инсталляции программного средства по индивидуальному заданию»
-
-    4. Практическая работа «Разработка руководства пользователя программного средства по индивидуальному заданию»
-
-    5. Лабораторная работа «Изучение средств автоматизированного документирования»
-
-
-МДК. 05.03 Тестирование информационных систем
-Тема 5.3.1. Отладка и тестирование информационных систем
-Содержание 
-
-    1. Организация тестирования в команде разработчиков
-
-    2. Виды и методы тестирования (в том числе автоматизированные)
-
-    3. Тестовые сценарии, тестовые варианты. Оформление результатов тестирования
-
-    4. Инструментарии анализа качества программных продуктов в среде разработке. 
-
-    5. Обработка исключительных ситуаций. Методы и способы идентификации сбоев и ошибок. 
-
-    6. Выявление ошибок системных компонентов. 
-
-    7. Реинжиниринг бизнес-процессов в информационных системах. 
-
-В том числе практических занятий и лабораторных работ
-
-    1. Лабораторная работа «Разработка тестового сценария проекта»
-
-    2. Лабораторная работа «Разработка тестовых пакетов»
-
-    3. Лабораторная работа «Использование инструментария анализа качества»
-
-    4. Лабораторная работа «Анализ и обеспечение обработки исключительных ситуаций»
-
-    5. Лабораторная работа «Функциональное тестирование»
-
-    6. Лабораторная работа «Тестирование безопасности»
-
-    7. Лабораторная работа «Нагрузочное тестирование, стрессовое тестирование»
-
-    8. Лабораторная работа «Тестирование интеграции»
-
-    9. Лабораторная работа «Конфигурационное тестирование»
-
-    10. Лабораторная работа «Тестирование установки»
-
- -->
-
 <!-- 
 -- создание базы и пользователя для MSSQL
 DECLARE @userName AS VARCHAR(50) = 'test'