Программирование >>  Руководство по sql 

1 ... 40 41 42 [ 43 ] 44 45 46 ... 105


business 19.99 5000

mod cook 2.99 15000***

mod cook 19.99 0

NULL NULL NULL

popular comp 22.95 7000***

popular comp 20 8000***

popular comp NULL NULL

psychology 10.95 2275

psychology 7 6000***

psychology 7.99 4000

psychology 19.99 2000

psychology 21.59 7000***

trad cook 11.95 4000

trad cook 14.99 8000-**

trad cook 20.95 7000

В результат включаются только строки со значением расходов выше $5000. Так как в фуппе business имеется только одна строка, удовлетворяющая этому условию, средняя цена будет равна цене, содержащейся в этой строке. С другой стороны, в группе popularcomp условиям предложения WHERE удовлетворяют две строки, и поэтому средняя цена будет равна среднеарифметическому от цен, содержащихся в этих строках.

Обратите внимание, что столбцы в предложении WHERE никоим образом не связаны со столбцами из списка выбора и списка фуппировки.

Упорядоченные группы

Предложение GROUP BY разделяет сфоки на наборы, но при этом не упорядочивает их. Чтобы расположить результаты в определенном порядке, нужно использовать предложение ORDER BY. Не забывайте, что предложения в операторе SELECT должны следовать в сфого определенной последовательности и предложение ORDER BY всегда располагается после предложения GROUP BY. Например, чтобы найти среднюю стоимость книг по каждому типу, зафаты на которые превысили $5000, и упорядочить результаты по цене, нужно выполнить следующий запрос:

SQL:

select type, avg(price)

from titles

where advance >$5000

group by type

order by 2

Результат:

type

mod cook 2.99

business 2.99



psychology 14.295 trad cook 17.97 popular comp 21.475

ПРЕДЛОЖЕНИЕ HAVING

в самом общем смысле, предложение HAVING работает аналогично предложению WHERE, но применяется к группам. WHERE накладывает ограничения на строки, а HAVING - на фуппы. Как правило, предложение HAVING используется совместно с предложением GROUP BY.

Если в списке выбора имеются афегирующие функции, предложение WHERE выполняется перед ними, тогда как предложение HAVING применяется ко всему запросу в целом, после вычисления значений функций и разбиения на фуппы. Чтобы не запутаться в этих тонкостях, нужно просто запомнить порядок предложений в операторе SELECT. Предложение WHERE всегда стоит после предложения FROM, а предложение HAVING - после предложения GROUP BY. Примеры в конце этого раздела помогут вам уяснить различия между предложениями WHERE и HAVING.

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

Разноввдности предложения HAVING

Предложение HAVING работает следующим образом: сначала GROUP BY разделяет сфоки на наборы (по типу), затем на полученные фуппы накладываются условия предложения HAVING (в следующем примере, например, усфаняются наборы, содержащие только одну книгу):

SQL:

select type, count(*) from titles group by type having count(*) > 1

Результат:

type

business 4

mod cook 2

popular comp 3

psychology 5

trad cook 3

Обратите внимание, что в этом случае нельзя просто заменить предложение HAVING на WHERE, так как последнее не допускает использования афегирующих функций. Ниже приведен пример использования предложения HAVING без афегирующих функций. В данном случае сфоки таблицы titles фуппируются по типу и удаляются типы, название которых не начинается с буквы р :

SQL:

select type from titles



group by type having type like p%

Результат:

type

popular comp psychology

Если в предложении HAVING есть несколько условий, они объединяются с помощью операторов AND, OR и NOT. Например, оператор, группирующий строки таблицы titles по издателям и включающий в конечный результат только группы издателей с идентификационными номерами, большими 0800, суммарными расходами, превыщающими $15000, и средней ценой книг меньще $20, имеет следующий вид:

SQL:

select pub id, sum(advance), avg(price)

from titles

group by pub id

having sum(advance) > $15000

and avg(price) < $20

and pub id > 0800

Результат: pub id

Ш7 зГ000~~ ~l4 .l74

1389 30000 18.976

В следующем примере иллюстрируется совместное использование предложений GROUP BY, HAVING, WHERE и ORDER BY в операторе SELECT. В результате его выполнения получаются те же группы, что и в предыдущем примере, но все вычисления выполняются без учета книг со стоимостью меньше $5. Результаты также упорядочиваются по столбцу pubid.

SQL:

select pub id, sum(advance), avg(price)

from titles

where price >= $5

group by pub id

having sum(advance) > $15000

and avg(price) < $20

and pub id > 0800 order by pub id

Результат: pub id

Ш ? 19000 16~.97

1389 30000 18.976

Предложения HAVING и WHERE

Хотя предложения HAVING и WHERE во многом аналогичны, нужно всегда помнить о различиях в выполняемых ими действиях. Например, если условие price>=%5 вместо WHERE поместить в предложение HAVING, то получится совсем другой результат. (В большинстве систем элементы предложения HAVING должны



1 ... 40 41 42 [ 43 ] 44 45 46 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика