0 evaluări0% au considerat acest document util (0 voturi)
74 vizualizări11 pagini
Este documento proporciona numerosos ejemplos del uso de la instrucción SELECT en Transact-SQL. Muestra cómo seleccionar filas y columnas específicas, agregar encabezados de columna y realizar cálculos, usar DISTINCT, crear tablas con SELECT INTO, utilizar subconsultas correlativas y no correlativas, agregar filas con GROUP BY, aplicar filtros con HAVING y combinar distintas cláusulas como GROUP BY, HAVING, WHERE y ORDER BY.
Este documento proporciona numerosos ejemplos del uso de la instrucción SELECT en Transact-SQL. Muestra cómo seleccionar filas y columnas específicas, agregar encabezados de columna y realizar cálculos, usar DISTINCT, crear tablas con SELECT INTO, utilizar subconsultas correlativas y no correlativas, agregar filas con GROUP BY, aplicar filtros con HAVING y combinar distintas cláusulas como GROUP BY, HAVING, WHERE y ORDER BY.
Este documento proporciona numerosos ejemplos del uso de la instrucción SELECT en Transact-SQL. Muestra cómo seleccionar filas y columnas específicas, agregar encabezados de columna y realizar cálculos, usar DISTINCT, crear tablas con SELECT INTO, utilizar subconsultas correlativas y no correlativas, agregar filas con GROUP BY, aplicar filtros con HAVING y combinar distintas cláusulas como GROUP BY, HAVING, WHERE y ORDER BY.
Este tema an no ha recibido ninguna valoracin En este tema se proporcionan ejemplos del uso de la instruccin SELECT. A.Usar SELECT para recuperar filas y columnas En el siguiente ejemplo se muestran tres fragmentos de cdigo. En el primer ejemplo de cdigo, se devuelven todas las filas (no se especifica la clusula WHERE) y todas las columnas (con *) de la tabla Product de la base de datos AdventureWorks2012 . Transact-SQL USE AdventureWorks2012; GO SELECT * FROM Production.Product ORDER BY Name ASC; -- Alternate way. USE AdventureWorks2012; GO SELECT p.* FROM Production.Product AS p ORDER BY Name ASC; GO En este ejemplo se devuelven todas las filas (no se ha especificado la clusula WHERE) y solo un subconjunto de las columnas (Name, ProductNumber, ListPrice) de la tabla Product de la base de datos AdventureWorks2012 . Adems, se agrega un encabezado de columna. Transact-SQL USE AdventureWorks2012; GO SELECT Name, ProductNumber, ListPrice AS Price FROM Production.Product ORDER BY Name ASC; GO En este ejemplo solo se devuelven las filas de Product que tienen una lnea de productos de R y cuyo valor correspondiente a los das para fabricar es inferior a 4. Transact-SQL USE AdventureWorks2012; GO SELECT Name, ProductNumber, ListPrice AS Price FROM Production.Product WHERE ProductLine = 'R' AND DaysToManufacture < 4 ORDER BY Name ASC; GO B.Usar SELECT con encabezados de columna y clculos En los siguientes ejemplos se devuelven todas las filas de la tabla Product. En el primer ejemplo se devuelven las ventas totales y los descuentos de cada producto. En el segundo ejemplo se calculan los beneficios totales de cada producto. Transact-SQL USE AdventureWorks2012; GO SELECT p.Name AS ProductName, NonDiscountSales = (OrderQty * UnitPrice), Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount) FROM Production.Product AS p INNER JOIN Sales.SalesOrderDetail AS sod ON p.ProductID = sod.ProductID ORDER BY ProductName DESC; GO sta es la consulta que calcula el beneficio de cada producto de cada pedido de venta. Transact-SQL USE AdventureWorks2012; GO SELECT 'Total income is', ((OrderQty * UnitPrice) * (1.0 - UnitPriceDiscount)), ' for ', p.Name AS ProductName FROM Production.Product AS p INNER JOIN Sales.SalesOrderDetail AS sod ON p.ProductID = sod.ProductID ORDER BY ProductName ASC; GO C.Usar DISTINCT con SELECT En el siguiente ejemplo se utiliza DISTINCT para evitar la recuperacin de ttulos duplicados. Transact-SQL USE AdventureWorks2012; GO SELECT DISTINCT JobTitle FROM HumanResources.Employee ORDER BY JobTitle; GO D.Crear tablas con SELECT INTO En el primer ejemplo se crea una tabla temporal denominada #Bicycles en tempdb. Transact-SQL USE tempdb; GO IF OBJECT_ID (N'#Bicycles',N'U') IS NOT NULL DROP TABLE #Bicycles; GO SELECT * INTO #Bicycles FROM AdventureWorks2012.Production.Product WHERE ProductNumber LIKE 'BK%'; GO En el segundo ejemplo se crea la tabla permanente NewProducts. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL DROP TABLE dbo.NewProducts; GO ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED; GO
SELECT * INTO dbo.NewProducts FROM Production.Product WHERE ListPrice > $25 AND ListPrice < $100; GO ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL; GO E.Usar subconsultas correlacionadas En el siguiente ejemplo se muestran consultas que son semnticamente equivalentes y se demuestra la diferencia entre la utilizacin de la palabra clave EXISTS y la palabra clave IN. Ambos son ejemplos de subconsultas vlidas que recuperan una instancia de cada nombre de producto cuyo modelo es un jersey de manga larga con logotipo y cuyos nmeros de ProductModelID coinciden en las tablas Product y ProductModel. Transact-SQL USE AdventureWorks2012; GO SELECT DISTINCT Name FROM Production.Product AS p WHERE EXISTS (SELECT * FROM Production.ProductModel AS pm WHERE p.ProductModelID = pm.ProductModelID AND pm.Name LIKE 'Long-Sleeve Logo Jersey%'); GO
-- OR
USE AdventureWorks2012; GO SELECT DISTINCT Name FROM Production.Product WHERE ProductModelID IN (SELECT ProductModelID FROM Production.ProductModel WHERE Name LIKE 'Long-Sleeve Logo Jersey%'); GO En el siguiente ejemplo se utiliza IN en una subconsulta correlativa o repetitiva. Se trata de una consulta que depende de la consulta externa de sus valores. Se ejecuta varias veces, una vez por cada fila que pueda seleccionar la consulta externa. Esta consulta recupera una instancia del nombre y apellido de cada empleado cuya bonificacin en la tabla SalesPerson sea de 5000.00 y cuyos nmeros de identificacin coincidan en las tablas Employee y SalesPerson. Transact-SQL USE AdventureWorks2012; GO SELECT DISTINCT p.LastName, p.FirstName FROM Person.Person AS p JOIN HumanResources.Employee AS e ON e.BusinessEntityID = p.BusinessEntityID WHERE 5000.00 IN (SELECT Bonus FROM Sales.SalesPerson AS sp WHERE e.BusinessEntityID = sp.BusinessEntityID); GO La subconsulta anterior de esta instruccin no se puede evaluar independientemente de la consulta externa. Necesita el valor Employee.EmployeeID, aunque este valor cambia a medida que el Motor de base de datos de SQL Server examina diferentes filas de Employee. Una subconsulta correlativa se puede usar tambin en la clusula HAVING de una consulta externa. En este ejemplo se buscan los modelos cuyo precio mximo es superior al doble de la media del modelo. Transact-SQL USE AdventureWorks2012; GO SELECT p1.ProductModelID FROM Production.Product AS p1 GROUP BY p1.ProductModelID HAVING MAX(p1.ListPrice) >= ALL (SELECT AVG(p2.ListPrice) FROM Production.Product AS p2 WHERE p1.ProductModelID = p2.ProductModelID); GO En este ejemplo se utilizan dos subconsultas correlativas para buscar los nombres de los empleados que han vendido un producto especfico. Transact-SQL USE AdventureWorks2012; GO SELECT DISTINCT pp.LastName, pp.FirstName FROM Person.Person pp JOIN HumanResources.Employee e ON e.BusinessEntityID = pp.BusinessEntityID WHERE pp.BusinessEntityID IN (SELECT SalesPersonID FROM Sales.SalesOrderHeader WHERE SalesOrderID IN (SELECT SalesOrderID FROM Sales.SalesOrderDetail WHERE ProductID IN (SELECT ProductID FROM Production.Product p WHERE ProductNumber = 'BK-M68B-42'))); GO F.Usar GROUP BY En este ejemplo se busca el total de cada pedido de venta de la base de datos. Transact-SQL USE AdventureWorks2012; GO SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail GROUP BY SalesOrderID ORDER BY SalesOrderID; GO Debido a la clusula GROUP BY, solo se devuelve una fila que contiene la suma de todas las ventas por cada pedido de venta. G.Usar GROUP BY con varios grupos En este ejemplo se busca el precio medio y la suma de las ventas anuales hasta la fecha, agrupados por Id. de producto e Id. de oferta especial. Transact-SQL USE AdventureWorks2012; GO SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS [Average Price], SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail GROUP BY ProductID, SpecialOfferID ORDER BY ProductID; GO H.Usar GROUP BY y WHERE En el siguiente ejemplo se colocan los resultados en grupos despus de recuperar nicamente las filas con precios superiores a $1000. Transact-SQL USE AdventureWorks2012; GO SELECT ProductModelID, AVG(ListPrice) AS [Average List Price] FROM Production.Product WHERE ListPrice > $1000 GROUP BY ProductModelID ORDER BY ProductModelID; GO I.Usar GROUP BY con una expresin En este ejemplo se agrupa por una expresin. Puede agrupar por una expresin si sta no incluye funciones de agregado. Transact-SQL USE AdventureWorks2012; GO SELECT AVG(OrderQty) AS [Average Quantity], NonDiscountSales = (OrderQty * UnitPrice) FROM Sales.SalesOrderDetail GROUP BY (OrderQty * UnitPrice) ORDER BY (OrderQty * UnitPrice) DESC; GO J.Usar GROUP BY con ORDER BY En este ejemplo se busca el precio medio de cada tipo de producto y se ordenan los resultados por precio medio. Transact-SQL USE AdventureWorks2012; GO SELECT ProductID, AVG(UnitPrice) AS [Average Price] FROM Sales.SalesOrderDetail WHERE OrderQty > 10 GROUP BY ProductID ORDER BY AVG(UnitPrice); GO K.Usar la clusula HAVING En el primer ejemplo se muestra una clusula HAVING con una funcin de agregado. Agrupa las filas de la tabla SalesOrderDetail por Id. de producto y elimina aquellos productos cuyas cantidades de pedido medias son cinco o menos. En el segundo ejemplo se muestra una clusula HAVING sin funciones de agregado. Transact-SQL USE AdventureWorks2012; GO SELECT ProductID FROM Sales.SalesOrderDetail GROUP BY ProductID HAVING AVG(OrderQty) > 5 ORDER BY ProductID; GO En esta consulta se utiliza la clusula LIKE en la clusula HAVING. USE AdventureWorks2012 ; GO SELECT SalesOrderID, CarrierTrackingNumber FROM Sales.SalesOrderDetail GROUP BY SalesOrderID, CarrierTrackingNumber HAVING CarrierTrackingNumber LIKE '4BD%' ORDER BY SalesOrderID ; GO L.Usar HAVING y GROUP BY En el siguiente ejemplo se muestra el uso de las clusulas GROUP BY, HAVING, WHERE y ORDER BY en una instruccin SELECT. Genera grupos y valores de resumen pero lo hace tras eliminar los productos cuyos precios superan los 25 $ y cuyas cantidades de pedido medias son inferiores a 5. Tambin organiza los resultados por ProductID. Transact-SQL USE AdventureWorks2012; GO SELECT ProductID FROM Sales.SalesOrderDetail WHERE UnitPrice < 25.00 GROUP BY ProductID HAVING AVG(OrderQty) > 5 ORDER BY ProductID; GO M.Usar HAVING con SUM y AVG En el siguiente ejemplo se agrupa la tabla SalesOrderDetail por Id. de producto y solo se incluyen aquellos grupos de productos cuyos pedidos suman ms de $1000000.00 y cuyas cantidades de pedido medias son inferiores a 3. Transact-SQL USE AdventureWorks2012; GO SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total FROM Sales.SalesOrderDetail GROUP BY ProductID HAVING SUM(LineTotal) > $1000000.00 AND AVG(OrderQty) < 3; GO Para ver los productos cuyas ventas totales son superiores a $2000000.00, utilice esta consulta: Transact-SQL USE AdventureWorks2012; GO SELECT ProductID, Total = SUM(LineTotal) FROM Sales.SalesOrderDetail GROUP BY ProductID HAVING SUM(LineTotal) > $2000000.00; GO Si desea asegurarse de que hay al menos mil quinientos elementos para los clculos de cada producto, use HAVING COUNT(*) > 1500 para eliminar los productos que devuelven totales inferiores a 1500 elementos vendidos. La consulta sera la siguiente: Transact-SQL USE AdventureWorks2012; GO SELECT ProductID, SUM(LineTotal) AS Total FROM Sales.SalesOrderDetail GROUP BY ProductID HAVING COUNT(*) > 1500; GO N.Usar la sugerencia del optimizador INDEX En el ejemplo siguiente se muestran dos formas de usar la sugerencia del optimizador INDEX. En el primer ejemplo se muestra cmo obligar al optimizador a que use un ndice no clster para recuperar filas de una tabla, mientras que en el segundo ejemplo se obliga a realizar un recorrido de tabla mediante un ndice igual a 0. Transact-SQL USE AdventureWorks2012; GO SELECT pp.FirstName, pp.LastName, e.NationalIDNumber FROM HumanResources.Employee AS e WITH (INDEX(AK_Employee_NationalIDNumber)) JOIN Person.Person AS pp on e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO
-- Force a table scan by using INDEX = 0. USE AdventureWorks2012; GO SELECT pp.LastName, pp.FirstName, e.JobTitle FROM HumanResources.Employee AS e WITH (INDEX = 0) JOIN Person.Person AS pp ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO M.Usar OPTION y las sugerencias GROUP En el ejemplo siguiente se muestra cmo se usa la clusula OPTION (GROUP) con una clusula GROUP BY. Transact-SQL USE AdventureWorks2012; GO SELECT ProductID, OrderQty, SUM(LineTotal) AS Total FROM Sales.SalesOrderDetail WHERE UnitPrice < $5.00 GROUP BY ProductID, OrderQty ORDER BY ProductID, OrderQty OPTION (HASH GROUP, FAST 10); GO O.Usar la sugerencia de consulta UNION En el ejemplo siguiente se usa la sugerencia de consulta MERGE UNION. Transact-SQL USE AdventureWorks2012; GO SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours FROM HumanResources.Employee AS e1 UNION SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours FROM HumanResources.Employee AS e2 OPTION (MERGE UNION); GO P.Usar una instruccin UNION simple En el ejemplo siguiente, el conjunto de resultados incluye el contenido de las columnas ProductModelID y Name de las tablas ProductModel y Gloves. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL DROP TABLE dbo.Gloves; GO -- Create Gloves table. SELECT ProductModelID, Name INTO dbo.Gloves FROM Production.ProductModel WHERE ProductModelID IN (3, 4); GO
-- Here is the simple union. USE AdventureWorks2012; GO SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) UNION SELECT ProductModelID, Name FROM dbo.Gloves ORDER BY Name; GO Q.Usar SELECT INTO con UNION En el ejemplo siguiente, la clusula INTO de la segunda instruccin SELECT especifica que la tabla denominada ProductResults contiene el conjunto final de resultados de la unin de las columnas designadas de las tablas ProductModel y Gloves. Tenga en cuenta que la tabla Gloves se crea en la primera instruccin SELECT. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL DROP TABLE dbo.ProductResults; GO IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL DROP TABLE dbo.Gloves; GO -- Create Gloves table. SELECT ProductModelID, Name INTO dbo.Gloves FROM Production.ProductModel WHERE ProductModelID IN (3, 4); GO
USE AdventureWorks2012; GO SELECT ProductModelID, Name INTO dbo.ProductResults FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) UNION SELECT ProductModelID, Name FROM dbo.Gloves; GO
SELECT ProductModelID, Name FROM dbo.ProductResults; R.Usar UNION con dos instrucciones SELECT y ORDER BY El orden de algunos parmetros empleados con la clusula UNION es importante. En el ejemplo siguiente se muestra el uso correcto e incorrecto de UNION en dos instrucciones SELECT en las que se va a cambiar el nombre de una columna en el resultado. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL DROP TABLE dbo.Gloves; GO -- Create Gloves table. SELECT ProductModelID, Name INTO dbo.Gloves FROM Production.ProductModel WHERE ProductModelID IN (3, 4); GO
/* INCORRECT */ USE AdventureWorks2012; GO SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) ORDER BY Name UNION SELECT ProductModelID, Name FROM dbo.Gloves; GO
/* CORRECT */ USE AdventureWorks2012; GO SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID NOT IN (3, 4) UNION SELECT ProductModelID, Name FROM dbo.Gloves ORDER BY Name; GO S.Usar UNION de tres instrucciones SELECT para mostrar los efectos de ALL y los parntesis En los siguientes ejemplos se utiliza UNION para combinar los resultados de tres tablas que tienen las mismas 5 filas de datos. En el primer ejemplo se utiliza UNION ALL para mostrar los registros duplicados y se devuelven las 15 filas. En el segundo ejemplo se utiliza UNION sin ALL para eliminar las filas duplicadas de los resultados combinados de las tres instrucciones SELECT y se devuelven 5 filas. En el tercer ejemplo se utiliza ALL con el primer UNION y los parntesis incluyen al segundo UNION que no utiliza ALL. El segundo UNION se procesa en primer lugar porque se encuentra entre parntesis. Devuelve 5 filas porque no se utiliza la opcin ALL y se quitan los duplicados. Estas 5 filas se combinan con los resultados del primer SELECT mediante las palabras clave UNION ALL. Esto no quita los duplicados entre los dos conjuntos de 5 filas. El resultado final es de 10 filas. Transact-SQL USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL DROP TABLE dbo.EmployeeOne; GO IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL DROP TABLE dbo.EmployeeTwo; GO IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL DROP TABLE dbo.EmployeeThree; GO
SELECT pp.LastName, pp.FirstName, e.JobTitle INTO dbo.EmployeeOne FROM Person.Person AS pp JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO SELECT pp.LastName, pp.FirstName, e.JobTitle INTO dbo.EmployeeTwo FROM Person.Person AS pp JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO SELECT pp.LastName, pp.FirstName, e.JobTitle INTO dbo.EmployeeThree FROM Person.Person AS pp JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID WHERE LastName = 'Johnson'; GO -- Union ALL SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeOne UNION ALL SELECT LastName, FirstName ,JobTitle FROM dbo.EmployeeTwo UNION ALL SELECT LastName, FirstName,JobTitle FROM dbo.EmployeeThree; GO
SELECT LastName, FirstName,JobTitle FROM dbo.EmployeeOne UNION SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeTwo UNION SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeThree; GO
SELECT LastName, FirstName,JobTitle FROM dbo.EmployeeOne UNION ALL ( SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeTwo UNION SELECT LastName, FirstName, JobTitle FROM dbo.EmployeeThree ); GO Vea tambin Referencia CREATE TRIGGER (Transact-SQL) CREATE VIEW (Transact-SQL) DELETE (Transact-SQL) EXECUTE (Transact-SQL) Expresiones (Transact-SQL) INSERT (Transact-SQL) LIKE (Transact-SQL) UNION (Transact-SQL) EXCEPT e INTERSECT (Transact-SQL) UPDATE (Transact-SQL) WHERE (Transact-SQL) PathName (Transact-SQL) INTO (clusula de Transact-SQL)