SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
Autor: Nicola Strappazzon C.
                 e-mail: nicola51980@gmail.com




                                                                         4
                 Blog: http://www.swapbytes.com/
                 Revisión: 17/11/11




 Lección
         Usando funciones para
        manipular grupos de datos


Este material se encuentra basado en el curso de Fundamentos a SQL de ORACLE, el cual es adaptado para
el producto PostgreSQL, todos los ejemplos, códigos fuentes y la Base de Datos HR es propiedad de ORACLE.
Objetivos

Al completar esta lección usted podrá entender los
siguientes puntos:
•      Identificar las funciones disponibles.
•      Describir como usar una función de grupo.
•      Agrupar datos mediante la cláusula GROUP BY.
•      Incluir o excluir datos agrupados mediante el uso de la
       cláusula HAVING.




L --
L
?Como trabajan las funciones de grupo?

Las funciones de grupo opera sobre un conjunto de
registros y se retorna un solo resultado por grupo.
   department_id | salary
  ---------------+--------
              80 | 14000
              80 | 13500
              80 | 12000
              80 | 11000
              80 | 10500
              80 | 10000
              80 |   9500
              80 |   9000
                                         max
              80 |   8000               -------
              80 |   7500                24000
              80 |   7000
              80 | 10000                (1 row)
              80 |   9500
              80 |   9000
              80 |   8000            Salario mas alto de
              80 |   7500
              80 |   7000            la tabla employees.
              80 | 10500
  (107 rows)



L --
L
Funciones de grupo
Funciones básicas que realizan operaciones a un
grupo de registros en especifico:
•      AVG
•      COUNT
•      MAX
•      MIN
•      SUM




L --
L
Sintaxis Básica

SELECT   [ column ], group_function(column) [, ...]
FROM     from_item
[WHERE   condition]
[GROUP   BY column]
[ORDER   BY column];




L --
L
Usando las funciones AVG, MAX, MIN y SUM

SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary)
FROM   employees
WHERE department_id = 80;

          avg          | max | min | sum
-----------------------+-------+------+--------
 8955.8823529411764706 | 14000 | 6100 | 304500
(1 row)




L --
L
Usando las funciones MAX y MIN

Puede utilizar las funciones MAX y MIN para los tipos de
datos numéricos, caracteres y fechas.
SELECT MAX(hire_date), MIN(hire_date)
FROM   employees
WHERE department_id = 80;

    max     |    min
------------+------------
 2000-04-21 | 1996-01-30
(1 row)




L --
L
Usando la funciones COUNT
       La función COUNT(*) retorna la cantidad total de registros que
1
       se encuentran en una tabla.
       SELECT COUNT(*)
       FROM   employees;

        count
       -------
          107


       La función COUNT(expr) retorna la cantidad total de registros
2
       NO NULL que se encuentran en una tabla.
       SELECT COUNT(commission_pct)
       FROM   employees;

        count
       -------
           35


L --
L
Usando la palabra DISTINCT

• Usando la palabra DISTINCT se eliminan todos los
  valores duplicados.
• Puede emplear la palabra DISTINCT dentro de cualquier
  función.
• Retorna todo los elementos que NO son del tipo NULL.




L --
L
Usando la palabra DISTINCT
La siguiente consulta cuenta cuantos departamentos
se encuentran asignados en la tabla employees.
SELECT COUNT(DISTINCT department_id)
FROM   employees;

 count
-------
    11
(1 row)




L --
L
Funciones de grupo y valores NULL
       Las funciones de grupo ignoran los valores NULL.
1

        SELECT AVG(commission_pct)
        FROM   employees;

         avg
        ------------------------
         0.22285714285714285714


       La función COALESCE obliga a las funciones de grupo que
2
       incluya los valores de tipo NULL.
        SELECT AVG(COALESCE(commission_pct, 0))
        FROM   employees;

          avg
        ------------------------
         0.07289719626168224299


L --
L
Creando grupo de datos
   department_id | salary
  ---------------+--------
              10 |   4400
              20 | 13000
              20 |   6000
              30 |   3100
              30 | 11000      department_id |          avg
              30 |   2500    ---------------+------------------------
              30 |   2900                10 | 4400.0000000000000000
              40 |   6500
              50 |   2500
                                         20 | 9500.0000000000000000
              50 |   8000                30 | 4150.0000000000000000
              50 |   8200                40 | 6500.0000000000000000
              60 |   6000                50 | 3475.5555555555555556
              60 |   9000                60 | 5760.0000000000000000
              70 | 10000                 70 | 10000.0000000000000000
              80 |   9500                80 | 8955.8823529411764706
              80 |   9000
              80 |   8000
                                         90 |     19333.333333333333
              90 | 24000                100 | 8600.0000000000000000
              90 | 17000                110 | 10150.0000000000000000
              90 | 17000                    | 7000.0000000000000000
             100 |   6900    (12 rows)
             100 |   9000
             100 | 12000
             110 |   8300         Promedio del salario por cada
             110 | 12000
  (107 rows)
                              departamento y por cada empleado del
                                      mismo departamento
L --
L
Sintaxis Básica

SELECT   [ column ], group_function(column) [, ...]
FROM     from_item
[WHERE   condition]
[GROUP   BY column]
[ORDER   BY column];

Permite dividir los registros de una tabla en pequeños
grupos usando la cláusula GROUP BY.
• No puedes utilizar Alias dentro de la cláusula GROUP BY.
• Solo puedes incluir el nombre de la columna dentro de la
  cláusula GROUP BY.
• Si no usas funciones de grupo no podrás apreciar
  resultados individuales.


L --
L
Usando la cláusula GROUP BY
Todas las columnas dentro de la sentencia SELECT no
deben estar en la función de grupo si no en la
clausúrala GROUP BY.
SELECT     department_id, AVG(salary)
FROM       employees
GROUP BY   department_id
ORDER BY   department_id;

 department_id |          avg
---------------+------------------------
            10 | 4400.0000000000000000
            20 | 9500.0000000000000000
            30 | 4150.0000000000000000
            40 | 6500.0000000000000000
            50 | 3475.5555555555555556
            60 | 5760.0000000000000000
(12 rows)


L --
L
Usando la cláusula GROUP BY
Las columnas dentro la cláusula GROUP BY no tienen
que estar dentro de la sentencia SELECT .
SELECT   AVG(salary)
FROM     employees
GROUP BY department_id;

 avg
------------------------
  7000.0000000000000000
 10150.0000000000000000
  8600.0000000000000000
     19333.333333333333
  8955.8823529411764706
 10000.0000000000000000
  5760.0000000000000000
  3475.5555555555555556
  6500.0000000000000000
  4150.0000000000000000
(12 rows)


L --
L
Agrupando por mas de una columna
 department_id |   job_id   | salary
---------------+------------+--------
            10 | AD_ASST    |   4400
            30 | PU_CLERK   |   3100
            30 | PU_CLERK   |   2800
            30 | PU_CLERK   |   2500
            30 | PU_CLERK   |   2600
            30 | PU_CLERK   |   2900     department_id |   job_id   | sum
            50 | SH_CLERK   |   3800    ---------------+------------+--------
            50 | SH_CLERK   |   3000                10 | AD_ASST    |   4400
            50 | SH_CLERK   |   3400                20 | MK_MAN     | 13000
            50 | SH_CLERK   |   4100                20 | MK_REP     |   6000
            50 | SH_CLERK   |   4200                30 | PU_CLERK   | 13900
            50 | SH_CLERK   |   2800                30 | PU_MAN     | 11000
            50 | SH_CLERK   |   2500                40 | HR_REP     |   6500
            60 | IT_PROG    |   9000                50 | SH_CLERK   | 64300
            60 | IT_PROG    |   4200                50 | ST_CLERK   | 55700
            60 | IT_PROG    |   4800                50 | ST_MAN     | 36400
            60 | IT_PROG    |   4800                60 | IT_PROG    | 28800
            60 | IT_PROG    |   6000                70 | PR_REP     | 10000
           100 | FI_ACCOUNT |   7700                80 | SA_MAN     | 61000
           100 | FI_ACCOUNT |   6900    (20 rows)
           100 | FI_ACCOUNT |   9000
           100 | FI_ACCOUNT |   8200
           100 | FI_ACCOUNT |   7800
                                          Promedio del salario por cada
           100 | FI_MGR     | 12000     departamento y por cada empleado
(107 rows)
                                         del mismo cargo y departamento

 L --
 L
Usando la cláusula GROUP BY con múltiples
                columnas
SELECT     department_id, job_id, SUM(salary)
FROM       employees
GROUP BY   department_id, job_id
ORDER BY   department_id;

 department_id |   job_id   | sum
---------------+------------+--------
            10 | AD_ASST    |   4400
            20 | MK_MAN     | 13000
            20 | MK_REP     |   6000
            30 | PU_CLERK   | 13900
            30 | PU_MAN     | 11000
            40 | HR_REP     |   6500
            50 | SH_CLERK   | 64300
            50 | ST_CLERK   | 55700
            50 | ST_MAN     | 36400
            60 | IT_PROG    | 28800
            70 | PR_REP     | 10000
            80 | SA_MAN     | 61000
(20 rows)


L --
L
Consultas mal escritas usando las
              funciones de grupo
Toda columna o expresión que no se encuentra dentro
de una función de grupo, debe estar dentro de la
cláusula GROUP BY.
SELECT department_id, SUM(salary)
FROM   employees;

ERROR: column "employees.department_id" must appear in the GROUP
BY clause or be used in an aggregate function




L --
L
Consultas mal escritas usando las
                funciones de grupo
• No se puede usar condiciones en la cláusula WHERE para
  restringir grupos.
• Use la cláusula HAVING para restringir los grupos.
• No use las funciones de grupo dentro de la cláusula
  WHERE.

SELECT     department_id, job_id, AVG(salary)
FROM       employees
WHERE      AVG(salary) > 1000
GROUP BY   department_id, job_id
ORDER BY   department_id;

ERROR:   aggregates not allowed in WHERE clause




L --
L
Restringiendo el resultado de los grupo con
            la cláusula HAVING
• Filtra por registros agrupados.
• Muestra la coincidencia definida en la cláusula HAVING.

SELECT [ column ], group_function(column) [, ...]
FROM   from_item
[WHERE condition]
[GROUP BY column]
[HAVING condition [, ...]]
[ORDER BY column];




L --
L
Usando la cláusula HAVING

SELECT     department_id, MAX(salary)
FROM       employees
GROUP BY   department_id
HAVING     MAX(salary) > 10000;

 department_id | max
---------------+-------
           110 | 12000
           100 | 12000
            90 | 24000
            80 | 14000
            30 | 11000
            20 | 13000
(6 rows)




L --
L
Usando la cláusula HAVING

SELECT     job_id, SUM(salary) AS "PAYROLL"
FROM       employees
WHERE      job_id NOT LIKE '%REP%'
GROUP BY   job_id
HAVING     SUM(salary) > 13000
ORDER BY   SUM(salary);

   job_id   | PAYROLL
------------+---------
 PU_CLERK   |   13900
 AD_PRES    |   24000
 IT_PROG    |   28800
 AD_VP      |   34000
 ST_MAN     |   36400
 FI_ACCOUNT |   39600
 ST_CLERK   |   55700
 SA_MAN     |   61000
 SH_CLERK   |   64300
(9 rows)



L --
L
Funciones jerárquicas de grupo

No se puede usar las funciones de grupo en modo
jerárquico.

SELECT   MAX(AVG(salary))
FROM     employees
GROUP BY department_id;

ERROR:   aggregate function calls may not be nested




L --
L
Resumen
En esta lección, usted debió entender como:
• Usar las funciones básicas de grupo en SQL.
   – SUM
   – COUNT
   – MAX
   – MIN
   – AVG
• Escribir consultas usando la cláusula GROUP BY.
• Escribir consultas usando la cláusula HAVING.




L --
L

Más contenido relacionado

La actualidad más candente

MySQL Performance Schema in 20 Minutes
 MySQL Performance Schema in 20 Minutes MySQL Performance Schema in 20 Minutes
MySQL Performance Schema in 20 Minutes
Sveta Smirnova
 
MySQL Query And Index Tuning
MySQL Query And Index TuningMySQL Query And Index Tuning
MySQL Query And Index Tuning
Manikanda kumar
 

La actualidad más candente (20)

Sql wksht-6
Sql wksht-6Sql wksht-6
Sql wksht-6
 
MySQL for beginners
MySQL for beginnersMySQL for beginners
MySQL for beginners
 
[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자
[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자
[Pgday.Seoul 2017] 7. PostgreSQL DB Tuning 기업사례 - 송춘자
 
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
 
使ってみよう PowerShell
使ってみよう PowerShell使ってみよう PowerShell
使ってみよう PowerShell
 
Python_ 3 CheatSheet
Python_ 3 CheatSheetPython_ 3 CheatSheet
Python_ 3 CheatSheet
 
Using Optimizer Hints to Improve MySQL Query Performance
Using Optimizer Hints to Improve MySQL Query PerformanceUsing Optimizer Hints to Improve MySQL Query Performance
Using Optimizer Hints to Improve MySQL Query Performance
 
SQL window functions for MySQL
SQL window functions for MySQLSQL window functions for MySQL
SQL window functions for MySQL
 
if-while-for.ppsx
if-while-for.ppsxif-while-for.ppsx
if-while-for.ppsx
 
MySQL Performance Schema in 20 Minutes
 MySQL Performance Schema in 20 Minutes MySQL Performance Schema in 20 Minutes
MySQL Performance Schema in 20 Minutes
 
8 python data structure-1
8 python data structure-18 python data structure-1
8 python data structure-1
 
Optimizing queries MySQL
Optimizing queries MySQLOptimizing queries MySQL
Optimizing queries MySQL
 
SQL JOINS
SQL JOINSSQL JOINS
SQL JOINS
 
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricksQuery Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
 
MySQL Query And Index Tuning
MySQL Query And Index TuningMySQL Query And Index Tuning
MySQL Query And Index Tuning
 
Query Optimization with MySQL 5.6: Old and New Tricks - Percona Live London 2013
Query Optimization with MySQL 5.6: Old and New Tricks - Percona Live London 2013Query Optimization with MySQL 5.6: Old and New Tricks - Percona Live London 2013
Query Optimization with MySQL 5.6: Old and New Tricks - Percona Live London 2013
 
Haskell study 1
Haskell study 1Haskell study 1
Haskell study 1
 
Python.pdf
Python.pdfPython.pdf
Python.pdf
 
Ten Reasons Why You Should Prefer PostgreSQL to MySQL
Ten Reasons Why You Should Prefer PostgreSQL to MySQLTen Reasons Why You Should Prefer PostgreSQL to MySQL
Ten Reasons Why You Should Prefer PostgreSQL to MySQL
 
Vector class in C++
Vector class in C++Vector class in C++
Vector class in C++
 

Similar a PostgreSQL - Lección 4 - Usando funciones para manipular grupos de datos

PostgreSQL - Lección 8 - Manipulando Datos y Transacciones
PostgreSQL - Lección 8 - Manipulando Datos y TransaccionesPostgreSQL - Lección 8 - Manipulando Datos y Transacciones
PostgreSQL - Lección 8 - Manipulando Datos y Transacciones
Nicola Strappazzon C.
 
PostgreSQL - Lección 6 - Subconsultas
PostgreSQL - Lección 6 - SubconsultasPostgreSQL - Lección 6 - Subconsultas
PostgreSQL - Lección 6 - Subconsultas
Nicola Strappazzon C.
 
Ingeniería de Métodos de Trabajo 4/4
Ingeniería de Métodos de Trabajo 4/4Ingeniería de Métodos de Trabajo 4/4
Ingeniería de Métodos de Trabajo 4/4
CEMEX
 
Tabla de-frecuencias-de-una-variable-continua-para-tercer-grado-de-secundaria
Tabla de-frecuencias-de-una-variable-continua-para-tercer-grado-de-secundariaTabla de-frecuencias-de-una-variable-continua-para-tercer-grado-de-secundaria
Tabla de-frecuencias-de-una-variable-continua-para-tercer-grado-de-secundaria
CiriloOlivaresValenc
 
Selección de calibre en cables para construcción
Selección de calibre en cables para construcciónSelección de calibre en cables para construcción
Selección de calibre en cables para construcción
Yilbert Martinez
 
Teorico palabras reservada
Teorico palabras reservadaTeorico palabras reservada
Teorico palabras reservada
malaclau
 

Similar a PostgreSQL - Lección 4 - Usando funciones para manipular grupos de datos (19)

Postgre S Q L 4
Postgre S Q L 4Postgre S Q L 4
Postgre S Q L 4
 
PostgreSQL - Lección 8 - Manipulando Datos y Transacciones
PostgreSQL - Lección 8 - Manipulando Datos y TransaccionesPostgreSQL - Lección 8 - Manipulando Datos y Transacciones
PostgreSQL - Lección 8 - Manipulando Datos y Transacciones
 
PostgreSQL - Lección 6 - Subconsultas
PostgreSQL - Lección 6 - SubconsultasPostgreSQL - Lección 6 - Subconsultas
PostgreSQL - Lección 6 - Subconsultas
 
CONSULTAS BASICAS
CONSULTAS BASICASCONSULTAS BASICAS
CONSULTAS BASICAS
 
Transact+Sql+2005
Transact+Sql+2005Transact+Sql+2005
Transact+Sql+2005
 
Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)
 
Evidencias del aprendizaje
Evidencias del aprendizajeEvidencias del aprendizaje
Evidencias del aprendizaje
 
Ingeniería de Métodos de Trabajo 4/4
Ingeniería de Métodos de Trabajo 4/4Ingeniería de Métodos de Trabajo 4/4
Ingeniería de Métodos de Trabajo 4/4
 
Tabla de-frecuencias-de-una-variable-continua-para-tercer-grado-de-secundaria
Tabla de-frecuencias-de-una-variable-continua-para-tercer-grado-de-secundariaTabla de-frecuencias-de-una-variable-continua-para-tercer-grado-de-secundaria
Tabla de-frecuencias-de-una-variable-continua-para-tercer-grado-de-secundaria
 
Selección de calibre en cables para construcción
Selección de calibre en cables para construcciónSelección de calibre en cables para construcción
Selección de calibre en cables para construcción
 
Funciones numéricas, de fecha y hora en MySQL
Funciones numéricas,  de fecha y hora en MySQLFunciones numéricas,  de fecha y hora en MySQL
Funciones numéricas, de fecha y hora en MySQL
 
Sentencias my sql
Sentencias my sqlSentencias my sql
Sentencias my sql
 
Sql2
Sql2Sql2
Sql2
 
Teorico palabras reservada
Teorico palabras reservadaTeorico palabras reservada
Teorico palabras reservada
 
Sql2
Sql2Sql2
Sql2
 
Consultas en SQL
Consultas en SQLConsultas en SQL
Consultas en SQL
 
Ayudantia 5 RESPUESTAS
Ayudantia 5 RESPUESTASAyudantia 5 RESPUESTAS
Ayudantia 5 RESPUESTAS
 
Punto de equilibro
Punto de equilibro Punto de equilibro
Punto de equilibro
 
Lab5 sql
Lab5 sqlLab5 sql
Lab5 sql
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Último (10)

How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 

PostgreSQL - Lección 4 - Usando funciones para manipular grupos de datos

  • 1. Autor: Nicola Strappazzon C. e-mail: nicola51980@gmail.com 4 Blog: http://www.swapbytes.com/ Revisión: 17/11/11 Lección Usando funciones para manipular grupos de datos Este material se encuentra basado en el curso de Fundamentos a SQL de ORACLE, el cual es adaptado para el producto PostgreSQL, todos los ejemplos, códigos fuentes y la Base de Datos HR es propiedad de ORACLE.
  • 2. Objetivos Al completar esta lección usted podrá entender los siguientes puntos: • Identificar las funciones disponibles. • Describir como usar una función de grupo. • Agrupar datos mediante la cláusula GROUP BY. • Incluir o excluir datos agrupados mediante el uso de la cláusula HAVING. L -- L
  • 3. ?Como trabajan las funciones de grupo? Las funciones de grupo opera sobre un conjunto de registros y se retorna un solo resultado por grupo. department_id | salary ---------------+-------- 80 | 14000 80 | 13500 80 | 12000 80 | 11000 80 | 10500 80 | 10000 80 | 9500 80 | 9000 max 80 | 8000 ------- 80 | 7500 24000 80 | 7000 80 | 10000 (1 row) 80 | 9500 80 | 9000 80 | 8000 Salario mas alto de 80 | 7500 80 | 7000 la tabla employees. 80 | 10500 (107 rows) L -- L
  • 4. Funciones de grupo Funciones básicas que realizan operaciones a un grupo de registros en especifico: • AVG • COUNT • MAX • MIN • SUM L -- L
  • 5. Sintaxis Básica SELECT [ column ], group_function(column) [, ...] FROM from_item [WHERE condition] [GROUP BY column] [ORDER BY column]; L -- L
  • 6. Usando las funciones AVG, MAX, MIN y SUM SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM employees WHERE department_id = 80; avg | max | min | sum -----------------------+-------+------+-------- 8955.8823529411764706 | 14000 | 6100 | 304500 (1 row) L -- L
  • 7. Usando las funciones MAX y MIN Puede utilizar las funciones MAX y MIN para los tipos de datos numéricos, caracteres y fechas. SELECT MAX(hire_date), MIN(hire_date) FROM employees WHERE department_id = 80; max | min ------------+------------ 2000-04-21 | 1996-01-30 (1 row) L -- L
  • 8. Usando la funciones COUNT La función COUNT(*) retorna la cantidad total de registros que 1 se encuentran en una tabla. SELECT COUNT(*) FROM employees; count ------- 107 La función COUNT(expr) retorna la cantidad total de registros 2 NO NULL que se encuentran en una tabla. SELECT COUNT(commission_pct) FROM employees; count ------- 35 L -- L
  • 9. Usando la palabra DISTINCT • Usando la palabra DISTINCT se eliminan todos los valores duplicados. • Puede emplear la palabra DISTINCT dentro de cualquier función. • Retorna todo los elementos que NO son del tipo NULL. L -- L
  • 10. Usando la palabra DISTINCT La siguiente consulta cuenta cuantos departamentos se encuentran asignados en la tabla employees. SELECT COUNT(DISTINCT department_id) FROM employees; count ------- 11 (1 row) L -- L
  • 11. Funciones de grupo y valores NULL Las funciones de grupo ignoran los valores NULL. 1 SELECT AVG(commission_pct) FROM employees; avg ------------------------ 0.22285714285714285714 La función COALESCE obliga a las funciones de grupo que 2 incluya los valores de tipo NULL. SELECT AVG(COALESCE(commission_pct, 0)) FROM employees; avg ------------------------ 0.07289719626168224299 L -- L
  • 12. Creando grupo de datos department_id | salary ---------------+-------- 10 | 4400 20 | 13000 20 | 6000 30 | 3100 30 | 11000 department_id | avg 30 | 2500 ---------------+------------------------ 30 | 2900 10 | 4400.0000000000000000 40 | 6500 50 | 2500 20 | 9500.0000000000000000 50 | 8000 30 | 4150.0000000000000000 50 | 8200 40 | 6500.0000000000000000 60 | 6000 50 | 3475.5555555555555556 60 | 9000 60 | 5760.0000000000000000 70 | 10000 70 | 10000.0000000000000000 80 | 9500 80 | 8955.8823529411764706 80 | 9000 80 | 8000 90 | 19333.333333333333 90 | 24000 100 | 8600.0000000000000000 90 | 17000 110 | 10150.0000000000000000 90 | 17000 | 7000.0000000000000000 100 | 6900 (12 rows) 100 | 9000 100 | 12000 110 | 8300 Promedio del salario por cada 110 | 12000 (107 rows) departamento y por cada empleado del mismo departamento L -- L
  • 13. Sintaxis Básica SELECT [ column ], group_function(column) [, ...] FROM from_item [WHERE condition] [GROUP BY column] [ORDER BY column]; Permite dividir los registros de una tabla en pequeños grupos usando la cláusula GROUP BY. • No puedes utilizar Alias dentro de la cláusula GROUP BY. • Solo puedes incluir el nombre de la columna dentro de la cláusula GROUP BY. • Si no usas funciones de grupo no podrás apreciar resultados individuales. L -- L
  • 14. Usando la cláusula GROUP BY Todas las columnas dentro de la sentencia SELECT no deben estar en la función de grupo si no en la clausúrala GROUP BY. SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ORDER BY department_id; department_id | avg ---------------+------------------------ 10 | 4400.0000000000000000 20 | 9500.0000000000000000 30 | 4150.0000000000000000 40 | 6500.0000000000000000 50 | 3475.5555555555555556 60 | 5760.0000000000000000 (12 rows) L -- L
  • 15. Usando la cláusula GROUP BY Las columnas dentro la cláusula GROUP BY no tienen que estar dentro de la sentencia SELECT . SELECT AVG(salary) FROM employees GROUP BY department_id; avg ------------------------ 7000.0000000000000000 10150.0000000000000000 8600.0000000000000000 19333.333333333333 8955.8823529411764706 10000.0000000000000000 5760.0000000000000000 3475.5555555555555556 6500.0000000000000000 4150.0000000000000000 (12 rows) L -- L
  • 16. Agrupando por mas de una columna department_id | job_id | salary ---------------+------------+-------- 10 | AD_ASST | 4400 30 | PU_CLERK | 3100 30 | PU_CLERK | 2800 30 | PU_CLERK | 2500 30 | PU_CLERK | 2600 30 | PU_CLERK | 2900 department_id | job_id | sum 50 | SH_CLERK | 3800 ---------------+------------+-------- 50 | SH_CLERK | 3000 10 | AD_ASST | 4400 50 | SH_CLERK | 3400 20 | MK_MAN | 13000 50 | SH_CLERK | 4100 20 | MK_REP | 6000 50 | SH_CLERK | 4200 30 | PU_CLERK | 13900 50 | SH_CLERK | 2800 30 | PU_MAN | 11000 50 | SH_CLERK | 2500 40 | HR_REP | 6500 60 | IT_PROG | 9000 50 | SH_CLERK | 64300 60 | IT_PROG | 4200 50 | ST_CLERK | 55700 60 | IT_PROG | 4800 50 | ST_MAN | 36400 60 | IT_PROG | 4800 60 | IT_PROG | 28800 60 | IT_PROG | 6000 70 | PR_REP | 10000 100 | FI_ACCOUNT | 7700 80 | SA_MAN | 61000 100 | FI_ACCOUNT | 6900 (20 rows) 100 | FI_ACCOUNT | 9000 100 | FI_ACCOUNT | 8200 100 | FI_ACCOUNT | 7800 Promedio del salario por cada 100 | FI_MGR | 12000 departamento y por cada empleado (107 rows) del mismo cargo y departamento L -- L
  • 17. Usando la cláusula GROUP BY con múltiples columnas SELECT department_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id ORDER BY department_id; department_id | job_id | sum ---------------+------------+-------- 10 | AD_ASST | 4400 20 | MK_MAN | 13000 20 | MK_REP | 6000 30 | PU_CLERK | 13900 30 | PU_MAN | 11000 40 | HR_REP | 6500 50 | SH_CLERK | 64300 50 | ST_CLERK | 55700 50 | ST_MAN | 36400 60 | IT_PROG | 28800 70 | PR_REP | 10000 80 | SA_MAN | 61000 (20 rows) L -- L
  • 18. Consultas mal escritas usando las funciones de grupo Toda columna o expresión que no se encuentra dentro de una función de grupo, debe estar dentro de la cláusula GROUP BY. SELECT department_id, SUM(salary) FROM employees; ERROR: column "employees.department_id" must appear in the GROUP BY clause or be used in an aggregate function L -- L
  • 19. Consultas mal escritas usando las funciones de grupo • No se puede usar condiciones en la cláusula WHERE para restringir grupos. • Use la cláusula HAVING para restringir los grupos. • No use las funciones de grupo dentro de la cláusula WHERE. SELECT department_id, job_id, AVG(salary) FROM employees WHERE AVG(salary) > 1000 GROUP BY department_id, job_id ORDER BY department_id; ERROR: aggregates not allowed in WHERE clause L -- L
  • 20. Restringiendo el resultado de los grupo con la cláusula HAVING • Filtra por registros agrupados. • Muestra la coincidencia definida en la cláusula HAVING. SELECT [ column ], group_function(column) [, ...] FROM from_item [WHERE condition] [GROUP BY column] [HAVING condition [, ...]] [ORDER BY column]; L -- L
  • 21. Usando la cláusula HAVING SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary) > 10000; department_id | max ---------------+------- 110 | 12000 100 | 12000 90 | 24000 80 | 14000 30 | 11000 20 | 13000 (6 rows) L -- L
  • 22. Usando la cláusula HAVING SELECT job_id, SUM(salary) AS "PAYROLL" FROM employees WHERE job_id NOT LIKE '%REP%' GROUP BY job_id HAVING SUM(salary) > 13000 ORDER BY SUM(salary); job_id | PAYROLL ------------+--------- PU_CLERK | 13900 AD_PRES | 24000 IT_PROG | 28800 AD_VP | 34000 ST_MAN | 36400 FI_ACCOUNT | 39600 ST_CLERK | 55700 SA_MAN | 61000 SH_CLERK | 64300 (9 rows) L -- L
  • 23. Funciones jerárquicas de grupo No se puede usar las funciones de grupo en modo jerárquico. SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id; ERROR: aggregate function calls may not be nested L -- L
  • 24. Resumen En esta lección, usted debió entender como: • Usar las funciones básicas de grupo en SQL. – SUM – COUNT – MAX – MIN – AVG • Escribir consultas usando la cláusula GROUP BY. • Escribir consultas usando la cláusula HAVING. L -- L