Está en la página 1de 9

U3

SUBCONSULTAS
UNA SUBCONSULTA PUEDE ESTAR EN (6):
*WHERE y HAVING de un SELECT principal
*Dentro de otra subconsulta (se admiten hasta 32 niveles de anidación).
*En lugar de una expresión, siempre que devuelvan un solo valor o una lista de
valores.
*Como columna en la lista del SELECT.

*Retornando un conjunto de registros de varios campos en lugar de una tabla (en el FROM) o
para obtener el mismo resultado que una combinación (JOIN).

*En la cláusula WHERE de las sentencias UPDATE y DELETE

NOTA: Ejemplos de cómo funcionan estos apartados al final de U3.

CARACTERÍSTICAS DE LA SUBCONSULTA(4):
*Debe producir una única columna de datos como resultados. Esto significa que una
subconsulta siempre tiene un único elemento de selección en su cláusula SELECT.
*NO puede ser UNION de varias sentencias SELECT diferentes.
*La cláusula ORDER BY NO puede ser especificada en una subconsulta.
* Los nombres de columna que aparecen en una subconsulta pueden referirse a
columnas de tablas en la consulta principal, esto se denomina referencias externas.
Recuerde: cuando lee consignas del estilo “de ese alumno”, “de esa factura” es un
buen indicio de que necesitará una referencia externa.

NOTAS SOBRE SUBCONSULTAS EN EL WHERE


*En el WHERE, la subconsulta funciona para un proceso de selección de filas. Es una
forma modificada del test de comparación simple.
Tipos de test(4):
*Test de comparación subconsulta: =, < >, <, >, <=, >=. Es una forma modificada del
test de comparación simple. Compara el valor de una expresión con el valor único
producido por una subconsulta, y devuelve un resultado TRUE si la comparación es
cierta.
*Test de pertenencia al conjunto: IN, NOT IN. Es una forma modificada del test de
pertenencia a conjunto simple; compara un único valor de datos con una columna de
valores producida por una subconsulta y devuelve un resultado TRUE si el valor
coincide con uno de los valores de la columna.
*Test de existencia: EXIST, NOT EXIST. Comprueba si una subconsulta produce alguna
fila de resultados; no hay test de comparación simple que se asemeje al test de
existencia, solamente se utiliza con subconsultas. El uso de estos precisa
necesariamente referencia externa en la subconsulta (IMPORTANTE!!).
* Test cuantificados: ANY; ALL. Estos test extienden el de pertenencia al conjunto IN a
otros operadores de comparación como =, <, <=,, >= y <>. Es decir, los ANY y ALL son
IN’s con =, <, <=, >, >= y <>. Si algunas de las comparaciones individuales producen un
resultado TRUE, el test ANY devuelve un resultado TRUE. Si todas las comparaciones
individuales producen un resultado TRUE, el test ALL devuelve un resultado TRUE.

NOTAS SOBRE SUBCONSULTAS EN EL HAVING

*En el HAVING, la subconsulta funciona como parte de la selección de un grupo de filas


efectuada por ésta cláusula. Recuerde que, a diferencia del WHERE, en el HAVING
puede usar calculados. Si necesita, por ejemplo, comparar promedios, la subconsulta
va en el HAVING.
EJEMPLOS DE CÓMO FUNCIONAN LOS APARTADOS DE “UNA SUBCONSULTA PUEDE
ESTAR EN”:

Ejemplo de una subconsulta como parte de una expresión donde se quiere listar el precio de los
artículos y la diferencia de éste con el precio del artículo más caro:
SELECT descipcion,
precio_unit,(SELECT MAX(pre_unitario) FROM articulos)- pre_unitario
'DIFERENCIA'
FROM artículos

Cuando se usa una subconsulta en una columna, por ejemplo: listar el precio actual de los artículos y el
precio histórico vendido más barato:
SELECT descipcion,
pre_unitario 'precio actual',
(SELECT MIN(pre_unitario)
FROM detalle_facturas d
WHERE d.cod_articulo = a.cod_articulo) 'PRECIO HISTORICO'
FROM artículos a

Tabla derivada: Emplea subconsultas que retornan un conjunto de registros de varios


campos en lugar de una tabla y se coloca en la cláusula FROM para que la use un
SELECT externo. La tabla derivada debe ir entre paréntesis y tener un alias para poder
referenciarla. Ejemplo:
SELECT f.nro_factura, fecha, apellido +' '+ nombre 'Cliente', f2.total
FROM facturas f JOIN clientes c ON c.cod_cliente = f.cod_cliente
JOIN (SELECT nro_factura, SUM(precio_unit*cantidad) 'total'
FROM detalle_facturas
GROUP BY nro_factura) AS f2 ON f2.nro_factura = f.nro_factura
WHERE YEAR(fecha)= YEAR(GETDATE())

Ejemplo de WHERE en el UPDATE y DELETE. Para el UPDATE, se quiere aumentar un 5% los precios de
los artículos cuyos precios son inferiores al promedio general.
UPDATE articulos
SET pre_unitario = pre_unitario*1.05
WHERE pre_unitario < (SELECT AVG(pre_unitario)
FROM articulos)

Para el DELETE, se quiere eliminar los clientes que no vinieron nunca.


DELETE clientes
WHERE cod_client NOT IN (SELECT cod_cliente
FROM facturas)

U3
VISTAS
Definición de vista: Una vista ofrece la posibilidad de almacenar una consulta
predefinida como un objeto en una base de datos para usarse posteriormente.
Tabla base: Las tablas consultadas en una vista se denominan tablas base.
Ejemplos de vistas (5):
* Un subconjunto de las filas o columnas de una tabla base.
* Una unión de dos o más tablas base.
* Una combinación de dos o más tablas base.
* Un resumen estadístico de una tabla base.
* Un subconjunto de otra vista o alguna combinación de vistas y tablas base.
Ventajas de usar una vista (5):
*Centrar el interés en los datos de los usuarios: Las vistas crean un entorno controlado
que permite el acceso a datos específicos mientras se oculta el resto. Los usuarios
pueden tratar la presentación de los datos en una vista de forma similar a como lo
hacen en una tabla.

*Enmascarar la complejidad de la base de datos: Las vistas ocultan al usuario la


complejidad del diseño de la base de datos. De este modo, los programadores pueden
cambiar el diseño sin afectar a la interacción entre el usuario y la base de datos.
*Simplificar la administración de los permisos de usuario: En lugar de conceder a los
usuarios permisos para consultar columnas específicas de las tablas base, los
propietarios de las bases de datos pueden conceder permisos para que el usuario sólo
pueda consultar los datos a través de vistas.

*Mejorar el rendimiento: Las vistas le permiten almacenar los resultados de consultas


complejas. Otras consultas pueden utilizar estos resultados resumidos.

*Organizar los datos para exportarse a otras aplicaciones.

¿Con qué se puede crear una vista?: Con el Asistente para creación de vistas, con el
Administrador corporativo de SQL Server o con Transact-SQL.

Restricciones para el uso de CREATE VIEW (4):

*NO se pueden crear vistas temporales ni crear vistas sobre tablas temporales.

*NO se pueden asociar reglas ni valores por defecto a las vistas.

*NO puede combinarse con otras instrucciones en un mismo lote.

*Las vistas NO pueden hacer referencia a más de 1.024 columnas.

¿Cómo hago para encriptar la vista?: Simplemente le metés el WITH ENCRYPTION


después del CREATE. Así:
CREATE VIEW vista_vendedores WITH ENCRYPTION

¿Y para ver el texto que la define?: Ejecutando el procedimiento almacenado del sistema
"sp_helptext" seguido del nombre de la vista:
sp_helptext NOMBREVISTA;

Cosas a recordar para un buen uso de vistas (5):


*Los campos y expresiones de la consulta que define una vista DEBEN tener un
nombre. Se debe colocar nombre de campo cuando es un campo calculado o si hay 2
campos con el mismo nombre.
*Los nombres de los campos y expresiones de la consulta que define una vista DEBEN
ser únicos (no puede haber dos campos o encabezados con igual nombre).
*Si el alias contiene caracteres especiales (espacios, guiones medios, signos como %, #,
? etc.) al consultar la vista deberemos encerrar estos nombres de columnas entre
corchetes (en SQL se hacen automáticamente, pero en el parcial no así que… a tenerlo
en cuenta).

*La diferencia es que se colocan entre paréntesis los encabezados de las columnas que
aparecerán en la vista. Si no los colocamos y empleamos la sintaxis vista
anteriormente, se emplean los nombres de los campos o alias colocados en el SELECT
que define la vista. Los nombres que se colocan entre paréntesis deben ser tantos
como los campos o expresiones que se definen en la vista.

*Si crea una vista con [SELECT *] y luego agrega campos a la estructura de las tablas
involucradas, los nuevos campos no aparecerán en la vista; esto es porque los campos
se seleccionan al ejecutar CREATE VIEW; debe alterar la vista.

Cosas a recordar a la hora de usar ALTER con vistas (3):

*No pueden afectar a más de una tabla consultada.

*No se pueden cambiar los campos resultado de un cálculo.

*Pueden generar errores si afectan a campos a las que la vista no hace referencia.

Nota: Cabe recordar que alterar una vista es un dolor de huevos así que recomiendo
humildemente dropearla y crearla nuevamente.

PROCEDIMIENTOS
Definición de procedimiento: Un procedimiento almacenado es un conjunto de
instrucciones a las que se les da un nombre y se almacenan en el servidor. Permiten
encapsular tareas repetitivas. Recuerde: Un procedimiento almacenado puede hacer
referencia a objetos que no existen al momento de crearlo. Los objetos deben existir
cuando se ejecute el procedimiento almacenado.
Tipos de procedimientos (5):
*Del sistema: Están almacenados en la base de datos "master" y llevan el prefijo "sp_".
*Locales: Los crea el usuario.
*Temporales: pueden ser locales, cuyos nombres comienzan con un signo numeral (#),
o globales, cuyos nombres comienzan con 2 signos numeral (##). Los procedimientos
almacenados temporales locales están disponibles en la sesión de un solo usuario y se
eliminan automáticamente al finalizar la sesión; los globales están disponibles en las
sesiones de todos los usuarios.
*Remotos: Son una característica anterior de SQL Server.
*Extendidos: Se implementan como bibliotecas de vínculos dinámicos (DLL, Dynamic-
Link Libraries), se ejecutan fuera del entorno de SQL Server. Generalmente llevan el
prefijo "xp_".
¿De qué son capaces? (4):
*Contener instrucciones que realizan operaciones en la base de datos y llamar a otros
procedimientos almacenados.
*Aceptar parámetros de entrada.
*Devolver varios parámetros de salida.
*Devolver un valor de estado a un procedimiento.
Ventajas de los procedimientos (6):
*Comparten la lógica de la aplicación con las otras aplicaciones, con lo cual el acceso y
las modificaciones de los datos se hacen en un solo sitio.
*Permiten realizar todas las operaciones que los usuarios necesitan evitando que
tengan acceso directo a las tablas.
*Reducen el tráfico de red; en vez de enviar muchas instrucciones, los usuarios
realizan operaciones enviando una única instrucción.
*Pueden encapsular la funcionalidad del negocio. Las reglas o directivas empresariales
encapsuladas en los procedimientos almacenados se pueden cambiar en una sola
ubicación.
*Apartar a los usuarios de la exposición de los detalles de las tablas de la base de
datos.
*Proporcionar mecanismos de seguridad: los usuarios pueden obtener permiso para
ejecutar un procedimiento almacenado incluso si no tienen permiso de acceso a las
tablas o vistas a las que hace referencia.
Cositas a recordar sobre procedimientos (3):
*Los procedimientos almacenados pueden hacer referencia a tablas, vistas, a
funciones definidas por el usuario, a otros procedimientos almacenados y a tablas
temporales.
*Si un procedimiento almacenado crea una tabla temporal, dicha tabla sólo existe
dentro del procedimiento y desaparece al finalizar el mismo. Lo mismo sucede con las
variables. Las vistas, en cambio, no toman temporales.
* Cuando el procedimiento es ejecutado, deben explicitarse valores para cada uno de
los parámetros (en el orden que fueron definidos), a menos que se haya definido un
valor por defecto, en tal caso, pueden omitirse.
*Los procedimientos se pueden alterar (ALTER) y dropear (DROP) como hemos hecho
con las vistas.
*Estos es una boludez, pero quizá los agarra desprevenidos: podemos abreviar
PROCEDURE y EXECUTE como PROC y EXEC.
*Respetá el tipo de dato. Si lo declaraste como X no lo ejecutes como Y.
Condiciones de anidamiento para un procedimiento (4):
*Los procedimientos almacenados se pueden anidar hasta 32 niveles.
*El nivel actual de anidamiento se almacena en la función del sistema @@nestlevel.
*Si un procedimiento almacenado llama a otro, éste puede obtener acceso a todos los
objetos que cree el primero, incluidas las tablas temporales.
*Los procedimientos almacenados anidados pueden ser recursivos. Por ejemplo, el
procedimiento almacenado A puede llamar al procedimiento almacenado B y éste
puede llamar al procedimiento almacenado A.
Distintos ejemplos de sintaxis para los procedimientos (3): Es muy probable que en el
parcial se juegue con las sintaxis para preguntar si es o no un procedimiento funcional,
por tanto, es necesario saber sus diferentes formas en cuanto a cómo declara las
variables y cómo las ejecuta.
-----------------------------------------------------------
CREATE PROC pa_articulos_precios3
@precio1 money,
@precio2 money
AS
SELECT *
FROM articulos
WHERE pre_unitario BETWEEN @precio1 AND @precio2;
EXEC pa_ articulos_precios3 @precio1 = 50, @precio2 = 100;

----------------------------------------------------------------------

CREATE PROC pa_articulos_precios3


@precio1 money = 0,
@precio2 money = 10000
AS
SELECT *
FROM articulos
WHERE pre_unitario BETWEEN @precio1 AND @precio2;
EXEC pa_articulos_precios3;

CREATE PROC pa_articulos_descripcion


@descripcion VARCHAR(50) = '%',
AS
SELECT *
FROM articulos
WHERE descripcion LIKE @descripcion;
EXEC pa_articulos_descripcion 'P%';

(Procedimientos en el INSERT)
CREATE PROC pa_ofertas
AS
SELECT titulo,autor,editorial,precio
FROM libros
WHERE precio < 50;
La siguiente instrucción ingresa en la tabla "ofertas" el resultado del procedimiento "pa_ofertas":
INSERT INTO ofertas EXEC pa_ofertas;

----------------------------------------------------------------------

ESTO ES LO QUE CONSIDERO MÁS IMPORTANTE Y QUE


PUEDE SALVAR EN EL TEÓRICO (TEÓRICO!!)

HASTA LA PRÓXIMAAAAA

También podría gustarte