Выборка данных из нескольких таблиц, страница 2

       20 RESEARCH              20 SCOTT

       20 RESEARCH              20 JONES

       30 SALES                 30 ALLEN

       30 SALES                 30 BLAKE

       30 SALES                 30 MARTIN

       30 SALES                 30 JAMES

       30 SALES                 30 TURNER

       30 SALES                 30 WARD

14 rows selected.

Псевдоним таблицы может содержать до 30 символов. Если в запросе указан псевдоним таблицы, перед именами столбцов следует использовать этот псевдоним вместо имени таблицы во всем предложении SELECT. Псевдоним таблицы действителен только для текущей команды SELECT.

Чтение всех столбцов

Многотабличный запрос можно использовать для чтения всех столбцов объединяемых таблиц.

SELECT * FROM таблица1, таблица2 WHERE таблица1.столбец= таблица2.столбец

возвращает все столбцы из обеих таблиц

SELECT таблица1.*, таблица2.столбец FROM таблица1, таблица2

WHERE таблица1.столбец= таблица2.столбец

возвращает все столбцы из первой таблицы и заданные столбцы из второй таблицы

SQL> SELECT * FROM dept d, emp e

  2  WHERE d.deptno=e.deptno AND d.deptno>=30;

 DEPTNO DNAME   LOC        EMPNO ENAME    JOB         MGR HIREDATE    SAL   COMM  DEPTNO

------- ------- --------- ------ -------- --------- ----- --------- ----- ------ -------

     30 SALES   CHICAGO     7499 ALLEN    SALESMAN   7698 20-FEB-81  1600    300      30

     30 SALES   CHICAGO     7698 BLAKE    MANAGER    7839 01-MAY-81  2850             30

     30 SALES   CHICAGO     7654 MARTIN   SALESMAN   7698 28-SEP-81  1250   1400      30

     30 SALES   CHICAGO     7900 JAMES    CLERK      7698 03-DEC-81   950             30

     30 SALES   CHICAGO     7844 TURNER   SALESMAN   7698 08-SEP-81  1500      0      30

     30 SALES   CHICAGO     7521 WARD     SALESMAN   7698 22-FEB-81  1250    500      30

6 rows selected.

SQL> SELECT d.*, e.ename FROM dept d, emp e

  2  WHERE d.deptno=e.deptno AND d.deptno>=30;

   DEPTNO DNAME          LOC           ENAME

--------- -------------- ------------- ----------

       30 SALES          CHICAGO       ALLEN

       30 SALES          CHICAGO       BLAKE

       30 SALES          CHICAGO       MARTIN

       30 SALES          CHICAGO       JAMES

       30 SALES          CHICAGO       TURNER

       30 SALES          CHICAGO       WARD

6 rows selected.

Порядок выполнения многотабличного запроса

1.  Формируется декартово произведение таблиц, перечисленных в предложении FROM.

2.  Условие соединения, заданное в предложении WHERE, применяется ко всем строкам декартова произведения таблиц. Строки, для которых условие соединения не выполняется, отбрасываются.

3.  Для каждой из оставшихся строк вычисляется каждое значение в списке SELECT.

4.  Если задано ключевое слово DISTINCT, удаляются повторяющиеся строки.

5.  Если задано предложение ORDER BY, результат запроса сортируется.

Эквисоединения

Объединение таблиц на основе точного равенства между значениями двух столбцов называется эквисоединением или объединением по равенству. Обычно эти столбцы являются компонентами первичного и внешнего ключа

SELECT таблица1.столбец, …, таблица2.столбец, …

FROM таблица1, таблица2

WHERE таблица1.столбец = таблица2.столбец

SQL> SELECT d.deptno, d.dname, e.ename

  2  FROM dept d, emp e

  3  WHERE d.deptno=e.deptno;

   DEPTNO DNAME          ENAME

--------- -------------- ----------

       10 ACCOUNTING     CLARK

       10 ACCOUNTING     KING

       10 ACCOUNTING     MILLER

       20 RESEARCH       SMITH

       20 RESEARCH       ADAMS

       20 RESEARCH       FORD

       20 RESEARCH       SCOTT

       20 RESEARCH       JONES

       30 SALES          ALLEN

       30 SALES          BLAKE

       30 SALES          MARTIN

       30 SALES          JAMES

       30 SALES          TURNER

       30 SALES          WARD

14 rows selected.

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

SQL> SELECT d.deptno, d.dname, e.ename

  2  FROM dept d, emp e

  3  WHERE d.deptno=e.deptno AND d.deptno<30;

   DEPTNO DNAME          ENAME

--------- -------------- ----------

       10 ACCOUNTING     CLARK

       10 ACCOUNTING     KING

       10 ACCOUNTING     MILLER

       20 RESEARCH       SMITH

       20 RESEARCH       ADAMS

       20 RESEARCH       FORD

       20 RESEARCH       SCOTT

       20 RESEARCH       JONES

8 rows selected.

Не-эквисоединения

Достаточно часто возникает ситуация, когда необходимо получить информацию из разных таблиц, причем ни один столбец таблицы не соответствует в точности ни одному столбцу другой таблицы. Например (Рисунок 2), таблица EMP содержит столбец SAL, представляющий собой заработную плату сотрудников. Таблица SALGRADE состоит из строк, определяющих нижнюю и верхнюю границы заработной платы для каждого разряда. Чтобы выяснить разряд каждого сотрудника, необходимо составить многотабличный запрос, сравнивающий колонку SAL таблицы EMP с колонками LOSAL и HISAL таблицы SALGRADE. Точного соответствия между значениями этих колонок нет, поэтому условие соединения должно включать операторы сравнения, отличные от оператора равенства (<, <=, >, >=, BETWEEN).

Рисунок 2 Несвязанные таблицы

SQL> SELECT e.ename, e.job, e.sal, s.grade

  2  FROM emp e, salgrade s

  3  WHERE e.sal>=s.losal AND e.sal<=s.hisal;

ENAME      JOB             SAL     GRADE

---------- --------- --------- ---------

SMITH      CLERK           800         1

ADAMS      CLERK          1100         1

JAMES      CLERK           950         1

WARD       SALESMAN       1250         2

MARTIN     SALESMAN       1250         2

MILLER     CLERK          1300         2

ALLEN      SALESMAN       1600         3

TURNER     SALESMAN       1500         3

JONES      MANAGER        2975         4

BLAKE      MANAGER        2850         4

CLARK      MANAGER        2450         4

SCOTT      ANALYST        3000         4

FORD       ANALYST        3000         4

KING       PRESIDENT      5000         5

14 rows selected.

Внешнее соединение

§  Если строка из одной таблицы не имеет пары из другой таблицы, она не включается в результирующее множество, возвращаемое многотабличным запросом. Может возникнуть ситуация, когда результат запроса должен включать все строки одной из таблиц, даже если они не имеют подходящей пары во второй таблице. Отсутствующую строку можно включить в результирующее множество запроса, используя оператор внешнего соединения (+). Оператор внешнего соединения можно указать только на одной стороне условия соединения в предложении WHERE - на той стороне, где не хватает информации - после имени таблицы. Стандарт SQL2, также, допускает внешнее соединение только с одной стороны условия соединения, но синтаксис оператора внешнего соединения сильно отличается для разных реализаций языка SQL. Условие внешнего соединения не может включать логический оператор OR.

SELECT таблица1.столбец, таблица2.столбец

FROM таблица1, таблица2

WHERE таблица1.столбец = таблица2.столбец(+)

SELECT таблица1.столбец, таблица2.столбец