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

1 ... 82 83 84 [ 85 ] 86 87 88 ... 105


Как с агрегирующими функциями, так и без них, предложение 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:

select pub id,

type, maxadv

= max(advance)

, price

from titles

where pub id <> 0877

group by pub id, type

having type in

(business,

psychology)

max(advance)

> $5000.00

order by pub id, type

Результат:

pub id

type

maxadv

price

1389

business

10125.00

2.99

0736

psychology

7000.00

7.00

0736

psychology

7000.00

7.99

0736

psychology

7000.00

10.95

0736

psychology

7000.00

19.99

0736

psychology

7000.00

21.59

SQL:

select pub id.

type, maxadv

= max(advance)

, price

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



1 ... 82 83 84 [ 85 ] 86 87 88 ... 105

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