Главная | Обратная связь
МегаЛекции

Изменение структуры таблицы





Введение

 

Базу данных можно определить как совокупность взаимосвязанных хранящихся вместе данных при наличии такой минимальной избыточности, которая допускает их использование оптимальным образом для одного или нескольких приложений; данные запоминаются так, чтобы они были независимы от программ, использующих эти данные; для добавления новых или модификации существующих данных, а также для поиска данных в базе данных применяется общий управляемый способ. Данные структурируются таким образом, чтобы была обеспечена возможность дальнейшего наращивания приложений [9].

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

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

Целью разработки любой базы данных является хранение и использование информации о какой-либо предметной области. Для реализации этой цели имеются следующие инструменты:

- реляционная модель данных – удобный способ представления данных предметной области;

- язык SQL – универсальный способ манипулирования такими данными.

Язык SQL стал фактически стандартным языком доступа к базам данных. Все СУБД, претендующие на название "реляционные", реализуют тот или иной диалект SQL. Многие нереляционные системы также имеют в настоящее время средства доступа к реляционным данным.



Язык SQL оперирует терминами, несколько отличающимися от терминов реляционной теории, например, вместо "отношений" используются "таблицы", вместо "кортежей" – "строки", вместо "атрибутов" – "колонки" или "столбцы".

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

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

Методические указания состоят из пяти лабораторных работ по разработке, наполнению и редактированию баз данных посредством языка SQL. Лабораторные работысостоят из заданий, соответ­ствующих основным разделам учебной программы по специальности 230201 – "Информационные системы и технологии". Каждое из заданий сопровождается подробными методическими указаниями по их выполнению и пошаговому осуществлению команд.

Студентам необходимо ознакомится с теорией создания баз данных и основными элементами языка SQL, приведенными в данных указаниях, и затем разработать базу данных по предложенным вариантам (прил.), а также ответить на контрольные вопросы и оформить отчеты по результатам проделанных работ.

 

 


Лабораторная работа № 1.

РАБОТА С БАЗАМИ ДАННЫХ И ТАБЛИЦАМИ MS SQL SERVER

 

Цель работы

- Закрепление теоретических знаний по базам данных и таблицам.

- Приобретение практических навыков по созданию, изменению и удалению баз данных и таблиц.

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

 

Теоретическая часть

Работа с базой данных

Любая база данных SQL Server состоит из набора таблиц с данными и дополнительных объектов, предназначенных для управления данными. К та­ким объектам относятся, например, представления, триггеры, хранимые проце­дуры и функции пользователя. Таблицы для хранения данных создаются в соот­ветствии с логическим определением данных, например, данные об имеющихся на складе товарах хранятся в одной таблице, а список персонала – в другой.

SQL Server предлагает несколько путей создания баз данных:

- использование Enterprise Manager. Для создания базы данных с помощью Enterprise Manager в контекстном меню папки Databases на нужном сервере выберите команду New Database (Новая база данных). Также создание можно выполнить с помощью мастера Create Database Wizard. В панели инструментов Enterprise Manager щелкните на кнопке Run a Wizard (Запустить мастера) и выберите нужного мастера.

- использование Transact-SQL. Используется утилита QueryAnalyzer. Этот метод предполагает выполнение команды CREATE DATABASE.

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

Перед созданием базы данных необходимо знать, что:

- пользователь, создающий базу данных, автоматически становится ее владельцем;

- имя (название) базы данных должно соответствовать правилам именования объектов.

Для хранения базы данных используются три типа файлов.

Primary – первичный файл. Каждая база данных обязательно имеет такой файл, причем только один. В этом файле хранится системная информация о базе данных и ее объектах. Здесь же размещаются системные таблицы. Кроме того, в первичном файле могут храниться и пользовательские данные. По умолчанию этот файл имеет расширение .mdf.

Secondary – вторичный файл. Здесь содержатся пользовательские данные, не поместившиеся в первичном файле. Если база данных небольшая и нет надобности создавать вторичные файлы, то всю информацию можно хранить в первичном файле. Однако если база данных имеет большие размеры, можно иметь несколько вторичных файлов, причем для удобства работы с данными эти файлы можно хранить на разных дисках. По умолчанию вторичные файлы имеют расширение .ndf.

Transaction Log – файл журнала транзакций. Минимальный размер такого файла 512 Кбайт. База данных должна иметь, по крайней мере, один файл журнала транзакций. В этом файле будет храниться информация о транзакциях, выполняемых в базе данных. По умолчанию файлам журнала транзакций присваивается расширение .ldf.

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

Первой задачей, с которой сталкивается администратор при реализации разра­ботанной на бумаге базы данных (включая и все ее объекты), является ее созда­ние. С помощью Enterprise Manager не всегда удается получить доступ ко всем возможностям создания баз данных, предлагаемым SQL Server. Эти возможности доступны только при непосредственном исполь­зовании команд Transact-SQL.

При работе с Transact-SQL создание базы данных выполняется с помощью ко­манды CREATE DATABASE, имеющей следующий синтаксис:

CREATE DATABASE database_name

[ ON [ PRIMARY ]

[ < filespec >]

[ , < filegroup >]

[ LOG ON { < filespec > } ]

Как видно из синтаксиса и как было сказано выше, при создании базы данных обя­зательным является лишь указание ее имени. Все остальные параметры могут быть опущены, но все же рассмотрим подробно назначение каждого из пара­метров команды CREATE DATABASE.

- database_name. Имя, которое будет присвоено создаваемой базе данных. При выборе имени следует следовать общим правилам именования объектов. Если имя базы данных содержит пробелы или другие недопустимые символы, оно должно быть заключено в ограничители (двойные кавычки или квадратные скобки). Имя базы данных должно быть уникальным в пределах сервера и не может превышать 128 символов. Если имя журнала транзакций явно не ука­зано, то сервер укорачивает имя базы данных таким образом, чтобы оно не превышало 123 символов. Это делается из-за того, что сервер по умолчанию использует для имени журнала транзакций имя базы данных и добавляет к нему в конце символы "_Log".

- ON. После этого ключевого слова указывается описание файлов базы данных.

- PRIMARY. Это ключевое слово свидетельствует, что описываемый далее файл является первичным файлом базы данных. Напомним, что в этом файле хра­нятся все системные данные и таблицы. Только один файл в базе данных может быть первичным. Если первичный файл не определен явно, то в этом каче­стве будет использоваться первый файл, указанный в конструкции <filespec>. Группа файлов, в которую включен первичный файл, называется первичной группой файлов (primary file group). Первичная группа назначается группой файлов по умолчанию (default file group), то есть в нее включаются все файлы, для которых явно не указана целевая группа файлов.

- LOG ON. Указание этого ключевого слова означает, что файлы журнала тран­закций будут определены явно. После слов LOG ON должно следовать опреде­ление файлов журнала транзакций. Если это ключевое слово отсутствует, то есть пользователь не задает явно файлы журнала транзакций, то сервер авто­матически создает единственный файл размером 25 % от суммарного размера файлов данных, но не менее 512 Кбайт. Имя файла генерируется на основе имени базы данных, но в конце к нему добавляются символы "_Log".

Как видно из синтаксиса команды CREATE DATABASE и уже рассмотренных параметров этой команды, при создании базы данных можно определить набор файлов, из которого будет состоять создаваемая база данных.

Пример 1CREATE DATABASE GISON (NAME = Names_dat, FILENAME = 'c:\program files\microsoft sql server\mssql\data\prods.mdf', SIZE = 4, MAXSIZE = 10,

FILEGROWTH = 1)

В этом примере создаем базу данных с именем GIS. Так как в параметрах SIZE мы не указали MB или KB, то размерность устанавливается по умолчанию в Мб.

После выполнения получаем сообщение:

 

The CREATE DATABASE process is allocating 4.00 MB on disk 'Names_dat'.The CREATE DATABASE process is allocating 1.00 MB on disk 'GIS_log'.

 

Первая строка подтверждает, что для нашей базы данных в памяти зарезервировано пространство, не превышающее 4 Мб. Файлы журнала транзакций не будут определены явно, так как не указали ключевое слово Log on. Сервер автоматически создал единственный файл размером 25 % от суммарного размера файлов данных, то есть 1 Мб.

 

Пример 2

CREATE DATABASE Kafedra_1

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

 

Удаление баз данных

Для удаления базы данных используется следующая команда:

DROP DATABASE database_name […..n]

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

Пример 3.

DROP DATABASE Kafedra_1.

2.4. Работа с таблицами

Вся хранящаяся в базе данных пользовательская информация содержится в объектах, называемых таблицами (tables).

Таблицы имеют следующую структуру.

- Столбцы (column). Каждый столбец представляет собой атрибут или совокуп­ность атрибутов объектов, например идентификационные номера служащих, рост, цвет машин и т.п. Часто в отношении столбца используется термин поле с указанием имени, например "в поле Name".

- Строки (rows). Каждая строка (или запись) представляет собой совокупность атрибутов конкретного объекта, например, в строке может содержаться иден­тификационный номер служащего, размер оклада этого служащего, год его рождения, цвет глаз и т. п. Строки таблиц не именуются.

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

Виды таблиц:

- Системные таблицы. SQL Server хранит данные, определяющие конфигурацию сервера и всех его баз данных, в специальном наборе таблиц, известном как системные таблицы (system tables). Следует разделять данные, относящиеся к серверу, и данные, относящиеся к конкретной базе данных. Первые хранятся в системной базе данных master, тогда как вторые – в соответствующей базе данных.

Поскольку данные, хранящиеся в системных таблицах, играют весьма важную роль в работе сервера, необходимо обезопасить их от удаления или неверного изменения. Поэтому пользователь не должен напрямую вносить изменения в системные таблицы. По умолчанию прямой доступ к системным таблицам (то есть доступ посредством команд INSERT, UPDATE и DELETE) запрещен. Тем не менее с помощью запроса SELECT пользователи могут реализовать непосредственную выборку дан­ных из системных таблиц.

Для изменения данных в системных таблицах необходимо использовать специ­альные системные хранимые процедуры, поставляемые вместе с SQL Server и расположенным в базе данных master. Другой альтернативой является примене­ние приложений, использующих интерфейс SQL-DMO API. Имеющийся набор храни­мых процедур охватывает практически все возможные ситуации управления сер­вером и базами данных, так что необходимость прямого доступа к системным таблицам почти полностью исключена. Кроме того, использование в прикладных приложениях хранимых процедур позволяет гарантировать, что работоспособность программы сохранится даже в случае возможного изменения структуры систем­ных таблиц в следующих версиях SQL Server.

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

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

- Локальные временные таблицы (local temporary tables). Названия этих таблиц начинаются с одного символа #, например #results. Таким образом, для созда­ния локальной временной таблицы необходимо перед именем таблицы при ее создании указать один символ #. В дальнейшем для ссылки на созданную таб­лицу в ее имени также необходимо указывать символ #.

Локальные временные таблицы существуют до тех пор, пока существует со­единение со SQL Server, в котором эти таблицы были созданы, и автоматичес­ки уничтожаются при его закрытии.

- Глобальные временные, таблицы (global temporary tables). Доступ к временным таблицам этого типа может быть получен из любого соединения, установлен­ного с текущим сервером, и независимо от того, в каком именно из этих соеди­нений была создана глобальная временная таблица. При этом также не важно, какой конкретно пользователь создал эту временную таблицу и в контексте какой базы данных.

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

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

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

- какие данные, каких типов должны быть включены в таблицы?

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

- какие столбцы могут содержать значения NULL?

- будут ли использованы ограничения целостности или значения по умолчанию и правила для столбцов и если будут, то где?

- необходимо ли индексирование столбцов? Если да, то какие типы индексов, для каких столбцов будут применены?

- какие столбцы будут входить в первичные и внешние ключи?

Типы данных

Одним из свойств столбца является его тип данных. Поскольку каждый столбец представляет один признак объекта, данные в каждом столбце подобны, то есть тип данных значений, хранящихся в одном и том же столбце, одинаков. SQL Server имеет набор встроенных типов данных, называемых системными. Этот набор приведен в табл. 1.

Таблица 1.

Типы данных, используемые в SQL Server 2000

Тип данных Описание
bit Один бит. В столбце с этим типом может храниться либо 0, либо 1
binary(n) Двоичные данные фиксированной длины до 8000 байт
varbinary(n) Двоичные данные переменной длины до 8000 байт
Image Двоичные данные длиной до 2 Гбайт. Пространство для хранения данных этого типа отводится страницами, размер которых составляет 8 Кбайт
decimal Используется для хранения дробных чисел с фиксированным количеством знаков до и после десятичной точки
numeric Является аналогом типа данных decimal
float(n) Используется для хранения дробных чисел с приблизительной точностью
real Является аналогом float (24)
int Занимает 4 байта и может хранить целые числа в диапазоне от -231 до 231-1
smallint Небольшое целое. Занимает 2 байта и может хранить целые числа в диапазоне от -215 до 215-1 (от -32 768 до 32 767)
tinyint Маленькое целое. Занимает 1 байт и может хранить целые числа в диапазоне от 0 до 255
bigint Большое целое. Занимаете байт и может хранить целые числа в диапазоне от -263 до 263-1
char(n) Строковый тип данных фиксированной длины без поддержки Unicode длиной до 8000 символов
nchar(n) Строковый тип данных фиксированной длины с поддержкой Unicode длиной до 4000 символов
  Окончание таблицы 1
varchar(n) Строковый тип данных переменной длины без поддержки Unicode длиной до 8000 символов
nvarchar(n) Строковый тип данных переменной длины с поддержкой Unicode длиной до 4000 символов
text Строковый тип данных без поддержки Unicode длиной до 2 миллиардов символов. Пространство для хранения данных этого типа отводится страницам, размер которых составляет 8 Кбайт
ntext Строковый тип данных с поддержкой Unicode длиной до 1 миллиарда символов. Пространство для хранения данных этого типа отводится страницам, размер которых составляет 8 Кбайт
datetime Тип данных для хранения даты и времени с высокой точностью в диапазоне от 1 января 1753 года и до 31 декабря 9999 года, занимающий 8 байт
small datetime Тип данных для хранения даты и времени с нормальной точностью в диапазоне с 1 января 1900 года и до 6 июня 2079 года, занимающий 4 байт
money Используется для хранения денежных данных в большом диапазоне. Обеспечивает точность до 4 знаков после десятичной точки и занимает 8 байт
smallmoney Используется для хранения денежных данных в нормальном диапазоне. Обеспечивает точность до 4 знаков после десятичной точки и занимает 4 байта
sql_variant Тип данных, позволяющий хранить данные нескольких типов в одном и том же столбце. Например, при использовании этого типа данных в столбце могут одновременно находиться данные целочисленные, дробные, символьные и др.
sysname Этот тип данных, по сути, является не встроенным, а пользовательским (user-defined data type), создаваемым в системных базах данных автоматически при установке SQL Server 2000. Используется для указания имен объектов.
timestamp Временной штамп. Значения в столбце этого типа изменяются SQL Sewer 2000 автоматически при каждом изменении строки. Для типа данных timestamp также можно использовать псевдоним rowversion
table Этот тип данных предназначен для временного хранения сложных наборов данных. Поддерживается создание переменных типа table. Кроме того, функции пользователя могут возвращать значения типа table, что предоставляет широкие возможности для разработчиков. Однако тип данных table не может использоваться для столбцов таблицы. Он подходит только для переменных Transact-SQL, параметров хранимых процедур и для значений, возвращаемых функциями пользователя
uniqueidentifier Используется для хранения глобальных уникальных идентификаторов (Global Unique Identifier, GUID)
cursor Предназначен для хранения ссылок на курсоры.

Итак, каждый столбец таблицы должен содержать данные, соответствующие типу данных столбца. Например, допускается неявное преобразование типа данных int в тип данных decimal или значений типа данных varchar в значения типа данных char. При необходимости можно использовать функции преобразования типов данных.

Значение NULL

NULL – это специальное значение, представляющее собой отсутствие любого значения. NULL – это не то же самое, что знак пробела или ноль. Пробел – это допустимый символ, а 0 – допустимое число. NULL также отличается от строки нулевой длины (пустой строки).

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

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

Создание таблицы выполняется при помощи команды CREATE TABLE. Данная команда имеет довольно сложный синтаксис:

CREATE TABLE

[database_name.[ owner ] . | owner. ] table_name

( { <column_definition>

| column_name AS computed_co1umn_expression

I < table_constraint > } [ __n ]

)

[ ON { filegroup | DEFAULT } ]

Рассмотрим последовательно все ее параметры.

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

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

- table_name – имя создаваемой таблицы. При выборе имени для таблицы необходимо следовать стандартным правилам формирования идентификаторов объектов. Комбинация имени таблицы и ее владельца (owner.tablename) должна быть уникальной в пределах базы данных. Если таблица создается не в текущей базе данных, необходимо включить в описание имени таблицы ссылку на требуемую базу данных. Длина имени таблицы не должно превышать 128 символов. Если в начале имени указываются символы # или ##, то будут созданы соответственно локальная и глобальная временные таблицы. Длина имен временных таблиц, включая символы # и ##, не должна превышать 116 символов.

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

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

- ON {filegroup | DEFAULT} – обозначает группу файлов, в которой предполагается хранить таблицу. Данная файловая группа уже должна существовать для базы данных. Если указан идентификатор DEFAULT или описанный параметр не определяется вообще, таблица будет сохранена в файловой группе по умолчанию. Помимо собственно таблицы параметр ON {filegroup | DEFAULT} может быть указан и для ограничений целостности PRIMARY KEY и UNIQUE. Для работы этих ограничений SQL Server автоматически создает индекс, который и будет расположен в указанной группе файлов. Если явно не указано, в какой группе файлов следует хранить данные индекса, то они будут сохранены в той же группе файлов, что и сама таблица.

Рассмотрим пример создания таблицы "Students", содержащей такие столбцы, как: "ID" – первичный ключ, идентификатор записи; "Name" – имя студента; "Surname" – отчество студента; "Birth" – дата рождения студента; "_ID_Group" – идентификатор группы студента:

Пример 4.

USE Kafedra

CREATE TABLE Students (

ID int IDENTITY (1, 1) PRIMARY KEY,

Name varchar (50) NOT NULL ,

Surname varchar (50) NOT NULL ,

Birth datetime NOT NULL ,

ID_Group int NOT NULL

)

 

Изменение структуры таблицы

Как бы тщательно не планировалась структура таблицы, все же иногда возникает необходимость ее изменения. Для этого существует команда ALTER TABLE. С ее помощью можно выполнять изменение свойств существующих столбцов, удалять их или добавлять в таблицу новые столбцы. Также имеется возможность управлять ограничениями целостности как на уровне столбца, так и на уровне таблицы. Назначение многих параметров и ключевых слов команды ALTER TABLE аналогично назначению соответствующих параметров и ключевых слов команды CREATE TABLE.

Рассмотрим пример добавления в таблицу "Students" поля "Family" – фамилия студента:

Пример 5.

USE Kafedra

ALTER TABLE Students

ADD Family varchar (50).

Удаление таблиц

Последняя операция, которую можно выполнить с таблицей, – это ее удаление. Удаление таблицы выполняется довольно просто – при помощи команды DROP TABLE, имеющей единственный аргумент с именем таблицы, которую необходимо удалить: DROP TABLE table_name.

Хотя команда DROP TABLE и является чрезвычайно простой, сама по себе операция удаления таблицы в некоторых случаях требует определенного внимания. Дело в том, что сервер не даст удалить таблицу, если на нее с помощью ограничения целостности FOREIGN KEY ссылается другая таблица. Помимо этого, удаление таб­лицы также будет невозможно, если на нее ссылаются объекты базы данных, со­зданные со связыванием схемы (то есть с параметром SCHEMABINDING). Поэтому не следует удивляться, если при попытке удаления таблицы будет выдано сообще­ние об ошибке.

Рассмотрим пример удаления таблицы "Students":

Пример 6.

USE Kafedra

DROP TABLE Students.





Рекомендуемые страницы:

Воспользуйтесь поиском по сайту:
©2015- 2020 megalektsii.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.