330 likes | 605 Views
ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ. Соединение используется для выборки данных из более, чем одной таблицы Строки соединяются с помощью общих значений - как правило, значений первичных и внешних ключей Способы соединения: Эквисоединение Не-эквисоединение Внешнее соединение
E N D
ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ
Соединение используется для выборки данных из более, чем одной таблицы Строки соединяются с помощью общих значений - как правило, значений первичных и внешних ключей Способы соединения: • Эквисоединение • Не-эквисоединение • Внешнее соединение • Соединение таблицы с собой • Операторы множеств Что такое соединение?
S_EMP Table ID LAST_NAME DEPT_ID ----- ----------------------------- ------------- 1 Velasquez 50 2 Ngao 41 3 Nagayama S_DEPT Table 4 Quick-To-See ID NAME REGION_ID 5 Ropeburn ---- ---------------------------- ----------------- 6 Urguhart 30 Finance 1 7 Menchu 31 Sales 1 8 Biri 32 Sales 9 Catchpole 43 Operations S_REGION Table 10 Havel 50 Administration ID NAME 11 Magee 31 ----- ---------------------------- 12 Giljum 32 1 North America 13 Sedeghi 33 2 South America 14 Nguyen 34 3 Africa / Middle East 15 Dumas 35 4 Asia 16 Maguro 41 5 Europe Отношения между таблицами
Декартово произведения образуется, если: • Опущено условие соединения • Условие соединения недействительно Результат: • Все строки первой таблицы соединяются со всеми строками второй • Во избежание получения декартова произведения предложение WHERE всегда должно включать допустимое условие соединения ПРАВИЛО: количество условий соединения = количество таблиц - 1 Декартово произведение
Для отображения данных из двух или более связанных таблиц необходимо задать простое условие соединения в предложении WHERE Синтаксис: SELECT таблица.столбец, таблица.столбец FROM таблица1, таблица2 WHERE таблица1.столбец1 = таблица2.столбец2 где: таблица, столбец таблица и столбец, из которых производится выборка данных Таблица1.столбец1= условие, соединяющее таблица2.столбец2 таблицы (или задающее их взаимосвязь) Простой запрос с соединением
сервер S_EMP S_DEPT LAST_NAME DEPT_ID-------------- -----------Velasquez 50Ngao 41 Nagayama 31 Ropeburn 50Urguhart 41Menchu 42 Biri 43 Havel 45 ID NAME ---------- ----------- 50 Administration 41 Operations 31 Sales 50 Administration 41 Operations 42 Operations 43 Operations 45 Operations Эквисоединение: пример
Для различения одноименных столбцов из разных таблиц используются префиксы в виде имен таблиц Использование префиксов в виде имен таблиц увеличивает производительность Одноименные столбцы из разных таблиц можно различать по их псевдонимам Различение столбцов с одинаковыми именами
сервер S_EMP S_DEPT LAST_NAME DEPT_ID-------------- -----------Velasquez 50Ngao 41 Nagayama 31 Ropeburn 50Urguhart 41Menchu 42 Biri 43 Havel 45 ID NAME ---------- ----------- 50 Administration 41 Operations 31 Sales 50 Administration 41 Operations 42 Operations 43 Operations 45 Operation Дополнительные условия поиска иоператор AND: пример
Перед именами столбцов рекомендуется указывать псевдонимы таблиц • Псевдонимы таблиц действительны только для данной команды SELECT • Если псевдоним таблицы создан, перед ссылкой на столбец следует указывать его, а не не имя таблицы SQL> SELECT с.name "Customer Name", 2 c.region_id "Region ID", 3 r.name "Region Name" 4 FROM s_customer c, s_region r 5 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; Не-эквисоединения: пример
Существует три типа join-выражений: inner join; outer join; cross join; Операторы Inner Join и Outer (left, right, full) Join в SQL (Oracle)
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) ) Пример
table_name1 join_type join table_name2on condition … Конструкция 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
В случае с 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
Необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов 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
Этот тип join еще называют декартовым произведением (на английском - cartesian product). select t_resources.t_name, t_users.t_nick from t_resources, t_users cross join
Синтаксис SELECT таблица.столбец, таблица.столбец FROM таблица1, таблица2 WHERE таблица1.столбец = таблица2.столбец(+); • ИЛИ SELECT таблица.столбец, таблица.столбец FROM таблица1, таблица2 WHERE таблица1.столбец(+) = таблица2.столбец; Где: таблица1.столбец = условие, соединяющее таблица2.столбецтаблицы (или задающее их отношение) (+) символ внешнего соединения; можетиспользоваться на любой стороне условия в предложении WHERE, но не по обеим сторонам. Символ внешнего соединения указывается после имени таблицы, в которой нет соответствующих строк. ВНЕШНЕЕ СОЕДИНЕНИЕ
сервер S_EMP S_CUSTOMER LAST_NAME ID-------------- -----------Magee 11Magee 11 Magee 11 Giljum 12 Giljum 12 Sedeghi 13 Dumas 15 SALES_REP_ID NAME ---------- ----------- 11 Womanaport 11 Beisbol Si 11 Ojibway Retail 12 Unisports 12 Futbol Sonora 13 Hamada Sport 15 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) S_EMP(MANAGER) LAST_NAME MANAGER_ID-------------- -----------Ngao 1Nagayama 1 Ropeburn 1 Urguhart 2 Menchu 2 Biri 2 Magee 3 Giljum 3 . . . ID LAST_NAME ----------- ----------- 1 Velasquez 1 Velasquez 1 Velasquez 2 Ngao 2 Ngao 2 Ngao 3 Nagayama 3 Nagayama Соединение таблицы с собой
Строки таблицы соединяются со строками этой же самой таблицы • В предложении FROM наличие двух таблиц имитируется путем использования двух псевдонимов таблицы SQL> SELECT worker.last_name||' works for ’|| 2 manager.last_name 3 FROM s_empworker, s_empmanager 4 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 MANAGER_ID ------------------------- ---------- Administration 50 Biri 2 Catchpole 2 Chang 9 Dancs 10 Dumas 3 …
Имеется несколько способов соединения таблиц: • Эквисоединение • Не-эквисоединение • Внешнее соединение • Соединение с собой • Операторы множеств • Отсутствие предложения WHERE приводит к возникновению декартова произведения таблиц • Использование псевдонимов таблиц ускоряет доступ к базе данных • Для соединения таблицы с собой использование псевдонимов обязательно Заключение