Серия «Начало работы с MySQL»: введение в запросы (1)

MySQL

Обзор последней серии

В последнем эпизоде ​​мы говорили о создании, выборе и удалении базы данных, создании, изменении и удалении таблиц, а также о простых командах запроса и вставки. Но это всего лишь пустая полка, на самом деле, дляMySQLНапример, мы обычно чаще всего используем функцию запроса. В этом эпизоде ​​мы подробно сосредоточимся на различных ослепительных методах запроса. Смотри внимательно, смотри внимательно и продолжай смотреть немного Шапу Айси, протри глаза тряпка! Этот эпизод очень важен!

Готов к работе

Кстати, темой этого эпизода является запрос данных, поэтому мы должны сначала определить, какую таблицу искать.После подтверждения таблицы сначала должны быть данные в таблице, или мы ищем пердун ~ Итак, давайте сначала выяснить, какую таблицу использовать и что заполнить в таблице ввода данных.

какую таблицу использовать

Для простоты мы будем повторно использовать базу данныхxiaohaiziИнформационный лист студента, созданный нижеstudent_infoи стенограммы учащихсяstudent_score, возможно, вы забыли, как выглядят эти две таблицы. Давайте сначала рассмотрим структуру двух таблиц:

Структура основного информационного листа студента
CREATE TABLE student_info (
    number INT PRIMARY KEY,
    name VARCHAR(5),
    sex ENUM('男', '女'),
    id_number CHAR(18),
    department VARCHAR(30),
    major VARCHAR(30),
    enrollment_time DATE,
    UNIQUE KEY (id_number)
);
Структура табель успеваемости студента
CREATE TABLE student_score (
    number INT,
    subject VARCHAR(30),
    score TINYINT,
    PRIMARY KEY (number, subject),
    CONSTRAINT FOREIGN KEY(number) REFERENCES student_info(number)
);

Заполнить таблицу данными

Давайте вставим некоторые данные в эти две таблицы:

mysql> INSERT INTO student_info(number, name, sex, id_number, department, major, enrollment_time) VALUES
    ->     (20180101, '杜子腾', '男', '158177199901044792', '计算机学院', '计算机科学与工程', '2018-09-01'),
    ->     (20180102, '杜琦燕', '女', '151008199801178529', '计算机学院', '计算机科学与工程', '2018-09-01'),
    ->     (20180103, '范统', '男', '17156319980116959X', '计算机学院', '软件工程', '2018-09-01'),
    ->     (20180104, '史珍香', '女', '141992199701078600', '计算机学院', '软件工程', '2018-09-01'),
    ->     (20180105, '范剑', '男', '181048199308156368', '航天学院', '飞行器设计', '2018-09-01'),
    ->     (20180106, '朱逸群', '男', '197995199501078445', '航天学院', '电子信息', '2018-09-01');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> INSERT INTO student_score (number, subject, score) VALUES
    ->     (20180101, '母猪的产后护理', 78),
    ->     (20180101, '论萨达姆的战争准备', 88),
    ->     (20180102, '母猪的产后护理', 100),
    ->     (20180102, '论萨达姆的战争准备', 98),
    ->     (20180103, '母猪的产后护理', 59),
    ->     (20180103, '论萨达姆的战争准备', 61),
    ->     (20180104, '母猪的产后护理', 55),
    ->     (20180104, '论萨达姆的战争准备', 46);
Query OK, 8 rows affected (0.00 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql>

Теперь данные в этих двух таблицах выглядят так:

Студенческий основной информационный лист
number name sex id_number department major enrollment_time
20180101 Ду Цзытенг мужчина 158177199901044792 ИТ-Академия Информатика и инженерия 2018-09-01
20180102 Ду Киян Женский 151008199801178529 ИТ-Академия Информатика и инженерия 2018-09-01
20180103 Фан Тонг мужчина 17156319980116959X ИТ-Академия разработка программного обеспечения 2018-09-01
20180104 Ши Чжэньсян Женский 141992199701078600 ИТ-Академия разработка программного обеспечения 2018-09-01
20180105 Фан Цзянь мужчина 181048200008156368 Аэрокосмический институт Дизайн самолета 2018-09-01
20180106 Чжу Ийцюнь мужчина 197995199801078445 Аэрокосмический институт цифровая информация 2018-09-01
Стенограмма студента
number subject score
20180101 Послеродовой уход за свиноматками 78
20180101 О подготовке Саддама к войне 88
20180102 Послеродовой уход за свиноматками 100
20180102 О подготовке Саддама к войне 98
20180103 Послеродовой уход за свиноматками 59
20180103 О подготовке Саддама к войне 61
20180104 Послеродовой уход за свиноматками 55
20180104 О подготовке Саддама к войне 46

Что ж, заполнение таблицы также завершено~ Наконец-то можно приступать к запросам данных!

запросить один столбец

Общий формат просмотра данных в столбце таблицы следующий:

SELECT 列名 FROM 表名;

такие как просмотрstudent_infoв таблицеnumberДанные столбца можно записать так:

mysql> SELECT number FROM student_info;
+----------+
| number   |
+----------+
| 20180104 |
| 20180102 |
| 20180101 |
| 20180103 |
| 20180105 |
| 20180106 |
+----------+
6 rows in set (0.00 sec)

mysql>

Мы называем то, что вы хотите запросить查询对象, объект запроса в этом примереnumberСтолбцы, потому что результаты запроса также состоят из записей одна за другой, как набор записей, поэтому иногда мы называем полученные результаты запроса как结果集.

Советы: Вы можете обнаружить, что запрошенные данные не в порядке, мы поговорим об этом позже, не волнуйтесь

псевдоним столбца

Мы также можем переопределить столбец для набора результатов.别名, формат команды следующий:

SELECT 列名 [AS] 列的别名 FROM 表名;

Мы виделиASОн добавляется с квадратными скобками, что означает необязательный, нетASЕсли это так, просто разделите имя столбца и псевдоним столбца пробелом. Например, мы хотим датьnumberУкажите псевдоним, можно использовать следующие два метода:

  • метод первый

    SELECT number AS 学号 FROM student_info;
    
  • Способ второй:

    SELECT number 学号 FROM student_info;
    

Давай сделаем это:

mysql> SELECT number AS 学号 FROM student_info;
+----------+
| 学号     |
+----------+
| 20180104 |
| 20180102 |
| 20180101 |
| 20180103 |
| 20180105 |
| 20180106 |
+----------+
6 rows in set (0.00 sec)

mysql>

Когда вы видите имя столбца, отображаемое в черном поле, оно больше неnumber, но псевдоним, который мы только что определили学号. Однако следует отметить, что:Имена столбцов используются только в отображаемых результатах этого запроса и не изменят имена столбцов в реальной таблице., то есть в следующем запросе выnumberВы также можете использовать другие имена столбцов, например:

mysql> SELECT number xuehao FROM student_info;
+----------+
| xuehao   |
+----------+
| 20180104 |
| 20180102 |
| 20180101 |
| 20180103 |
| 20180105 |
| 20180106 |
+----------+
6 rows in set (0.00 sec)

mysql>

На этот раз имя выходного столбца является другим псевдонимомxuehao.

запросить несколько столбцов

Если вы хотите запросить данные из нескольких столбцов, вы можетеSELECTНапишите несколько имен столбцов, а затем запятые,Просто отдельно:

SELECT 列名1, 列名2, ... 列名n FROM 表名;

мы ставим несколько查询对象Сформированный список называется查询列表, должны знать,Имена столбцов в списке запросов могут располагаться в любом порядке, и результирующий набор будет отображаться в том порядке, в котором мы указываем имена столбцов.. Например, мы запрашиваемstudent_infoНесколько столбцов в:

mysql> SELECT number, name, id_number, major FROM student_info;
+----------+-----------+--------------------+--------------------------+
| number   | name      | id_number          | major                    |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾    | 158177199901044792 | 计算机科学与工程         |
| 20180102 | 杜琦燕    | 151008199801178529 | 计算机科学与工程         |
| 20180103 | 范统      | 17156319980116959X | 软件工程                 |
| 20180104 | 史珍香    | 141992199701078600 | 软件工程                 |
| 20180105 | 范剑      | 181048199308156368 | 飞行器设计               |
| 20180106 | 朱逸群    | 197995199501078445 | 电子信息                 |
+----------+-----------+--------------------+--------------------------+
6 rows in set (0.00 sec)

mysql>

Список запросов в этом примереnumber,name,id_number,major, поэтому порядок столбцов в результирующем наборе отображается именно в этом порядке. Конечно, мы также можем использовать псевдонимы для вывода этих данных:

mysql> SELECT number AS 学号, name AS 姓名, id_number AS 身份证号, major AS 专业 FROM student_info;
+----------+-----------+--------------------+--------------------------+
| 学号     | 姓名      | 身份证号           | 专业                     |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾    | 158177199901044792 | 计算机科学与工程         |
| 20180102 | 杜琦燕    | 151008199801178529 | 计算机科学与工程         |
| 20180103 | 范统      | 17156319980116959X | 软件工程                 |
| 20180104 | 史珍香    | 141992199701078600 | 软件工程                 |
| 20180105 | 范剑      | 181048199308156368 | 飞行器设计               |
| 20180106 | 朱逸群    | 197995199501078445 | 电子信息                 |
+----------+-----------+--------------------+--------------------------+
6 rows in set (0.00 sec)

mysql>

При желании один и тот же объект запроса можно повторить в списке запросов (хотя обычно это бесполезно), например:

mysql> SELECT number, number, number FROM student_info;
+----------+----------+----------+
| number   | number   | number   |
+----------+----------+----------+
| 20180104 | 20180104 | 20180104 |
| 20180102 | 20180102 | 20180102 |
| 20180101 | 20180101 | 20180101 |
| 20180103 | 20180103 | 20180103 |
| 20180105 | 20180105 | 20180105 |
| 20180106 | 20180106 | 20180106 |
+----------+----------+----------+
6 rows in set (0.00 sec)

mysql>

запросить все столбцы

Если вам нужно узнать все столбцы в записи,MySQLОн также предоставляет безотказный метод, который мы представили ранее, который заключается в прямом использовании звездочки.*чтобы представить что-то для запроса, например:

SELECT * FROM 表名;

Мы видели эту команду раньше, поэтому я не буду много говорить о ней. Однако следует отметить, чтоЕсли вам действительно не нужен каждый столбец в таблице, обычно лучше не использовать звездочку.*Запросить все столбцы, хотя звездочка*Кажется удобным без явного перечисления обязательных столбцов, но запрос ненужных столбцов часто снижает производительность..

удалить идентичные результаты запроса

Удалить повторяющиеся результаты из одного столбца

Иногда, когда мы запрашиваем данные определенного столбца, могут быть повторяющиеся результаты. Например, давайте запросимstudent_infoТаблица информации о колледже:

mysql> SELECT department FROM student_info;
+-----------------+
| department      |
+-----------------+
| 计算机学院      |
| 计算机学院      |
| 计算机学院      |
| 计算机学院      |
| 航天学院        |
| 航天学院        |
+-----------------+
6 rows in set (0.00 sec)

Поскольку в таблице 6 записей, 6 результатов возвращаются нам. Но на самом деле многие из них повторяются результаты, если мы хотимУдалить дубликаты, вы можете использоватьDISTINCTПоместите его перед запрашиваемым столбцом, например:

SELECT DISTINCT 列名 FROM 表名;

Давайте дедуплицируем информацию о колледже:

mysql> SELECT DISTINCT department FROM student_info;
+-----------------+
| department      |
+-----------------+
| 计算机学院      |
| 航天学院        |
+-----------------+
2 rows in set (0.00 sec)

Видя, что результатом является только информация, которая не повторяется.

Удалить повторяющиеся результаты из нескольких столбцов

В случае запроса нескольких столбцов повторение двух записей означает:Обе записи имеют одинаковое значение в каждом столбце. Например, чтобы запросить информацию о колледже и профессии:

mysql> SELECT department, major FROM student_info;
+-----------------+--------------------------+
| department      | major                    |
+-----------------+--------------------------+
| 计算机学院      | 计算机科学与工程         |
| 计算机学院      | 计算机科学与工程         |
| 计算机学院      | 软件工程                 |
| 计算机学院      | 软件工程                 |
| 航天学院        | 飞行器设计               |
| 航天学院        | 电子信息                 |
+-----------------+--------------------------+
6 rows in set (0.00 sec)

В 1-й и 2-й строке записи в результате запросаdepartmentа такжеmajorСтолбцы одинаковые, поэтому дублируются две строки записей, аналогично дублируются третья и четвертая строки. Если мы хотим дедуплицировать результаты многостолбцовых запросов, мы можем напрямую поставитьDISTINCTПоместите его вверху запрашиваемого столбца:

SELECT DISTINCT 列名1, 列名2, ... 列名n  FROM 表名;

Например:

mysql> SELECT DISTINCT department, major FROM student_info;
+-----------------+--------------------------+
| department      | major                    |
+-----------------+--------------------------+
| 计算机学院      | 计算机科学与工程         |
| 计算机学院      | 软件工程                 |
| 航天学院        | 飞行器设计               |
| 航天学院        | 电子信息                 |
+-----------------+--------------------------+
4 rows in set (0.00 sec)

mysql>

ОТЛИЧНЫЕ Примечания

DISTINCTНевозможно удалить дубликаты некоторых столбцов запроса и не удалить дубликаты других частей.. Поскольку результаты запроса отображаются в единицах строки, если вы толькоdepartmentпотяжелеть, чтоdepartmentВ этом столбце осталось только 4 строки данных, даmajorЕсли столбик не идет на вес, тоmajorВ столбце осталось 8 строк данных, так как же должен отображаться результат? Итак, мы оговариваемDISTINCTможно использовать толькоДедуплицировать записи с одинаковым значением для всех столбцов.

Ограничить количество результатов запроса

Иногда результатов запроса может быть много, и все они могут взорвать экран~ Так чтоMySQLПредоставляет нам способ ограничить количество результатов, который заключается в использовании этого синтаксиса в конце оператора запроса:

LIMIT 开始行, 限制条数;

开始行Это означает, что мы хотим начать запрос с первой строки данных,限制条数Это количество записей, возвращаемых результатами запроса.

Советы В жизни мы обычно начинаем считать с 1, но в компьютерах мы начинаем считать с 0, поэтому первая запись, которую мы обычно называем, считается нулевой записью в компьютере. Например, 6 записей в таблице `student_info` представлены в компьютере как: № 0, № 1, № 2, № 3, № 4, № 5.

Например, проверимstudent_infoТаблицу, начиная с 0-й записи и запрашивая до 2-х записей, можно записать следующим образом:

mysql> SELECT number, name, id_number, major FROM student_info LIMIT 0, 2;
+----------+-----------+--------------------+--------------------------+
| number   | name      | id_number          | major                    |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾    | 158177199901044792 | 计算机科学与工程         |
| 20180102 | 杜琦燕    | 151008199801178529 | 计算机科学与工程         |
+----------+-----------+--------------------+--------------------------+
2 rows in set (0.00 sec)

mysql>

если указано开始行больше, чем количество строк в результате, результатом запроса является ничто:

mysql> SELECT number, name, id_number, major FROM student_info LIMIT 6, 2;
Empty set (0.00 sec)

mysql>

Если количество результатов запроса меньше, чем限制条数Тогда вы можете сделать все это явное:

mysql> SELECT number, name, id_number, major FROM student_info LIMIT 4, 3;
+----------+-----------+--------------------+-----------------+
| number   | name      | id_number          | major           |
+----------+-----------+--------------------+-----------------+
| 20180105 | 范剑      | 181048199308156368 | 飞行器设计      |
| 20180106 | 朱逸群    | 197995199501078445 | 电子信息        |
+----------+-----------+--------------------+-----------------+
2 rows in set (0.00 sec)

mysql>

Есть две записи, начиная со статьи 4,限制条数3, поэтому результаты могут быть отображены.

использовать стартовую линию по умолчанию

LIMITТакже сзади может быть только один параметр, тогда этот параметр представляет限制行数. То есть мы не можем указать开始行, начальная строка по умолчанию — это строка 0, например, мы можем написать:

mysql> SELECT number, name, id_number, major FROM student_info LIMIT 3;
+----------+-----------+--------------------+--------------------------+
| number   | name      | id_number          | major                    |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾    | 158177199901044792 | 计算机科学与工程         |
| 20180102 | 杜琦燕    | 151008199801178529 | 计算机科学与工程         |
| 20180103 | 范统      | 17156319980116959X | 软件工程                 |
+----------+-----------+--------------------+--------------------------+
3 rows in set (0.00 sec)

mysql>

Результат запроса показывает 3 записи, начиная с 0.

Сортировка результатов запроса

Мы ранее интересовалисьnumberЗаписи получаются, когда столбец не упорядочен, почему это?MySQLНа самом деле по умолчанию данные будут возвращены нам в порядке базового хранилища данных, но эти данные могут быть обновлены или удалены.Если мы не укажем порядок сортировки возвращаемых результатов, то мы можно учитывать порядок записей в результате. другими словамиЕсли мы хотим, чтобы записи в возвращаемых результатах сортировались по определенному правилу, то мы должны явно указать правило сортировки.

Сортировка по значению одного столбца

Мы можем использовать следующий синтаксис, чтобы указать, что возвращаемые записи сортируются по значению определенного столбца:

ORDER BY 列名 ASC|DESC

ASCа такжеDESCОтносится к направлению сортировки.ASCЭто относится к сортировке от меньшего к большему в соответствии со значением указанного столбца, также известной как升序,DESCЭто относится к сортировке от большего к меньшему в соответствии со значением указанного столбца, также известной как降序,Середина|Указывает, что можно выбрать только один из этих двух методов. На этот раз мы используемstudent_scoreПротестируйте таблицу:

mysql> SELECT * FROM student_score ORDER BY score ASC;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180104 | 论萨达姆的战争准备          |    46 |
| 20180104 | 母猪的产后护理              |    55 |
| 20180103 | 母猪的产后护理              |    59 |
| 20180103 | 论萨达姆的战争准备          |    61 |
| 20180101 | 母猪的产后护理              |    78 |
| 20180101 | 论萨达姆的战争准备          |    88 |
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180102 | 母猪的产后护理              |   100 |
+----------+-----------------------------+-------+
8 rows in set (0.01 sec)

mysql>

Вы можете видеть, что выходные записи отсортированы в соответствии с оценками от меньшего к большему.Если направление сортировки в операторе ORDER BY опущено, по умолчанию используется сортировка от меньшего к большему, т. е.ORDER BY 列名а такжеORDER BY 列名 ASCСемантика та же, давай попробуем:

mysql> SELECT * FROM student_score ORDER BY score;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180104 | 论萨达姆的战争准备          |    46 |
| 20180104 | 母猪的产后护理              |    55 |
| 20180103 | 母猪的产后护理              |    59 |
| 20180103 | 论萨达姆的战争准备          |    61 |
| 20180101 | 母猪的产后护理              |    78 |
| 20180101 | 论萨达姆的战争准备          |    88 |
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180102 | 母猪的产后护理              |   100 |
+----------+-----------------------------+-------+
8 rows in set (0.01 sec)

Давайте посмотрим, как это выглядит, отсортировав от большего к меньшему:

mysql> SELECT * FROM student_score ORDER BY score DESC;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180102 | 母猪的产后护理              |   100 |
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180101 | 论萨达姆的战争准备          |    88 |
| 20180101 | 母猪的产后护理              |    78 |
| 20180103 | 论萨达姆的战争准备          |    61 |
| 20180103 | 母猪的产后护理              |    59 |
| 20180104 | 母猪的产后护理              |    55 |
| 20180104 | 论萨达姆的战争准备          |    46 |
+----------+-----------------------------+-------+
8 rows in set (0.00 sec)

mysql>

Сортировка по значениям нескольких столбцов

Мы также можем указать несколько столбцов сортировки одновременно, используя запятые между несколькими столбцами сортировки.,Это хорошо, чтобы отделить его, это так:

ORDER BY 列1 ASC|DESC, 列2 ASC|DESC ...

Например, мы хотимstudent_scoreСначала следуют результаты запросаsubjuectСортировать поscoreЗначения расположены в порядке убывания, что можно записать как:

mysql> SELECT * FROM student_score ORDER BY subject, score DESC;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180102 | 母猪的产后护理              |   100 |
| 20180101 | 母猪的产后护理              |    78 |
| 20180103 | 母猪的产后护理              |    59 |
| 20180104 | 母猪的产后护理              |    55 |
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180101 | 论萨达姆的战争准备          |    88 |
| 20180103 | 论萨达姆的战争准备          |    61 |
| 20180104 | 论萨达姆的战争准备          |    46 |
+----------+-----------------------------+-------+
8 rows in set (0.00 sec)

mysql>

напомни еще раз,Если направление сортировки не указано, по умолчанию используетсяASC, то есть в порядке возрастания от меньшего к большему.

Советы: Сортировка чисел понятна, но как сортировать строки? Прописная буква A или строчная буква a, что больше, а что меньше? Этот вопрос касается кодировки, используемой для строк, и правил сортировки строк. Мы подробно рассмотрим их позже, а пока вам нужно знать только синтаксис сортировки.

Мы также можем позволитьORDER BYзаявление иLIMITутверждения используются вместе сОператор ORDER BY должен стоять перед оператором LIMIT., например:

mysql> SELECT * FROM student_score ORDER BY score LIMIT 1;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180104 | 论萨达姆的战争准备          |    46 |
+----------+-----------------------------+-------+
1 row in set (0.00 sec)

mysql>

Это позволит найти запись с наименьшим счетом.

Суммировать

  1. Мы можем указать запрос в списке SELECT столбцов назад, а затем указать таблицу для запроса в FROM позади, вы можете запросить только значение одного столбца, вы также можете проверить значение нескольких столбцов, вы можете использовать * Простые запросы от имени всех значений столбцов.

  2. Если мы хотим удалить повторяющиеся результаты, мы можем использовать DISTINCT перед запрашиваемым столбцом. Следует отметить, что две записи дублируются, поэтому использование DISTINCT для нескольких столбцов удалит повторяющиеся строки с одинаковым значением в каждом столбце двух записей, но не может сделать некоторые столбцы тяжелыми, а другая часть нетяжелой.

  3. Используйте оператор LIMIT, чтобы ограничить количество строк в результате запроса. Предложение LIMIT может содержать два параметра, где начальная строка относится к строке данных, с которой мы хотим начать запрос, а предельное число — это максимальное количество строк. записи, возвращаемые результатом запроса. Начальную строку параметра можно не указывать, по умолчанию начинается со строки 0.

  4. Если мы хотим, чтобы записи в возвращаемом результате были отсортированы по определенному правилу, то мы должны явно указать правило сортировки с помощью ORDER BY. Среди них ASC относится к сортировке по возрастанию значений указанного столбца, а DESC относится к сортировке по убыванию значений указанного столбца. Если после предложения ORDER BY имеется более одного столбца, он будет отсортирован в соответствии с предыдущим столбцом. Если значение предыдущего столбца такое же, оно будет отсортировано в соответствии с последним столбцом в тех же строках.

буклет

Эта серия столбцов посвящена вводным знаниям MySQL.Ссылка на статью «Как работает MySQL: понимание MySQL у истоков». Содержание буклета в основном с точки зрения Xiaobai, с использованием относительно популярного языка для объяснения некоторых основных концепций расширенного MySQL, таких как записи, индексы, страницы, табличные пространства, оптимизация запросов, транзакции и блокировки и т. д. количество слов составляет от 300 000 до 400 000 слов, с сотнями оригинальных иллюстраций. Основная цель состоит в том, чтобы облегчить обычным программистам изучение MySQL для продвинутых пользователей и сделать кривую обучения более плавной.