Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

access запросы

.pdf
Скачиваний:
19
Добавлен:
03.03.2016
Размер:
260.04 Кб
Скачать

 

СОДЕРЖАНИЕ

 

 

СОКРАЩЕНИЯ И УСЛОВНЫЕ ОБОЗНАЧЕНИЯ . . .

. . . . . . . . .

4

ВВЕДЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . .

5

1 ОПИСАНИЕ БАЗЫ ДАННЫХ. . . . . . . . . . . . . . . . . . .

. . . . . . . . .

6

2 ЗАПРОСЫ К ОДНОМУ ИСТОЧНИКУ ДАННЫХ . .

. . . . . . . . .

9

2.1

Общие сведения о запросах как объектах БД. . . . . .

. . . . . . . .

9

2.2

Запросы на выборку . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

11

2.2.1 Применение мастера для создания простых запросов. . . . . .

11

2.2.2 Режимы работы с запросами . . . . . . . . . . . . . . . . . . .

. . . . . . .

13

2.2.3 Применение конструктора запросов . . . . . . . . . . . .

. . . . . . . .

16

2.2.4 Запросы с вычисляемыми полями. . . . . . . . . . . . . . .

. . . . . . .

18

2.2.5 Применение построителя выражений. . . . . . . . . . . .

. . . . . . .

21

2.3

Отбор записей в запросах. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

26

2.3.1 Применение условий отбора. . . . . . . . . . . . . . . . . . .

. . . . . . . .

26

2.3.2 Параметрические запросы. . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

31

2.3.3 Применение форм для ввода параметров. . . . . . . . .

. . . . . . .

34

2.4

Группировочные запросы. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

39

2.5

Перекрестные запросы. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

48

3 ЗАПРОСЫ К БАЗЕ ДАННЫХ. . . . . . . . . . . . . . . . . . . . .

. . . . . . .

56

3.1

Особенности ведения информации в таблицах. . . . . .

. . . . . . .

56

3.2

Запросы на выборку из базы данных . . . . . . . . . . . . .

. . . . . . . .

62

3.3

Статистические выборки. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . .

68

4 СПЕЦИАЛЬНЫЕ ВИДЫ ЗАПРОСОВ. . . . . . . . . . . . . .

. . . . . . .

82

4.1

Запросы на поиск записей без подчиненных. . . . . . . .

. . . . . . .

82

4.2

Запросы - действия. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

82

4.2.1 Запросы на создание таблиц. . . . . . . . . . . . . . . . . . .

. . . . . . . .

83

4.2.2 Запросы на добавление записей. . . . . . . . . . . . . . . . .

. . . . . . .

84

4.2.3 Запросы на обновление данных . . . . . . . . . . . . . . . .

. . . . . . . .

87

4.2.4 Запросы на удаление записей . . . . . . . . . . . . . . . . . .

. . . . . . .

88

4.3

Запросы SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

90

4.4

Работа с архивом данных. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

90

4.5

Работа с итоговым файлом данных . . . . . . . . . . . . . . .

. . . . . . .

94

5 ОПТИМИЗАЦИЯ ЗАПРОСОВ. . . . . . . . . . . . . . . . . . . .

. . . . . . . .

99

5.1

Этапы оптимизации обработки запросов . . . . . . . . . .

. . . . . . .

99

5.2

Устранение неопределенных значений . . . . . . . . . . . .

. . . . . . .

100

5.3

Сравнительные запросы . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

101

ЗАКЛЮЧЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

112

ЛИТЕРАТУРА . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

113

Приложение А Описание базы данных . . . . . . . . . . . . . .

. .

114

Приложение Б Результаты расчета зарплаты . . . . . . . .

. . . . . . . .

115

Приложение В Операторы и функции СУБД Microsoft Access . . .

118

СОКРАЩЕНИЯ И УСЛОВНЫЕ ОБОЗНАЧЕНИЯ

БД, РБД база данных реляционная БЗО бланк запроса по образцу выр выражение Д_рожд поле Дата_рождения знач значение ИД источник данных

Код_с поле Код_сотрудника КТ конструктор таблицы От поле Отчество П поле Подразделение

ПВ построитель выражений ПП программное приложение т реляционная таблица Таб_н табельный номер тД таблица тДолжности тН таблица тНазначения

тП таблица тПодразделения тРП таблица тРаботаПлан тРФ таблица тРаботаФакт тС таблица тСотрудники зЧ запрос Численность тШ таблица тШтаты Фам поле Фамилия

DQL – Data Query Language, язык запросов к данням MS – корпорация Microsoft

SQL – Structured Query Language, структурированный язык запросов

4

Приложение В

Операторы и функции СУБД Microsoft Access

Оператор * (звездочка) возвращает произведение двух чисел. Синтаксис результат = операнд1 * операнд2

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

Из этого правила существуют следующие исключения:

при умножении операндов типа Single и Long результат преобразуется к типу

Double**;

если результат должен получить значение типа Long, Single или Date, выходящее за рамки допустимого для этого типа диапазона значений, то результат преобразуется к типу

Double;

если результат должен получить значение типа Integer, выходящее за рамки допустимого для этого типа диапазона значений, то результат преобразуется к типу Long;

если один или оба операнда является выражением со значением Null, то результат получает значение Null;

любой операнд со значением Empty рассматривается как значение 0.

Оператор + (плюс) возвращает сумму двух чисел или сцепление двух строк. Синтаксис результат = операнд1 + операнд2 Выполняемая операция определяется типом операндов.

Сложение выполняется если

оба операнда имеют числовые типы данных;

одно выражение имеет числовой тип данных, а другое – тип Variant (не Null). Сцепление выполняется если

оба выражения имеют тип String;

одно выражение имеет тип String, а другое – тип Variant (не Null).

Если одно из выражений типа Variant содержит значение Empty, то результат получает значение второго операнда.

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

Если хотя бы один из операндов имеет значение Null, результат имеет значение Null.

Оператор / (наклонная черта) возвращает результат деления двух действительных

чисел.

Синтаксис результат = операнд1 / операнд2 Операндами могут быть любые числовые выражения, результат обычно имеет тип

данных Double или Variant вида Double. Из этого правила существуют следующие исключения:

если оба операнда являются выражениями типа Integer или Single, результат получает значение типа Single, если при этом результат не выходит за рамки допустимого для этого типа диапазона значений; в последнем случае результат имеет тип Double;

если оба операнда являются выражениями типа Integer или Single, то результат получает значение типа Single, если при этом результат не выходит за рамки допустимого для этого типа диапазона значений; в последнем случае результат имеет тип Double;

если один или оба операнда является выражением со значением Null, то результат имеет значение Null.

Любой операнд со значением Empty рассматривается как значение 0.

118

Оператор – (минус) возвращает либо разность двух чисел, либо значение с измененным знаком.

Синтаксис 1 результат = операнд1 - операнд2 Синтаксис 2 -число

Всинтаксисе 1 оператор - является арифметическим оператором вычитания, возвращающим разность двух чисел. Операндами могут быть любые числовые выражения.результат обычно имеет тип данных операнда с максимальной точностью. В порядке возрастания точности следуют типы Integer, Long, Single, Double, Currency. Если операнды являются выражениями типа Variant, то вместо этого порядка действуют следующие правила:

– если операнды имеют типы Single и Long, результат преобразуется к типу Double.

– если результат должен получить значение типа Long, Single или Date, выходящее за рамки допустимого для этого типа диапазона значений, то результат преобразуется к типу

Double.

– если результат должен получить значение типа Integer, выходящее за рамки допустимого для этого типа диапазона значений, то результат преобразуется к типу Long.

– если один или оба операнда является выражением со значением Null, то результат имеет значение Null.

– операнд со значением Empty рассматривается как значение 0.

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

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

– при сложении чисел типа Single и Long результат преобразуется к типу Double.

– если результат должен получить значение типа Long, Single или Date, выходящее за рамки допустимых для этих типов диапазонов значений, то результат преобразуется к типу Double.

– если результат должен получить значение типа Integer, выходящее за рамки допустимого для этого типа диапазона значений, то результат преобразуется к типу Long.

– если один или оба операнда является выражением со значением Null, то результат имеет значение Null.

– если оба операнда имеют значение Empty, результат имеет значение Empty;

– если значение Empty имеет только один из операндов, результат получает значение второго операнда.

Оператор \ (обратная наклонная) используется для целого деления двух целых чисел; возвращает значение типа Integer или Long.

Синтаксис результат = операнд1 \ операнд2 Операндами могут быть любые числовые выражения.

Перед выполнением деления значения операндов округляются до целых значений типа Integer или Long.Обычно, результат имеет тип данных Integer, Long. Дробный остаток при делении отбрасывается.

Если один или оба операнда является выражением со значением Null, то результат имеет значение Null.

Любой операнд со значением Empty рассматривается как значение 0.

Оператор ^ возводит число в степень. Синтаксис результат = число ^ показатель

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

119

Стоящие рядом в выражении несколько операторов возведения в степень ( ^ ) выполняются слева направо.

Обычно результат имеет тип данных Double.

Если любой из операндов имеет значение Null, то результат получает значение Null.

Оператор Mod возвращает остаток при целом делении двух чисел (значение по модулю).

Синтаксис результат = операнд1 Mod операнд2

Выполняется деление по модулю (нахождение остатка) для чисел операнд1 и операнд2 (с округлением действительных чисел до целых). результат получает значение остатка. Например

A = 19 Mod 6.7 (А=5):

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

Если один или оба операнда является выражением со значением Null, то результат имеет значение Null.

Любой операнд со значением Empty рассматривается как значение 0.

Операторы сравнения используются для сравнения двух выражений. Синтаксис результат = exp1 operator exp2

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

Оператор

Выражение

True, если

False, если

<

Меньше чем

exp1 < exp2

exp1 >= exp2

<=

Меньше или равно

exp1 <= exp2

exp1 > exp2

>

Больше чем

exp1 > exp2

exp1 <= exp2

>=

Больше или равно

exp1 >= exp2

exp1 < exp2

=

Равняется

exp1 = exp2

exp1 <> exp2

<>

Не равняется

exp1 <> exp2

exp1 = exp2

Если хотя бы одно из выражений неопределенно (Null), то результат для любого оператора будет неопределен (Null).

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

Если хотя бы одно из выражений не принадлежит к типу Variant, то сравнение чисел происходит если.

оба выражения имеют числовой тип данных;

одно выражение имеет числовой тип, а другое тип Variant числового вида или String, допускающий преобразование к числовому;

одно выражение имеет значение Empty, а другое числовой тип.

Сравнение строк происходит если:.

одно выражение имеет тип String, а другое тип Variant вида String;

оба выражения имеют тип String;

одно выражение имеет значение Empty, а другое тип String.

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

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

Если оба выражения принадлежат к типу Variant, то тип сравнения определяется значениями VarType. Ниже показано, как осуществляется сравнение в зависимости от значения VarType типа Variant.

120

Оба выражения типа Variant имеют значения VarType 2-7

 

 

(числовые типы данных)

 

Сравнение чисел.

Одно выражение типа Variant имеет значение Empty, а другое

 

VarType 2-7 (числовой тип данных)

 

Сравнение чисел.

Оба выражения типа Variant имеют значения VarType 8 (String)

Сравнение строк.

Одно выражение типа Variant имеет значение Empty,

 

 

а другое VarType 8 (String)

 

Сравнение строк.

Оба выражения типа Variant имеют значение Empty

Выражения считаются равными.

Если одно выражение типа Variant имеет значение VarType 2-7 (числовой тип данных), а другое VarType 8 (String), то числовое выражение считается меньшим, чем выражение типа String.

При сравнении значения типа Currency со значениями типа Single или Double, значение типа Single или Double преобразуется к типу Currency. При этом дробные части меньшие чем 0.0001 в значениях типа Single или Double отбрасываются. Такое преобразование может привести к ошибке переполнения, если значения типа Single или Double достаточно велики.

Оператор & используется для слияния двух строковых значений. Синтаксис результат = операнд1 & операнд2

Если операнд является числом, то он преобразуется к типу String.

Если оба операнда являются выражениями типа String, то результат имеет тип данных String; в противном случае результат имеет тип String.

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

Любой операнд со значением Empty также рассматривается как пустая строка.

Оператор And возвращает результат конъюнкции (логического И) для двух выражений.

Синтаксис результат = exp1 And exp2

Если и только если оба выражения истинны (имеют ненулевое значение), результат имеет значение True (-1). Если хотя бы одно из выражений ложно (0), результат имеет значение False (0). Возвращаемые оператором значения представлены в следующей таблице.

exp1

exp2

результат

истина (ненул. значение)

истина

True (-1)

истина

ложь (0)

False (0)

истина

Null

Null

ложь

истина

False

ложь

ложь

False

ложь

Null

False

Null

истина

Null

Null

ложь

False

Null

Null

Null

Оператор And выполняет также поразрядное сравнения двух числовых выражений и присваивает каждому разряду в переменной результат следующее значение.

Разряд в exp1

Разряд в exp2

Результат

0

0

0

0

1

0

1

0

0

1

1

1

Поразрядное сравнение допускается только в инструкциях Access Basic.

121

Оператор Eqv используется для проверки логической эквивалентности двух выражений.

Синтаксис результат = exp1 Eqv exp2

Если хотя бы одно из выражений имеет значение Null, результат также имеет значение Null.

Если ни одно из выражений не имеет значение Null, результат имеет значения,

представленные в следующей таблице.

 

exp1

exp2

результат

истина (ненул.значение) истина

True (-1)

истина

ложь (0)

False (0)

ложь

истина

False

ложь

ложь

True

Оператор Eqv выполняет также поразрядное сравнения двух числовых выражений и

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

Разряд в exp1

Разряд в exp2

Результат

0

0

1

0

1

0

1

0

0

1

1

1

Поразрядное сравнение допускается только в инструкциях Access Basic.

Оператор Imp вполняет операцию логической импликации для двух выражений. Синтаксис результат = exp1 Imp exp2

Пояснения Возвращаемые оператором значения представлены в следующей таблице.

exp1

exp2

результат

истина (ненул.значение)

истина

True (-1)

истина

ложь (0)

False (0)

истина

Null

Null

ложь

истина

True

ложь

ложь

True

ложь

Null

True

Null

истина

True

Null

ложь

Null

Null

Null

Null

Оператор Imp выполняет также поразрядное сравнения двух числовых выражений и присваивает каждому разряду в переменной результат следующее значение.

Разряд в exp1

Разряд в exp2

Результат

0

0

1

0

1

1

1

0

0

1

1

1

Поразрядное сравнение допускается только в инструкциях Access Basic.

Оператор Not изменяет знак числового выражения. Синтаксис результат = Not exp

Оператор возвращает следующие значения

exp

результат

истина (ненул. значение)

False (0)

ложь (0)

True (-1)

Null

Null

Оператор Not выполняет также поразрядное изменение значений каждого разряда и

122

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

Разряд в exp

Разряд в результат

0

1

1

0

Not обращает значения разрядов для любых переменных. Если целая переменная имеет значение 0 (False), она получает значение -1 (True); если переменная имеет значение - 1, она получает значение 0. Однако, поразрядные операции с оператором допускаются только в инструкциях Not.

Оператор Or выполняет операцию логического сложения для двух выражений. Синтаксис результат = exp1 Or exp2

В зависимости от выражений оператор возвращает следующие значения.

exp1

exp2

результат

истина (ненул.значение) истина

True (-1)

истина

ложь (0)

True

истина

Null

True

ложь

истина

True

ложь

ложь

False (0)

ложь

Null

Null

Null

истина

True

Null

ложь

Null

Null

Null

Null

Оператор Or выполняет также поразрядное сравнения двух числовых выражений и

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

Разряд в exp1

Разряд в exp2

результат

0

0

0

0

1

1

1

0

1

1

1

1

Поразрядное сравнение допускается только в инструкциях Access Basic.

Оператор Xor выполняет операцию исключающего ИЛИ для двух выражений. Синтаксис результат = exp1 Xor exp2

Оператор Xor является оператором исключающего Or (ИЛИ). Он возвращает результат True (-1), если одно из выражений истинно, а другое ложно. Если хотя бы одно из выражений имеет значение Null, результат также имеет значение Null. Если ни одно из выражений не имеет значение Null, результат имеет значения, представленные в следующей

таблице.

 

 

exp1

exp2

результат

истина (ненул. значение)

истина

False (0)

истина

ложь (0)

True (-1)

ложь

истина

True

ложь

ложь

False

Оператор Xor выполняет также поразрядное сравнения двух числовых выражений и присваивает каждому разряду в переменной результат следующее значение.

Разряд в exp1

Разряд в exp2

Результат

0

0

0

0

1

1

1

0

1

1

1

0

Поразрядное сравнение допускается только в инструкциях Access Basic.

123

Оператор Like ипользуется для сравнения двух строковых выражений в инструкциях Access Basic или в выражении.

Синтаксис Access Basic: результат = выражение Like образец Выражение: Like "образец"

Оператор Like используют для поиска в поле значений, совпадающих с указанным образцом. Допускается как точное указание аргумента образец (например, Like "Вася"), так и использование поддерживаемых операционной системой операторов шаблона, определяющих диапазон значений (например, Like "Вас*").При подстановке в выражение оператор Like позволяет сравнивать значение поля со строковым значением. Например, при вводе в ячейку "Условие отбора" бланка запроса QBE выражения Like "C*" в запросе будут выведены все поля, содержимое которых начинается с буквы "C". В запросе с параметрами допускается вывод для пользователя приглашения ввести образец поиска. Предположим, что в ячейку строки "Условие отбора" бланка запроса QBE введено следующее выражение:

Like [Введите первые буквы фамилии:]&"*"

При выполнении запроса будет открыто окно диалога с надписью над полем "Введите первые буквы фамилии". Если пользователь введет в поле буквы Ив, то в запросе будет выполняться поиск по образцу "Ив*" (т.е. будут найдены все фамилии, начинающиеся с букв

"Ив").

Оператор Like используют также в выражениях, задающих значение свойства Условие на значение (ValidationRule) или условия в макросе. В следующем примере возвращаются значения госномеров автомобилей, начинающиеся с буквы "А", за которой следуют буква от "A" до "Н" и три цифры:

Like "А[A-Н]###"

Для ссылки на значение элемента управления необходимо заключать идентификатор в прямые кавычки (" ") и символы вертикальной черты(| |). Например, предположим, что требуется задать в форме "Печать заказов" условия отбора для отчета "Заказы". Для этого следует ввести в поле "Код заказа" значение, позволяющее отобрать либо группу заказов, либо конкретный заказ. В запросе, на базе которого создан отчет, можно задать условия отбора для поля "Код заказа" в виде:

Like "|[Формы]![Печать заказов]![Код заказа]|"

Если в выражение не будут включены символы вертикальной черты, то оператор Like буде возвращать не значение, а имя элемента управления.В инструкциях Access Basic, если выражение совпадает с аргументом образец, то переменная результат получает значение True (-1); если совпадения нет, результат равен False (0); а если любое из значений выражение или образец является пустым (Null), то результат также получает значение Null. Учет регистра символов и порядок сортировки символов в операторе Like определяются настройками, задаваемыми в инструкции Option Compare. Если модуль не содержит инструкцию Option Compare, то по умолчанию при сравнении строковых значений используется метод Binary.

Оператор Between...And определяет принадлежность значения указанному диапазону значений.

Синтаксис выражение [Not] Between значение1 And значение2

где выражение определяет поле, значение которого проверяется на принадлежность к диапазону;

значение1, значение2 – по выражения, задающие границы диапазона.

Если значение поля (выражение), попадает в диапазон, задаваемый аргументами значение1 и значение2 (включительно), оператор возвращает значение True (-1) ("Истина"); в противном случае возвращается значение False (0) ("Ложь").

Допускается проверка с помощью логического оператора Not обратного условия, когда выражение не принадлежит диапазону значение1 - значение2.

Оператор часто используют для проверки, попадает ли значение элемента управления в указанный диапазон чисел. В следующем примере проверяется значение поля "Заказано" и,

124

если количество единиц в заказе попадает в диапазон 1 - 20, заказ классифицируется как мелкий. Остальные заказы считаются крупными.

=IIf([Заказано] Between "1" And "20", "Мелкий", "Крупный")

Если или выражение, или значение1, или значение2 имеет значение Null, то оператор возвращает значение Null.

Оператор In проверяет значение выражения на совпадение с любым из элементов указанного списка.

Синтаксис выражение [Not] In(значение1, значение2, . . .)

где выражение определяет поле, значение которого проверяется на принадлежность к списку;

значение1, значение2 – выражение или список выражений, с которыми сравнивается выражение.

Если содержимое поля выражение совпадает со значением одного из элементов списка, оператор возвращает значение True (-1) ("Истина"); в противном случае возвращается False (0) ("Ложь").

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

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

=IIf([Город получателя] In ("Донецк","Киев","Львов"), "Выполнен", "Не выполнен") Если выражение или какой-либо из элементов списка имеет значение Null, то

оператор возвращает значение Null.

Оператор Is используется вместе с зарезервированным словом Null для проверки, является ли значение пустым (Null).

Синтаксис выражение Is [Not] Null

Пример проверки значения віражения. =IIf(Выр Is Null, "", Выр])

Если выр имеет значение Null, функция IIf возвращает значение "Пустой"; в противном случае возвращается значение элемента управления.

Допускается проверка с помощью логического оператора Not обратного условия (т.е того, что значение выражения не является пустым (Null)).

Примечания

* В порядке возрастания точности чисел следуют типы Integer, Long, Single, Double, Currency.

**Переменные, в именах которых нет символа описания типа и отсутствует действующая инструкция описания типа Def <тип>, получают по умолчанию тип Variant. Это позволяет сохранять значения различного типа. Для типа Variant существуют следующие виды (подтипы, VarType)

0Empty

1Nul

2Integer

3Long

4Single

5Double

7Date

8String

125

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]