You are on page 1of 32

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

Clusula GROUP BY y HAVING Declaracin de SELECT :


Sintaxis

SELECT
FROM

column, group_function
table

[WHERE
[GROUP BY
[HAVING
[ORDER BY

condition]
group_by_expression]
group_condition]
column];

Las funciones de grupo operan sobre conjuntos de filas para dar un


resultado por cada grupo
Las funciones de grupo pueden utilizarse tanto en la sentencia SELECT como
en la sentencia HAVING.
GROUP BY divide filas en los grupos ms pequeos.
HAVING restringe el resultado (condicin)
SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

Funciones de Grupo
AVG (DISTINCT | ALL|n)

Valor promedio de n, ignorando valores nulos

COUNT (DISTINCT |ALL| expr|*)

N de filas. Con * cuenta todas, incluyendo nulos

MAX (DISTINCT | ALL| expr)

Mximo valor de la expresin

MIN (DISTINCT | ALL | expr)

Mnimo valor de la expresin

STDDEV (DISTINCT | ALL|n)

Desviacin estndar (ignora nulos)

SUM (DISTINCT | ALL|n)

Suma valores. Ignora nulos

VARIANCE (DISTINCT | ALL|n)

Varianza. Ignora nulos

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

Funciones de GROUP : Ejemplo


Se puede usar AVG y SUM con columnas que guardan datos numricos exclusivamente.
SQL> SELECT
2
3 FROM
4 WHERE

AVG(salario), MAX(salario),
MIN(salario), SUM(salario)
p_personal
UPPER(cargo) LIKE %AUXILIAR%';

MAX y MIN pueden utilizarse para cualquier tipo de dato.


SQL> SELECT MIN(apellido), MAX(apellido)
2 FROM
p_personal;

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

Funcin COUNT : Ejemplos


COUNT (*) retorna el nmero de filas en una tabla.
SQL> SELECT COUNT(*)
2 FROM
p_personal
3 WHERE
id_departamento = 3;

COUNT(expr) retorna el nmero de filas no-nulas.


SQL> SELECT COUNT(costoxhora)
2 FROM
p_personal
3 WHERE
id_departamento = 3;

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

La clusula GROUP BY : Sintaxis

SELECT
FROM
[WHERE
[GROUP BY
[ORDER BY

column, group_function
table
condition]
group_by_expression]
column];

Divide filas en una tabla en los grupos ms pequeos


usando la clusula GROUP BY.
La misma lista de columnas que se utilizan en la clusula
SELECT, deben ser utilizadas en la clusula GROUP BY
Defina el orden predefinido usando ORDER BY.
SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

Sin la clusula GROUP BY


SQL> SELECT id, apellido, id_departamento DEPARTMENTO
2
3

FROM
WHERE

p_personal
id_departamento = 4;

ID APELLIDO DEPARTMENTO
-- --------- ---------4 ROJAS
4
5 MOLAS

6 GONZALEZ

SNPP - San Lorenzo

El Departamento 4 se
despliega tres veces
porque aparece como el
nmero de Departamento
de tres empleados.

Oracle - Inst. Zulma Argello

Con la clusula GROUP BY


SQL> SELECT
2 FROM
3
4

id_departamento, COUNT(*) Numero


p_personal

WHERE
id_departamento = 4
GROUP BY id_departamento;

DEPT_ID Number
------- -----4
3

SNPP - San Lorenzo

Group By: despliega una


lnea de datos para cada
seccin recuperada por la
clusula WHERE, y COUNT
(*) despliega el nmero de
empleados en cada seccin
(grupo).
Oracle - Inst. Zulma Argello

GROUP BY : Ejemplos
Despliegue las posibles clasificaciones de crdito de los clientes,
y la cantidad de clientes en cada clasificacin
SQL> SELECT califica_credito, COUNT(*) "# Clientes"
2 FROM
p_cliente
3 GROUP BY
califica_credito;

Determine todos los cargos existentes, y la suma de salarios


de cada uno de dichos cargos
SQL> SELECT
2 FROM
3 WHERE
4
5

cargo, SUM(salario) "Salarios por cargo"


p_personal
cargo NOT LIKE 'VP%'

GROUP BY cargo
ORDER BY SUM(salario);

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

Desplegando Grupos especficos usando


la clusula HAVING

SQL>
SQL>
2
3
4
5

COLUMN
SELECT
COUNT(*)
FROM
GROUP BY
HAVING

SALARIO ANUAL FORMAT $99,999.99


cargo, 12 * AVG(salario) SALARIO ANUAL,
NUMERO DE EMPLEADOS
La clusula HAVING
p_personal
condiciona los grupos
cargo
COUNT(*) > 2;

CARGO
SALARIO ANUAL NUMERO DE EMPLEADOS
-------------------- --------------- ------------------Representante de Venta
$17,712.00
5
Gerente de Deposito
$11,388.00
10
Warehouse Manager
$14,776.80
5

SNPP - San Lorenzo

Slo se despliegan
aquellos cargos para
los cuales hay ms
de dos empleados
Oracle - Inst. Zulma Argello

10

La clusula HAVING : Sintaxis


SELECT
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY

column, group_function
table
condition]
group_by_expression]
group_condition]
column];

Use la clusula HAVING para restringir grupos.

Paso 1: Se agrupan filas.


Paso 2: Se aplica la funcin de grupo.
Paso 3: Se despliegan los grupos que cumplen con la
condicin del HAVING.
SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

11

Errores que no deben cometerse:


Todas las columnas citadas en el SELECT que
sean parte de la funcin agregada DEBEN estar
en la clusula GROUP BY, pues de lo contrario,
dar un mensaje de error
La clusula WHERE no puede utilizarse para
condicionar grupos.

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

12

SUBQUERIES

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

13

LAS SUBCONSULTAS

Una Subconsulta (subquery) es una sentencia SELECT embebida en otra


sentencia SQL.
Son muy tiles cuando se trata de seleccionar filas de una tabla con una
condicin que depende de la tabla en s.
Se puede usar subqueries en SQL con las clusulas:
WHERE (QUERY ANIDADO)
HAVING
FROM (INLINE VIEWS)
FROM (para seleccionar las filas en un sentencia CREATE o INSERT)

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

14

Formato del Sub query


Query
Principal

SELECT Syntax

SELECT...
FROM...
WHERE...

Subquery
Sintaxis de otro SELECT

(SELECT...
FROM...
WHERE...);

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

15

Ejemplo de la subconsulta: Seleccionar los empleados que tienen


el mismo ttulo que tiene Coronel
Servidor

P_PERSONAL

P_PERSONAL
APELLIDO CARGO
--------- ----------Maduro
Analista
Smith
Analista
Nozaki
Analista
Patel
Analista
Newman
Analista
Chang
Analista
Patel
Analista
Dancs
Analista
Schwartz
Analista
SNPP - San Lorenzo

CARGO
APELLIDO
----------- --------Analista
Coronel

Oracle - Inst. Zulma Argello

16

Ejemplo de la subconsulta

SELECT apellido, cargo


FROM p_personal
WHERE (cargo) =
(SELECT cargo
FROM p_personal
WHERE apellido = ' CORONEL')

Seleccionar los empleados que tienen el mismo ttulo que Coronel


SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

17

SINTAXIS DE LAS SUB CONSULTAS


SELECT
FROM
WHERE

lista de columnas
tabla
expresin Operador
(SELECT
lista de columnas
FROM
tabla);

El subquery se ejecuta una vez antes del Query


principal.
El resultado del subquery es usado por el Query
exterior principal.
SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

18

Indicaciones para los subqueries:


La subconsulta debe aparecer entre parntesis
Se
pueden
utilizar
subconsultas
con
operadores de comparasin de una sola fila (
>, =, >=, <, <>, <= ) y de MLTIPLES FILAS
( IN, NOT IN).
La subconsulta debe aparecer en el lado
derecho del operador
NO PUEDEN TENER la clusula ORDER BY.

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

19

Cmo se procesan las consultas


anidadas?
1.
2.

La declaracin SELECT anidada se ejecuta primero.


El resultado se pasa en la condicin de pregunta principal.

Query anidado

Query Principal

SELECT id_departamento
FROM
p_personal
WHERE apellido=Coronel;

SNPP - San Lorenzo

SELECT apellido, cargo


FROM
p_personal
WHERE id_departamento
=

Oracle - Inst. Zulma Argello

20

Consultas de una sola fila


SELECT
FROM
WHERE

apellido, cargo
p_personal
cargo =

SELECT

cargo

FROM
WHERE

p_personal
apellido = Coronel

SQL> SELECT
apellido, cargo
2 FROM
p_personal
3 WHERE
cargo =
4
(SELECT
cargo
5
FROM
p_personal
6
WHERE
apellido = Coronel);

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

Escriba la declaracin
de SQL para desplegar
el apellido y el cargo de
un empleado.

Escriba la declaracin
de SQL para averiguar
el cargo de Coronel.

Ponga ambas
declaraciones
y deje que el SQL
determinar el cargo para
Coronel

21

Utilizacin de funciones de grupo en una


subconsulta
Servidor

APELLIDO
---------Urguhart
Menchu
Biri
Smith
Nozaki
Patel
Newman
Markarian
Chang
Patel
Dancs
Schwartz
SNPP - San Lorenzo

CARGO
SALARIO
SALARIO
-----------------------------Encargado
1200
2500
Encargado
1250
1450
Encargado
1100
1400
Analista
940
1580
Analista
1200 AVG(SALARIO)
1550
----------Analista
795
1200
1255.08
Analista
750
1250
Analista
850
1100
Analista
800
1300
Analista
795
1307
Analista
860
1400
Analista
1100
...
Oracle - Inst. Zulma Argello

22

Ejemplo de la utilizacin de funciones de


grupo en la subconsulta

Despliegue el ltimo nombre, ttulo de su funcin en la


empresa, y sueldo para todos los empleados que ganan
menos que el promedio de sueldos de todos los empleados.
SQL> SELECT
2 FROM
3 WHERE
4
5

apellido, cargo, salario


P_PERSONAL
salario <
(SELECT
AVG(salario)
FROM p_personal);

La funcin de grupo AVG retorna un nico valor

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

23

Errores con Subqueries


Si se escribe un subquery que devuelve ms de una fila y se usa un operador
de comparacin de fila, la sentencia dar error.
SQL> SELECT
apellido, nombre, cargo
2 FROM
p_personal
3 WHERE
id_departamento =
4
(SELECT ID
5
FROM s_departamento
6
WHERE descripcion = COMERCIAL'
7
OR id_localidad = 2);
ORA-01427:single-row subquery returns more
than one row

Para corregir el error, cambie al operador de la comparacin a IN, un


operador de la fila mltiple.

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

24

Ejemplo de subconsultas que


retornan mltiples filas
Un subquery de filas mltiples devuelve ms de 1 fila.
Usted debe usar a un operador de la fila mltiple en la
clusula WHERE, por ejemplo el operador IN.
SQL> SELECT
2 FROM
3 WHERE
4
5
6
7

SNPP - San Lorenzo

apellido, nombre, cargo


p_personal
id_departamento IN
(SELECT ID
FROM
s_departamento
WHERE descripcion = Comercial
OR id_localidad = 2);

Oracle - Inst. Zulma Argello

25

Utilizacin de clusula HAVING en una


SUBCONSULTA

Tambin se puede utilizar una subconsulta en la clusula


HAVING

Siempre se ejecuta primeramente la SUBCONSULTA y retorna


el resultado a la clusula HAVING de la consulta principal
SQL>
2
3
4
5
6
7

SNPP - San Lorenzo

SELECT
FROM
GROUP BY
HAVING

id_departamento, AVG(salario)
p_personal
id_departamento
AVG(salario) >
(SELECT AVG(salario)
FROM
p_personal
WHERE
id_departamento = 3);

Oracle - Inst. Zulma Argello

26

Subqueries con mltiples columnas


Se pueden comparar ms de una columna, para ello la sintaxis es la siguiente:

SELECT columna, columna, ...


FROM tabla
WHERE (columna, columna, ...) IN
(SELECT columna, columna, ...
FROM tabla
WHERE condicin)

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

27

El operador EXISTS
El operador EXISTS verifica la existencia de filas en el conjunto
resultante del subquery
Si se encuentra la fila, la bsqueda ya no contina y se retorna
TRUE.
Ejemplo: Seleccionar todos los empleados que tienen al menos un
empleado que depende de l:

SELECT ID, NOMBRE FROM P_PERSONAL A


WHERE EXISTS (SELECT 'X'
FROM P_PERSONAL
WHERE ID_SUPERIOR = A.ID)
/
SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

28

INLINE VIEWS (Vistas Inlines)


Un sub query en la clusula FROM es llamada vista inline, ya que el sub
query representa virtualmente una vista.

SELECT lista_de_campos

FROM <subconsulta>;
SELECT dpto, total_salario
FROM
(SELECT id_departamento dpto, SUM(salario) TOTAL_SALARIO
FROM P_PERSONAL
GROUP BY id_departamento) EMP
/
SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

29

QUERIES JERRQUICOS
Si la tabla contiene datos organizados jerrquicamente,
es posible recuperar los datos en orden jerrquico
utilizando la clusula jerrquica:
START WITH <condicin>
CONNECT BY <condicin>

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

30

La clusula jerrquica
Permite listar los datos reflejando la ramificacin de los
datos cuando stos estn estructurados en orden
jerrquico
El primer elemento de una jerarqua se llama nodo raz.
Las ramificaciones son nodos, y el ltimo elemento de
una ramificacin es la hoja.
La clusula START WITH especifica la fila raz de la
jerarqua
La clusula CONNECT BY es la que permite fijar la
relacin de dependencia entre las filas padres y las filas
hijas dentro de la jerarqua
PRIOR se refiere a la fila padre

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

31

Ejemplo
SELECT LPAD(' ', 5*(LEVEL-1))||hijo Descendencia
FROM familia
CONNECT BY PRIOR hijo = padre
START WITH hijo = 'ADAN'
/
HIJO

PADRE

ADAN

--

CAIN

ADAN

ENOC

CAIN

MEHUJAEL

ENOC

LAMEC

ENOC

SNPP - San Lorenzo

Oracle - Inst. Zulma Argello

32

You might also like