Модельный SQL-интерпретатор (1115016), страница 5
Текст из файла (страница 5)
Для открытия ужесуществующей таблицы необходимо указать только имя.ITable * Table = ITable::Open ( "mytable" );Операции чтения/изменения записей таблицы происходят с использованием скрытогокурсора. В качестве «окна» значений текущей записи таблицы выступает набор полей,20Модельный SQL-интерпретатор. Методическое пособие.для доступа к которым служит метод ITable::GetField, возвращает указатель наэкземпляр поля, реализующий интерфейс IField. Контроль за жизненным циклом полейзаписи осуществляет ITable (аналогично структуре таблицы), поэтому вручнуюуничтожать их не надо.IField * Field1 = Table->GetField ( "Name" );IField * Field2 = Table->GetField ( "Age" );Для добавления новой записи служит метод Add, который добавит в таблицу новуюзапись с текущими значениями «окна».Field1->Text () = "Sasha";Field2->Long () = 19;Table->Add ();Для прохода по записям таблицы предназначена группа методов ReadFirst, ReadNext.При каждом смещении скрытого курсора «окно» обновляется на актуальные значенияиз файла таблицы.
Операции обновления/удаления (Update/Delete) работают с текущейзаписью, на которую указывает скрытый курсор.4.1. Описание модельного языка SQLЯзык SQL [5] — простой и достаточно мощный язык взаимодействия пользователя среляционными базами данных, разработанный фирмой IBM.
Все необходимыепользователю операции, совершаемые над реляционными базами данных, могутзадаваться с помощью SQL-предложений.Модельный язык SQL будет включать лишь шесть основных предложений стандартаязыка SQL, возможности которых также будут существенно ограничены. Это:SELECT— выбрать из БД данные, соответствующие запросу;INSERT— вставить новую строку данных в таблицу;UPDATE— обновить значения данных в существующей строке;DELETE— удалить строку из таблицы;CREATE— создать таблицу;DROP— уничтожить таблицу.Каждое предложение модельного SQL будет относиться только к одной таблице, имякоторой в нем указано. Получив предложение, интерпретатор должен открытьуказанную таблицу, выполнить предложение, запомнить результат и закрыть таблицу.Результатом выполнения каждого предложения (кроме DROP) будет вообще говоряновая таблица, которая в некотором внутреннем представлении должна быть переданаклиенту в качестве ответа на запрос.
Если же по каким-либо причинам ответить назапрос не удалось, клиент должен получить сообщение о причине неудачи.<SQL-предложение> ::= <SELECT-предложение> |<INSERT-предложение> | <UPDATE-предложение> |<DELETE-предложение> | <CREATE-предложение> |<DROP-предложение>21Волкова И.А., Головин И.Г., Кузина Л.Н., Мальковский М.Г.<SELECT-предложение> ::=SELECT <список полей> FROM <имя таблицы> <WHERE-клауза><список полей> ::= <имя поля> { , <имя поля> } | *<имя таблицы> ::= <имя><имя поля> ::= <имя><имя>::= <идентификатор языка Си>Получив SELECT-предложение, интерпретатор выбирает из таблицы <имя таблицы>перечисленные поля в тех строках, которые удовлетворяют WHERE-клаузе.* — обозначает все поля таблицы.Результатом выполнения SELECT-предложения является новая, в общем случаеменьшая по размерам (возможно пустая) таблица, состоящая из отобранных строк истолбцов (полей).<INSERT-предложение> ::= INSERT INTO <имя таблицы>(<значение поля> { , <значение поля> })<значение поля> ::= <строка> | <длинное целое><строка> ::= '<символ> {<символ>}'<символ> ::= <любой, представляемый в компьютере символ, кроме апострофа '>В соответствии с INSERT-предложением, интерпретатор вставляет в конец таблицы<имя таблицы> строку с перечисленным значением полей.
Количество полей и ихзначения должны соответствовать структуре таблицы. В противном случае выдаетсясообщение об ошибке.Результатом выполнения INSERT-предложения является новая, увеличенная на однустроку таблица.<UPDATE-предложение> ::= UPDATE <имя таблицы> SET<имя поля> = <выражение> <WHERE-клауза>В ответ на UPDATE-предложение интерпретатор заменяет в каждой строке таблицы<имя таблицы>, удовлетворяющей WHERE-клаузе, значение поля <имя поля> на значениезаданного в предложении выражения.
Тип выражения должен совпадать с типом поля,в противном случае выдается сообщение об ошибке.Результатом выполнения UPDATE-предложения является таблица с измененнымизначениями указанных полей.<DELETE-предложение> ::=DELETE FROM <имя таблицы> <WHERE-клауза>При выполнении DELETE-предложения интерпретатор удаляет из таблицы <имятаблицы> все строки, удовлетворяющие WHERE-клаузе.22Модельный SQL-интерпретатор.
Методическое пособие.Результат выполнения DELETE-предложения — вообще говоря, урезанная исходнаятаблица.<CREATE-предложение> ::=CREATE TABLE <имя таблицы> ( <список описаний полей> )<список описаний полей> ::=<описание поля> { , <описание поля> }<описание поля> ::= <имя поля> <тип поля><тип поля> ::= TEXT ( <целое без знака> ) | LONGВ результате выполнения CREATE-предложения создается новая пустая таблица <имятаблицы>, структура которой определяется списком описаний полей. Этот список посути является заголовком таблицы.В таблице могут храниться либо целые числа (тип LONG), либо строки определеннойдлины (тип ТЕХТ).
Допустимая длина строки задается целым числом в круглыхскобках.<DROP-предложение> ::= DROP TABLE <имя таблицы>Выполнение DROP-предложения сводится к удалению таблицы <имя таблицы> из базыданных (и соответствующего файла из файловой системы ).<WHERE-клауза> ::=WHERE <имя поля типа TEXT> [ NOT ] LIKE <строка-образец> |<выражение> [ NOT ] IN ( <список констант> ) |WHERE <логическое выражение> |WHERE ALLWHERE<строка-образец> ::= <строка><выражение> ::= <Long-выражение> | <Text-выражение><список констант> ::= <строка> { , <строка> } |<длинное целое> { , <длинное целое> }<Long-выражение> ::=<Long-слагаемое> { <+|-> <Long-слагаемое> }<+|-> ::= + | <Long-слагаемое> ::=<Long-множитель> { <*|/|%> <Long-множитель> }<*|/|%> ::= * | / | %<Long-множитель> ::= <Long-величина> | ( <Long-выражение> )23Волкова И.А., Головин И.Г., Кузина Л.Н., Мальковский М.Г.<Long-величина> ::= <имя поля типа LONG> | <длинное целое><Text-выражение> ::= <имя поля типа TEXT> | <строка><логическое выражение> ::=<логическое слагаемое> { OR <логическое слагаемое> }<логическое слагаемое> ::=<логический множитель> { AND <логический множитель> }<логический множитель> ::= NOT <логический множитель> |( <логическое выражение> ) |(<отношение>)<отношение> ::= <Text-отношение> | <Long-отношение><Text-отношение> ::=<Text-выражение> <операция сравнения> <Text-выражение><Long-отношение> ::=<Long-выражение> <операция сравнения> <Long-выражение><операция сравнения> ::= = | > | < | >= | <= | !=WHERE-клауза при выполнении предложений SELECT, UPDATE и DELETE играетроль фильтра: требуемые действия производятся не со всеми строками заданнойтаблицы, а только с теми из них, поля которых удовлетворяют условиям WHEREклаузы.Первая альтернатива WHERE-клаузы — LIKE-альтернатива — позволяет выбратьстроки, поля которых (они должны быть текстового типа) соответствуют (несоответствуют в случае с NOT) строке-образцу.
В строке-образце наряду с обычнымисимволами выделены специальные символы. Это:%— обозначает любую последовательность из нуля или более символов;_— обозначает любой одиночный символ;[]— обозначает любой одиночный символ из перечисленных в квадратныхскобках. Например, [abcdef]. В квадратных скобках можно задавать идиапазон допустимых символов. Например, [a-f].[^ ] — обозначает любой одиночный символ, не принадлежащийперечисленным в квадратных скобках. Например, [^abcdef] или [^a-f].Вторая альтернатива WHERE-клаузы — IN-альтернатива — содержит выражениетекстового или целого типа.
Роль переменных в этом выражении играют поля строкитаблицы. IN-альтернатива позволяет выбрать те строки, для которых выражениепринимает (не принимает в случае с NOT) одно из значений, перечисленных в спискеконстант <список констант>. Тип констант из списка должен совпадать с типомвыражения, а, следовательно, и с типом имен полей, в него входящих.Третья альтернатива WHERE-клаузы — BOOL-альтернатива — содержит выражениелогического типа, содержащее, как и в IN-альтернативе, имена полей строки в качествепеременных.
Эта альтернатива позволяет выбрать строки, для которых <логическоевыражение> истинно.Логические операции NOT, AND, OR имеют обычный смысл.24Модельный SQL-интерпретатор. Методическое пособие.Четвертая альтернатива WHERE-клаузы — ALL-альтернатива — говорит о том, чтофильтрацию строк проводить не нужно.4.2. Примеры предложений модельного SQL1. Создать таблицу Students, состоящую из четырех полей: поля First_name типа TEXTдлины 10, поля Surname типа TEXT длины 15, поля Age типа LONG и поля Phone типаTEXT длины 9.CREATE TABLE Students (First_name TEXT (10),Surname TEXT (15),Age LONG,Phone TEXT (9) )В результате создается новая пустая таблица Students с заголовком:First_nameSurnameAgePhoneEё структура фиксируется в начальных зонах файла таблицы.2.
Внести в таблицу Stulents сведения о студентах Иванове, Петрове, Федорове иЗахарове.INSERTINSERTINSERTINSERTINTOINTOINTOINTOStudentsStudentsStudentsStudents(((('Sergey', 'Ivanov', 18, '145-45-45' )'Alexey', 'Petrov', 20, '343-65-45' )'Andrey', 'Fedorov', 23, '123-45−18' )'Alexandre', 'Zaharov', 20, '345- 33-33' )После выполнения этих предложений таблица будет выглядеть так:First_nameSergeyAlexeyAndreyAlexandreSurnameIvanovPetrovFedorovZaharovAge18202320Phone145-45-45343-65-45123-45−18450- 33-333. Найти имена и фамилии студентов в возрасте от 18 до 29 лет.SELECT First_name, Surname FROM Students WHERE Age IN (18, 19, 20)Результатом выполнения предложения должна быть таблица:First_nameSergeyAlexeyАlexandreSurnameIvanovPetrovZaharov25Волкова И.А., Головин И.Г., Кузина Л.Н., Мальковский М.Г.4.