Ejemplos de SELECT (Transact-SQL)
SQL Server 2014
Este tema an no ha recibido ninguna valoracin
En este tema se proporcionan ejemplos del uso de la instruccin SELECT.
[Link] 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 [Link]
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2012;
GO
SELECT p.*
FROM [Link] 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 [Link]
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 [Link]
WHERE ProductLine = 'R'
AND DaysToManufacture < 4
ORDER BY Name ASC;
GO
[Link] 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 [Link] AS ProductName,
NonDiscountSales = (OrderQty * UnitPrice),
Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM [Link] AS p
INNER JOIN [Link] AS sod
ON [Link] = [Link]
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
',
[Link] AS ProductName
FROM [Link] AS p
INNER JOIN [Link] AS sod
ON [Link] = [Link]
ORDER BY ProductName ASC;
GO
[Link] 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 [Link]
ORDER BY JobTitle;
GO
[Link] 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 [Link]
WHERE ProductNumber LIKE 'BK%';
GO
En el segundo ejemplo se crea la tabla permanente NewProducts.
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID('[Link]', 'U') IS NOT NULL
DROP TABLE [Link];
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED;
GO
SELECT * INTO [Link]
FROM [Link]
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL;
GO
[Link] 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 [Link] AS p
WHERE EXISTS
(SELECT *
FROM [Link] AS pm
WHERE [Link] = [Link]
AND [Link] LIKE 'Long-Sleeve Logo Jersey%');
GO
-- OR
USE AdventureWorks2012;
GO
SELECT DISTINCT Name
FROM [Link]
WHERE ProductModelID IN
(SELECT ProductModelID
FROM [Link]
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 [Link], [Link]
FROM [Link] AS p
JOIN [Link] AS e
ON [Link] = [Link] WHERE 5000.00 IN
(SELECT Bonus
FROM [Link] AS sp
WHERE [Link] = [Link]);
GO
La subconsulta anterior de esta instruccin no se puede evaluar independientemente de la consulta externa. Necesita
el valor [Link], 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 [Link]
FROM [Link] AS p1
GROUP BY [Link]
HAVING MAX([Link]) >= ALL
(SELECT AVG([Link])
FROM [Link] AS p2
WHERE [Link] = [Link]);
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 [Link], [Link]
FROM [Link] pp JOIN [Link] e
ON [Link] = [Link] WHERE [Link] IN
(SELECT SalesPersonID
FROM [Link]
WHERE SalesOrderID IN
(SELECT SalesOrderID
FROM [Link]
WHERE ProductID IN
(SELECT ProductID
FROM [Link] p
WHERE ProductNumber = 'BK-M68B-42')));
GO
[Link] 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 [Link]
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.
[Link] 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 [Link]
GROUP BY ProductID, SpecialOfferID
ORDER BY ProductID;
GO
[Link] 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 [Link]
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO
[Link] 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 [Link]
GROUP BY (OrderQty * UnitPrice)
ORDER BY (OrderQty * UnitPrice) DESC;
GO
[Link] 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 [Link]
WHERE OrderQty > 10
GROUP BY ProductID
ORDER BY AVG(UnitPrice);
GO
[Link] 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 [Link]
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 [Link]
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
[Link] 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 [Link]
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
[Link] 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 [Link]
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 [Link]
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 [Link]
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
[Link] 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 [Link], [Link], [Link]
FROM [Link] AS e WITH (INDEX(AK_Employee_NationalIDNumber))
JOIN [Link] AS pp on [Link] = [Link]
WHERE LastName = 'Johnson';
GO
-- Force a table scan by using INDEX = 0.
USE AdventureWorks2012;
GO
SELECT [Link], [Link], [Link]
FROM [Link] AS e WITH (INDEX = 0) JOIN [Link] AS pp
ON [Link] = [Link]
WHERE LastName = 'Johnson';
GO
[Link] 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 [Link]
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
[Link] 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 [Link] AS e1
UNION
SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours
FROM [Link] AS e2
OPTION (MERGE UNION);
GO
[Link] 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 ('[Link]', 'U') IS NOT NULL
DROP TABLE [Link];
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO [Link]
FROM [Link]
WHERE ProductModelID IN (3, 4);
GO
-- Here is the simple union.
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM [Link]
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM [Link]
ORDER BY Name;
GO
[Link] 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 ('[Link]', 'U') IS NOT NULL
DROP TABLE [Link];
GO
IF OBJECT_ID ('[Link]', 'U') IS NOT NULL
DROP TABLE [Link];
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO [Link]
FROM [Link]
WHERE ProductModelID IN (3, 4);
GO
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
INTO [Link]
FROM [Link]
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM [Link];
GO
SELECT ProductModelID, Name
FROM [Link];
[Link] 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 ('[Link]', 'U') IS NOT NULL
DROP TABLE [Link];
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO [Link]
FROM [Link]
WHERE ProductModelID IN (3, 4);
GO
/* INCORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM [Link]
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM [Link];
GO
/* CORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM [Link]
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM [Link]
ORDER BY Name;
GO
[Link] 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 ('[Link]', 'U') IS NOT NULL
DROP TABLE [Link];
GO
IF OBJECT_ID ('[Link]', 'U') IS NOT NULL
DROP TABLE [Link];
GO
IF OBJECT_ID ('[Link]', 'U') IS NOT NULL
DROP TABLE [Link];
GO
SELECT [Link], [Link], [Link]
INTO [Link]
FROM [Link] AS pp JOIN [Link] AS e
ON [Link] = [Link]
WHERE LastName = 'Johnson';
GO
SELECT [Link], [Link], [Link]
INTO [Link]
FROM [Link] AS pp JOIN [Link] AS e
ON [Link] = [Link]
WHERE LastName = 'Johnson';
GO
SELECT [Link], [Link], [Link]
INTO [Link]
FROM [Link] AS pp JOIN [Link] AS e
ON [Link] = [Link]
WHERE LastName = 'Johnson';
GO
-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM [Link]
UNION ALL
SELECT LastName, FirstName ,JobTitle
FROM [Link]
UNION ALL
SELECT LastName, FirstName,JobTitle
FROM [Link];
GO
SELECT LastName, FirstName,JobTitle
FROM [Link]
UNION
SELECT LastName, FirstName, JobTitle
FROM [Link]
UNION
SELECT LastName, FirstName, JobTitle
FROM [Link];
GO
SELECT LastName, FirstName,JobTitle
FROM [Link]
UNION ALL
(
SELECT LastName, FirstName, JobTitle
FROM [Link]
UNION
SELECT LastName, FirstName, JobTitle
FROM [Link]
);
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)