Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РЭУБД.doc
Скачиваний:
17
Добавлен:
20.12.2018
Размер:
239.62 Кб
Скачать
  1. Показать работу с основными компонентами InterBase: ibDataBase, ibDataSet, ibTransaction, ibQuery на примере тестовой базы данных. Билет №15

  1. Назначение и структура файлов базы данных. Команды по созданию и перемещению файла базы данных, по определению структуры и администрированию базы данных.

  2. Параметризированные запросы.

При программировании очень часто возникает необходимость в передаче каких либо параметров в SQL запрос. В большинстве случаев это делают при помощи обычных текстовых операций, но в таком подходе иногда возникают подводные камни. Например при передаче текстового параметра необходимо позаботиться о спец символах (например апострофы). Так же не стоит забывать, что при передаче таким образом даты - может возникнуть серьезная проблема из-за различий в формате даты.

Самым правильным с точки зрения надежности является передача параметров при помощи параметризированных запросов. Параметризированный запрос выглядит следующим образом:

SELECT * FROM Table1 WHERE Field1=:Param1

  1. Создайте автоинкрементные поля для таблиц «Товары», «Поставщики», используя генераторы и триггеры.

Билет 18

Билет 19

2. Объединение таблиц: виды(внутреннее, внешнее, левое, правое). Использование псевдонимов таблиц.

Ответ:

В запросе можно объединить данные двух или более таблиц. Пусть, например, вы хотите получить список сотрудников всех производственных подразделений. В таблице Pers мы имеем список сотрудников с указанием в поле Dep подразделений, в которых они работают. А в таблице Dep мы имеем список всех подразделений в поле Dep и характеристику каждого подразделения в поле Proisv (true, если подразделение производственное). Тогда получить список сотрудников всех производственных подразделений можно оператором:

SELECT Pers* FROM Pers, Dep

WHERE (Pers.Dep=Dep.Dep)AND(Dep.Proisv=true)

В нем мы обращаемся сразу к двум таблицам Pers и Dep, которые перечислены после ключевого слова FROM. Поэтому каждое имя поля предваряется ссылкой на таблицу, к которой оно относится. Впрочем, это надо делать только для полей, имя которых повторяется в разных таблицах (поле Dep). Перед полем Proisv ссылку на таблицу можно опустить. В конструкции WHERE условие Pers.Dep=Dep.Dep ищет запись в таблице Dep, в которой поле Dep совпадает с полем Dep текущей записи таблицы Pers. А условие Dep.Proisv=true отбирает те записи, в которых в таб­лице Dep найденному подразделению соответствует поле Proisv = true.

В операторах, работающих с несколькими таблицами, обычно каждой таблице дается псевдоним, сокращающий ссылки на таблицы, а иногда придающий им некоторый смысл, вытекающий из данного применения. Псевдоним таблицы может записываться в списке таблиц после слова FROM, отделяясь от имени таблицы пробелом. Например, приведенный выше оператор может быть переписан следующим образом:

SELECT P.* FROM Pers Р, Dep D

WHERE (P.Dep=D.Dep)AND(D.Proisv=true)

В этом примере таблице Pers дан псевдоним Р, а таблице Dep — D. Конечно, эти псевдонимы действуют только в данном операторе и не имеют никакого отношения к псевдонимам баз данных, которые мы постоянно используем.

Возможно самообъединение таблицы. В этом случае одной таблице даются два псевдонима. Пусть, например, мы хотим найти всех ровесников в организации. Это можно сделать оператором

SELECT pl.fam, р2.fam, pl.year_b FROM Pers p1, Pers p2

WHERE (pl.year_b = p2.year_b) AND (pl.fam <> p2.fam)

В этом примере для таблицы Pers мы ввели два псевдонима: p1 и р2. В конст­рукции WHERE мы ищем в этих якобы разных таблицах записи с одинаковым го­дом рождения. Второе условие pl.fam <> p2.fam нужно, чтобы сотрудник не ото­бражался в результатах как ровесник сам себя. Правда, приведенный оператор вы­дает в результате по две записи на каждую пару ровесников, сначала, например, «Николаев — Андреев», а потом «Андреев — Николаев». Чтобы исключить такое дублирование можно добавить еще одно условие — pl.Fam < p2.Fam:

SELECT pl.fam, p2.fam, pl.year_b FROM Pers pi, Pers p2

WHERE (pl.year_b = p2.year_b) AND (pl.fam <> p2.fam) and(p1.Fam < p2.Fam)

Дополнительное условие упорядочивает появление фамилий в p1 и р2 и иск­лючает дублирование результатов.

До сих пор мы рассматривали объединения, основанные на однозначном соответствии записей двух таблиц, когда каждой записи в первой таблице находилась соответствующая ей запись во второй таблице. Возможны и другие виды объедине­ний, которые выдают записи независимо от того, есть ли соответствующее поле во второй таблице. Это внешние объединения (outer join). Их три типа: левое, правое и полное.

Левое объединение (обозначается ключевыми словами LEFT OUTER JOIN ... ON) включает в результат все записи первой таблицы, даже те, для кото­рых не имеется соответствия во второй.

Правое объединение (обозначается ключе­выми словами RIGHT OUTER JOIN ... ON) включает в результат все записи второй таблицы, даже если им нет соответствия в записях первой.

Полное объединение (обозначается ключевыми словами FULL OUTER JOIN ... ON) включает в резуль­тат объединение записей обеих таблиц, независимо от их соответствия.

Пусть, например, у вас есть таблица сотрудников некоей компании Pers и есть таблица Chef, в которой занесены данные на членов совета директоров этой компании. В число членов совета входят и сотрудники компании, и посторонние лица. Для определенности положим, что в таблице Pers имеются записи на сотрудников «Иванов» и «Петров», причем Петров является членом совета, а Иванов — нет. В таблице Chef имеются записи на членов совета «Петров» и «Сидоров», причем Сидоров — не сотрудник компании. Тогда оператор выдаст результат вида

SELECT * FROM Pers LEFT OUTER JOIN Chef ON Pers.Fam = Chef.Fam

Оператор задал левое объединение таблицы Pers (она указана после ключевого слова FROM) с таблицей Chef (она указана после ключевых слов LEFT OUTER JOIN). Условие объединения указано после ключевого слова ON и заключается в совпадении фамилий.

Как показано, результат включает все поля и таблицы Pers, и таблицы Chef. Число строк соответствует числу записей таблицы Pers. В строках, относящихся к записям, для которых в Chef не нашлось соответствие, поля таблицы Chef остаются пустые.

Оператор правого объединения

SELECT * FROM Pers RIGHT OUTER JOIN Chef ON Pers.Fam = Chef.Fam

Число строк соответствует числу записей таблицы Chef. В строках, относя­щихся к записям, для которых в Pers не нашлось соответствие, поля таблицы Pers остаются пустые.

Оператор полного объединения

SELECT * FROM Pers FULL OUTER JOIN Chef ON Pers.Fam = Chef.Fam

В результирующей таблице к строкам, относящимся к таблице Pers, добавлены строки, относящиеся к таблице Chef, для которых не нашлось соответствия в таблице Pers.

Билет 20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]