Введение в язык SQL запросов к базам данных. Баканов В.М. - 30 стр.

UptoLike

Составители: 

- 30 -
SELECT DNAME,JOB,SUM(SAL), --- функция SUM (**)
COUNT(*), --- функция COUNT(*)
AVG(SAL) --- функция AVG
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY DNAME, JOB;
DNAME JOB SUM(SАL) COUNT(*) АVG(SAL)
ACCOUNTING CLERC 1,800.00 1 1,300.00
ACCOUNTING MANAGER 2,450.00 1 2,450.00
ACCOUNTING PRESIDENT 5,000.00 1 5,000.00
RESEARCH ANALYST 6,000,00 2 3,000.00
RESEARCH CLERC 1,900.00 2 950.00
RESEARCH MANAGER 2,975.00 1 2,975.00
SALES CLERC 950.00 1 950.00
SALES MANAGER 2,850.00 1 2,850.00
SALES SALESMAN 5,600.00 4 1,400.00
Рассмотрим работу, которую выполняет программист при создании не-
которого вывода, если он применяет традиционную схему программирова-
ния. Сначала он получает список работников и сортирует его по номерам от-
дела и по должности. Далее суммируются число работников и средний
оклад вычисляется по номерам отделов и по должности. Наконец, название
отдела нужно
подставить для номера отдела в выводимой информации. Каж-
дая операция требует циклического чтения записей, сохранения проме-
жуточных результатов, проверки ошибок и т.д.
Напротив, непроцедурный подход SQL позволяет создавать такие отче-
ты, как предыдущий, при помощи указания исполняющей системе только
того, ЧТО необходимо сделать: исполняющая система автоматически гене-
рирует процедуру, определяя КАКИМ
ОБРАЗОМ извлечь данные таблиц.
Клауза HAVING
Ранее были определены условия поиска для индивидуальных строк при
помощи клаузы WHERE; теперь можно использовать клаузу HAVING для
задания условий поиска групп строк. Предположим, что необходимо по-
лучить ответ на запрос, подобный предыдущему, но при условии, что
каждая группа, выводимая по запросу, должна содержать
не менее двух ра-
ботников:
SELECT DNAME,JOB,SUM(SAL),COUNT(*),AVG(SAL) (***)
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
GROUP BY DNAME,JOB
HAVING COUNT(*) >= 2; --- клауза HAVING
                                       - 30 -

  SELECT DNAME,JOB,SUM(SAL), --- функция SUM                (**)
          COUNT(*), --- функция COUNT(*)
          AVG(SAL) --- функция AVG
  FROM EMP,DEPT
  WHERE EMP.DEPTNO = DEPT.DEPTNO
  GROUP BY DNAME, JOB;

   DNAME         JOB        SUM(SАL)     COUNT(*)    АVG(SAL)
ACCOUNTING    CLERC       1,800.00          1       1,300.00
ACCOUNTING    MANAGER     2,450.00          1       2,450.00
ACCOUNTING    PRESIDENT   5,000.00          1       5,000.00
RESEARCH      ANALYST     6,000,00          2       3,000.00
RESEARCH      CLERC       1,900.00          2       950.00
RESEARCH      MANAGER     2,975.00          1       2,975.00
SALES         CLERC       950.00            1       950.00
SALES         MANAGER     2,850.00          1       2,850.00
SALES         SALESMAN    5,600.00          4       1,400.00

     Рассмотрим работу, которую выполняет программист при создании не-
которого вывода, если он применяет традиционную схему программирова-
ния. Сначала он получает список работников и сортирует его по номерам от-
дела и по должности. Далее суммируются число работников и средний
оклад вычисляется по номерам отделов и по должности. Наконец, название
отдела нужно подставить для номера отдела в выводимой информации. Каж-
дая операция требует циклического чтения записей, сохранения проме-
жуточных результатов, проверки ошибок и т.д.
     Напротив, непроцедурный подход SQL позволяет создавать такие отче-
ты, как предыдущий, при помощи указания исполняющей системе только
того, ЧТО необходимо сделать: исполняющая система автоматически гене-
рирует процедуру, определяя КАКИМ ОБРАЗОМ извлечь данные таблиц.

Клауза HAVING

    Ранее были определены условия поиска для индивидуальных строк при
помощи клаузы WHERE; теперь можно использовать клаузу HAVING для
задания условий поиска групп строк. Предположим, что необходимо по-
лучить ответ на запрос, подобный предыдущему, но при условии, что
каждая группа, выводимая по запросу, должна содержать не менее двух ра-
ботников:

  SELECT DNAME,JOB,SUM(SAL),COUNT(*),AVG(SAL)                   (***)
  FROM EMP,DEPT
  WHERE EMP.DEPTNO = DEPT.DEPTNO
  GROUP BY DNAME,JOB
  HAVING COUNT(*) >= 2; --- клауза HAVING