15-й час
Объединение запросов

Из этого урока вы узнаете, как объединить несколько запросов SQL в один с помощью команд UNION, UNION ALL, INTERSECT И EXCEPT. опять же особенности использования UNION, UNION ALL, INTERSECT и EXCEPT в случае используемой вами конкретной реализации SQL вы должны выяснить по соответствующей документации Основными на этом уроке будут следующие темы.

• Обзор команд для объединения запросов
• Когда следует использовать команды объединения запросов
• Использование GROUP BY с составными операторами
• Использование ORDER BY с составными операторами
• Обеспечение правильности результатов

  Обычные и составные запросы

Обычный запрос состоит из одного оператора SELECT, а составной — из двух или более.

Составные запросы строятся с помощью определенных команд, позволяющих связать два запроса в один. Так, в следующем примере для этого используется команда UNION.

Например, оператор SQL может выглядеть следующим образом.

SELECT EMP_ID, SALARY, PAY_RATE 

FROM EMPLOYEE_PAY_TBL 

WHERE SALARY IS NOT NULL OR 

PAY_RATE IS NOT NULL;

Тот же оператор с помощью UNION можно записать по-другому.

SELECT EMP_ID, SALARY 

FROM EMPLOYEE_PAY_TBL 

WHERE SALARY IS NOT NULL 

UNION

SELECT EMP_ID, PAY_RATE 

FROM EMPLOYEE_PAY_TBL 

WHERE PAY_RATE IS NOT NULL;

Оба эти оператора возвратят данные об оплате труда всех служащих, для которых указана либо почасовая оплата, либо ставка.

В случае второго оператора в выводе будет присутствовать два столбца —  EMP_ID и SALARY и нормы почасовой оплаты (PAY_RATE) тоже будут помещены ~ в столбец SALARY При использовании команды UNION названия (или псевдонимы) столбцов в выводе определяются первым из операторов SELECT

  Зачем использовать составные запросы?

Составные запросы используются для того, чтобы комбинировать результаты двух операторов SELECT. Использование составного запроса позволяет организовать или, наоборот, подавить вывод повторяющихся записей. С помощью таких запросов можно выводить одновременно аналогичные данные, хранящиеся в разных столбцах

Составные запросы позволяют комбинировать результаты нескольких запросов в одном выводимом наборе данных Такие запросы часто строятся проще, чем запросы со сложными условиями, и часто допускают большую гибкость в решении разнообразных задач извлечения данных

  Команды построения сложных запросов

Команды, использующиеся для построения сложных запросов, зависят от конкретной реализации языка. Стандарт ANSI определяет команды UNION, UNION ALL, INTERSECT и EXCEPT. Все они обсуждаются ниже.

  Команда UNION

Команда UNION используется для объединения результатов двух или более операторов SELECT с исключением повторяющихся строк. Другими словами, если строка попадает в вывод одного запроса, то второй раз она не выводится, даже если она возвращается вторым запросом. При использовании UNION в каждом из связываемых операторов SELECT должно быть выбрано одинаковое число столбцов, столбцы должны быть одинакового типа и следовать в том же порядке.

Синтаксис оператора должен быть следующим.

SELECT столбец1 [, столбец2 ] 

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

[ WHERE ]

UNION

SELECT столбец1 [, столбец2 ]

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

[ WHERE ]

Рассмотрим пример.

SELECT EMP_ID FROM EMPLOYEEJTBL

UNION

SELECT EMP_ID FROM EMPLOYEE_PAY_TBL;

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

Для построения примеров с реальными данными используем следующие простые запросы к двум таблицам.

SELECT PROD_DESC FROM PRODUCTS_TBL;

PROD_DESC

КОСТЮМ ВЕДЬМЫ

ПЛАСТИКОВЫЕ ТЫКВЫ

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

ФОНАРИ

КОСТЮМЫ В АССОРТИМЕНТЕ

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ПЛАСТИКОВЫЕ ПАУКИ

МАСКИ В АССОРТИМЕНТЕ

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ

ПОЛОЧКА ИЗ ДУБА

11 строк выбраны. 

SELECT PROD_DESC FROM PRODUCTS_TMP;

PROD_DESC

КОСТЮМ ВЕДЬМЫ

ПЛАСТИКОВЫЕ ТЫКВЫ

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

ФОНАРИ

КОСТЮМЫ В АССОРТИМЕНТЕ

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ПЛАСТИКОВЫЕ ПАУКИ

МАСКИ В АССОРТИМЕНТЕ

9 строк выбраны.

Таблица PRODUCTS_TMP была создана в ходе урока 3 Обратитесь к уроку 3 снова, если вам необходимо воссоздать эту таблицу

Теперь объединим эти два запроса с помощью команды UNION, чтобы получить следующий составной запрос

SELECT PROD_DESC FROM PRODUCTS_TBL

UNION

SELECT PROD_DESC FROM PRODUCTS_TMP;

PROD_DESC

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

КОСТЮМ ВЕДЬМЫ

КОСТЮМЫ В АССОРТИМЕНТЕ

МАСКИ В АССОРТИМЕНТЕ

ПЛАСТИКОВЫЕ ПАУКИ

ПЛАСТИКОВЫЕ ТЫКВЫ

ПОЛОЧКА ИЗ ДУБА

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ФОНАРИ

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ

11 строк выбраны.

Этот запрос тоже возвращает 11 записей, как и два предыдущих, поскольку при объединении двух запросов с помощью команды UNION повторяющиеся в таблицах записи повторно не выводятся.

В следующем примере с помощью команды UNION комбинируются два независимых запроса.

SELECT PROD_DESC FROM PRODDCTS_TBL

UNION

SELECT LAST_NAME FROM EMPLOYEE_TBL;

PROD_DESC

GLASS

GLASS

PLEW

SPURGEON

STEPHENS

WALLACE

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

КОСТЮМ ВЕДЬМЫ

КОСТЮМЫ В АССОРТИМЕНТЕ

МАСКИ В АССОРТИМЕНТЕ

ПЛАСТИКОВЫЕ ПАУКИ

ПЛАСТИКОВЫЕ ТЫКВЫ

ПОЛОЧКА ИЗ ДУБА

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ФОНАРИ

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ

16 строк выбраны.

Здесь значения столбцов PROD_DESC и LAST_NAME оказываются перечисленными вместе, причем для заголовка столбца использовано имя столбца, выбранного в первом запросе.

  Команда UNION ALL

Команда UNION ALL используется для такого объединения результатов двух операторов SELECT, в которое включаются и повторения строк. Правила использования команды UNION ALL такие же, как и правила использования UNION.

Синтаксис оператора с использованием команды UNION ALL должен быть следующим.

SELECT столбец1 [, столбец2 ] 

FROM таблица1 [, габлица2 ]

[ WHERE ]

UNION ALL

SELECT столбец1 [, столбец2 ]

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

[ WHERE ]

Рассмотрим пример.

SELECT EMP_ID FROM EMPLOYEE_TBL

UNION ALL

SELECT EMP_ID FROM EMPLOYEE_PAY_TBL;

В результате табельные номера, имеющиеся в обеих таблицах, отобразятся дважды.

Следующий составной запрос отличается от составного запроса из предыдущего раздела только использованием команды UNION ALL вместо UNION.

SELECT PROD_DESC FROM PRODUCTS_TBL

UNION ALL

SELECT PROD_DESC FROM PRODUCTSJTMP;

PROD__DESC

КОСТЮМ ВЕДЬМЫ

ПЛАСТИКОВЫЕ ТЫКВЫ

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

ФОНАРИ

КОСТЮМЫ В АССОРТИМЕНТЕ

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ПЛАСТИКОВЫЕ ПАУКИ

МАСКИ В АССОРТИМЕНТЕ

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ

ПОЛОЧКА ИЗ ДУБА

КОСТЮМ ВЕДЬМЫ

ПЛАСТИКОВЫЕ ТЫКВЫ

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

ФОНАРИ

КОСТЮМЫ В АССОРТИМЕНТЕ

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ПЛАСТИКОВЫЕ ПАУКИ

МАСКИ В АССОРТИМЕНТЕ

20 строк выбраны.

Обратите внимание на то, что возвращены 20 строк (11+9), поскольку команда UNION ALL предполагает включение в вывод повторения строк.

  Команда INTERSECT

Команда INTERSECT используется для такого комбинирования результатов двух операторов SELECT, при котором в вывод попадают только те строки из первого запроса, для которых имеются идентичные строки из второго запроса Правила использования команды INTERSECT аналогичны правилам использования команды UNION.

Синтаксис оператора с использованием команды INTERSECT должен быть следующим.

SELECT столбец1 [, столбец2 ]

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

[ WHERE ]

INTERSECT

SELECT столбец1 [, столбец2 ]

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

[ WHERE ]

Рассмотрим пример.

SELECT CUST_ID FROM CUSTOMERJTBL

INTERSECT

SELECT CUST_ID FROM ORDERSJTBL;

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

Следующий составной запрос аналогичен предыдущим, но в нем используется команда INTERSECT.

SELECT PROD_DESC FROM PRODUCTS_TBL

INTERSECT

SELECT PROD_DESC FROM PRODUCTS_TMP;

PROD_DESC

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

КОСТЮМ ВЕДЬМЫ

КОСТЮМЫ В АССОРТИМЕНТЕ

МАСКИ В АССОРТИМЕНТЕ

ПЛАСТИКОВЫЕ ПАУКИ

ПЛАСТИКОВЫЕ ТЫКВЫ

ПОЛОЧКА ИЗ ДУБА

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

9 строк выбраны.

Здесь снова возвращены только 9 строк, поскольку 9 строк идентичны в выводе обоих запросов.

  Команда EXCEPT

Команда EXCEPT комбинирует результаты двух операторов SELECT таким образом, что в вывод попадают те строки первого запроса, которым нет аналогов во втором запросе. Опять же, правила использования команды EXCEPT аналогичны правилам использования команды UNION.

Синтаксис оператора с использованием команды EXCEPT должен быть следующим.

SELECT столбец1 [, столбец2 ]

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

[ WHERE ]

EXCEPT

SELECT столбец1 [, столбец2 ]

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

[ WHERE ]

Рассмотрим пример.

SELECT PROD_DESC FROM PRODUCTS_TBL

EXCEPT

SELECT PROD_DESC FROM PRODUCTS_TMP;

PROD_DESC

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ ПОЛОЧКА ИЗ ДУБА

2 строки выбраны.

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

В некоторых реализациях SQL вместо команды EXCEPT используется команда MINUS Проверьте по документации используемой вами реализации языка, какая именно команда используется в нем для представления функции команды EXCEPT

SELECT PROD_DESC FROM PRODUCTS_TBL

MINUS

SELECT PROD_DESC FROM PRODUCTS_TMP;

PROD_DESC

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ ПОЛОЧКА ИЗ ДУБА

2 строки выбраны

  Использование ORDER BY в составных запросах

В составных запросах можно использовать ключевое слово ORDER BY Однако ключевое слово ORDER BY в них можно использовать только для упорядочения результатов окончательного вывода обоих запросов Поэтому в составном запросе допускается использовать только одно выражение с ключевым словом ORDER BY, хотя сам составной запрос может состоять из нескольких операторов SELECT На столбцы в выражении ключевого слова ORDER BY можно ссылаться как по псевдонимам, так и по их номерам в списке выбора

Синтаксис оператора с использованием ORDER BY должен быть следующим

SELECT столбец1 [, столбец2 ] 

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

[ WHERE ]

КОМАНДА{UNION | EXCEPT INTERSECT | UNION ALL} 

SELECT столбец1 [, столбец2 ] FROM таблица1 [, таблица2 ]

[ WHERE ]

[ ORDER BY ]

Рассмотрим пример

SELECT EMP_ID FROM EMPLOYEE_TBL

UNION

SELECT EMP_ID FROM EMPLOYEE_PAY_TBL

ORDER BY 1;

В результате вывод этого составного запроса будет упорядочен по первому столбцу каждого из составляющих запросов С помощью сортировки в составном запросе легко выявить повторяющиеся строки

Этот оператор SQL возвращает упорядоченный список табельных номеров служащих ИЗ таблиц EMPLOYEEJTBL И EMPLOYEE_PAY_TBL без повторений

Обратите внимание на то что здесь выражение ключевого слова ORDER BY ссылается на столбец по номеру 1, а не по имени

В следующем примере показано использование ключевого слова ORDER BY в составном запросе с реальными данными В выражении ключевого слова ORDER BY можно использовать имя столбца, если этот столбец присутствует и имеет одно и то же имя в каждом из составляющих оператор запросов

SELECT PROD_DESC FROM PRODUCTSJTBL

ONION

SELECT PROD_DESC FROM PRODUCTS_TBL

ORDER BY PROD_DESC;

PROD_DESC

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

КОСТЮМ ВЕДЬМЫ

КОСТЮМЫ В АССОРТИМЕНТЕ

МАСКИ В АССОРТИМЕНТЕ

ПЛАСТИКОВЫЕ ПАУКИ

ПЛАСТИКОВЫЕ ТЫКВЫ

ПОЛОЧКА ИЗ ДУБА

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ФОНАРИ

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ

11 строк выбраны.

В следующем примере вместо имени столбца для сортировки использован его номер

SELECT PROD_DESC FROM PRODUCTS_TBL

UNION

SELECT PROD_DESC FROM PRODUCTS_TBL

ORDER BY 1,

PROD_DESC

ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ

КОСТЮМ ВЕДЬМЫ

КОСТЮМЫ В АССОРТИМЕНТЕ

МАСКИ В АССОРТИМЕНТЕ

ПЛАСТИКОВЫЕ ПАУКИ

ПЛАСТИКОВЫЕ ТЫКВЫ

ПОЛОЧКА ИЗ ДУБА

СЛАДКАЯ КУКУРУЗА

ТЫКВЕННЫЕ КОНФЕТЫ

ФОНАРИ

ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ

11 строк выбраны.

 

  Использование GROUP BY в составных запросах

В отличие от ORDER BY, ключевое слово GROUP BY можно использовать не только в любом из входящих в составной запрос операторе SELECT, но и для всего составного запроса в целом, разместив GROUP BY в конце. Кроме того, вместе с GROUP BY в любом из входящих в составной запрос операторе SELECT можно использовать ключевое слово HAVING (которое иногда используется с GROUP BY).

Синтаксис оператора с использованием GROUP BY должен быть следующим.

SELECT столбец1 [, столбец2 ] 

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

[ WHERE ]

; GROUP BY ]

t HAVING ]

КОМАНДА{UNION | EXCEPT | INTERSECT | UNION ALL} 

SELECT столбец1 [, столбец2 ] 

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

[ WHERE ]

[ GROUP BY ]

[ HAVING ]

[ ORDER BY ]

В следующем примере выбираются буквальные символьные строки, представляющие записи о заказчиках, служащих и товарах. Каждый из входящих в оператор запросов просто подсчитывает число всех записей соответствующей таблицы. В выражении GROUP BY задается группирование выводимых данных по столбцу номер 1.

SELECT 'ЗАКАЗЧИКИ' TYPE, COUNT(*)

FROM CUSTOMERJTBL

UNION

SELECT 'СЛУЖАЩИЕ' TYPE, COUNT(*)

FROM EMPLOYEEJTBL

UNION

SELECT 'ТОВАРЫ' TYPE, COUNT(*)

FROM PRODUCTS_TBL

GROUP BY 1;

TYPE COUNT(*)

ЗАКАЗЧИКИ 15

СЛУЖАЩИЕ 6

ТОВАРЫ 11

3 строки выбраны.

Следующий запрос возвращает те же данные, но в нем дополнительно используется ключевое слово ORDER BY.

SELECT 'ЗАКАЗЧИКИ' TYPE, COUNT(*)

FROM CUSTOMER_TBL

UNION

SELECT 'СЛУЖАЩИЕ' TYPE, COUNT(*)

FROM EMPLOYEEJTBL

UNION

SELECT 'ТОВАРЫ' TYPE, COUNT(*) 

FROM PRODUCTS_TBL 

GROUP BY 1 ORDER BY 2;

TYPE COUNT(*)

СЛУЖАЩИЕ 6

ТОВАРЫ 11

ЗАКАЗЧИКИ 15

3 строки выбраны.

Здесь выведенные данные отсортированы по столбцу 2, представляющем результаты подсчетов. Поэтому числа во втором столбце оказываются упорядоченными от меньшего к большему.

  Обеспечение правильности результатов

При использовании составных операторов следует быть предельно внимательными. Например, если в составном операторе с использованием команды INTERSECT неправильно задать первый из операторов SELECT, в результате можно получить либо неполные, либо вообще неверные данные. Кроме того, всегда ли нужно исключать повторения, как это делает команда UNION, или наоборот, отображать все повторения, как это делает команда UNION ALL Необходимо ли видеть все строки, не входящие в результат второго запроса при использовании команды EXCEPT? Как видите, неправильно составленный составной запрос или неправильный порядок запросов, входящих в составной, легко может привести к неправильным результатам

Неполные данные при выводе тоже квалифицируются как неправильные данные.

  Резюме

Вы ознакомились с принципами использования составных запросов. На всех предыдущих уроках операторы SQL содержали только по одному запросу. В составных запросах комбинируется несколько запросов, чтобы получить требуемое множество данных. Командами связывания запросов являются команды UNION, UNION ALL, INTERSECT И EXCEPT (или MINUS). При использовании UNION В результате присутствуют данные двух запросов без повторений совпадающих строк данных. При использовании UNION ALL выводятся результаты обоих запросов, не смотря на повторения данных. При использовании INTERSECT возвращаются совпадающие в двух запросах строки данных. А команда EXCEPT (или, что то же самое, MINUS) используется тогда, когда необходимо получить результаты одного запроса, не представленные в другом. Составные запросы обеспечивают исключительную гибкость при составлении самых разных запросов, поскольку без использования составных запросов результирующие операторы могут получаться очень сложными.

 

  Вопросы и ответы

Как используются ссылки на столбцы в выражении ключевого слова GROUP BY при использовании этого ключевого слова в операторе составного запроса?

На столбцы можно ссылаться либо по именам, либо по их номерам в списке выбора, если в разных входящих в оператор запросах столбцы имеют разные имена.

Принцип работы команды EXCEPT понятен, но поменяется ли вывод, если поменять местами запросы, входящие в оператор составного запроса?

Да. При использовании EXCEPT или MINUS порядок запросов, входящих в составной запрос, оказывается очень важным. Не забывайте о том, что в этом случае возвращаются все строки первого запроса, не возвращаемые вторым. Изменение порядка запросов должно повлиять на результат.

Должны ли в составном запросе быть одинаковыми и типы данных, и длины столбцов, входящих в оператор запросов?

Нет. Одинаковыми должны быть только типы данных. Длины столбцов могут отличаться.

  Практикум

Задания практических занятий разделены на тесты и упражнения. Тесты предназначены для проверки общего уровня понимания рассмотренного материала. Упражнения дают возможность применить на практике идеи, обсуждавшиеся в ходе текущего урока, в комбинации с идеями из предыдущих уроков. Мы рекомендуем ответить на тестовые вопросы и выполнить упражнения прежде, чем продолжать дальнейшее чтение книги. Ответы можно проверить по Приложению Б, "Ответы".

  Тесты

1. Правильно ли составлены приведенные ниже составные запросы? Если нет, то что в них следует исправить? В операторах используются следующие таблицы EMPLOYEE PAY TBL И EMPLOYEE PAY TBL.

EMPLOYEE_TBL




EMP ID LAST NAME FIRST NAME MIDDLE NAME ADDRESS CITY STATE ZIP PHONE PAGER

VARCHAR2 ( 9 ) VARCHAR2 (15) VARCHAR2 (15) VARCHAR2 (15) VARCHAR2 (30) VARCHAR2 (15) CHAR ( 2 ) NUMBER (5) CHAR (10) CHAR (10)

NOT NULL NOT NULL NOT NULL

NOT NULL NOT NULL NOT NULL NOT NULL


CONSTRAINT EMP

_PK PRIMARY KEY

(EMP_ID)


EMPLOYEE PAY TBL




EMP ID POSITION DATE HIRE PAY RATE

VARCHAR2 ( 9 ) VARCHAR2 (15) DATE NUMBER (4,2)

NOT NULL NOT NULL

NOT NULL

Ключевое поле

DATE_LAST-RAISE DATE SALARY NUMBER(8,2) BONUS NUMBER(6,2)

CONSTRAINT EMP_FK FOREIGN KEY (EMP_ID) REFERENCED

EMPLOYEE_TBL (EMP_ID)

a. SELECT EMP_ID, LAST_NAME, FIRST_NAME FROM EMPLOYEEJTBL UNION SELECT EMP_ID, POSITION, DATE_HIRE

FROM EMPLOYEE_PAY_TBL;

6. SELECT EMP_ID FROM EMPLOYEEJTBL UNION ALL

SELECT EMP_ID FROM EMPLOYEE_PAY_TBL ORDER BY EMP_ID;

B. SELECT EMP_ID FROM EMPLOYEE_PAY_TBL INTERSECT

SELECT EMP_lD FROM EMPLOYEEJTBL ORDER BY 1;

2. Свяжите описания задач операторов с подходящими командами.

 _______Задача оператора______________Команда 

а. Показать совпадающие данные                   UNION

б. Вернуть только те строки первого за-    INTERSECT 

проса, которым имеются эквивааенты        UNION ALL

 во втором запросе                                             FXPFPT

в. Показать данные без повторений 

г. Вернуть строки первого запроса, не 

возвращаемые вторым

  Упражнения

Выполните упражнения для следующих таблиц.

Задача оператора

Команда

а. Показать совпадающие данные

б. Вернуть только те строки первого запроса, которым имеются эквивааенты во втором запросе

в. Показать данные без повторений г. Вернуть строки первого запроса, не возвращаемые вторым


UNION

INTERSECT UNION ALL EXCEPT

CUSTOMER_TBL




CUST ID CUST NAME CUST ADDRESS CUST CITY COST STATE CUST ZIP CUST PHONE CUST_FAX

VARCHAR2 (10) VARCHAR2 (30) VARCHAR2 (20) VARCHAR2 (15) CHAR ( 2 ) NUMBER ( 5 ) NUMBER (10) NUMBER (10)

NOT NULL NOT NULL NOT NULL NOT NULL NOT NULL NOT NULL

Ключевое поле

ORDERS TBL




ORD NUM CUST ID PROD ID QTY ORD DATE

VARCHAR2 (10) VARCHAR2 (10) VARCHAR2 (10) NUMBER (6) DATE

NOT NULL NOT NULL NOT NULL NOT NULL

Ключевое поле

1. Запишите составной запрос, возвращающий имена всех покупателей (C(JST_NAME), разместивших заказы.

2. Запишите составной запрос, возвращающий имена всех покупателей (CUST_NAME), не разместивших заказы.