Sie sind auf Seite 1von 37

Sistemas de Bases de Datos II

Subconsultas
y Vistas
Docente:
T/RT Gonzalo Martnez
CETP EMT Informtica

Introduccin
Esta diapositiva tratara que son las subconsultas
en SQL, y en que caso utilizarlas.
Tambien tratara que son las Vistas.

Subconsulta
Una subconsulta es una sentencia SELECT
dentro de otra sentencia SELECT.
El SELECT interno se usa para obtener datos,
que seran usados para compararse en el select
externo.
Tambien, las subconsultas, permiten hacer
operaciones equivalentes al JOIN

Subconsulta
Tenemos 4 tipos de subconsultas:

Subconsultas Monoregistro
Subconsultas Multiregistro
Subconsultas desde el FROM
Subconsultas desde el SELECT

Subconsultas Monoregistro
Son consultas que se usan con la clausula
WHERE de la consulta principal.
Devuelven un unico valor, y se usan con los
operadores de comparacion (=,<,>,<=,>=,!=)

Subconsultas Monoregistro
Ej. Obtener el salario, nombre, apellido e ID de
los empleados que cobran por debajo del
promedio de salarios

Subconsultas Monoregistro
SELECT id, nombre, apellido, salario
FROM empleados
WHERE salario < (
SELECT avg(salario)
FROM empleados
)

Subconsultas Multiregistro
Son consultas que se usan con la clausula
WHERE de la consulta principal.
Devuelven mas de un registro.
Se utiliza con los comparadores de comparacion,
en conjunto con los operadores IN, ANY y ALL
(se pueden negar con NOT)

Subconsultas Multiregistro
Obtener el nombre y apellido de los alumnos que
obtuvieron una calificacion mayor o igual a 7 en
al menos 4 asignaturas

Subconsultas Multiregistro
SELECT nombre, apellido, calificacion
FROM alumno
WHERE CI = ANY (
SELECT ci
FROM cursa
WHERE calificacion >= 7
GROUP BY ci
HAVING count(ci_alumno) > 3
)

Subconsultas Multiregistro
Obtener el ID y nombre de los libros que hayan
sido prestados

Subconsultas Multiregistro
SELECT id, nombre
FROM libros
WHERE id IN (
SELECT id_libro
FROM prestamos
)

Subconsultas desde SELECT


Son consultas que se usan para determinar que
valor mostrar en la columna.
Se muestra en la columna un valor que cumpla
una condicion
Dichas columnas temporales deben llevar un
nombre.

Subconsultas desde SELECT


Sintaxis:
SELECT col1, col2 (SELECT col FROM tabla
WHERE) AS col3 FROM Tabla

Subconsultas desde SELECT


Ej.
Cliente(CI, Nombre, Apellido, Direccion)
Compra(CI_Cli, ID_Prod, Fecha)
Obtener la CI, Nombre, Apellido y cantidad de
productos comprados de cada cliente.

Subconsultas desde SELECT


SELECT ci, Nombre, Apellido, (SELECT
COUNT(ci_cli) FROM compra WHERE cli_ci =
ci) as Cantidad
FROM Cliente

Subconsultas desde FROM


Son consultas que se usan para reemplazar una
tabla a consultar en el FROM.
En lugar de extraer datos de una tabla, se
extraen de una consulta, que genera una tabla
temporal.
Dichas tablas temporales deben llevar un
nombre.

Subconsultas desde FROM


Sintaxis:
SELECT * from (
SELECT * from tabla1
) as nombre
SELECT * from tabla1
JOIN (SELECT * FROM tabla2) as nombre
ON nombre.id = tabla1.id

Subconsultas desde FROM


Ej.
Obtener el id de los productos que se hayan
vendido mas de 30 veces

Subconsultas desde FROM


SELECT id FROM (
SELECT id, count(*) as cantidad
FROM producto p
JOIN compra c ON c.id_prod = p.id
GROUP BY id) as cantidad_compras
WHERE cantidad_compras.cantidad > 30

Subconsulta vs JOIN
Es posible obtener el mismo resultado con una
subconsulta que con un JOIN.
Si bien se obtiene el mismo resultado, se tiene
mejor performance con operaciones de JOIN.
Por otra parte, si se prefiere usar subconsultas
en lugar de JOINs, dicha situacion se puede
solucionar mediante la creacion de indices (poco
ortodoxo).

Subconsulta vs JOIN
Sintaxis de JOIN:
SELECT nombre, apellido, fecha
FROM Persona p
JOIN compra c ON p.ci = p.ci_per

Sintaxis de subconsulta:
SELECT nombre, apellido, fecha
FROM persona
WHERE p.ci IN (
SELECT ci_per FROM compra
)

Vistas
Una vista es una tabla virtual que se origina con
una operacin de SELECT.
Esta formado por los mismos elementos de una
tabla: nombre, columnas y filas.
Se puede tanto leer sus filas, como manipularlas.

Vistas
Una vista esta compuesta por el resultado de una
consulta de cualquier tipo:

Columnas de una o varias tablas


Funciones agregadas
Valores constantes
Resultado de calculos

Vistas
Una vista esta compuesta por el resultado de una
consulta de cualquier tipo:

Columnas de una o varias tablas


Funciones agregadas
Valores constantes
Resultado de calculos

Vistas
Una vista esta compuesta por el resultado de una
consulta de cualquier tipo:

Columnas de una o varias tablas


Funciones agregadas
Valores constantes
Resultado de calculos

Vistas
Tabla Funcionarios

Vista usuarios

Vistas
Usos:
Simplificar o personalizar la percepcion que tiene
cada usuario de la base de datos.
Omitir datos sensibles o innecesarios:
Sueldos
Contraseas
N de tarjeta de credito

Vistas
Usos:
Seguridad:
Permitir solo acceso a las vistas
No permitir acceso a las tablas involucradas

Performance:
Crear una vista de una consulta compleja que genera
mucha carga en el motor, y que a su vez es
recurrente.

Vistas
Sintaxis:
CREATE VIEW nombre [(columnas])
AS SENTENCIA_SELECT
[WITH CHECK OPTION]

Vistas
La clausula WITH CHECK OPTION implica que
solo se pueden aadir registros a la vista que
mantengan las condiciones del WHERE al
momento de crearla.
Se puede opcionalmente definir un nombre
personalizado para las columnas de la vista, en
lugar de usar el resultado del SELECT.

Vistas
Ej.
Grupo(ID, Grado,Letra, Turno, CI_Adscripto)
Adscripto(CI, Nombre, Apellido, Telefono, Mail)
Crear una vista que indique el grupo, turno,
nombre completo y telefono de los adscriptos.

Vistas
CREATE VIEW adscripcion
AS
SELECT Grado || Letra as Nom_Grupo, Turno,
Nombre, Apellido, Telefono FROM Grupo g
JOIN Adscripto a ON g.ci_adscripto = a.ci

El operador || concatena valores en uno solo

Vistas
Al modificar el contenido de una vista (INSERT,
UPDATE, DELETE), se modifica el contenido de
la tabla original.
Para que una vista sea actualizable se debe tener
una relacion uno a uno entre las filas de la tabla
y las filas de la vista, y las columnas omitidas
deben permitir valores nulos, en el caso de
INSERT.

Vistas
Una vista no es modificable si contiene:
Funciones agregadas (SUM, MIN, MAX, COUNT,
etc.)
DISTINCT
GROUP BY y/o HAVING
Una subconsulta en la lista de columnas del
SELECT
Join
Una vista no actualizable en la clusula FROM.
Funciones de informix

Vistas
Los nombres de las columnas de las vistas
pueden coincidir con los nombres de las
columnas de las tablas referenciadas.
Las columnas que son resultado de operaciones
o funciones de agregado, se les debe especificar
el nombre de columna en la vista, si no se uso el
operador AS en el select.

Vistas
Para eliminar una vista, usamos DROP VIEW:
DROP VIEW nombre.

El usuario debe tener permiso de RESOURCE


para poder eliminar una vista.