Соединение таблиц в предложении FROM.
Примеры многотабличных запросов.
Пример 20. Вывести список контактов и номеров телефонов.
SELECT NAME1, NOMER
FROM KONTAKTY K, NOMERA
WHERE KONT_ID=K.ID
ORDER BY NAME1, NOMER
Пример 21. Вывести список контактов-женщин.
SELECT K.NAME1, P.NAZV
FROM KONTAKTY K, POL P
WHERE (K.POL_ID=P.ID) AND (P.NAZV= 'Женский ')
Пример 22. Вывести список контактов с указанием групп контактов.
SELECT K.NAME1, G.NAZV
FROM KONTAKTY K, GRUPPY G, KONT_GR
WHERE (K.ID=KONT_ID) AND (GR_ID=G.ID)
ORDER BY K.NAME1, G.NAZV
Пример 23. Вывести список вызовов определенного контакта.
SELECT V.ID, V.VREMYA, TV.NAZV, V.DLIT, V.STOIM
FROM VYZOVY V, TIPY_VYZ TV, NOMERA N, KONTAKTY K
WHERE (V.TIP_ID=TV.ID) AND (V.NOMER_ID=N.ID) AND (N.KONT_ID=K.ID)
AND K.NAME1= 'Иванов Александр Сергеевич '
ORDER BY V.VREMYA
Пример 24. Вывести список контактов, с которыми состоялся хотя бы один телефонный разговор.
SELECT DISTINCT K.NAME1
FROM VYZOVY V, TIPY_VYZ TV, NOMERA N, KONTAKTY K
WHERE (V.TIP_ID=TV.ID) AND (V.NOMER_ID=N.ID) AND (N.KONT_ID=K.ID)
AND TV.NAZV<> 'Пропущенный'
ORDER BY K.NAME1
Пример 25. Вывести подробную информацию о вызовах (в хронологическом порядке) с указанием типа вызова, номера телефона, типа номера телефона, контакта и мелодии контакта.
|
|
SELECT V.ID, TV.NAZV,K.NAME1, N.NOMER,TN.NAZV,V.VREMYA,V.DLIT, V.STOIM, M.NAZV
FROM VYZOVY V, TIPY_VYZ TV, NOMERA N, TIPY_NOM TN, KONTAKTY K, MELODII M
WHERE (V.TIP_ID=TV.ID) AND (V.NOMER_ID=N.ID) AND (N.TIP_ID=TN.ID)
AND (N.KONT_ID=K.ID) AND (K.MEL_ID=M.ID)
ORDER BY V.VREMYA
Различные способы соединения таблиц можно выполнить в предложении FROM при помощи операции JOIN.
Синтаксис:
FROM <имя таблицы1> INNER|LEFT|RIGHT|FULL JOIN <имя таблицы2> ON <условие>.
В качестве условия чаще всего используется условие равенства связанных столбцов в соединяемых таблицах.
Существует четыре способа соединения: внутреннее (INNER JOIN), левое внешнее (LEFT JOIN), правое внешнее (RIGHT JOIN) и полное внешнее (FULL JOIN).
Примечание. В Microsoft Access операция FULL JOIN не работает!!!
В результаты любого способа соединения попадут строки, для которых выполняется условие.
Внутреннее соединение (INNER JOIN) эквивалентно использованию условия равенства связанных столбцов в предложении WHERE. Помимо этого:
в результаты левого соединения (LEFT JOIN) попадут строки из первой (левой) таблицы, для которых нет связанных строк во второй (правой) таблице;
в результаты правого соединения (RIGHT JOIN) попадут строки из второй (правой) таблицы, для которых нет связанных строк в первой (левой) таблице;
в результаты полного соединения (FULL JOIN) попадут строки из обеих таблиц, для которых нет связанных строк в другой таблице.
При этом отсутствие связанной строки из другой таблицы фиксируется наличием NULL в соответствующих столбцах таблицы результатов запроса.
Пример 26 (20). Вывести список контактов и номеров телефонов.
SELECT K.NAME1, N.NOMER
FROM KONTAKTY K INNER JOIN NOMERA N ON N.KONT_ID=K.ID
ORDER BY K.NAME1, K.NOMER
Пример 27. Вывести список контактов c указанием пола.
|
|
Некорректно:
SELECT K.NAME1, P.NAZV
FROM KONTAKTY K, POL P
WHERE K.POL_ID=P.ID
ORDER BY K.NAME1
Правильно:
SELECT K.NAME1, P.NAZV
FROM KONTAKTY K LEFT JOIN POL P ON K.POL_ID=P.ID
ORDER BY K.NAME1
Пример 28 (22). Вывести список контактов с указанием групп контактов.
SELECT K.NAME1, G.NAZV
FROM (KONTAKTY K LEFT JOIN KONT_GR KG ON K.ID = KG.KONT_ID)
LEFT JOIN GRUPPY G ON KG.GR_ID=G.ID
ORDER BY K.NAME1, G.NAZV
Таблица результатов многотабличного запроса генерируется следующим образом:
1. Из всех таблиц, указанных в предложении FROM, сформировать одну общую таблицу как декартово произведение (или соединение при наличии операции JOIN).
2. Если имеется предложение WHERE, применить заданное в нем условие отбора к каждой строке общей таблицы и оставить только те строки, для которых это условие выполняется (TRUE), остальные строки отбросить.
3. Для каждой из оставшихся строк вычислить значение каждого элемента в списке возвращаемых столбцов (предложение SELECT) и создать одну строку таблицы результатов запроса.
4. Если указано ключевое слово DISTINCT, удалить из таблицы результатов запроса все повторяющиеся строки.
5. Если имеется предложение ORDER BY, отсортировать результаты запроса.