|
Программирование >> Руководство по sql
восемнадцати строк, включая повторяющиеся. (Предложение 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 (это предложение описывается в следующей главе). В любом случае, независимо от структуры набора строк, для каждого из них получается единственное значение.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |