- •Оглавление
- •Часть 1. Краткое описание Delphi 8
- •Часть 2. Технология ado для баз данных access 186
- •9.1. Общие сведения 289
- •Введение
- •Часть 1. Краткое описание Delphi
- •1. Работа со средой delphi
- •1.1. Ознакомление с delphi
- •1.2. Вкладка дизайнера формы (design)
- •1.3. Вкладка редактора кода программы
- •1.4. Окно object inspector
- •1.5. Окно project manager
- •1.6. Окно палитры инструментов
- •1.7. Создание первого проекта приложения
- •1.8. Сохранение проекта
- •1.8. Сохранение проекта
- •1.9. Компиляция
- •2. Основа языка delphi
- •2.1. Основные понятия языка
- •2.1.1. Элементы языка
- •2.1.2. Пример простой программы
- •2.1.3. Типы данных
- •2.1.4. Операции и выражения
- •2.1.5. Стандартные функции
- •2.1.6. Ввод и вывод на дисплей
- •2.1.7. Оператор присваивания
- •2.2. Операторы языка паскаль
- •2.2.1. Составной оператор
- •2.2.2. Условный оператор
- •2.2.3. Сложные условия
- •2.2.4. Оператор выбора case
- •2.2.5. Оператор цикла for
- •2.2.6. Оператор цикла while
- •2.2.7. Оператор цикла repeat
- •2.2.8. Вложенные циклы
- •2.2.9. Прочие операторы
- •2.3. Общая структура программы
- •2.3.1. Перечень разделов программы
- •2.4. Массивы
- •2.4.1. Одномерные массивы
- •2.4.2. Сортировка массивов и поиск элемента в массиве
- •2.4.3. Многомерные массивы
- •2.5. Функции и процедуры
- •2.5.1. Описание функций
- •2.5.2. Обращение к функции
- •2.5.3. Процедуры
- •2.5.4. Параметры-значения и параметры-переменные
- •2.5.5. Локальные и глобальные переменные
- •2.5.6. Pекурсия
- •2.6. Строки символов
- •2.6.1. Задание строк
- •Var имя: string[длина];
- •2.6.2. Функции и процедуры для обработки строк
- •2.7. Порядковые типы данных
- •2.7.1. Перечисляемый тип данных
- •2.7.2. Интервальный тип данных
- •2.7.3. Порядковые типы данных
- •2.7.4. Дополнение:тип данных tDateTime (дата-время)
- •2.8. Множества
- •2.8.1. Значения типа множество
- •2.8.2. Операции на множествах
- •2.9. Записи
- •2.9.1. Поля записи
- •2.9.2. Оператор with
- •2.9.3. Последовательный поиск в массиве записей
- •2.9.4. Двоичный поиск в массиве записей
- •2.10. Файлы
- •2.10.1. Основные свойства файлов
- •2.10.2. Типизированные файлы
- •2.10.3. Текстовые файлы
- •2.10.4. Поиск файлов
- •2.11. Динамическая память
- •2.11.1. Динамические переменные и указатели
- •2.11.2. Динамические списки
- •2.11.3. Деревья
- •2.12. Программные модули
- •2.12.1. Модули, формируемые пользователем
- •2.12.2. Стандартные модули
- •2.12.3. Примеры программ
- •3. Главная форма
- •3.1. Свойства главной формы
- •3.2. События главной формы
- •4. Описание некоторых компонентов
- •4.1. Компонент tpanel (панели)
- •4.2. Компонент tbutton (кнопка)
- •4.3. Дополнительные кнопки
- •4.4. Компонент tlabel (надписи)
- •4.5. Компонент tedit (Строки ввода)
- •4.6. Компонент тМето (многостроч. Поле ввода)
- •4.7. Свойства и методы класса tstrings
- •4.8. Компонент checkbox (флажок)
- •4.9. Компонент tradiobutton (кнопки выбора)
- •4.10. Компонент MainMenu (главное меню программы)
- •4.11. Компонент timage
- •4.12. Компонент tstringgrid (сетка)
- •4.13. Компонент ttimer(таймер)
- •5. Отладка программ
- •5.1. Типы ошибок
- •5.2. Отладка программы
- •5.2.1. Трассировка программы
- •5.2.2. Точки останова программы
- •5.2.3. Наблюдение значений переменных
- •Часть 2. Технология ado для баз данных access
- •6. Создание баз данных access
- •6.1. Определение понятия баз данных
- •6.2. Интерфейс программы access
- •6.3. Создание базы данных в access 2007
- •6.3.1. Создание двухтабличной базы данных
- •6.3.2. Создание базы данных с вычисляемыми полями
- •6.4. Выбop формата для новой базы данных
- •6.5. Создание пустой базы данных
- •6.6. Открытие и закрытие базы данных
- •6.7. Создание таблиц в режиме конструктора
- •6.7.1. Выбор первичного ключа
- •6.7.2. Изменение полей и таблиц
- •6.7.3. Копирование полей
- •6.7.4. Перемещение полей
- •6.7.5. Удаление полей
- •6.7.6. Операции с таблицами
- •6.8. Создание базы данных в access 2003
- •6.9. Установление связей между таблицами
- •6.10. Обеспечение целостности записей в базе данных
- •6.11. Редактирование и удаление связей
- •7. Система доступа к данным ado
- •7.1. Общие сведения
- •7.2. Компонент adoConnection
- •7.2.1. Свойства компонента adoConnection.
- •7.2.2. Методы компонента adoConnection
- •7.3.Компонент аdоТable
- •7.3.1. Свойства компонента tadoTable
- •7.3.2. Методы компонента tadoTable
- •7.4. Компонент adoQuery
- •7.5. Компонент adoDataSet
- •7.5.1.Свойства компонента adoDataSet
- •7.5.2. Методы компонента adoDataSet
- •7.5.3. Cобытия компонента adoDataSet
- •7.6. Компонент DataSource
- •7.7.Комнонент DataGrid
- •7.7.1 Cвойства компонента DataGrid
- •7.7.2. Методы и события компонента DataGrid
- •7.8. Компонент adocommand
- •8. Управление базами данных
- •8.1. Приложение для управления базами данных
- •8.2. Свойства полей базы данных
- •8.3. Редактирование базы данных
- •8.4. Сортировка данных
- •8.5. Поиск данных в базе
- •8.5.1. Фильтрация данных в базе
- •8.5.2. Нахождения информации методом Locate
- •9.1. Общие сведения
- •9.2. Основные операторы запроса
- •9.2.1. Агрегатные функции
- •9.2.2. Подзапросы
- •9.3. Операторы наполнения баз данных sql
- •9.3.1. Ввод значений
- •9.3.2. Удаление значений
- •9.3.3. Изменение значений
- •9.4. Операторы создания баз данных sql
- •9.4.1. Команда создания таблицы.
- •9.4.2. Первичные ключи таблицы
- •9.4.3. Индексы таблицы
- •9.4.4. Добавление в таблицу новых столбцов
- •10. Реализация sql- запросов
- •10.1. Компонент tadoQuery для sql- запросов
- •10.2. Форма для реализация sql-запроса
- •11. Генератор отчетов Quick Reports
- •11.1.Описание Quick Reports
- •11.2. Печать записи с помощью Quick Reports
- •11.3. Печать таблиц с помощью Quick Reports
- •394026 Воронеж, Московский просп., 14
9.2.2. Подзапросы
С помощью SQL можно не только создавать запросы, но и вкладывать запросы внутрь друг друга.
Обычно, внутренний запрос генерирует значение, которое проверяется в предикате внешнего запроса, определяющего верно оно или нет.
Например, предположим, что имеется виртуальная база данных с рядом таблиц, среди которых таблица Prodavsy, в которой среди прочих полей имеется поле NumberP (Номер прдавца) и поле NameP(имя продавца). Мы знаем имя продавца, например, Иванов, но не знаем значение его поля NumberP (SQL имеет механизмы, которые определяют - кто имеет привилегии, чтобы делать что-то в определенной таблице).
В этой же базе данных имеется таблица Pokypca, и мы хотим извлечь из нее все данные, касающиеся продавца Иванова.
SQL позволяет сделать это с помощью следующего запроса с подзапросом
SELECT *
FROM Pokypca
WHERE NumberP =
( SELECT NumberP
FROM Prodavsy
WHERE NameP = 'Иванов');
Чтобы оценить внешний( основной ) запрос, SQL сначала должен оценить внутренний запрос ( или подзапрос ) внутри предложения WHERE.
Он делает это так, как и должен делать запрос, имеющий единственную цель - отыскать через таблицу Продавцов все строки, где поле NameP равно значению Иванов, и затем извлечь значения поля NumberP из этих строк.
Единственной найденной строкой естественно будет поле NumberP, соответствующее имени Иванов.
Пусть, например, номер Иванова равен 10. Однако SQL, не просто выдает это значение, а поместит его в предикат основного запроса вместо самого подзапроса так, чтобы предикат прочитал, что WHERE NumberP = 10
Основной запрос затем выполняется, как обычно, с вышеупомянутыми результатами.
Конечно же, подзапрос должен выбрать один и только один столбец, а тип данных этого столбца должен совпадать с тем значением, с которым он будет сравниваться в предикате.
Вообще, результатом внутреннего запроса, должна быть только одна строка.
Если внутренний запрос вернёт несколько строк или вообще ничего не вернёт, то могут возникнуть проблемы.
Для большей надёжности используйте с подзапросом оператор DISTINCT.
Единственный случай, когда подзапрос может выдавать в результате несколько строк, это когда в основном запросе используется оператор IN.
Вообще, подзапросы в SQL –это одна из сложных тем.
При создании сложных запросов с подзапросами могут применяться, кроме указанных выше, специальные операторы подзапросов Exist, Any, All, Some и некоторые другие.
Более подробно с этой темой можно ознакомиться в специальной литературе, например, в [10].
9.3. Операторы наполнения баз данных sql
В предыдущем разделе мы занимались выборками из таблиц базы данных, при этом содержание самих таблиц не менялось.
Но SQL позволяет не только делать выборку, но и менять содержимое таблиц.
Для этого в SQLимеются операторы
INSERT (Вставить)
UPDATE (Модифицировать)
DELETE (Удалить)
9.3.1. Ввод значений
Все строки в таблицу SQL вводит с использованием команды INSERT.
В самой простой форме, команда INSERT использует следующий синтаксис:
INSERT INTO <TABLE name>VALUES ( , . . .);
Предположим, что имеется таблица Sotrydniki (Сотрудники), содержащая четыре столбца (поля): номер сотрудника (NumberS), его имя (NameS), его стаж(AgeS) и название фирмы (OfficeS)
Ввести в таблицу Sotrydniki новую строку, можно следующей командой:
INSERT INTO Sotrydniki
VALUES (105, 'Ivanov', 12, 'Stele');
Команда INSERT не производит никакого вывода, и программист должен сам обеспечить некоторое подтверждение того, что данные были введены.
Каждое значение, пронумерованное в предложении значений, должно совпадать с типом данных столбца, в который оно вставляется. Значения не могут составлять выражений, например, значение поля AgeS = 12 доступно, а значение поля AgeS = 11 + 1 - нет.
Должно соблюдаться полное совпадение между порядком следования столбцов в таблице и в команде INSERT, так как значения вводятся в таблицу в поименном порядке, т. е. первое значение автоматически попадает в столбец 1, второе в столбец 2, и так далее.
Если в таблицу нужно ввести пустое значение(NULL), оно вводится точно так- же как и обычное значение.
Предположим, что еще не имелось поля AgeS для Ivanov. В этом случае можно вставить в это поле значение, равное NULL, следующим образом:
INSERT INTO Sotrydniki
VALUES (105, 'Ivanov', NULL, 'Stele');
Так как значение NULL - это специальный маркер, а не просто символьное значение, он не включается в одиночные кавычки.
В предложении INSERT можно указывать в произвольном порядке столбцы, куда вы хотите вставить значения. Для этого нужно после имени таблицы в круглых скобках через запятую указать желаемый порядок следования полей. Это позволяет вставлять значения в том же порядке.
Например,
INSERT INTO Sotrydniki (NumberS, OfficeS, AgeS, NameS)
VALUES (105, , 'Stele', , 38); 'Ivanov'
Если некоторые столбцы не перечислены, то их значения устанавливаются по умолчанию
Команду INSERT можно также использовать, чтобы получать или выбирать значения из одной таблицы и помещать их в другую, чтобы использовать их вместе с запросом. Чтобы это сделать, нужно просто заменить предложение VALUES (из предыдущего примера) на соответствующий запрос:
INSERT INTO Age
SELECT *
FROM Sotrydniki
WHERE AgeS =15;
Здесь выбираются все значения, произведенные запросом, т. е. все строки из таблицы Sotrydniki со значениями AgeS = 15, и помещаются в таблицу, называемую Age (стаж). Чтобы все это работало, таблица Age должна отвечать следующим условиям: *
Она должна уже быть создана командой CREATE TABLE.
Она должна иметь четыре столбца, которые совпадают с таблицей Sotrydniki в терминах типа данных; то есть первый, второй, и так далее, столбцы каждой таблицы, должны иметь одинаковый тип данных ( причем они не должны иметь одинаковых имен ).