Delphi 3 и создание приложений баз данных


25.2.2. Сравнение значения столбца


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

<имя столбца таблицы 1> <оператор> <имя столбца таблицы 2>

Пример.

Выдать все записи о расходе товара из таблицы RASHOD. Для каждого товара выдать его цену из таблицы ТО VARY (результат на рис. 25.3)

SELECT RASHOD.*, TOVARY.ZENA

FROM RASHOD, TOVARY

WHERE RASHOD.TOVAR = TOVARY.TOVAR

При выполнении оператора SELECT для каждой записи из таблицы RASHOD ищется запись в таблице TOVARY, у которой значение в поле TOVAR совпадает со значением в поле TOVAR текущей записи таблицы RASHOD

При этом безразлично, в каком порядке перечислять таблицы в условии поиска, т.е безразлично, какая из таблиц будет упомянута слева, а какая справа. Таким образом, следующие условия поиска идентичны

RASHOD. TOVAR = TOVARY. TOVAR идентично условию

TOVARY.TOVAR = RASHOD.TOVAR

Такой способ соединения таблиц называется внутренним соединением

При внутреннем соединении двух таблиц А и В логический порядок формирования результирующего НД можно представить себе следующим образом.

1. Из столбцов, которые указаны после слова SELECT, составляется декартово произведение путем сцепления результирующих столбцов каждой записи из таблицы А и результирующих столбцов записи из таблицы В

2 Из получившегося НД отбрасываются все записи, не удовлетворяющие условию поиска в предложении WHERE

ЗАМЕЧАНИЕ

Определение "логический порядок формирования результирующего набора данных" употреблено не случайно В проектировании данных всегда различают два уровня - логический и физический. Логический уровень - это часто достаточно абстрактный уровень; физический уровень определяет действительно протекающие процессы, в большинстве случаев скрытые от взгляда, не лежащие на поверхности.

Поэтому, когда мы говорим о "логическом порядке выполнения запроса", это подразумевает, что так нам легче понимать процессы, происходящие при выполнении внутреннего соединения; на самом же деле физические процессы, реально протекающие на сервере БД при выполнении запроса, могут не совпадать с нашим логическим представлением о них.

SQL-сервер при выполнении запроса всегда стремится его оптимизировать, то есть выполнить с максимальной быстротой при минимально возможных затратах ресурсов. В частности, оптимизация запросов в InterBase представляет собой "черный ящик", то есть нельзя сказать, как именно будет выполняться конкретный запрос, поскольку, помимо прочего, при оптимизации не последнюю роль играет текущее состояние БД. Подобные вопросы рассматриваются ниже в разделе, посвященном оптимизации запросов.

Пример. Пусть имеются таблицы А и В. Тогда выполнение оператора

SELECT А.P1, A.P2, В.Р2

FROM А, В

WHERE A.P2 = В.P1

с логической точки зрения приведет к формированию такого декартова произведения таблиц А (столбцы А Р1 и А Р2) и В (столбцы В.Р1 и В.Р2)

Примечание.

Столбец В.Р1, которого нет в результирующем запросе, показан для наглядности.

Затем путем исключения из декартова произведения записей, не удовлетворяющих условию "A.P2 = В.Р1", будет получен такой результирующий НД:

Пример.

Выдать все записи о расходе товара из таблицы RASHOD Для каждого покупателя выдать его адрес из таблицы POKUPATELI (результат на рис 25 4)

SELECT RASHOD.*, POKUPATELI.ADRES

FROM RASHOD, POKUPATELI

WHERE POKUPATELI.POKUP = RASHOD.POKUP

Рис 25.4 Как можно видеть, в результирующий НД не включены:

1. записи из таблицы RASHOD с пустым наименованием покупателя (записи с пустым наименованием покупателя в таблице POKUPATELI нет);

2. запись из таблицы POKUPATELI (POKUP = "Геракл"), поскольку по данному покупателю нет записей в таблице RASHOD.

Пример.

Используя оператор SELECT из предыдущего примера, выдать декартово произведение по всем столбцам таблицы RASHOD и по столбцу ADRES из таблицы POKUPATELI. Для этого нужно удалить из оператора SELECT предложение WHERE. Результат выполнения запроса не приводим из-за его величины (8 * 4 = 32 записи).

SELECT RASHOD.*, POKUPATELI.ADRES

FROM RASHOD, POKUPATELI




Начало  Назад  Вперед



Книжный магазин