Вы находитесь на странице: 1из 83

Ejemplos de SELECT

(Transact-SQL)
SQL Server 2014
Otras versiones

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 tablaSalesPerson 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 tablaSalesOrderDetail 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 instruccinSELECT. 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 denominadaProductResults contiene el conjunto final de resultados de la
unin de las columnas designadas de las tablasProductModel 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 SELECTmediante 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

FOR (clusula de TransactSQL)


SQL Server 2014
Otras versiones

La clusula FOR se utiliza para especificar la opcin BROWSE o XML. BROWSE y XML
son opciones no relacionadas.

Importante
La directiva XMLDATA para la opcin FOR XML ha quedado desusada. Utilice la XSD generacin en
los modos RAW y AUTO. No hay sustitucin para la directiva XMLDATA en modo EXPLICIT. Esta
caracterstica se quitar en una versin futura de Microsoft SQL Server. Evite utilizar esta caracterstica
en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.
Se aplica a: SQL Server (SQL Server 2008 a versin actual), Windows Azure SQL Database (Versin

inicial a versin actual).


Convenciones de sintaxis de Transact-SQL

Sintaxis
[ FOR { BROWSE | <XML> } ]
<XML> ::=
XML
{
{ RAW [ ( 'ElementName' ) ] | AUTO }
[
<CommonDirectives>
[ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ]
[ , ELEMENTS [ XSINIL | ABSENT ]
]
| EXPLICIT
[
<CommonDirectives>
[ , XMLDATA ]
]
| PATH [ ( 'ElementName' ) ]
[
<CommonDirectives>
[ , ELEMENTS [ XSINIL | ABSENT ] ]
]
}
<CommonDirectives> ::=
[ , BINARY BASE64 ]
[ , TYPE ]
[ , ROOT [ ( 'RootName' ) ] ]

Argumentos
BROWSE
Especifica que se permiten las actualizaciones mientras se visualizan los datos
en el cursor del modo de exploracin de DB-Library. Una tabla se puede explorar
en una aplicacin si la tabla incluye una columnatimestamp, la tabla tiene un
ndice nico y la opcin FOR BROWSE est al final de las instrucciones SELECT
enviadas a una instancia de SQL Server.

Nota
No se puede utilizar <lock_hint> HOLDLOCK en una instruccin SELECT que incluya la
opcin FOR BROWSE.
FOR BROWSE no puede aparecer en instrucciones SELECT combinadas
mediante el operador UNION.

Nota
Cuando las columnas de clave de ndice nico de una tabla pueden aceptar valores NULL, y la
tabla est en la parte interna de la combinacin externa, el ndice no se admite en el modo de
exploracin.
El modo de exploracin permite examinar las filas de la tabla de SQL Server y
actualizar los datos de la tabla fila por fila. Para tener acceso a una tabla de SQL
Server en una aplicacin en el modo de exploracin, debe utilizar una de las dos
opciones siguientes:
La instruccin SELECT que utiliza para tener acceso a los datos de la
tabla de SQL Server debe finalizar con las palabras clave FOR
BROWSE. Al activar la opcin FOR BROWSE para utilizar el modo de
exploracin, se crean tablas temporales.
Debe ejecutar la instruccin de Transact-SQL siguiente para activar el
modo de exploracin utilizando la opcin NO_BROWSETABLE:
SET NO_BROWSETABLE ON
Al activar la opcin NO_BROWSETABLE, todas las instrucciones SELECT
se comportan como si la opcin FOR BROWSE se anexara a las
instrucciones. Sin embargo, la opcin NO_BROWSETABLE no crea las
tablas temporales que la opcin FOR BROWSE utiliza generalmente
para enviar los resultados a la aplicacin.
Cuando se intenta tener acceso a los datos de las tablas de SQL Server en modo
de exploracin utilizando una consulta SELECT que implica una instruccin de
combinacin externa, y cuando se define un ndice nico en la tabla que est
presente en el lado interno de una instruccin de combinacin externa, el modo
de exploracin no admite el ndice nico. El modo de exploracin nicamente
admite el ndice nico cuando todas las columnas de clave de ndice nico
pueden aceptar valores NULL. El modo de exploracin no admite el ndice nico
si se cumplen las condiciones siguientes:
Intenta tener acceso a los datos de las tablas de SQL Server en modo de
exploracin utilizando una consulta SELECT que implica una instruccin
de combinacin externa.
Un ndice nico se define en la tabla que est presente en el lado interno
de una instruccin de combinacin externa.
Para reproducir este comportamiento en el modo de exploracin, siga estos
pasos:
1. En SQL Server Management Studio, cree una base de datos
denominada SampleDB.
2. En la base de datos SampleDB, cree una tabla tleft y una tabla tright que
contengan ambas una nica columna que se denomine c1. Defina un
ndice nico en la columna c1 de la tabla tleft y establezca la columna
para aceptar valores NULL. Para ello, ejecute las instrucciones de
Transact-SQL siguientes en una ventana de consulta adecuada:
3. CREATE TABLE tleft(c1 INT NULL UNIQUE) ;

4. GO
5. CREATE TABLE tright(c1 INT NULL) ;
6. GO
7. Inserte varios valores en las tablas tleft y tright. Asegrese de insertar un
valor NULL en la tabla tleft.Para ello, ejecute las instrucciones de
Transact-SQL siguientes en la ventana de consulta:
8. INSERT INTO tleft VALUES(2) ;
9. INSERT INTO tleft VALUES(NULL) ;
10.
INSERT INTO tright VALUES(1) ;
11.
INSERT INTO tright VALUES(3) ;
12.
INSERT INTO tright VALUES(NULL) ;
13.
GO
14. Active la opcin NO_BROWSETABLE. Para ello, ejecute las instrucciones
de Transact-SQL siguientes en la ventana de consulta:
15.
SET NO_BROWSETABLE ON ;
16.
GO
17. Obtenga acceso a los datos de las tablas tleft y tright utilizando una
instruccin de combinacin externa en la consulta SELECT. Asegrese de
que la tabla tleft est en el lado interno de la instruccin de combinacin
externa. Para ello, ejecute las instrucciones de Transact-SQL siguientes
en la ventana de consulta:
18.
SELECT tleft.c1
19.
FROM tleft
20.
RIGHT JOIN tright
21.
ON tleft.c1 = tright.c1
22.
WHERE tright.c1 <> 2 ;
Observe la salida siguiente en el panel Resultados:
c1
---NULL
NULL
Despus de ejecutar la consulta SELECT para obtener acceso a las tablas en el
modo de exploracin, el conjunto de resultados de la consulta SELCT contiene
dos valores NULL para la columna c1 de la tabla tleft debido a la definicin de la
instruccin de combinacin externa derecha. Por consiguiente, en el conjunto de
resultados no puede distinguir entre los valores NULL que procedan de la tabla
y los incluidos por la instruccin de combinacin externa derecha. Puede recibir
resultados incorrectos si debe omitir los valores NULL del conjunto de
resultados.

Nota
Si las columnas que estn incluidas en el ndice nico no aceptan valores NULL, todos los

valores NULL en el conjunto de resultados fueron incluidos por la instruccin de combinacin


externa.
XML
Especifica que el resultado de una consulta se devolver como documento
XML. Debe especificarse uno de los siguientes modos XML: RAW, AUTO,
EXPLICIT. Para obtener ms informacin acerca de datos XML y SQL Server,
vea FOR XML (SQL Server).
RAW [ ('ElementName') ]
Obtiene el resultado de la consulta y transforma cada fila del conjunto de
resultados en un elemento XML con un identificador genrico <row /> como
etiqueta del elemento. Opcionalmente, puede especificar un nombre para el
elemento de fila. La salida XML resultante utiliza el
parmetro ElementName especificado como el elemento de fila generado para
cada fila. Para obtener ms informacin, vea Usar el modo RAW con FOR
XMLy Usar el modo RAW con FOR XML.
AUTO
Devuelve los resultados de la consulta en un rbol anidado XML sencillo. Cada
tabla de la clusula FROM, para la que al menos se presenta una columna en la
clusula SELECT, se representa como elemento XML. A las columnas
presentadas en la clusula SELECT se les asignan los atributos de elemento
apropiados. Para obtener ms informacin, vea Usar el modo AUTO con FOR
XML.
EXPLICIT
Especifica que la forma del rbol XML resultante est definida
explcitamente. Con este modo, es necesario escribir las consultas de una cierta
manera, de modo que se pueda especificar explcitamente informacin adicional
acerca de la anidacin deseada. Para obtener ms informacin, vea Usar el
modo EXPLICIT con FOR XML.
XMLDATA
Devuelve el esquema XDR insertado, pero no agrega el elemento raz al
resultado. Si se especifica XMLDATA, el esquema XDR se agrega al documento.
XMLSCHEMA [ ('TargetNameSpaceURI') ]
Devuelve el esquema XSD insertado. Opcionalmente puede especificar un URI
de espacio de nombres de destino al especificar esta directiva, que devuelve el
espacio de nombres especificado en el esquema. Para obtener ms informacin,
vea Generar un esquema XSD insertado.
ELEMENTS
Especifica que las columnas se devuelven como subelementos. Sin embargo, se
les asignan atributos XML. Esta opcin solo se admite en los modos RAW, AUTO
y PATH. Para obtener ms informacin, vea Usar el modo RAW con FOR XML.
XSINIL
Especifica que se va a crear un elemento con el atributo xsi:nil establecido
en True para los valores de columna NULL. Esta opcin solo se puede
especificar con la directiva ELEMENTS. Para obtener ms informacin,
vea Generar elementos para valores NULL mediante el parmetro XSINIL.
ABSENT

Indica que para los valores de columna NULL, no se agregarn los elementos
XML correspondientes en el resultado XML. Especifique esta opcin solo con
ELEMENTS.
PATH [ ('ElementName') ]
Genera un contenedor del elemento de <row> para cada fila en el conjunto de
resultados. Opcionalmente, especifique un nombre de elemento para el
contenedor del elemento <row>. Si se proporciona una cadena vaca, como FOR
XML PATH ('') , no se genera un elemento contenedor. El uso de PATH puede
proporcionar una alternativa ms sencilla a consultas escritas con la directiva
EXPLICIT. Para obtener ms informacin, veaUsar el modo PATH con FOR XML.
BINARY BASE64
Especifica que la consulta devuelve los datos binarios en el formato codificado
BINARY BASE64. Al recuperar datos binarios mediante el modo RAW y EXPLICIT,
se debe especificar esta opcin. ste es el valor predeterminado en el modo
AUTO.
TYPE
Especifica que la consulta devuelve un resultado de tipo xml. Para obtener ms
informacin, vea Directiva TYPE en consultas FOR XML.
ROOT [ ('RootName') ]
Especifica que se va a agregar un solo elemento de nivel superior al XML
resultante. Opcionalmente puede especificar el nombre del elemento raz que
se va a generar. Si no se especifica el nombre de raz opcional, se agrega el
elemento <root> predeterminado.

Ejemplos
En el siguiente ejemplo se especifica FOR XML AUTO con las
opciones TYPE y XMLSCHEMA. Debido a la opcin TYPE, el conjunto de resultados que
se devuelve al cliente es de tipo xml. La opcin XMLSCHEMA especifica que el
esquema XSD insertado est incluido en los datos XML devueltos y la
opcin ELEMENTS especifica que el resultado XML est centrado en elementos.
USE AdventureWorks2012;
GO
SELECT p.BusinessEntityID, FirstName, LastName, PhoneNumber AS Phone
FROM Person.Person AS p
JOIN Person.PersonPhone AS pph ON p.BusinessEntityID =
pph.BusinessEntityID
WHERE LastName LIKE 'G%'
ORDER BY LastName, FirstName
FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;

GROUP BY (Transact-SQL)

SQL Server 2014


Otras versiones

Agrupa un conjunto de filas seleccionado en un conjunto de filas de resumen de


acuerdo con los valores de una o ms columnas o expresiones en SQL Server 2014. Se
devuelve una fila para cada grupo. Las funciones de agregado de la lista <select> de la
clusula SELECT proporcionan informacin de cada grupo en lugar de filas individuales.
La clusula GROUP BY tiene una sintaxis que cumple la norma ISO y otra sintaxis que
no cumple dicha norma. Solo se puede usar un estilo de sintaxis en cada instruccin
SELECT. Use la sintaxis que cumple la norma ISO para todos los trabajos nuevos. La
sintaxis que no cumple dicha norma solo se incluye por motivos de compatibilidad con
versiones anteriores.
En este tema, una clusula GROUP BY se puede describir como general o como simple:

Una clusula GROUP BY general incluye los elementos GROUPING SETS, CUBE,
ROLLUP, WITH CUBE o WITH ROLLUP.

Una clusula GROUP BY simple no incluye GROUPING SETS, CUBE, ROLLUP,


WITH CUBE ni WITH ROLLUP. GROUP BY (), total general, se considera una
clusula GROUP BY simple.

Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual), Windows Azure SQL
Database (desde la versin inicial hasta la versin actual).

Convenciones de sintaxis de Transact-SQL (Transact-SQL)

Sintaxis
ISO-Compliant Syntax
GROUP BY <group by spec>
<group by spec> ::=
<group by item> [ ,...n ]
<group by item> ::=
<simple group by item>

|
|
|
|

<rollup spec>
<cube spec>
<grouping sets spec>
<grand total>

<simple group by item> ::=


<column_expression>
<rollup spec> ::=
ROLLUP ( <composite element list> )
<cube spec> ::=
CUBE ( <composite element list> )
<composite element list> ::=
<composite element> [ ,...n ]
<composite element> ::=
<simple group by item>
| ( <simple group by item list> )
<simple group by item list> ::=
<simple group by item> [ ,...n ]
<grouping sets spec> ::=
GROUPING SETS ( <grouping set list> )
<grouping set list> ::=
<grouping set> [ ,...n ]
<grouping set> ::=
<grand total>
| <grouping set item>
| ( <grouping set item list> )
<empty group> ::=
( )
<grouping set item> ::=
<simple group by item>
| <rollup spec>
| <cube spec>
<grouping set item list> ::=
<grouping set item> [ ,...n ]
Non-ISO-Compliant Syntax
[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
]

Argumentos
< column_expression>
Es la expresin en la que se realiza la operacin de agrupamiento.
ROLLUP ( )
Genera filas de agregado mediante la clusula GROUP BY simple, ms filas de
subtotal o de superagregado, as como una fila de total general.
El nmero de agrupaciones que se devuelve es igual al nmero de expresiones
de la <lista de elementos compuestos> ms uno. Considere, por ejemplo, la
siguiente instruccin:
SELECT a, b, c, SUM ( <expression> )
FROM T
GROUP BY ROLLUP (a,b,c);
Se genera una fila con un subtotal para cada combinacin nica de valores
de (a, b, c), (a, b) y (a).Tambin se calcula una fila de total general.
Las columnas se acumulan de derecha a izquierda. El orden de las columnas
influye en las agrupaciones de salida de ROLLUP y tambin puede afectar al
nmero de filas del conjunto de resultados.
CUBE ( )
Genera filas de agregado mediante la clusula GROUP BY simple, filas de
superagregado mediante la instruccin ROLLUP y filas de tabulacin cruzada.
CUBE genera una agrupacin para todas las permutaciones de expresiones de la
<lista de elementos compuestos>.
El nmero de agrupaciones generado es igual a (2n), donde n es el nmero de
expresiones de la <lista de elementos compuestos>. Considere, por ejemplo, la
siguiente instruccin:
SELECT a, b, c, SUM (<expression>)
FROM T
GROUP BY CUBE (a,b,c);
Se genera una fila para cada combinacin nica de valores de (a, b, c), (a,
b), (a, c), (b, c), (a), (b) y(c), con un subtotal para cada fila y una fila de total
general.
El orden de las columnas no afecta a la salida de CUBE.

GROUPING SETS ( )
Especifica varias agrupaciones de datos en una consulta. Solo se agregan los
grupos especificados, en lugar del conjunto completo de agregaciones generado
por CUBE o ROLLUP. Los resultados son equivalentes a usar la instruccin UNION
ALL en los grupos especificados. GROUPING SETS puede contener un nico
elemento o una lista de elementos. GROUPING SETS puede especificar
agrupaciones equivalentes a las devueltas por ROLLUP o CUBE. La <lista de
elementos de conjunto de agrupacin> puede contener ROLLUP o CUBE.
()
El grupo vaco genera un total.

Sintaxis que no cumple la norma ISO


ALL
Esta caracterstica se quitar en una versin futura de Microsoft SQL Server.
Evite utilizar esta caracterstica en nuevos trabajos de desarrollo y tenga
previsto modificar las aplicaciones que actualmente la utilizan.Incluye todos los
grupos y conjuntos de resultados, incluso aquellos en los que no hay filas que
cumplan la condicin de bsqueda especificada en la clusula WHERE. Cuando
se especifica ALL, se devuelven valores NULL para las columnas de resumen de
los grupos que no cumplen la condicin de bsqueda. No puede especificar ALL
con los operadores CUBE y ROLLUP.
GROUP BY ALL no se admite en consultas que tienen acceso a tablas remotas si
tambin hay una clusula WHERE en la consulta. GROUP BY ALL generar error
en las columnas que tengan el atributo FILESTREAM.
group_by_expression
Es una expresin segn la cual se realiza la
agrupacin. group_by_expression tambin se conoce como columna de
agrupacin. group_by expression puede ser una columna o una expresin no
agregada que haga referencia a una columna devuelta por la clusula FROM. Un
alias de columna que est definido en la lista SELECT no puede usarse para
especificar una columna de agrupamiento.

Nota

Las columnas de tipo text, ntext e image no se pueden utilizar en group_by_expression.

En las clusulas GROUP BY que no contengan CUBE o ROLLUP, el nmero de


elementos group_by_expressionest limitado por los tamaos de columna de
GROUP BY, las columnas de agregado y los valores de agregado que participan
en la consulta. Este lmite procede del lmite de 8.060 bytes de la tabla de
trabajo intermedia que se necesita para contener los resultados intermedios de
la consulta. Se permite un mximo de 12 expresiones de agrupamiento cuando
se especifica CUBE o ROLLUP.
No se pueden especificar mtodos de tipos de datos xml directamente
en group_by_expression. En su lugar, haga referencia a una funcin definida por
el usuario que incluya mtodos de tipos de datos xml, o haga referencia a una
columna calculada que los utilice.
WITH CUBE
Esta caracterstica se quitar en una versin futura de Microsoft SQL Server.
Evite utilizar esta caracterstica en nuevos trabajos de desarrollo y tenga
previsto modificar las aplicaciones que actualmente la utilizan. Especifica que,
adems de las filas que normalmente proporciona GROUP BY, deben incluirse
filas de resumen en el conjunto de resultados. Se devuelve una fila de resumen
GROUP BY por cada posible combinacin de grupo y subgrupo del conjunto de
resultados. Utilice la funcin GROUPING para determinar si los valores NULL del
conjunto de resultados son valores de resumen GROUP BY.
El nmero de filas de resumen del conjunto de resultados se determina
mediante el nmero de columnas que contiene la clusula GROUP BY. Debido a
que CUBE devuelve todas las combinaciones posibles de grupo y subgrupo, el
nmero de filas es el mismo, independientemente del orden en que se
especifiquen las columnas de agrupamiento.
WITH ROLLUP
Esta caracterstica se quitar en una versin futura de Microsoft SQL Server.
Evite utilizar esta caracterstica en nuevos trabajos de desarrollo y tenga
previsto modificar las aplicaciones que actualmente la utilizan. Especifica que,
adems de las filas que normalmente proporciona GROUP BY, deben incluirse
filas de resumen en el conjunto de resultados. Los grupos se resumen en un
orden jerrquico, desde el nivel inferior del grupo hasta el superior. La jerarqua
del grupo se determina por el orden en que se especifican las columnas de
agrupamiento. Cambiar el orden de las columnas de agrupamiento puede
afectar al nmero de filas generadas en el conjunto de resultados.

Importante

Cuando se utiliza CUBE o ROLLUP no se admiten agregados Distinct, como AVG


(DISTINCT column_name), COUNT (DISTINCT column_name) y SUM
(DISTINCT column_name). Si se utilizan, Motor de base de datos de SQL Server devuelve un
mensaje de error y cancela la consulta.

Comentarios
Las expresiones de la clusula GROUP BY pueden contener columnas de las tablas, de
las tablas derivadas o de las vistas de la clusula FROM. No es necesario que
aparezcan las columnas en la lista de <seleccin> de la clusula SELECT.
Deben incluirse en la lista GROUP BY todas las columnas de la tabla o la vista de
cualquier expresin no agregada de la lista de <seleccin>:

Estn permitidas las siguientes instrucciones:

SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA, ColumnB;


SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA + ColumnB;
SELECT ColumnA + ColumnB + constant FROM T GROUP BY ColumnA,
ColumnB;

No estn permitidas las siguientes instrucciones:

SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA + ColumnB;


SELECT ColumnA + constant + ColumnB FROM T GROUP BY ColumnA +
ColumnB;

Si se incluyen funciones de agregado en la <lista de seleccin> de la clusula SELECT,


GROUP BY calcula un valor de resumen para cada grupo. Se conocen como agregados
vectoriales.
Las filas que no cumplen las condiciones especificadas en la clusula WHERE se quitan
antes de realizar ninguna operacin de agrupacin.
La clusula HAVING se usa junto con la clusula GROUP BY para filtrar los grupos en el
conjunto de resultados.
La clusula GROUP BY no ordena el conjunto de resultados. En su lugar, use la clusula
ORDER BY para ordenarlo.
Si una columna de agrupamiento contiene varios valores NULL, todos ellos se
consideran equivalentes y se colocan en un grupo individual.

No es posible usar GROUP BY con un alias para reemplazar el nombre de una columna
en la clusula AS, a menos que dicho alias sustituya a un nombre de columna en una
tabla derivada de la clusula FROM.
Los conjuntos de agrupacin duplicados de una lista GROUPING SETS no se
eliminan. Los conjuntos de agrupacin duplicados se pueden generar especificando
una expresin de columna ms de una vez o incluyendo una expresin de columna
tambin generada por una instruccin CUBE o ROLLUP en la lista GROUPING SETS.
Cuando se utiliza ROLLUP, CUBE y GROUPING SETS se admiten agregados Distinct,
como AVG (DISTINCTcolumn_name), COUNT (DISTINCT column_name) y SUM
(DISTINCT column_name).
ROLLUP, CUBE y GROUPING SETS no se pueden especificar en una vista indexada.
GROUP BY o HAVING no se pueden usar directamente en columnas
de ntext, text o image. Estas columnas se pueden usar como argumentos en
funciones que devuelven un valor de otro tipo de datos, como SUBSTRING() y CAST().
No se pueden especificar mtodos de tipos de datos xml directamente en
<column_expression>. En su lugar, haga referencia a una funcin definida por el
usuario que incluya mtodos de tipos de datos xml o haga referencia a una columna
calculada que los utilice.

Limitaciones de GROUP BY para GROUPING SETS, ROLLUP y CUBE


Limitaciones de la sintaxis
Los operadores GROUPING SETS no se pueden usar en la clusula GROUP BY a menos
que formen parte de una lista GROUPING SETS. Por ejemplo, no se admite GROUP BY
C1, (C2,..., Cn) pero s GROUP BY GROUPING SETS (C1, (C2, ..., Cn)).
Los operadores GROUPING SETS no se pueden usar dentro de GROUPING SETS. Por
ejemplo, no se admite GROUP BY GROUPING SETS (C1, GROUPING SETS (C2, C3)).
Las palabras clave que no cumplen la norma ISO ALL, WITH CUBE y WITH ROLLUP no se
pueden usar en una clusula GROUP BY con las palabras clave ROLLUP, CUBE o
GROUPING SETS.

Limitaciones de tamao
En la clusula simple GROUP BY, no hay ningn lmite en cuanto al nmero de
expresiones.
En una clusula GROUP BY que utilice ROLLUP, CUBE o GROUPING SETS, el nmero
mximo de expresiones es 32, y el nmero mximo de conjuntos de agrupacin que se
pueden generar es 4.096 (212). Los ejemplos siguientes producen un error debido a que
la clusula GROUP BY es demasiado compleja:

En los ejemplos siguientes se generan 8.192 (213) conjuntos de agrupamiento.

GROUP BY CUBE (a1, ..., a13)


GROUP BY a1, ..., a13 WITH CUBE

En el ejemplo siguiente se generan 4.097 (212 + 1) conjuntos de agrupamiento.

GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )

En el ejemplo siguiente tambin se generan 4.097 (2 12 + 1) conjuntos de


agrupamiento. Los conjuntos de agrupacin CUBE () y () generan una fila de
total general y los conjuntos de agrupacin duplicados no se eliminan.

GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())

Compatibilidad con las caractersticas GROUP BY de ISO y ANSI SQL2006


En SQL Server 2014, la clusula GROUP BY no puede contener una subconsulta en una
expresin que se use para la lista de agrupacin. Se devuelve el error 144.
SQL Server 2014 admite todas las caractersticas GROUP BY incluidas en el estndar
SQL-2006 con las excepciones de sintaxis siguientes:

Los conjuntos de agrupamiento no se pueden usar en la clusula GROUP BY a


menos que formen parte de una lista GROUPING SETS explcita. Por
ejemplo, GROUP BY Column1, (Column2, ...ColumnN) se admite en el estndar
pero no en SQL Server. Se permite GROUP BY C1, GROUPING SETS
((Column2, ...ColumnN)) oGROUP BY Column1, Column2, ... ColumnN. stos son
equivalentes semnticamente al ejemplo de GROUP BY anterior. Con ello se
evita la posibilidad de que GROUP BY Column1, (Column2, ...ColumnN) se pueda
malinterpretar como GROUP BY C1, GROUPING SETS ((Column2,
...ColumnN)). ste no es equivalente semnticamente.

No se pueden usar conjuntos de agrupamiento dentro de conjuntos de


agrupamiento. Por ejemplo, GROUP BY GROUPING SETS (A1, A2,An, GROUPING
SETS (C1, C2, ...Cn)) se admite en el estndar SQL-2006 pero no en SQL
Server. SQL Server 2014 permite GROUP BY GROUPING SETS( A1, A2,...An, C1,
C2, ...Cn ) o GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ...
(Cn) ). Estos ejemplos son equivalentes semnticamente al primer ejemplo de
GROUP BY y tienen una sintaxis ms clara.

No se admite GROUP BY [ALL/DISTINCT] en una clusula GROUP BY general ni


con las construcciones GROUPING SETS, ROLLUP, CUBE, WITH CUBE o WITH
ROLLUP. ALL es el valor predeterminado y es implcito.

Comparacin de las caractersticas GROUP BY compatibles


En la tabla siguiente se describen las caractersticas de GROUP BY que son compatibles
dependiendo de la versin de SQL Server y del nivel de compatibilidad de la base de
datos.

Caract
erstic
a

SQL Server
2008 o
posterior con
el nivel de
compatibilid
ad 90.

SQL Server Integration


Services

Nivel de compatibilidad 100 o superior


con SQL Server

Agrega
dos
DISTI
NCT

No se admite en WITH CUBE


ni en WITH ROLLUP.

Se admite en WITH CUBE, WITH


ROLLUP, GROUPING SETS, CUBE o
ROLLUP.

Igual que el
nivel de
compatibilida
d 100.

Funci
n
definid
a por el
usuario
con un
nombre
CUBE
o
ROLL
UP en
la
clusul
a
GROU
P BY

Se admite la funcin definida


por el
usuariodbo.cube(arg1,...argN)
odbo.rollup(arg1,...argN)en
la clusula GROUP BY.

No se admite la funcin definida por el


usuariodbo.cube
(arg1,...argN) odbo.rollup(arg1,...argN)e
n la clusula GROUP BY.

Se admite la
funcin
definida por
el
usuariodbo.c
ube
(arg1,...argN)
odbo.rollup(
arg1,...argN)e
n la clusula
GROUP BY

Por ejemplo:
Por ejemplo:
SELECT SUM (x)
FROM T
GROUP BY dbo.cube(y);

SELECT SUM (x)


FROM T
GROUP BY dbo.cube(y);

Se devuelve el mensaje de error siguiente:


"Sintaxis incorrecta cerca de la palabra
clave 'cube'|'rollup'."
Para evitar este problema,
reemplace dbo.cube por[dbo].[cube]
odbo.rollup por [dbo].[rollup].
Se admite el siguiente ejemplo:
SELECT SUM (x)
FROM T

Por ejemplo:
SELECT SUM
(x)
FROM T
GROUP BY
dbo.cube(y)
;

GROUP BY [dbo].[cube](y);

GROU
PING
SETS

No compatible

Compatible

Compatible

CUBE

No compatible

Compatible

No
compatible

ROLL
UP

No compatible

Compatible

No
compatible

Total
general
, como
GROU
P BY ()

No compatible

Compatible

Compatible

Funci
n
GROU
PING_
ID

No compatible

Compatible

Compatible

Funci
n
GROU
PING

Compatible

Compatible

Compatible

WITH
CUBE

Compatible

Compatible

Compatible

WITH
ROLL
UP

Compatible

Compatible

Compatible

Elimin
acin
de
grupos
duplica
dos de
WITH
CUBE
o
WITH
ROLL
UP

Compatible

Compatible

Compatible

Ejemplos
A.Utilizar una clusula GROUP BY simple
En el ejemplo siguiente se recupera el total de cada SalesOrderID de la
tabla SalesOrderDetail de la base de datos AdventureWorks2012.
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail AS sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID;

B.Utilizar una clusula GROUP BY con varias tablas


En el ejemplo siguiente se recupera el nmero de empleados de cada City de la
tabla Address combinada con la tabla EmployeeAddress de la base de datos
AdventureWorks2012.
SELECT a.City, COUNT(bea.AddressID) EmployeeCount
FROM Person.BusinessEntityAddress AS bea

INNER JOIN Person.Address AS a


ON bea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City;

C.Utilizar una clusula GROUP BY con una expresin


En el ejemplo siguiente se recuperan las ventas totales de cada ao con la
funcin DATEPART. Debe incluirse la misma expresin en la lista SELECT y en la
clusula GROUP BY.
SELECT DATEPART(yyyy,OrderDate) AS N'Year'
,SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy,OrderDate)
ORDER BY DATEPART(yyyy,OrderDate);

D.Utilizar una clusula GROUP BY con una clusula HAVING


En el ejemplo siguiente se usa la clusula HAVING para especificar cules de los grupos
generados en la clusulaGROUP BY deben incluirse en el conjunto de resultados.
SELECT DATEPART(yyyy,OrderDate) AS N'Year'
,SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy,OrderDate)
HAVING DATEPART(yyyy,OrderDate) >= N'2003'
ORDER BY DATEPART(yyyy,OrderDate);

NTO (clusula de
Transact-SQL)
SQL Server 2014
Otras versiones

SELECT...INTO crea una nueva tabla en el grupo de archivos predeterminado e inserta


las filas resultantes de la consulta en ella. Para ver la sintaxis completa de SELECT,
vea SELECT (Transact-SQL).

Se aplica a: SQL Server (SQL Server 2008 a versin actual), Windows Azure SQL Database (Versin
inicial a versin actual).

Convenciones de sintaxis de Transact-SQL

Sintaxis
[ INTO new_table ]

Argumentos
new_table
Especifica el nombre de una nueva tabla que se va a crear en funcin de las
columnas de la lista de seleccin y de las filas elegidas desde el origen de
datos.
El formato de new_table se determina mediante la evaluacin de las
expresiones de la lista de seleccin. Las columnas de new_table se crean en el
orden que especifica la lista de seleccin. Cada columna de new_tabletiene el
mismo nombre, tipo de datos, nulabilidad y valor que la expresin
correspondiente de la lista de seleccin. La propiedad IDENTITY de una columna
se transfiere excepto bajo las condiciones definidas en "Trabajar con columnas
de identidad" en la seccin Comentarios.
Para crear la tabla en otra base de datos en la misma instancia de SQL Server,
especifique new_table como un nombre completo con
formato database.schema.table_name.
No puede crear new_table en un servidor remoto; sin embargo, puede
rellenar new_table desde un origen de datos remoto. Para crear new_table a
partir de una tabla de origen remota, especifique la tabla de origen utilizando
un nombre con cuatro partes con el
formato linked_server.catalog.schema.object en la clusula FROM de la
instruccin SELECT. Tambin puede utilizar la funcin OPENQUERY o la
funcin OPENDATASOURCE en la clusula FROM para especificar el origen de
datos remoto.

Tipos de datos
El atributo FILESTREAM no transfiere a la nueva tabla. Los BLOB FILESTREAM se copian
y se almacenan en la nueva tabla como BLOB varbinary(max). Sin el atributo
FILESTREAM, el tipo de datos varbinary(max) tiene una limitacin de 2 GB. Si un
FILESTREAM BLOB supera este valor, se produce el error 7119 y se detiene la
instruccin.
Cuando se selecciona una columna de identidad existente en una nueva tabla, la nueva
columna hereda la propiedad IDENTITY, a menos que se cumpla una de las siguientes
condiciones:

La instruccin SELECT contiene una combinacin.

Se han combinado varias instrucciones SELECT con UNION.

La columna de identidad aparece ms de una vez en la lista de seleccin.

La columna de identidad forma parte de una expresin.

La columna de identidad es de un origen de datos remoto.

Si se cumple alguna de estas condiciones, la columna se crea como NOT NULL en lugar
de heredar la propiedad IDENTITY. Si una columna de identidad se requiere en la nueva
tabla pero este tipo de columna no est disponible o desea un valor de inicializacin o
de incremento diferente de la columna de identidad de origen, defina la columna en la
lista de seleccin utilizando la funcin IDENTITY. Vea "Crear una columna de identidad
utilizando la funcin IDENTITY" en la seccin Ejemplos siguiente.

Limitaciones y restricciones
No puede especificar una variable de tabla o parmetro con valores de tabla como la
nueva tabla.
No puede utilizar SELECTINTO para crear una tabla con particiones, incluso si la
particin se realiza sobre la tabla de origen. SELECT...INTO no usa el esquema de
particin de la tabla de origen; en su lugar, la nueva tabla se crea en el grupo de
archivos predeterminado. Para insertar filas en una tabla con particiones, primero debe
crearse la tabla con particiones y, a continuacin, utilizar la instruccin INSERT
INTO...SELECT FROM.
Los ndices, restricciones y desencadenadores definidos en la tabla de origen no se
transfieren a la nueva tabla, ni se pueden especificar en la instruccin SELECT...INTO. Si
se requieren estos objetos, puede crearlos despus de ejecutar la instruccin
SELECT...INTO.

Especificar una clusula ORDER BY no garantiza que las filas se inserten en el orden
especificado.
Cuando se incluye una columna dispersa en la lista de seleccin, la propiedad de la
columna dispersa no se transfiere a la columna de la nueva tabla. Si esta propiedad es
necesaria en la nueva tabla, modifique la definicin de columna despus de ejecutar la
instruccin SELECT...INTO para que incluya esta propiedad.
Cuando se incluye una columna calculada en la lista de seleccin, la columna
correspondiente de la nueva tabla no es una columna calculada. Los valores de la
nueva columna son los que se calcularon en el momento en que se ejecut
SELECT...INTO.

Comportamiento del registro


La cantidad de registro para SELECT...INTO depende del modelo de recuperacin en
vigor para la base de datos. En el modelo de recuperacin simple o en el optimizado
para cargas masivas de registros, las operaciones masivas se registran
mnimamente. Con registro mnimo, utilizar la instruccin SELECT INTO puede ser
ms eficaz que crear una tabla y rellenarla con una instruccin INSERT. Para obtener
ms informacin, vea El registro de transacciones (SQL Server).

Permissions
Requiere el permiso CREATE TABLE en la base de datos de destino.

Ejemplos
A.Crear una tabla especificando columnas de varios orgenes
En el ejemplo siguiente se crea la tabla dbo.EmployeeAddresses en la base de datos
AdventureWorks2012 seleccionando siete columnas de varias tablas relacionadas con
empleados y direcciones.
SELECT c.FirstName, c.LastName, e.JobTitle, a.AddressLine1, a.City,
sp.Name AS [State/Province], a.PostalCode
INTO dbo.EmployeeAddresses
FROM Person.Person AS c
JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID
JOIN Person.BusinessEntityAddress AS bea
ON e.BusinessEntityID = bea.BusinessEntityID
JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
JOIN Person.StateProvince as sp
ON sp.StateProvinceID = a.StateProvinceID;

GO

B.Insertar las filas utilizando el registro mnimo


El ejemplo siguiente crea la tabla dbo.NewProducts e inserta filas de la
tabla Production.Product. El ejemplo supone que el modelo de recuperacin de la base
de datos AdventureWorks2012 est establecido en FULL. Para asegurarse de que se
utiliza el registro mnimo, el modelo de recuperacin de la base de datos
AdventureWorks2012 se establece en BULK_LOGGED antes de que las filas se inserten
y se restablece en FULL despus de la instruccin SELECT...INTO. De esta manera se
asegura de que la instruccin SELECT...INTO use el espacio mnimo en el registro de
transacciones y funcione eficazmente.
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

C.Crear una columna de identidad utilizando la funcin IDENTITY


En el ejemplo siguiente se utiliza la funcin IDENTITY para crear una columna de
identidad en la nueva tablaPerson.USAddress de la base de datos
AdventureWorks2012. Se requiere esto porque la instruccin SELECT que define la
tabla contiene una unin, que hace que la propiedad IDENTITY no transfiera a la nueva
tabla. Tenga en cuenta que los valores de inicializacin e incremento especificados en
la funcin IDENTITY son diferentes de los de la columna AddressID de la tabla de
origen Person.Address.
IF OBJECT_ID ('Person.USAddress') IS NOT NULL
DROP TABLE Person.USAddress;
GO
-- Determine the IDENTITY status of the source column AddressID.
SELECT OBJECT_NAME(object_id) AS TableName, name AS column_name,
is_identity, seed_value, increment_value
FROM sys.identity_columns
WHERE name = 'AddressID';
-- Create a new table with columns from the existing table
Person.Address. A new IDENTITY
-- column is created by using the IDENTITY function.
SELECT IDENTITY (int, 100, 5) AS AddressID,

a.AddressLine1, a.City, b.Name AS State, a.PostalCode


INTO Person.USAddress
FROM Person.Address AS a
INNER JOIN Person.StateProvince AS b ON a.StateProvinceID =
b.StateProvinceID
WHERE b.CountryRegionCode = N'US';
-- Verify the IDENTITY status of the AddressID columns in both tables.
SELECT OBJECT_NAME(object_id) AS TableName, name AS column_name,
is_identity, seed_value, increment_value
FROM sys.identity_columns
WHERE name = 'AddressID';

D.Crear una tabla especificando las columnas de un origen de datos


remoto
El ejemplo siguiente muestra tres mtodos para crear una nueva tabla en el servidor
local desde un origen de datos remoto. En el ejemplo se comienza creando un vnculo
al origen de datos remoto. El nombre del servidor vinculado,MyLinkServer, se
especifica en la clusula FROM de la primera instruccin SELECT...INTO y en la funcin
OPENQUERY de la segunda instruccin SELECT...INTO. La tercera instruccin
SELECT...INTO utiliza la funcin OPENDATASOURCE, que especifica el origen de datos
remoto directamente en lugar de utilizar el nombre del servidor vinculado.
Se aplica desde SQL Server 2008 hasta SQL Server 2014.
USE master;
GO
-- Create a link to the remote data source.
-- Specify a valid server name for @datasrc as 'server_name' or
'server_name\instance_name'.
EXEC sp_addlinkedserver @server = N'MyLinkServer',
@srvproduct = N' ',
@provider = N'SQLNCLI',
@datasrc = N'server_name',
@catalog = N'AdventureWorks2012';
GO
USE AdventureWorks2012;
GO
-- Specify the remote data source in the FROM clause using a four-part
name
-- in the form linked_server.catalog.schema.object.
SELECT DepartmentID, Name, GroupName, ModifiedDate
INTO dbo.Departments
FROM MyLinkServer.AdventureWorks2012.HumanResources.Department
GO
-- Use the OPENQUERY function to access the remote data source.
SELECT DepartmentID, Name, GroupName, ModifiedDate
INTO dbo.DepartmentsUsingOpenQuery

FROM OPENQUERY(MyLinkServer, 'SELECT *


FROM AdventureWorks2012.HumanResources.Department');
GO
-- Use the OPENDATASOURCE function to specify the remote data source.
-- Specify a valid server name for Data Source using the format
server_name or server_name\instance_name.
SELECT DepartmentID, Name, GroupName, ModifiedDate
INTO dbo.DepartmentsUsingOpenDataSource
FROM OPENDATASOURCE('SQLNCLI',
'Data Source=server_name;Integrated Security=SSPI')
.AdventureWorks2012.HumanResources.Department;
GO

ORDER BY (clusula de
Transact-SQL)
SQL Server 2014
Otras versiones

Ordenar los datos devueltos por una consulta en SQL Server. Use esta clusula para:

Ordenar el conjunto de resultados de una consulta por la lista de columnas


especificada y, opcionalmente, limitar las filas devueltas a un intervalo
especificado. El orden en que se devuelven las filas en un conjunto de
resultados no se puede garantizar, a menos que se especifique una clusula
ORDER BY.

Determinar el orden en que se aplican los valores de la funcin de categora al


conjunto de resultados.

Se aplica a: SQL Server (SQL Server 2008 a versin actual), Windows Azure SQL Database (Versin
inicial a versin actual).

Convenciones de sintaxis de Transact-SQL

Sintaxis
Transact-SQL
ORDER BY order_by_expression
[ COLLATE collation_name ]
[ ASC | DESC ]
[ ,...n ]
[ <offset_fetch> ]

<offset_fetch> ::=
{
OFFSET { integer_constant | offset_row_count_expression } { ROW |
ROWS }
[
FETCH { FIRST | NEXT } {integer_constant |
fetch_row_count_expression } { ROW | ROWS } ONLY
]
}

Argumentos
order_by_expression
Especifica una columna o expresin segn la que se ordenar el conjunto de
resultados de la consulta. Una columna de ordenacin se puede especificar
como un nombre o un alias de columna, o un entero no negativo que representa
la posicin de la columna en la lista de seleccin.
Es posible especificar varias columnas de ordenacin. Los nombres de columna
tienen que ser nicos. La secuencia de las columnas de ordenacin de la
clusula ORDER BY define la organizacin del conjunto de resultados
ordenado. Es decir, el conjunto de resultados se ordena conforme a la primera
columna y, a continuacin, esa lista ordenada se ordena segn la segunda
columna, y as sucesivamente.
Los nombres de columna a los que se hace referencia en la clusula ORDER BY
deben corresponderse con una columna de la lista de seleccin o con una
columna definida en la tabla especificada en la clusula FROM sin
ambigedades.
COLLATE collation_name

Especifica que la operacin ORDER BY debe realizarse conforme a la


intercalacin especificada encollation_name y no conforme a la intercalacin de
la columna definida en la tabla o vista. collation_namepuede ser un nombre de
intercalacin de Windows o un nombre de intercalacin de SQL. Para obtener
ms informacin, vea Compatibilidad con la intercalacin y Unicode. COLLATE
solo se aplica a las columnas con tipos de
datos char, varchar, nchar y nvarchar.
ASC | DESC
Indica que los valores de la columna especificada se deben ordenar en sentido
ascendente o descendente. ASC ordena del valor mnimo al valor mximo. DESC
ordena del valor mximo al valor mnimo. ASC es el criterio de ordenacin
predeterminado. Los valores NULL se tratan como los valores ms bajos
posibles.
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Especifica el nmero de filas que se deben omitir antes de comenzar a devolver
filas de la expresin de consulta. El valor puede ser una expresin o constante
entera mayor o igual que cero.

Se aplica a: SQL Server 2012 a SQL Server 2014 y Windows Azure SQL Database.

offset_row_count_expression puede ser una variable, un parmetro o una


subconsulta escalar constante.Cuando se utiliza una subconsulta, no puede
hacer referencia a ninguna columna definida en el mbito de la consulta
externa. Es decir, no se puede poner en correlacin con la consulta externa.
ROW y ROWS son sinnimos y se proporcionan para ofrecer compatibilidad con
ANSI.
En los planes de ejecucin de consultas, el valor de recuento de filas de
desplazamiento se muestra en el atributo Offset del operador de consulta TOP.
FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW |
ROWS } ONLY
Especifica el nmero de filas que se devolvern despus de procesar la clusula
OFFSET. El valor puede ser una expresin o constante entera mayor o igual que
uno.

Se aplica a: SQL Server 2012 a SQL Server 2014 y Windows Azure SQL Database.

fetch_row_count_expression puede ser una variable, un parmetro o una


subconsulta escalar constante. Cuando se utiliza una subconsulta, no puede
hacer referencia a ninguna columna definida en el mbito de la consulta
externa. Es decir, no se puede poner en correlacin con la consulta externa.
FIRST y NEXT son sinnimos y se proporcionan para ofrecer compatibilidad con
ANSI.
ROW y ROWS son sinnimos y se proporcionan para ofrecer compatibilidad con
ANSI.
En los planes de ejecucin de consultas, el valor de recuento de filas de
desplazamiento se muestra en el atributo Rows o Top del operador de consulta
TOP.

Prcticas recomendadas
Evite especificar enteros en la clusula ORDER BY como representaciones posicionales
de las columnas en la lista de seleccin. Por ejemplo, aunque una instruccin
como SELECT ProductID, Name FROM Production.Production ORDER BY 2 es vlida,
otros usuarios no la entendern tan bien como si especificase el nombre de la columna
real.Adems, para realizar cambios en la lista de seleccin, como modificar el orden de
las columnas o agregar otras nuevas, ser preciso modificar la clusula ORDER BY a fin
de evitar resultados inesperados.
En una instruccin SELECT TOP (N), utilice siempre una clusula ORDER BY. Esta es la
nica manera de indicar previsiblemente a qu filas afecta TOP. Para obtener ms
informacin, vea TOP (Transact-SQL).

Interoperabilidad
Cuando se utiliza con una instruccin SELECT...INTO para insertar filas de otro origen, la
clusula ORDER BY no garantiza la insercin de las filas en el orden especificado.
Al usar OFFSET y FETCH en una vista no se cambia la propiedad Updateability de la
vista.

Limitaciones y restricciones

No hay ningn lmite en cuanto al nmero de columnas de la clusula ORDER BY; sin
embargo, el tamao total de las columnas especificadas en una clusula ORDER BY no
puede superar los 8.060 bytes.
Las columnas de tipo ntext, text, image, geography, geometry y xml no se pueden
usar en una clusula ORDER BY.
No puede especificarse un entero o una constante cuando en una funcin de categora
aparece order_by_expression .Para obtener ms informacin, vea OVER (clusula de
Transact-SQL).
Si los nombres de tabla estn asociados a un alias en la clusula FROM, solo pueden
usarse los nombres de alias para calificar sus columnas en la clusula ORDER BY.
Los nombres y alias de columna especificados en la clusula ORDER BY deben estar
definidos en la lista de seleccin si la instruccin SELECT contiene uno de los
operadores o clusulas siguientes:

UNION, operador

EXCEPT, operador

INTERSECT, operador

SELECT DISTINCT

Adems, cuando la instruccin incluye un operador UNION, EXCEPT o INTERSECT, los


nombres o los alias de columna deben ser los especificados en la lista de seleccin de
la primera consulta (lado izquierdo).
En una consulta que utiliza los operadores UNION, INTERSECT o EXCEPT, ORDER BY se
permite nicamente al final de la instruccin. Esta restriccin se aplica nicamente
cuando se especifica UNION, EXCEPT e INTERSECT en una consulta de nivel superior y
no en una subconsulta. Vea la seccin Ejemplos que aparece ms adelante.
La clusula ORDER BY no es vlida en vistas, funciones insertadas, tablas derivadas y
subconsultas, a menos que se especifiquen tambin las clusulas TOP u OFFSET y
FETCH. Cuando ORDER BY se utiliza en estos objetos, la clusula nicamente se utiliza
para determinar las filas devueltas por la clusula TOP o las clusulas OFFSET Y
FETCH. La clusula ORDER BY no garantiza resultados ordenados cuando se consulten
estos constructores, a menos que tambin se especifique ORDER BY en la misma
consulta.
OFFSET y FETCH no se admiten en vistas indizadas ni en vistas definidas mediante la
clusula CHECK OPTION.

OFFSET y FETCH se pueden utilizar en cualquier consulta que permita TOP y ORDER BY
con las siguientes limitaciones:

La clusula OVER no admite OFFSET ni FETCH.

OFFSET y FETCH no se pueden especificar directamente en las instrucciones


INSERT, UPDATE, MERGE ni DELETE, pero s en una subconsulta definida en
ellas. Por ejemplo, en la instruccin INSERT INTO SELECT, se pueden especificar
OFFSET y FETCH en la instruccin SELECT.

En una consulta que utiliza los operadores UNION, EXCEPT o INTERSECT, OFFSET
y FETCH nicamente se pueden utilizar en la consulta final que especifica el
orden de los resultados de la consulta.

TOP no se puede combinar con OFFSET y FETCH en la misma expresin de


consulta (en el mismo mbito de la consulta).

Utilizar OFFSET y FETCH para limitar las filas


devueltas
Recomendamos utilizar las clusulas OFFSET y FETCH en lugar de la clusula TOP para
implementar una solucin de paginacin de consulta y limitar el nmero de filas
enviadas a una aplicacin cliente.
Para utilizar OFFSET y FETCH como solucin de paginacin, es preciso ejecutar la
consulta una vez por cada "pgina" de datos devuelta a la aplicacin cliente. Por
ejemplo, para devolver los resultados de una consulta en incrementos de 10 filas, se
debe ejecutar la consulta una vez para devolver las filas de 1 a 10, despus otra vez
para devolver las filas de 11 a 20, y as sucesivamente. Cada consulta es
independiente y no est relacionada con las dems de forma alguna. Esto significa que,
a diferencia de cuando se usa un cursor en que la consulta se ejecuta una vez y su
estado se mantiene en el servidor, en este caso es la aplicacin cliente la responsable
de realizar el seguimiento del estado.Para lograr resultados estables entre las
solicitudes de consultas donde se utilicen OFFSET y FETCH, se deben cumplir las
siguientes condiciones:
1. Los datos subyacentes que la consulta utilice no deben cambiar. Es decir, o bien
las filas afectadas por la consulta no se actualizarn, o bien todas las solicitudes
correspondientes a las pginas de la consulta se ejecutarn en una transaccin
nica utilizando el aislamiento de transaccin serializable o de instantnea. Para
obtener informacin acerca de estos niveles de aislamiento de transaccin,
vea SET TRANSACTION ISOLATION LEVEL (Transact-SQL).
2. Debe garantizarse que la columna o combinacin de columnas contenidas en la
clusula ORDER BY sean nicas.

Vea el ejemplo que "Ejecutar varias consultas en una sola transaccin" en la seccin
Ejemplos que aparece ms adelante en este tema.
Si el hecho de que los planes de ejecucin sean coherentes es importante para su
solucin de paginacin, puede ser conveniente utilizar la sugerencia de consulta
OPTIMIZE FOR para los parmetros de OFFSET y FETCH. Vea "Especificar expresiones
para valores de OFFSET y FETCH" en la seccin Ejemplos que aparece ms adelante en
este tema. Para obtener ms informacin acerca de OPTIMIZE FOR, vea Sugerencias de
consulta (Transact-SQL).

Ejemplos
Categora

Elementos de sintaxis ofrecidos

Sintaxis bsica

ORDER BY

Especificar orden ascendente y descendente

DESC ASC

Especificar una intercalacin

COLLATE

Especificar un orden condicional

CASE, expresin

Usar ORDER BY en una funcin de categora

Funciones de categora

Limitar el nmero de filas devueltas

OFFSET FETCH

Usar ORDER BY con UNION, EXCEPT e INTERSECT

UNION

Sintaxis bsica
En los ejemplos de esta seccin se muestra la funcionalidad bsica de la clusula
ORDER BY utilizando la sintaxis mnima requerida.

A.Especificar una sola columna definida en la lista de seleccin


En el siguiente ejemplo se ordena el conjunto de resultados por la columna
numrica ProductID. Dado que no se especifica un criterio de ordenacin concreto, se
utiliza el valor predeterminado (orden ascendente).
USE AdventureWorks2012;
GO
SELECT ProductID, Name FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID;

B.Especificar una columna que no est definida en la lista de seleccin


En el siguiente ejemplo se ordena el conjunto de resultados por una columna que no
est incluida en la lista de seleccin, pero s definida en la tabla especificada en la
clusula FROM.
USE AdventureWorks2012;
GO
SELECT ProductID, Name, Color
FROM Production.Product
ORDER BY ListPrice;

C.Especificar un alias como columna de ordenacin


En el ejemplo siguiente se especifica el alias de columna SchemaName como columna
de criterio de ordenacin.
USE AdventureWorks2012;
GO
SELECT name, SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
WHERE type = 'U'
ORDER BY SchemaName;

D.Especificar una expresin como columna de ordenacin


En el ejemplo siguiente se utiliza una expresin como columna de ordenacin. La
expresin se define mediante la funcin DATEPART para ordenar el conjunto de
resultados segn el ao de contratacin de los empleados.
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, JobTitle, HireDate
FROM HumanResources.Employee

ORDER BY DATEPART(year, HireDate);

Especificar un criterio de ordenacin ascendente y descendente


A.Especificar un orden descendente
En el siguiente ejemplo se ordena el conjunto de resultados en sentido descendente
segn la columna numricaProductID.
USE AdventureWorks2012;
GO
SELECT ProductID, Name FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;

B.Especificar un orden ascendente


En el siguiente ejemplo se ordena el conjunto de resultados en orden ascendente
segn la columna Name. Observe que los caracteres estn ordenados alfabticamente,
no numricamente. Es decir, 10 se ordena antes que 2.
USE AdventureWorks2012;
GO
SELECT ProductID, Name FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY Name ASC ;

C.Especificar orden ascendente y tambin descendente


En el siguiente ejemplo se ordena el conjunto de resultados segn dos columnas. El
conjunto de resultados se ordena en primer lugar en sentido ascendente segn la
columna FirstName y, a continuacin, en orden descendente segn la
columna LastName.
USE AdventureWorks2012;
GO
SELECT LastName, FirstName FROM Person.Person
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC ;

Especificar una intercalacin


En el siguiente ejemplo se muestra cmo especificar una intercalacin en la clusula
ORDER BY puede cambiar el orden en que se devuelven los resultados de la
consulta. Se crea una tabla que contiene una columna definida mediante una
intercalacin que no distingue entre maysculas y minsculas, ni las tildes. Los valores
se insertan con diversas diferencias de uso de maysculas, minsculas y tildes. Dado
que no se especifica ninguna intercalacin en la clusula ORDER BY, la primera
consulta utiliza la intercalacin de la columna al ordenar los valores. En la segunda
consulta, se especifica una intercalacin que distingue entre maysculas y minsculas
y las tildes; en consecuencia, cambia el orden en el que se devuelven las filas.
USE tempdb;

GO
CREATE TABLE #t1 (name nvarchar(15) COLLATE Latin1_General_CI_AI)
GO
INSERT INTO #t1 VALUES(N'Snchez'),(N'Sanchez'),(N'snchez'),
(N'sanchez');
-- This query uses the collation specified for the column 'name' for
sorting.
SELECT name
FROM #t1
ORDER BY name;
-- This query uses the collation specified in the ORDER BY clause for
sorting.
SELECT name
FROM #t1
ORDER BY name COLLATE Latin1_General_CS_AS;

Especificar un orden condicional


En los ejemplos siguientes se utiliza la expresin CASE en una clusula ORDER BY para
determinar de manera condicional el criterio de ordenacin de las filas segn el valor
de una columna dada. En el primer ejemplo se evale el valor de la
columna SalariedFlag de la tabla HumanResources.Employee. Los empleados que
tienen la columnaSalariedFlag establecida en 1 se devuelven en orden descendente
segn el BusinessEntityID. Los empleados que tienen la
columna SalariedFlag establecida en 0 se devuelven en orden ascendente segn
elBusinessEntityID. En el segundo ejemplo, el conjunto de resultados se ordena segn
la columna TerritoryNamecuando la columna CountryRegionName es igual a 'United
States' y segn la columna CountryRegionName en las dems filas.
SELECT BusinessEntityID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
GO
SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName
ELSE CountryRegionName END;

Usar ORDER BY en una funcin de categora


En el siguiente ejemplo se utiliza la clusula ORDER BY en las funciones de categora
ROW_NUMBER, RANK, DENSE_RANK y NTILE.
USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName
,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number"

,RANK() OVER (ORDER BY a.PostalCode) AS "Rank"


,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank"
,NTILE(4) OVER (ORDER BY a.PostalCode) AS "Quartile"
,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;

Limitar el nmero de filas devueltas


En los siguientes ejemplos se utiliza OFFSET y FETCH para limitar el nmero de filas
devueltas por una consulta.

Se aplica a: SQL Server 2012 a SQL Server 2014 y Windows Azure SQL Database.
A.Especificar constantes enteras para los valores de OFFSET y FETCH
En el siguiente ejemplo se especifica una constante entera como valor para las
clusulas OFFSET y FETCH. La primera consulta devuelve todas las filas ordenadas
segn la columna DepartmentID. Compare los resultados devueltos por esta consulta
con los de las dos consultas siguientes. La consulta siguiente utiliza la clusula OFFSET
5 ROWS para omitir las primeras 5 filas y devolver todas las restantes. La ltima
consulta utiliza la clusula OFFSET 0 ROWS para comenzar por la primera fila y, a
continuacin, utiliza FETCH NEXT 10 ROWS ONLY para limitar las filas devueltas a 10
filas del conjunto de resultados ordenado.
USE AdventureWorks2012;
GO
-- Return all rows sorted by the column DepartmentID.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID;
-- Skip the first 5 rows from the sorted result set and return all
remaining rows.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID OFFSET 5 ROWS;
-- Skip 0 rows and return only the first 10 rows from the sorted result
set.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID

OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;

B.Especificar variables para los valores de OFFSET y FETCH


En el siguiente ejemplo se declaran las variables @StartingRowNumber y @FetchRows,
y se especifican estas variables en las clusulas OFFSET y FETCH.
USE AdventureWorks2012;
GO
-- Specifying variables for OFFSET and FETCH values
DECLARE @StartingRowNumber tinyint = 1
, @FetchRows tinyint = 8;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC
OFFSET @StartingRowNumber ROWS
FETCH NEXT @FetchRows ROWS ONLY;

C.Especificar expresiones para los valores de OFFSET y FETCH


En el siguiente ejemplo se utiliza la expresin @StartingRowNumber - 1 para
especificar el valor de OFFSET y la expresin @EndingRowNumber @StartingRowNumber + 1 para especificar el valor de FETCH. Adems, se especifica la
sugerencia de consulta OPTIMIZE FOR. Esta sugerencia se puede usar para que se
utilice un valor concreto para una variable local al compilar y optimizar la consulta. El
valor se utiliza solo durante la optimizacin de la consulta y no durante la ejecucin de
la misma. Para obtener ms informacin, vea Sugerencias de consulta (Transact-SQL).
USE AdventureWorks2012;
GO
-- Specifying expressions for OFFSET and FETCH values
DECLARE @StartingRowNumber tinyint = 1
, @EndingRowNumber tinyint = 8;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC
OFFSET @StartingRowNumber - 1 ROWS
FETCH NEXT @EndingRowNumber - @StartingRowNumber + 1 ROWS ONLY
OPTION ( OPTIMIZE FOR (@StartingRowNumber = 1, @EndingRowNumber = 20) );

D.Especificar una subconsulta escalar constante para los valores de OFFSET y


FETCH
En el siguiente ejemplo se utiliza una subconsulta escalar constante a fin de definir el
valor para la clusula FETCH. La subconsulta devuelve un valor nico de la
columna PageSize de la tabla dbo.AppSettings.
-- Specifying a constant scalar subquery
USE AdventureWorks2012;

GO
CREATE TABLE dbo.AppSettings (AppSettingID int NOT NULL, PageSize int NOT
NULL);
GO
INSERT INTO dbo.AppSettings VALUES(1, 10);
GO
DECLARE @StartingRowNumber tinyint = 1;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC
OFFSET @StartingRowNumber ROWS
FETCH NEXT (SELECT PageSize FROM dbo.AppSettings WHERE AppSettingID =
1) ROWS ONLY;

E.Ejecutar varias consultas en una sola transaccin


En el siguiente ejemplo se muestra un mtodo de implementar una solucin de
paginacin que permite asegurarse de la devolucin de resultados estables en todas
las solicitudes de la consulta. La consulta se ejecuta en una sola transaccin utilizando
el nivel de aislamiento de instantnea, mientras que la columna especificada en la
clusula ORDER BY asegura la singularidad de la columna.
USE AdventureWorks2012;
GO
-- Ensure the database can support the snapshot isolation level set for
the query.
IF (SELECT snapshot_isolation_state FROM sys.databases WHERE name =
N'AdventureWorks2012') = 0
ALTER DATABASE AdventureWorks2012 SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
-- Set the transaction isolation level to SNAPSHOT for this query.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO
-- Beging the transaction
BEGIN TRANSACTION;
GO
-- Declare and set the variables for the OFFSET and FETCH values.
DECLARE @StartingRowNumber int = 1
, @RowCountPerPage int = 3;
-- Create the condition to stop the transaction after all rows have been
returned.
WHILE (SELECT COUNT(*) FROM HumanResources.Department) >=
@StartingRowNumber
BEGIN
-- Run the query until the stop condition is met.

SELECT DepartmentID, Name, GroupName


FROM HumanResources.Department
ORDER BY DepartmentID ASC
OFFSET @StartingRowNumber - 1 ROWS
FETCH NEXT @RowCountPerPage ROWS ONLY;
-- Increment @StartingRowNumber value.
SET @StartingRowNumber = @StartingRowNumber + @RowCountPerPage;
CONTINUE
END;
GO
COMMIT TRANSACTION;
GO

Usar ORDER BY con UNION, EXCEPT e INTERSECT


Cuando una consulta utiliza los operadores UNION, EXCEPT o INTERSECT, la clusula
ORDER BY se debe especificar al final de la instruccin y se ordenan los resultados de
las consultas combinadas. En el siguiente ejemplo se devuelven todos los productos
que son rojos o amarillos y la lista combinada se ordena segn la columna ListPrice.
USE AdventureWorks2012;
GO
SELECT Name, Color, ListPrice
FROM Production.Product
WHERE Color = 'Red'
-- ORDER BY cannot be specified here.
UNION ALL
SELECT Name, Color, ListPrice
FROM Production.Product
WHERE Color = 'Yellow'
ORDER BY ListPrice ASC;

OVER (clusula de
Transact-SQL)
SQL Server 2014
Otras versiones

Determina las particiones y el orden de un conjunto de filas antes de que se aplique la


funcin de ventana asociada. Es decir, la clusula OVER define una ventana o un
conjunto de filas definido por el usuario en un conjunto de resultados de la
consulta. Una funcin de ventana calcula entonces un valor para cada fila de la
ventana. Puede utilizar la clusula OVER con funciones para calcular valores agregados
tales como medias mviles, agregados acumulados, totales acumulados o N elementos
superiores por resultados del grupo.
Se aplica a:

Funciones de categora

Funciones de agregado

Funciones analticas

Funcin NEXT VALUE FOR

Se aplica a: SQL Server (SQL Server 2008 a versin actual), Windows Azure SQL Database (Versin
inicial a versin actual).

Convenciones de sintaxis de Transact-SQL

Sintaxis
OVER (
[ <PARTITION BY clause> ]
[ <ORDER BY clause> ]
[ <ROW or RANGE clause> ]
)
<PARTITION BY clause> ::=
PARTITION BY value_expression , ... [ n ]
<ORDER BY clause> ::=
ORDER BY order_by_expression
[ COLLATE collation_name ]
[ ASC | DESC ]
[ ,...n ]

<ROW or RANGE clause> ::=


{ ROWS | RANGE } <window frame extent>
<window frame extent> ::=
{
<window frame preceding>
| <window frame between>
}
<window frame between> ::=
BETWEEN <window frame bound> AND <window frame bound>
<window frame bound> ::=
{
<window frame preceding>
| <window frame following>
}
<window frame preceding> ::=
{
UNBOUNDED PRECEDING
| <unsigned_value_specification> PRECEDING
| CURRENT ROW
}
<window frame following> ::=
{
UNBOUNDED FOLLOWING
| <unsigned_value_specification> FOLLOWING
| CURRENT ROW
}
<unsigned value specification> ::=
{ <unsigned integer literal> }

Argumentos
PARTITION BY
Divide el conjunto de resultados de la consulta en particiones. La funcin se
aplica a cada particin por separado y el clculo se reinicia para cada particin.
value_expression
Especifica la columna a partir de la cual se particiona el conjunto de
filas. value_expression solo puede hacer referencia a columnas disponibles a
travs de la clusula FROM. value_expression no puede hacer referencia a
expresiones ni a alias de la lista de seleccin. value_expression puede ser una
expresin de columna, una subconsulta escalar, una funcin escalar o una
variable definida por el usuario.

<Clusula ORDER BY>


Define el orden lgico de las filas dentro de cada particin del conjunto de
resultados. Es decir, especifica el orden lgico en el que se realiza el clculo de
la funcin de ventana.
order_by_expression
Especifica la columna o expresin segn la cual se va a realizar la
ordenacin. order_by_expression solo puede hacer referencia a columnas
disponibles a travs de la clusula FROM. No se puede especificar un nmero
entero para representar un nombre de columna o alias.
COLLATE collation_name
Especifica que la operacin ORDER BY se debe realizar segn la intercalacin
especificada en collation_name.collation_name puede ser un nombre de
intercalacin de Windows o un nombre de intercalacin de SQL. Para obtener
ms informacin, vea Compatibilidad con la intercalacin y Unicode. COLLATE
solo se aplica a las columnas con tipos de
datos char, varchar, nchar y nvarchar.
ASC | DESC
Indica que los valores de la columna especificada se deben ordenar en sentido
ascendente o descendente. ASC es el criterio de ordenacin
predeterminado. Los valores NULL se tratan como los valores ms bajos
posibles.
ROWS | RANGE

Se aplica a: SQL Server 2012 a SQL Server 2014.

Limita an ms las filas de la particin especificando los puntos inicial y


final. Para ello, se especifica un rango de filas con respecto a la fila actual
mediante asociacin lgica o asociacin fsica. La asociacin fsica se realiza
mediante la clusula ROWS.
La clusula ROWS restringe las filas dentro de una particin especificando un
nmero fijo de filas delante y detrs de la fila actual. La clusula RANGE
tambin puede restringir lgicamente las filas de una particin especificando un
rango de valores con respecto al valor de la fila actual. Las filas precedentes y
siguientes se definen en funcin de la ordenacin de la clusula ORDER BY. El
marco de ventana RANGE CURRENT ROW incluye todas las filas que

tienen los mismos valores en la expresin ORDER BY que la fila actual. Por
ejemplo, ROWS BETWEEN 2 PRECEDING AND CURRENT ROW indica que la
ventana de filas en la que opera la funcin tiene un tamao de tres filas, con
dos filas delante hasta e inclusive la fila actual.

Nota

ROWS o RANGE requieren que se especifique la clusula ORDER BY. Si ORDER BY


contiene varias expresiones de orden, CURRENT ROW FOR RANGE considera todas las
columnas de la lista ORDER BY al determinar la fila actual.
UNBOUNDED PRECEDING

Se aplica a: SQL Server 2012 a SQL Server 2014.

Especifica que la ventana comienza en la primera fila de la


particin. UNBOUNDED PRECEDING solo se puede especificar como punto inicial
de la ventana.
<especificacin de valor sin signo> PRECEDING
Se especifica con <especificacin de valor sin signo> para indicar el nmero de
filas o valores que preceden a la fila actual. Esta especificacin no se permite
para RANGE.
CURRENT ROW

Se aplica a: SQL Server 2012 a SQL Server 2014.

Especifica que la ventana comienza o termina en la fila actual cuando se utiliza


con ROWS, o el valor actual cuando se utiliza con RANGE. CURRENT ROW se
puede especificar como punto inicial o final.
BETWEEN <lmite del marco de ventana > AND <lmite del marco de ventana >

Se aplica a: SQL Server 2012 a SQL Server 2014.

Se utiliza con ROWS o RANGE para especificar los puntos de lmite inferior
(inicio) y superior (final) de la ventana. <lmite del marco de ventana> define el
punto inicial del lmite y <lmite del marco de ventana> define el punto final. El
lmite superior no puede ser menor que el lmite inferior.
UNBOUNDED FOLLOWING

Se aplica a: SQL Server 2012 a SQL Server 2014.

Especifica que la ventana termina en la ltima fila de la particin. UNBOUNDED


FOLLOWING solo se puede especificar como punto final de una ventana. Por
ejemplo, RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING define
una ventana que empieza en la fila actual y termina en la ltima fila de la
particin.
<especificacin de valor sin signo> FOLLOWING
Se especifica con <especificacin de valor sin signo> para indicar el nmero de
filas o valores detrs de la fila actual. Cuando <especificacin de valor sin
signo> FOLLOWING se especifica como punto inicial de la ventana, el punto final
debe ser <especificacin de valor sin signo>FOLLOWING. Por ejemplo, ROWS
BETWEEN 2 FOLLOWING AND 10 FOLLOWING define una ventana que empieza
en la segunda fila a partir de la fila actual y termina en la dcima fila a partir de
la fila actual. Esta especificacin no se permite para RANGE.
literal entero sin signo

Se aplica a: SQL Server 2012 a SQL Server 2014.

Es un literal entero positivo (incluido el 0) que especifica el nmero de filas o de


valores delante o detrs de la fila o el valor actual. Esta especificacin es vlida
solamente para ROWS.

Comentarios generales

Se pueden utilizar varias funciones de ventana en una sola consulta con una nica
clusula FROM. La clusula OVER de cada funcin puede diferir en particiones y
tambin en orden.
Si no se especifica PARTITION BY, la funcin trata todas las filas del conjunto de
resultados de la consulta como un nico grupo.
Si no se especifica ORDER BY, se utiliza la particin completa para el marco de
ventana. Esto se aplica nicamente a las funciones que no requieren la clusula ORDER
BY. Si no se especifica ROWS/RANGE pero s ORDER BY, RANGE UNBOUNDED
PRECEDING AND CURRENT ROW se utiliza como valor predeterminado para el marco de
ventana. Esto se aplica solamente a las funciones que pueden aceptar la especificacin
opcional de ROWS/RANGE. Por ejemplo, las funciones de clasificacin no pueden
aceptar ROWS/RANGE; por lo tanto, este marco de ventana no se aplica aunque se
especifique ORDER BY y no se especifique ROWS/RANGE.
Si se especifica ROWS/RANGE y se usa <marco de ventana precedente> para
<extensin de marco de ventana> (sintaxis abreviada), esta especificacin se usa para
el punto inicial del lmite del marco de ventana y CURRENT ROW se usa para el punto
final. Por ejemplo, ROWS 5 PRECEDING es igual a ROWS BETWEEN 5 PRECEDING
AND CURRENT ROW.

Limitaciones y restricciones
No se puede utilizar la clusula OVER con la funcin de agregado CHECKSUM.
No se puede utilizar RANGE con <especificacin de valor sin signo> PRECEDING o
<especificacin de valor sin signo> FOLLOWING.
Dependiendo de la funcin de clasificacin, de agregado o analtica utilizada con la
clusula OVER, puede que no se admitan la <clusula ORDER BY> o la <clusula
ROWS y RANGE>.

Ejemplos
A.Utilizar la clusula OVER con la funcin ROW_NUMBER
En el ejemplo siguiente se muestra cmo usar la clusula OVER con la funcin
ROW_NUMBER para mostrar un nmero de fila para cada fila de una particin. La
clusula ORDER BY especificada en la clusula OVER ordena las filas de cada particin
por la columna SalesYTD. La clusula ORDER BY en la instruccin SELECT determina el
orden en que se devuelve el conjunto completo de resultados de la consulta.
USE AdventureWorks2012;
GO

SELECT ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC)


AS "Row Number",
p.LastName, s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0
ORDER BY PostalCode;
GO
El conjunto de resultados es el siguiente.
Row Number

LastName

SalesYTD

PostalCode

--------------- ----------------------- --------------------- ---------1

Mitchell

4251368.5497

98027

Blythe

3763178.1787

98027

Carson

3189418.3662

98027

Reiter

Vargas

Ansman-Wolfe

Pak

Varkey Chudukatil

Saraiva

Ito

Valdez

Mensa-Annan

Campbell

Tsoflias

2315185.611

98027

1453719.4653

98027

1352577.1325

98027

4116871.2277

98055

3121616.3202
2604540.7172

2458535.6169
1827066.7118
1576562.1966
1573012.9383
1421810.9242

98055
98055

98055
98055
98055
98055
98055

B.Utilizar la clusula OVER con funciones de agregado


En el ejemplo siguiente se utiliza la clusula OVER con funciones de agregado en todas
las filas devueltas por la consulta. En este ejemplo, el uso de OVER es ms eficaz que
usar subconsultas para obtener los valores agregados.
USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS Total
,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Avg"
,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Count"
,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Min"
,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Max"
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO
El conjunto de resultados es el siguiente.
SalesOrderID ProductID
Max
------------ ---------------- -----43659
776
6
43659
777
6
43659
778
6
43659
771
6
43659
772
6
43659
773
6
43659
774
6
43659
714
6
43659
716
6
43659
709
6
43659
712
6
43659
711
6

OrderQty Total

Avg

Count

Min

-------- ----------- ----------- ----------1

26

12

26

12

26

12

26

12

26

12

26

12

26

12

26

12

26

12

26

12

26

12

26

12

43664
4
43664
4
43664
4
43664
4
43664
4
43664
4
43664
4
43664
4

772

14

775

14

714

14

716

14

777

14

771

14

773

14

778

14

En el ejemplo siguiente se muestra el uso de la clusula OVER con una funcin de


agregado en un valor calculado.
USE AdventureWorks2012;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS Total
,CAST(1. * OrderQty / SUM(OrderQty) OVER(PARTITION BY SalesOrderID)
*100 AS DECIMAL(5,2))AS "Percent by ProductID"
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO
El conjunto de resultados es el siguiente. Tenga en cuenta que los agregados se
calculan mediante SalesOrderID y se calcula Percent by ProductID para cada lnea de
cada SalesOrderID.
SalesOrderID ProductID
OrderQty Total
------------ ----------- -------- ------------------------------------------------43659
776
1
26
43659
777
3
26
43659
778
1
26
43659
771
1
26
43659
772
1
26
43659
773
2
26
43659
774
1
26
43659
714
3
26
43659
716
1
26
43659
709
6
26
43659
712
2
26
43659
711
4
26

Percent by ProductID

3.85
11.54
3.85
3.85
3.85
7.69
3.85
11.54
3.85
23.08
7.69
15.38

43664
43664
43664
43664
43664
43664
43664
43664

772
775
714
716
777
771
773
778

1
4
1
1
2
3
1
1

14
14
14
14
14
14
14
14

7.14
28.57
7.14
7.14
14.29
21.4
7.14
7.14

(20 row(s) affected)

C.Producir una media mvil y un total acumulativo


En el ejemplo siguiente se usan las funciones AVG y SUM con la clusula OVER para
proporcionar una media mvil y un total acumulado de ventas anuales para cada
territorio de la tabla Sales.SalesPerson. Se crean particiones de los datos
por TerritoryID y se ordenan lgicamente por SalesYTD. Esto significa que la funcin
AVG se calcula para cada territorio en funcin del ao de ventas. Observe que
para TerritoryID 1, solo hay dos filas para el ao de ventas 2005, que representan los
dos vendedores con ventas durante ese ao. Se calculan las ventas medias de estas
dos filas y la tercera fila que representa las ventas durante el ao 2006 se incluye en el
clculo.
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY
DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY
DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;
El conjunto de resultados es el siguiente.
BusinessEntityID TerritoryID SalesYear
SalesYTD
MovingAvg
CumulativeTotal
---------------- ----------- ----------- --------------------------------------- -------------------274
NULL
2005
559,697.56
559,697.56
559,697.56

287
1,079,603.50
285
1,252,127.95
283
1,462,795.04
280
1,462,795.04
284
1,500,717.42
275
3,763,178.18
277
3,189,418.37
276
3,354,952.08
281
3,354,952.08

NULL

2006

519,905.93

539,801.75

NULL

2007

172,524.45

417,375.98

1
1
1
2
3
4
4

2005
2,925,590.07
2005
2,925,590.07
2006
4,502,152.27
2005
3,763,178.18
2005
3,189,418.37
2005
6,709,904.17
2005
6,709,904.17

1,573,012.94
1,352,577.13
1,576,562.20
3,763,178.18
3,189,418.37
4,251,368.55
2,458,535.62

(10 row(s) affected)


En este ejemplo, la clusula OVER no incluye PARTITION BY. Esto significa que la funcin
se aplicar a todas las filas devueltas por la consulta. La clusula ORDER BY
especificada en la clusula OVER determina el orden lgico al que se aplica la funcin
AVG. La consulta devuelve una media mvil de ventas por ao para todos los territorios
de ventas especificados en la clusula WHERE. La clusula ORDER BY especificada en
la instruccin SELECT determina el orden en que se muestran las filas de la consulta.
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (ORDER BY
DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (ORDER BY
DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY SalesYear;
El conjunto de resultados es el siguiente.
BusinessEntityID TerritoryID SalesYear
SalesYTD
MovingAvg
CumulativeTotal
---------------- ----------- ----------- --------------------------------------- -------------------274
NULL
2005
559,697.56
2,449,684.05
17,147,788.35

275
2
2005
2,449,684.05
17,147,788.35
276
4
2005
2,449,684.05
17,147,788.35
277
3
2005
2,449,684.05
17,147,788.35
280
1
2005
2,449,684.05
17,147,788.35
281
4
2005
2,449,684.05
17,147,788.35
283
1
2005
2,449,684.05
17,147,788.35
284
1
2006
2,138,250.72
19,244,256.47
287
NULL
2006
2,138,250.72
19,244,256.47
285
NULL
2007
1,941,678.09
19,416,780.93
(10 row(s) affected)

3,763,178.18
4,251,368.55
3,189,418.37
1,352,577.13
2,458,535.62
1,573,012.94
1,576,562.20
519,905.93
172,524.45

D.Especificar la clusula ROWS


Se aplica a: SQL Server 2012 a SQL Server 2014.

En el ejemplo siguiente se utiliza la clusula ROWS para definir una ventana de cuyas
filas se calcula la fila actual y el nmero N de filas incluidas a continuacin (1 fila en
este ejemplo).
SELECT BusinessEntityID, TerritoryID
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY
DATEPART(yy,ModifiedDate)
ROWS BETWEEN CURRENT ROW AND
1 FOLLOWING ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5;
El conjunto de resultados es el siguiente.
BusinessEntityID TerritoryID SalesYTD
SalesYear
CumulativeTotal
---------------- ----------- -------------------- -----------------------------274
NULL
559,697.56
2005
1,079,603.50

287
285
283
2,925,590.07
280
2,929,139.33
284
1,576,562.20
275
3,763,178.18
277
3,189,418.37
276
6,709,904.17
281
2,458,535.62

NULL
NULL
1

519,905.93
172,524.45
1,573,012.94

2006
2007
2005

1,352,577.13

2005

1,576,562.20

2006

3,763,178.18

2005

3,189,418.37

2005

4,251,368.55

2005

2,458,535.62

2005

692,430.38
172,524.45

En el ejemplo siguiente, la clusula ROWS se especifica con UNBOUNDED


PRECEDING. El resultado es que la ventana comienza en la primera fila de la particin.
SELECT BusinessEntityID, TerritoryID
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY
DATEPART(yy,ModifiedDate)
ROWS UNBOUNDED PRECEDING),1)
AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5;
El conjunto de resultados es el siguiente.
BusinessEntityID TerritoryID
CumulativeTotal
---------------- -----------------------------274
NULL
287
NULL
1,079,603.50
285
NULL
1,252,127.95
283
1
1,573,012.94
280
1
2,925,590.07
284
1
4,502,152.27

SalesYTD

SalesYear

-------------------- ----------559,697.56
519,905.93

2005
2006

172,524.45

2007

1,573,012.94

2005

1,352,577.13

2005

1,576,562.20

2006

559,697.56

275
3,763,178.18
277
3,189,418.37
276
4,251,368.55
281
6,709,904.17

3,763,178.18

2005

3,189,418.37

2005

4,251,368.55

2005

2,458,535.62

2005

Sintaxis de SQL
Tablas
Una base de datos contienen uno o mas tablas. Cada tabla esta identificada por un
nombre (ejemplo Clientes o Ordenes). Las tablas contienen registros (filas) con datos

Sentencias SQL

Creamos la base de datos


CREATE DATABASE empresa
Creamos la tabla Personas
CREATE TABLE dbo.Personas
(
P_id int PRIMARY KEY IDENTITY,
Nombre nchar(20) NOT NULL,
Apellidos nchar(30) NOT NULL,
Direccion nchar(40) NOT NULL,
Ciudad nchar(10) NOT NULL
)
GO
Insertamos algunos registros:
INSERT INTO Personas
VALUES ('Marco Antonio','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Martha Beatriz','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas

VALUES ('Juana Elvira','Trejo Lemus','Calle E 822','Tampico')


INSERT INTO Personas
VALUES ('Nora Zulma','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Laura Lucero','Sobrevilla Trejo','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Maria de la luz','Trejo Campos','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Trinidad','Trejo Bautista','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Marcel Abisag','Sobrevilla Trejo','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Jose Abraham','Sobrevilla Trejo','Calle E 822','Tampico')
INSERT INTO Personas
VALUES ('Samuel Salomon','Olmeda Trejo','Calle E 822','Tampico')
Muchas de las acciones que necesitas realizar en una base de datos se hacen con
sentencias SQL
Seleccionamos todos los registros de la tabla
Las siguiente sentencia seleccionara todos los registros de la tabla "Personas" :
SELECT * FROM Personas
Abajo esta un ejemplo del resultado de la sentencia a la tabla llamada "Personas":

Este tutorial te enseara acerca de las diferentes declaraciones en SQL


Manten en mente lo siguiente: las sentencias SQL no son sencibles a las mayusculas o
minisculas
Punto y coma despues de las sentencias SQL
Algunos sistemas de bases de datos requieren un punto y coma al final de cada
sentencia SQL

El punto y como es un estandar que se para cada sentencia SQL en sistemas de bases
de datos que habilitan mas de una sentencia SQL ejecutada en la misma llamada al
servidor
SQL DML Y DLL
SQL puede ser dividido en dos partes: El Lenguaje de Manipulacion de Datos (DML) y el
Lenguaje de Definicion de Datos (DDL)

La parte DML del SQL de los comandos de consulta y actualizacion son:


SELECT - extrae datos de una base de datos
UPDATE - actualiza datos en una base de datos
DELETE - borra datos de una base de datos
INSERT INTO - inserta datos dentro de una base de datos

DLL del SQL que permite a bases de datos y tablas ser creadas o borradas.
Tambien define indices(llaves). especifica enlaces entre tablas, y impone relaciones
entre tablas.
La parte DLL del SQL, las sentencias mas importante DDL en SQL son:
CREATE DATABASE - crea una nueva base de datos
ALTER DATABASE - modifica una base de datos
CREATE TABLE - crea una nueva tabla
ALTER TABLE - modifica una tabla
DROP TABLE - borra una tabla
CREATE INDEX - crea un indice (llave de busqueda)
DROP INDEX - borra un indice
La sentencia SELECT
La sentencia SELECT es usada para seleccionar datos de una base de datos.

El resultado es almacenado en una tabla temporal, llamada tabla-resultado


La sintaxis SQL de la sentencia SELECT es:
1) SELECT nombre_columna(s)
FROM nombre_tabla
y
2) SELECT * FROM nombre_tabla

Ejemplo 1
SELECT nombre_columna(s)
FROM nombre_tabla

SELECT Nombre,Apellidos,Ciudad
FROM Personas

Ejemplo 2

SELECT * FROM nombre_tabla

SELECT * FROM nombre_tabla

Navegacion en una tabla de resultados

Muchos sistemas de bases de datos permiten la navegacion en la tabla de resultados


programando funciones como: Moverse-Al-Primero, Obtener-Contenido-Registro,
Moverse-Al-Siguiente-Registro, etc.
Funciones de programacion como estas no son parte de este tutorial. Para aprender a
accesar a datos con la llamada a funciones espera mi siguiente tutorial ADO y PHP.

La sentencia SELECT DISTINCT

Dentro de una tabla, algunas columnas pueden contener valores duplicados. Esto no es
un problema, algunas veces tu querras listar solo los valores diferentes (distintos) en la
tabla
La palabra DISTINCT puede ser usada como llave para regresar solo los valores
distintos(diferentes).
Sintaxis SQL SELECT DISTINCT
SELECT DISTINCT nombre_columna(s)
FROM nombre_table
Ejemplo:
SELECT DISTINCT Apellidos
FROM Personas
Abajo esta el resultado de la sentencia DISTINCT a la tabla "Personas":

SELECT DISTINCT Ciudad FROM Personas


Abajo esta el resultado de la sentencia DISTINCT a la tabla "Personas":

SQL WHERE
La sentencia where es usada para extraer solo los registros que cumplen con el criterio
especificad
La Sintaxis SQL WHERE
SELECT nombre_columna(s)
FROM nombre_tabla
WHERE nombre_columna operador valor
Ejemplo de la sentecia WHERE
SELECT *
FROM Personas
WHERE Apellidos ='Trejo Lemus'

Comillas en los campos de texto


SQL usa comillas simples en los valores de texto (muchos sitemas manejadores de
bases de datos aceptan comillas dobles).Para SQL los valores de texto deben ser
puestos entre comillas simples
Los valores numericos no deben ser puestos entre comillas
Para valores de texto:
Esta es la forma correcta:
SELECT *
FROM Personas
WHERE Nombre='Lucero'
Esta es la forma equivocada:
SELECT *

FROM Personas
WHERE Nombre=Lucero
Para valores numericos:
Esta es la forma correcta:
SELECT *
FROM Personas
WHERE P_id = 9
Esta es la forma incorrecta:
SELECT *
FROM Personas
WHERE P_id = '9'

Operadores permitidos en la sentencia WHERE


Con la sentencia WHERE, los siguientes operadores pueden ser usados:

Operadores SQL AND y OR


Los operadores AND y OR son usados para filtrar registros basados en mas de una
condicion
Operador AND
El operador AND muestra el registro si la primera condicion y la segunda condicion son
verdaderas
El operador OR muestra el registro si la primera o la segunda condicion es verdadera
Ahora teniendo en cuenta la siguiente tabla:

Para seleccionar solo las personas con el Nombre igual a Marcel Abisag y el apellido
igual a Sobrevilla Trejo,
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Nombre='Marcel Abisag'
AND Apellidos='Sobrevilla Trejo'

El resultado seria:

Operador OR
Ahora seleccionaremos las personas con el campo Nombre igual a "Martha" o el campo
Nombre igual a "Elvira"
Usaremos la siguiente sentencia SELECT
SELECT * FROM Personas
WHERE Nombre='Martha Beatriz'
OR Nombre='Juana Elvira'
El resultado sera el siguiente:

Combinando AND & OR

Puedes combinar el AND y el OR (usando parentesis para formar expresiones


complejas)
Ahora seleccionaremos solo las personas con el campo Apellidos igual a "Sobrevilla
Trejo" AND Nombre igual a "Marcel Abisag" OR igual a "Jose Abraham"
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas WHERE
Apellidos='Sobrevilla Trejo'
AND (Nombre='Marcel Abisag' OR Nombre='Jose Abraham')
El resultado sera el siguiente:

SQL ORDER BY
The ORDER BY keyword is used to sort the result-set.
La sentencia ORDER BY es usada para ordenar un resultado ordenado por una columna
especifica
La sentencia ORDER BY es usada para ordenar los registros en orden ascendente por
default
Si quieres ordenar los registros en orden descendente utiliza la palabra DESC
Sintaxis SQL ORDER BY
SELECT nombre_columna(s)
FROM nombre_tabla
ORDER BY nombre_column(s) ASCDESC
Ahora vamos a seleccionar todas las personas de la tabla, pero mostrando en orden por
el campo Nombre
Usaremos la siguiente sentencia SELECT:

SELECT * FROM Personas


ORDER BY Nombre
El resultado sera el siguiente:

ORDER BY DESC
Ahora vamos a seleccionar a todas las personas de la tabla pero mostrandolas en un
orden descendente por el campo Nombre con la palabra DESC
We use the following SELECT statement:
SELECT * FROM Personas
ORDER BY Nombre DESC
El resultado sera el siguiente:

Sentencia SQL INSERT INTO


La sentencia INSERT INTO se usa para insertar un registro o fila en una tabla
Sintaxis SQL INSERT INTO
Es posible escribir la sentencia INSET INTO en dos formas
La primera forma no especifica los nombres de las columnas donde los datos seran
insertados solo los valores:
INSERT INTO nombre_tabla
VALUES (valor1, valor2, valor3,...)

La segunda forma especifica los nombres de las columnas y los valores insertados
INSERT INTO nombre_tabla (columna1, columna2, columna3,...)
VALUES (valor1, valor2, valor3,...)
Ejemplo INSERT INTO
Dado que tenemos la siguiente tabla Personas:

Insertaremos un nuevo registro de la siguiente forma:


INSERT INTO Personas
VALUES ('Martha', 'Lemus Hurtado', 'Canoga Park', 'L.A.')
El resultado lo mostrariamos con la sentencia SELECT * FROM Personas y seria el
siguiente:

Insertar Datos solo en columnas especificadas


Es posible agregar datos en columnas especificas
Las siguientes sentencias SQL agregaran una nueva fila, pero solo agregaran datos en
las columnas Nombre y Apellidos

INSERT INTO Personas (Nombre, Apellidos)


VALUES ('Antonio', 'Trejo Campos')

Para mostrar el resultado con la sentencia: SELECT * FROM Personas


Mostrara lo siguiente:

Sentencia SQL UPDATE Statement


La sentencia UPDATE es usada para actualizar registros en una tabla
Sintaxis SQL UPDATE
UPDATE nombre_tabla
SET columna1=valor, column2=valor,...
WHERE alguna_columna=algun_valor
Nota: La sentencia WEHRE en la sintaxis UPDATE, especifica cual de los registros va a
ser actualizado. Si omites la sentencia WHERE todos los registros seran actualizados.
Ahora vamos a actualizar la persona "Antonio Trejo Campos" en la tabla Personas
Usaremos la siguientes sentencias SQL:
UPDATE Personas
SET Direccion='Canoga Park', Ciudad='L.A.'
WHERE Nombre='Antonio' AND Apellido='Trejo Campos'
El resultado sera el siguiente:

CUIDADO!!! al utilizar la sentencia UPDATE


Si omites la sentencia WHERE se actualizaran todos los registros de esta forma:
UPDATE Personas
SET Direccion='Canoga Park', Ciudad='L.A.'
El resultado seria:

Sentencia SQL DELETE


La sentencia DELETE se usa para borrar registros o filas en una tabla
Sintaxis SQL DELETE
DELETE FROM nombre_tabla
WHERE alguna_columna=algun_valor
Nota: La sentencia WHERE en la sintaxis DELETE especifica el registro o los registros
que seran borrados, si omites la sentencia WHERE, todos los registros seran borrados
de la tabla

Ahora vamos a borrar la persona "Marco Antonio Trejo Lemus" en la tabla Personas con
la siguiente sentencia:
DELETE FROM Personas
WHERE Nombre='Marco Antonio' AND Apellidos='Trejo Lemus'
SELECT * FROM Personas
El resultado sera el siguiente:

Borrar todas las filas


Es posible borrar todas las filas en una table sin borrar la tabla en si. Esto significa que
la estructura de la tabla, atributos e indices quedaran intactos:
DELETE FROM nombre_tabla
or
DELETE * FROM nombre_tabla
Nota: Debes tener cuidado cuando borres registros. Ya que no podras deshacer lo que
hagas con esta sentencia.

APENDICE 1
El siguiente codigo creara la base de datos en el servidor SQL EXPRESS

1.- Hacer clic en Inicio --> Todos los Programas --> Microsoft SQL SERVER 2008 --> SQL

Server Management Studio


2.- Hacer clic en el boton CONECTAR

3.- Hacer clic Nueva Consulta (se encuentra en el margen superior izquierdo)

Seleccionar y Copiar el siguiente "CODIGO GENERADOR


DE BASE DE DATOS" empresa:
______________________________________________________

USE master
if exists (select * from sysdatabases where name='empresa')
begin
raiserror('La base de datos existe; eliminndola....',0,1)
DROP database empresa

end
GO
raiserror('Creando base de datos empresa....',0,1)
go
CREATE DATABASE empresa
GO
USE empresa
GO
CREATE TABLE Personas(
P_id int PRIMARY KEY IDENTITY,
Nombre nchar(20) NOT NULL,
Apellidos nchar(30) NOT NULL,
Direccion nchar(40) NOT NULL,
Ciudad nchar(10) NOT NULL)
GO
GO
INSERT INTO Personas VALUES ('Marco Antonio','Trejo Lemus','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Martha Beatriz','Trejo Lemus','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Juana Elvira','Trejo Lemus','Calle E
822','Tampico')
INSERT INTO Personas VALUES ('Nora Zulma','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas VALUES ('Laura Lucero','Sobrevilla Trejo','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Maria de la luz','Trejo Campos','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Trinidad','Trejo Bautista','Calle E
822','Tampico')
INSERT INTO Personas VALUES ('Marcel Abisag','Sobrevilla Trejo','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Jose Abraham','Sobrevilla Trejo','Calle E
822','Tampico')INSERT INTO Personas VALUES ('Samuel Salomon','Olmeda Trejo','Calle E
822','Tampico')
GO
select * from Personas
quit
______________________________________________________

4.- Pegar el codigo

5.- Ejecutar el codigo SQL haciendo clic sobre la opcion !Ejecutar que se muestra a
continuacion:

Publicado por Marco Antonio Trejo Lemus en 19:18 1 comentario:

lunes, 18 de mayo de 2009


AVANZADO
Clausula SQL TOP
La clausula TOP se usa para especificar el numer de registros que existen
puede verificar la longitud de las tablas con miles de registros, regresando el numero
de registros
Nota: No todas las bases de datos soportan la clausula TOP
Sintaxis SQL Server
SELECT TOP numeroporciento nombre_columna(s)

FROM nombre_tabla
Ahora seleccionaremos solo los dos primeros registros de la tabla que se muestra
abajo:

Utilizaremos las siguientes sentencias SELECT:


SELECT TOP 2 * FROM Personas
El resultado sera el siguiente:

Sentencia SQL TOP PERCENT


Ahora seleccionaremos solo el 50% de los registros en la tabla
Usaremos las siguientes sentencias SELECT:
SELECT TOP 50 PERCENT * FROM Personas
El resultado se muestra abajo en la tabla:

Operador SQL LIKE


Operador SQL LIKE

El operador LIKE se usa en una sentencia WHERE para buscar un patron en una
columna
Sintaxis LIKE
SELECT nombre_columna(s)
FROM nombre_tabla
WHERE nombre_columna LIKE patron

Ejemplo de operador LIKE


En la tabla "Personas" :
Vamos a buscar las personas que viven en la ciudad de Tampico que empiecen con "Ta"
de la tabla en cuestion
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad LIKE 'Ta%'
El signo "%" puede ser usado para definir comodines (letras que faltan en el patron de
busqueda) ambas antes o despues del patron de busqueda
El resultado seria el siguiente:

Ahora vamos a seleccionar las personas que viven en la ciudad que comienza con una
"T" de la tabla personas
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad LIKE '%T'
El resultado seria el siguiente:

Ahora vamos a seleccionar las personas que viven en la ciudad que contiene el patron
"tam" de la tabla personas
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad LIKE '%tam%'

El resultado seria el siguiente:

Tambien es posible seleccionar las personas que viven en la ciudad que no contienen el
patron "tamp" de la tabla personas, usando la palabra clave NOT
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad NOT LIKE '%tamp%'
El resultado seria el siguiente:

Comodines SQL
Los comodines SQL pueden ser usados en la busqueda de datos en una base de datos
pueden sustituir a uno o mas caracteres cuando se busquen los datos
Los comodines deben usarse con el operador LIKE
Se pueden usar con SQL los siguientes comodines:

Usando el comodn %
Ahora seleccionaremos las personas que viven en la ciudad de Tampico que empiecen
con "Ta" de la tabla Personas

Usaremos la siguiente sentencia SELECT:


SELECT * FROM Personas
WHERE Ciudad LIKE 'Ta%'
Ahora buscaremos las personas que viven en la ciudad que contenga el patron "ico" de
la tabla Personas
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Ciudad LIKE '%ico%'

Usando el _ Comodn
Ahora selectionaremos las personas que el primer nombre comience con algun caracter
seguido de "Ma" de la tabla Personas
Usaremos la siguiente sentencia SELECT:
SELECT * FROM Personas
WHERE Nombre LIKE '_ar'

Вам также может понравиться