Мониторинг обменных курсов валют
18c0693f

 Внутренние соединения


Внутреннее соединение возвращает только те строки, для которых условие соединения принимает значение true.

SELECT first_name, last_name, department

FROM employee, department

WHERE job_code = "VP"     получить список сотрудников,
                                                                       состоящих в должности “вице-
                                                                       президент”, а также названия
                                                                       их отделов

FIRST_NAME      LAST_NAME        DEPARTMENT               

=============== ================ ======================   

Robert          Nelson           Corporate Headquarters   

Mary S.         MacDonald        Corporate Headquarters   

Robert          Nelson           Sales and Marketing      

Mary S.         MacDonald        Sales and Marketing      

Robert          Nelson           Engineering              

Mary S.         MacDonald        Engineering               

Robert          Nelson           Finance                  

Mary S.         MacDonald        Finance

...

Этот запрос (“без соединения”) возвращает неверный результат, так как имеющиеся между таблицами связи не задействованы. Отсюда и появляется дублирование информации в результирующей таблице. Правильный результат дает запрос с использованием операции соединения:

SELECT first_name, last_name, department

FROM employee, department

WHERE job_code = "VP"

  AND employee.dept_no = department.dept_no

 


                                                       имена таблиц

                                                                        получить список сотрудников,
                                                                                          состоящих в должности “вице-
                                                                                          президент”, а также названия
                                                                                          их отделов


FIRST_NAME      LAST_NAME        DEPARTMENT               

=============== ================ ======================   

Robert          Nelson           Engineering              

Mary S.         MacDonald        Sales and Marketing

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

Замечание 1: в одном запросе нельзя смешивать использование написания имен таблиц и их алиасов.

Замечание 2: алиасы таблиц могут совпадать с их именами.

SELECT first_name, last_name, department

FROM employee e, department d

WHERE job_code = "VP"

  AND e.dept_no = d.dept_no

 

                                    алиасы таблиц

                                                                        получить список сотрудников,
                                                                                          состоящих в должности “вице-
                                                                                          президент”, а также названия
                                                                                          их отделов

FIRST_NAME      LAST_NAME        DEPARTMENT               

=============== ================ ======================   

Robert          Nelson           Engineering              

Mary S.         MacDonald        Sales and Marketing

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

SELECT first_name, last_name, job_title, 

       department



FROM employee e, department d, job j

WHERE d.mngr_no = e.emp_no

  AND e.job_code = j.job_code

  AND e.job_grade = j.job_grade

  AND e.job_country = j.job_country
                           получить список сотрудников
                                                                         с названиями их должностей
                                                                         и названиями отделов

FIRST_NAME LAST_NAME    JOB_TITLE               DEPARTMENT

========== ============ ======================= ======================

Robert     Nelson       Vice President          Engineering

Phil       Forest       Manager                 Quality Assurance

K. J.      Weston       Sales Representative    Field Office: East Coast

Katherine  Young        Manager                 Customer Support

Chris      Papadopoulos Manager                 Research and Development

Janet      Baldwin      Sales Co-ordinator      Pacific Rim Headquarters

Roger      Reeves       Sales Co-ordinator      European Headquarters

Walter     Steadman     Chief Financial Officer Finance

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

Мы рассмотрели внутренние соединения с использованием стандарта ANSI-89. Теперь опишем новый (ANSI-92) стандарт:

·     условия соединения записываются в предложении FROM, в котором слева и справа от зарезервированного слова “JOIN” указываются соединяемые таблицы;

·     условия поиска, основанные на правой таблице, помещаются в предложение ON;

·     условия поиска, основанные на левой таблице, помещаются в предложение WHERE.

SELECT first_name, last_name, department

FROM employee e JOIN department d

 ON e.dept_no = d.dept_no

AND department = "Customer Support"

WHERE last_name starting with "P"
                                                                  получить список  служащих
                                                                  (а заодно и название отдела),
                                                                  являющихся сотрудниками отдела
                                                                  “Customer Support”, фамилии кото-
                                                                  рых начинаются с буквы “P”

FIRST_NAME    LAST_NAME       DEPARTMENT

============= =============== ===================

Leslie        Phong           Customer Support         

Bill          Parker          Customer Support         





Самый выгодный курс обмена валюты