Está en la página 1de 87

SQL: DML

DML= DATA MANIPULATION LANGUAGE


(Lenguaje de manipulación)
Las sentencias del lenguaje de manipulación permiten
manipular información de una base de datos.

Comprende 4 sentencias:
1) SELECT => Para obtener información de las tablas
2) INSERT => Para insertar una o más filas a una tabla
3) UPDATE=> Para modificar datos de una tabla
4) DELETE=> Para borrar una o más filas de una tabla
SQL (Lenguaje de Manipulación )
DML
Sintaxis General
SELECT [DISTINCT] campos
FROM tabla1,tabla2,…
[ WHERE Expresión lógica]
[ ORDER BY campo1 [DESC], campo2 [DESC]...]
SELECT (Sobre una relación)
 PROYECCIÓN ()
Algebra relacional SQL
SELECT DISTINCT a1,a2,..ak
R= a1,a2..ak(B)
FROM B

SELECT DISTINCT x
FROM B

SELECT DISTINCT x,y


FROM B
SELECT (Sobre una relación)
Si queremos todos los atributos de la tabla, podemos usar *
Todos los atributos se representa con *

Q1 es equivalente a Q2
SELECT (Sobre una relación)
A diferencia de álgebra relacional, el resultado de una sentencia SQL :
- Puede tener filas repetidas (ver Q2, Q5)
- Puede tener un orden
DML
(Sobre una relación)
Alumno(ci,nom,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)

1) Obtener las siglas y créditos de todas las materias


2) Obtener las siglas y créditos de todas las materias ordenando
los datos por sigla.
3) Obtener todas las áreas en que se agrupan las materias
DML
(Sobre una relación)
Obtener las siglas y créditos de todas las materias
Select sigla, creditos from materia

Obtener las siglas y créditos de todas las materias ordenando


los datos por sigla.
Select sigla, creditos from materia order by sigla

Obtener todas las áreas en que se agrupan las materias


Select distinct area from materia
SELECT (Sobre una relación)
 SELECCIÓN ()

Algebra relacional SQL


SELECT *
R=  exprLogica (B)
FROM B
WHERE exprLogica

SELECT * SELECT *
FROM B FROM B
WHERE x=1 WHERE x=1 or z=9
SELECT Sobre una tabla (relación)
A diferencia de álgebra relacional, el resultado de una sentencia SQL :
- Puede tener filas repetidas (ver Q2, Q5)
- Puede tener un orden (ver Q3,Q6)
(El usuario decide)
DML Sobre una tabla: ejemplos
Alumno(ci,nom,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)
Obtener todos los datos de los alumnos de sexo femenino
SELECT * FROM alumno WHERE sexo=‘F’
Obtener todos los datos de los alumnos de sexo femenino que
vienen del San Agustín.
SELECT * FROM alumno
WHERE sexo=‘F’ and colegio=‘San Agustín’
Obtener las siglas y créditos de todas las materias del área de
programación y de sistemas de información I.
SELECT sigla,creditos FROM materia
WHERE area=‘Progr’ or nomMat=‘SistInf I’
DML Sobre una tabla: ejemplos
Alumno(ci,nom,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,area,nivel)
Nota(ci,sigla,gestion,calif)
Obtener la sigla y nivel de todas las materias del área de programación
y de Sist Inf I.
FORMA 1 materia
Q= SELECT sigla, nivel FROM materia
WHERE area=‘pg’ or nomMat=‘Sist Inf I’
FORMA 2

Q=SELECT sigla,nivel FROM materia


WHERE area=‘pg’ Q
UNION
SELECT sigla,nivel FROM materia
WHERE nomMat=‘Sist Inf I’
DML Sobre una tabla: ejercicios
Alumno(ci,nom,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)

1) Obtener todos los datos de los alumnos de sexo femenino


2) Obtener todos los datos de los alumnos de sexo femenino
que vienen del San Agustín.
3) Obtener las siglas y créditos de todas las materias del área
de Programación
4) Obtener las siglas y créditos de todas las materias del área
de programación y de sistemas.
DML Sobre una tabla: ejercicios
Alumno(ci,nom,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)

1) Obtener todos los datos de los alumnos de sexo femenino


que vienen del San Agustín. Ordenar los datos por nombre.
2) Obtener las siglas y créditos de todas las materias del área
de Programación. Ordenar los datos por descr,área
3) Obtener todas las notas de la gestión II-19, ordenando los
datos en orden descendente de calificación.
Expresiones lógicas con
IN, LIKE, BETWEEN
1) Obtener el ci de los alumnos con alguna calificación esté
entre 70 y 100
SELECT ci from nota where calif between 70 and 100
es equivalente a
SELECT ci from nota where calif>=70 and calif<=100

2) Obtener el ci de los alumnos que obtuvieron alguna


calificación igual a 50, 80 o 90
SELECT ci from nota where calif IN (50,90,80)
es equivalente a
SELECT ci from nota where calif=50 or calif=90 or calif=80

3) Obtener el ci de los alumnos cuyo nombre empieza con A


SELECT ci,nom from alumno where nom like 'A*'
SELECT (Sobre 2 o más tablas)
 UNION (⋃)
Algebra relacional SQL Los atributos de A y
SELECT * FROM A B deben estar en el
R= A⋃B mismo orden
UNION
SELECT * FROM B

En SQL también
elimina duplicados.
Trabjando con 2 o más tablas
 UNION ()
Obtener todos los datos de los
alumnos y empleados de la
Universidad.
SQL

Q1= SELECT * FROM Alumno


UNION
SELECT * FROM Empleado

En SQL también
eliminan duplicados.
SELECT (Sobre 2 o más tablas)
 INTERSECCIÓN ()
Algebra SQL
relacional No existe en Access
Pero si en SQLServer
SELECT * FROM A
R= A B INTERSECT
SELECT * FROM B
Trabjando con 2 o más tablas
 INTERSECCIÓN ()
Obtener todos los datos de
los alumnos que también son
empleados de la Universidad
SQL
Q2= SELECT * FROM Alumno
INTERSECT
SELECT * FROM Empleado

Variaciones entre gestores:


Access: no implementa
SqlServer: INTERSECT
Oracle:INTERSECT
SELECT (Sobre 2 o más tablas)
 RESTA (-)
Algebra SQL
relacional No existe en Access
Pero si en SQLServer
SELECT * FROM A
R= A -B (EXCEPT) Y EN
EXCEPT ORACLE (MINUS)
SELECT * FROM B
Trabjando con 2 o más tablas
 RESTA (-)
Obtener todos los datos de
los empleados que no son
alumnos.
SQL
Q3= SELECT * FROM Empleado
EXCEPT
SELECT * FROM Alumno
Variaciones entre gestores:
Access: no implementa
SqlServer: EXCEPT
Oracle: MINUS
DML Sobre 2 o más tablas
PRODUCTO CARTESIANO (X) JOIN (⋈)
Algebra relacional SQL SQL (OTRA FORMA)
SELECT *
R= A xB FROM A,B

SELECT A.x as x,y,z,a SELECT A.x as x,y,z,a


R=A ⋈ B
FROM A,B FROM A
WHERE A.x=B.x INNER JOIN B on A.x=B.x

Dos formas de hacer JOIN


DML Sobre 2 o más tablas
PRODUCTO CARTESIANO (X) JOIN (⋈)
Algebra relacional SQL SQL (OTRA FORMA)
SELECT *
R= A xB FROM A,B

SELECT A.x as x,y,z,a SELECT A.x as x,y,z,a


R=A ⋈ B
FROM A,B FROM A INNER JOIN B
WHERE A.x=B.x ON A.x=B.x

A diferencia del álgebra relacional, es necesario que especifique


Dos formas
el atributo de hacer
(quizá JOIN
compuesto) por el que se hará el JOIN
DML Sobre 2 o más tablas
JOIN usando más de un atributo (⋈)
Algebra relacional SQL SQL (OTRA FORMA)
SELECT A.x as x, A.y as y,z,u,a SELECT A.x as x, A.y as y,z,u,a
R=A ⋈ B
FROM A,B FROM A INNER JOIN B
WHERE A.x=B.x and A.y=B.y ON A.x=B.x and A.y=B.y

JOIN usando un atributo compuesto


DML (Sobre 2 o más tablas)
Alumno(ci,nom,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)
1) Obtener un listado de las notas registradas en la gestión II-19
de todos los alumnos según el siguiente detalle:
ci,nom,sigla,calif.
2) Obtener un listado de las notas registradas en la gestión II-19
de todos los alumnos según el siguiente detalle:
ci,nom,sigla,nomMat,calif.
3) Obtener un listado de las notas de aprobación registradas en la
gestión II-19 de todos los alumnos de sexo masculino en las
materias del área de programación y en Base de Datos I, según
el siguiente detalle: ci,nom,sigla,nota.
4) Obtener todas las posibles parejas de materias que pertenezcan
a la misma área (eliminar duplicados).
DML (Sobre 2 o más Rs ) INNER JOIN
Alumno(ci,nom,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)
1) Obtener un listado de las notas registradas en la gestión I-19 de
todos los alumnos según el siguiente detalle: ci,nombre,sigla,calif.
FORMA 1
select A.ci,nom,sigla,calif
from Alumno A , Nota N
where A.ci=N.ci and gestion=‘I-19’

FORMA 2 (inner join)


select A.ci,nom,sigla,calif
from Alumno A inner join Nota N on A.ci=N.ci
Where gestion=‘I-19’
DML (JOIN Sobre 3 TABLAS)
Alumno(ci,nombre,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)
2)Obtener un listado de las notas registradas en la gestión I-17 de todos los
alumnos según el siguiente detalle: ci,nombre,sigla,nomMat,calif.
FORMA1

SELECT a.ci,nombre,m.sigla,nomMat,calif
FROM alumno a, nota n, materia m
WHERE a.ci=n.ci and m.sigla=n.sigla and gestion=‘I-17’
FORMA2

SELECT a.ci,nombre,m.sigla,nomMat,calif
FROM materia m INNER JOIN
(alumno a INNER JOIN nota n ON a.ci = n.ci)
ON m.sigla = n.sigla
WHERE gestion='I-17'
DML (Sobre 2 o más tablas)
Alumno(ci,nom,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)

3) Obtener un listado de las notas de aprobación registradas en la


gestión I-17 de todos los alumnos de sexo masculino en las
materias del área de programación y en Base de Datos I, según el
siguiente detalle: ci,nom,sigla,calif.
SELECT a.ci,nombre,m.sigla,calif
FROM alumno a, nota n, materia m
WHERE a.ci=n.ci and m.sigla=n.sigla and gestion=‘I-17’
and sexo=‘m’ and (area=‘prog’ or nomMat=‘base1’)
DML (Sobre 2 o más tablas)
Alumno(ci,nombre,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)

4) Obtener todas las posibles parejas de materias que pertenezcan a


la misma área (eliminar duplicados).

SELECT m1.sigla,m1.nomMat, m2.sigla,m2.nomMat


FROM materia m1, materia m2
WHERE m1.area=m2.area and m1.sigla<m2.sigla
DML: Ejercicio
Alumno(ci,nom,sexo,colegio,telf,direcc,tipo)
Materia(sigla,nomMat,creditos,area,tipo)
Nota(ci,sigla,gestion,calif)
Obtener un listado de las notas registradas EL AÑO 2017 de todos los alumnos
según el siguiente detalle: ci,nom,sigla,calif.
FORMA1
SELECT nombre,n.*
FROM alumno a INNER JOIN nota n
ON a.ci=n.ci
WHERE gestion like '*17'

FORMA2
SELECT nombre,n.*
FROM alumno a , nota n
WHERE a.ci=n.ci AND gestion like '*17'
Variaciones INNER JOIN RIGHT JOIN

de JOIN
Suponiendo:
table1(ac,a1,a2..)
table2(ac,b1,b2..)
SELECT atributo(s) SELECT atributo(s)
ac=atributo por el FROM table1 as T1 FROM table1 as T1
que se hará INNER JOIN table2 as T2 RIGHT JOIN table2 as T2
el join ON T1.ac=T2.ac; ON T1.ac=T2.ac;

OUTER JOIN LEFT JOIN

SELECT atributo(s) SELECT atributo(s)


FROM tabla1 as T1 FROM table1 as T1
OUTER JOIN tabla2 as T2 LEFT JOIN table2 as T2
ON T1.ac=T2.ac; ON T1.ac=T2.ac;
Variaciones del join:
inner, left outer, right outer
Sean A(x,y,z) B(x,a)
SELECT * FROM SELECT * FROM
A LEFT OUTER JOIN B A RIGHT OUTER JOIN B
ON A.x=B.x ON A.x=B.x

Hace el join Hace el join


incluyendo las filas de incluyendo las filas de
A cuyos valores x no B cuyos valores x no
estaban en B estaban en A

OUTER JOIN es como un INNER JOIN, pero añade las filas restantes de
una de las tablas:
• LEFT OUTER JOIN incluye todas las filas de la tabla de la izquierda (A
en el ejemplo)
• RIGHT OUTER JOIN incluye todas las filas de la tabla de la derecha (B
en el ejemplo)
Variaciones del join: Ejemplo
Sean A(x,y,z) B(x,a)
Q1=SELECT * FROM Q2=SELECT * FROM Q3=SELECT * FROM
A INNER JOIN B A LEFT OUTER JOIN B A RIGHT OUTER JOIN B
ON A.x=B.x ON A.x=B.x ON A.x=B.x

Hace el join natural o Hace el join Hace el join


inner join (no incluye incluyendo las filas de incluyendo las filas de
filas que no tengan A cuyos valores x no B cuyos valores x no
valores x en común) estaban en B estaban en A
Variaciones del JOIN
JOIN (⋈) LEFT OUTER JOIN
consulta6
SELECT * from ALUMNO as A
LEFT OUTER JOIN
NOTA as N ON
A.ci=N.ci;

Como existen valores de ci en alumno (tabla LEFT) que


no están en nota, éstos aparecen con valores nulos en los
atributos de nota
Variaciones del JOIN
JOIN (⋈) RIGHT OUTER JOIN
consult7
SELECT * from ALUMNO as A
RIGHT OUTER JOIN
NOTA as N ON
A.ci=N.ci;

Como no existen valores de ci en nota (tabla RIGHT)


que no estén en nota (porque no hay violaciones a la
regla de integridad referencial), entonces el resultado es
equivalente a hacer un inner join (o join natural)
SQL sobre una relación
 AMPLIACIÓN (nuevas columnas en la tabla)

Algebra relacional SQL


AR= EXTEND A AR=SELECT *, x+y as s, x*10 as p
ADD x+y as s, FROM A
x*10 AS p
SQL sobr
 Obtener el ci y nombre de los alumnos que hayan
aprobado al menos una materia
SELECT DISTINCT A.ci,nom
FROM Alumno A, Nota N
WHERE A.ci=N.ci and calif>50

 Obtener el ci y nombre de los alumnos que nunca se


hayan aplazado
SELECT DISTINCT A.ci,nom
FROM Alumno A, Nota N
WHERE A.ci=N.ci and calif>50
La consulta no devuelve lo solicitado. Basta que haya aprobado una materia, el
alumno entraría en la respuesta. Para resolver requerimos CONSULTAS ANIDADAS
SQL: Consultas Anidados
En una consulta simple la

EXPRESION LOGICA tiene que


SELECT [DISTINCT] campos ver con comparaciones
valor - valor ej. calif > 50
FROM tablas
WHERE Expresión lógica
EXPRESION LOGICA

En una consulta anidada la EXPRESION LOGICA tiene que ver con


comparaciones valor - conjunto
valor [NO] PERTENECE A conjunto Ej ci NOT IN (SELECT ci from…)

valor >TODOS/ALGUN ELEMENTO DEL conjunto Ej calif > all (SELECT calif from ..)

[NO] EXISTEN ELEMENTOS EN EL conjunto Ej NOT EXISTS (SELECT * from ..)


CONSULTAS ANIDADAS: [NOT] IN
valor [NO] PERTENECE A conjunto Ej ci NOT IN (SELECT ci from…)

SELECT [DISTINCT] campos


FROM tablas
WHERE
campo [NOT] IN (SELECT campo...) ]

Toma registros de que [NO] están en


Ejemplo: CONSULTAS ANIDADAS [NOT] IN
valor [NO] PERTENECE A conjunto Ej ci NOT IN (SELECT ci from…)

Obtener el ci y nombre de los alumnos que nunca se hayan aplazado


SELECT ci, nom
FROM Alumno
WHERE ci NOT IN
(SELECT ci
FROM NOTA
WHERE calif<51)

Ci no pertenece
Al conjunto de carnets de estudiantes que alguna vez se aplazaron
Ejemplo: CONSULTAS ANIDADAS [NOT] IN
valor [NO] PERTENECE A conjunto Ej ci NOT IN (SELECT ci from…)

Obtener el ci y nombre de los alumnos que nunca se hayan aplazado


Q=SELECT ci, nom
FROM Alumno
WHERE ci NOT IN
(SELECT ci
FROM NOTA
WHERE calif<51)

ci NOT IN {a1,a2 }
a1 NOT IN {a1,a2 } FALSO => a1 no entra en el resultado
a2 NOT IN {a1,a2} FALSO => a2 no entra en el resultado
a3 NOT IN {a1,a2} VERDAD => a3 si entra en el resultado
a5 NOT IN {a1,a2} VERDAD => a5 si entra en el resultado
Ejercicio: CONSULTAS ANIDADAS [NOT] IN

Ejercicio:
Escribir una sentencia SQL para obtener el ci y nombre
de los alumnos de sexo femenino que nunca se aplazaron.
SELECT ci,nom
FROM alumno
WHERE sexo=‘f’ and ci NOT IN
(SELECT ci from nota where calif<51)
ORDER BY nombre
Ejercicio: CONSULTAS ANIDADAS [NOT] IN
Diseñar una consulta para generar un listado con el ci y
nombre de los alumnos que aprobaron base de datos I y
nunca se aplazaron Tablas de las que
tomaré la
SELECT A.ci, nom información

FROM Alumno A, Nota N, Materia M


WHERE A.ci=N.ci and N.sigla=M.sigla Hago los joins
and nomMat=‘Base 1’ and calif>50
and A.ci NOT IN Tabla con la inf. que
me permitirá
(SELECT ci evaluar la condición
del where
FROM Nota
Consulta
auxiliar WHERE calif<51)
CONSULTAS ANIDADAS: ANY/ALL
valor >TODOS/ALGUN ELEMENTO DEL conjunto Ej calif > all (SELECT calif from ..)

SELECT [DISTINCT] campos Operador puede ser


=, > , < , > =, <=, < >
FROM tablas
WHERE campo operador ANY/ALL
(SELECT campo from ....)

ANY:Toma filas de cuyo valor de campo es > a cualquier valor de

ALL :Toma filas de cuyo valor de campo es > a TODO valor de

Suponiendo que el operador es >


Ejemplo: CONSULTAS ANIDADAS (ALL)
Ejercicio: Diseñar una consulta para obtener el ci del alumno que obtuvo
la MEJOR calificación en la materia con sigla p1
Q5= SELECT ci
FROM Nota
WHERE sigla =‘p1’ andand
calif >= all (SELECT calif
from Nota
where sigla= ‘p1’)

Todas las filas, excepto la 3, 7 y 9 tienen sigla ≠p1,


por tanto no entran al resultado

Viendo las filas 3, 7 y 9 que cumplen con la primera


condición (sigla=p1), vemos la segunda condición:
sigla=‘p1’ and 20 >= all {20,30,95} Falso
sigla=‘p1’ and 30 >= all {20,30,95} Falso
sigla=‘p1’ and 95 >= all {20,30,95} Verdad
Ejemplo: CONSULTAS ANIDADAS (ANY)
Ejercicio: Diseñar una consulta para obtener el ci de los alumnos que NO
obtuvieron la PEOR calificación en la materia con sigla p1
Q5= SELECT ci
FROM Nota
WHERE sigla =‘p1’ andand
calif > any (SELECT calif
from Nota
where sigla= ‘p1’)

Todas las filas, excepto la 3, 7 y 9 tienen sigla ≠p1,


por tanto no entran al resultado

Viendo las filas 3, 7 y 9 que cumplen con la primera


condición (sigla=p1), vemos la segunda condición:
sigla=‘p1’ and 20 >any {20,30,95} Falso
sigla=‘p1’ and 30 >any {20,30,95} Verdad
sigla=‘p1’ and 95 >any {20,30,95} Verdad
Ejercicio: CONSULTAS ANIDADAS (ANY/ALL)
Obtener el ci y nombre de el(los) alumno(s) que obtuvo la
nota máxima en la materia INF-102.

Tomaron
SELECT N.ci, nom INF 102

FROM alumno A, nota N


WHERE A.ci=N.ci and sigla =‘INF-102’ and
Todas las
calif >= all (SELECT calif from nota calif de
INF 102
where sigla= ‘INF-102’)
Calif que el
alumno obtuvo
en INF-102
Ejercicio: CONSULTAS ANIDADAS (ANY/ALL)
Obtener el ci y nombre de el(los) alumno(s) que obtuvo una
calificación (en cualquier materia) superior a todas las notas
registradas en INF-102

SELECT DISTINCT N.ci, nom


FROM alumno A, nota N
WHERE A.ci=N.ci and
calif >= all (SELECT calif from nota Todas las
calif de
where sigla= ‘INF-102’) INF 102

Calif que el alumno


obtuvo en cualquier
materia
Ejercicio: CONSULTAS ANIDADAS (ANY/ALL)
Obtener el ci y nombre de el(los) alumno(s) que
obtuvieron en INF-102 una calificación mayor a todas las
registradas en todas las materias

SELECT N.ci, nom


FROM alumno A, nota N
WHERE A.ci=N.ci and sigla =‘INF-102’ and
calif >= all (SELECT calif from nota)
Todas las calificaciones
(de todos los alumnos y
Calif que el
en todas las materias)
alumno obtuvo
en INF-102
Tarea: 1) Escribir tablas con datos donde se muestre
la diferencia entre las siguientes consultas
Q1= SELECT N.ci, nom 2) Escribir una
FROM alumno A, nota N consulta para
WHERE A.ci=N.ci and sigla =‘INF-102’ and
obtener la sigla y
calif >= all (SELECT calif from nota
nombre de las
where sigla= ‘INF-102’)
materias que
Q2= SELECT DISTINCT N.ci, nom
aprobaron a todos
FROM alumno A, nota N
WHERE A.ci=N.ci and
los alumnos la
calif >= all (SELECT calif from nota
gestion I-20.
where sigla= ‘INF-102’)

Q3= SELECT N.ci, nom


FROM alumno A, nota N
WHERE A.ci=N.ci and sigla =‘INF-102’ and
calif >= all (SELECT calif from nota)
Ejercicio: CONSULTAS ANIDADAS (ANY/ALL)
Obtener el ci y nombre de los alumnos que no hayan
obtenido la mínima nota en la materia INF-102.

SELECT N.ci, nom


FROM alumno A,nota N
WHERE A.ci=N.ci and sigla =‘INF-102’ and
calif > any (SELECT nota from notas
where sigla= ‘INF-102’)
La calificación debe ser mayor a cualquiera de las
calificaciones de INF-102
CONSULTAS ANIDADAS: [NOT] EXISTS
[NO] EXISTEN ELEMENTOS EN EL conjunto Ej NOT EXISTS (SELECT * from ..)

SELECT [DISTINCT] campos


FROM tablas
WHERE
[NOT] EXISTS (SELECT * ...)

(EXISTS) Toma filas de si no es vacío


(NOT EXISTS) Toma filas de si es vacío
Ejemplo CONSULTAS ANIDADAS: [NOT] EXISTS
Obtener el ci y nombre de los alumnos que nunca se aplazaron.
Indispensable vincular
la consulta principal
Q= SELECT ci, nom
FROM alumno A con la subconsulta
mediante la expresión
WHERE NOT EXISTS
(SELECT * from nota N
where calif<51 and N.ci=A.ci )

NOT EXISTS
Para A.ci=a1
NOT EXISTS {1,3,4} FALSO => a1 no entra en el resultado
Para A.ci=a2
NOT EXISTS {6,7} FALSO => a2 no entra en el resultado
Para A.ci=a3
NOT EXISTS {} VERDAD => a3 si entra en el resultado
Para A.ci=a5
NOT EXISTS {} VERDAD => a5 si entra en el resultado
NOT EXISTS VS
NOT IN
Obtener el ci y nombre de los
alumnos que nunca se aplazaron.
Q=SELECT ci, nom
FROM alumno A
WHERE NOT EXISTS
(SELECT * from nota N
where calif<51 and N.ci=A.ci ) Q= SELECT ci, nom
FROM alumno
NOT EXISTS C
WHERE ci NOT IN
Para A.ci=a1
NOT EXISTS{1,3,4} FALSO => a1 no entra (SELECT ci from nota
Para A.ci=a2
NOT EXISTS {6,7} FALSO => a2 no entra
where calif<51)
Para A.ci=a3 ci NOT IN {a1,a2 }
NOT EXISTS { } VERDAD => a3 si entra
a1 NOT IN {a1,a2 } FALSO => a1 no entra
Para A.ci=a5
NOT EXISTS {} VERDAD => a5 si entra a2 NOT IN {a1,a2} FALSO => a2 no entra
a3 NOT IN {a1,a2} VERDAD => a3 si entra
CI DE LOS ALUMNOS QUE TIENEN UN a5 NOT IN {a1,a2} VERDAD => a5 si entra
CONJUNTO VACÍO DE NOTAS DE APLAZO
O
CI DE LOS ALUMNOS PARA QUIENES NO CI DE LOS ALUMNOS CUYO CI NO
EXISTE UN CONJUNTO DE NOTAS DE PERTENECE AL CONJUNTO DE CIS DE LOS
APLAZO APLAZADOS
Ejercicio CONSULTAS ANIDADAS [NOT] EXISTS
Obtener el ci y nombre de los alumnos que hayan tomado
todas las materias del área de Prog.
SELECT ci, nom FROM alumno A
WHERE NOT EXISTS
(SELECT sigla from materia M
where area=‘Prog’ and
sigla NOT IN (select sigla from nota N
where N.ci = A.ci ))
(No existen materias del área Prog que no estén entre las siglas de
las materias tomadas por el alumno en cuestión )
alumno para el que se está decidiendo si entra o no al
alumno en cuestión = resultado
Pueden incluir
DML: Group By funciones agregadas

SELECT [DISTINCT] campos


FROM tablas
[ WHERE Expresión lógica sobre campos]
[ ORDER BY campo1 [DESC], campo2 [DESC]...]
[ GROUP BY campo
[HAVING Expresión lógica sobre grupos]]
Funciones agregadas: avg,max,min,sum,count

Se puede seleccionar de acuerdo a valores de grupos


Cuidado: El usuario define
qué atributos incluir. Debe
existir correspondencia con
SQL: resumen/grupos
los atributos de group by

Algebra relacional SQL

R= SUMMARIZE A Q=SELECT x , max(z) as mxz,


GROUP BY x min(y) as mny,
ADD max(z) as mxz, sum(z) as sz,
min(y) as mny count(*) as t,
sum(z) as sz avg(z) as pz
count(*) as t FROM A
avg(z) as pz GROUP BY x

1 grupo = 1 fila
Ejercicio: SQL: resumen
Escribir el resultado de
ejecutar Q grupos
Consulta incorrecta

Q =SELECT x , b , max(z) as mxz,


min(y) as mny,
sum(z) as sz,
count(*) as t,
avg(z) as pz
FROM A
GROUP BY x
Cuidado: El usuario define qué
atributos incluir . Si incluyo b
SQL: resumen
estaría mal, porque b no es un valor
de grupo (no hay correspondencia) grupos
Consulta correcta Consulta incorrecta

QBien=SELECT x , max(z) as mxz, Qmal=SELECT x , b , max(z) as mxz,


min(y) as mny, min(y) as mny,
sum(z) as sz, sum(z) as sz,
count(*) as t, count(*) as t,
avg(z) as pz avg(z) as pz
FROM A FROM A
GROUP BY x GROUP BY x

Hay
Hay varios
varios
valores
valores de
de bb
en el grupo,
en el grupo,
cuál
cuál pondría?
pondría?
El usuario define qué
atributos incluir SQL: resumen/grupos
Algebra relacional SQL

R= SUMMARIZE A Q=SELECT x, a , max(z) as mxz,


GROUP BY x,a min(y) as mny,
ADD max(z) as mxz, sum(z) as sz,
min(y) as mny count(*) as t,
sum(z) as sz avg(z) as pz
count(*) as t FROM A
avg(z) as pz GROUP BY x, a
DML (Group By)
Ejercicio: Diseñar una consulta para generar un listado
con el ci y promedio general de todos los alumnos.
Algebra relacional SQL

R= summarize NOTA Q22=SELECT ci, avg(calif) as prom


GROUP BY ci FROM Nota
ADD avg(calif) as prom GROUP BY ci
DML (Group By)
Ejercicio: Diseñar una consulta para obtener la cantidad total
de alumnos
Algebra relacional SQL

R= summarize alumno Q= SELECT count(*) as cant


ADD count(*) as cant FROM alumno

Si no hay group by,


toda la tabla es un
grupo, entonces Q sólo
tendrá una fila
DML (Group By)
Ejercicio: Diseñar una consulta para generar un listado con
el ci y promedio general de todos los alumnos. Sólo tomar
en cuenta los promedios de aprobación
Algebra relacional SQL

R1= summarize NOTA Q=SELECT ci, avg(calif) as prom


GROUP BY ci FROM Nota
ADD avg(calif) as prom GROUP BY ci
R2=σprom>50 (R1) HAVING avg(calif)>50

Filtramos grupos
con prom>50
DML (Group By)
Ejercicio: Diseñar una consulta para generar un listado con
el ci y promedio general del año 2016 de todos los alumnos.
Sólo tomar en cuenta los promedios de aprobación
Algebra relacional SQL

R0=(σgestion like ‘*16’’(NOTA)) Q= SELECT ci, avg(calif) as prom


R1= summarize R0 FROM Nota
GROUP BY ci WHERE gestion like ‘*16’
ADD avg(calif) as prom GROUP BY ci
R2=σprom>50 (R1) HAVING avg(calif)>50

Filtro Formo
Filas grupos Filtro
grupos
DML (Group By)
Ejercicio: Diseñar una consulta para generar un listado
con el ci y promedio general de todos los alumnos de
sexo femenino.

SELECT A.ci, avg(calif)


FROM Alumno A, Nota N
WHERE A.ci=N.ci and sexo=‘f’
GROUP BY A.ci

Para que la tabla resultante tenga como nombre del campo prom
DML (Group By)
DML (Group By)
Ejercicio: Diseñar una consulta para generar un listado
con el ci, nombre y promedio general de todas las
alumnas que hayan tomado más de tres materias.

SELECT A.ci, nom, avg(calif) as prom


FROM Alumno A, Nota N
WHERE A.ci=N.ci and sexo=‘f’
GROUP BY A.ci, nom
HAVING count(distinct sigla)>3

Count(distinct atributo) no existe en


access pero si en SQLServer
DML (Group By)
Ejercicio: Diseñar una consulta para obtener el ci y nombre
del alumno que obtuvo el mejor promedio general, siempre
y cuando haya tomado mas de 20 .
SELECT N.ci, nom, avg(calif)
FROM alumno A,nota N
WHERE A.ci=N.ci
GROUP BY N.ci, nom
HAVING count(sigla)>20 and avg(calif)>= ALL
(select avg(calif) from nota
group by ci
having count(sigla)>20 )
Trabajando con fechas
Funciones sobre fechas:
year, day, month, hour, minute, second

Ejemplo:
Sea Alumno(ci,nom,sexo,fecNac)
Obtener los datos de los alumnos que nacieron el año 2000

SELECT *
FROM alumno
WHERE year(fecNac)=2000
DML: Modificar datos de una tabla

UPDATE tabla
SET campo = valor, ....
WHERE condición
DML: Modificar datos de una tabla
Ejercicio: Diseñar una consulta para aumentar 5 puntos a
todas las calificaciones inferiores a 96, obtenidas por los
alumnos de sexo femenino.

UPDATE nota
SET calif=calif+5
WHERE calif<=95 and ci in
(select ci from alumno where sexo=‘f`’)
DML: Añadir una fila a una tabla
INSERT INTO tabla(a1,a2,.. ak)
VALUES (va1,va2,…)

Ejemplo: Añadir un alumno a la tabla Alumno


INSERT INTO Alumno(ci,nom,sexo)
VALUES (37,’luis’,’M’)
DML: Añadir filas a una tabla a
partir de otras tablas
INSERT INTO tabla(a1,a2,.. ak)
SELECT ……
DML: Añadir filas a una tabla a
partir de otras tablas
Ejercicio: Insertar en la tabla nota a todos los alumnos con
promedio mayor a 90 (considerando solo las notas de
aprobación) siempre y cuando hayan aprobado 4 materias,
asignándoles la nota de 100 en la materia SIS-298.

INSERT INTO nota


(SELECT ci,’SIS-298’,’I-2020’,100
from nota where calif>=51
group by ci
having avg(calif)>=90 and count(*)>4)
DML: Borrar Registros
Ejercicio: Borrar de la tabla alumno todos los registros cuyo
sexo sea ‘I’.
DELETE FROM alumno
WHERE sexo=‘I’
DML: Borrar Registros
DELETE FROM tabla Borra los registros
WHERE condición que cumplen con la
condición

Ejemplo: Borrar de la tabla alumno todos los registros cuyo


valor de sexo sea ‘I’.
DELETE FROM alumno
WHERE sexo=‘I’
DML: Borrar Registros
Ejercicio: Borrar los alumnos que no tienen notas registradas

DELETE FROM Alumno


WHERE ci not in
(select ci from nota)
DML: Borrar Registros
Ejercicio: Borrar de la tabla notas todos los registros
pertenecientes a los alumnos cuyo promedio sea menor a 50.

DELETE FROM nota


WHERE ci in
(select ci from nota
group by ci
having avg(nota)<50)
ASUMAMOS QUE LA UCB
TIENE GUARDADA SU INF. EN
LA SIGUIENTE BASE DE DATOS
DML: Modificar
datos
Se ha decidido cambiar la
nomenclatura de las materias del
área de ciencias exactas. En este
momento se utiliza la palabra
‘cex’, y se desea cambiar a la
palabra ‘EXAC’. Hacer el
cambio únicamente si la materia
ha sido dictada alguna vez
¿cree que sea prudente hacer
este cambio manualmente en la
base de datos?. ¿Hacerlo
manualmente qué problemas
traería?
DML: Modificar
datos
1. Escribir una sentencia
SQL para que haga el
cambio cex por
EXACTA en todas las
materias
2. Escribir una sentencia
SQL para que haga el
cambio cex por
EXACTA las materias
que han sido dictadas
alguna vez (necesitamos
ver la tabla nota)
DML: borrar
Registros
3. Existen errores en la
tabla nota: valores
negativos en
calificaciones. Se quiere
limpiar la base de datos,
eliminando estos
registros.
¿Sería conveniente
hacerlo manualmente?.
Escriba una sentencia
SQL para hacerlo.
DML: borrar Registros
4. Debido a una confusión por cambios de plan de
estudios, se han añadido a la tabla materia, datos de
materias que finalmente nunca se abrieron. Se quiere
limpiar esta tabla borrando todas estas materias.
Escriba una sentencia SQL que borre de la tabla
materia todas aquellas que nunca tuvieron alumnos
asignados.
DML: Añadir Registros
5. Como hubo cambio de plan de estudios, se tiene una nueva
materia que debe ser añadida a la base de datos:
SIS-555 Programación Móvil, del área de programación.
Escriba una sentencia SQL
DML: Añadir Registros
6. Como hubo cambio de plan de estudios, se tiene una nueva materia
que debe ser añadida a la base de datos:
SIS-777 Internet de las cosas
El área aún esta en discusión, pero debe añadir la materia
Escriba una sentencia SQL
DML: Añadir registros
7. Se ha creado una nueva tabla
NotaKardex(ci,sigla,gestion,notaFinal),
En ella se desea insertar información de las notas finales sin tomar
en cuenta las no habilitaciones.
Escribir una sentencia SQL que cargue esta tabla a partir de los
datos de la tabla Nota.
DML: Añadir Registros
8. La materia Taller de Programación INF-232 no está en el
nuevo plan de estudios y será dictada por última vez el II-
2019. Se ha decidido inscribir en esta materia a todos los
alumnos de la carrera de sistemas (SIS) que no la han
aprobado, siempre y cuando hayan tenido una calificación
mayor a 60 en ‘Estructuras de datos’
9. La materia Programación a bajo nivel no está en el
nuevo plan de estudios y será dictada por última vez el II-
2019. Se ha decidido inscribir en esta materia a todos los
alumnos de la carrera de sistemas (SIS) que no la han
aprobado, siempre y cuando hayan tenido una calificación
mayor a 60 en ‘Organización del computador’
DESAFÍO: Añadir registros
10. Se acerca el aniversario de la UCB. Entre las
actividades de festejo, el rector ha decidido premiar
al estudiante con mejor promedio de cada carrera.
Escriba una sentencia SQL para añadir a la tabla
alumnosPremiados(ci,nombre,carrera,promedio)
Los datos de los alumnos que deberían ser
premiados.

También podría gustarte