Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Relacionales
Consultas y Operadores de
Algebra Relacional
Agenda
3 Problemas
Introducción AR I
Introducción AR II
Agenda
3 Problemas
Los siguientes son los operadores de algebra relacional básicos para realizar
consultas:
Proyección (π)
Selección (σ)
Renombrar (ρ)
Eliminar Duplicados (δ)
Producto cartesiano (×)
Join o enlace o reunión (o
n)
Ejemplos
Las siguientes son expresiones en Algebra Relacional para realizar
consultas:
πa1,b1 (R1 o
n R2)
πa1,b1,c1 (R1 o
n R2 o
n R3 )
πR1.a1,R2.b2 ( σR2.b2>15R1.a1=”Ana” (R1 × R2))
León, Gómez, Rodrı́guez, Cubides & Sierra Programación de Computadores – UN
Operadores AR y SQL para consultas Bases de Datos Relacionales –7–
Proyección I
Proyección II
Ejemplo (continuación)
LIBRO
libId libNombre libPub
1001 Cien años de soledad 1967
1002 La vorágine 1924
1003 Marı́a 1867
1004 Cóndores no se entierran todos los dı́as 1971
Cien años de soledad, 1967
La vor ágine, 1924
πlibNombre,libPub (LIBRO) =
Marı́a, 1867
C óndores no se entierran todos los dı́as, 1971
Proyección en SQL I
Sintaxis
πa1,a2,a3,...,an (R)
SELECT a1 , a2 , a3 , . . . , an FROM R
Proyección en SQL II
Ejemplos
Ejemplos
−− S e l e c c i o n a e l t ı́ t u l o de l o s libros
SELECT libNombre FROM libro ;
−− S e l e c c i o n a l o s nombres y a p e l l i d o s de l o s a u t o r e s
SELECT autNombre , autApellido FROM autor ;
−− S e l e c c i o n a t o d o s l o s a t r i b u t o s de l o s a u t o r e s
∗ FROM autor ;
SELECT
Para los ejemplos cargar el script de creación e inserción de datos de la
Librerı́a libreria.sql
Selección I
Ejemplo
LIBRO
libId libNombre libPub
1001 Cien años de soledad 1967
1002 La vorágine 1924
1003 Marı́a 1867
1004 Cóndores no se entierran todos los dı́as 1971
σlibId=1003 (LIBRO) = 1003, Marı́a, 1867
σlibPub>1960 (LIBRO) =?
Selección en SQL I
Sintaxis
?
SELECT ∗ FROM R WHERE condici ón
Selección en SQL II
Ejemplos
Ejemplos
−− CONDICIONES NUMERICAS
−− S e l e c c i o n a t o d o s l o s a t r i b u t o s d e l l i b r o con i d e n t i f i c a d o r 1003
SELECT ∗ FROM libro WHERE libId =1003;
−− S e l e c c i o n a t o d o s l o s a t r i b u t o s de l o s l i b r o s que f u e r o n p u b l i c a d o s d e s p u e s de 1960
∗ FROM libro WHERE libPub > 1 9 6 0 ;
SELECT
−− CONDICIONES CON CADENAS DE CARACTERES
−− E l o p e r a d o r má s u s a d o e s LIKE
−− S e l e c c i o n a t o d o s l o s a t r i b u t o s de l o s l i b r o s que c o n t i n e n l a c a d e n a ” l o s ” .
SELECT ∗ FROM libro WHERE libNombre LIKE ”%l o s%” ;
Selección en SQL IV
Ejemplos
Ejemplos
SELECT ∗ FROM libro WHERE LENGHT ( libNombre ) > 8 ;
Composición (π y σ)
En una consulta se pueden combinar los operadores de selección (σ) y
proyección (π). Se seleccionan las tuplas que cumplen una condición y
luego se proyectan solo las atributos deseados.
Ejemplo
En este ejemplo se seleccionan las tuplas que cumplen la condición
libPub > 1960 y luego se proyectan las columnas de nombre y año de
publicación.
LIBRO
libId libNombre libPub
1001 Cien años de soledad 1967
1002 La vorágine 1924
1003 Marı́a 1867
1004 Cóndores no se entierran todos los dı́as 1971
Cien años de soledad, 1967
πlibNombre,libPub ( σlibPub>1960 (LIBRO) ) =
C óndores no se entierran todos los dı́as, 1971
Composición (π y σ) en SQL I
?
SELECT a1 , a2 , . . . , an FROM R WHERE condici ón
Composición (π y σ) en SQL II
Ejemplos
Ejemplos
−− S e l e c c i o n a e l nombre d e l l i b r o con i d e n t i f i c a d o r 1003
SELECT libNombre FROM libro WHERE libId =1003;
−− S e l e c c i o n a e l nombre de l o s l i b r o s que c o n t i n e n l a c a d e n a ” l o s ” .
SELECT libNombre FROM libro WHERE libNombre LIKE ”%l o s%” ;
Otras consultas
MySQL
Las columnas numéricas se pueden usar para ordenar usando ORDER BY.
Adicionalmente se puede usar LIMIT para restringir el máximo de
elementos a retornar.
Ejemplos
−− S e l e c c i o n a l o s t r e s p r i m e r o s nombres de l o s l i b r o s o r d e n a d o s p o r a ño de p u b l i c a c i ón
descendentemente
SELECT libNombre FROM libro ORDER BY libPub DESC LIMIT 3 ;
−− S e l e c c i o n a e l p r e c i o p r o m e d i o de l o s libros
SELECT AVG ( libPrecio ) FROM libro ;
−− Cuenta l o s l i b r o s
SELECT count ( libId ) from libro ;
−− S e l e c c i o n a e l nombre d e l l i b r o má s c o s t o s o
SELECT libNombre FROM libro WHERE libPrecio = ( SELECT MAX ( libPrecio ) FROM libro )
−− C a l c u l a e l p r o m e d i o de l o s l i b r o s p o r c a d a a u t o r
SELECT autId , AVG ( libPrecio ) FROM libro GROUP BY ( autId )
Si se desea tener una condición después de realizar una agrupación se usa
la sentencia HAVING (funciona igual que un WHERE).
−− Cuenta l a s v e n t a s p o r c a d a l i b I d y s e l e c c i o n a l o s que t i e n e n v e n t a s m a y o r e s a 3
SELECTlibId , COUNT ( vtaId ) FROM venta GROUP BY ( libId ) HAVING COUNT ( vtaId ) > 3 ;
Renombrar (ρ)
ρnuevoNombre←anteriorNombre (R)
?
−− Renombra e l a t r i b u t o a1 como b1
SELECT a1 AS b1 FROM R
Ejemplos
−− S e l e c c i o n a e l nombre d e l l i b r o con i d e n t i f i c a d o r 1003 y l o r e n o m b r a p o r t ı́ t u l o
SELECT libNombre AS titulo FROM libro WHERE libId =1003;
−− S e l e c c i o n a e l i d e n t i f i c a d o r y e l nombre de l o s l i b r o s que f u e r o n p u b l i c a d o s d e s p u e s de
1960 , y l o s renombra .
SELECT libId AS ”Có d i g o d e l l i b r o ” , libNombre AS ”Tı́ t u l o ” FROM libro WHERE libPub > 1 9 6 0 ;
A × B = {(a, b) : a ∈ A ∧ b ∈ B}
Ejemplo
A = {s, t}
B = {u, v , w }
A × B = {s, t} × {u, v , w }
A × B = {(s, u), (s, v ), (s, w ), (t, u), (t, v ), (t, w )}
La cardinalidad es:
|A × B| =|A| * |B| = 2*3 = 6
1001, Cien años de soledad, 1967, 1, 1, Gabriel Garcı́a M árquez
1001, Cien años de soledad, 1967, 1, 2, Gustavo Alvarez Gardeaz ábal
1001, Cien años de soledad, 1967, 1, 3, Jos é Eustasio Rivera
1001, Cien años de soledad, 1967, 1, 4, Jorge Isaacs
1002, La vor ágine, 1924, 3, 1, Gabriel Garcı́a M árquez
1002, La vor ágine, 1924, 3, 2, Gustavo Alvarez Gardeaz ábal
1002, La vor ágine, 1924, 3, 3, Jos é Eustasio Rivera
1002, La vor ágine, 1924, 3, 4, Jorge Isaacs
LIBRO × AUTOR =
1003, Marı́a, 1867, 4, 1, Gabriel Garcı́a M árquez
1003, Marı́a, 1867, 4, 2, Gustavo Alvarez Gardeaz ábal
1003, Marı́a, 1867, 4, 3, Jos é Eustasio Rivera
1003, Marı́a, 1867, 4, 4, Jorge Isaacs
1004, C óndores no se entierran todos los dı́as, 1971, 2, 1, Gabriel Garcı́a M árquez
1004, C óndores no se entierran todos los dı́as, 1971, 2, 2, Gustavo Alvarez Gardeaz ábal
1004, C óndores no se entierran todos los dı́as, 1971, 2, 3, Jos é Eustasio Rivera
1004, C óndores no se entierran todos los dı́as, 1971, 2, 4, Jorge Isaacs
R1 × R2
?
SELECT ∗ FROM R1 , R2 ;
Ejemplo
LIBRO AUTOR
libId libNombre libPub autId autId autNombre
1001 Cien años de soledad 1967 1 1 Gabriel Garcı́a Márquez
1002 La vorágine 1924 3 2 Gustavo Alvarez Gardeazábal
1003 Marı́a 1867 4 3 José Eustasio Rivera
1004 Cóndores no se entierran todos los dı́as 1971 2 4 Jorge Isaacs
σLIBRO.autId=AUTOR.autId( LIBRO×AUTOR ) =
1001, Cien años de soledad, 1967, 1, 1, Gabriel Garcı́a M árquez
1002, La vor ágine, 1924, 3, 3, Jos é Eustasio Rivera
1003, Marı́a, 1867, 4, 4, Jorge Isaacs
1004, C óndores no se entierran todos los dı́as, 1971, 2, 2, Gustavo Alvarez Gardeaz ábal
?
SELECT ∗ FROM R1 , R2 WHERE R1 . ak = R2 . ak ;
Ejemplos
SELECT ∗ FROM libro , autor ;
SELECT libNombre , autNombre , autApellido FROM libro , autor WHERE libro . autId=autor . autId ;
SELECT vtaFecha , libNombre FROM libro , venta WHERE libro . libId = venta . libId ;
SELECT libNombre , ediNombre FROM libro , editorial WHERE libro . ediId = editorial . ediId ;
JOIN (o
n)
El operador join o
n permite combinar registros de una o más relaciones.
R1 o
nk R2
JOIN (o
n) en SQL I
MySQL
R1 o
nk R2
?
SELECT ∗ FROM R1 JOIN R2 USING K ;
Si el atributo por el que se quiere combinar no se llama igual en las dos
relaciones, se usa:
SELECT ∗ FROM R1 JOIN R2 ON ( R1 . a = R2 . b ) ;
JOIN Natural (o
n)
Combinar según los atributos que tengan el mismo nombre en las dos
tablas(todos los atributos que tengan el mismo nombre). Omitir el
subı́ndice del o
n.
R1 o
n R2
?
SELECT ∗ FROM R1 NATURAL JOIN R2 ;
JOIN en SQL II
Ejemplos - MySQL
Ejemplos
SELECT ∗ FROM libro JOIN autor using ( autId ) ;
SELECT libNombre , autNombre , autApellido FROM libro JOIN autor using ( autId ) ;
−− JOIN de t r e s r e l a c i o n e s . nombre d e l l i b r o , de l a e d i t o r i a l y d e l a u t o r de t o d o s l o s
libros .
SELECT libNombre , ediNombre , autNombre , autApellido FROM libro NATURAL JOIN editorial
NATURAL JOIN autor ;
Otras Consultas
Ejemplos - MySQL
Ejemplos
−− P a i s e s de l a n a c i o n a l i d a d de l o s a u t o r e s
SELECT DISTINCT autPais AS ” P a i s e s ” FROM autor ;
−− T o t a l de l i b r o s v e n d i d o s en e l a ño 2021
SELECT sum ( vtaCantidad ) AS ” C a n t i d a d ” FROM venta WHERE year ( vtaFecha ) > 2 0 2 0 ;
−− T o t a l de l i b r o s que t i e n e c a d a a u t o r
SELECT concat ( autNombre , concat ( ” ” , autApellido ) ) AS ”Nombre A u t o r ” , count ( libId ) AS ”Nú
mero ” FROM libro NATURAL JOIN autor GROUP BY autId ;
−− T o t a l de u n i d a d e s v e n d i d a s p o r l i b r o . L i s t a r l a en o r d e n d e s c e n d e n t e p o r l a c a n t i d a d
vendida .
SELECT libNombre , sum ( vtaCantidad ) AS ” T o t a l ” FROM libro NATURAL JOIN venta GROUP BY
libId ORDER BY Total DESC ;
Ejemplo
Cargar el script museo.sql y verificar con SELECT que todas las tablas
esten cargadas.
−− M o d i f i c a r l a columna de c o s t o de o b r a d e j a n d o p o r d e f e c t o e l v a l o r 500
ALTER TABLE obra ALTER obr_costo SET DEFAULT 5 0 0 ;
−− I n s e r t a r una n u e v a o b r a de Da V i n c i s i n c o s t o ( v e r i f i c a r que t e n g a e l v a l o r p o r
d e f e c t o d e s p u é s de l a i n s e r c i ón )
INSERT INTO obra ( obr_id , obr_nombre , obr_tipo , exp_id ) values ( 1 1 5 , ’ S a l v a t o r Mundi ’ , ’
p i n t u r a ’ , 1003) ;
−− I n c r e m e n t a r e l p r e c i o de l a s e s c u l t u r a s en 10%
UPDATE obra SET obr_costo=obr_costo ∗ 1 . 1 WHERE obr_tipo = ’ e s c u l t u r a ’ ;
−− S e l e c c i o n a l a s o b r a s c u y o c o s t o e s mayor a l p r o m e d i o de l o s c o s t o s
SELECT obr_costo FROM obra WHERE obr_costo >(SELECT AVG ( obr_costo ) FROM obra ) ;
−−Nombre de l a s 5 o b r a s má s c o s t o s a s
SELECT obr_nombre FROM obra ORDER BY obr_costo DESC LIMIT 5
−− L i s t a r l o s nombres de l a s o b r a s y e x p o s i c i o n e s de l a s o b r a s t i p o p i n t u r a
SELECT obr_nombre , exp_nombre FROM obra JOIN exposicion USING ( exp_id ) WHERE obr_tipo = ’
pintura ’ ;
Agenda
3 Problemas
Problemas I
Problema
1 Usando el script museo.sql del ejercicio anterior, realizar las siguientes
consultas
1. Nombre de las obras que tienen un costo menor a 1/3 del promedio.
2. Listar los nombres de las obras ordenadas alfabéticamente
3. Sumar el costo de las obras por tipo de obra
4. Contar las obras que tiene cada una de las exposiciones
5. Listar los nombres, tipo y costo de las obras de la exposición “Da
Vinci”
6. Proyectar nombre del museo, nombre de la obra de las
presentaciones de las obras de “Da Vinci”
Problemas II
Problema
1 Usar la base de datos Veterinaria creada en los problemas de la sesión
Problemas III
Problema (continuación)
7. Contar cuantas mascotas hay por cada uno de los tipos de
mascotas. Proyectar el tipo y el conteo.
8. Calcular el promedio de los precios de los productos para los perros.
9. Calcular el promedio de las ventas realizadas a los gatos
10. Calcular cuantos servicios ha tenido la mascota llamada ”Max”.
11. Calcular el promedio de las ventas realizadas por cada uno de los
tipos de servicios.
12. Calcular cuantas mascotas tienen cada uno de las personas que
tienen mascotas.
Referencias