Sqlглава 3 запросы с использованием нескольких таблиц


Содержание

Sqlглава 3 запросы с использованием нескольких таблиц

В данной статье речь пойдет о использовании нескольких таблиц внутри оператора SELECT. Просто перечисление двух таблиц внутри оператора SELECT даст N * M записей, где N — количество записей в первой таблице, а M — во второй. Где каждая запись представляет собой конкатенацию одной записи из первой таблицы и одной записи из второй таблицы.

SELECT A.AGE, B.AGE FROM Student AS A, Student AS B

Если вы хотите два раза использовать одну и ту же таблицу в запросе, то вам необходимо переименовать ее. Переименование таблиц происходит также как и переименование столбцов с помощью AS. Если название какого — либо поля повторяются в таблицах, то для доступа к этому полю необходимо использовать «название_таблицы.имя_поля». Для дальнейшего объяснения данной темы модифицируем нашу базу данных. Добавим еще одну таблицу StudentGroup в которой у нас будут поля:

  • int ID(номер группы)
  • int SpecialtyID(номер специальности)
  • bool commerce(коммерческая или бюджетная)

лабы по информатике, егэ

лабораторные работы и задачи по программированию и информатике, егэ по информатике

SQL урок 3. Запросы sql INNER JOIN (объединение таблиц)

Выборка из нескольких таблиц (неявная операция соединения)

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

Рассмотрим пример неявной операции соединения:

SELECT DISTINCT группы.`Преподаватель` , список.`Учебная группа` , список.`курс` FROM группы, список WHERE группы.`Учебная группа` = список.`Учебная группа` AND курс

SELECT DISTINCT pc.Номер, Производитель FROM pc, product WHERE pc.Номер = product.Номер AND Цена

SELECT DISTINCT A.`Курс` AS номер_курса1, B.`Курс` AS номер_курса2 FROM список AS A, список AS B WHERE A.`Год рождения` = B.`Год рождения` AND A.Курс A.Курс используется для того, чтобы не выводились одинаковые пары, отличающиеся только перестановкой курса.
В общем случае можно использовать условие A.Курс <> B.Курс !

SELECT DISTINCT A.Номер AS модель1, B.Номер AS модель2 FROM pc AS A, pc AS B WHERE A.Цена = B.Цена AND A.Номер A.Номер используется для того, чтобы не выводились одинаковые пары, отличающиеся только перестановкой номера:

Запросы sql INNER JOIN

В предложении FROM может использоваться явная операция соединения двух и более таблиц.

Разберем пример. Имеем две таблицы: teachers (учителя) и lessons (уроки):

teachers lessons

SELECT t.name,t.code,l.course FROM teachers t INNER JOIN lessons l ON t. >

В запросе буквы l и t являются псевдонимами таблиц lessons (l) и teachers (t).

Inner Join — это внутреннее объединение ( JOIN — с англ. «объединение», ключевое слово INNER можно опустить).

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

Запросы sql OUTER JOIN

При использовании внутреннего объединения inner join выбираются только совпадающие данные из объединяемых таблиц. Для того чтобы получить данные, которые подходят по условию частично, необходимо использовать внешнее объединение.

OUTER JOIN — внешнее объединение, которое возвращает данные из обеих таблиц (совпадающие по условию объединения), ПЛЮС выборка дополнится оставшимися данными из внешней таблицы, которые по условию не подходят, заполнив недостающие данные значением NULL .

Существует два типа внешнего объединения — LEFT OUTER JOIN («внешней» таблицей будет находящаяся слева) и RIGHT OUTER JOIN («внешней» таблицей будет находящаяся справа).

Рисунок относится к объединению типа Left Outer Join:

SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t. >

С тем же примером (выбрать имена учителей и курсы, которые они ведут) фильтрация по RIGHT OUTER JOIN вернет полный список уроков по курсам (правая таблица) и сопоставленных учителей. Но так как нет таких уроков, которые бы не соответствовали определенным учителям, то выборка будет состоять только из двух строк:

SELECT t.name, t.code, l.course FROM teachers t RIGHT OUTER JOIN lessons l ON t. >

Выбрать фамилии студентов и их оценки по Word. В случае отсутствия оценки, все равно выводить фамилию.

В приведенных примерах можно вводить фильтры для более точной фильтрации:

SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t. >

Объединение с подзапросом

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

SELECT t1.*, t2.* from left_table t1 left join (select * from right_table where some_column = 1 limit 1) t2 ON t1. >

SELECT t1.*, t2.* from left_table t1 inner join (select * from right_table where some_column = 1 limit 1) t2 ON t1. >

SELECT t1.*, t2.* from teachers t1 inner join (select * from lessons where course = «php» limit 1) t2 ON t1. >

Разберем еще один пример:


SELECT t1.производитель, t1.Тип, t2 . * FROM pc t2 INNER JOIN ( SELECT * FROM product WHERE Тип = «Компьютер» ) t1 ON t2.Номер = t1.Номер

Так как в таблице product находятся данные не только по компьютерам, то мы использовали подзапрос, при этом сохранив внутреннее соединение таблиц.
Результат:

Запрос для очистки нескольких таблиц одновременно

Нужно очистить 7 таблиц. Возможно ли очистить все 7 таблиц одним SQL запросом? Периодически делаю это. Хочу составить один запрос и потом просто выполнять его и чтобы все 7 таблиц очищались.

Попробовал через запятую:

но получил ошибку.

Заранее благодарен за помощь.

09.06.2014, 13:30

Запрос для нескольких таблиц
Есть две таблицы: vehicles id|user_id 1|1 2|2 3|2 4|3 5|3 user_messages

MySQL запрос для нескольких таблиц!
Здравствуйте! У меня такая проблема:

Выборка из нескольких таблиц одновременно
можно ли сформировать запрос что бы выбрать рандом например 10 записей из одной таблици и столько.

Выборка из нескольких таблиц одновременно
Можно ли выбрать данные из нескольких таблиц одновременно? Что-то типа ‘Select * from Tab1, Tab2.

Запрос на выборку из нескольких таблиц
Необходимо составить запрос с использованием JOIN, по которому выводится список кандидатов и.

Запросы из нескольких таблиц

О запросах в MS Access 2007.

Запросы, как вы уже знаете, нужны для работы с данными, находящимися в таблицах.
Чтобы создать запрос…
1) …в окне базы данных открываете Запросы
2) …и создаете запрос с помощью конструктора.

Пожалуйста, НЕ пользуйтесь для создания запросов Мастером, потому что он позволяет делать только самые простые запросы, а переделывать их потом в более продвинутые даже сложнее, чем создать запрос в конструкторе «с нуля».

Пожалуйста, скачайте базу данных для выставки собак (dogs.mdb). В ней вы найдете данные, необходимые вам для создания запросов.

Запросы на выборку

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

Итак, вот главные элементы конструктора запросов:
1 – область данных (таблиц);
2 – область условий отбора;
3 – кнопка запуска запроса.

Условия отбора

В запросах на выборку можно задавать условия. Для этого в СООТВЕТСТВУЮЩЕМ СТОЛБЦЕ нужно указать в строке Условие отбора нужное значение.

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

Найдем всех шар-пеев.

Будьте внимательны! Компьютер ищет ТОЧНЫЕ совпадения, поэтому если вы случайно сделали опечатку, поставили лишний пробел или забыли дефис, то запрос может не сработать.

При задании условия отбора можно использовать операторы >, = (больше или равно), (не равно).
Найдем всех молодых (моложе 2 лет) собак.

Обратите внимание! Также как и Excel, Access работает с разными типами данных: строковыми, числовыми, временными, логическими и др. Чтобы показать, к какому типу он отнес данное условие отбора, Access автоматически заключает строки в кавычки («шар-пей»), даты – в решетки (#01.05.2008#), числа оставляет, как есть (15), а логические проверяет, чтобы были либо ИСТИНА, либо ЛОЖЬ.

Составные условия отбора

Если нужно задать несколько условий, то условия для оператора «И» записывайте в одной строчке, а для оператора «ИЛИ» в одном в столбце друг под другом.
Здесь мы находим всех английских сеттеров и сеттеров-гордонов.

А здесь всех щенков (моложе года) шар-пеев.

А кого мы найдем здесь?

а) всех щенков шар-пеев и щенков английских сеттеров;
б) всех щенков шар-пеев и всех английских сеттеров;
в) всех шар-пеев и всех щенков английских сеттеров;

Проверьте! Сформулируйте правило, по которому Access из записей в ячейках формирует составные условия отбора.

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

Всех юниоры (которым больше года, но меньше двух лет).

Оператор LIKE

На выставке организована секция сеттеров. Для участия в ней нам необходимо отобрать всех представителей этой группы. Если мы просто напишем в условиях отбора «сеттер», то запрос не отберет ни одной записи, поскольку у нас нет просто сеттеров, а есть английские, ирландские сеттеры, сеттеры-гордоны, а Access требует полного совпадения значения в ячейке со значением, указанным в условии отбора. Перечислять их всех слишком долго, к тому же можно кого-нибудь забыть.
В этом случае нам пригодится оператор LIKE, который позволяет делать отбор по фрагменту строки. Использование LIKE перед условием отбора, это все равно, что включение режима подстановочных знаков в Word (* – любая последовательность символов; ? – любой символ). Значит, чтобы Access мог отыскать английских, ирландских сеттеров и сеттеров-гордонов, нужно написать в условии отбора LIKE *сеттер*.


Кто и почему будет отобран, если мы напишем в условии отбора LIKE *сеттер ?

Запросы из нескольких таблиц

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

Чтобы добавить в запрос еще одну таблицу, вызовите контекстное меню на области таблиц и в нем пункт Добавить таблицу.

Добавьте таблицы, в которых содержатся необходимые данные (фамилия владельцев и город).
Перебросьте из области таблиц вниз, в область условий отбора, те поля из новых таблиц, которые должны быть отображены в результатах запроса.
Запустите запрос и проверьте, получилось ли у вас, как на рисунке. Проверьте себя: ответ.

Отсев пустых строк

Когда связываются несколько таблиц, то могут возникать пустые строки.

Почему это происходит?
Дело в том, что у нас в таблице tbPerson наряду с владельцами собак записаны и судьи (Петровская, Елец, Терещук). Судьи не имеют права привозить своих собак на выставку, поэтому в строках с их фамилиями пустые ячейки с кличками собак.
Есть два способа удалить пустые строки.
1. Поставить условие на значение клички собаки Is not Null, т.е. НЕ ПУСТА.

2. Или поменять тип связи между таблицами в области таблиц: нужно на линии связи, дающей неточный результат, вызвать контекстное меню, и поменять Параметры объединения.

Вопрос вам: какие настройки нужно поменять в диалоговом окне параметров объединения?

Использование в запросе нескольких источников записей

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

Илон Маск рекомендует:  Что такое код ora_exec
A B
a b c d
1 2 2 4
2 1 3 3

Результат запроса

SELECT * FROM A, B;

будет выглядеть следующим образом:

a b c d
1 2 2 4
1 2 3 3
2 1 2 4
2 1 3 3

Поэтому перечисление таблиц, как правило, используется совместно с условием соединения записей из разных таблиц, указываемым в предложении WHERE. Для приведенных выше таблиц таким условием может быть совпадение значений, скажем, в полях a и c:

SELECT * FROM A, B WHERE a=c;

Теперь результатом выполнения этого запроса будет следующая таблица:

a b c d
2 1 2 4

т.е. соединяются только те строки таблиц, у которых в указанных полях находятся равные значения (эквисоединение). Естественно, могут быть использованы любые условия, хотя эквисоединение используется чаще всего, поскольку эта операция воссоздает некую сущность, декомпозированную на две других в результате процедуры нормализации.

Если разные таблицы имеют столбцы с одинаковыми именами, то для однозначности требуется использовать точечную нотацию:

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

Пример. Найти номер модели и производителя ПК, имеющих цену менее $600:

SELECT DISTINCT PC.model, maker
FROM PC, Product
WHERE PC.model = Product.model AND price model
maker
1232 A
1260 E

Иногда в предложении FROM требуется указать одну и ту же таблицу несколько раз. В этом случае обязательным является переименование.

Пример. Вывести пары моделей, имеющих одинаковые цены:

SELECT DISTINCT A.model AS model_1, B.model AS model_2
FROM PC AS A, PC B
WHERE A.price = B.price AND A.model model_1
model_2
1232 1233
1232 1260

Переименование также требуется, если в предложении FROM используется подзапрос. Так, первый пример можно переписать следующим образом:

Илон Маск рекомендует:  Iis веб и ftp узлы
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
SELECT DISTINCT PC.model, maker
FROM PC,
(SELECT maker, model
FROM Product) AS prod
WHERE PC.model = prod.model AND price [INNER]
| <<LEFT | RIGHT | FULL > [OUTER]> JOIN
[ON ]

Соединение может быть либо внутренним (INNER), либо одним из внешних (OUTER). Служебные слова INNER и OUTER можно опускать, поскольку внешнее соединение однозначно определяется его типом — LEFT (левое), RIGHT (правое) или FULL (полное), а просто JOIN будет означать внутреннее соединение.

Предикат определяет условие соединения строк из разных таблиц. При этом INNER JOIN означает, что в результирующий набор попадут только те соединения строк двух таблиц, для которых значение предиката равно TRUE. Как правило, предикат определяет эквисоединение по внешнему и первичному ключам соединяемых таблиц, хотя это не обязательно.

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

SELECT maker, Product.model AS model_1, PC.model AS model_2, price
FROM Product INNER JOIN PC ON PC.model = Product.model
ORDER BY maker, PC.model;

В данном примере в результирующем наборе будут соединяться только те строки из таблиц PC и Product, у которых совпадают номера моделей.
Для контроля в результат включен как номер модели из таблицы PC, так и из таблицы Product:

maker model_1 model_2 price
A 1232 1232 600.0
A 1232 1232 400.0
A 1232 1232 350.0
A 1232 1232 350.0
A 1233 1233 600.0
A 1233 1233 950.0
A 1233 1233 980.0
B 1121 1121 850.0
B 1121 1121 850.0
B 1121 1121 850.0
E 1260 1260 350.0

Внешнее соединение LEFT JOIN означает, что помимо строк, для которых выполняется условие предиката, в результирующий набор попадут все остальные строки из первой таблицы (левой). При этом отсутствующие значения полей из правой таблицы будут заполнены NULL-значениями.

Пример. Привести все модели ПК, их производителей и цену:

SELECT maker, Product.model AS model_1, PC.model AS model_2, price
FROM Product LEFT JOIN PC ON PC.model = Product.model
WHERE type = ‘PC’
ORDER BY maker, PC.model;

Обратите внимание на то, что по сравнению с предыдущим примером, пришлось использовать предложение WHERE для отбора только производителей ПК. В противном случае в результирующий набор попали бы также и модели ПК-блокнотов и принтеров. В рассмотренном ранее примере это условие было бы излишним, т.к. соединялись только те строки, у которых совпадали номера моделей, и одной из таблиц была таблица PC, содержащая только ПК. В результате выполнения запроса получим:

maker model_1 model_2 price
A 1232 1232 600.0
A 1232 1232 400.0
A 1232 1232 350.0
A 1232 1232 350.0
A 1233 1233 600.0
A 1233 1233 950.0
A 1233 1233 980.0
B 1121 1121 850.0
B 1121 1121 850.0
B 1121 1121 850.0
E 2111 NULL NULL
E 2112 NULL NULL
E 1260 1260 350.0

Поскольку моделей 2111 и 2112 из таблицы Product нет в таблице PC, в полях из таблицы PC содержится NULL.
Соединение RIGHT JOIN обратно соединению LEFT JOIN, т.е. в результирующий набор попадут все строки из второй таблицы, которые будут соединяться только с теми строками из первой таблицы, для которых выполняется условие соединения. В нашем случае левое соединение

Product LEFT JOIN PC ON PC.model = Product.model

будет эквивалентно правому соединению

PC RIGHT JOIN Product ON PC.model = Product.model

Запрос же

SELECT maker, Product.model AS model_1, PC.model AS model_2, price
FROM Product RIGHT JOIN PC ON PC.model = Product.model
ORDER BY maker, PC.model;

даст те же результаты, что и внутреннее соединение, поскольку в правой таблице (PC) нет таких моделей, которые отсутствовали бы в левой таблице (Product), что вполне естественно для типа связи «один-ко-многим», которая имеется между таблицами PC и Product. Наконец, при полном соединении (FULL JOIN) в результирующую таблицу попадут не только те строки, которые имеют одинаковые значения в сопоставляемых столбцах, но и все остальные строки исходных таблиц, не имеющие соответствующих значений в другой таблице. В этих строках все столбцы той таблицы, в которой не было найдено соответствия, заполняются NULL-значениями. Полное соединение представляет собой комбинацию левого и правого внешних соединений.
Так запрос для таблиц A и B, приведенных в начале главы,

SELECT A.*, B.*
FROM A FULL JOIN B
ON A.a = B.c;

даст следующий результат:

a b c d
1 2 NULL NULL
2 1 2 4
NULL NULL 3 3

Заметим, что это соединение симметрично, т.е. «A FULL JOIN B» эквивалентно «B FULL JOIN A». Обратите также внимание на обозначение A.*, что означает «все поля таблицы А».

Выборка данных из нескольких таблиц (JOIN)


Довольно часто приходится выбирать данные из нескольких таблиц. Для показа в одном запросе данных из нескольких таблиц Oracle позволяет выполнять так называемые соединения таблиц. Имеется два относящихся к соединению таблиц правила, о которых следует постоянно помнить. Данные из двух (или нескольких) таблиц могут быть объединены в том случае, если у обеих таблиц имеется совпадающий столбец (с тем же самым или с другим именем) и этот столбец в одной из таблиц является первичным ключом (или частью этого ключа).

SELECT ename, deptno FROM emp ORDER BY deptno; SELECT deptno, dname FROM dept ORDER BY deptno;
ENAME DEPTNO
CLARK 10
KING 10
MILLER 10
JONES 20
FORD 20
ADAMS 20
SMITH 20
SCOTT 20
WARD 30
TURNER 30
ALLEN 30
JAMES 30
BLAKE 30
MARTIN 30
DEPTNO DNAME
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS

Давайте рассмотрим пример оператора соединения (join), использующего традиционный синтаксис Oracle, где мы объединяем вместе содержимое таблиц emp и dept для получения перечня всех сотрудников и названий отделов, где они работают:

ENAME DEPTNO DNAME
CLARK 10 ACCOUNTING
KING 10 ACCOUNTING
MILLER 10 ACCOUNTING
JONES 20 RESEARCH
FORD 20 RESEARCH
ADAMS 20 RESEARCH
SMITH 20 RESEARCH
SCOTT 20 RESEARCH
WARD 30 SALES
TURNER 30 SALES
ALLEN 30 SALES
JAMES 30 SALES
BLAKE 30 SALES
MARTIN 30 SALES

Обратите внимание на многие важные компоненты этого соединения таблиц. Использование во фразе FROM двух таблиц четко указывает на то, что имеет место соединиения таблиц. Обратите также внимание на то, что перед именем каждой таблицы присутствует буква: e для таблицы emp или d для таблицы dept. Это служит иллюстрацией интересной концепции – столбцы могут иметь псевдонимы точно так же, как их имеют таблицы. Псевдонимы служат важной цели – они не дают Oracle запутаться в том, какую таблицу использовать при выводе данных в столбец deptno. Вспомните, что в обеих таблицах (emp и dept) имеются столбцы с именем deptno.

Неоднозначности при соединении таблиц можно также избежать, если в качестве префикса перед именем столбца указать имена таблиц.

Заметьте, что в нашу фразу WHERE включено сравнение по полю deptno, соединяющему данные в emp с данными в dept. В случае отсутствия этой связи в выходные данные были вы включены все данные из emp и dept.

Синтаксис соединения по ANSI/ISO

В соответствии с синтаксисом ANSI/ISO, для того, чтобы соединить содержимое двух таблиц для получения единого результата, мы должны включить в SQL-оператор фразу JOIN имя_таблицы ON условие_соединения. Если вы хотите в соответствии с этим синтаксисом выполнить то же соединение таблиц, которое мы делали раньше, наш оператор будет выглядеть следующим образом:

ENAME DEPTNO DNAME
CLARK 10 ACCOUNTING
KING 10 ACCOUNTING
MILLER 10 ACCOUNTING
JONES 20 RESEARCH
FORD 20 RESEARCH
ADAMS 20 RESEARCH
SMITH 20 RESEARCH
SCOTT 20 RESEARCH
WARD 30 SALES
TURNER 30 SALES
ALLEN 30 SALES
JAMES 30 SALES
BLAKE 30 SALES
MARTIN 30 SALES

Обратите внимание на различия между этим синтаксисом и синтаксисом Oracle. Во-первых, в синтаксисе ANSI/ISO сравнения, используемые для соединения, отделяются от всех остальных сравнений с помощью специального ключевого слова ON, указывающего на то, что именно это сравнение используется для соединения. Вы по-прежнему можете включать в соответствующие ANSI/ISO запросы на соединение фразу WHERE. Единственное отличие состоит в том, что фраза WHERE теперь будет содержать только дополнительные операторы сравнения, используемые дл дополнительной фильтрации данных. Кроме того, вы не должны теперь указывать во фразе FROM имена всех объединяемых таблиц. Вместо этого сразу же после фразы FROM вы должны использовать фразу JOIN, в которой и будут определены имена всех соединяемых таблиц.

Естественные соединения (NATURAL JOIN)

Естественным соединением называется соединение между двумя таблицами, в котором Oracle соединяет таблицы по одинаково называющемуся столбцу (столбцам) обеих таблиц (естественным образом!). Естественное соединение выполняется в том случае, если указано ключевое слово NATURAL.

Единственным совпадающим столбцом для таблиц emp и dept является столбец depnto,

ENAME DEPTNO DNAME
CLARK 10 ACCOUNTING
KING 10 ACCOUNTING
MILLER 10 ACCOUNTING
JONES 20 RESEARCH
FORD 20 RESEARCH
ADAMS 20 RESEARCH
SMITH 20 RESEARCH
SCOTT 20 RESEARCH
WARD 30 SALES
TURNER 30 SALES
ALLEN 30 SALES
JAMES 30 SALES
BLAKE 30 SALES
MARTIN 30 SALES

Нетрудно заменить, что естественные соединения позволяют в значительной степени упростить запросы с соединением за счет устранения псевдонимов таблиц и сравнений дл соединения.

SQL JOIN — соединение таблиц базы данных

Оператор языка SQL JOIN предназначен для соединения двух или более таблиц базы данных по совпадающему условию. Этот оператор существует только в реляционных базах данных. Именно благодаря JOIN реляционные базы данных обладают такой мощной функциональностью, которая позволяет вести не только хранение данных, но и их, хотя бы простейший, анализ с помощью запросов. Разберём основные нюансы написания SQL-запросов с оператором JOIN, которые являются общими для всех СУБД (систем управления базами данных). Для соединения двух таблиц оператор SQL JOIN имеет следующий синтаксис:

После одного или нескольких звеньев с оператором JOIN может следовать необязательная секция WHERE или HAVING, в которой, также, как в простом SELECT-запросе, задаётся условие выборки. Общим для всех СУБД является то, что в этой конструкции вместо JOIN может быть указано INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, CROSS JOIN (или, как вариант, запятая).

INNER JOIN (внутреннее соединение)

Запрос с оператором INNER JOIN предназначен для соединения таблиц и вывода результирующей таблицы, в которой данные полностью пересекаются по условию, указанному после ON.

То же самое делает и просто JOIN. Таким образом, слово INNER — не обязательное.

Пример 1. Есть база данных портала объявлений. В ней есть таблица Categories (категории объявлений) и Parts (части, или иначе — рубрики, которые и относятся к категориям). Например, части Квартиры, Дачи относятся к категории Недвижимость, а части Автомобили, Мотоциклы — к категории Транспорт. Эти таблицы с заполненными данными имеют следующий вид.

Part_ID Part Cat
1 Квартиры 505
2 Автомашины 205
3 Доски 10
4 Шкафы 30
5 Книги 160
Cat_ID Cat_name Price
10 Стройматериалы 105,00
505 Недвижимость 210,00
205 Транспорт 160,00
30 Мебель 77,00
45 Техника 65,00

Заметим, что в таблице Parts Книги имеют Cat — ссылку на категорию, которой нет в таблице Categories, а в таблице Categories Техника имеет Cat_ID — первичный ключ, ссылки на который нет в таблице Parts. Требуется соединить данные этих двух таблиц так, чтобы в результирующей таблице были поля Part (Часть), Cat (Категория) и Price (Цена подачи объявления) и чтобы данные полностью пересекались по условию. Условие — совпадение идентификатора категории в таблице Categories и ссылки на категорию в таблице Parts. Для этого пишем следующий запрос:

Результатом выполнения запроса будет следующая таблица:

Part Cat Price
Квартиры 505 210,00
Автомашины 205 160,00
Доски 10 105,00
Шкафы 30 77,00

В результирующей таблице нет Книг, так как эта запись ссылается на категорию, которой нет в таблице Categories, и Техники, так как эта запись имеет внешний ключ в таблице Categories, на который нет ссылки в таблице Parts.

В ряде случаев при соединениях таблиц составить менее громоздкие запросы можно с помощью предиката EXISTS и без использования JOIN.

Написать запросы SQL с JOIN самостоятельно, а затем посмотреть решения

Есть база данных «Театр». Таблица Play содержит данные о постановках. Таблица Team — о ролях актёров. Таблица Actor — об актёрах. Таблица Director — о режиссёрах. Поля таблиц, первичные и внешние ключи можно увидеть на рисунке ниже (для увеличения нажать левой кнопкой мыши).

Пример 2. Определить самого востребованного актёра за последние 5 лет.

Оператор JOIN использовать 2 раза. Использовать COUNT(), CURDATE(), LIMIT 1.

Пример 3. Вывести список актеров, которые в одном спектакле играют более одной роли, и количество их ролей.

Оператор JOIN использовать 1 раз. Использовать HAVING, GROUP BY.

Подсказка. Оператор HAVING применяется к числу ролей, подсчитанных агрегатной функцией COUNT.

LEFT OUTER JOIN (левое внешнее соединение)

Запрос с оператором LEFT OUTER JOIN предназначен для соединения таблиц и вывода результирующей таблицы, в которой данные полностью пересекаются по условию, указанному после ON, и дополняются записями из первой по порядку (левой) таблицы, даже если они не соответствуют условию. У записей левой таблицы, которые не соответствуют условию, значение столбца из правой таблицы будет NULL (неопределённым).


Пример 4. База данных и таблицы — те же, что и в примере 1.

Для получения результирующей таблицы, в которой данные из двух таблиц полностью пересекаются по условию и дополняются всеми данными из таблицы Parts, которые не соответствуют условию, пишем следующий запрос:

Результатом выполнения запроса будет следующая таблица:

Part Cat Price
Квартиры 505 210,00
Автомашины 205 160,00
Доски 10 105,00
Шкафы 30 77,00
Книги 160 NULL

В результирующей таблице, в отличие от таблицы из примера 1, есть Книги, но значение столбца Цены (Price) у них — NULL, так как эта запись имеет идентификатор категории, которой нет в таблице Categories.

RIGHT OUTER JOIN (правое внешнее соединение)

Запрос с оператором RIGHT OUTER JOIN предназначен для соединения таблиц и вывода результирующей таблицы, в которой данные полностью пересекаются по условию, указанному после ON, и дополняются записями из второй по порядку (правой) таблицы, даже если они не соответствуют условию. У записей правой таблицы, которые не соответствуют условию, значение столбца из левой таблицы будет NULL (неопределённым).

Пример 5. База данных и таблицы — те же, что и в предыдущих примерах.

Для получения результирующей таблицы, в которой данные из двух таблиц полностью пересекаются по условию и дополняются всеми данными из таблицы Categories, которые не соответствуют условию, пишем следующий запрос:

Результатом выполнения запроса будет следующая таблица:

Part Cat Price
Квартиры 505 210,00
Автомашины 205 160,00
Доски 10 105,00
Шкафы 30 77,00
NULL 45 65,00

В результирующей таблице, в отличие от таблицы из примера 1, есть запись с категорией 45 и ценой 65,00, но значение столбца Части (Part) у неё — NULL, так как эта запись имеет идентификатор категории, на которую нет ссылок в таблице Parts.

FULL OUTER JOIN (полное внешнее соединение)

Запрос с оператором FULL OUTER JOIN предназначен для соединения таблиц и вывода результирующей таблицы, в которой данные полностью пересекаются по условию, указанному после ON, и дополняются записями из первой (левой) и второй (правой) таблиц, даже если они не соответствуют условию. У записей, которые не соответствуют условию, значение столбцов из другой таблицы будет NULL (неопределённым).

Пример 6. База данных и таблицы — те же, что и в предыдущих примерах.

Для получения результирующей таблицы, в которой данные из двух таблиц полностью пересекаются по условию и дополняются всеми данными как из таблицы Parts, так и из таблицы Categories, которые не соответствуют условию, пишем следующий запрос:

Результатом выполнения запроса будет следующая таблица:

Part Cat Price
Квартиры 505 210,00
Автомашины 205 160,00
Доски 10 105,00
Шкафы 30 77,00
Книги 160 NULL
NULL 45 65,00

В результирующей таблице есть записи Книги (из левой таблицы) и с категорией 45 (из правой таблицы), причём у первой из них неопределённая цена (столбец из правой таблицы), а у второй — неопределённая часть (столбец из левой таблицы).

Псевдонимы соединяемых таблиц

В предыдущих запросах мы указывали с названиями извлекаемых столбцов из разных таблиц полные имена этих таблиц. Такие запросы выглядят громоздко: одно и то же слово повторяется несколько раз. Нельзя ли как-то упростить конструкцию? Оказывается, можно. Для этого следует использовать псевдонимы таблиц — их сокращённые имена. Псевдоним может состоять и из одной буквы. Возможно любое количество букв в псевдониме, главное, чтобы запрос после сокращения был понятен Вам самим. Общее правило: в секции запроса, определяющей соединение, то есть вокруг слова JOIN нужно указать полные имена таблиц, а за каждым именем должен следовать псевдоним таблицы.

Пример 7. Переписать запрос из примера 1 с использованием псевдонимов соединяемых таблиц.

Запрос будет следующим:

Запрос вернёт то же самое, что и запрос в примере 1, но он гораздо компактнее.

JOIN и соединение более двух таблиц

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

Пример 8. База данных — та же, что и в предыдущих примерах. К таблицам Categories и Parts в этом примере добавится таблица Ads, содержащая данные об опубликованных на портале объявлениях. Приведём фрагмент таблицы Ads, в котором среди записей есть записи о тех объявлениях, срок публикации которых истекает 2020-04-02.

A_Id Part_ID Date_start Date_end Text
21 1 ‘2020-02-11’ ‘2020-04-20’ «Продаю. «
22 1 ‘2020-02-11’ ‘2020-05-12’ «Продаю. «
. . . . .
27 1 ‘2020-02-11’ ‘2020-04-02’ «Продаю. «
28 2 ‘2020-02-11’ ‘2020-04-21’ «Продаю. «
29 2 ‘2020-02-11’ ‘2020-04-02’ «Продаю. «
30 3 ‘2020-02-11’ ‘2020-04-22’ «Продаю. «
31 4 ‘2020-02-11’ ‘2020-05-02’ «Продаю. «
32 4 ‘2020-02-11’ ‘2020-04-13’ «Продаю. «
33 3 ‘2020-02-11’ ‘2020-04-12’ «Продаю. «
34 4 ‘2020-02-11’ ‘2020-04-23’ «Продаю. «

Представим, что сегодня ‘2020-04-02’, то есть это значение принимает функция CURDATE() — текущая дата. Требуется узнать, к каким категориям принадлежат объявления, срок публикации которых истекает сегодня. Названия категорий есть только в таблице CATEGORIES, а даты истечения срока публикации объявлений — только в таблице ADS. В таблице PARTS — части категорий (или проще, подкатегории) опубликованных объявлений. Но внешним ключом Cat_ID таблица PARTS связана с таблицей CATEGORIES, а таблица ADS связана внешним ключом Part_ID с таблицей PARTS. Поэтому соединяем в одном запросе три таблицы и этот запрос можно с максимальной корректностью назвать цепочкой.

Запрос будет следующим:

Результат запроса — таблица, содержащая названия двух категорий — «Недвижимость» и «Транспорт»:

Cat_name
Недвижимость
Транспорт

CROSS JOIN (перекрестное соединение)

Использование оператора SQL CROSS JOIN в наиболее простой форме — без условия соединения — реализует операцию декартова произведения в реляционной алгебре. Результатом такого соединения будет сцепление каждой строки первой таблицы с каждой строкой второй таблицы. Таблицы могут быть записаны в запросе либо через оператор CROSS JOIN, либо через запятую между ними.

Пример 9. База данных — всё та же, таблицы — Categories и Parts. Реализовать операцию декартова произведения этих двух таблиц.

Запрос будет следующим:

Или без явного указания CROSS JOIN — через запятую:

Запрос вернёт таблицу из 5 * 5 = 25 строк, фрагмент которой приведён ниже:


Cat_ID Cat_name Price Part_ID Part Cat
10 Стройматериалы 105,00 1 Квартиры 505
10 Стройматериалы 105,00 2 Автомашины 205
10 Стройматериалы 105,00 3 Доски 10
10 Стройматериалы 105,00 4 Шкафы 30
10 Стройматериалы 105,00 5 Книги 160
. . . . . .
45 Техника 65,00 1 Квартиры 505
45 Техника 65,00 2 Автомашины 205
45 Техника 65,00 3 Доски 10
45 Техника 65,00 4 Шкафы 30
45 Техника 65,00 5 Книги 160

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

Но для CROSS JOIN можно задать условие соединения! Результат будет совсем иным. При использовании оператора «запятая» вместо явного указания CROSS JOIN условие соединения задаётся не словом ON, а словом WHERE.

Пример 10. Та же база данных портала объявлений, таблицы Categories и Parts. Используя перекрестное соединение, соединить таблицы так, чтобы данные полностью пересекались по условию. Условие — совпадение идентификатора категории в таблице Categories и ссылки на категорию в таблице Parts.

Запрос будет следующим:

Запрос вернёт то же самое, что и запрос в примере 1:

Part Cat Price
Квартиры 505 210,00
Автомашины 205 160,00
Доски 10 105,00
Шкафы 30 77,00

И это совпадение не случайно. Запрос c перекрестным соединением по условию соединения полностью аналогичен запросу с внутренним соединением — INNER JOIN — или, учитывая, что слово INNER — не обязательное, просто JOIN.

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

Команда JOIN. Запросы к нескольким таблицам. Полное декартово произведение таблиц. Команда UNION

Полное декартово произведение таблиц

На практике чаще всего приходится делать запросы, основанные на нескольких таблицах сразу.

Построим команду SELECT, перечислив в инструкции FROM таблицы через запятую:

SELECT список_полей FROM таблица1, таблица2;

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

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

Соединение таблиц

Фактически перед выполнением запроса нужно построить в оперативной памяти новую таблицу, в которой соединены строки исходных таблиц на основе связей по первичным и внешним ключам. То есть нам нужны не все множество пар строк из двух таблиц, а только часть этого множества – подмножество связанных по ключу строк.

Попробуй обратиться за помощью к преподавателям

Для построения подмножества декартова произведения двух таблиц используются три оператора:

  • JOIN (соединение);
  • LEFT JOIN (левое соединение);
  • RIGHT JOIN (правое соединение).

Общий вид запроса с соединением выглядит следующим образом:

Рассмотрим различия между тремя видами соединений на следующем примере.

В базе данных имеется две таблицы. В таблице abiturient хранятся личные данные абитуриентов. В таблице application хранятся поданные абитуриентами заявления. Каждый абитуриент может подать несколько заявлений, поэтому таблица application должна содержать внешний ключ со ссылкой на таблицу abiturient. Логическая модель показана на рисунке.

Задай вопрос специалистам и получи
ответ уже через 15 минут!

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

Если присмотреться к данным таблиц, то можно увидеть, что результат может быть различным в зависимости от того, хочет ли пользователь видеть тех абитуриентов, которые зарегистрировались, но еще не успели подать заявления. В рассматриваемом примере заявлений нет у абитуриентки Галкиной.

Если пользователь составит запрос с помощью оператора JOIN, то он будет выглядеть так:

SELECT application.idapplication, application.spec, application.forma, abiturient.idabiturient,

abiturient.fio, abiturient.birth_date, abiturient.age FROM application JOIN abiturient ON

А в результате получится следующая таблица:

Если пользователь составит запрос с помощью оператора LEFT JOIN, то запрос будет таким:

SELECT application.idapplication, application.spec, application.forma, abiturient.idabiturient,

abiturient.fio, abiturient.birth_date, abiturient.age FROM application LEFT JOIN abiturient ON

А в результате получится таблица:

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

В этом и состоит разница между операторами JOIN и LEFT JOIN.


Выражение таблица1 JOIN таблица2 означает, что нужно брать только те записи из обеих таблиц, которые связаны по первичному и внешнему ключу. Если в какой-то таблице есть записи, не имеющие связанных в другой таблице, то эти записи в соединение не попадут.

Выражение таблица1 LEFT JOIN таблица2 означает, что нужно брать все записи из таблицы 1, а из таблицы 2 – только те, которые имеют в таблице 1 связанные записи. Если в таблице 2 есть записи, которые не имеют связанных в таблице1, то они не попадают в соединение.

Оператор RIGHT JOIN является полным аналогом LEFT JOIN, только он позволяет выбрать все данные из той таблицы, которая стоит справа от оператора. LEFT JOIN и RIGHT JOIN взаимозаменяемы на основе следующей формулы:

Из практики известно, что RIGHT JOIN выполняется несколько медленнее, чем LEFT JOIN, потому что в этом случае задействован немного другой алгоритм. Поэтому программисты стараются избегать RIGHT JOIN и заменять его на LEFT JOIN.

Объединение

В некоторых реализациях языка SQL присутствует оператор FULL JOIN, который позволяет объединить результаты, полученные посредством LEFT JOIN и RIGHT JOIN. Таким образом, результат содержит все записи обеих таблиц. Но в большинстве реализаций SQL такого оператора нет. Чтобы получить аналогичный результат нужно воспользоваться оператором UNION:

Так и не нашли ответ
на свой вопрос?

Просто напиши с чем тебе
нужна помощь

Выборка данных из нескольких таблиц (JOIN)

Довольно часто приходится выбирать данные из нескольких таблиц. Для показа в одном запросе данных из нескольких таблиц Oracle позволяет выполнять так называемые соединения таблиц. Имеется два относящихся к соединению таблиц правила, о которых следует постоянно помнить. Данные из двух (или нескольких) таблиц могут быть объединены в том случае, если у обеих таблиц имеется совпадающий столбец (с тем же самым или с другим именем) и этот столбец в одной из таблиц является первичным ключом (или частью этого ключа).

SELECT ename, deptno FROM emp ORDER BY deptno; SELECT deptno, dname FROM dept ORDER BY deptno;
ENAME DEPTNO
CLARK 10
KING 10
MILLER 10
JONES 20
FORD 20
ADAMS 20
SMITH 20
SCOTT 20
WARD 30
TURNER 30
ALLEN 30
JAMES 30
BLAKE 30
MARTIN 30
DEPTNO DNAME
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS

Давайте рассмотрим пример оператора соединения (join), использующего традиционный синтаксис Oracle, где мы объединяем вместе содержимое таблиц emp и dept для получения перечня всех сотрудников и названий отделов, где они работают:

ENAME DEPTNO DNAME
CLARK 10 ACCOUNTING
KING 10 ACCOUNTING
MILLER 10 ACCOUNTING
JONES 20 RESEARCH
FORD 20 RESEARCH
ADAMS 20 RESEARCH
SMITH 20 RESEARCH
SCOTT 20 RESEARCH
WARD 30 SALES
TURNER 30 SALES
ALLEN 30 SALES
JAMES 30 SALES
BLAKE 30 SALES
MARTIN 30 SALES

Обратите внимание на многие важные компоненты этого соединения таблиц. Использование во фразе FROM двух таблиц четко указывает на то, что имеет место соединиения таблиц. Обратите также внимание на то, что перед именем каждой таблицы присутствует буква: e для таблицы emp или d для таблицы dept. Это служит иллюстрацией интересной концепции – столбцы могут иметь псевдонимы точно так же, как их имеют таблицы. Псевдонимы служат важной цели – они не дают Oracle запутаться в том, какую таблицу использовать при выводе данных в столбец deptno. Вспомните, что в обеих таблицах (emp и dept) имеются столбцы с именем deptno.

Неоднозначности при соединении таблиц можно также избежать, если в качестве префикса перед именем столбца указать имена таблиц.

Заметьте, что в нашу фразу WHERE включено сравнение по полю deptno, соединяющему данные в emp с данными в dept. В случае отсутствия этой связи в выходные данные были вы включены все данные из emp и dept.

Синтаксис соединения по ANSI/ISO

В соответствии с синтаксисом ANSI/ISO, для того, чтобы соединить содержимое двух таблиц для получения единого результата, мы должны включить в SQL-оператор фразу JOIN имя_таблицы ON условие_соединения. Если вы хотите в соответствии с этим синтаксисом выполнить то же соединение таблиц, которое мы делали раньше, наш оператор будет выглядеть следующим образом:

ENAME DEPTNO DNAME
CLARK 10 ACCOUNTING
KING 10 ACCOUNTING
MILLER 10 ACCOUNTING
JONES 20 RESEARCH
FORD 20 RESEARCH
ADAMS 20 RESEARCH
SMITH 20 RESEARCH
SCOTT 20 RESEARCH
WARD 30 SALES
TURNER 30 SALES
ALLEN 30 SALES
JAMES 30 SALES
BLAKE 30 SALES
MARTIN 30 SALES

Обратите внимание на различия между этим синтаксисом и синтаксисом Oracle. Во-первых, в синтаксисе ANSI/ISO сравнения, используемые для соединения, отделяются от всех остальных сравнений с помощью специального ключевого слова ON, указывающего на то, что именно это сравнение используется для соединения. Вы по-прежнему можете включать в соответствующие ANSI/ISO запросы на соединение фразу WHERE. Единственное отличие состоит в том, что фраза WHERE теперь будет содержать только дополнительные операторы сравнения, используемые дл дополнительной фильтрации данных. Кроме того, вы не должны теперь указывать во фразе FROM имена всех объединяемых таблиц. Вместо этого сразу же после фразы FROM вы должны использовать фразу JOIN, в которой и будут определены имена всех соединяемых таблиц.

Естественные соединения (NATURAL JOIN)

Естественным соединением называется соединение между двумя таблицами, в котором Oracle соединяет таблицы по одинаково называющемуся столбцу (столбцам) обеих таблиц (естественным образом!). Естественное соединение выполняется в том случае, если указано ключевое слово NATURAL.

Единственным совпадающим столбцом для таблиц emp и dept является столбец depnto,

ENAME DEPTNO DNAME
CLARK 10 ACCOUNTING
KING 10 ACCOUNTING
MILLER 10 ACCOUNTING
JONES 20 RESEARCH
FORD 20 RESEARCH
ADAMS 20 RESEARCH
SMITH 20 RESEARCH
SCOTT 20 RESEARCH
WARD 30 SALES
TURNER 30 SALES
ALLEN 30 SALES
JAMES 30 SALES
BLAKE 30 SALES
MARTIN 30 SALES

Нетрудно заменить, что естественные соединения позволяют в значительной степени упростить запросы с соединением за счет устранения псевдонимов таблиц и сравнений дл соединения.

Sqlглава 3 запросы с использованием нескольких таблиц

Добрый день.
Такой вопрос. ЕСТЬ БД. необходимо Написать запрос, выбирающий данные из разных таблиц, при том что для всех строк одной таблицы присоединялись значения других по определённому критерию.
Для соединения первой и второй таблицы делаю запрос следующего типа:
Select tab1.f1,tab1.f2,tab1.f3,tab2.f2
from table1 tab1 left join table2 tab2 on ((tab1.f1=tab2.f1) and (tab2.f3=100) )
в таком виде всё работает. необходимо прсоеденить к первой таблице третью (также как и вторую).
Подскажите пожалуйста как это лучше сделать, а то все мои попытки не увенчались успехом.

Синтаксис внешнего соединения зависит от типа БД.
Напр. такой
SELECT . FROM .
LEFT JOIN . ON .
LEFT JOIN . ON .

кусок (tab2.f3=100) ) я бы вынес в секцию WHERE

SELECT t1.*
FROM (t1 INNER JOIN t2 ON t1. >

Спасибо всем за помощь.
Desdechado, данный кусок в секцию WHERE не вынесешь, так как необходима выборка записей и с пустым значением tab2.f3.
Johnmen, zdm. Только что набросал простенькую БД, и всё работает по вашим советам, но почему-то делая тоже самое с исходной БД (к сожалению проверить на ней смогу только завтра) результат был не совсем правильный.
В любом случае спасибо. Завтра ещё попытаюсь и результат сообщу.

имхо, как-то не вяжется (tab2.f3=100) и «с пустым значением tab2.f3»

Desdechado, смотри. Мне надо, чтобы строка отображалась в любом случае, даже если в поле f3 таблицы tab2 и нет значений равных 100. В этом случае в результате запроса на месте tab2.f2 будет пустое значение.
Поютому я и пишу on ((tab1.f1=tab2.f1) and (tab2.f3=100) ) .
Если же я напишу это условие в Where то строка не отобразится совсем.

ты со своими F1, F2 и F3 совсем запутался

Я не запутался, но не в этом суть. Соединяя таким образом 2 таблицы всё ОК. Сложность возникла в соединении большего числа таблиц, чтобы одна была главной, а остальные соединялись с ней с помощью Left join /
Завтра ещё попробую. а там видно будет.

В общем ещё раз попробовал. Использовал синтаксис
SELECT . FROM .
LEFT JOIN . ON .
LEFT JOIN . ON .
Работает но ооооооочень медленно. Если оставить один LEFT, а остольные сделать INNER, тогда работает быстро. Но данная ситуация меня не устраивает, так как могут выбираться не все записи.
Странна такая задержка по времени, ведь при любом раскладе максимальное кол-во отобранных записей не превышает 120.
В чём может быть дело?

> [2] Desdechado © (11.07.06 11:11)

Это не одно и то же для OUTER JOIN

> [3] zdm (11.07.06 11:45)

Разницу между INNER и LEFT JOIN понимаешь?

> [8] PP (11.07.06 14:17)
> Сложность возникла в соединении большего числа таблиц,

В чем сложность-то? В [9]?

> [9] PP (12.07.06 23:13)

Это уже вопрос оптимизации. Тут можно помочь только зная, что за сервер СУБД используешь, конкретный запрос, DDL таблиц, индексов. Представлять сколько записей в каждой из таблиц. Сбор статистики. В тяжелых случаях не обойтись без плана запроса и, возможно, более мощных средств оптимизации.


> PP (12.07.06 23:13) [9]

индексы по полям по которым соединяешь — в 90% случаев помогает.

> [11] novill © (13.07.06 09:26)
> индексы по полям по которым соединяешь — в 90% случаев помогает.

Ты заявляешь это без ссылки на СУБД? В Оракле, например, этот процент хорошо, если достигнет уровня 2-3%. Я говорю про случай, когда построены индексы только по соединяемым полям, причем в индексе 1 поле, и более-менее о реальных, а не надуманных запросах.