Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




                    7. ФОРМИРОВАНИЕ ВЫВОДОВ ЗАПРОСОВ
 
 
   ЭТА ГЛАВА  РАСШИРИТ ВАШИ ВОЗМОЖНОСТИ в работе с выводом который про-
 изводит запрос.  Вы узнаете как вставлять текст и константы между выб-
 ранных полей, как использовать выбранные поля в математических выраже-
 ниях, чьи результаты затем становятся выводом, и как сделать чтобы ва-
 ши  значения выводились в определенном порядке.  Эта последняя особен-
 ность включена, чтобы упорядочивать ваш вывод по любым столбцам, любым
 полученным значениям этого столбца, или по обеим.
 
 
             ===========  СТРОКИ И ВЫРАЖЕНИЯ  ============
 
 
   Большинство основанных  на  SQL баз данных предоставляют специальные
 средства позволяющие Вам совершенствовать вывод ваших запросов. Конеч-
 но,  они претерпевают значительные изменения от программы к программе,
 и их обсуждение здесь не входит в наши задачи,  однако,  имеются  пять
 особенностей  созданых  в  стандарте  SQL которые позволяют вам делать
 больше чем просто вывод значений полей и агрегатных данных.
 
 
             СКАЛЯРНОЕ ВЫРАЖЕНИЕ С ПОМОЩЬЮ ВЫБРАННЫХ ПОЛЕЙ
 
 
   Предположим что вы хотите выполнять простые числовые вычисления дан-
 ных  чтобы затем помещать их в форму больше соответствующую вашим пот-
 ребностям.  SQL позволяет вам помещать скалярные выражения и константы
 среди выбраных полей.  Эти выражения могут дополнять или замещать поля
 в предложениях SELECT,  и могут включать в себя одно или более выбран-
 ных полей.  Например, вы можете пожелать, представить комиссионные ва-
 шего продавца в процентном отношении а не как десятичные числа. Просто
 достаточно:
 
 
         SELECT snum, sname, city, comm * 100
             FROM Salespeople;
 
 
   Вывод из этого запроса показывается в Рисунке 7.1.
 
 
                             СТОЛБЦЫ ВЫВОДА
 
 
   Последний столбец предшествующего примера непомечен( т.е. без наиме-
 нования), потому что это - столбец вывода. Столбцы вывода - это столб-
 цы данных созданные запросом способом,  иным чем просто извлечение  их
 из таблицы. Вы создаете их всякий раз, когда вы используете агрегатные
 
 
            ===============  SQL Execution Log ============
           |                                               |
           | SELECT snum, sname, city, comm * 100          |
           | FROM  Salespeople;                            |
           | ==============================================|
           |   snum      sname       city                  |
           | ------    ---------  -----------   ---------  |
           |   1001      Peel       London      12.000000  |
           |   1002      Serres     San Jose    13.000000  |
           |   1004      Motika     London      11.000000  |
           |   1007      Rifkin     Barcelona   15.000000  |
           |   1003      Axelrod    New York    10.000000  |
           |                                               |
            ===============================================
 
 
 Рисунок 7.1: Помещение выражения в вашем запросе
 
 
 функции, константы,  или выражения в предложении SELECT  запроса.  Так
 как имя столбца - один из атрибутов таблицы,  столбцы которые приходят
 не из таблиц не имеют  никаких  имен.  Другими  словами  непомеченные,
 столбцы вывода могут обрабатываться также как и столбцы извлеченные из
 таблиц, почти во всех ситуациях.
 
 
                ПОМЕЩЕНИЕ ТЕКСТА В ВАШЕМ ВЫВОДЕ ЗАПРОСА
   Символ 'A',  когда ничего не значит сам по себе, - является констан-
 той, такой например как число 1. Вы можете вставлять константы в пред-
 ложение SELECT запроса,  включая и текст. Однако символьные константы,
 в отличие от числовых констант,  не могут использоваться в выражениях.
 Вы  можете иметь выражение 1 + 2 в вашем предложении SELECT,  но вы не
 можете использовать выражение типа 'A' + 'B'; это приемлемо только ес-
 ли  мы имеем в виду что 'A' и 'B' это просто буквы,  а не переменные и
 не символы.
   Тем ни  менее,  возможность  вставлять  текст в вывод ваших запросов
 очень удобная штука.
   Вы можете  усовершенствовать предыдущий пример представив комиссион-
 ные как проценты со знаком процента (%).  Это даст вам возможность по-
 мещать в вывод такие единицы как символы и комментарии, как например в
 следующем примере ( вывод показывается в Рисунке 7.2 )
 
 
             SELECT snum, sname, city, ' % ', comm * 100
                FROM Salespeople;
 
 
            ===============  SQL Execution Log ============
           |                                               |
           | SELECT snum, sname, city, '%' comm * 100      |
           | FROM  Salespeople;                            |
           | ==============================================|
           |   snum   sname      city                      |
           | ------  -------- -----------  ----  --------- |
           |   1001   Peel      London       %   12.000000 |
           |   1002   Serres    San Jose     %   13.000000 |
           |   1004   Motika    London       %   11.000000 |
           |   1007   Rifkin    Barcelona    %   15.000000 |
           |   1003   Axelrod   New York     %   10.000000 |
           |                                               |
            ===============================================
 
 
 Рисунок 7.2: Вставка символов в ваш вывод
 
 
   Обратите внимание что пробел перед процентом вставляется  как  часть
 строки.  Эта  же самая особенность может использоваться чтобы маркиро-
 вать вывод вместе с вставляемыми комментариями. Вы должны помнить, что
 этот же самый комментарий будет напечатан в каждой строке вывода, а не
 просто один раз для всей таблицы. Предположим что вы генерируете вывод
 для  отчета  который  бы  указывал число порядков получаемых в течение
 каждого дня.  Вы можете промаркировать ваш вывод ( см.  Рисунок 7.3  )
 сформировав запрос следующим образом:
 
 
            SELECT ' For ', odate, ', there are ',
               COUNT ( DISTINCT onum ), 'orders.'
               FROM Orders
               GROUP BY odate;
 
 
   Грамматической некорректности вывода, на 5 Октября, невозможно избе-
 жать не создав запроса, еще более сложного чем этот. ( Вы будете долж-
 ны использовать два запроса с UNION, который
 
 
            ===============  SQL Execution Log ==============
           |                                                 |
           | SELECT 'For', odate, ', ' there are ' ,         |
           | COUNT (DISTINCT onum), ' orders '               |
           | FROM Orders                                     |
           | GROUP BY odate;                                 |
           | =============================================== |
           |           odate                                 |
           | ------  ----------   ---------  ------  ------- |
           |   For   10/03/1990 , there are       5  orders. |
           |   For   10/04/1990 , there are       2  orders. |
           |   For   10/05/1990 , there are       1  orders. |
           |   For   10/06/1990 , there are       2  orders. |
           |                                                 |
             ================================================
 
 
 Рисунок 7.3: Комбинация текста, значений поля, и агрегатов
 
 
 мы будем описывать в Главе 14. ) Как вы можете видеть, одиночный неиз-
 менный комментарий для каждой строки таблицы может быть очень полезен,
 но имеет ограничения.  Иногда изящнее и полезнее, произвести один ком-
 ментарий  для  всего вывода в целом,  или производить свой собственный
 комментарии для каждой строки.
   Различные программы  использующие SQL часто обеспечивают специальные
 средства типа генератора отчетов(  например  Report  Writer),  которые
 разработаны чтобы  форматировать  и совершенствовать вывод.  Вложенный
 SQL может также эксплуатировать возможности того языка  в  который  он
 вложен.  SQL сам по себе интересен прежде всего при операциях с данны-
 ми.  Вывод,  по существу, это информация, и программа использующая SQL
 может  часто использовать эту информацию и помещать ее в более привле-
 кательную форму. Это, однако, вне сферы самой SQL.
 
 
             =======   УПОРЯДОЧЕНИЕ ВЫВОДА ПОЛЕЙ  ========
 
 
   Как мы подчеркивали,  таблицы - это неупорядоченные наборы данных, и
 данные которе выходят из их,  не обязательно появляются в какой-то оп-
 ределенной последовательности.  SQL использует команду ORDER BY  чтобы
 позволять вам упорядочивать ваш вывод. Эта команда упорядочивает вывод
 запроса согласно значениям в том или ином количестве выбранных  столб-
 цов.  Многочисленые столбцы упорядочиваются один внутри другого, также
 как с GROUP BY,  и вы можете определять возрастание ( ASC ) или убыва-
 ние ( DESC ) для каждого столбца. По умолчанию установлено - возроста-
 ние.  Давайте рассмотрим нашу таблицу порядка приводимую в  порядок  с
 помощью номера заказчика ( обратите внимание на значения в cnum столб-
 це):
                 SELECT *
                   FROM Orders
                   ORDER BY cnum DESC;
 
 
 Вывод  показывается в Рисунке 7.4.
 
 
            ===============  SQL Execution Log ==============
           |                                                 |
           | SELECT *                                        |
           | FROM  Orders                                    |
           | ORDER BY cnum DESC;                             |
           | =============================================== |
           |   onum       amt      odate      cnum     snum  |
           |  ------   --------  ----------  -----    -----  |
           |   3001       18.69  10/03/1990   2008     1007  |
           |   3006     1098.16  10/03/1990   2008     1007  |
           |   3002     1900.10  10/03/1990   2007     1004  |
           |   3008     4723.00  10/05/1990   2006     1001  |
           |   3011     9891.88  10/06/1990   2006     1001  |
           |   3007       75.75  10/04/1990   2004     1002  |
           |   3010     1309.95  10/06/1990   2004     1002  |
           |   3005     5160.45  10/03/1990   2003     1002  |
           |   3009     1713.23  10/04/1990   2002     1003  |
           |   3003      767.19  10/03/1990   2001     1001  |
           |                                                 |
             ================================================
 
 
 Рисунок 7. 4: Упорядочение вывода с помощью убывания поля
 
 
             УПОРЯДОЧЕНИЕ С ПОМОЩЬЮ МНОГОЧИСЛЕНЫХ СТОЛБЦОВ
 
 
   Мы можем также упорядочивать таблицу с помощью другого столбца, нап-
 ример с помощью поля amt, внутри упорядочения поля cnum. ( вывод пока-
 зан в Рисунке 7.5 ):
 
 
             SELECT *
                FROM Orders
                ORDER BY cnum DESC, amt DESC;
 
 
            ===============  SQL Execution Log ==============
           |                                                 |
           | SELECT *                                        |
           | FROM  Orders                                    |
           | ORDER BY cnum DESC, amt DESC;                   |
           | =============================================== |
           |   onum       amt      odate      cnum     snum  |
           |  ------   --------  ----------  -----    -----  |
           |   3006     1098.16  10/03/1990   2008     1007  |
           |   3001       18.69  10/03/1990   2008     1007  |
           |   3002     1900.10  10/03/1990   2007     1004  |
           |   3011     9891.88  10/06/1990   2006     1001  |
           |   3008     4723.00  10/05/1990   2006     1001  |
           |   3010     1309.95  10/06/1990   2004     1002  |
           |   3007       75.75  10/04/1990   2004     1002  |
           |   3005     5160.45  10/03/1990   2003     1002  |
           |   3009     1713.23  10/04/1990   2002     1003  |
           |   3003      767.19  10/03/1990   2001     1001  |
           |                                                 |
             ================================================
 
 
 
 
 Рисунок 7.5: Упорядочение вывода с помощью многочисленых полей
 
 
   Вы можете использовать ORDER BY таким же способом сразу с любым чис-
 лом столбцов.  Обратите внимание что, во всех случаях, столбцы которые
 упорядочиваются должны быть указаны в выборе SELECT.  Это - требование
 ANSI которые в большинстве,  но не всегда, предписано системе. Следую-
 щая команда, например, будет запрещена:
 
 
               SELECT cname, city
                  FROM Customers
                  GROUP BY cnum;
 
 
   Так как поле cnum не было выбранным полем,  GROUP BY не cможет найти
 его чтобы использовать для упорядочения вывода. Даже если ваша система
 позволяет это,  смысл упорядочения не будет понятен из вывода, так что
 включение (в предложение SELECT) всех столбцов, используемых в предло-
 жении ORDER BY, в принципе желательно.
 
 
                     УПОРЯДОЧЕНИЕ АГРЕГАТНЫХ ГРУПП
 
 
   ORDER BY может кроме того,  использоваться с GROUP BY для упорядоче-
 ния групп.  Если это так, то ORDER BY всегда приходит последним. Вот -
 пример из последней главы с добавлением предложения  ORDER  BY.  Перед
 сгруппированием вывода,  порядок групп был произвольным; и мы, теперь,
 заставим группы размещаться в последовательности:
 
 
                   SELECT snum, odate, MAX (amt)
                      FROM Orders
                      GROUP BY snum, odate
                      GROUP BY snum;
 
 
 Вывод  показывается в Рисунке 7.6.
 
 
                ===============  SQL Execution Log ==============
               |                                                 |
               | SELECT snum, odate, MAX (amt)                   |
               | FROM  Orders                                    |
               | GROUP BY snum, odate                            |
               | ORDER BY snum ;                                 |
               | =============================================== |
               |    snum       odate        amt                  |
               |   -----     ----------  --------                |
               |    1001     10/06/1990    767.19                |
               |    1001     10/05/1990   4723.00                |
               |    1001     10/05/1990   9891.88                |
               |    1002     10/06/1990   5160.45                |
               |    1002     10/04/1990     75.75                |
               |    1002     10/03/1990   1309.95                |
               |    1003     10/04/1990   1713.23                |
               |    1004     10/03/1990   1900.10                |
               |    1007     10/03/1990   1098.16                |
               |                                                 |
                 ================================================
 
 
 Рисунок 7. 6: Упорядочение с помощью группы
 
 
   Так как мы не указывали на возрастание или убывание порядка, возрас-
 тание используется по умолчанию.
 
 
                 УПОРЯДОЧЕНИЕ ВЫВОДА ПО НОМЕРУ СТОЛБЦА
 
 
   Вместо имен столбца, вы можете использовать их порядковые номера для
 указания поля используемого в упорядочении вывода.  Эти  номера  могут
 ссылаться не на порядок столбцов в таблице,  а на их порядок в выводе.
 Другими словами,  поле упомянутое в предложении SELECT первым, для OR-
 DER  BY - это поле 1,  независимо от того каким по порядку оно стоит в
 таблице. Например, вы можете использовать следующую команду чтобы уви-
 деть  определенные  поля  таблицы Продавцов,  упорядоченными в порядке
 убывания к наименьшему значению комиссионных ( вывод показывается  Ри-
 сунке 7.7 ):
 
 
               SELECT sname, comm
                  FROM Salespeople
                  GROUP BY 2 DESC;
 
 
 
 
                ===============  SQL Execution Log ============
               |                                               |
               | (SELECT sname, comm                           |
               | FROM Salespeople                              |
               | ORDER BY 2 DESC;                              |
               | ============================================= |
               |    sname       comm                           |
               |   --------   --------                         |
               |   Peel           0.17                         |
               |   Serres         0.13                         |
               |   Rifkin         0.15                         |
               |                                               |
                ===============================================
 
 
 
 
 Pисунок 7. 7:  Упорядочение использующее номера
 
 
   Одна из  основных целей этой возможности ORDER BY - дать вам возмож-
 ность использовать GROUP BY со столбцами вывода также как и со  столб-
 цами таблицы. Столбцы производимые агрегатной функцией, константы, или
 выражения в предложении SELECT запроса,  абсолютнопригодны для исполь-
 зования с GROUP BY,  если они ссылаются к ним с помощью номера. Напри-
 мер,  давайте сосчитаем порядки каждого из наших продавцов,  и выведем
 результаты в убывающем порядке, как показано в Рисунке 7.8:
 
 
             SELECT snum, COUNT ( DISTINCT onum )
                FROM Orders
                GROUP BY snum
                ORDER BY 2 DESC;
 
 
                ===============  SQL Execution Log ==============
               |                                                 |
               | SELECT snum, odate, MAX (amt)                   |
               | FROM Orders                                     |
               | GROUP BY snum                                   |
               | ORDER BY 2 DESC;                                |
               | =============================================== |
               |    snum                                         |
               |   -----     ----------                          |
               |    1001             3                           |
               |    1002             3                           |
               |    1007             2                           |
               |    1003             1                           |
               |    1004             1                           |
               |                                                 |
                 ================================================
 
 
 Рисунок 7.8: Упорядочение с помощью столбца вывода
 
 
   В этом случае, вы должны использовать номер столбца, так как столбец
 вывода не имеет имени;  и вы не должны  использовать  саму  агрегатную
 функцию.  Строго говоря по правилам ANSI SQL, следующее не будет рабо-
 тать, хотя некоторые системы и пренебрегают этим требованием:
 
 
         SELECT snum, COUNT ( DISTINCT onum )
            FROM Orders
            GROUP BY snum
            GROUP BY COUNTОМ ( DISTINCT onum ) DESC;
 
 
   Это будет отклонено большинством систем!
 
 
                  УПОРЯДОЧЕНИЕ С ПОМОЩЬЮ ОПРЕТОРА NULL
 
 
   Если имеются  пустые  значения  (NULL) в поле которое вы используете
 для упорядочивания вашего вывода,  они могутут или следовать или пред-
 шествовать каждому другому значению в поле.  Это - возможность которую
 ANSI оставил для индивидуальных программ.  Данная программа использует
 ту или иную форму.
 
 
               ================  РЕЗЮМЕ =================
 
 
   В этой  главе,  вы изучили как заставить ваши запросы делать больше,
 чем просто выводить значения полей или объединять функциональные  дан-
 ные таблиц. Вы можете использовать поля в выражениях: например, вы мо-
 жете умножить числовое поле на 10 или даже умножить его на другое чис-
 ловое поле. Кроме того, вы можете помещать константы, включая и симво-
 лы,  в ваш вывод,  что позволяет вам помещать текст непосредственно  в
 запрос и получать его в выводе вместе с данными таблицы.
   Это дает вам возможность помечать или объяснять ваш вывод различными
 способами.
   Вы также изучили как упорядочивать ваш вывод. Даже если таблица сама
 по  себе остается неупорядоченной,  предложение ORDER BY дает вам воз-
 можность управлять порядком вывода строк данного запроса. Вывод запро-
 са может быть в порядке возрастания или убывания, и столбцы могут быть
 вложенными один внутрь другого.
   Понятие выводимых столбцов объяснялось в этой главе. Вы теперь знае-
 те что выводимые столбцы можно использовать чтобы упорядочивать  вывод
 запроса,  но  эти столбцы - без имени,  и следовательно должны опреде-
 ляться их порядковым номером в предложении ORDER BY.
   Теперь, когда вы увидели что можно делать с выводом запроса основан-
 ного на одиночной таблице,  настало время чтобы перейти к возможностям
 улучшенного  запроса и узнать как сделать запрос любого числа таблиц в
 одной команде,  определив связи между ними как вы это  обычно  делали.
 Это будет темой Главы 8.
 
 
               ************** РАБОТА С SQL **************
 
 
 1. Предположим  что каждый продавец имеет 12%  комиссионных.  Напишите
    запрос к таблице Порядков который мог бы вывести номер порядка, но-
    мер продавца, и сумму комиссионных продавца для этого порядка.
 2. Напишите запрос к таблице Заказчиков который мог  бы  найти  высшую
    оценку в каждом городе. Вывод должен быть в такой форме:
          For the city (city), the highest rating is: (rating).
 3. Напишите  запрос  который выводил бы список заказчиков в нисходящем
    порядке.  Вывод поля оценки( rating ) должден сопровождаться именем
    закзчика и его номером.
 4. Напишите запрос который бы выводил общие порядки на каждый  день  и
    помещал результаты в нисходящем порядке.
 
 
 ( См. Приложение A для ответов. )
 
 
 



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |