ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ ЧТО ТАКОЕ СОЕДИНЕНИЕ? Соединение используется для выборки данных из более, чем одной таблицы Строки соединяются с помощью общих значений - как правило, значений первичных и внешних ключей Способы соединения: Эквисоединение Не-эквисоединение Внешнее соединение Соединение таблицы с собой Операторы множеств ОТНОШЕНИЯ МЕЖДУ ТАБЛИЦАМИ S_EMP Table ID LAST_NAME ----- ----------------------------1 Velasquez 2 Ngao 3 Nagayama 4 Quick-To-See 5 Ropeburn 6 Urguhart 7 Menchu 8 Biri 9 Catchpole 10 Havel 11 Magee 12 Giljum 13 Sedeghi 14 Nguyen 15 Dumas 16 Maguro DEPT_ID ------------50 41 S_DEPT Table ID NAME REGION_ID ---- ---------------------------- ----------------30 Finance 1 31 Sales 1 32 Sales 43 Operations S_REGION Table 50 Administration ID NAME 31 ----- ---------------------------32 1 North America 33 2 South America 34 3 Africa / Middle East 35 4 Asia 41 5 Europe ДЕКАРТОВО ПРОИЗВЕДЕНИЕ Декартово произведения образуется, если: Опущено условие соединения Условие соединения недействительно Результат: Все строки первой таблицы соединяются со всеми строками второй Во избежание получения декартова произведения предложение WHERE всегда должно включать допустимое условие соединения ПРАВИЛО: количество условий соединения = количество таблиц - 1 ПРОСТОЙ ЗАПРОС С СОЕДИНЕНИЕМ Для отображения данных из двух или более связанных таблиц необходимо задать простое условие соединения в предложении WHERE Синтаксис: SELECT таблица.столбец, таблица.столбец FROM таблица1, таблица2 WHERE таблица1.столбец1 = таблица2.столбец2 где: таблица, столбец таблица и столбец, из которых производится выборка данных Таблица1.столбец1= условие, соединяющее таблица2.столбец2 таблицы (или задающее их взаимосвязь) ЭКВИСОЕДИНЕНИЕ: ПРИМЕР S_EMP LAST_NAME DEPT_ID -------------- ----------Velasquez 50 Ngao 41 Nagayama 31 Ropeburn 50 Urguhart 41 Menchu 42 Biri 43 Havel 45 S_DEPT ID ---------50 41 31 50 41 42 43 45 NAME ----------Administration Operations Sales Administration Operations Operations Operations Operations РАЗЛИЧЕНИЕ СТОЛБЦОВ С ОДИНАКОВЫМИ ИМЕНАМИ Для различения одноименных столбцов из разных таблиц используются префиксы в виде имен таблиц Использование префиксов в виде имен таблиц увеличивает производительность Одноименные столбцы из разных таблиц можно различать по их псевдонимам ДОПОЛНИТЕЛЬНЫЕ УСЛОВИЯ ПОИСКА И ОПЕРАТОР AND: ПРИМЕР S_EMP LAST_NAME DEPT_ID -------------- ----------Velasquez 50 Ngao 41 Nagayama 31 Ropeburn 50 Urguhart 41 Menchu 42 Biri 43 Havel 45 S_DEPT ID ---------50 41 31 50 41 42 43 45 NAME ----------Administration Operations Sales Administration Operations Operations Operations Operation ПСЕВДОНИМЫ ТАБЛИЦ Перед именами столбцов рекомендуется указывать псевдонимы таблиц Псевдонимы таблиц действительны только для данной команды SELECT Если псевдоним таблицы создан, перед ссылкой на столбец следует указывать его, а не не имя таблицы SQL> 2 3 4 5 SELECT с.name "Customer Name", c.region_id "Region ID", r.name "Region Name" FROM s_customer c, s_region r WHERE c.region_id = r.id; НЕ-ЭКВИСОЕДИНЕНИЯ: ПРИМЕР Не-эквисоединение возникает в случае, если ни одно значение в столбце одной таблицы не соответствует точно ни одному значению в столбце другой таблицы Условие соединения содержит оператор, не являющийся оператором равенства (=) SELECT e.last_name, e.title, e.salary, s.grade FROM s_emp e, salgrade s WHERE e.salary BETWEEN s.losal AND s.hisal; ОПЕРАТОРЫ INNER JOIN И OUTER (LEFT, RIGHT, FULL) JOIN В SQL (ORACLE) Существует три типа join-выражений: inner join; outer join; cross join; ПРИМЕР create table t_users ( t_id number(11, 0), t_nick varchar(16), primary key (t_id) ) create table t_resources (t_id number(11, 0), t_name varchar(16), t_userid number (11, 0), primary key (t_id) ) СОДЕРЖИМОЕ ТАБЛИЦ КОНСТРУКЦИЯ JOIN ВЫГЛЯДИТ ТАК table_name1 join_type join table_name2 on condition … INNER JOIN Необходим для получения только тех строк, для которых существует соответствие записей главной таблицы и присоединяемой. Иными словами условие condition должно выполняться всегда. INNER JOIN select t_resources.t_name, t_users.t_nick from t_resources inner join t_users on t_users.t_id = t_resources.t_userid INNER JOIN INNER JOIN В случае с left join из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не учитывает присоединяемую (правую) таблицу. INNER JOIN select t_resources.t_name, t_users.t_nick from t_resources left join t_users on t_users.t_id = t_resources.t_userid INNER JOIN FULL OUTER JOIN Необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов left и right join (ключевое слово outer можно опустить). FULL OUTER JOIN select t_resources.t_name, t_users.t_nick from t_resources full join t_users on t_users.t_id = t_resources.t_userid FULL OUTER JOIN CROSS JOIN Этот тип join еще называют декартовым произведением (на английском - cartesian product). select t_resources.t_name, t_users.t_nick from t_resources, t_users ВНЕШНЕЕ СОЕДИНЕНИЕ Синтаксис SELECT таблица.столбец, таблица.столбец FROM таблица1, таблица2 WHERE таблица1.столбец = таблица2.столбец(+); ИЛИ SELECT таблица.столбец, таблица.столбец FROM таблица1, таблица2 WHERE таблица1.столбец(+) = таблица2.столбец; Где: таблица1.столбец = условие, соединяющее таблица2.столбец таблицы (или задающее их отношение) (+) символ внешнего соединения; может использоваться на любой стороне условия в предложении WHERE, но не по обеим сторонам. Символ внешнего соединения указывается после имени таблицы, в которой нет соответствующих строк. ВНЕШНИЕ СОЕДИНЕНИЯ S_EMP LAST_NAME -------------Magee Magee Magee Giljum Giljum Sedeghi Dumas S_CUSTOMER ID ----------11 11 11 12 12 13 15 SALES_REP_ID NAME ---------11 11 11 12 12 13 15 ----------Womanaport Beisbol Si Ojibway Retail Unisports Futbol Sonora Hamada Sport Sportique Sweet Rock Sports ВНЕШНИЕ СОЕДИНЕНИЯ: ПРИМЕР Вывод имени торгового представителя и названия каждой фирмы-клиента, включая тех, кто не имеет торгового представителя SQL> SELECT e.last_name, e.id, с.name 2 FROM s_emp e, s_customer с 3 WHERE e.id(+) = с.sales_rep_id 4 ORDER BY e.id; Оператор внешнего соединения может использоваться лишь на одной стороне выражения Условие, предполагающее внешнее соединение, не может: - Использовать оператор IN - Быть связанным с другими условиями с помощью оператора OR СОЕДИНЕНИЕ ТАБЛИЦЫ С СОБОЙ S_EMP (WORKER) LAST_NAME -------------Ngao Nagayama Ropeburn Urguhart Menchu Biri Magee Giljum . . . S_EMP (MANAGER) MANAGER_ID ----------1 1 1 2 2 2 3 3 ID ----------1 1 1 2 2 2 3 3 LAST_NAME ----------Velasquez Velasquez Velasquez Ngao Ngao Ngao Nagayama Nagayama СОЕДИНЕНИЕ ТАБЛИЦЫ С СОБОЙ: ПРИМЕР Строки таблицы соединяются со строками этой же самой таблицы В предложении FROM наличие двух таблиц имитируется путем использования двух псевдонимов таблицы SQL> 2 3 4 SELECT worker.last_name||' works for ’|| manager.last_name FROM s_emp worker, s_emp manager WHERE worker.manager_id = manager.id; Операторы множеств • Позволяют объединять результаты разных запросов в единую выборку • Количество столбцов и последовательность типов данных в списках SELECT запросов должны совпадать - UNION - UNION ALL - INTERSECT - MINUS Операторы множеств: пример SQL> select last_name, manager_id from s_emp 2 union 3 select name, id from s_dept; LAST_NAME ------------------------Administration Biri Catchpole Chang Dancs Dumas … MANAGER_ID ---------50 2 2 9 10 3 ЗАКЛЮЧЕНИЕ Имеется несколько способов соединения таблиц: Эквисоединение Не-эквисоединение Внешнее соединение Соединение с собой Операторы множеств Отсутствие предложения WHERE приводит к возникновению декартова произведения таблиц Использование псевдонимов таблиц ускоряет доступ к базе данных Для соединения таблицы с собой использование псевдонимов обязательно