Перейти на главную страницу
по курсу “Базы данных”
Настоящее учебное пособие предназначено для поддержки практических занятий по курсам “Информационные технологии в экономике”, “Базы данных” и т.п., предполагающим изучение современных СУБД. В первой части учебника излагаются основы языка FoxPro (версия Visual 7.0), рассматриваются его основные команды и некоторые функции. Пособие может быть использовано для изучения FoxPro “с нуля” и полезно как справочник в практической работе.
ВВЕДЕНИЕ
Система управления базами данных (СУБД) FoxPro имеет славную и довольно давнюю по сегодняшним постиндустриальным меркам историю. Будучи прямым потомком dBase, FoxPro унаследовал от него структуру данных, а также мощный и удобный язык, каким не может похвастаться больше ни одна из всемирно известных СУБД. FoxPro оказался лакомым кусочком и был прибран к рукам фирмой Microsoft, что также само за себя говорит. Впрочем, в семействе Microsoft он так и остался слегка неродным… Тем не менее, добавленная в версии 3.0 visual’ность, развитая далее в версиях 5-7.0 (на сегодняшний момент) позволяет делать с данными и программами их обработки если не все, что угодно, то очень многое. Возможности его развития безграничны, с каждой версией появляется что-то новое, особенно в области интегрирования с другими программами и технологиями. И мне хотелось бы, чтобы читатели тоже оценили и полюбили “старый добрый Fox”.
Ключевые слова команд выделяются жирными заглавными буквами, например, CREATE.
Идентификаторы представлены мнемоническими обозначениями, например, ИмяТаблицы. Если для идентификатора имеет значение тип, то он упоминается в его названии, например, логВыражение.
Необязательные аргументы заключаются в квадратные скобки, например, [NOWAIT].
Выражение, набранное курсивом, например, база данных, имеет определение в соответствующем параграфе.
Все команды, для которых режим использования не оговаривается особо, могут выполняться в программном режиме либо из командного окна. Признак Меню (Пункты меню) означает, что команда может быть также выполнена с помощью соответствующего пункта меню.
Отдельные команды FoxPro удобно тестировать через командное окно (Window – Command Window или Ctrl+F2). При этом в командном окне записывается весь протокол вашей работы – как верные, так и неверные команды. Команды не обязательно набирать каждый раз заново – можно просто исправить старую строку и нажать Enter.
Список открытых таблиц удобно просматривать через окно сеанса данных (Window – Data sessions).
Для печати текущих значений переменных удобно использовать команду
Более экзотичный способ вывода текущей информации – команда
ТИПЫ ДАННЫХ
Ниже приведены типы данных для полей таблиц. Типы, отмеченные звездочками (*), могут использоваться также для переменных.
Тип поля |
Размер в байтах |
Пример |
Комментарий |
Character* |
Задается, не более 255 |
“строка1” ‘строка2’ [строка3]
|
Текст |
Currency* |
Фиксирован, 8 |
100.00 |
Денежный формат |
Numeric* |
Задается, не более 20 |
1 123.456
|
Числовой формат |
Float* |
Задается, не более 20 |
1e-5 123.456
|
Формат с плавающей точкой |
Date* |
Фиксирован, 8 |
{01.04.2002} (до версии 5.0) {^2001-04-01} (версия 6.0 и выше) |
Дата |
DateTime* |
Фиксирован, 8 |
{01.04.2002 12:00:00} (до версии 5.0) {^2001-04-01 12:00:00 a} (версия 6.0 и выше) |
Дата и время |
Double |
Фиксирован, 8 |
1e300 123.456
|
Формат с плавающей точкой двойной точности |
Integer |
Фиксирован, 4 |
123 |
Целое |
Logical* |
Фиксирован, 1 |
.t. .f. .T. .F. |
Логический тип |
Memo |
Фиксирован, 10 |
|
Текст произвольной длины. В DBF-файле хранится только ссылка на данные, сами данные записываются в файл с расширением FPT. |
General |
Фиксирован, 10 |
|
Ссылка на файл любого типа. |
время1 = время2 + секунды или
дата1 = дата2 + дни
– Вычитание
секунды = время1 – время1 или
время1 = время2 – секунды или
дата1 = дата2 - дни
ОПРЕДЕЛЕНИЯ
Для не слишком сложных команд (без вложенных запросов, без UNION) запрос можно редактировать с помощью визуального редактора.
– создает базу данных с именем ИмяБазы, ( ? – для запроса имени выводит стандартное окно WINDOWS). Меню (File – New – Database).
Пример: Cоздаем базу данных primer.
CREATE DATABASE primer
DELETE DATABASE ИмяБазы | ? [DELETETABLES] [RECYCLE]
– удаляет базу данных с именем ИмяБазы, ( ? – для запроса имени выводит стандартное окно WINDOWS). Дополнительные параметры указывают, удалять ли физически таблицы базы данных с диска или превращать их в свободные таблицы и помещать ли удаленные файлы в корзину.
Пример: Удаляем базу данных primer и все ее таблицы, не помещая их в корзину.
DELETE DATABASE primer DELETETABLES
MODIFY DATABASE [ИмяБазы | ?] [NOWAIT] [NOEDIT]
– открывает базу данных в режиме конструктора (NOEDIT – только для просмотра). Параметр NOWAIT в программном режиме запрещает паузу и продолжает выполнение программы. Меню (File – Open – Database(*.dbc)).
Пример: Открываем базу данных primer в режиме конструктора с возможностью редактирования.
MODI DATABASE primer
ADD TABLE ИмяТаблицы | ? [NAME ДлинноеИмяТаблицы]
– добавляет в текущую базу данных свободную таблицу ИмяТаблицы или таблицу по запросу “?” и назначает ей свойство ДлинноеИмяТаблицы (до 128 символов). Меню (в режиме конструктора базы данных – Database – Add Table…)
Пример: Добавляем уже существующую свободную таблицу departments в текущую базу данных и назначаем ей соответствующее длинное имя.
ADD TABLE departments NAME “Справочник отделов”
REMOVE TABLE ИмяТаблицы | ? [DELETE] [RECYCLE]
– удаляет таблицу ИмяТаблицы из текущей базы данных и делает ее свободной таблицей или (DELETE) физически удаляет ее с диска. Параметр RECYCLE указывает, что удаляемый файл нужно перенести в корзину. Меню (в режиме конструктора базы данных – Database – Remove)
Пример: Удаляем таблицу employees из текущей базы данных и с диска.
REMOVE TABLE employees DELETE
FREE TABLE ИмяТаблицы
– удаляет таблицу ИмяТаблицы из базы данных и делает ее свободной таблицей. Команда выполняется, даже если базы данных уже не существует.
Пример: Делаем таблицу employees свободной.
FREE TABLE employees
DISPLAY TABLES
[TO PRINTER [PROMPT] | TO FILE ИмяФайла] [NOCONSOLE]
- выводит информацию об открытых таблицах текущей базы данных на экран (по умолчанию), на принтер (PROMPT - с предварительной настройкой свойств принтера) или в файл ИмяФайла. NOCONSOLE отменяет вывод на экран.
Пример: Вывести информацию об открытых таблицах прямо на экран.
DISPLAY TABLES
CREATE TRIGGER ON ИмяТаблицы
FOR DELETE | INSERT | UPDATE AS логВыражение
- создает триггер удаления, добавления или обновления для таблицы ИмяТаблицы в текущей базе данных из логВыражения.
Пример: Создаем триггер для таблицы employees, который не разрешает удалять строки из таблицы, если текущее число месяца от 1 до 15, и разрешает, если текущее число месяца от 16 до 31.
CREATE TRIGGER ON employees FOR DELETE AS DAY(DATE())>15
DELETE TRIGGER ON ИмяТаблицы FOR DELETE | INSERT | UPDATE
- удаляет триггер удаления, добавления или обновления для таблицы ИмяТаблицы в текущей базе данных из логВыражения.
Пример: Удаляем триггер удаления для таблицы employees.
DELETE TRIGGER ON employees FOR DELETE
ОТКРЫТИЕ, ЗАКРЫТИЕ И РАБОТА С БАЗОЙ ДАННЫХ
[NOUPDATE]
– открывает базу данных ИмяФайла ( ? – для запроса имени выводит стандартное окно WINDOWS). База данных открывается в исключительном (EXCLUSIVE) или разделяемом (SHARED) режиме, только для просмотра (NOUPDATE), с предварительной проверкой целостности (VALIDATE).
Пример: Открываем базу primer в режиме совместного использования.
OPEN DATA primer SHARED
CLOSE DATABASES [ALL]
- закрывает текущую (ALL – все) базу данных со всем содержимым. Если нет текущей базы, закрывает все свободные таблицы, индексы и форматные файлы.
Общий формат команды CLOSE:
CLOSE
[ALL | ALTERNATE | DATABASES [ALL] | DEBUGGER
| FORMAT | INDEXES | PROCEDURE | TABLES [ALL]]
Пример: Закрываем все таблицы, индексы и т.п. База данных при этом не закрывается.
– возвращает полное имя текущей базы данных.
Пример:
? DBC() – будет напечатано, например, C:\VFP6\EXAMPLES\primer
– назначает открытую базу ИмяБазы текущей базой данных. Команда без параметра указывает, что текущей базы данных нет.
– упаковывает текущую базу данных, т.е., физически удаляет помеченные к удалению записи во всех таблицах базы данных. Требует, чтобы база данных была открыта в монопольном режиме.
[RECOVER]
– проверяет целостность базы данных с выдачей информации на экран, принтер или в файл. Команду можно вызывать только из командного окна, но не из программы.
Если включен параметр RECOVER (лечить), требуется, чтобы база была открыта в монопольном режиме.
Пример:
– функция для получения информации о разнообразных свойствах базы данных. СимвИмя означает имя элемента базы, о котором мы хотим получить информацию, симвТип – его тип (CONNECTION, DATABASE, FIELD или TABLEVIEW), симвСвойство – название свойства, значение которого нас интересует.
Пример:
? DBGETPROP(“employees .name”, “field”, “caption”) – будет напечатан заголовок (длинное имя) поля с названием name из таблицы employees.
Пример: Полю с названием name из таблицы employees назначаем длинное имя “Фамилия сотрудника”.
– создает таблицу с именем ИмяФайла и выводит на экран окно конструктора таблиц, ( ? – для запроса имени выводит стандартное окно WINDOWS). Меню (File – New – Table).
Пример: Создаем таблицу departments в режиме конструктора.
CREATE departments
MODIFY STRUCTURE
– выводит на экран окно конструктора таблицы, открытой в текущей рабочей области. Меню (в режиме конструктора базы данных – Database – Modify)
Пример:
MODI STRU.
AFIELDS(ИмяМассива [, числРабОбласть | симвПсевдТабл])
– создает массив и помещает в него информацию о таблице. По умолчанию выбирается таблица из текущей рабочей области, рабочую область можно задать также номером или псевдонимом открытой в ней таблицы. В полученном массиве 16 столбцов, количество строк равно количеству полей таблицы, в первых 3 столбцах содержится информация об имени, типе и ширине поля.
[ONLINE]
Открывает таблицу в текущей рабочей области или в области, которая указана в опции IN. Вместе с таблицей можно открыть ее индексы и назначить активный индекс. Таблица открывается в монопольном (EXCLUSIVE) или совместном (SHARED) режиме. Для таблицы можно задать псевдоним (ALIAS). Команда USE без параметров закрывает таблицу в текущей рабочей области.
Пример: В свободной рабочей области открываем таблицу departments в режиме совместного доступа, одновременно с ней открываются два ее индекса: по номеру и по названию отдела. Таблице назначается псевдоним dept, в качестве активного индекса назначается имя отдела.
USE departments IN 0 ALIAS dept INDEX deptNo, deptName ORDER 2 SHARED
SELECT числРабОбласть | симвПсевдТабл
– устанавливает в качестве текущей рабочей области область с номером числРабОбласть или псевдонимом симвПсевдТабл. Если в качестве номера записать 0, то будет выбрана первая свободная рабочая область. (Не путайте с командой SELECT SQL!)
Пример: Переходим в рабочую область dept.
SELECT dept
SELECT([ 0 | 1 | симвПсевдТабл ])
- возвращает номер текущей рабочей области (если параметр отсутствует или равен 0) или рабочей области, в которой открыта таблица с псевдонимом симвПсевдТабл. Если параметр равен 1, возвращает максимальный номер рабочей области.
Пример:
? SELECT(“dept”) – будет напечатан номер рабочей области, в которой открыта таблица dept.
Пример:
? DBF(“dept”) – будет напечатано полное имя таблицы dept, например, C:\VFP6\EXAMPLES\departments.dbf.
USED([числРабОбласть | симвПсевдТабл])
- возвращает истину, если в рабочей области с номером числРабОбласть или с псевдонимом симвПсевдТабл открыта таблица.
Пример: Если таблица dept открыта, закрываем ее.
IF USED(“dept”)
USE IN dept
ENDIF
ALIAS([числРабОбласть | симвПсевдТабл])
-возвращает псевдоним таблицы в текущей рабочей области или в рабочей области с номером числРабОбласть или с псевдонимом симвПсевдТабл.
Пример:
? ALIAS() – будет напечатан псевдоним таблицы, открытой в текущей рабочей области.
INDEX ON Выражение
TO ИмяФайлаIDX | TAG ИмяТега [OF ИмяФайлаCDX]
[FOR логВыражение]
[UNIQUE | CANDIDATE]
- создает индекс для таблицы, открытой в текущей рабочей области, на основе Выражения и записывает его в простой индексный файл или в отдельный тег мультииндексного файла. Если имя мультииндексного файла не указано, имеется в виду структурный индекс.
Пример: открываем таблицу departments (пусть в ней есть поля nomer и name)и создаем для нее два индекса – по номеру и по имени. Для каждого индекса создается IDX-файл
USE departments
INDEX ON nomer TO deptNo
INDEX ON name TO deptName
Пример: открываем таблицу departments (пусть в ней есть поля nomer и name)и создаем для нее два тега – по номеру и по имени. Оба тега сохраняются в одном CDX-файле.
USE departments
INDEX ON nomer TAG deptNo OF deptInd
INDEX ON name TAG deptName OF deptInd
SET INDEX TO [СписокИндексов | ? ]
[ORDER числНомИндекса | ИмяФайлаIDX
| [TAG] ИмяТега [OF ИмяФайлаCDX]
[ASCENDING | DESCENDING]] [ADDITIVE]
- открывает один или несколько индексов для таблицы, открытой в текущей рабочей области. Параметр ADDITIVE указывает, что ранее открытые для этой таблицы индексы закрывать не нужно.
Пример: В свободной рабочей области открывается таблица departments в режиме совместного доступа, затем открываются два ее индекса.
USE departments SHARED
SET INDEX TO deptNo, deptName ORDER 2
SET ORDER TO
[числНомИндекса | ИмяФайлаIDX |
[TAG] ИмяТега [OF ИмяФайлаCDX]
[IN числРабОбласть | симвПсевдТабл]
[ASCENDING | DESCENDING]]
- устанавливает активный индекс из числа открытых индексов для таблицы, открытой в текущей рабочей области или в области, указанной в параметре IN. Если в команде не указать параметры, будет установлен режим, в котором ни один индекс не является активным, и записи в таблице будут представлены в физическом порядке.
Пример: В свободной рабочей области открывается таблица departments в режиме совместного доступа, затем открываются два ее индекса. Второй индекс назначается активным.
– создает мультииндексный файл на основе IDX-файлов. Если его имя ИмяФайлаCDX не указано, имеется в виду структурный индекс.
Пример: В свободной рабочей области открывается таблица departments в режиме совместного доступа, затем открываются два ее IDX-индекса. Копируем все индексы в файл deptInd.CDX
USE departments SHARED INDEX deptNo, deptName
TO ИмяФайла
– создает IDX-файл на основе тега ИмяТега мультииндексного файла ИмяФайлаCDX. Если последний не указан, имеется в виду структурный индекс.
Пример: Копируем тег deptNo индексного файла deptInd.CDX в отдельный индекс deptNo.IDX.
COPY TAG deptNo OF deptInd TO deptNo
DELETE TAG ИмяТега1 [OF ИмяФайлаCDX1]
[, ИмяТега2 [OF ИмяФайлаCDX2]] ...
– удаляет тег с именем ИмяТега1 из мультииндексного файла ИмяФайлаCDX (физически тег не удаляется и продолжает занимать место!)
Пример: Удаляем тег deptNo индексного файла deptInd.CDX.
DELETE TAG deptNo OF deptInd
DELETE TAG ALL [OF ИмяФайлаCDX]
– удаляет все теги из мультииндексного файла ИмяФайлаCDX и сам файл.
Пример: Удаляем все теги индексного файла deptInd.CDX.
DELETE TAG ALL OF deptInd
[Границы] [FOR логВыражение1] [WHILE логВыражение2]
– физически сортирует информацию из текущей таблицы и записывает ее в новый файл ИмяТаблицы.
Пример: Создаем копию для текущей таблицы, отсортированную по полю name.
SORT TO sortDepartments ON name
[IN числРабОбласть | симвПсевдТабл]
Параметр ADDITIVE указывает, что устанавливаемая связь не отменяет предыдущие.
Команда без параметров разрывает все связи для таблицы в текущей рабочей области.
Пример: Открываем таблицу “Отделы” и таблицу “Сотрудники” (для каждого сотрудника хранится номер отдела). Связываем таблицы по номеру отдела. Выдаем на экран список сотрудников и названия отделов, где они работают.
USE employees IN 0 ALIAS emp
USE departments IN 0 ALIAS dept INDEX deptNo ORDER 1
SELECT employees
SET RELA TO nomer INTO dept
BROWSE FIELDS emp.name, dept.name
RELATION(числНомСвязи [, числРабОбласть | симвПсевдТабл])
– возвращает выражение, по которому установлена связь для указанной таблицы. Так как таблица может участвовать в нескольких связях, необходимо указать параметр числНомСвязи. Если не указан номер области числРабОбласть или псевдоним таблицы симвПсевдТабл, имеется с виду таблица в текущей рабочей области.
Пример:
? RELATION(1) – для предыдущего примера будет напечатано имя поля nomer
SET RELATION OFF INTO числРабОбласть | симвПсевдТабл
– разрывает связь между таблицей в текущей рабочей области и таблицей, открытой в области числРабОбласть или имеющей псевдоним симвПсевдТабл.
Пример:
SET RELATION OFF INTO dept – для предыдущего примера связь будет разорвана.
РАБОТА С ЗАПРОСАМИ
Запросы в Visual Pro можно создавать с помощью визуального конструктора. Более подробно эта тема будет рассмотрена в Части 2.
CREATE QUERY [ИмяФайла | ?]
[NOWAIT]
– создает запрос с именем ИмяФайла, ( ? – для запроса имени выводит стандартное окно WINDOWS). Меню (File – New – Query).
[NOWAIT]
– открывает запрос в режиме конструктора. Меню (File – Open – Query(*.qpr)).
Представления и соединения в Visual Pro можно создавать с помощью визуальных конструкторов. Более подробно эта тема будет рассмотрена в Части 2 данной книги. Приведенные ниже команды позволяют работать с представлениями и соединениями из командной строки и в программном режиме.
| CONNSTRING симвСтрокаСоединения]
- создает соединение и сохраняет его в текущей базе данных.
Пример: Пусть у нас имеется база данных books.mdb на MS Access и для нее создан источник данных books. Создадим соединение для этой БД.
CREATE CONNECTION conBooks DATASOURSE books
MODIFY CONNECTION [ИмяСоединения | ?]
- открывает соединение в редакторе соединений. ( ? – для запроса имени выводит стандартное окно WINDOWS). Меню (File – New – Connection).
и
DISPLAY CONNECTIONS
[NOCONSOLE]
- распечатывает информацию обо всех соединениях текущей базы данных.
RENAME CONNECTION ИмяСоединения1 TO ИмяСоединения2
- переименовывает соединение в текущей базе данных.
Пример:
RENAME CONNECTION conBooks TO books
- удаляет соединение из текущей базы данных.
Пример:
DELETE CONNECTION conBooks
[AS ИнструкцияSQL]
– создает представление с именем ИмяПредставления, используя соединение или источник данных и SQL-команду. Команда без параметров вызывает на экран окно визуального редактора представлений. Меню (File – New – View) и (File – New – Remote View). Правда, такое представление не будет обновляемым.
Пример: Пусть в БД на MS Access имеется таблица titles. Создадим для нее удаленное представление.
CREATE SQL VIEW vTitles REMOTE CONNECTION conBooks
AS SELECT * FROM titles
- удаляет представление из текущей базы данных.
Пример:
DELETE VIEW vTitles
- переименовывает представление в текущей базе данных.
Пример:
RENAME VIEW vTitles TO Titles
- открывает представление в визуальном редакторе.
- открывает представление как виртуальную таблицу. Обратите внимание, что таблицы и представления БД не должны иметь одинаковые имена.
Пример:
USE vTitles
и
LIST VIEWS
[NOCONSOLE]
- распечатывает информацию обо всех представлениях текущей базы данных.
КОМАНДЫ ЯЗЫКА SQL
FoxPro имеет собственную версию встроенного языка SQL. По языку SQL написано множество книг, поэтому не буду повторяться. Приведенные ниже команды демонстрируют диалект FoxPro. Можете сравнить его со стандартами SQL и диалектами других СУБД.
[ЛокальныйПсевдоним.] Поле [AS ИмяСтолбца]
[[INNER | LEFT [OUTER] | RIGHT [OUTER] |
ИмяБазы!]Таблица [ЛокальныйПсевдоним]
- выбирает данные из одной или нескольких таблиц по заданным условиям.
[PRIMARY KEY | UNIQUE]
- создает таблицу.
- создает временную таблицу (cursor – current set of record), которая уничтожается после закрытия.
ТипПоля [(числРазмер [, числТочность])]
[PRIMARY KEY | UNIQUE]
[NOCPTRANS]
- изменяет таблицу – добавляет или изменяет столбец.
ALTER TABLE ИмяТаблицы1
ALTER [COLUMN] ИмяПоля2
[NULL | NOT NULL]
[SET DEFAULT Выражение2]
[SET CHECK логВыражение2
- изменяет таблицу – изменяет параметры столбца.
[SET CHECK логВыражение3 [ERROR симвСообщение3]]
[DROP CHECK]
[ADD PRIMARY KEY Выражение3 TAG ИмяТега2]
[DROP PRIMARY KEY]
[ADD UNIQUE Выражение4 [TAG ИмяТега3]]
[DROP UNIQUE TAG ИмяТега4]
[ADD FOREIGN KEY [Выражение5] TAG ИмяТега4
REFERENCES ИмяТаблицы2 [TAG ИмяТега5]]
[DROP FOREIGN KEY TAG ИмяТега6 [SAVE]]
[RENAME COLUMN ИмяПоля4 TO ИмяПоля5]
[NOVALIDATE]
- изменяет таблицу – удаляет столбец или изменяет параметры таблицы.
INSERT INTO ИмяТаблицы [(ИмяПоля1 [, ИмяПоля2, ...])]
VALUES (Выражение1 [, Выражение2, ...])
- добавляет строку в таблицу.
- добавляет строки в таблицу из массива или из переменных памяти.
- удаляет строки из таблицы (не путайте с командой DELETE!).
- обновляет строки в таблице.
Пример. Переход к предыдущей записи в текущей рабочей области
Пример. Переход к следующей записи в текущей рабочей области
- возвращает истину, если указатель записей находится в начале таблицы.
- возвращает истину, если указатель записей находится после последней строки таблицы.
- возвращает количество строк в таблице (включая помеченные к удалению).
В качестве Границ могут использоваться выражения:
Пример. Ищем в таблице отдел с номером 5. Если не нашли, остаемся на той же строке, что были до поиска.
14 10 2014
3 стр.
Еще лучше воспользоваться редактором, в котором предусмотрена возможность анализа исходных кодов, например, текстовым редактором Microsoft Visual Studio, рассчитанным на работу с M
01 10 2014
1 стр.
Для создания резервной копии базы данных необходимо в программе Microsoft sql server Management Studio в левой части окна выбрать требуемую базу данных. Затем, щелчком правой кнопк
10 10 2014
1 стр.
Данный документ предназначен для использования в самостоятельной работе студентов с приложением Microsoft Office Access при выполнении своего проекта. Рисунки и управляющие последо
01 10 2014
1 стр.
Для функционирования комплекса необходимы операционная система Microsoft Windows 2000 и сервер базы данных Microsoft sql server 2000
25 12 2014
1 стр.
В качестве программной среды для разработки программного комплекса по обработке аэрокосмических изображений выбрана система объектно-ориентированного программирования Visual C++ ве
13 10 2014
3 стр.
Данный практикум включает в себя 9 лабораторных работ по механике и молекулярной физике, отвечающих требованиям Государственного образовательного стандарта и рабочих программ для и
11 09 2014
12 стр.
Реляционная модель данных. Основные понятия: отношение, кортеж, домен. Реляционная алгебра (РА)
24 09 2014
1 стр.