Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Подзапросы как генераторы выражений

Оператор all | Оператор any | Подзапросы, возвращающие несколько столбцов | Gt; FROM customer c | Оператор exists | Манипулирование данными с помощью связанных подзапросов | Использование подзапросов | Формирование таблиц | Подзапросы, ориентированные на задачи | Gt; SUM(avail_balance) tot_deposits _> FROM account |


Читайте также:
  1. Ввод и вычисление выражений
  2. Ветрогенераторы других производителей
  3. Вычисление арифметических выражений
  4. Генераторы
  5. Генераторы и синхронные компенсаторы
  6. ГЕНЕРАТОРЫ ПОСТОЯННОГО ТОКА
  7. Использование выражений

 

В этом последнем разделе главы я завершу тему, с которой начал, – скалярные подзапросы, возвращающие один столбец и одну строку. Кроме условий фильтрации скалярные подзапросы применимы везде, где может появляться выражение, включая блоки 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

mybiblioteka.su - 2015-2024 год. (0.006 сек.)