Sei sulla pagina 1di 9

II73 – Sistemas de Información Inteligentes

Práctica 1
Repaso de SQL

Práctica 1 – Repaso de SQL

Contenido
Funciones de agregación de columnas
GROUP BY y HAVING
CASE
Join externo y función COALESCE
ORDER BY
Descripción de la base de datos de prácticas

2 II73 – Sistemas de Información Inteligentes


Práctica 1 – Repaso de SQL

Base de datos de facturas

clientes( codcli, nombre, direccion, codpostal )

articulos( codart, descrip, precio, stock )

facturas( codfac, fecha, codcli, iva, dto )

lineas_fac( codfac, linea, cant, codart, precio )

clave primaria

clave externa

3 II73 – Sistemas de Información Inteligentes

Práctica 1 – Repaso de SQL

Ejecución de consultas SQL


SELECT c.nombre, count(distinct codfac)
FROM clientes c JOIN facturas f ON c.codcli = f.codcli
WHERE f.iva = 15
GROUP BY c.codcli, c.nombre
HAVING count(distinct codfac) > 3
ORDER BY 2;

1. from (joins)
2. where
3. group by
4. having
5. select
6. order by

4 II73 – Sistemas de Información Inteligentes


Práctica 1 – Repaso de SQL

Funciones de agregación
Número de facturas del cliente 9 con descuento no nulo...
SELECT COUNT(dto)
FROM facturas TABLA FACTURAS
CODFAC FECHA CODCLI IVA DTO
WHERE codcli = 9;
5 03/11/01 9 16 20
15 14/02/01 9 16 15
21 16/05/01 5 16 12
7 21/08/01 9 7 null
32 01/01/01 14 7 12
COUNT(dto) 19 05/12/01 9 0 15
3

COUNT no considera los nulos

5 II73 – Sistemas de Información Inteligentes

Práctica 1 – Repaso de SQL

Funciones de agregación
Número de facturas del cliente 9 con
descuento diferente...
TABLA FACTURAS
SELECT COUNT(DISTINCT dto)
CODFAC FECHA CODCLI IVA DTO
FROM facturas
5 03/11/01 9 16 20
WHERE codcli = 9; 15 14/02/01 9 16 15
21 16/05/01 5 16 12
7 21/08/01 9 7 null
32 01/01/01 14 7 12
19 05/12/01 9 0 15
COUNT(DISTINCT dto)
2

Hay dos posibles valores para dto, el


nulo no se considera.

6 II73 – Sistemas de Información Inteligentes


Práctica 1 – Repaso de SQL

Funciones de agregación
Número de facturas del cliente 9 ...
SELECT COUNT(*)
TABLA FACTURAS
FROM facturas
CODFAC FECHA CODCLI IVA DTO
WHERE codcli = 9;
5 03/11/01 9 16 20
15 14/02/01 9 16 15
21 16/05/01 5 16 12
7 21/08/01 9 7 null
32 01/01/01 14 7 12
19 05/12/01 9 0 15
COUNT(*)
4

COUNT(*) cuenta las filas seleccionadas y


equivale a COUNT(codfac) porque codfac es
clave primaria

7 II73 – Sistemas de Información Inteligentes

Práctica 1 – Repaso de SQL

Funciones de agregación

COUNT : Número de valores de una columna


AVG : Media de los valores de una columna
SUM : Suma de los valores de una columna
MAX : Máximo de los valores de una columna
MIN : Mínimo de los valores de una columna
STDDEV : Desviación típica de los valores de una columna
VARIANCE : Varianza de los valores de una columna

8 II73 – Sistemas de Información Inteligentes


Práctica 1 – Repaso de SQL

GROUP BY

• Las funciones de agregación no pueden aparecer en el WHERE.


• Las funciones de agregación en el SELECT devuelven un solo valor,
por lo que no se pueden recuperar junto con otras columnas.
• Sin embargo, cuando el SELECT se utiliza junto con un GROUP BY,
las funciones de agregación devuelven tantos valores como grupos se
formen, por lo que se pueden recuperar junto con alguna de las
columnas del GROUP BY.

9 II73 – Sistemas de Información Inteligentes

Práctica 1 – Repaso de SQL

GROUP BY y HAVING

TABLA FACTURAS
SELECT codcli, COUNT(*)
CODFAC FECHA CODCLI IVA DTO
FROM facturas 5 03/11/01 9 16 20
WHERE iva >= 7 15 14/02/01 5 16 15
GROUP BY codcli 21 16/05/01 5 16 12

HAVING AVG(iva) >= 16; 7 21/08/01 9 7 NULL

codcli COUNT(*)
( 16 + 7 ) / 2 = 11,5 NO
5 2
( 16 + 16 ) / 2 = 16 SI

10 II73 – Sistemas de Información Inteligentes


Práctica 1 – Repaso de SQL

GROUP BY y HAVING

• En el SELECT y en el HAVING solamente se pueden


poner las columnas que aparecen en el GROUP BY, y
funciones de agregación sobre el resto de columnas
de la tabla.
SELECT codcli, iva SELECT codcli, AVG(iva)
FROM facturas MAL!!! FROM facturas BIEN!!!
WHERE iva >= 7 WHERE iva >= 7
GROUP BY codcli GROUP BY codcli
HAVING AVG(iva)>= 16; HAVING AVG(iva)>= 16;

11 II73 – Sistemas de Información Inteligentes

Práctica 1 – Repaso de SQL

GROUP BY y HAVING

Número de facturas del cliente con menos facturas ...


SELECT min( count(*) )
FROM facturas TABLA FACTURAS
GROUP BY codcli; CODFAC FECHA CODCLI IVA DTO
15 14/02/01 5 16 15
21 16/05/01 5 16 12
7 21/08/01 9 7
codcli COUNT(*) 5 03/11/01 9 16 20
MIN( COUNT(*) )
5 2
19 05/12/01 9 0 15
1 9 3
14 1 32 01/01/01 14 12

12 II73 – Sistemas de Información Inteligentes


Práctica 1 – Repaso de SQL

CASE
CASE WHEN expresión1 THEN ret1
WHEN expresión2 THEN ret2

[ELSE retN]
END

SELECT codfac,
CASE WHEN iva = 16 THEN ‘normal’
WHEN iva = 7 THEN ‘reducido’
ELSE ‘otros’
END
FROM facturas
WHERE fecha > to_date(’01-ABR-2002’, ‘DD-MON-YYYY);

Nota:
La expresión estándar CASE es más general que la función específica de Oracle DECODE()

13 II73 – Sistemas de Información Inteligentes

Práctica 1 – Repaso de SQL

Join externo y función COALESCE


SELECT a.codart codigo,
a.descrip descripcion,
COALESCE( l.cant, 0 ) cant_media
FROM articulos a LEFT JOIN lineas_fac l ON a.codart = l.codart
WHERE a.precio > 100
ORDER BY 1 ASC, 3 DESC;

Nota:
La función estándar COALESCE() es más general que la función específica de Oracle NVL()

14 II73 – Sistemas de Información Inteligentes


Práctica 1 – Repaso de SQL

Descripción de la BD de prácticas

1,n 1,1
DEPARTMENT belongs_to EMPLOYEE

1,n 1,n

buys_glasses buys_tools

1,1 1,1

GLASSES EMP_TOOLS

15 II73 – Sistemas de Información Inteligentes

Práctica 1 – Repaso de SQL

Descripción de la BD
create table department
(department varchar2(4) primary key,
department_name varchar2(20));

create table employee


(payroll_number number(4) primary key,
last_name varchar2(15),
first_name varchar2(15),
absences number(2),
wages number(8,2),
street varchar2(20),
city varchar2(15),
state char(2),
phone char(13),
social_security_number char(11),
employment_date date,
birth_date date,
current_position varchar2(15),
fk_department varchar2(4),
gender char(1),
foreign key (fk_department) references department (department));

16 II73 – Sistemas de Información Inteligentes


Práctica 1 – Repaso de SQL

Descripción de la BD
create table glasses
(fk_payroll_number number(4),
purchase_date date,
optician varchar2(20),
cost number(5,2),
check_number varchar2(10),
primary key (fk_payroll_number, purchase_date),
foreign key (fk_payroll_number) references employee on delete cascade);

create table emp_tools


(fk_payroll_number number(4),
purchase_date date,
payroll_deduct char(1) check (payroll_deduct in ('Y', 'N')),
tool_name varchar2(15),
tool_cost number(5,2),
payment_amount number(5,2),
last_payment_amount number(5,2),
first_payment_date date,
last_payment_date date,
primary key (fk_payroll_number, purchase_date, tool_name),
foreign key (fk_payroll_number) references employee on delete cascade);

17 II73 – Sistemas de Información Inteligentes

Potrebbero piacerti anche