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

1 ... 79 80 81 [ 82 ] 83 84 85 ... 105


Глава 12

Ошибки, и как их избежать

НЕТ, ВЫ НЕ ДУРАК

SQL - это необычный компьютерный язык: он не предназначен для профессионалов. Однако настоящих знатоков SQL по-прежнему совсем немного. Многие пользователи SQL являются на самом деле либо программистами на С, либо бухгалтерами, либо специалистами по маркетингу. Они изучают SQL по собственной инициативе и делают это исключительно практическим путем. Эти пользователи приобретают определенную квалификацию, оставаясь при этом лищь случайными пользователями (т.е. работают с SQL лищь от случая к случаю). Когда они сталкиваются с какой-то серьезной трудностью, у них нет возможности обратиться за помощью к специалисту по SQL, сидящему где-нибудь в соседнем отделе. Поэтому им часто приходится обращаться в Internet за помощью к таким же случайным пользователям, как они сами, в надежде, что кто-то из них уже сталкивался с подобной проблемой и нащел способ ее рещения.

Давайте признаем тот очевидный факт, что SQL не очень простой язык, и при его использовании у вас может возникнуть немало вопросов. Примеры кодов, приведенные в этой (как и в предыдущей) главе, основаны на проблемах, взятых из реальной жизни, которые нам удалось почерпнуть из Internet. Эти проблемы спроецированы на уже хорошо знакомую вам базу данных bookbiz- Только в этом случае они приведены вовсе не для того, чтобы вы скопировали их себе или следовали им один к одному , поскольку они представляют собой иллюстрации самых распространенных ошибок и заблуждений.

Интересно отметить, что опять повторяются те же самые темы.

Использование предложения GROUP BY для подсчета элементов.

Непонимание того, когда следует пользоваться предложением WHERE, а когда - предложением HAVING.

Неопределенность по поводу того, как использовать ключевое слово DISTINCT со столбцами и афегирующими функциями.

Непонимание истинных возможностей SQL.

Если вы предпочитаете практический подход к изучению SQL, то вам, несомненно, покажется очень полезным изучение примеров ошибок, часто допускаемых другими пользователями, и анализ правильных методов решения указанных проблем. Не забывайте: вы не одиноки. Если судить по количеству вопросов по SQL, встречающихся в Internet, то многие даже весьма квалифицированные профаммисты на SQL имеют проблемы в указанных областях, но при этом не боятся задавать вопросы.

В этой главе вы не найдете исчерпывающих пояснений и полных синтаксических диафамм. Поэтому когда вам всфетится какая-то тема, по которой вам понадобится более подробная информация, обратитесь к предьщущим главам этой книги или к справочным руководствам по вашей системе.

ПРЕДЛОЖЕНИЕ GROUP BY

GROUP BY - это чрезвычайно эффективный элемент фамматики SQL. Тем не менее многие пользователи и не подозревают о его существовании, прибегая к весьма сложным манипуляциям для вычисления количества элементов, принадлежащих заданным фуппам. В то время как некоторые пользователи забывают о существовании предложения GROUP BY, другие просто теряются от множества ограничений, связанных с ним, или запутываются в различных диалектах.



Подсчет по единицам

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

SQL:

select count(*)

from titles

where pub id = 1389

Результат:

Ho выполнение подсчета по каждому издательству оказалось более сложным. Примеры кода (неудачного) включали использование переменных, циклов WHILE, транзакций и ключевого слова DISTINCT.

Ряд доброхотов из Internet предложили воспользоваться примерно следующей стратегией:

SQL:

select pub id, count{*) from titles group by pub id

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

0736 6

0877 6

1389 6

GROUP BY разделяет данные на наборы. COUNT(*) дает итоговое значение для каждого такого набора.

ПРЕДЛОЖЕНИЯ WHERE И HAVING

Взаимодействия предложений WHERE и HAVING представляют собой классические случаи недоразумений, особенно когда вы используете их вне стандартного контекста списка выбора, содержащего только агрегирующие функции и группируемые столбцы. Вот две наиболее характерные ошибки:

WHERE, GROUP BY и HAVING без агрегирующих функций,

WHERE, GROUP BY и HAVING со смесью агрегирующих функций и зна-

чений строк.

Почему столько строк?

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

Почему результаты этого запроса (если он будет выполняться на вашей системе) включают цены выше $10,00?

SQL:

select price, type from titles where price < $10.00 group by type



Результат:

price

type

business

7.99

psychology

19.99

psychology

11.95

business

19.99

mod cook

2.99

business

10.95

psychology

7.00

psychology

2.99

mod cook

19.99

business

21.59

psychology

Почему повторение условия WHERE в предложении HAVING исправляет эти результаты?

SQL:

select price, type

from titles

where price < $10.00

group by type

having price < $10.00

Результат:

price type

2.99 business

2.99 mod cook

7.00 psychology

7.99 psychology

С этим связана базовая проблема: что же на самом деле означает первый запрос (т.е. ЬоокЫ1-версия примера, который появился в Internet)? По-видимому, второй ( правильный ) ответ дает нам именно то, что и требовалось: список цен и типов для книг стоимостью меньше $10.00.

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

SQL:

select price, type

from titles

where price < $10.00

Результат:

price type

2.99 business

2.99 mod cook

7.00 psychology

7.99 psychology

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



1 ... 79 80 81 [ 82 ] 83 84 85 ... 105

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