1. язык SQL

advertisement
Конспекты лабораторных занятий
Лабораторная работа №5.
(8 часов)
Тема № 4. Использование языка SQL для приложений СУБД в среде Delphi
Создание, подключение и заполнение таблицы БД с помощью команд SQL
Задание: На лабораторных занятиях выполняется примерный вариант задания. На
самостоятельную работу планируется выполнение индивидуального
варианта по образцу задания проделанного на занятиях. Выполнение работы
разбивается на 3 этапа:
 Подключение БД с помощью команды Select SQL в Delphi.
 Создание таблицы БД с помощью команды Create Table SQL в Delphi
 Заполнение таблицы БД с помощью команды Insert SQL в Delphi
1.
2.
3.
4.
5.
6.
Основные понятия, определения, рассматриваемые на данном занятии
язык SQL
компонент Query
команда Select
команда Create Table
команда Insert into
типы данных SQL
Теоретическое введение
Основы языка SQL
SQL (Structured Query Language) – это структурированный язык запросов к
реляционным базам данных (БД). SQL является декларативным языком, основанным на
операциях реляционной алгебры. Существуют два стандарта SQL, определённые
американским национальным институтом стандартов (ANSI): SQL-89 (SQL-1) и SQL-92
(SQL-2). В настоящее время разрабатывается новый стандарт – SQL-3. Большинство
коммерческих систем управления базами данных (СУБД) поддерживают стандарт SQL-92,
который принят ISO (International Standards Organization) в качестве международного
стандарта. Многие версии имеют свои отличия, которые касаются, в основном,
синтаксиса.
Язык работы с базами данных должен предоставлять пользователям следующие
возможности:
 создавать базу данных и таблицы с полным описанием их структуры;
 выполнять основные операции манипулирования данными (добавление, изменение,
удаление данных);
 выполнять запросы, осуществляющие преобразование данных в необходимую
информацию.
Для реализации этих функций SQL включает 4 группы средств:
 DDL (Data Definition Language) – язык определения данных;
 DML (Data Manipulation Language) – язык манипулирования данными;
 DQL (Data Query Language) – язык запросов данных;
 DCL (Data Control Language) – язык управления данными.
По стандарту ANSI DCL является частью DDL.
В командах SQL не различаются прописные и строчные буквы (за исключением
строк). Каждая команда заканчивается символом ';'. Значения параметров по умолчанию
выделено подчеркиванием, например, ALL.
Примем следующие обозначения для описания синтаксиса:
{} – содержимое скобок рассматривается как единое целое для остальных
символов;
| – заменяет слово ИЛИ;
[] – содержимое этих скобок является необязательным;
… – всё, что предшествует этим символам, может повторяться произвольное
число раз;
.,.. – всё, что предшествует этим символам, может повторяться произвольное число раз,
каждое вхождение отделяется запятой.
Существуют три формы SQL: интерактивный (Interactive), статический (Static) и
динамический (Dynamic). Функционируют они одинаково, но используются по-разному.
* ·Интерактивный SQL применяется для непосредственной работы с БД - пользователь
вводит SQL-оператор, он сразу же выполняется и пользователь видит результат
выполнения (или код ошибки).
* ·Статический SQL содержит SQL-операторы, жестко закодированные в теле
исполняемого приложения. Наиболее распространен встроенный SQL (Embedded
SQL), где SQL-код включается в исходный текст (базовой) программы, написанной на
другом языке (например, С или Pascal); при использовании встроенного SQL
результаты выполнения операторов SQL перенаправляются в переменные, которыми
оперирует базовая программа. К настоящему времени SQL встроен в языки Ada,
Cobol, Fortran, C, Pascal, PL/1, Java, Mumps (теперь M).
* ·Динамический SQL также является частью приложения, но конкретный SQL-код
генерируется во время выполнения (Run Time), а не вводится заранее.
Фактически везде описывается интерактивная форма SQL - сначала приводится текст
SQL-запроса, а ниже дается ответ исполняющей системы (обычно в виде таблицы).
Типы данных SQL
 Символьные типы данных - содержат буквы, цифры и специальные символы.
o CHAR или CHAR(n) -символьные строки фиксированной длины. Длина
строки определяется параметром n. CHAR без параметра соответсвует
CHAR(1). Для хранения таких данных всегда отводится n байт вне
зависимости от реальной длины строки.
o VARCHAR(n) - символьная строка переменной длины. Для хранения
данных этого типа отводится число байт, соответствующее реальной длине
строки.
 Целые типы данных - поддерживают только целые числа (дробные части и
десятичные точки не допускаются). Над этими типами разрешается выполнять
арифметические операции и применять к ним агрегирующие функции
(определение максимального, минимального, среднего и суммарного значения
столбца реляционной таблицы).
o INTEGER или INT- целое, для хранения которого отводится, как правило, 4
байта. (Замечание: число байт, отводимое для хранения того или иного
числового типа данных зависит от используемой СУБД и аппаратной
платформы, здесь приводятся наиболее "типичные" значения) Интервал
значений от - 2147483647 до + 2147483648
o SMALLINT - короткое целое (2 байта), интервал значений от - 32767 до
+32768
 Вещественные типы данных - описывают числа с дробной частью.
o FLOAT и SMALLFLOAT - числа с плавающей точкой (для хранения
отводится обычно 8 и 4 байта соответсвенно).
o DECIMAL(p) - тип данных аналогичный FLOAT с числом значащих цифр
p.
DECIMAL(p,n) - аналогично предыдущему, p - общее количество
десятичных цифр, n - количество цифр после десятичной запятой.
Денежные типы данных - описывают, естественно, денежные величины. Если в
ваша система такого типа данных не поддерживает, то используйте DECIMAL(p,n).
o MONEY(p,n) - все аналогично типу DECIMAL(p,n). Вводится только
потому, что некоторые СУБД предусматривают для него специальные
методы форматирования.
Дата и время - используются для хранения даты, времени и их комбинаций.
Большинство СУБД умеет определять интервал между двумя датами, а также
уменьшать или увеличивать дату на определенное количество времени.
o DATE - тип данных для хранения даты.
o TIME - тип данных для хранения времени.
o INTERVAL - тип данных для хранения верменного интервала.
o DATETIME - тип данных для хранения моментов времени (год + месяц +
день + часы + минуты + секунды + доли секунд).
Двоичные типы данных - позволяют хранить данные любого объема в двоичном
коде (оцифрованные изображения, исполняемые файлы и т.д.). Определения этих
типов наиболее сильно различаются от системы к системе, часто используются
ключевые слова:
o BINARY
o BYTE
o BLOB
Последовательные типы данных - используются для представления возрастающих
числовых последовательностей.
o SERIAL - тип данных на основе INTEGER, позволяющий сформировать
уникальное значение (например, для первичного ключа). При добавлении
записи СУБД автоматически присваивает полю данного типа значение,
получаемое из возрастающей последовательности целых чисел.
В заключение следует сказать, что для всех типов данных имеется общее значение
NULL - "не определено". Это значение имеет каждый элемент столбца до тех пор,
пока в него не будут введены данные. При создании таблицы можно явно указать
СУБД могут ли элементы того или иного столбца иметь значения NULL (это не
допустимо, например, для столбца, являющего первичным ключом).
o




Команды DDL
1) Создание новоq таблицы выполняется с помощью команды DDL CREATE TABLE.
Команда CREATE TABLE используется для описания новой таблицы, её атрибутов
(полей) и ограничений целостности. Упрощённый синтаксис этой команды:
CREATE TABLE <имя таблицы>
( {<имя поля> <тип данных> [(<размер>)]
[<ограничения целостности поля>…]} .,..
[, <ограничения целостности таблицы>.,..] );
Для обязательных полей устанавливается ограничение not null. Это означает, что при
изменении значения этого поля или при добавлении новых записей таблицы это поле
должно содержать допустимое значение. Ограничение not null можно наложить на поле
только один раз, иначе возникает ошибка.
Описание команды CREATE TABLE
Элемент
Описание
<имя поля>
Имя поля (столбца) таблицы, обычный идентификатор.
<тип данных>
Тип данных поля. Можно использовать одно из значений:
– INTEGER, INT, SMALLINT – целые числа;
– NUMERIC[(длина [, точность])], DECIMAL[(длина [, точность])] – числа с
фиксированной запятой;
– FLOAT, REAL, DOUBLE – вещественные числа;
– CHAR[(длина)], VARCHAR(длина) – символьные строки фиксированной и
переменной длины;
– DATE – дата; TIME – время.
<размер>
Размер поля в символах (для текста и чисел).
<ограничения
целостности>
Можно использовать следующие ограничения:
– PRIMARY KEY – первичный ключ (обязательный и уникальный);
– UNIQUE – уникальное значение поля в пределах столбца таблицы;
– [NOT] NULL – [не] возможность не указывать значение поля;
– CHECK (<условие>) – проверка условия для поля (полей);
– DEFAULT <выражение> – задание значения поля по умолчанию;
– REFERENCES <имя таблицы> [(<имя столбца>)] – внешний ключ.
<ограничения
целостности
таблицы>
То же, что и для поля. Дополнительно используется:
FOREIGN KEY [(<список полей>.,..)] REFERENCES
<имя таблицы> [(<список полей>)] – внешний ключ.
Обратите внимание:
общие ограничения целостности и составные ключи указываются через запятую
после последнего поля;
 если внешний ключ ссылается на первичный ключ (ПК) другого отношения, имена
полей ПК можно не указывать;
 если внешний ключ составной, список полей входящий в ключ, указывается после
перечисления всех полей таблицы с ключевым словом FOREIGN KEY:
2) Удаление объектов БД выполняется с помощью команды DROP.
 DROP TABLE – удаление таблицы:
DROP TABLE <имя таблицы> [RESTRICT | CASCADE];
Таблица будет удалена без дополнительного запроса на подтверждение. При
указании CASCADE вместе с таблицей каскадно удаляются все зависящие от неё
объекты БД. Если указать RESTRICT, то при наличии зависимых от удаляемой
таблицы объектов операция будет отменена.
Команда DQL Select
В разделе команд DQL находится только одна команда Select, но она так огромна и
многообразна, что мы рассмотрим ее только в упрощенном виде.
Извлечение данных из отношений выполняется с помощью команды SELECT
(селекция). Эта команда не изменяет данные в БД.
Результатом выполнения команды SELECT является временное отношение, которое
помещается в курсор (специальную область памяти СУБД) и обычно сразу выводится на
экран. Синтаксис этой команды:
SELECT * | { [ ALL | DISTINCT ] <список выбора>.,..}
FROM {<имя таблицы> [<алиас>] }.,..
[ WHERE <условие>]
[ GROUP BY {<имя поля> | <целое>}.,.. [ HAVING <условие>] ]
[ ORDER BY {<имя поля> | <целое> [ ASC | DESC ] }.,..]
[ UNION [ALL] SELECT …];
Расшифруем некоторые элементы описания команды:

Элемент
Описание
<список выбора>
Список элементов, разделённых запятыми. Элемент списка выбора –
выражение и необязательный алиас. Выражение может включать
имена полей, знаки операций, вызовы функций и константы.
<имя таблицы>
Имя или синоним имени таблицы или представления.
<алиас>
Временный синоним имени таблицы, определённый только внутри
запроса.
<условие>
Условие, которое может быть истинным или ложным для каждого
поля или комбинации полей из таблицы (таблиц), определённых
предложением FROM.
<имя поля>
Имя поля (столбца) таблицы.
<целое>
Число без десятичной точки. Номер поля в <списке полей>.
Рассмотрим основные параметры команды SELECT:
DISTINCT – предикат удаления из результирующего отношения повторяющихся
кортежей.
ALL – предикат, обратный к DISTINCT (используется по умолчанию).
Вычисляемые поля. После SELECT указывается список выбора – список
выражений, которые будут образовывать результирующее отношение. Выражению
можно сопоставить временный синоним (имя вычисляемого поля или алиас),
который будет названием поля результирующего отношения, например:
(matem+fizika+himia)/3 as sr_ball. Для создания вычисляемых полей нужно в
запросе привести выражение с математическими действиями и имена полей в
качестве переменных. Для таких полей можно создавать имена-псевдонимы.
Псевдонимы помещаются после имени поля или вычисляемого выражения после
AS в квадратных скобках.
Если надо вывести все поля из тех отношений, к которым обращается данный
запрос, можно указать символ * (если в отношениях нет полей с одинаковыми
именами). В этом случае сначала будут выведены поля таблицы, стоящей первой в
предложении FROM, затем – второй и т.д. Поля, относящиеся к одной таблице,
будут выводиться в том порядке, в каком они были записаны при создании
таблицы.
FROM – в этом предложении указывается имя таблицы (имена таблиц), в которой
будет производиться поиск.
WHERE – содержит условия выбора отдельных записей.
GROUP BY – группирует записи по значению одного или нескольких полей.
Каждой группе в результирующем отношении соответствует одна запись.
HAVING – позволяет указать условия выбора для групп записей. Может
использоваться только после group by.
ORDER BY – сортирует результирующие записи по значению одного или
нескольких полей: ASC – по возрастанию, DESC – по убыванию.
Порядок выполнения операции SELECT такой:
1. Выбор из указанной таблицы тех записей, которые удовлетворяют условию отбора
(where).
2. Группировка полученных записей (group by).
3. Выбор тех групп, которые удовлетворяют условию отбора (having).
4. Сортировка записей в указанном порядке (order by).
5. Извлечение из записей полей, заданных в списке выбора, и формирование
результирующего отношения.
Если во фразе FROM указаны две и более таблицы, то эта последовательность действий
выполняется для декартова произведения указанных таблиц.
Ход выполнения:
1. Изучаем теоретическое введение.
2. Создаем новый проект Project1.
3. На форму Form1 помещаем компоненты Query1 (страница BDE), DataSourse1
(страница Data Access), DBGrid1, DBNavigator1 (страница Data Controls):
4. Свяжем компоненты, для этого в свойствах DataSourse компонентов DBGrid1 и
DBNavigator1 укажем источник данных DataSourse1, а сам DataSourse1 свяжем с
SQL компонентом Query установив свойство DataSet как Query1.
5. Сохранить проект в новый созданный каталог на диске С:.
6. В этот каталог поместить базу данных из лабораторной работы №2, в которой есть
текстовые поля (Fio, Adres) и числовые поля (Matem, Fizika и т.д.). Пусть база
данных называется sss.db.
7. Соединяем базу данных с компонентом Query1 с помощью SQL-запроса, для этого
свойство алиаса DatabaseName оставляем пустым, а с помощью редактора свойства
SQL вводим необходимый запрос. Если БД помещена в каталог проекта, то алиас
можно не устанавливать. Для ввода запроса щелкаем мышкой по кнопке
и в
выпадающем окне редактора запроса вводим запрос:
8. Помещаем на форму кнопку Button1 с надписью «открыть», двойным щелчком
мышки создаем обработчик события нажатия на кнопку, для этого вводим
активизацию запроса: Form1.Query1.Active:=true;. Сохранить изменения и
проверить работу запроса. Внешний вид работы приложения может иметь
следующий вид:
9. Разместим теперь на форме 2 компонента Memo1 и Memo2, которые будем
использовать для ввода запросов. Для активизации этих запросов разместим так же
кнопки с надписями «новый запрос», «новая БД», «создать». Memo1 будем
использовать для нового запроса, а Memo2 для запроса на создание базы данных.
Установим свойства видимости Visible=false для кнопки «создать» и Memo2. Эти
компоненты будут видны только при щелчке по кнопке «новая БД». Перед
использованием свойства Lines компонентов Memo необходимо очистить удалив
из них строки «memo1» и «memo2».
10. Для кнопки «новый запрос» необходимо создать процедуру обработки нажатия в
которой старый запрос становится неактивным, затем очищается и копируется из
Memo1 список строк нового запроса. Примерный вид такой процедуры:
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Query1.Active:=false;
form1.Query1.SQL.Clear;
form1.Query1.SQL.AddStrings(form1.Memo1.Lines);
form1.Query1.Active:=true;
end;
11. Теперь можно проверить работу нового запроса. Для этого запустить приложение,
ввести в окно Memo1 текст запроса команды Select и щелкнуть кнопкой «новый
запрос.
Проверить работу запросов:
на вывод всей таблицы sss - Select * from sss;
на вывод отдельных полей - Select Fio,Adres from sss;
на вывод отдельных записей - Select * from sss where matem=4;
12. Для кнопки «новая БД» необходимо создать процедуру обработки нажатия в
которой старый запрос становится неактивным, затем делаются видимыми кнопка
«создать» и Memo2. Примерный вид такой процедуры:
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.Query1.Active:=false;
form1.Memo2.Visible:=true;
form1.Button4.Visible:=true;
end;
13. Для кнопки «создать» необходимо создать процедуру обработки нажатия в которой
старый запрос очищается, затем копируется из Memo2 список строк нового
запроса. Далее метод ExecSQL выполняет запрос. Примерный вид такой
процедуры:
procedure TForm1.Button4Click(Sender: TObject);
begin
form1.Query1.SQL.Clear;
form1.Query1.SQL:=form1.Memo2.Lines;
form1.Query1.ExecSQL;
end;
14. Теперь необходимо в свойстве Lines компонента Memo2 задать основу для запроса
на создание новой таблицы. Примерный вид такого запроса:
create table
(Fio varchar(30),
rost integer,
ves integer);
С помощью этого запроса создается база данных (имя нужно ввести уже при
работе программы) с полем FIO – строка текста, поля rost и ves – целочисленные.
15. Сохранить изменения и запустить приложение. Убедиться, что программа работает
на выполнение новых запросов команды select. Создать по образцу базу данных ttt.
С помощью нового запроса Select * from ttt убедиться, что база данных существует,
но пока без записей.
16. Введем теперь с помощью Memo2 первую запись в таблицу ttt. Для этого
используем запрос Insert into ttt values(‘Иванов И.И.’,175,78).
Замечание: Для ввода команд Create Table, Insert into лучше использовать метод
ExecSQL без активизации свойства SQL, а команда Select требует активизации
свойства SQL.
17. Проверим результат добавления записи с помощью нового запроса Select * from ttt.
Теперь в таблице должна быть 1 запись о росте и весе Иванова.
18. Добавить еще несколько записей в таблицу ttt с помощью команды SQL - Insert
into.
19. Разработать проект для индивидуального задания.
20. Подготовиться к защите лабораторной работы, которая включает в себя
демонстрацию индивидуального варианта, защиту по контрольным вопросам
теоретической части работы.
Контрольные вопросы:
1. Дайте определение языка SQL
2. Перечислите основные блоки операторов языка SQL
3. Перечислите методы и свойства Query
4. Как используется метод ExecSQL?
5. Приведите пример команды Select.
6. Приведите пример команды Create table.
7. Приведите пример команды Insert.
8. Какие варианты есть у команды Insert?
9. Зачем используется параметр from команды Select?
10. Зачем используется параметр where команды Select?
11. Зачем используется параметр * команды Select?
12. Зачем используется параметр values команды Isert?
13. Перечислите типы данных SQL
14. Как создать таблицу с помощью SQL?
15. Почему результат SQL запроса нельзя редактировать?
1.
2.
3.
4.
5.
6.
7.
Литература
Избачков Ю.С., Петров В.Н. Информационные системы: учебник для вузов. 2-е
изд. –СПб.: Питер. 2005. -656 с.
Бобровский С. Delphi 7: учебный курс. – СПб: Издательство “Питер”, 2005. – 736 с.
Опель Э. Изучаем SQL. –М.: НТ Пресс. 2007. -320 с.
Фаронов В.В. Delphi. Программирование на языке высокого уровня. –СПб.:
Питер.2004.-640 с.
Дарахвелидзе П.Г., Марков Е.П. Программирование в Delphi 7. – СПб.:БХВПетербург. 2005. -784 с.
Фаронов В.В., Шумаков П.В. Delphi 5. Руководство разработчика баз данных. –М.:
«Нолидж». 2000. -640 с.
Кузин А.В., Левонисова С.В. Базы данных. –М.: Академия. 2005. -320 с.
Лабораторная работа №5. Индивидуальные задания.
Разработать программу в которой – создается аналог индивидуального задания
лабораторной работs №3, но построенной с помощью компонента Query.
Download