|
Программирование >> Руководство по sql
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 должны
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |