W Cat - SQL за 24 часа
VARCHAR2 (10) VARCHAR2 (10) VARCHAR2(10) NUMBER (6) DATE
NOT NULL NOT NULL NOT NULL NOT NULL
Ключевое поле
PRODUCTS TBL
PROD ID PROD DESC COST
VARCHAR2 (10) VARCHAR2 (40) NUMBER (6, 2)
NOT NULL NOT NULL NOT NULL
Ключевое поле
1. Запишите оператор SQL, возвращающий EMP_ID, LAST_NAME и FIRST NAME из таблицы EMPLOYEE_TBL; SALARY и BONUS из таблицы EMPLOYEE_PAYJTBL.
2. Выберите из таблицы CUSTOMERS_TBL столбцы CUST_ID и CUST "NAME из таблицы PRODUCTS_TBL - столбцы PROD_ID и COST, а из таблицы ORDERS_TBL - ORD_NUM и QTY. Объедините три эти таблицы в одном оператопе SOL.
14-й час Использование подзапросов
В ходе этого урока мы ознакомимся с концепцией использования подзапросов, делающих работу с базой данных более эффективной Основными на этом уроке будут следующие темы.
• Что такое подзапрос?
• Выравнивание выводимых данных с помощью подзапросов
• Примеры типичных подзапросов к базе данных
• Использование подзапросов с операторами языка манипуляций данными
• Вложенные подзапросы
Что такое подзапрос?
Подзапрос - это запрос, содержащийся в выражении ключевого слова WHERE другого запроса с целью дополнительных ограничений на выводимые данные. Подзапросы называют также вложенными запросами. Подзапрос в содержащем его запросе используют для наложения условий на выводимые данные. Подзапросы могут использоваться с операторами SELECT, INSERT, UPDATE или DELETE.
В некоторых случаях подзапрос можно использовать вместо связывания таблиц, тем самым связывая данные таблиц неявно. При использовании в запросе подзапроса сначала выполняется подзапрос, а только потом - содержащий его запрос, причем с учетом условий выполнения подзапроса. Результаты выполнения подзапроса используются при обработке условий в выражении ключевого слова WHERE основного запроса Подзапрос можно использовать либо в выражении ключевого слова WHERE, либо в выражении ключевого слова HAVING главного запроса. Логические операции и операции сравнения типа =, >, <, о, IN, NOT IN, AND, OR и т п. можно использовать как в подзапросе, так и для обработки результатов подзапроса в выражениях ключевых слов WHERE и HAVING.
Все, что применимо к обычному запросу, применимо и к подзапросу Операции связывания, функции, преобразования данных и многое другое можно использовать и в подзапросах
При составлении подзапросов необходимо придерживаться следующих правил.
• Подзапрос необходимо заключить в круглые скобки.
• Подзапрос может ссылаться только на один столбец в выражении своего ключевого слова SELECT, за исключением случаев, когда в главном запросе используется сравнение с несколькими столбцами из подзапроса.
• Ключевое слово ORDER BY использовать в подзапросе нельзя, хотя в главном запросе ORDER BY использоваться может. Вместо ORDER BY в подзапросе можно использовать GROUP BY.
• Подзапрос, возвращающий несколько строк данных, можно использовать только в операторах, допускающих множество значений, например в IN.
• В списке ключевого слова SELECT не допускаются ссылки на значения типа
BLOB, ARRAY, CLOB ИЛИ NCLOB.
• Подзапрос нельзя непосредственно использовать как аргумент допускающей множество значений функяии.
• Операцию BETWEEN по отношению к подзапросу использовать нельзя, но ее можно использовать в самом подзапросе. Базовый синтаксис оператора с подзапросом выглядит следующим образом.
SELECT имя_столбиа
FROM таблица
WHERE имя_столбца = (SELECT имя__столбца
FROM таблица
WHERE условия);
Обратите внимание на отступы в примерах Отступы используются исключительно в целях оформления. Практика показывает, что чем аккуратнее выглядят операторы SQL, тем проще они для понимания и тем легче искать и исправлять в них ошибки, если таковые вдруг обнаруживаются.
Рассмотрим примеры правильного и неправильного использования операции BETWEEN в операторе с подзапросом.
Вот пример правильного использования BETWEEN:
SELECT имя_столбца
FROM таблица
WHERE имя_столбца ОПЕРАЦИЯ (SELECT имя_столбца
FROM таблица
WHERE значение BETWEEN значение);
Вот пример неправильного использования BETWEEN:
SELECT имя_столбца FROM таблица
WHERE имя_столбца BETWEEN значение AND (SELECT имя_столбца
FROM таблица);
Подзапросы в операторе SELECT
Чаще всего используются подзапросы с оператором SELECT, хотя, конечно, используются и подзапросы с операторами манипуляций данными. Подзапросы в операторе SELECT извлекают данные для главного запроса.
Базовый синтаксис соответствующего оператора должен быть следующим.
SELECT имя_столбца [, имя_столбца ]
FROM таблица1 [, таблица2 ]
WHERE имя_столбца ОПЕРАЦИЯ
(SELECT имя_столбца [, имя_столбца ]
FROM таблица1 [, таблица2 ]
[ WHERE ]);
Например,
SELECT E.EMP_ID, E.LAST_NAME, E.FIRST_NAME EP.PAY__RATE
FROM EMPLOYEEJTBL E, EMPLOYEE_PAY_TBL EP
WHERE E.EMP_ID = EP.EMP_ID
AND E?.PAY_RATE > (SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE E.EMP_ID = '313782439');
Этот оператор SQL возвращает табельный номер служащего, фамилию, имя и норму оплаты труда для всех служащих, у которых эта норма оплаты превышает норму оплаты труда служащего с табельным номером 313782439. В данном случае нет необходимости знать (выяснять), какова норма оплаты того конкретного служащего - норма оплаты его труда нужна только для получения списка тех служащих, которые зарабатывают больше, чем он.
В следующем примере извлекается норма оплаты труда конкретного служащего Этот запрос будет использован в качестве подзапроса в примере, следующем за этим
SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE E.EXP_IC - ' 220S84332');
PAY_RATE 11
1 строка выбрана.
Теперь используем этот запрос в качестве подзапроса в следующемзапросе.
SELECT E.EMP_ID, E.LAST_NAME, E.FIRST_NAME EP.PAY_RATE
FROM EMPLOYEEJTBL E, EMPLOYEE_PAY_TBL EP
WHERE E.EMP_ID = EP.EMP_ID
AND EP.PAY_RATE > (SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE E.EMP_ID = '220984332');
EMP_ID LAST_NAM FIRST_NAM PAY_RATE
442346889 PLEW LINDA 14.75
443679012 SPURGEON TIFFANY 15
2 строки выбраны.
Результатом подзапроса будет 11 (это видно из предыдущего примера), поэтому второе из условий в выражении ключевого слова WHERE главного запроса преобразуется в условие
AND EP.PAY_RATE > 11
В результате выполнения запроса вы не получите норму оплаты труда указанного служащего, но сам главный запрос будет сравнивать нормы оплаты труда других служащих с результатом выполнения подзапроса.
ЕМР ID
LAST NAM
FIRST NAM
PAY_RATE
442346889 443679012
PLEW SPURGEON
LINDA TIFFANY
14.75 15
Подзапросы часто используются тогда, когда в запросе требуется указать условия, точных данных для которых нет. Знамения уровня оплаты труда для служащего 220Э84332 у вас нет, но подзапрос и создается для того, чтобы выяснить это значение
Подзапросы в операторе INSERT
Подзапросы могут использоваться и с операторами языка манипуляций данными (DML). Первым из таких операторов мы рассмотрим оператор INSERT. Оператор INSERT использует данные, возвращаемые подзапросом, для помещения их в другую таблицу. Выбранные в подзапросе данные можно модифицировать с помощью символьных или числовых функций, а также функций дат и времени.
Базовый синтаксис соответствующего оператора должен быть следующим.
INSERT INTO имя_таблицы [ (столбец! [, столбец2 ]) ]
SELECT [ *| столбец1 [, столбец2 ]]
FROM таблица1 [, таблица2 ]
[ WHERE значение ОПЕРАЦИЯ значение ]
Вот пример использования оператора INSERT с подзапросом.
INSERT INTO RICH_EMPLOYEES
SELECT E.EMP_ID, E.LAST_NAME, E.FIRST_NAME EP.PAY_RATE
FROM EMPLOYEE_TBL E, EMPLOYEE_PAY_TBL EP
WHERE E.EMP_ID = EP.EMP_ID
AND EP.PAY_RATE > (SELECT PAY_RATE
FROM EMPLOYEE_PAY_TBL
WHERE E.EMP_ID = '220984332');
2 строки созданы.
Этот оператор INSERT вставляет значения EMP_ID, LAST_NAME, FIRST_NAME и PAY_RATE в таблицу RICH_EMPLOYEES для всех служащих, норма оплаты труда которых превышает норму оплаты труда служащего с табельным номером 220984332.
При использовании команд DML типа INSERT не забывайте об использовании команд COMMIT и ROLLBACK
Подзапросы в операторе UPDATE
Подзапросы можно использовать в операторе UPDATE. С помощью оператора UPDATE с подзапросом можно обновлять данные как одного, так и нескольких столбцов сразу.
Базовый синтаксис оператора следующий.
UPDATE таблица
SET имя_столбца [, имя_столбца ] =
(SELECT имя_столбца [,имя_столбца ] FROM таблица
[ WHERE ])
Рассмотрим примеры, разъясняющие использование оператора UPDATE с подзапросом. Сначала рассмотрим запрос, возвращающий табельные номера служащих из Индианаполиса. Как видите, таких служащих четыре.
SELECT EMP_ID
FROM EMPLOYEE_TBL