|
Программирование >> Руководство по sql
Как с агрегирующими функциями, так и без них, предложение HAVING накладывает Офаничения на все распечатываемые сфоки: SQL: select pub id, type from titles where pub id <> 0877 group by pub id, type having type in (business, psychology) order by pub id, type Результат: pub id type 0736 business 0736 psychology 1389 business SQL: select pub id, type, max(advance) from titles where pub id <> 0877 group by pub id, type having type in (business, psychology) order by pub id, type Результат: pub id type 0736 business 10125.00 0736 psychology 7000.00 1389 business 5000.00 Если требуется Офаничить выводимые значения афегирующих функций, воспользуйтесь предложением HAVING. Помните: афегирующие функции нельзя включать в предложение WHERE. SQL: select pub id, type, max(advance) from titles where pub id <> 0877 group by pub id, type having type in (business, psychology) and max(advance) > $5000.00 order by pub id, type Результат: pub id type 0736 business 10125.00 0736 psychology 7000.00 Если в вашей системе допускается использование в списке выбора столбцов и выражений, которые не являются афегирующими функциями и не находятся в предложении GROUP BY, то можно воспользоваться предложением HAVING для управления результатами: SQL:
from titles where pub id <> 0877 group by pub id, type having type in (business, psychology) and max(advance) > $5000.00 and advance = max(advance) order by pub id, type Результат: pub id type maxadv price 1389 business 10125.00 2.99 0736 psychology 7000.00 21.59 КЛЮЧЕВОЕ СЛОВО DISTINCT Если у вас есть таблица с двумя столбцами, то как отыскать все уникальные комбинации содержащихся в них значений? Очевидным ответом в этом случае кажется использование ключевого слова DISTINCT, однако многие пользователи жалуются в Internet, что при использовании таких, казалось бы, простых DISTINCT-запросов им не удается получить ничего иного, кроме синтаксических ощибок и странных результатов. Это, по-видимому, связано с тем, что DISTINCT имеет две различные формы: с именами столбцов и с агрегирующими функциями. Синтаксис этих двух форм отличается в степени вполне достаточной, чтобы окончательно сбить с толку случайного пользователя. С именами столбцов и выражениями DISTINCT используется однократно, и его действие в этом случае распространяется на все, что находится после него. Оно является первым словом в списке выбора и скобки для него не требуются. Когда вы рещаете использовать DISTINCT именно таким способом, то существенно сковываете тем самым свои действия. Вы уже не можете указать какое-либо не-DISTINCT значение для чего бы то ни было в списке выбора. Но бывают и исключения. Когда вы используете DISTINCT с афегирующими функциями (AVG, SUM и т.п.), его действие распространяется только на элементы этой конкретной афегирующей функции. В некоторых системах в списке выбора можно использовать несколько таких афегирующих DISTINCT. Эти два варианта настолько похожи друг на друга, что вряд ли стоит удивляться тому страху, неопределенности и сомнениям, которые они сеют в рядах пользователей. Сколько ключевых слов DISTINCT можно использовать в списке выбора? Следует ли заключать их в скобки или нет? Самый надежный способ избежать ошибок - это помнить, что на самом деле есть два варианта использования ключевого слова DISTINCT. DISTINCT со столбцами и выражениями Ниже приведен пример, который наверняка прояснит разницу между двумя формами ключевого слова DISTINCT. Допустим, вы хотите отобразить распределение цен и авансовых выплат в таблице titles для книг стоимостью ниже $15.00. Получить отдельные списки уникальных цен и уникальных авансовых сумм несложно: SQL: select distinct price from titles where price < $15.00 Результат: price 7.99 10.95 11.95 14.99 SQL: select distinct advance from titles where price < $15.00 Результат: advance 227! 70*0 4000.00 5000.00 6000.00 8000.00 10125.00 15000.00 Итак, (имеется шесть разных цен и семь различных авансовых сумм. Если вы хотите найти разные комбинации этих значений, не поддавайтесь искушению использовать DISTINCT для каждого столбца: DISTINCT должно быть первым словом в предложении SELECT, а его действие распространяется на все, что находится после него. Следующий запрос отыскивает уникальные комбинации цены и аванса для книг дешевле $15.00: SQL: select distinct price, advance from titles where price < $15.00
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |