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

1 ... 33 34 35 [ 36 ] 37 38 39 ... 105


0736

psychology

0736

psychology

0736

psychology

0736

business

0877

NULL

0877

mod cook

0877

trad cook

0877

trad cook

0877

mod cook

0877

trad cook

1389

popular comp

1389

popular comp

1389

business

1389

business

1389

business

1389

popular comp

Результат

состоит из

восемнадцати строк, включая повторяющиеся. (Предложение ORDER BY используется исключительно для упрощения вида результата.) Если вы попробуете извлечь различающиеся номера издателей, то получите только три строки:

SQL:

select distinct pub id from titles order by pub id

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

оТз б

0877 1389

При выборе только различающихся типов вы получите шесть следующих строк: SQL:

select distinct type from titles order by type

Результат:

Jtyp e

NULL

business

mod cook

popular comp

psychology

trad cook

A если вы захотите выбрать различающиеся комбинации значений издатель-тип , получите семь строк:



SQL:

select distinct pub id, type from titles order by pub id

Результат:

pub id type

0736 business

0736 psychology

0877 NULL

0877 mod cook

0877 trad cook

1389 business

1389 popular comp

Теперь в этом списке представлены только уникальные комбинации значений издатель-тип . Издатель под номером 0736 выпустил книги двух типов, издатель под номером 0877 - двух типов (кроме того, информация о третьем типе неизвестна), издатель под номером 1389 выпустил также книги двух типов, что в сумме дает семь строк. Таким образом, ключевое слово DISTINCT применяется ко всему списку выбора, а не к отдельным столбцам.

А различаются ли нулевые значения? Хотя по определению нулевые значения никогда не равны друг другу, при использовании ключевого слова DISTINCT все нулевые значения в столбце считаются повторяющимися. Например, если бы издатель с номером 0877 имел несколько книг с неопределенным типом (NULL), то при выполнении запроса с ключевым словом DISTINCT в результате все равно была бы выбрана только одна комбинация издатель-NULL .

DISTINCT *. Если в ващей системе допускается конструкция DISTINCT *, сравните результаты выполнения двух следующих запросов:

SQL:

select distinct * from titles

SQL:

select * from titles

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

DISTINCT и ORDER BY. В больщинстве диалектов SQL каждый элемент предложения ORDER BY должен также находиться и в списке выбора. В системах, предоставляющих большую гибкость (когда элемент предложения ORDER BY может не включаться в список выбора), можно выполнять запросы с ключевым словом DISTINCT, примененным к списку выбора, и с предложением ORDER BY, содержащем элементы, не входящие в список выбора.

Например, в Sybase SQL Server при сортировке по столбцу, не входящему в список выбора, получается тот же результат, что и при включении этого столбца в список выбора с ключевым словом DISTINCT. В обоих случаях это приводит к увеличению количества выбранных строк. Обратите внимание на результаты следующего запроса (не пытайтесь выполнить его в SQL Anywhere - вы получите сообщение об ошибке):



SQL:

select distinct pub id from titles order by type

Так как в базе представлены только три издателя, в результате можно было бы ожидать получение трех строк. Однако вот что получается на самом деле:

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

0877 0736 1389 0877 1389 0736 0877

Почему в результате оказалось семь строк? Ответ заключен в предложении ORDER BY. Это же количество строк было бы получено и при сортировке по издателям и поиске различных типов.

SQL:

select distinct type from titles order by pub id

Результат:

t ype

business

psychology

NULL

mod cook trad cook business popular comp

Теперь становится понятно, откуда взялись семь строк. Transact-SQL находит все возможные уникальные комбинации значений элементов из списка выбора (с ключевым словом DISTINCT) и предложения ORDER BY (не входящие в список выбора). Таких комбинаций pubJd и type ровно семь.

Если в вашей системе также допускается использование в предложении ORDER BY элементов, не входящих в список выбора, поэкспериментируйте с приведенным выше запросом, чтобы узнать, как обрабатывается в ней подобная ситуация. Целый ряд примеров использования ключевого слова DISTINCT содержится в главе 12.

АГРЕГИРУЮЩИЕ ФУНКЦИИ

Агрегирующие функции используются для получения обобщающих значений. Их можно применять к наборам (set) строк: ко всем строкам таблицы, строкам, определенным в предложении WHERE, или к группам строк в предложении GROUP BY (это предложение описывается в следующей главе). В любом случае, независимо от структуры набора строк, для каждого из них получается единственное значение.



1 ... 33 34 35 [ 36 ] 37 38 39 ... 105

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