Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Коннолли Т. -> "Базы данных. Проектирование, реализация и сопровождение. Теория и практика" -> 86

Базы данных. Проектирование, реализация и сопровождение. Теория и практика - Коннолли Т.

Коннолли Т., Бегг К. Базы данных. Проектирование, реализация и сопровождение. Теория и практика — М.: Вильямc, 2003. — 1440 c.
ISBN 5-8459-0527-3
Скачать (прямая ссылка): bazidannihpproekt2003.djv
Предыдущая << 1 .. 80 81 82 83 84 85 < 86 > 87 88 89 90 91 92 .. 683 >> Следующая


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

Глава 5. Языг SQL: манипулирование данными

185 '¦ brant п№ staffNo salary
вооз 3G37 '2000.0П
ВООЗ SG14 тЬООО.ОО
вооз SG5 24000.00
BDOEr SL21 30000.00
B0U5 SL41 9000.00
BOO Ч SA9 9000.00

COLJNT(StaffNo) SUM(selary)
3 54000.00
2 39000.00
1 9000.r0

Рис. 5.1. Три группы записей, создаваемые при ыполнении запроса

Стандарт SQL допускает помещение в список выборки SELECT вложенных запросов (раздел 5.3.5). Поэтому приведенный выше запрос можно также представить следующим образом:

SELECT branchNo, (SELECT COUNT (stattNo) AS count FROM Staff s

WHERE s.branchMo = b.branchNo), (SELECT ЭН(salary' AS sum

FROM Staff s

WHERE s.brarchNo = b.branchNo)

FROM Branch b ORDER BY branchNo;

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

Ограничения на выполнение группирования (конструкция HAVING)

Конструкция HAVING предназначена для использования совместно с конструкцией GROUP BY для задания ограничений, указываемых с целью отбора тех групп, которые будут помещены в результирующую таблицу запроса. Хотя конструкции HAVING и WHERE имеют сходный синтаксис, их назначение различно. Конструкция WHERE предназначена для отбора отдельных строк, предназначенных для заполнения результирующей таблицы запроса, а конструкция HAVING используется для отбора групп, помещаемых в результирующую таблицу запроса. Стандарт ISO требует, чтобы имена столбцов, применяемые в конструкции HAVING, обязательно присутствовали в списке элементов GROUP ВЇ или применялись в агрегирующих функциях. На практике условия поиска в конструкции HAVING всегда включают по меньшей мере, одну агрегирующую функцию; в противном случае эти условия поиска должны быть помешены в конструкцию WHERE и применены для отбора отдельных строк. (Помните, что агрегирующие функции не могут использоваться в конструкции WHERE.)

Конструкция HAVING не является необходимой частью языка SQL — любой запрос, написанный с использованием конструкции HAVING, может быть представлен в ином виде, без ее применения.

186

Часть 11. Реляционная модель и языки . Пример 5.18. Использование конструкции HAVING

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

SELECT branchNo, COUNT (staffNo) AS count, SUM(salary) AS sum

FROM Staff GROUP BY branchNo HAVING COUNT(staffNo) > 1 ORDER BY branchNo;

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

Таблица 5.21. Результат выполнения запроса из примера '5.18 branchNo count sum

В00 3 3 54000.00

В005 2 39000.00

5.3.5. Подзапросы

В этом разделе мы обсудим неполно] їяиі законченных операторов SELECT, внедренных в тело другого оператора SELtCj Внешний (второй) оператор SELECT использует результат выполнения внутреннего (первого) оператора для определения содержания окончательного результата всей операции. Внутренние запросы могут находиться в конструкциях WHERE и HAVING внешнего оператора SELECT — в этом случае они получают название подзапросов, или вложенных запросов. К*/0 ме того, внутренние операторы SELECT могут использоваться в операторах INSERT, UPDATE и DELETE (см. раздел 5.3.10). Существуют три типа подзапросов.

• Скалярный подзапрос возврашает значение, выбираемое из пересечения одного столбца с одной строкой, т.е. единственное значение. В принципе скалярный подзапрос может использоваться везде, где требуется указать единственное значение. Варианты скалярных подзапросов приведены в примерах 5.13 и 5.14.

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

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

іГ па Ja 5. Язык SQL: манипулирование данными

187 Пример 5.19. Использование подзапроса с проверкой на равенство

Составьте список персонала, работающего в отделении компании, расположенном по адресу '163 Main St'.

SELECT staffNo, fName, !Name, position FROM Staff

WHERE branchNo = (SELECT branchNo FROM Jranch

WHERE street = '163 Main St'),-

Внутренний оператор SELECT (SELECT branchNo FROM Branch ...) предназначен для определения номера отделения компании, расположенного по адресу 1 It Main St' (Существует только одно такое отделение компании, поэтому данный пример является примером скалярного подзапроса.) После получения номера требуемого отделения выполняется внешний подзапрос, предназначенный для выборки подробных сведений о работниках этого отделения. Иначе говоря, внутренний оператор SELECT возвращает таблицу, состоящую из единственного значения 1 ВООЗ . Оно представляет собой номер того отделения компании, которое находится по адресу 463 Main S: ' Б результате внешний оператор SELECT приобретает следующий вид:
Предыдущая << 1 .. 80 81 82 83 84 85 < 86 > 87 88 89 90 91 92 .. 683 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100