Вы находитесь на странице: 1из 6

Практическая работа № 3

Тема: SQL запросы. Работа с запросами в Delphi.


Цель: усвоить способы создания SQL запросов в Delphi c использованием компонентов
TADOQuery, уметь делать приложение SQL-монитор.
Оборудование: персональный компьютер с установленной операционной системой Windows, а
также программой Delphi 7 .

I. Правила ТБ
II. Теоретические сведения.

Операции в SQL.
Операции представляются зарезервированными словами или символами.
В SQL операции используются в основном в выражениях ключевого слова WHERE, где они
задают операции сравнения и арифметические операции. Знаки операций в операторах SQL
используются для задания условий и скрепления нескольких условий между собой.
Рассмотрим следующие типы операций.
• Операции сравнения
• Логические операции
• Операция отрицания
• Арифметические операции
Операции сравнения
Операции сравнения используются в операторах SQL для сравнения отдельных значений и
представляются знаками =, <> <и>. Эти операции предназначены соответственно для проверки
значений равенства и неравенства, проверки выполнения отношений "меньше" и "больше"
между ними.
Равенство
Операция проверки равенства в операторе SQL выясняет равенство одного значения другому.
Для этого используется знак равенства (=). При выяснении равенства сравниваемые значения
должны совпадать в точности, иначе запрос к базе данных не вернет никаких данных. Если
сравниваемые значения равны, соответствующее выражение приобретает значение TRUE
(Истина), иначе - FALSE (Ложь). Это логическое значение (TRUE / FALSE) используется
системой для того, чтобы выяснить, должны соответствующие данные включаться в ответ
запроса.
пример 1
WHERE STIP = 50 стипендии равна 50
Неравенство
В противоположность равенству существует неравенство. В SQL для представления проверки
неравенства используется знак <> (комбинация знаков "меньше" и "больше"). В этом случае
условие возвращает TRUE, если оказывается неравенство значений, и FALSE - если равенство.
WHERE STIP <> 50 стипендии не ровен 50
"Меньше" и "больше"
Знаки <( "меньше") и> ( "больше") можно использовать отдельно, и в комбинации с другими
операциями.
WHERE STIP <20000 стипендии менее 50
WHERE STIP> 20000 стипендии более 50
Логические операции
Логические операции в SQL задаются ключевым словам, а не символами.
• IS NULL, EXISTS
• BETWEEN
• UNIQUE
• IN
• ALL и ANY
• LIKE
IS NULL
Ключевое слово IS NULL используется для проверки равенства данного значения значению
NULL.
Пример проверки равенства значение значению NULL.
WHERE STIP IS NULL Для стипендии не задано значение Пример, в котором значение NULL
не найдется.
WHERE STIP = NULL стипендии имеет значение, равное строке символов "NULL"
Строка "NULL" отличается от значения NULL.
BETWEEN
Ключевое слово BETWEEN используется для поиска значений, попадающих в диапазон,
заданный некоторыми минимальным и максимальным значениями. Эти минимальное и
максимальное значение включаются в соответствующее условие.
WHERE STIP BETWEEN 20000 AND 30000
BETWEEN предполагает включение минимального и максимального значений диапазона в
результаты запроса.
IN
Ключевое слово IN используется для сравнения значения с заданным списком буквальных
значений. Чтобы вернулось TRUE, сравнимое значение должно совпадать хотя бы с одним
значением из списка.
WHERE STIP IN (20000, 30000, 40000)
Стипендии должна равняться 20000, 30000 или 40000
То же самое можно получить, комбинируя условия с помощью ключевого слова OR, но с
помощью IN результат получается быстрее.
LIKE
Ключевое слово LIKE используется для нахождения значений, похожих на заданный. В данном
случае предполагается использование следующих двух знаков подстановки:
• знак процента (%), в Access (*)
• знак подчеркивания (_), в Access (?).
Знак процента представляет ноль, один или несколько символов. Знак подчеркивания
представляет один символ или число. Знаки подстановки могут использоваться в комбинации.
Вот несколько примеров.
WHERE STIP LIKE '17% 'Любое значение, начинается с 17 WHERE STIP LIKE'% 17% "Любое
значение, которое имеет 17 в любой позиции
EXISTS
Ключевое слово EXISTS используется для поиска в таблице строк, удовлетворяющих заданным
критериям.
WHERE EXISTS (SELECT STIP
FROM STUDENTS WHERE SNUM = '333333333')
Проверка SNUM со значением 333333333 в таблице STUDENTS
UNIQUE
Ключевое слово UNIQUE используется для проверки строк заданной таблицы на уникальность.
WHERE UNIQUE (SELECT STIP
FROM STUDENTS
WHERE SNUM = '333333333')
Проверка STIP на наличие повторений
ALL и ANY
Ключевое слово ALL используется для сравнения заданного значения со всеми значениями с
некоторой другой выборки значений.
WHERE STIP <ALL (SELECT STIP
FROM STUDENTS
WHERE CITY = 'Николаевич')
Проверка значения STIP на предмет уменьшения ним всех значений стипендии студентов
Николаевичей
Ключевое слово ANY используется для сравнения заданного значения с любым из
значений некоторой другой выборки значений.
WHERE STIP> ANY (SELECT SALARY
FROM EMPLOYEE_TBL WHERE SOTCH = 'INDIANAPOLIS')
WHERE STIP <ALL (SELECT STIP
FROM STUDENTS
WHERE SOTCH = 'Николаевич')
Проверка значения STIP на предмет уменьшения ним какого-либо из значений зарплаты для
служащих Николаевичей.

III. Индивидуальное задание

Для демонстрации работы компонента TADOQuery создадим совсем маленькое


приложение - самый SQL-монитор (в Delphi является встроенный SQL-монитор, но всегда
приятно сде- ты что-то своими руками!).
Итак, создайте папку для нового приложения. В эту папку скопируйте базу данных
ok.mdb, с которой мы работали на первых практических работах (четыре таблицы,
предназначенные для программы отдела кадров). Создайте новый проект в Delphi, форму
переименуйте в fMain, сохраните ее мо дуль под именем Main, а проект в целом как SQLMon. В
свойстве Caption формы пропишите «Простой SQL-монитор».
Далее на форму установите панель. В свойстве Align панели выберите alTop, чтобы
панель заняла весь верх, а ее высоту растяните примерно на полформы. очистите свойство
Caption. На эту панель установите компонент Memo, именно в нем мы будем писать наши
SQL- запросы. Дважды щелкните по свойству Lines этого компонента, чтобы вызвать редактор
текста, и очистите весь текст. Также не помешает дважды щелкнуть по свойству Font и
изменить размер шрифта на 12 для лучшего восприятия текста. В свойстве Align выберите
alLeft, чтобы компо- нент Memo занял всю левую часть панели.
В правой части панели установите две простые кнопки и компонент TDBNavigator с
вклад- ки Data Controls панели инструментов. Для улучшения внешнего вида интерфейса
ширину кнопок сделайте такой же, как у навигатора базы данных. В свойстве Caption первой
кнопки напишите «Выполнить SQL - запрос», на второй кнопке напишите «Очистить
компонент Memo». Вла- сне, мы могли бы очищать Memo сразу при выполнении SQL-запроса, и
обойтись без второй кноп- ки. Но многие запросы похожи, и проще изменить часть текста
запроса, писать весь запрос заново. На нижнюю, свободную половину формы установите
компонент TDBGrid вкладке Data Controls для отображения данных. В свойстве Align сетки
выберите alClient, чтобы сетка за- верила все оставшееся. У вас должна получиться следующая
картина:
Рис. 1. Внешний вид программы.

Еще нам нужны три компонента: TADOConnection и TADOQuery вкладке ADO для
получения набора данных, и TDataS вкладке Data Access для связи сетки DBGrid и навига- тора
DBNavigator с этим набором данных.
Дважды щелкните ADOConnection1, чтобы вызвать редактор подключений. Нажмите
кно- НКУ «Build», выберите поставщика Microsoft Jet 4.0 OLE DB Provider, и нажмите «Далее».
В поле «Выберите или введите имя базы данных» укажите нашу БД ok.mdb и нажмите «ОК». И
еще раз «ОК», чтобы закрыть окно редактора подключений. Сразу же свойство LoginPrompt
переводи- мо в False, чтобы при каждом запуске программы у нас не спрашивали логин и
пароль, а Connecte вTrue. Подключение к базе данных произошло.
В свойстве Connection компонента TADOQuery выберем ADOConnection1, а в
собствен- тивости DataSet компонента DataSource1 выберем наш ВС ADOQuery1. Теперь набор
данных
ADOQuery1 соединен с базой данных, а DataSource1 - с этим набором данных.
Всвойстве DataSource компонентов DBGrid 1 и DBNavigator1 выберем DataSource1,
чтобы они могли взаимодействовать с набором данных.
Нам осталось только запрограммировать обработчик события onClick для обеих кно-
пок. Дважды щелкните по кнопке "Выполнить SQL-запрос», чтобы сгенерировать это событие,
и пропишите в нем такой код:
/ Проверим - есть текст в Memo, если нет, выходим: if Memo1.Text = '' then begin
ShowMessage ( 'Сначала введите запрос!'); Memo1.SetFocus; Exit;
end;
//Текст есть. Очистим предыдущий запрос в наборе данных: ADOQuery1.SQL.Clear;
//Добавим новый запрос с Memo:
//Открываем набор данных, т. Е. Выполняем запрос: ADOQuery1.Open;

Комментарии здесь достаточно подробные, чтобы разобраться в происходящем. Заметим


только, что набор данных ADOQuery обычно закрыт. После того, как мы меняем его свойство
SQL, прописывая туда новый SQL-запрос, этот набор данных открывается. В результате в БД
пере- ется SQL-запрос, выходят запрашиваемые данные, которые формируют набор данных
ADOQuery Когда этот компонент активен, данные доступны.
Можно также заполнить свойство SQL, дважды щелкнув по нему и открыв редактор
запросов, и сделать активным при проектировании программы. Тогда данные становятся
доступны от- раза. Такой подход удобен, когда программист не собирается в дальнейшем
изменять SQL-запрос этого набора данных. Однако чаще бывает наоборот - в зависимости от
ситуации, используется то один, то другой запрос в одном и том же наборе данных. Так мы
поступаем и в нашем примере - передача SQL-запроса и открытие набора данных мы будем
делать программно.
Еще мы можем заметить, что свойство SQL набора данных TADOQuery имеет тип TStrings,
так же, как свойство Lines компонента Memo или свойство Items компонента ListBox.
То есть, в свойстве SQL мы можем использовать все преимущества, которые нам дает тип
TStrings,
например, загрузка SQL - запроса с внешнего файла:

ADOQuery1.SQL.LoadFromFile ( 'c: \ myfile.sql');

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


более гибкой. Формируя файл с SQL-запросами можно получать различные наборы данных, в
зависимости от обстоятельств. Но в нашей программе мы будем получать SQL-запрос с по- ля
Memo. поскольку тип TStrings используется и в Memo, и в ADOQuery, то следующие строки кода
аналогичные, они все равно сформируют SQL-запрос на основе текста в поле Memo:
ADOQuery1.SQL.Add (Memo1.Text)
ADOQuery1.SQL = Memo1.Lines;
Создайте событие нажатия на вторую кнопку, здесь мы должны просто очистить поле
то- ксту Memo1, и код совсем простой:
Memo1.Clear;
Вот и вся программа. Сохраните ее, скомпилируйте и запустите программу на
выполнение. В поле Memo впишите следующие строки:
SELECT *
FROM LichData;
После этого нажмите кнопку «Выполнить SQL-запрос». В сетке DBGrid отобразятся да-
нет, представляющие собой точную копию таблицы LichData из базы данных ok.mdb.
Строки в примере написаны по правилам и рекомендациям языка SQL, то есть,
операторы заглавными буквами, каждый оператор на отдельной строке, а в конце ставится точка
с запятой. Однако рекомендации можно нарушать, а правила в Delphi более мягкие. Да, мы
можем написать весь текст маленькими буквами, в одну строку, не ставить точку с запятой и не
обращаемся ты внимания на регистр букв:
select * from lichdata
Запрос все равно будет выполнен. Однако лучше следовать рекомендациям и традиций-
ного синтаксиса SQL, ведь этот язык имеет стандарты, и вы можете применять его не только
при работе с Delphi. В других языках программирования или в клиент-серверных СУБД правила
мо гут отличаться, но в любом случае запрос, написанный в стандартном стиле, будет
выполнен. Поэтому лучше сразу приучать себя к стандартному синтаксиса. Мы будем со-
живаться рекомендаций SQL.
Что написано у нас в этом запросе? оператор SELECT означает «выделить», звездочка
означает «все поля», оператор FROM означает «с ...». Таким образом, запрос означает:
ВЫДЕЛИТЬ все поля Из таблицы LichData
Но такой запрос ничем не отличается от применения табличных компонентов, но мы
можем создавать и гораздо более сложные запросы! Допустим, нам нужно получить при-
свыше, имя и отчество работника, а также город его проживания. Основные данные находятся в
таблице LichData, а вот город находится в таблице Adres, связанной с таблицей LichData
релятивной связью один-к-одному по полю «Ключ» таблицы LichData, и по полю «Сотрудник»
таблицы Adres. В этом случае запрос будет выглядеть так:
SELECT Фамилия, Имя, Отчество, Город
FROM LichData,
Adres WHERE Ключ = Сотрудник;
Как видите, в операторе SELECT поля перечисляются через запятую. Также через
запятую пе рераховуються используемые таблицы в операторе FROM. А вот оператор WHERE
указывает, что нужны только те записи, в которых значение поля «Ключ» и «Сотрудник» уровне.
Если бы мы не использовали оператор WHERE, то получили бы кучу недостоверных записей,
где к каждому за- су одной таблицы добавлялись бы все записи другой. оператор WHERE
позволил нам получить связные данные, в которых к одной записи первой таблицы добавляется
соответствующая запись из другой таблицы. С этими и другими операторами мы подробнее
познакомимся на следующей лекции.
Теперь предположим, что в одном наборе данных нам нужно получить записи из двух
таб ликов, связанных релятивной связью один-ко-многим. Так, у одного сотрудника может быть
несколько телефонов. В этом случае придется смириться, что некоторые данные будут
продубльова- нет. Например, запрос:

SELECT Фамилия, Имя, Телефон


FROM LichData, Telephones
WHERE Ключ = Сотрудник;
выдаст нам набор данных, в котором фамилия и имя сотрудника будут дублироваться
для каждого номера его телефона.
Компонент-запрос может формировать набор данных двух типов: переменный, в котором
пользователь может изменять (редактировать, удалять или добавлять) записи, и не меняющийся,
предназначен только для просмотра данных или для составления отчетности. Возможность
получения «живого» набора да- них зависит от различных факторов - от применяемого
оператора, от механизма доступа к да- них, от используемой клиент-серверной СУБД. В данном
примере мы используем опе ратор SELECT, работаем с локальной БД с помощью механизма
ADO. Если вы воспользуетесь навигатором, то убедитесь, что записи можно добавлять и
удалять, а в сетке DBGrid их можно редактировать. Однако при редактировании данных,
полученных более чем из одной таблицы, могут вы- никнуть трудности. Зато набор данных из
одной таблицы можно спокойно менять.

IV. Контрольные вопросы.

1.Как создать простой SQL-монитор?


2.Нужно получить фамилию, имя и отчество работника, а также город его проживания?
3.Варианты создания SQL запросов в Delphi.

V. Оформление отчета.
VI. Защита работы

Вам также может понравиться