![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Использование множества таблиц в одном запросе.
На лаб. раб. мы рассматривали запросы выбирающие информация из нескольких таблиц. Одна из наиболее важных черт запросов SQL состоит в их способности определять связи между множеством таблиц и отображать содержащуюся в них информацию в терминах этих связей в рамках одной команды. Операция такого рода называется соединением (Join) и является одной из самых мощных операций для рел. баз данных. При операции соединения таблицы перечисляются через запятую в предложении запроса FROM. Предикат запроса может ссылаться на любой столбец любой из соединяемых таблиц и, следовательно, может использоваться для установления связей между ними. Обычно предикат сравнивает значения в столбцах различных таблиц для определения истинности условия WHERE. Выполняя операцию соединения, необходимо генерировать все возможные сочетания строк для двух или более таблиц и проверять истинность предиката на каждом таком сочетании. Соединение, использующие предикаты, основанные на равенствах, называется эквисоединением. Фактически в соединении можно использовать любой оператор сравнения. Наиболее часто встречающимся примером эквисоединения может служить операция соединения таблиц посредством ссылочной целостности. Но в операции соединения могут участвовать любые столбцы различных таблиц (и даже одной и той же таблицы) не обязательно связанных отношением “предок - потомок”. Выполнение операции соединения – декартово произведение.
Столбцами таблицы произведения являются все столбцы первой таблицы, за которыми следуют все столбцы второй таблицы.
Объединенную таблицу образуют пары тех строк из различных таблиц, у которых в связанных столбцах содержаться одинаковые значения. Если пара отсутствует (соответствующие значение еще не присвоено, т.е. имеет значение NULL), то стандартное SQL – объединение может привести к потере информации. Рассмотренное объединение иногда называют внутренним объединением таблиц.
Внешнее соединение
В стандарте SQL 89 определено только внутренне соединение.
Построение внешнего объединения(объединения “сохраняющего информацию”) 1. Создать внутреннее соединение двух таблиц обычным образом. 2. Каждую строку первой таблицы, которая не имеет связи ни с одной строкой второй таблицы, добавить в результате запроса, присваивая всем столбцам второй таблицы значения NULL. 3. Каждую строку второй таблицы, которая не имеет связи ни с одной строкой первой таблицы, добавить в результате запроса, присваивая всем столбцам первой таблицы значения NULL. 4. Результирующая таблица является внешним объединением двух таблиц.
Полученное внешнее объединение называется полным внешним объединением. Оно симметрично по отношению к обеим таблицам. Существуют еще два типа внешних объединений, которые не симметричны относительно двух таблиц. Левое внешнее объединение Выполнить пункты 1 и 2, пункт 3 пропустить.(т.е. попадают в рез-т все несвязанные строки из левой таблицы). Обозначается *=.
Правое внешнее объединение Выполнить пункты 1 и 3, пункт 2 пропустить. (т.е. попадают в рез-т все несвязанные строки из правой таблицы). Обозначается =*.
*=*
В sql2
Select * from tabl inner Join tabl2 On tabl.col1 = tabl2.col2
Или
Select * from tabl inner Join tbl2 Using (col1, col2)
Естественное соединение
Select * from tabl Natural Inner Join tbl2
Таблица, у которой все строки включаются в соединение, называется главной, а другая – вспомогательной.
Вложенные запросы
SQL позволяет выполнять вложенные подзапросы. Обычно внутренний запрос генерирует значения, которые тестируются на предмет истинности предиката. Пример: Выбор всех записей в которых поле “имя”=< значение> Старый вариант - использовался в лаб. работе if! empty(thisform.combo2.value) select nam locate for nam_val = alltrim(thisform.combo2.value) w_n_num=n_num else w_n_num=0 endif
select test_lb.uniq_id, fam.f_val as family, nam.nam_val as nam, otc.otc_val as otc,; street.s_val as street, test_lb.bldn as bld, test_lb.bldn_kor as bld_k,; test_lb.appr as appr, test_lb.telef as tel; from test_lb, fam, nam, otc, street; where nam.n_num=test_lb.name_ AND; fam.f_num=test_lb.fam AND; street.s_num=test_lb.street AND; otc.otc_n=test_lb.sndname AND; nam.n_num=w_n_num; INTO table test
Новый вариант - с подзапросом:
select test_lb.uniq_id, fam.f_val as family, nam.nam_val as nam, otc.otc_val as otc,; street.s_val as street, test_lb.bldn as bld, test_lb.bldn_kor as bld_k,; test_lb.appr as appr, test_lb.telef as tel; from test_lb, fam, nam, otc, street; where nam.n_num=test_lb.name_ AND; fam.f_num=test_lb.fam AND; street.s_num=test_lb.street AND; otc.otc_n=test_lb.sndname AND; nam.n_num = (SELECT n_num FROM Nam WHERE Nam_val =‘Иван’); INTO table test
Чтобы оценить внешний (основной) подзапрос, SQL должен оценить внутренний запрос в предложении WHERE. Эта оценка осуществляется так, как будто внутренний запрос является одиночным: Просматриваются все строки таблицы Nam и выбираются строки для которых значение поля Nam_val=‘Иван’ для таких строк выбирается значение поля n_num. Выбранной оказывается одна строка. Выбранное значение подставляется в предикат основного запроса. Затем основной запрос выполняется как обычный. Преимущества: - сработает при изменении номера, более гибкий (годится для всех имен);
|