fisica

10
SUBCONSULTAS. Una subconsulta es una consulta anidada en una instrucción SELECT, INSERT, UPDATE o DELETE, o bien en otra subconsulta. Las subconsultas se pueden utilizar en cualquier parte en la que se permita una expresión. En este ejemplo, se utiliza una subconsulta como una expresión de columna llamada MaxUnitPrice en una instrucción SELECT. USE AdventureWorks2008R2; GO SELECT Ord.SalesOrderID, Ord.OrderDate, (SELECT MAX(OrdDet.UnitPrice) FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice FROM AdventureWorks2008R2.Sales.SalesOrderHeader AS Ord Se llama también subconsulta a una consulta o selección interna, mientras que la instrucción que contiene una subconsulta también es conocida como consulta o selección externa. Muchas de las instrucciones Transact-SQL que incluyen subconsultas se pueden formular también como combinaciones. Otras preguntas se pueden formular sólo con subconsultas. En Transact-SQL, normalmente no hay diferencias de rendimiento entre una instrucción que incluya una subconsulta y una versión semánticamente equivalente que no la incluya. Sin embargo, en algunos casos en los que se debe comprobar la existencia de un elemento, una combinación produce mejores resultados. De lo contrario, se debe procesar la consulta anidada para cada resultado de la consulta externa con el fin de garantizar la eliminación de los duplicados. En tales casos, la utilización de combinaciones producirá mejores resultados. A continuación aparece un ejemplo que muestra una subconsulta SELECT y una combinación SELECT que devuelven el mismo conjunto de resultados: /* SELECT statement built using a subquery. */ SELECT Name FROM AdventureWorks2008R2.Production.Product WHERE ListPrice = (SELECT ListPrice FROM AdventureWorks2008R2.Production.Product WHERE Name = 'Chainring Bolts' ); /* SELECT statement built using a join that returns the same result set. */ SELECT Prd1. Name FROM AdventureWorks2008R2.Production.Product AS Prd1 JOIN AdventureWorks2008R2.Production.Product AS Prd2 ON (Prd1.ListPrice = Prd2.ListPrice) WHERE Prd2. Name = 'Chainring Bolts'; Una subconsulta anidada en la instrucción externa SELECT tiene los componentes siguientes:

description

fisica

Transcript of fisica

SUBCONSULTAS.Una subconsulta es una consulta anidada en una instruccin SELECT, INSERT, UPDATE o DELETE, o bien en otra subconsulta. Las subconsultas se pueden utilizar en cualquier parte en la que se permita una expresin.

En este ejemplo, se utiliza una subconsulta como una expresin de columna llamadaMaxUnitPriceen una instruccinSELECT.USE AdventureWorks2008R2;GOSELECT Ord.SalesOrderID, Ord.OrderDate, (SELECT MAX(OrdDet.UnitPrice) FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPriceFROM AdventureWorks2008R2.Sales.SalesOrderHeader AS OrdSe llama tambin subconsulta a una consulta o seleccin interna, mientras que la instruccin que contiene una subconsulta tambin es conocida como consulta o seleccin externa.Muchas de las instrucciones Transact-SQL que incluyen subconsultas se pueden formular tambin como combinaciones. Otras preguntas se pueden formular slo con subconsultas. En Transact-SQL, normalmente no hay diferencias de rendimiento entre una instruccin que incluya una subconsulta y una versin semnticamente equivalente que no la incluya. Sin embargo, en algunos casos en los que se debe comprobar la existencia de un elemento, una combinacin produce mejores resultados. De lo contrario, se debe procesar la consulta anidada para cada resultado de la consulta externa con el fin de garantizar la eliminacin de los duplicados. En tales casos, la utilizacin de combinaciones producir mejores resultados. A continuacin aparece un ejemplo que muestra una subconsulta SELECT y una combinacin SELECT que devuelven el mismo conjunto de resultados:/* SELECT statement built using a subquery. */SELECT NameFROM AdventureWorks2008R2.Production.ProductWHERE ListPrice = (SELECT ListPrice FROM AdventureWorks2008R2.Production.Product WHERE Name = 'Chainring Bolts' );

/* SELECT statement built using a join that returns the same result set. */SELECT Prd1. NameFROM AdventureWorks2008R2.Production.Product AS Prd1 JOIN AdventureWorks2008R2.Production.Product AS Prd2 ON (Prd1.ListPrice = Prd2.ListPrice)WHERE Prd2. Name = 'Chainring Bolts';Una subconsulta anidada en la instruccin externa SELECT tiene los componentes siguientes: Una consulta SELECT normal, que incluye los componentes normales de la lista de seleccin. Una clusula normal FROM que incluye uno o varios nombres de tablas o vistas. Una clusula opcional WHERE. Una clusula opcional GROUP BY. Una clusula opcional HAVING.La consulta SELECT de una subconsulta se presenta siempre entre parntesis. No puede incluir una clusula COMPUTE o FOR BROWSE y slo puede incluir una clusula ORDER BY cuando se especifica tambin una clusula TOP.Una subconsulta puede anidarse en la clusula WHERE o HAVING de una instruccin externa SELECT, INSERT, UPDATE o DELETE, o bien en otra subconsulta. Se puede disponer de hasta 32 niveles de anidamiento, aunque el lmite vara dependiendo de la memoria disponible y de la complejidad del resto de las expresiones de la consulta. Las consultas individuales no permiten anidamientos de ms de 32 niveles. Una subconsulta puede aparecer en cualquier parte en la que se pueda usar una expresin, si devuelve un solo valor.Si una tabla slo aparece en una subconsulta y no en la consulta externa, las columnas de esa tabla no se podrn incluir en la salida (la lista de seleccin de la consulta externa).Las instrucciones que incluyen una subconsulta normalmente tienen uno de estos formatos: WHEREexpression[NOT] IN(subquery) WHEREexpression comparison_operator[ANY | ALL](subquery) WHERE [NOT] EXISTS(subquery)En algunas instrucciones Transact-SQL, la subconsulta se puede evaluar como si fuera una consulta independiente. Conceptualmente, los resultados de la subconsulta se sustituyen en la consulta externa, aunque en realidad sta no es la forma en la que MicrosoftSQL Server procesa las instrucciones Transact-SQL con subconsultas.Hay tres tipos bsicos de subconsultas, que son las siguientes: Las que operan en listas especificadas con IN o modificadas por un operador de comparacin mediante ANY o ALL. Las que se especifican con un operador de comparacin sin modificar y deben devolver un solo valor. Las que son pruebas de existencia especificadas con EXISTS.

Reglas de las subconsultasLas subconsultas estn sujetas a las restricciones siguientes: La lista de seleccin de una subconsulta que se especifica con un operador de comparacin, slo puede incluir un nombre de expresin o columna (excepto EXISTS e IN, que operan en SELECT * o en una lista respectivamente). Si la clusula WHERE de una consulta externa incluye un nombre de columna, debe ser compatible con una combinacin con la columna indicada en la lista de seleccin de la subconsulta. Los tipos de datosntext,textyimageno estn permitidos en las listas de seleccin de subconsultas. Puesto que deben devolver un solo valor, las subconsultas que se especifican con un operador de comparacin sin modificar (no seguido de la palabra clave ANY o ALL) no pueden incluir las clusulas GROUP BY y HAVING. La palabra clave DISTINCT no se puede usar con subconsultas que incluyan GROUP BY. No se pueden especificar las clusulas COMPUTE e INTO. Slo se puede especificar ORDER BY si se especifica tambin TOP. Una vista creada con una subconsulta no se puede actualizar. La lista de seleccin de una subconsulta especificada con EXISTS, por convencin, tiene un asterisco (*) en lugar de un solo nombre de columna. Las reglas de una subconsulta especificada con EXISTS son idnticas a las de una lista de seleccin estndar, porque este tipo de subconsulta crea una prueba de existencia y devuelve TRUE o FALSE en lugar de datos.

Calificar nombres de columna en subconsultasEn el siguiente ejemplo, la columnaCustomerIDde la clusula WHERE de la consulta externa est calificada implcitamente por el nombre de tabla de la clusula FROM de la consulta externa,Sales.Store. La referencia aCustomerIDen la lista de seleccin de la subconsulta est calificada por la clusula FROM de la subconsulta, es decir, por la tablaSales.Customer.USE AdventureWorks2008R2;GOSELECT NameFROM Sales.StoreWHERE BusinessEntityID NOT IN (SELECT CustomerID FROM Sales.Customer WHERE TerritoryID = 5)La regla general es que los nombres de columna de una instruccin estn calificados implcitamente por la tabla a la que se hace referencia en la clusula FROM del mismo nivel. Si una columna no existe en la tabla a la que se hace referencia en la clusula FROM de una subconsulta, la tabla a la que se hace referencia en la clusula FROM de la consulta externa la califica implcitamente.sta es la consulta en la que se han especificado estos supuestos implcitos:USE AdventureWorks2008R2;GOSELECT NameFROM Sales.StoreWHERE Sales.Store.BusinessEntityID NOT IN (SELECT Sales.Customer.CustomerID FROM Sales.Customer WHERE TerritoryID = 5)Nunca est de ms indicar explcitamente el nombre de la tabla y siempre se pueden anular los supuestos implcitos acerca de los nombres de tabla con calificaciones explcitas.

ADVERTENCIA

Si se hace referencia a una columna en una subconsulta que no existe en la tabla a la que se hace referencia en la clusula FROM de la subconsulta, pero que existe en una la tabla a la que se hace referencia en la clusula FROM de la consulta externa, la consulta se ejecuta sin errores. SQL Server califica implcitamente la columna en la subconsulta con el nombre de la tabla en la consulta externa.

Tipos de subconsultaLas subconsultas se pueden especificar en muchos sitios: Con alias Para obtener ms informacin, veaSubconsultas con alias. Con IN o NOT IN. Para obtener ms informacin, veaSubconsultas con INySubconsultas con NOT IN. En las instrucciones UPDATE, DELETE e INSERT. Para obtener ms informacin, veaSubconsultas en las instrucciones UPDATE, DELETE e INSERT. Con los operadores de comparacin. Para obtener ms informacin, veaSubconsultas con operadores de comparacin. Con ANY, SOME o ALL. Para obtener ms informacin, veaOperadores de comparacin modificados por ANY, SOME o ALL. Con EXISTS o NOT EXISTS. Para obtener ms informacin, veaSubconsultas con EXISTSySubconsultas con NOT EXISTS. En lugar de una expresin. Para obtener ms informacin, veaSubconsultas usadas en lugar de una expresin.

Subconsultas correlativas

Se pueden evaluar muchas consultas mediante la ejecucin de la subconsulta una vez y la sustitucin del valor o valores resultantes en la clusula WHERE de la consulta externa. En las consultas que incluyen una subconsulta correlativa (conocida tambin como una consulta repetitiva), la subconsulta depende de la consulta externa para sus valores. Esto significa que la subconsulta se ejecuta varias veces, una vez por cada fila que pueda ser seleccionada por la consulta externa.Esta consulta recupera una instancia del nombre y apellido de cada empleado cuya bonificacin en la tablaSalesPersones 5000 y cuyos nmeros de identificacin de empleado coinciden en las tablasEmployeeySalesPerson.USE AdventureWorks2008R2;GOSELECT DISTINCT c.LastName, c.FirstName, e.BusinessEntityID FROM Person.Person AS c JOIN HumanResources.Employee AS eON e.BusinessEntityID = c.BusinessEntityID WHERE 5000.00 IN (SELECT Bonus FROM Sales.SalesPerson sp WHERE e.BusinessEntityID = sp.BusinessEntityID) ;GOEl conjunto de resultados es el siguiente.Apellido Nombre BusinessEntityID-------------------------- ---------- ------------Ansman-Wolfe Pamela 280Saraiva Jos 282(2 filas afectadas)La subconsulta anterior de esta instruccin no se puede evaluar independientemente de la consulta externa. Necesita un valor paraEmployee.BusinessEntityID, pero este valor cambia a medida que SQL Server examina diferentes filas enEmployee.As es, exactamente, como se evala esta consulta: SQL Server tiene en cuenta cada fila de la tablaEmployeepara incluirla en el resultado sustituyendo el valor de cada fila en la consulta interna. Por ejemplo, si SQL Server examina primero la fila de Syed Abbas, la variableEmployee.BusinessEntityIDtoma el valor 285, que SQL Server sustituye en la consulta interna.USE AdventureWorks2008R2;GOSELECT BonusFROM Sales.SalesPersonWHERE BusinessEntityID = 285;El resultado es 0 (Syed Abbas no recibi una bonificacin porque no es un vendedor), con lo que la consulta externa se evala como:USE AdventureWorks2008R2;GOSELECT LastName, FirstNameFROM Person.Person AS c JOIN HumanResources.Employee AS eON e.BusinessEntityID = c.BusinessEntityID WHERE 5000 IN (0.00)Puesto que esto es falso, la fila de Syed Abbas no se incluye en los resultados. Realice el mismo procedimiento con la fila de Pamela Ansman-Wolfe. Observe que esta fila se incluye en el resultado.Las subconsultas correlativas tambin pueden incluir funciones con valores de tabla en la clusula FROM mediante la referencia a las columnas de una tabla de la consulta externa como un argumento de la funcin con valores de tabla. En este caso, para cada fila de la consulta externa, la funcin con valores de tabla se evala segn la subconsulta.

TEMA :INDICESConceptos bsicos de los ndicesUn ndice es una estructura de disco asociada con una tabla o una vista que acelera la recuperacin de filas de la tabla o de la vista. Un ndice contiene claves generadas a partir de una o varias columnas de la tabla o la vista. Dichas claves estn almacenadas en una estructura (rbol b) que permite que SQL Server busque de forma rpida y eficiente la fila o filas asociadas a los valores de cada clave.Una tabla o una vista puede contener los siguientes tipos de ndices: Agrupado Los ndices agrupados ordenan y almacenan las filas de los datos de la tabla o vista de acuerdo con los valores de la clave del ndice. Son columnas incluidas en la definicin del ndice. Slo puede haber un ndice clster por cada tabla, porque las filas de datos slo pueden estar ordenadas de una forma. La nica ocasin en la que las filas de datos de una tabla estn ordenadas es cuando la tabla contiene un ndice clster. Cuando una tabla tiene un ndice clster, la tabla se denomina tabla agrupada. Si una tabla no tiene un ndice clster, sus filas de datos estn almacenadas en una estructura sin ordenar denominada montn. No agrupado Los ndices no agrupados tienen una estructura separada de las filas de datos. Un ndice no agrupado contiene los valores de clave de ndice no agrupado y cada entrada de valor de clave tiene un puntero a la fila de datos que contiene el valor clave. El puntero de una fila de ndice no agrupado hacia una fila de datos se denomina localizador de fila. La estructura del localizador de filas depende de si las pginas de datos estn almacenadas en un montn o en una tabla agrupada. Si estn en un montn, el localizador de filas es un puntero hacia la fila. Si estn en una tabla agrupada, el localizador de fila es la clave de ndice agrupada. Puede agregar columnas sin clave al nivel hoja de un ndice no agrupado con el fin de eludir los lmites existentes para las claves de ndice, 900 bytes y columnas de 16 claves, as como para ejecutar consultas indizadas y totalmente cubiertas. Para obtener ms informacin, veandice con columnas incluidas.Para obtener ms informacin acerca de la arquitectura de ndices, veaArquitectura de estructuras de tablas y datos de ndices.Tanto los ndices agrupados como los no agrupados pueden ser nicos. Esto significa que dos filas no pueden tener el mismo valor para la clave de ndice. De lo contrario, el ndice no es nico y varias filas pueden compartir el mismo valor de clave. Para obtener ms informacin, veaDirectrices para disear ndices nicos.Los ndices se mantienen automticamente para una tabla o vista cuando se modifican los datos de la tabla.ndices y restriccionesLos ndices se crean automticamente cuando las restricciones PRIMARY KEY y UNIQUE se definen en las columnas de tabla. Por ejemplo, cuando cree una tabla e identifique una determinada columna como la clave primaria, Motor de base de datos crea automticamente una restriccin PRIMARY KEY y un ndice en esa columna. Para obtener ms informacin, veaCrear ndices (motor de base de datos).Cmo utiliza los ndices el optimizador de consultasLos ndices bien diseados pueden reducir las operaciones de E/S de disco y consumen menos recursos del sistema, con lo que mejoran el rendimiento de la consulta. Los ndices pueden ser tiles para diversas consultas que contienen instrucciones SELECT, UPDATE, DELETE o MERGE. Fjese en la consultaSELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250en la base de datos AdventureWorks2008R2. Cuando se ejecuta la consulta, el optimizador de consultas evala cada mtodo disponible para recuperar datos y selecciona el mtodo ms eficiente. El mtodo puede ser un recorrido de la tabla o puede ser recorrer uno o ms ndices si existen.Al realizar un recorrido de la tabla, el optimizador de consultas leer todas las filas de la tabla y extraer las filas que cumplen con los criterios de la consulta. Un recorrido de la tabla genera muchas operaciones de E/S de disco y puede consumir recursos. No obstante, puede ser el mtodo ms eficaz si, por ejemplo, el conjunto de resultados de la consulta es un porcentaje elevado de filas de la tabla.Cuando el optimizador de consultas utiliza un ndice, busca en las columnas de clave de ndice, busca la ubicacin de almacenamiento de las filas que necesita la consulta y extrae las filas coincidentes de esa ubicacin. Generalmente, la bsqueda del ndice es mucho ms rpida que la bsqueda de la tabla porque, a diferencia de la tabla, un ndice frecuentemente contiene muy pocas columnas por fila y las filas estn ordenadas.El optimizador de consultas normalmente selecciona el mtodo ms eficaz cuando ejecuta consultas. No obstante, si no hay ndices disponibles, el optimizador de consultas debe utilizar un recorrido de la tabla. Su tarea consiste en disear y crear los ndices ms apropiados para su entorno de forma que el optimizador de consultas disponga de una seleccin de ndices eficaces entre los que elegir. SQL Server proporciona elAsistente para la optimizacin de motor de base de datoscomo ayuda en el anlisis del entorno de la base de datos y en la seleccin de los ndices adecuados.

En la tabla siguiente se indican los tipos de ndice disponibles en SQL Server y se proporcionan vnculos a informacin adicional.

TIPO DE INDICE

AGRUPADO

Un ndice clster ordena y almacena las filas de datos de la tabla o vista por orden en funcin de la clave del ndice clster. El ndice clster se implementa como una estructura de rbol b que admite la recuperacin rpida de las filas a partir de los valores de las claves del ndice clster.

INNER JOINS

Los Inner joins (combinacin interna) retornan solo las columnas que coincidan en la condicin de unin. Aunque un Inner Join se puede especificar en cualquiera de la clausulas FROM o WHERE, es recomendable especificar el JOIN en la clusula FROM.A partir de aqu utilizaremos las bases de datos Northwind y AdventureWorks indistintamente, para diferenciar las consultas utilizaremos la clusulaUSEpara especificar la base de datos con la que trabajaremos.

Ejemplo 1:

El siguiente ejemplo retorna el nombre de producto, cantidad por unidad, precio unitario de la tablaProductos, y el nombre de categora y la descripcin de la tablaCategorasen la base de datos Northwind.Primero veamos el tipo de relacin entre estas tablas, observamos que entreProductosyCategorasexiste una relacin uno a varios, (no olviden que la tabla con clave externa, fornea o FK es la que esta cerca al smbolo de ocho) y el campo con el que se relacionan es:Products.CategoryID(Foreign Key) conCategories.CategoryID(Primary Key).

Ahora para la consulta en la clausula SELECT agregamos las columnas que necesitamos, las tablas junto al operador INNER JOIN que es el tipo de unin y finalmente la condicinUSE Northwind;SELECT ProductName,QuantityPerUnit, UnitPrice,CategoryName, DescriptionFROM dbo.Categories INNER JOIN dbo.ProductsON dbo.Categories.CategoryID = dbo.Products.CategoryID;

Con el uso de alias la misma consulta quedara as: