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