Простые sql запросы

Краткое описание MySQL

Это реляционная система управления базами данных. Таково официальное определение. 

MySQL создавалась силами шведских разработчиков из одноименной компании в 1994 году. Тогда и состоялся ее релиз под свободной лицензией. Позже компанию поглотила Oracle. MySQL распространяется бесплатно и входит в стандартный набор утилит LAMP для разработки сайтов на базе Linux.

MySQL — не единственная в своем роде. Подобных программ хватает. Но системы управления базами данных частенько ассоциируют конкретно со шведской разработкой. Доходит до того, что серверы баз данных с любым ПО называют MySQL. Все благодаря ее популярности и признанности среди крупных корпораций. Ее используют в Facebook, YouTube, Google и тысячах других IT-компаний.

MySQL — это популярная СУБД с моделью «клиент-сервер». Поэтому часто можно услышать от других разработчиков словосочетание «MySQL-сервер». Это действительно сервер, только сервер базы данных. Он создан для обеспечения доступа к данным для других сервисов и приложений. 

Что такое база данных?

В нашем случае данные — это файлы, а база — место, где они хранятся. Данные могут принимать любой облик. 

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

Получается, что базы могут быть многоуровневыми и делиться на различные категории (разделы каталога в случае с магазином). Так формируются взаимосвязи между разными элементами базы данных, появляется структура. Отсюда и термин «реляционная» – он намекает на зависимость элементов друг от друга.

Так что база данных — это набор структурированных данных с выстроенными между ними «взаимоотношениями» (делением на категории, к примеру). 

Визуально она представляет собой таблицу с тысячами элементов (ссылками, файлами, отрывками текста и т.п.). Чтобы этим добром управлять, необходимо как-то обозначить таблицы и научиться ими управлять. Тут и пригодится SQL.

В каком месте обратиться за помощью в изучении

В вашем путешествии по программированию станут моменты, когда вы застрянете на проблеме или других проблемах кодирования. Книги и руководства по SQL только иногда уведут вас особенно далеко. Обращение к онлайн-сайтам обсуждения кодирования — лучший способ взять помощь и улучшить свои навыки работы. Сайты программистовStack Overflow, предоставляют вам бесплатную помощь опытных программистов.

Вот некоторые проекты вопросов и ответов, их нужно проверить:

  • Stack Overflow — дискуссионный сайт программистов, охватывающий SQL и многие другие темы.
  • Quora— проект вопросов и ответов, где вы имеете возможность задать приличное число концептуальных вопросов.
  • Reddit — Reddit имеет значительное сообщество программистов, зависают в субреддитах, типаr/SQL.
  • StackExchange — StackExchange имеет множество дискуссионных сайтов по различным темам программирования.

SQL Учебник

SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии

Виды SQL-серверов

Для реализации функций СУБД на сегодняшний день чаще всего используются следующие SQL-серверы:

  • MS SQL server — многопользовательский программный продукт, разработанный компанией Microsoft, обладающий высокой производительностью и отказоустойчивостью, тесно интегрированный с ОС Windows. Этот сервер поддерживает удаленные подключения, работает с многими популярными типами данных, дает возможность создавать триггеры и хранимые данные, имеет практичные и удобные утилиты для настройки;
  • Oracle Database server — СУБД, предназначенная для создания, консолидации и управления базами данных в облачной среде. Используя этот сервер, можно как автоматизировать обычные бизнес-операции, так и выполнять динамический многомерный анализ данных (OLAP), проводить операции с документами xml-формата и управлять разделенной и локальной информацией;
  • IBM DB2 — семейство СУБД для работы с реляционными базами данных, признанное самым производительным, имеющим высокие технические показатели и возможности масштабирования. SQL-серверы этой группы характеризуются мультиплатформенностью, способностью к мгновенному созданию резервных копий и восстановлению БД, реорганизации таблиц в онлайн-режиме, разбиению баз данных, определению пользователями новых типов данных;
  • MySQL — СУБД, разработанная и поддерживаемая компанией Oracle. В основном она используется локальными или удаленными клиентами, позволяя им работать с таблицами разных типов, поддерживающих полнотекстовый поиск или выполняющих транзакции на уровне отдельных записей;
  • PostgreSQL — СУБД с открытым исходным кодом, работающая с объектно-реляционными (поддерживающими пользовательские объекты) базами данных. Также PostgreSQL предназначена для создания, хранения и извлечения сложных структур данных. Она поддерживает самые различные типы данных (среди них — числовые, текстовые, булевы, денежные, бинарные данные, сетевые адреса, xml и другие).

Обучение работе с серверами баз данных SQL server возможно для всех желающих в рамках профессиональной подготовки по курсу«Инструментальные средства бизнес-аналитики», которую проводит ВШБИ НИУ ВШЭ. Записаться на обучение по данному курсу можно на нашем сайте.

Использование среды SQL Server Management Studio

Создание базы данных

  1. В обозревателе объектов подключитесь к экземпляру компонента Компонент SQL Server Database Engine и разверните его.

  2. Щелкните правой кнопкой мыши элемент Базы данных, а затем выберите пункт Создать базу данных.

  3. В поле Новая база данных введите имя базы данных.

  4. Чтобы создать базу данных, приняв все значения по умолчанию, нажмите кнопку ОК; иначе продолжайте выполнение следующих дополнительных шагов.

  5. Чтобы изменить имя владельца, нажмите ( … ) и выберите другого владельца.

    Примечание

    Параметр Использовать полнотекстовое индексирование всегда установлен и недоступен (т. к. начиная с SQL Server 2008все пользовательские базы данных поддерживают полнотекстовый поиск).

  6. Чтобы изменить значения первичных данных по умолчанию и файлов журнала транзакций, щелкните соответствующую ячейку в сетке Файлы базы данных и введите новое значение. Дополнительные сведения см. в статье AДобавление файлов данных или журналов в базу данных.

  7. Чтобы изменить параметры сортировки базы данных, выберите страницу Параметры и выберите из списка желаемые параметры сортировки.

  8. Чтобы изменить модель восстановления, выберите страницу Параметры и модель восстановления из списка.

  9. Чтобы изменить параметры базы данных, выберите страницу Параметры и измените параметры базы данных. Описание каждого параметра см. в статье Параметры ALTER DATABASE SET (Transact-SQL).

  10. Чтобы добавить новую файловую группу, перейдите на страницу Группы файлов . Нажмите Добавить и введите значения для файловой группы.

  11. Чтобы добавить расширенное свойство в базу данных, выберите страницу Расширенные свойства .

    1. В столбце Имя введите имя расширенного свойства.

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

  12. Чтобы создать базу данных, нажмите кнопку ОК.

Определение данных

Существует набор команд, использующихся для определения данных, включенных
в язык
SQL.

Создание таблицы

Самая основная команда определения данных — это та, которая создаёт
новое отношение (новую таблицу). Синтаксис команды CREATE TABLE:

   CREATE TABLE table_name
                (name_of_attr_1 type_of_attr_1
                 [, name_of_attr_2 type_of_attr_2 
                 ]);
      

Пример 2-10. Создание таблицы

Для создания таблиц, определённых в
, используются следующие SQL выражения:

   CREATE TABLE SUPPLIER
                (SNO   INTEGER,
                 SNAME VARCHAR(20),
                 CITY  VARCHAR(20));
	
   CREATE TABLE PART
                (PNO   INTEGER,
                 PNAME VARCHAR(20),
                 PRICE DECIMAL(4 , 2));
	
   CREATE TABLE SELLS
                (SNO INTEGER,
                 PNO INTEGER);
	

Типы данных SQL

Вот список некоторых типов данных, которые поддерживает
SQL:

  • INTEGER: знаковое полнословное двоичное целое (31 бит для представления данных).

  • SMALLINT: знаковое полсловное двоичное целое (15 бит для представления данных).

  • DECIMAL (p[,q]): знаковое упакованное десятичное число
    с p знаками представления данных, с возможным
    q знаками справа от десятичной точки.

    (15 ≥ pqq ≥ 0).

    Если q опущено, то предполагается что оно равно 0.

  • FLOAT: знаковое двусловное число с плавающей точкой.

  • CHAR(n): символьная строка с постоянной длиной
    n.

  • VARCHAR(n): символьная строка с изменяемой длиной, максимальная длина
    n.

Создание индекса

Индексы используются для ускорения доступа к отношению. Если отношение R проиндексировано по атрибуту A, то мы можем получить все кортежи t
имеющие
t(A) = a за время приблизительно пропорциональное числу таких кортежей t, в отличие от времени, пропорциональному размеру R.

Для создания индекса в SQL используется команда CREATE INDEX. Синтаксис:

   CREATE INDEX index_name 
   ON table_name ( name_of_attribute );
      

Пример 2-11. Создание индекса

Для создания индекса с именем I по атрибуту SNAME отношения SUPPLIER
используем следующее выражение:

   CREATE INDEX I
   ON SUPPLIER (SNAME);
      

Созданный индекс обслуживается автоматически, т.е. при вставке ново
кортежа в отношение SUPPLIER, индекс I будет перестроен. Заметим, что
пользователь может ощутить изменения в при существовании индекса только по
увеличению скорости.

Создание представлений

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

Представления не имеют своих собственных, физически самостоятельных, различимых
хранящихся данных. Вместо этого, система хранит определение представления
(т.е. правила о доступе к физически хранящимся базовым таблицам
в порядке претворения их в представление) где-то в системных каталогах (смотри
). Обсуждение различных технологий реализации представлений смотри в
SIM98.

Для определения представлений в SQL используется команда CREATE VIEW. Синтаксис:

   CREATE VIEW view_name
   AS select_stmt
      

select_stmtselect_stmtсистемных каталогах

Пусть дано следующее определение представления (мы опять используем
таблицы из ):

   CREATE VIEW London_Suppliers
      AS SELECT S.SNAME, P.PNAME
         FROM SUPPLIER S, PART P, SELLS SE
         WHERE S.SNO = SE.SNO AND
               P.PNO = SE.PNO AND
               S.CITY = 'London';
      

Теперь мы можем использовать это виртуальное отношение
London_Suppliers как если бы оно было ещё одной базовой таблицей:

   SELECT *
   FROM London_Suppliers
   WHERE P.PNAME = 'Screw';
      
                       SNAME | PNAME
                      -------+-------
                       Smith | Screw                 
      

Для вычисления этого результата система базы данных в начале выполняет
скрытый доступ к базовым таблицам SUPPLIER, SELLS и PART. Это делается
с помощью выполнения заданных запросов в определении представления к этим
базовым таблицам. После, это дополнительное определедение (заданное в запросе
к представлению) можно использовать для получения результирующей таблицы.

Drop Table, Drop Index, Drop View

Для уничтожения таблицы (включая все кортежи, хранящиеся в этой таблице)
используется команда DROP TABLE:

   DROP TABLE table_name;
       

Для уничтожения таблицы SUPPLIER используется следующее выражение:

   DROP TABLE SUPPLIER;
      

Команда DROP INDEX используется для уничтожения индекса:

   DROP INDEX index_name;
      

Наконец, для уничтожения заданного представления используется
команда DROP VIEW:

   DROP VIEW view_name;
      

Что такое SQL?

Данные считаются основной частью многих приложений имобильных приложений. Например скажем, дополнение, типа Facebook, содержит информацию о профиле пользователя, включая показатели об его друзьях и сообщениях. Для хранения исходных применяется система баз. SQL — это язык программирования, каковые позволяет программистам работать с ними.

Значение SQL

Расшифровывается — структурированный язык. По сути, он язык, какой позволяет взаимодействовать с базами, с намерением управлять блоками, каковые в них содержатся.

Как произносится

SQL обычно произносится как слово «продолжение». Однако сие вопрос предпочтения (например, gif против jif) — некоторые люди произносят в форме аббревиатуры все три буквы.

Является ли SQL языком программирования?

  • Да, SQL — это язык. Он предлагает цикличность, логические директивы, переменные и ещё кучу. Однако не простой язык, скажем,Javaили C++.
  • Он считается языком четвертого поколения (4GL), в то время как Java и C++ являются языками третьего поколения (3GLs).
  • Не способен стать языком наравне с Java или C#, но тем не менее язык.
  • Согласно W3Schools: “SQL — стандартный язык хранения, обработки и извлечения информации в базах.”

SQL syntax used

User’s queries are executed by SQL server that brings some limitations to the
syntax of SQL statements. Now we use Microsoft SQL Server 2019 (15.0) on the rating stages,
and MariaDB-10.4 (compatible with MySQL 8), PostgreSQL 12.3, and Oracle Database 11g on the learn stage in addition. That is why You should follow
the syntax of these realizations when building queries. It should be noted that SQL syntax,
implemented in Microsoft SQL Server, is close to that of SQL-92 standard. But there are some
distinctions, among them is absence of NATURAL JOIN of tables. Supplied help on SQL Data Manipulation Language is held in accordance
with SQL-92 standard and contains information necessary for solving the exercises. In the same place it is possible to find features of used realization (SQL Server 2005).

Как хранится информация в БД

В основе всей структуры хранения лежат три понятия:

  • База данных;
  • Таблица;
  • Запись.

База данных

База данных — это высокоуровневное понятие, которое означает объединение совокупности данных, хранимых для выполнения одной цели.
Если мы делаем современный сайт, то все его данные будут храниться внутри одной базы данных. Для сайта онлайн-дневника наблюдений за погодой тоже понадобится создать отдельную базу данных.

Таблица

По отношению к базе данных таблица является вложенным объеком. То есть одна БД может содержать в себе множество таблиц.
Аналогией из реального мира может быть шкаф (база данных) внутри которого лежит множество коробок (таблиц).
Таблицы нужны для хранения данных одного типа, например, списка городов, пользователей сайта, или библиотечного каталога.
Таблицу можно представить как обычный лист в Excel-таблице, то есть совокупность строк и столбцов.
Наверняка каждый хоть раз имел дело с электронными таблицами (MS Excel).
Заполняя такую таблицу, пользователь определяет столбцы, у каждого из которых есть заголовок. В строках хранится информация.
В БД точно также: создавая новую таблицу, необходимо описать, из каких столбцов она состоит, и дать им имена.

Запись

Запись — это строка электронной таблицы.
Это неделимая сущность, которая хранится в таблице. Когда мы сохраняем данные веб-формы с сайта, то на самом деле добавляем новую запись в какую-то из таблиц базы данных. Запись состоит из полей (столбцов) и их значений. Но значения не могут быть какими угодно.
Определяя столбец, программист должен указать тип данных, который будет храниться в этом столбце: текстовый, числовой, логический, файловый и т.д. Это нужно для того, чтобы в будущем в базу не были записаны данные неверного типа.

Соберем всё вместе, чтобы понять, как будет выглядеть ведение дневника погоды при участии базы данных.

  1. Создадим для сайта новую БД и дадим ей название «weather_diary».
  2. Создадим в БД новую таблицу с именем «weather_log» и определим там следующие столбцы:
    • Город (тип: текст);
    • День (тип: дата);
    • Температура (тип: число);
    • Облачность (тип: число; от 0 (нет облачности) до 4 (полная облачность));
    • Были ли осадки (тип: истина или ложь);
    • Комментарий (тип: текст).
  3. При сохранении формы будем добавлять в таблицу weather_log новую запись, и заполнять в ней все поля информацией из полей формы.

Теперь можно быть уверенными, что наблюдения наших пользователей не пропадут, и к ним всегда можно будет получить доступ.

Реляционная база данных

Английское слово „relation“ можно перевести как связь, отношение.
А определение «реляционные базы данных» означает, что таблицы в этой БД могут вступать в отношения и находиться в связи между собой.
Что это за связи?
Например, одна таблица может ссылаться на другую таблицу. Это часто требуется, чтобы сократить объём и избежать дублирования информации.
В сценарии с дневником погоды пользователь вводит название своего города. Это название сохраняется вместе с погодными данными.
Но можно поступить иначе:

  1. Создать новую таблицу с именем „cities“.
  2. Все города в России известны, поэтому их все можно добавить в одну таблицу.
  3. Переделать форму, изменив поле ввода города с текстового на поле типа «select», чтобы пользователь не вписывал город, а выбирал его из списка.
  4. При сохранении погодной записи, в поле для города поставить ссылку на соответствующую запись из таблицы городов.

Так мы решим сразу две задачи:

  • Сократим объём хранимой информации, так как погодные записи больше не будут содержать название города;
  • Избежим дублирования: все пользователи будут выбирать один из заранее определённых городов, что исключит опечатки.

Связи между таблицами в БД бывают разных видов.
В примере выше использовалась связь типа «один-ко-многим», так как одному городу может соответствовать множество погодных записей, но не наоборот!
Бывают связи и других типов: «один-к-одному» и «многие-ко-многим», но они используются значительно реже.

AUTO_INCREMENT

Когда столбец определяется с помощью AUTO_INCREMENT, его значение автоматически увеличивается каждый раз, когда в таблицу добавляется новая запись. Это удобно при использовании столбца в качестве первичного ключа. Благодаря AUTO_INCREMENTне нужно писать инструкции SQL для вычисления уникального идентификатора для каждой строки.

AUTO_INCREMENT может быть присвоен только одному столбцу в таблице. И он должен быть проиндексирован (например, объявлен в качестве первичного ключа).

Значение AUTO_INCREMENT для столбца можно переопределить, указав новое при выполнении инструкции INSERT.

Можно запросить у MySQL самое последнее значение AUTO_INCREMENT, используя функцию last_insert_id() следующим образом:

SELECT last_insert_value();

Принцип работы MySQL-серверов

Он такой же, как в любых клиент-серверных моделях. Одно устройство делает запрос, а второе отвечает. Запрашивающих может быть больше одного, все зависит от сервера, сети и поставленных задач. 

Технически немного иные, но по своей сути идентичные процессы происходят в среде MySQL:

  • Система создает базу данных для хранения информации (ее сортировки, идентификации и т.п.).
  • Клиенты (другие компьютеры в сети) подают запросы к базе с помощью специфичных для SQL команд.
  • Серверное приложение обрабатывает запрос и выдает ответ клиенту (выдает запрашиваемые данные).

Для взаимодействия с MySQL-сервером используются соответствующие утилиты. Некоторые работают только в командной строке. Некоторые награждены графическим интерфейсом. Популярные решения – WorkBench, SequelPro, SQL Studio, TablePlus. Правда, большинство вебмастеров предпочитает phpMyAdmin, так как та входит в LAMP и работает в браузере.

Как создать базу данных на хостинге?

У хостинг-провайдеров встречаются панели управления со встроенной функцией создания баз данных. В Timeweb такая есть. Чтобы создать на хостинге базу данных, надо открыть раздел «Базы данных MySQL» и кликнуть по кнопке «Создание новой базы данных». Система попросит указать параметры, имя пользователя и пароль администратора для авторизации. 

Что касается создания БД на VDS, то можно воспользоваться панелью управления сервером. Например, ISPmanager. 

В ISPmanager базы создаются так:

  • Открываем панель управления.
  • Переходим в пункт меню «Инструменты».
  • Кликаем по подпункту «Базы данных».
  • Нажимаем на кнопку «Создать».
  • Указываем параметры будущей базы (логин, пароль и т.п.).
  • Сохраняем данные, кликнув по кнопке ОК.

SQL syntax used

User’s queries are executed by SQL server that brings some limitations to the
syntax of SQL statements. Now we use Microsoft SQL Server 2019 (15.0) on the rating stages,
and MariaDB-10.4 (compatible with MySQL 8), PostgreSQL 12.3, and Oracle Database 11g on the learn stage in addition. That is why You should follow
the syntax of these realizations when building queries. It should be noted that SQL syntax,
implemented in Microsoft SQL Server, is close to that of SQL-92 standard. But there are some
distinctions, among them is absence of NATURAL JOIN of tables. Supplied help on SQL Data Manipulation Language is held in accordance
with SQL-92 standard and contains information necessary for solving the exercises. In the same place it is possible to find features of used realization (SQL Server 2005).

Practical skills of SQL language

This site will help everyone to gain or improve skills in building
SQL Data Manipulation Language statements. To train You will have to build yourself
the SQL statements for retrieval or modification of specific data required in the exercises.
When Your query is incorrect, You will be able to see rows returned by the correct
query along with that returned by Your query. Furthermore, you may execute arbitrary
DML statements on available databases by setting the «Without checking» option. There are
five levels of difficulty (from 1 to 5), You may see it in second column of
exercises list. We propose the exercises on retrieving data (SELECT statement) and
the exercises on modifying data (INSERT, UPDATE, DELETE, and MERGE statements). Your success in the solving the exercises are shown by a rating of participants.
As this takes place, there are three stages:
the first one (first 5 exercises) is performed without time control for an individual
exercise, the second one (begins with the exercise #6) controls time for completion of each
task. At the third stage which refers to optimizing and begins with exercise #139, it is required not only to solve an exercise correctly, but also time of execution of inquiry should be commensurable with time of execution of the author’s solution.
Exercises of the first stage are available without registration and may be solved
in any order You like. The solution of the rest of exercises requires registration.
REGISTRATION IS FREE as this for all other services of the site. In the third column of exercises list You
will be able to see («OK») notes with the numbers of done exercises, but that
is available only to the registered users. In fact, that is the main reason for registration.
If You would like to visit our web site again, You won’t have to recollect which
exercises You have done already and which You haven’t. If You don’t want to register,
You may enter as a guest, but in that case Your results won’t
be traced by the system. Registered users also may discuss the solutions to exercises in our forum.

NOTE: The query stated incorrectly may return the «correct» data on a current state of database.
For this reason You should not be surprised if the results of incorrect query are
coincide with the results of right one with Your query is estimated as incorrect by the Verifying system.

NOTE: Your browser should support Cookies and Javascript to provide correct usage of this site. If you use content filter, it should allow opening child windows to explore help pages.

Создание представлений и хранимых процедур

Представление является хранимой инструкцией SELECT, а хранимая процедура представляет собой одну или более инструкций Transact-SQL , выполняемых в виде пакета.

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

В этом примере используется инструкция CREATE VIEW, чтобы создать представление, которое выбирает только два столбца в таблице Products . Затем с помощью инструкции CREATE PROCEDURE создается хранимая процедура, которая принимает цену в качестве параметра и возвращает только те продукты, цена которых меньше значения, указанного в качестве параметра.

Создание представления

Выполните следующую инструкцию, создающую представление, которое выполняет инструкцию select и возвращает названия и цены продуктов пользователю.

Тестирование представления

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

Создание хранимой процедуры

В следующем примере создается хранимая процедура с входным параметром типа . Эта хранимая процедура печатает инструкцию , соединенную операцией сцепления с входным параметром, тип которого преобразуется из в . Затем процедура выполняет инструкцию на представлении, передавая входной параметр в предложение . Возвращаются все продукты, цена которых меньше значения входного параметра.

Тестирование хранимой процедуры

Чтобы выполнить хранимую процедуру, введите и выполните следующую инструкцию. Эта процедура должна возвратить названия двух продуктов, введенных в таблицу на занятии 1, цена которых меньше .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector