Base de datos I. Guía 8 1 Facultad: Ingeniería Escuela: Computación Asignatura: Base de datos I Tema: SUBCONSULTAS Y CREACION DE VISTAS. Objetivo Específico Definir que es una subsonsulta Utilizar vistas para seguridad de los datos Materiales Equipo y Computadora con SQL Server 2008. Guía Número 8 Introducción Teórica ¿Qué es una subconsulta? Una subconsulta es una consulta T-SQL normal anidada dentro de otra consulta, se crean utilizando paréntesis en una instrucción SELECT que sirve como base para cualquier parte de los datos o de la condición de otra consulta. Normalmente las subconsultas se utilizan para satisfacer una o un par de las siguientes necesidades: Desglosar una consulta en una serie de pasos lógicos. Proporcionar un listado que va a ser el destino de una cláusula WHERE con [IN | EXISTS |ANY | ALL]. Proporcionar una búsqueda dirigida por cada registro individual de una consulta principal. Crear una subconsulta anidada. Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la cláusula WHERE (por ejemplo) de otra subconsulta que a su vez forma parte de otra consulta principal. En la práctica, una consulta consume mucho más tiempo y memoria cuando se incrementa el número de niveles de anidamiento. La consulta resulta también más difícil de leer , comprender y mantener cuando contiene más de uno o dos niveles de 2 Base de datos I, Guía 8 subconsultas. Ejemplo 1: SELECT numemp, nombre FROM empleados WHERE numemp = (SELECT rep FROM pedidos WHERE clie = (SELECT numclie FROM clientes WHERE nombre = 'Julia Antequera')) En este ejemplo, por cada línea de pedido se calcula la subconsulta de clientes, y esto se repite por cada empleado, en el caso de tener 10 filas de empleados y 200 filas de pedidos (tablas realmente pequeñas), la subconsulta más interna se ejecutaría 2000 veces (10 x 200). Evidentemente, la sintaxis exacta variará, no sólo por sustituir la lista de selección y los nombres exactos de las tablas, sino también porque tenemos uniones de múltiples tablas en la consulta interior, en la exterior o en ambas. Consultas anidadas utilizando instrucciones SELECT: de un solo valor vamos a practicar un ejemplo explicito. Supongamos, por ejemplo, que deseamos conocer los ProductID (ID de productos) de todos los artículos vendidos el primer día que se compró cualquier producto desde el sistema. Si ya sabemos cuál es el primer día en que se insertó un pedido en el sistema, no habrá ningún problema; la consulta sería como la siguiente: USE NORTHWIND SELECT DISTINCT (o.OrderDate), od.ProductID FROM Orders o INNER JOIN [Order Details] od ON o.OrderID = od.OrderID WHERE OrderDate = ' 1996/7/4' --Esta es la primera fecha de un pedido en el sistema Pero ahora supongamos, por ejemplo, que depuramos regularmente los datos de nuestro sistema y deseamos seguir haciendo la misma pregunta como parte de un informe automatizado. Como se va a automatizar, no podemos ejecutar una consulta para buscar cual es la primera fecha en el sistema e insertarla manualmente en nuestra consulta, lo mejor es automatizar el procedimiento. USE NORTHWIND SELECT DISTINCT o.OrderDate, od.ProductID FROM Orders o INNER JOIN [Order Details] od ON o.OrderID = od.OrderID WHERE OrderDate = (SELECT MIN(OrderDate) FROM Orders) Base de datos I. Guía 8 3 Consultas anidadas utilizando subconsultas que devuelven: Múltiples valores: La consulta que vamos a realizar en estos momentos es para buscar una lista de todas las tiendas que tienen registros de descuento. Las tiendas se encuentran en una tabla denominada Stores (Tiendas). Los descuentos están en una tabla denominada discounts (descuentos). USE PUBS SELECT stor_id, stor_name FROM Stores WHERE stor_id IN (SELECT stor_id FROM Discounts) Mezclar tipos de datos: CAST y CONVERT Podrá ver CAST y CONVERT utilizadas con mucha frecuencia. Considerando que vamos a utilizar con frecuencia estas dos funciones éste es el momento ideal para examinarlas con más detalle para saber lo que pueden hacer por nosotros. Tanto CAST como CONVERT ejecutan conversiones de tipos de datos. En su mayoría, ambas hacen lo mismo, exceptuando a CONVERT que también realiza algunas conversiones de formatos de fecha que CAST no ofrece. Vamos a examinar la sintaxis de ambas funciones: CAST (expresión AS tipo-de-datos) CONVERT (tipo-de-datos, expresión [, estilo]) CAST y CONVERT pueden tratar una amplia variedad de conversiones de tipos de datos que vamos a necesitar cuando SQL Server no lo haga implícitamente por nosotros. Por ejemplo, convertir un número en una cadena es una necesidad muy común. use Northwind SELECT 'El cliente ha realizado la siguiente orden' + OrderID FROM Orders WHERE CustomerID = 'ALFKI' Nos va a producir un error: Pero si cambiamos el código para que convierta primero el número: SELECT 'El cliente ha realizado la siguiente orden: ' + CAST (OrderID AS varchar) FROM Orders WHERE CustomerID = 'ALFKI' Observe que con CAST no tenemos el mismo control sobre el formato de fechas que con CONVERT. Por ejemplo: SELECT OrderDate, CONVERT (varchar (12), OrderDate, 111) AS ‘Convertido’ FROM Orders WHERE OrderID = 11050 4 Base de datos I, Guía 8 Es un resultado algo diferente de CAST. De hecho, podríamos haber convertido a uno de los formatos de año de dos dígitos. SELECT OrderDate, CONVERT(varchar(12), OrderDate, 5) AS “Convertido” FROM Orders WHERE OrderID = 11050 Para elegir el formato de fecha que deseamos, lo que tenemos que hacer es suministrar un código al final de la función CONVERT. (111 en el ejemplo anterior nos habría proporcionado el estándar japonés, con un año de cuatro dígitos; 5 es el estándar italiano, con un año de dos dígitos). Los códigos de 100 son para años de cuatro dígitos; los códigos menores que 100 (con algunas excepciones) son para años de dos dígitos. Los formatos disponibles se pueden encontrar en el tema CONVERT o CASE de los libros en pantalla de SQL Server. PERTENENCIA A CONJUNTO IN Examina si el valor de la expresión es uno de los valores incluidos en la lista de valores SELECT numemp, nombre, oficina FROM empleados WHERE oficina IN (12,14,16) SELECT numemp, nombre FROM empleados WHERE (oficina = 12) OR (oficina = 14) OR (oficina = 16) Lista los empleados de las oficinas 12, 14 y 16 Obtenemos lo mismo que en el ejemplo anterior. Los paréntesis son opcionales La subconsulta debe generar una única columna y las filas que sean. Si la subconsulta no produce ninguna fila, el test da falso. Sintaxis: SELECT numemp, nombre, oficina FROM empleados WHERE oficina IN (SELECT oficina FROM oficinas WHERE region = 'este') Con la subconsulta se obtiene la lista de los números de oficina del este y la consulta principal obtiene los empleados cuyo número de oficina sea uno de los números de oficina del este. Por lo tanto lista los empleados de las oficinas del este. Vistas Las vistas tiene una tendencia a ser utilizadas mucho o poco: en raras ocasiones se utilizan en su justa medida. Las vistas se podrían utilizar para: 1) Reducir la complejidad aparente de la base de datos para los usuarios finales Base de datos I. Guía 8 5 2) Prevenir la selección de columnas confidenciales a la vez que permite el acceso a otros datos importantes En el fondo, una vista no es más que una consulta almacenada. lo extraordinario es que podemos combinar y hacer corresponder datos desde tablas base (o desde otras vistas) para crear lo que, en general, funciona como cualquier otra tabla base. Ejemplo 1: USE northwind CREATE VIEW Categorias AS SELECT CategoryID, CategoryName, Description FROM Categories Para llamar a la vista creada: SELECT * FROM Categorias Ejemplo 2: CREATE VIEW Vista_Products AS SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice FROM Products Para llamar a la vista creada: SELECT * FROM Vista_Products Si queremos modificar la vista del ejemplo 2 agregándole un nuevo campo, lo podemos hacer con el comando ALTER de la siguiente manera ALTER VIEW Vista_Products AS SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice,UnitsInStock FROM Products Las vistas se pueden utilizar como tablas. Para eliminar una vista podemos utilizar DROP. Ejemplo: DROP VIEW Vista_Products Se pueden tambien utilizar vistas con combinaciones de tablas. Base de datos I, Guía 8 6 Procedimiento Realice los siguientes ejercicios sin utilizar Join, solo subconsultas. Bibliografía 1. Escriba un script utilizando subconsulta, liste los empleados de la editorial (pub_name) New Moon Books. La base a utilizar es PUBS y las tablas son Guía 1employee y publishers. 2. Haga una consulta haciendo uso de subconsultas, que liste el nombre de los procutos (ProductID, ProductName de la tabla product) que tengan una cantidad(quantity de la tabla [Order Details]), de pedido mayor a 115 3. Cree las vistas que contengan las siguientes consultas. Realizar una consulta que muestre los siguientes campos: 1) de la tabla HumanResources.EmployeeAddress el campo EmployeeID 2) de la tabla Person.Address los campos AddressLine1 y PostalCode 3) de la tabla Person.StateProvince los campos StateProvinceID y nameDe la base de datos AdventureWorks Realizar una consulta que muestre los siguientes campos: 1) de la tabla Customers el campo CustomerID. 2) de la tabla Orders el campo OrderDate. 3) de la tabla Employees los campos FirstName, LastName y BirthDate de la base de datos Northwind. Investigación Complementaria Investigar que son los Procedimientos Almacenados en SQL Server. Guía 3 Guía 4 fía Bibliografía Guía 3 Francisco Charte Ojeda, SQL Server 2008. Madrid, España : ANAYA, 2009 1era edición Guía 4 fía Base de datos I. Guía 8 7 SUBCONSULTAS CREACION DE VISTAS Guía Hoja de cotejo: Y 8: Docente: Máquina No:Máquina No: Alumno : Tema: Presentación del programa Máquina No: Alumno: Docente: GL: Docente: GL: GL: Fecha: a EVALUACION % CONOCIMIENTO Del 20 al 30% APLICACIÓN DEL CONOCIMIENTO Del 40% al 60% 1-4 5-7 8-10 Conocimie nto deficient e de los fundament os teóricos Conocimiento y explicación incompleta de los fundamentos teóricos Conocimiento completo y explicación clara de los fundamentos teóricos No tiene actitud proactiva . Actitud propositiva y con propuestas no aplicables al contenido de la guía. Tiene actitud proactiva y sus propuestas son concretas. ACTITUD Del 15% al 30% TOTAL 100% Nota 8 1