Historia de SQL Server
Historia de SQL Server
Que es sgdb
www.microsoft.com/sql/
Información general
Desarrollador(es) Microsoft
Género RDBMS
Programado en C, C++
Versiones[editar]
Historia de versiones5
1.0
1989 SQL Server 1-0 SQL
(OS/2)
4.21
1993 SQL Server 4.21 SEQUEL
(WinNT)
El código fuente original de SQL Server que fue utilizado en las versiones previas a la
versión 7.0 habría sido comprado de Sybase, pero fue actualizado en las versiones 7.0 y
2000, y reescrito en la versión 2005. Generalmente, cada 2-3 años, una nueva versión es
lanzada y, entre estos lanzamientos, se proponen service packes con mejoras y
correcciones de bugs, y hotfixes por problemas urgentes en el sistema de seguridad o
bugs críticos.
Características[editar]
Soporte de transacciones.
Soporta procedimientos almacenados.
Incluye también un entorno gráfico de administración, que permite el uso
de comandos DDL y DMLgráficamente.
Permite trabajar en modo cliente-servidor, donde la información y datos se alojan en
el servidor y los terminales o clientes de la red sólo acceden a la información.
Además permite administrar información de otros servidores de datos.
Este sistema incluye una versión reducida, llamada MSDE con el mismo motor de base de
datos pero orientado a proyectos más pequeños, que en sus versiones 2005 y 2008 pasa
a ser el SQL Express Edition, que es una edición Open Source ,es decir, se distribuye en
forma gratuita.
Es común desarrollar proyectos completos empleando Microsoft SQL Server y Microsoft
Access a través de los llamados ADP (Access Data Project). De esta forma se completa
la base de datos (Microsoft SQL Server), con el entorno de desarrollo (VBA Access), a
través de la implementación de aplicaciones de dos capas mediante el uso de
formularios Windows.
En el manejo de SQL mediante líneas de comando se utiliza el SQLCMD, osql, o
PowerShell.
Para el desarrollo de aplicaciones más complejas (tres o más capas), Microsoft SQL
Server incluye interfaces de acceso para varias plataformas de desarrollo, entre
ellas .NET, pero el servidor sólo está disponible para Sistemas Operativos.
El tipo NUMERIC fue mejorado para ser usado como identificador de columna a partir de la
versión 2008 R2.
Programación[editar]
T-SQL[editar]
Artículo principal: T-SQL
Ediciones y servicios[editar]
Cada versión de SQL Server posee distintas versiones con distintos precios (para cada
versión) que dependen también en la configuración física del servidor. 13 A continuación se
presentan las versiones principales:
Enterprise[editar]
Contempla todas las características (deshabilitadas en otras ediciones).Es el tipo de
versión con más privilegios existente en el mercado.
Developer[editar]
Una edición con las mismas características que la Enterprise, con el fin de ser instalada
solamente en ambiente de desarrollo y no en producción. Si se desarrolla para una edición
Standard hay que tener en cuenta las características deshabilitadas para esta versión.
Standard[editar]
Una versión limitada según la configuración del servidor y sus características, diseñada
para servidores inferiores.
Por ejemplo: en la versión 2012, la edición Enterprise soporta un número ilimitado
de procesadores, y la agregación de memoria y CPUs en caliente sin la interrupción
del servicio o del servidor; mientras la edición Standard esta limitada a 16 procesadores y
no soporta la "agregación en caliente".
Express[editar]
Una versión gratuita que posibilita la creación de bases de datos limitadas con
características básicas, con el fin de apoyar aplicaciones que necesiten una solución
simple para almacenamiento de una cantidad limitada de datos, o usuarios que sus
recursos y necesidades son limitados.
En la versión 2012, esta edición puede utilizar un máximo de 1 GB de memoria, y
almacenar no más de 10GB, funciona en servidores con un número máximo de cuatro
procesadores. Estas limitaciones se mantienen en la versión 2014 (4 cores, 1GB ram, y
10Gb por base de datos).
SQL Azure[editar]
Es una versión de SQL Server en la nube, que permite pagar mensualmente por el servicio
sin la necesidad de mantener un servidor físico (On Premise). La empresa paga solo por el
servicio, y el servicio es manejado a través de torres de servidores en distintos lugares en
el mundo.
Con SQL Azure no es necesario instalar, mantener o actualizar un servidor físico; a pesar
que este servicio depende de aspectos relacionados a problemas de seguridad con
respecto a su presencia fuera de la empresa y a la disponibilidad de conexión a Internet.
Durante un tiempo, el servicio fue ampliado con la opción de crear un servidor virtual por la
red, e instalar SQL Server tanto como uno de los servicios competidores, y manejar el
servidor virtual como si fuera un servidor físico local (aunque físicamente no está
accesible); y se puede diferenciar entre la opción original que esta denominada PAAS
(Platform as a Service: El Plataforma como un Servicio) y la nueva opción de los
servidores virtuales denominada IAAS (Infrastructure as a Service, Infraestructura como un
Servicio).
Este servicio esta otorgado por Microsoft desde 2009 y se une a servicios similares
de empresas de third-party.
Interfaz de usuario[editar]
SQL Server proporciona unos interfaz que han cambiado durante los años, de los cuales
los más conocidos son los interfaz gráficos que están utilizados como herramienta de
desarrollo estándar a los desarrolladores y administradores.
La interfaz gráfica hasta 2005 incluyó el Enterprise Manager con una vista de árbol de los
distintos objetos y con la capacidad de manejarlos; y el Query analyzer como interfaz
textual para ejecutar comandos de TSQL.
En la versión 2005 las dos herramientas se unificaron a una –el SQL Server Management
Studio (SSMS), y a partir de 2008 fue incluida la opción de trabajar con el Visual Studio– la
interfaz estándar de desarrollo de Microsoft (a los distintos lenguajes, BI, etc.). Otro
interfaz opcional es la utilización de Línea de comandos, con herramientas como SQLCmd,
ISQL, OSQL que posibilita la ejecución de scripts y procesamiento por lotes. Desde 2008
se puede desarrollar con SQLCmd (SQL Command) a través del SSMS sin interconectarse
al interfaz textual de Windows. Otra opción en el ámbito de scripts es la utilización del
lenguaje de scripts Powershell de Microsoft.
Aparte de los intefaces estándares de SQL Server, se puede ejecutar comandos de TSQL
con herramientas de conexión como ODBC y OLE-DB.14
Servicios[editar]
A contrario de sistemas de bases de datos como Microsoft Access que son "pasivas" y
contienen un archivo a cual hay que conectar y la ejecución de los comandos se lleva a
cabo en el cliente (la computadora de usuario), en SQL Server hay número de servicios,
software que están ejecutadas en la memoria del servidor por parte del sistema, y por lo
tanto aprovechan las capacidades del servidor que es más potente que los clientes,
previenen congestión en la red, y pueden programar tareas que corran aunque el cliente
no está conectado.
Los servicios principales:
master - Todos los procedimientos, funciones y tablas del sistema que están utilizadas
por parte de todas las bases de datos y que están instaladas automáticamente, tanto
como las que han sido creado por parte de los administradores del sistema. Además,
todas las definiciones en respecto a la seguridad a nivel del servidor, están
almacenadas en esta base de datos.
msdb - Almacenamiento de las tareas del agente, los códigos de CLR combinados en
el sistema, los paquetes de SSIS, y otros más.
model - El molde de las bases de datos. Cada nueva base de datos se crea como una
copia de esta base de datos, menos que algo más estaba definido explícitamente.
tempdb - Base de datos temporal que se crea de nuevo cada vez que el servicio
reinicia. Se utiliza para almacenar tablas temporales creadas por parte de los usuarios
o el sistema (por ejemplo en ordenaciones complejos).
Tablas fijas y temporales[editar]
Desde la perspectiva lógica, los datos almacenados en las bases de datos en tablas, que
mediante ellas se implementa la teoría de las bases de datos relacionales. La tabla se
divide en filas y columnas (A veces se les conoce como registros y campos). Las tablas
pueden ser fijas o temporales, mientras que en el segundo caso existen físicamente en la
base de datos tempdb, y se borran automáticamente en caso de desconexión de la sesión
o de la conexión al servidor, depende en el tipo de la tabla temporal.
Desde la perspectiva física, el sistema divide los archivos de la base datos en Extents de
64 KB, y cada cual a ocho páginas de 8 KB. Generalmente, cada Extent se asigna a una
tabla o un índice, menos las tablas pequeñas; y cada página se asigna siempre a una tabla
específica. El sistema es responsable del aumento de los archivos, de acuerdo con los
ajustes del usuario, y de asignar Extents y páginas a las tablas.
A las tablas se puede crear índices. Los índices se almacenan junto a la tabla (Non
Clustered Index) o son la tabla en sí (Clustered Index). Los índices asisten en la búsqueda
de datos en las tablas (como los ficheros en las librerías), en ordenarlas, y la definición
de claves primarias.
Entre las tablas se puede crear una relación de uno a muchos.
Aparte de las tablas de los usuarios, hay tablas que almacenan meta data: datos sobre el
sistema mismo, los diferentes objetos, los derechos, estadísticas sobre el rendimiento del
sistema (DMV), etc.
Tipos de datos[editar]
Para cada columna en una tabla y a cada variable o parámetro, se define un tipo de datos
que sean almacenados en él, entre ellos:
Las vistas se crean definiendo la instrucción SELECT que recupera los datos presentados
por la vista. Las tablas de datos a las que hace referencia la instrucción SELECT se
conocen como las tablas base para la vista. Las vistas en todas las versiones de SQL
Server son actualizables (pueden ser objetivo de instrucciones UPDATE, DELETE o
INSERT) mientras la modificación afecte sólo a una de las tablas base de la vista.
Procedimientos almacenados[editar]
Los procedimientos son scripts de comandos de TSQL, que pueden ser ejecutados con
distintos parámetros. Por ejemplo, procedimiento que obtiene número de año como
parámetro, y actualiza una tabla de resumen de ventas, con las ventas de los agentes en
el dicho año, basada en la tabla de registro de ventas.
Los procedimientos almacenados pueden facilitar en gran medida la administración de la
base de datos y la visualización de información sobre dicha base de datos y sus usuarios.
Los procedimientos almacenados son una colección precompilada de instrucciones SQL e
instrucciones de control de flujo opcionales almacenadas bajo un solo nombre y
procesadas como una unidad. Los procedimientos almacenados se guardan en una base
de datos; se pueden ejecutar desde una aplicación y permiten variables declaradas por el
usuario, ejecución condicional y otras funciones eficaces de programación. Los
procedimientos almacenados pueden contener flujo de programas, lógica y consultas a la
base de datos. Pueden aceptar parámetros, proporcionar resultados de parámetros,
devolver conjuntos de resultados individuales o múltiples y devolver valores.
Las ventajas de utilizar procedimientos almacenados en SQL Server en vez de programas
Transact-SQL almacenados localmente en equipos clientes consisten en que:
• Permiten una programación modular.
Puede crear el procedimiento una vez, almacenarlo en la base de datos, y llamarlo desde
el programa el número de veces que desee. Un especialista en programación de bases de
datos puede crear procedimientos almacenados, que luego será posible modificar
independientemente del código fuente del programa. Facilitan el mantenimiento.
• Permiten una ejecución más rápida.
En situaciones en las que se necesita una gran cantidad de código Transact-SQL, o si las
operaciones se realizan varias veces, los procedimientos almacenados pueden ser más
rápidos que los lotes de código Transact-SQL. Los procedimientos son analizados y
optimizados en el momento de su creación, y es posible utilizar una versión del
procedimiento que se encuentra en la memoria después de que se ejecute por primera
vez. Las instrucciones de Transact-SQL que se envían varias veces desde el cliente cada
vez que deben ejecutarse tienen que ser compiladas y optimizadas siempre que SQL
Server las ejecuta.
• Pueden reducir el tráfico de red.
Una operación que necesite centenares de líneas de código Transact-SQL puede
realizarse mediante una sola instrucción que ejecute el código en un procedimiento, en vez
de enviar cientos de líneas de código por la red.
• Pueden utilizarse como mecanismo de seguridad.
Es posible conceder permisos a los usuarios para ejecutar un procedimiento almacenado,
incluso si no cuentan con permiso para ejecutar directamente las instrucciones del
procedimiento.
Consultas Distribuidas[editar]
Las consultas distribuidas tienen acceso a datos de varios orígenes, que pueden estar
almacenados en un equipo o en equipos distintos. Microsoft SQL Server 2000 admite las
consultas distribuidas a través de OLE DB Las consultas distribuidas proporcionan a los
usuarios de SQL Server acceso a:
• Datos distribuidos almacenados en múltiples instancias SQL Server.
• Datos heterogéneos almacenados en varios orígenes de datos relacionales y no
relacionales a los que se tiene acceso mediante un proveedor OLE DB.
Los proveedores OLE DB exponen datos en objetos tabulares llamados conjuntos de filas.
En las instrucciones Transact-SQL, SQL Server 2000 permite que se haga referencia a los
conjuntos de filas de los proveedores OLE DB como si fueran una tabla de SQL Server. En
las instrucciones SELECT, INSERT, UPDATE y DELETE de Transact-SQL, se puede
hacer referencia directa a las tablas y vistas de orígenes de datos externos. Puesto que las
consultas distribuidas usan OLE DB como interfaz subyacente, éstas tienen acceso a los
sistemas DBMS relacionales tradicionales con procesadores de consultas SQL, así como a
los datos administrados por orígenes de datos de capacidad y sofisticación diversas.
Siempre que el software propietario de los datos los expone en un conjunto de filas tabular
a través del proveedor OLE DB, los datos se podrán usar en las consultas distribuidas.
Nota: El uso de las consultas distribuidas en SQL Server es similar a la funcionalidad de
las tablas vinculadas mediante ODBC, que anteriormente admitía Microsoft Access. Esta
funcionalidad se encuentra ahora integrada en SQL Server con OLE DB como interfaz
para los datos externos.
Transacciones[editar]
Una transacción es un conjunto de comandos, que se está ejecutado completamente o no
ejecutado en absoluto: todo o nada. Por ejemplo, si una suma de dinero fue trasladada de
una cuenta bancaria a otra, y hay que actualizar ambas cuentas sobre el depósito y la
retirada; es obligatorio que ambas cuentas se actualizan juntas, o ninguna (en caso que
una de las actualizaciones falla); para evitar consecuencias inconsistentes de un depósito
sin ninguna retirada, o viceversa. Por lo tanto, una transacción es una secuencia de
operaciones realizadas como una sola unidad lógica de trabajo. Una unidad lógica de
trabajo debe exhibir cuatro propiedades, conocidas como propiedades ACID (atomicidad,
coherencia, aislamiento y durabilidad), para ser calificada como transacción:
Atomicidad
Una transacción debe ser una unidad atómica de trabajo, tanto si se realizan todas sus
modificaciones en los datos, como si no se realiza ninguna de ellas.
Coherencia
Cuando finaliza, una transacción debe dejar todos los datos en un estado coherente. En
una base de datos relacional, se deben aplicar todas las reglas a las modificaciones de la
transacción para mantener la integridad de todos los datos. Todas las estructuras internas
de datos, como índices de árbol B o listas doblemente vinculadas, deben estar correctas al
final de la transacción.
Aislamiento
Las modificaciones realizadas por transacciones simultáneas se deben aislar de las
modificaciones llevadas a cabo por otras transacciones simultáneas. Una transacción ve
los datos en el estado en que estaban antes de que otra transacción simultánea los
modificara o después de que la segunda transacción se haya concluido, pero no ve un
estado intermedio. Esto se conoce como seriabilidad debido a que su resultado es la
capacidad de volver a cargar los datos iniciales y reproducir una serie de transacciones
para finalizar con los datos en el mismo estado en que estaban después de realizar las
transacciones originales.
Durabilidad
Una vez concluida una transacción, sus efectos son permanentes en el sistema. Las
modificaciones persisten aún en el caso de producirse un error del sistema.
SQL Server tiene una capacidad limitada de anidar transacciones.
El optimizador[editar]
El optimizador es una parte del software que "toma la decisión" de como cada comando se
ejecutará, tanto que la ejecución será lo más eficiente, o por lo menos bastante eficiente
(es decir, bastante eficiente para evitar seguir buscando otra solución, que aún que sea
más eficiente, el precio de la búsqueda adicional "costará" más que el ahorro de recursos).
SQL es un lenguaje declarativo, en el cual el desarrollador declara que quiere extraer o
actualizar sin la necesidad de indicar cómo (a contrario de los lenguajes imperativos, y por
lo tanto el optimizador juega un papel protagónico, que de acuerdo con las estadísticas
que el sistema almacena sobre las distribuciones de los datos en las tablas, los indexes, y
reglas internas; toma la decisión adecuada.
1Introducción
2Historia
o 2.1Sistemas de navegación (1960)
o 2.2Sistemas relacionales (1970)
o 2.3Sistemas SQL (finales de década de 1970)
o 2.4Sistemas orientados a objetos (1980)
o 2.5Sistemas NoSQL (2000)
o 2.6Sistemas XML (2010)
3Componentes
4Lenguajes de modelación
o 4.1Estructura jerárquica
o 4.2Estructura en red
o 4.3Estructura relacional
o 4.4Estructura multidimensional
o 4.5Estructura orientada a objetos
5Lenguajes de consulta
6Arquitectura
7Véase también
8Referencias
Introducción[editar]
Las bases de datos generalmente funcionan en computadoras que se dedican de forma
exclusiva a este campo. Por las prestaciones requeridas, generalmente funcionan en
computadoras multiprocesador con abundante memoria.
Para el almacenamiento de los datos puede contar con sistemas de disco propio
o almacenamiento de conexión directa (DAS), puede conectarse a una red de
almacenamiento(SAN) o conectarse a un sistema de almacenamiento en red (NAS).
Existen aceleradores hardware, usados en grandes sistemas de proceso de transacciones.
Los SGBD se encuentran en el corazón de toda aplicación que maneje datos. Los SGBD
se basan en sistemas operativos estándar para efectuar dichas funciones.
En este artículo
1. A. Usar SELECT para recuperar filas y columnas
2. B. Usar SELECT con encabezados de columna y cálculos
3. C. Usar DISTINCT con SELECT
4. D. Crear tablas con SELECT INTO
5. E. Usar subconsultas correlacionadas
6. F. Usar GROUP BY
7. G. Usar GROUP BY con varios grupos
8. H. Usar GROUP BY y WHERE
9. I. Usar GROUP BY con una expresión
10. J. Usar GROUP BY con ORDER BY
11. K. Usar la cláusula HAVING
12. L. Usar HAVING y GROUP BY
13. M. Usar HAVING con SUM y AVG
14. N. Usar la sugerencia del optimizador INDEX
15. M. Usar OPTION y las sugerencias GROUP
16. O. Usar la sugerencia de consulta UNION
17. P. Usar una instrucción UNION simple
18. Q. Usar SELECT INTO con UNION
19. R. Usar UNION con dos instrucciones SELECT y ORDER BY
20. S. Usar UNION de tres instrucciones SELECT para mostrar los efectos de ALL y los paréntesis
21. Consulte también
SQLCopiar
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
SQLCopiar
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 línea de
productos de R y cuyo valor correspondiente a los días para fabricar es inferior
a 4.
SQLCopiar
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 cálculos
SQLCopiar
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
SQLCopiar
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
SQLCopiar
USE AdventureWorks2012;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO
D. Crear tablas con SELECT INTO
SQLCopiar
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.
SQLCopiar
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
SQLCopiar
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
SQLCopiar
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
SQLCopiar
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 específico.
SQLCopiar
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
SQLCopiar
USE AdventureWorks2012;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Debido a la cláusula GROUP BY, solo se devuelve una fila que contiene la suma de
todas las ventas por cada pedido de venta.
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.
SQLCopiar
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
SQLCopiar
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 expresión
En este ejemplo se agrupa por una expresión. Puede agrupar por una expresión
si ésta no incluye funciones de agregado.
SQLCopiar
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
SQLCopiar
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 cláusula HAVING
SQLCopiar
USE AdventureWorks2012;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
SQLCopiar
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
SQLCopiar
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
SQLCopiar
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:
SQLCopiar
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
cálculos de cada producto, use HAVING COUNT(*) > 1500 para eliminar los
productos que devuelven totales inferiores a 1500 elementos vendidos. La
consulta sería la siguiente:
SQLCopiar
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
SQLCopiar
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
SQLCopiar
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
SQLCopiar
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 instrucción UNION simple
SQLCopiar
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
SQLCopiar
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
SQLCopiar
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 paréntesis
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 paréntesis incluyen al
segundo UNION que no utiliza ALL. El segundo UNION se procesa en primer lugar
porque se encuentra entre paréntesis. Devuelve 5 filas porque no se utiliza la
opción ALL y se quitan los duplicados. Estas 5 filas se combinan con los
resultados del primer SELECT mediante las palabras clave UNION ALL. Esto no quita
los duplicados entre los dos conjuntos de 5 filas. El resultado final es de 10 filas.
SQLCopiar
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