Читайте также: |
|
В этом последнем разделе главы я завершу тему, с которой начал, – скалярные подзапросы, возвращающие один столбец и одну строку. Кроме условий фильтрации скалярные подзапросы применимы везде, где может появляться выражение, включая блоки select и order by за_ проса и блок values (значения) выражения insert.
Ранее в этой главе, в разделе «Подзапросы, ориентированные на зада_ чи», было показано, как с помощью подзапроса отделить механизм группировки от остального запроса. Вот вариант того же запроса, ис_ пользующий подзапросы с той же целью, но по_другому:
mysql> SELECT
_> (SELECT p.name FROM product p
_> WHERE p.product_cd = a.product_cd
_> AND p.product_type_cd = 'ACCOUNT') product, _> (SELECT b.name FROM branch b
_> WHERE b.branch_id = a.open_branch_id) branch,
_> (SELECT CONCAT(e.fname, ' ', e.lname) FROM employee e _> WHERE e.emp_id = a.open_emp_id) name,
_> SUM(a.avail_balance) tot_deposits _> FROM account a
_> GROUP BY a.product_cd, a.open_branch_id, a.open_emp_id;
+________________________+_______________+_________________+______________+ | product | branch | name | tot_deposits | +________________________+_______________+_________________+______________+
| NULL | | Woburn Branch | | Paula Roberts | | | 9345.55 | | | |
| NULL | | So. NH Branch | | Theresa Markham | | 0.00 | | | ||
| certificate of deposit | | Headquarters | | Michael | Smith | | | 11500.00 | | |
| certificate of deposit | | Woburn Branch | | Paula Roberts | | | 8000.00 | | | |
| checking account | | Headquarters | | Michael | Smith | | | 782.16 | | |
| checking account | | Woburn Branch | | Paula Roberts | | | 3315.77 | | | |
| checking account | | Quincy Branch | | John Blake | | | 1057.75 | | | |
| checking account | | So. NH Branch | | Theresa Markham | | 67852.33 | | | ||
| money market account | | Headquarters | | Michael Smith | | | 14832.64 | | | |
| money market account | | Quincy Branch | | John Blake | | | 2212.50 | | | |
| savings account | | Headquarters | | Michael Smith | | | 767.77 | | | |
| savings account | | Woburn Branch | | Paula Roberts | | | 700.00 | | | |
| savings account | | So. NH Branch | | Theresa Markham | | | 387.99 | | | |
| NULL | | Quincy Branch | | John Blake | | | 50000.00 | | |
+________________________+_______________+_________________+______________+ 14 rows in set (0.01 sec)
Между этим запросом и приведенной ранее версией, использующей подзапрос в блоке from, есть два основных различия:
• Вместо соединения таблиц product, branch и employee с данными сче_ та в блоке select используются связанные скалярные подзапросы для поиска типа счета, отделения и сотрудника.
Использование подзапросов | |
• Результирующий набор содержит 14 строк, а не 11, и три типа сче_ тов – null.
Три дополнительные строки появляются в результирующем наборе потому, что предыдущая версия запроса включала условие фильтра_ ции p.product_type_cd = 'ACCOUNT'. Этот фильтр исключал строки для счетов типов INSURANCE (страховка) и LOAN (ссуда), например не_ большие ссуды коммерческим предприятиям. Поскольку в этой вер_ сии запроса нет соединения с таблицей product, нет возможности вклю_ чить условие фильтрации в основной запрос. Связанный подзапрос к таблице product включает этот фильтр, но единственный производи_ мый им эффект – указание null вместо типа счета. Если хотите изба_ виться от дополнительных трех строк, можно соединить таблицу product с таблицей account и включить условие фильтрации или просто сделать следующее:
mysql> SELECT all_prods.product, all_prods.branch,
Дата добавления: 2015-08-17; просмотров: 45 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Подзапросы в условиях фильтрации | | | Gt; SUM(a.avail_balance) tot_deposits _> FROM account a |