BASES DE DATOS I

Anuncio
BASES DE DATOS I
CONSULTA DE DATOS
curso 2008
Agenda
• Repaso.
• Consultas Anidadas.
• Operadores :
• IN
• NOT IN
• EXIST
• NOT EXIST
• Agrupamiento.
• JOIN
• División.
17/09/2008
Bases de Datos I
Fernández, Mariano
1
Sentencia SELECT
SELECT [ DISTINCT ] <lista items>
FROM <lista tablas>
[ WHERE condición ]
[ GROUP BY <lista atributos grupo>
[ HAVING (condición grupo) ] ]
[ ORDER BY <lista atributos orden> ] ;
• El resultado es una tabla (si el resultado es un número, se considera como una
tabla con una fila y una columna)‫‏‬
• DISTINCT permite eliminar duplicados
• La condición del WHERE restringir el conjunto de tuplas a recuperar
• GROUP BY `factorea´ la relación resultante en grupos, y se puede aplicar un
filtro sobre el grupo mediante HAVING (<lista ítems> debe coincidir con <lista
atributos grupo>, aunque puede incluir funciones de agregado)‫‏‬
• ORDER BY permite ordenar el resultado mediante una lista de campos en <lista
atributos orden>
17/09/2008
Bases de Datos I
Fernández, Mariano
Ejemplo
INVESTIGADOR
id_inv nom_inv
N
categ
17/09/2008
N
trabaja
proy_id
N
PROYECTO
nombre
tema
1
INSTITUTO
corresponde
duracion
Bases de Datos I
id_inst
nombre
facultad
Fernández, Mariano
2
Consultas de una tabla
Ej. 1:
1: Listar los identificadores y
nombres de los proyectos
Ej. 2: Listar todos los datos de los
Institutos
SELECT proy_id, nombre
FROM PROYECTO ;
17/09/2007
SELECT *
FROM INSTITUTO;
Bases de Datos I
Fernández, Mariano
Consultas de más de una tabla
Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2
SELECT P.nombre
FROM PROYECTO P, INSTITUTO I
WHERE P.id_inst = I.id_inst AND
I.nombre = ´Inst2´
17/09/2008
Bases de Datos I
Fernández, Mariano
3
Consultas de más de una tabla
Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2
Mediante consultas anidadas:
SELECT nombre
FROM PROYECTO
WHERE id_inst IN ( SELECT id_inst
FROM INSTITUTO
WHERE nombre = ´Inst2´ );
17/09/2008
Bases de Datos I
Consultas anidadas
Fernández, Mariano
Consultas de más de una tabla
Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2
Mediante consultas anidadas:
SELECT nombre
FROM PROYECTO
WHERE id_inst IN ( SELECT id_inst
FROM INSTITUTO
WHERE nombre = ´Inst2´ );
17/09/2008
Bases de Datos I
Consultas anidadas
Fernández, Mariano
4
Consultas de más de una tabla
Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2
Mediante consultas anidadas:
SELECT nombre
FROM PROYECTO
WHERE id_inst IN ( SELECT id_inst
FROM INSTITUTO
WHERE nombre = ´Inst2´ );
17/09/2008
Bases de Datos I
Fernández, Mariano
Consultas de más de una tabla
Ej. 3: Obtener los nombres de los proyectos del Instituto Inst2
Mediante consultas anidadas:
SELECT nombre
Consultas anidadas
FROM PROYECTO
WHERE EXISTS ( SELECT * FROM INSTITUTO
WHERE nombre = ´Inst2´
AND PROYECTO.id_inst = INSTITUTO. id_inst );
17/09/2008
Bases de Datos I
Fernández, Mariano
5
Consultas – agrupamiento
Ej. 4: Listar los diferentes temas y la cantidad de proyectos de cada uno
SELECT tema, COUNT(*) AS CantProy
FROM PROYECTO
GROUP BY tema;
17/09/2008
Bases de Datos I
Fernández, Mariano
Consultas – agrupamiento
Ej. 5: Listar los códigos de los institutos con menos de 2 proyectos
SELECT id_inst FROM PROYECTO
GROUP BY id_inst
HAVING COUNT(*) < 2;
17/09/2008
Bases de Datos I
Fernández, Mariano
6
Consultas – agrupamiento
Ej. 6: Listar los datos completos de institutos con menos de 3 proyectos
SELECT I.*
FROM PROYECTO P, INSTITUTO I
WHERE P.id_inst = I.id_inst
GROUP BY P.id_inst
HAVING Count(*)<3 ;
17/09/2008
SELECT *
FROM INSTITUTO
WHERE id_inst IN
( SELECT id_inst FROM PROYECTO
GROUP BY PROYECTO.id_inst
HAVING Count(*)<3 );
Bases de Datos I
Fernández, Mariano
Consultas – agrupamiento
Ej. 17: Listar los datos completos de institutos con menos de 3 proyectos
SELECT I.*
FROM PROYECTO P, INSTITUTO I
WHERE P.id_inst = I.id_inst
GROUP BY P.id_inst
HAVING Count(*)<3 ;
17/09/2008
SELECT *
FROM INSTITUTO
WHERE id_inst IN
( SELECT id_inst FROM PROYECTO
GROUP BY PROYECTO.id_inst
HAVING Count(*)<3 );
Bases de Datos I
Fernández, Mariano
7
JOIN
• La sentencia JOIN permite combinar registros de dos o más tablas.
• Tipos de JOIN:
• NATURAL JOIN
• OUTER JOIN
z
LEFT OUTER JOIN
z
RIGHT OUTER JOIN
z
FULL OUTER JOIN
17/09/2008
Bases de Datos I
Fernández, Mariano
JOIN
Ej. 7: Listar los datos de los Proyectos junto con el nombre del Instituto en
el cual se desarrolla.
Opción 1:
SELECT P.*, I.nombre
FROM PROYECTO P, INSTITUTO I
WHERE P.id_ins = I.id_ins;
Opción 2:
SELECT P.*, I.nombre
FROM PROYECTO P JOIN INSTITUTO I;
• Ensamble por nombre de
columnas.
Problemas:
• Coinciden más columnas de las necesarias.
• Necesitamos ver tablas.
• Bug en Oracle.
17/09/2008
Bases de Datos I
Fernández, Mariano
8
JOIN
Ej. 7: Listar los datos de los Proyectos junto con el nombre del Instituto en
el cual se desarrolla.
Opción 3:
SELECT P.*, I.nombre
FROM PROYECTO P JOIN INSTITUTO I USING( id_ins) ;
• Se indica que columna usar.
Opción 4:
SELECT P.*, I.nombre
FROM PROYECTO P JOIN INSTITUTO I ON P.id_ins = I.id_ins;
Se indica que columnas utilizar para
el Ensamble
17/09/2008
Bases de Datos I
Fernández, Mariano
LEFT JOIN
Ej. 8: Listar los Investigadores junto con la cantidad de Proyectos en los
que trabaja.
SELECT I.nom_inv, I.id_inv, COUNT(*) as cant
FROM INVESTIGADOR I LEFT JOIN TRABAJA T
ON I.id_inv = T.id_inv
GROUP BY I.nom_inv, I.id_inv;
17/09/2008
Bases de Datos I
Fernández, Mariano
9
RIGHT JOIN
Ej. 8: Listar los Investigadores junto con la cantidad de Proyectos en los
que trabaja.
SELECT I.nom_inv, I.id_inv, COUNT(*) as cant
FROM INVESTIGADOR I RIGHT JOIN TRABAJA T
ON I.id_inv = T.id_inv
GROUP BY I.nom_inv, I.id_inv;
17/09/2008
Bases de Datos I
Fernández, Mariano
FULL JOIN
Ej. 9: Listar los Investigadores que trabajan en los Proyectos.
SELECT I.nom_inv, I.id_inv
FROM INVESTIGADOR I FULL JOIN TRABAJA T
ON I.id_inv = T.id_inv ;
17/09/2008
Bases de Datos I
Fernández, Mariano
10
División
Ej.:
PROF: id_p
p1
p2
p3
nom_p
nom1
nom2
nom3
DICTA ÷ MAT:
MAT: id_mat
m1
m2
DICTA: id_p id_mat
p1
m1
p1
m2
p2
m1
p3
m2
id_p
profesor que dicta
todas las materias
p1
• “DICTA” debe tener columnas de “MAT” y el número de columnas de
“DICTA” ha de ser mayor que el de “MAT”
• “MAT” debe tener al menos una tupla
•El cociente es una nueva tabla cuyo esquema está formado por las
columnas de “DICTA” que no están en “MAT”. El resultado incluye las
instancias que aparecen en combinación con todas las tuplas de “MAT”
17/09/2008
Bases de Datos I
Fernández, Mariano
División
Ej.:
PROF: id_p
p1
p2
p3
nom_p
nom1
nom2
nom3
DICTA ÷ MAT:
MAT: id_mat
m1
m2
DICTA: id_p id_mat
p1
m1
p1
m2
p2
m1
p3
m2
id_p
p1
profesor que dicta
todas las materias
• SQL no provee un operador División, pero es posible resolver este tipo
de consultas mediante el operador lógico EXISTS
• Cuando se requieran servicios del tipo “todos los x que satisfagan c”,
se debe reemplazar por “no existe ningún x que no satisfaga c”
17/09/2008
Bases de Datos I
Fernández, Mariano
11
División en SQL
Ej. 10 : Obtener los Investigadores que trabajan en todos los Proyectos
SELECT * FROM INVESTIGADOR I
WHERE NOT EXISTS
( SELECT * FROM PROYECTO P
WHERE NOT EXISTS
( SELECT * FROM TRABAJA T
WHERE T.id_inv = I.id_inv
AND P.proy_id = T.proy_id ) );
INVESTIGADOR
id_inv nom_inv
N
categ
17/09/2008
N
PROYECTO
trabaja
proy_id
nombre
tema
duracion
Bases de Datos I
Fernández, Mariano
División en SQL
Ej. 10: Obtener los Investigadores que trabajan en todos los Proyectos
SELECT * FROM INVESTIGADOR I
WHERE NOT EXISTS
( SELECT * FROM PROYECTO P
WHERE NOT EXISTS
( SELECT * FROM TRABAJA T
WHERE T.id_inv = I.id_inv
AND P.proy_id = T.proy_id ) );
17/09/2008
Bases de Datos I
Fernández, Mariano
12
Recomendaciones…
• Completar con textos de la Bibliografía (en todos se explica SQL y
se plantean ejemplos, incluso en algunos -Date por ej.- hay
ejercicios y soluciones para chequear)‫‏‬
• Consultar en Internet (sitios confiables)‫‏‬
• Consultar la Documentación del standard y de Oracle
• Resolver ejercicios (propuestos en la práctica, laboratorio, etc.)‫‏‬
• Probar ejercicios en Oracle (accesible vía web… en la página está la
URL y los datos para conexión), aprovechar las prácticas de
laboratorio
•
Practicar…
Practicar…
Practicar… !!!
13
Descargar