
Objetivos del curso Consultas con Transact-SQL Server
Al completar este curso usted será capaz de:
Crear objetos de base de datos
Creación y alteración de tablas mediante la sintaxis T-SQL (instrucciones simples)
Crear tablas sin usar las herramientas integradas; ALTER; DROP; ALTER COLUMN; CREATE
Crear y alterar las vistas (instrucciones simples)
Crear vistas indizadas; crear vistas sin usar las herramientas integradas; CREATE, ALTER, DROP
Diseño de vistas
Garantizar la no regresión del código manteniendo una firma coherente para procedimiento, vistas y función (interfaces); implicaciones en la seguridad
Crear y modificar restricciones (instrucciones simples)
Crear restricciones en las tablas; definir restricciones; restricciones únicas; restricciones predeterminadas; restricciones primarias y de clave externa
Creación y alteración de desencadenadores DML
Tablas insertadas y eliminadas; desencadenadores anidados; tipos de desencadenadores; actualización de funciones; manejo de varias filas en una sesión y repercusiones de los desencadenadores en el rendimiento
Trabajar con datos
Consulta de los datos mediante las instrucciones SELECT
Usar la función de categorías para seleccionar las (X) primeras filas para incluir varias categorías en una sola consulta; escribir y realizar consultas de manera eficaz mediante los elementos de código nuevos (SQL 2005/8) como sinónimos y uniones (except e intersect); implementar la lógica que usa metadatos de sistema y SQL dinámicos; escribir consultas SQL eficaces y técnicamente complejas, incluidos todos los tipos de uniones frente al uso de tablas derivadas; determinar el código que se puede ejecutar en base a las tablas proporcionadas; dada una tabla con restricciones, determinar el conjunto de instrucciones que cargaría una tabla; usar y conocer distintas tecnologías de acceso de datos; case frente a isnull frente a coalesce
Implementación de subconsultas
Identificar elementos problemáticos en los planes de consulta; dinamización y anulación de dinamización; aplicar operador; instrucción CTE y con instrucción
Implementación de tipos de datos
Usar datos apropiados; conocer los usos y limitaciones de cada tipo de datos; impacto de GUID (newid, newsequentialid) en el rendimiento de la base de datos; saber cuándo y qué tipo de datos usar para las columnas
Implementar consultas agregadas
Nuevas funciones analíticas; conjuntos de agrupamiento; agregaciones espaciales; aplicar funciones de ordenación
Consultar y administrar datos XML
Comprender tipos de datos XML y sus esquemas e interoperabilidad con limitaciones y restricciones; implementar esquemas XML y control de los datos XML; datos XML: cómo controlarlos en SQL Server y cuándo usarlos; incluidos espacios de nombres XML; importar y exportar XML; indización XML
Modificar datos
Creación y alteración de los procedimientos almacenados (instrucciones simples)
Escribir un procedimiento almacenado para que cumpla un conjunto dado de requisitos; lógica de bifurcación; crear procedimientos almacenados y otros objetos de programación; técnicas para desarrollar procedimientos almacenados; distintos tipos de resultados de procedimientos almacenados; crear un procedimiento almacenado para capa de acceso de datos; programar procedimientos almacenados, desencadenadores, funciones con T-SQL
Modificación de los datos mediante las instrucciones INSERT, UPDATE y DELETE
Dado un conjunto de códigos con elementos predeterminados, restricciones y desencadenadores, determinar la salida de un conjunto de DDL; conocer cuáles son las mejores instrucciones SQL para satisfacer los requisitos comunes y usar una instrucción de salida
Combinar conjuntos de datos
Diferencia entre UNIR y UNIR todo; caso frente a isnull frente a unión; modificar datos mediante las instrucciones MERGE
Uso de funciones
Comprender funciones deterministas y no deterministas; valores escalares y de tabla; aplicar funciones escalares integradas; crear y alterar las funciones definidas por el usuario (UDF)
Solucionar problemas y optimizar
Optimización de consultas
Entender estadísticas; leer planes de consultas; planificar guías; DMV; sugerencias; E/S de estadísticas; consultas dinámicas frente a consultas con parámetros; describir los distintos tipos de unión (HASH, MERGE, LOOP) y describir los escenarios en los que se usarían
Administración de transacciones
Marcar una transacción; entender begin tran, commit y rollback; transacciones implícitas frente a explícitas; niveles de aislamiento; ámbito y tipo de bloqueos; trancount
Evaluación del uso de las operaciones basadas en filas frente a las operaciones basadas en conjuntos
Cuándo usar cursores; impacto de las UDF escalares y combinar varias operaciones DML
Implementación del manejo de errores
Implementar try/catch/throw; usar la lógica basada en conjuntos en lugar de la basada en filas y administrar transacciones
Link de descarga directa del ejecutable para descargar el SQL Server 2017:
https://download.microsoft.com/download/5/A/7/5A7065A2-C81C-4A31-9972-8A31AC9388C1/SQLServer2017-SSEI-Dev.exe
Link de descarga directa del ejecutable para descargar el SQL Server 2019:
https://go.microsoft.com/fwlink/?linkid=866662
Link de descarga directa del ejecutable para luego descargar el SQL Server 2025
https://www.microsoft.com/es-es/evalcenter/evaluate-sql-server-2025
SQL Server Management Studio (SSMS) es un entorno integrado y gratuito de Microsoft diseñado para configurar, administrar y gestionar componentes de SQL Server y Azure SQL. Proporciona herramientas gráficas y editores de scripts, permitiendo a desarrolladores y administradores interactuar, consultar y manipular bases de datos de forma eficiente.
Link descarga: https://aka.ms/ssms/22/release/vs_SSMS.exe
https://github.com/microsoft/sql-server-samples/tree/master/samples/databases/northwind-pubs
Un tema que me apasiona mucho, son las bases de datos, que en nuestro mundo de hoy son vitales y están presentes en casi cualquier actividad, en las finanzas de una empresa para llevar su registro de gastos e ingresos, en las universidad para llevar el control de notas de los alumnos, cuando vamos al cajero automático a sacar dinero estamos accediendo a la base de datos del banco y así podemos mencionar un sin número de actividades donde las bases de datos son vitales, por esta razón importante contar con los conceptos fundamentales si nuestro rol es administrativo y si es informático es un punto obligado, pero cuál es el origen de las bases de datos que usamos hoy en día y en especial del SQL Server de Microsoft, que por cierto usamos el modelo relacional. Pues déjenme contarles la historia.
En 1970 Edgar “Ted” Codd, matemático empleado por IBM, escribió un artículo que cambiaría todo lo anterior en bases de datos.Codd propuso el modelo relacional y asociado a este un sub-lenguaje de acceso a los datos basado en el cálculo de predicados, en ese momento de la historia IBM tenía intereses en otro sistema, el IMS, un confiable y muy especializado sistema de base de datos que apareció en 1968 y que le rendía considerables ganancias, por lo que no se percató que las teorías de Codd encenderían una revolución tecnológica comparable al internet o el perfeccionamiento de las computadoras personales.
Entonces Codd organizo un simposio donde redujo complicados programas de cinco páginas a un reglón, lo cual fue sensacional, el simposio convecino a IBM de patrocinar el sistema R, proyecto que construyo el sistema relacional y el lenguaje SEQUEL (Structured English Query Language) que posteriormente llevaría a la creación de SQL, sin embargo IBM al considerar que su mercado potencial estaba con IMS engaveto por muchos años a sistema R y le dio libertad a Ted Codd para publicar sus artículos científicos.
Entre las personalidades en las que hizo eco las teorías de Codd estaba Larry Ellison, que acababa de crear una compañía, reclutando programadores del sistema R y de la universidad de California, lo que hizo que en 1979 Ellison pudiera vender la primera base de datos relacional mucho antes que IBM, posteriormente Ellison llamo a su empresa ORACLE
El SQL pasa a ser el lenguaje por excelencia de los diversos sistemas de gestión de bases de datos relacionales surgidos en los años siguientes como Sybase, Postgrate, DB2 y es por fin estandarizado en 1986 por el ANSI, dando lugar a la primera versión estándar de este lenguaje, el "SQL-86" o "SQL1". Al año siguiente este estándar es también adoptado por la ISO.
Sin embargo, este primer estándar no cubre todas las necesidades de los desarrolladores e incluye funcionalidades de definición de almacenamiento que se consideró suprimirlas. Así que, en 1992, se lanzó un nuevo estándar ampliado y revisado del SQL llamado "SQL-92" o "SQL2".
En la actualidad el SQL es el estándar de la inmensa mayoría de los Sistemas Gestores de Base de datos comerciales. Y, aunque cada implementación comercial del lenguaje agrega características particulares, el soporte al estándar SQL-92 es general y muy amplio.
La aparición de Microsoft en el mundo de los SGBD basados en SQL se da en 1988 cuando en colaboración con SyBase , IBM y Ashton-Tate, Microsoft decide crear un sistema de gestión de base de datos para el sistema operativo OS/2, sistema en el cual era copropietario junto con IBM, tiempo después se desarrolló la versión para Windows NT en el año de 1993, en ese entonces era un producto muy básico para todo el potencial que ha alcanzado hoy en día.
Al año siguiente en 1994 Sybase y Microsoft deciden dar por terminada su colaboración y SyBase se dedica al desarrollo de su base de dato y Microsoft a la suya.
Después de la separación un año más tarde en 1995 Microsoft lanza su primera versión independiente y como único propietario y desarrollador de SQL Server con la versión Microsoft SQL Server 6.0 una versión mejorada principalmente en rendimiento, y en el año de 1996 se lanza la versión Microsoft SQL Server 6.5 una versión que se mantuvo vigente 2 años antes de sacar una nueva versión en 1998, la 7.0 versión que realizar mejoras considerables en cuanto usabilidad, potencia y rendimiento, convirtiéndose en una de las versiones más fuertes, su avance fue tan significativo que pudo competir a sistemas como ORACLE o el propio DB2, y poco a poco colocarse como una propuesta atractiva a empresas que manejaban grandes volúmenes de datos por su funcionalidad y costo, esta versión permaneció estable y con ligeras actualizaciones hasta el desarrollo de Microsoft SQL Server 2000 versión que incorpora ediciones para diferentes roles comerciales una de ellas la edición de 64 bits, workgroup, desktop engine, profesional, personal, standard, developer, Enterprise, etc. y durante los siguientes 5 años comenzó a causarle delirios de persecución a los gigantes de las bases de datos como ORACLE, IBM con DB2, SyBase, entre otros.
Para la versión 2016 de SQL Server es un sistema gestor líder en el mercado, que permite desarrollar aplicaciones innovadoras, con herramientas de alta disponibilidad, escalabilidad, integración de datos, gestión y además con un poderoso conjunto de funciones de Inteligencia de Negocios para el análisis y obtención de datos comprensibles superando por mucho en esta área a los otros productos en el mercado.
Para el desarrollo de nuestros ejercicios usaremos la base de datos de ejemplo Northwind una base de datos que provee Microsoft, el script que genera la base de datos puede ser descargada de "Materiales descargables". Para implementarla solo tiene que abrir el archivo con su SQL Management Studio y ejecutar todo el script.
SELECT es una instrucción de petición de datos, su traducción literal al español es SELECCIONAR, pero por su función se traduciría como DEVUELVAME.
¿Y qué devuelve? Puede devolver una colección de datos provenientes de una tabla o tablas, o los valores resultado de funciones, aunque su sintaxis es compleja se pueder resumir de la siguiente manera:
SELECT lista_de_campos [ INTO nuevo_nombre_de_tabla ] FROM lista_de_Tablas [ WHERE condición_de_busqueda ] [ GROUP BY lista_de_campos_agrupadores ] [ HAVING condición_de_busqueda ] [ ORDER BY lista_de_Campos_ordenadores [ ASC | DESC ] ]
lista_de_campos
Describe las columnas del conjunto de resultados. Es una lista de expresiones separadas por comas. Cada expresión define tanto el formato (tipo de datos y tamaño) como el origen de los datos para la columna del conjunto de resultados. Cada expresión de lista de selección suele ser una referencia a una columna de la tabla o vista de origen de la que provienen los datos, aunque puede ser cualquier otra expresión, como una constante o una función Transact-SQL. Al usar la expresión * en una lista de selección, se especifica que se devolverán todas las columnas de la tabla de origen.
INTO nuevo_nombre_de_tabla
Especifica que el conjunto de resultados se usa para crear una tabla nueva. new_table_name especifica el nombre de la nueva tabla.
FROM lista_de_Tablas
Contiene una lista de las tablas cuyos datos del conjunto de resultados se recuperan. Estos orígenes pueden ser:
Tablas base en el servidor local que ejecuta SQL Server.
Vistas en la instancia local de SQL Server. SQL Server resuelve internamente la referencia de una vista a las referencias en las tablas base que componen la vista.
Tablas vinculadas. Estas tablas se encuentran en orígenes de datos OLE DB a los que puede tener acceso SQL Server. Este elemento se denomina consulta distribuida. Desde SQL Server se puede tener acceso a los orígenes de datos OLE DB si se vinculan como un servidor vinculado o se hace referencia al origen de datos en una función OPENROWSET u OPENQUERY.
La cláusula FROM también puede contener especificaciones de combinación. Estas especificaciones definen la ruta de acceso específica que va a utilizar SQL Server para desplazarse entre las tablas.
La cláusula FROM se usa también en las instrucciones DELETE y UPDATE para definir las tablas que se modifican.
WHERE condición_de_busqueda
La cláusula WHERE es un filtro que define las condiciones que debe cumplir cada fila de las tablas de origen para satisfacer los requisitos de la instrucción SELECT. Sólo las filas que cumplen las condiciones contribuyen con datos al conjunto de resultados. Los datos de las filas que no cumplen las condiciones no se usan.
La cláusula WHERE se usa también en las instrucciones DELETE y UPDATE para definir las filas de las tablas de destino que deben modificarse.
GROUP BY lista_de_campos_agrupadores
La cláusula GROUP BY divide en grupos el conjunto de resultados según los valores de las columnas de group_by_list. Por ejemplo, la tabla AdventureWorks2008R2 Sales.SalesOrderHeader incluye diez valores en TerritoryID. Una cláusula GROUP BY TerritoryID divide el conjunto de resultados en 10 grupos, uno por cada valor de TerritoryID.
HAVING condición_de_busqueda
La cláusula HAVING es un filtro condicional que se aplica al conjunto de resultados. Lógicamente, la cláusula HAVING filtra las filas del conjunto intermedio de resultados que se genera como consecuencia de la aplicación de alguna cláusula FROM, WHERE o GROUP BY en la instrucción SELECT. Las cláusulas HAVING se usan normalmente con una cláusula GROUP BY, aunque no se necesita una cláusula GROUP BY antes de una cláusula HAVING.
ORDER BY lista_de_Campos_ordenadores[ ASC | DESC ]
La cláusula ORDER BY define el orden de las filas del conjunto de resultados. order_list especifica las columnas del conjunto de resultados que forman la lista de clasificación. Las palabras clave ASC y DESC se utilizan para especificar si las filas se ordenan en una secuencia ascendente o descendente.
La cláusula ORDER BY es importante porque la teoría relacional especifica que no se puede suponer que las filas de un conjunto de resultados tengan secuencias, a menos que se especifique ORDER BY. ORDER BY debe usarse en cualquier instrucción SELECT para la que sea importante el orden de las filas del conjunto de resultados.
Las cláusulas de una instrucción SELECT deben especificarse en el orden correcto.
La sentencia básica para realizar consultas en una base de datos es “SELECT”, es una instrucción de petición de datos, que puede devolver tanto el resultado de una función de un único valor como un conjunto de datos que provienen de una o varias tablas, es decir para consultar datos necesitas hacer un “SELECT” acompañado de otras instrucciones que enmarcan el formato de una consulta.
Puede ser que una consulta de datos sea tan recurrente que necesites dejar guardada tu instrucción “SELECT” para reutilizarla, esto se puede hacer creando una “VISTA”
Necesitamos de una consulta en todo momento para obtener información que extraemos de las tablas de almacenamiento, para transformar nuestros datos dependiendo como fueron almacenados, por ejemplo, puede ser que cuentes en tu tabla con un campo “GENERO” pero se decidió guardar el dato de forma numérica representando un cero para mujer y un uno para hombre, por lo tanto, necesitaras acompañar tu instrucción “SELECT” de una función que te permita convertir los ceros por la palabra “Mujer” y los unos por la palabra “HOMBRE”.
Al usar la sentencia “SELECT” también es necesario y vital poder limitar el numero de datos cuando necesitas uno o algunos en particular, se necesita también ordenarlos, agruparlos, filtrarlos cuando ya han sido agrupados, es importante comprender como tomar datos de tablas diferentes, por todo esto se hace necesario conocer la estructura básica de una consulta y algunas funciones especiales que serán necesarias como herramientas de consulta.
Estructura de una consulta:
SELECT <lista de campos>
FROM <Tabla fuente>
WHERE <condición de filtro>
GROUP BY <lista de campos por los que agrupar>
ORDER BY <lista de campos por los que ordenar>
Relacionado con un comentario anterior donde hablamos de la necesidad de transformar los datos, usemos como primera función, de varias instrucciones que iremos descubriendo, la función CASE que nos permite evaluar el valor que contiene un campo o variable y en base a este valor condicionar un resultado.
Por ejemplo supongamos que tenemos el campo Estado Civil pero hemos decidido guardar la información de forma numérica asignando “1” para Casado y “2” para Soltero.
Aunque esta información se guarde de esta manera al momento de ejecutar una consulta o solicitar un reporte no nos sirve que el campo se muestre con números 1 y 2, en este caso queremos que estos números sean sustituidos por casado y soltero.
Para esto sirve la función CASE, veamos el ejemplo:
Select Nombre, Apellido,
CASE EstadoCivil
WHEN 1 THEN 'Casado'
WHEN 2 THEN 'Soltero'
ELSE 'No Definido' END AS EstadoCivilNew
from Persona
También se puede escribir de la siguiente forma, solo cambia el alias del campo creado con la función CASE colocándolo al inicio en vez de al final que en vez de ponerlo al final:
Select Nombre, Apellido,
EstadoCivilNew= CASE EstadoCivil
WHEN 1 THEN 'Casado'
WHEN 2 THEN 'Soltero'
ELSE 'No Definido' END
from Persona
Mi ejemplo solo se muestra condiciones para dos valores pero es posible agregar más, ahora si existiera un valor que no está definido, es decir para mi ejemplo si tuviéramos el valor “3” que no está definido entonces ejecutaría el mensaje puesto en la condición ELSE.
Las uniones o “JOINS” permiten recuperar datos de dos o más tablas según las relaciones lógicas entre ellas. Las uniones o combinaciones indican cómo debe usar Microsoft SQL Server los datos de una tabla para seleccionar las filas de otra tabla.
Una condición de combinación define la forma en la que dos tablas se relacionan en una consulta al:
Especificar la columna de cada tabla que debe usarse para la combinación. Una condición de combinación típica especifica una clave externa de una tabla y su clave asociada en otra tabla.
Especificar un operador lógico (por ejemplo, = o <>) para usarlo en los valores de comparación de las columnas.
Las combinaciones internas se pueden especificar en las cláusulas FROM o WHERE. Las combinaciones externas sólo se pueden especificar en la cláusula FROM. Las condiciones de combinación se combinan con las condiciones de búsqueda de WHERE y HAVING para controlar cuáles son las filas seleccionadas de las tablas base a las que se hace referencia en la cláusula FROM.
Especificar las condiciones de la combinación en la cláusula FROM ayuda a separarlas de cualquier otra condición de búsqueda que se pueda especificar en una cláusula WHERE; es el método recomendado para especificar combinaciones. La sintaxis simplificada de la combinación de la cláusula FROM de ISO es:
FROM primera_tabla join_tipo segunda_tabla [ON (join_condición)]
join_type especifica el tipo de combinación que se lleva a cabo: interior, exterior o cruzada. join_condición define el predicado que se va a evaluar en cada par de filas combinadas. A continuación se muestra un ejemplo de la especificación de una combinación en la cláusula FROM:
FROM dbo.Customers JOIN dbo.Orders ON (Customers.CustomerID = Orders.CustomerID)
A continuación se incluye un ejemplo de una instrucción SELECT sencilla con esta combinación:
SELECT Customers.CustomerID, Customers.Commpanyname, Orders.Orderid, Orders.Orderdate FROM dbo.Customers JOIN dbo.Orders ON (dbo.Customers.CustomerID = dbo.Orders.CustomerID) WHERE Orders.Orderdate > '01-01-1998' AND Customers.Companyname LIKE N'F%' GO
La selección devuelve la información de el cliente y sus respectivas ordenes donde la fecha de la orden sea a partir del uno de enero de mil novecientos noventa y ocho y el nombre de la compañía en el cliente empiece con F
Cuando en una consulta simple se hace referencia a varias tablas, ninguna de las referencias a las columnas debe ser ambigua. En el ejemplo anterior, las tablas Customers y Orders incluyen una columna CustomerID. Cualquier nombre de columna que esté duplicado en varias tablas a las que se hace referencia en la consulta debe ser calificado con el nombre de la tabla. Todas las referencias a las columnas del ejemplo están calificadas.
Cuando el nombre de una columna no está duplicado en varias de las tablas usadas en la consulta, las referencias al mismo no tienen que calificarse con el nombre de la tabla. Esto se muestra en el ejemplo anterior. Algunas veces, resulta difícil entender una instrucción SELECT porque no hay nada que indique la tabla que ha suministrado cada columna. La legibilidad de la consulta puede mejorarse si todas las columnas se califican con sus nombres de tabla. Incluso puede mejorarse más si se usan alias de tablas, especialmente cuando los propios nombres de las tablas se deben calificar con los nombres de las bases de datos y de los propietarios. A continuación se incluye el mismo ejemplo, con la salvedad de que se han asignado alias de tablas y las columnas se han calificado con dichos alias para facilitar su lectura:
SELECT C.CustomerID, C.Commpanyname, O.Orderid, O.Orderdate FROM dbo.Customers as C JOIN dbo.Orders as O ON (C.CustomerID = O.CustomerID) WHERE O.Orderdate > '01-01-1998' AND C.Companyname LIKE N'F%' GO
Los ejemplos anteriores han especificado las condiciones de combinación en la cláusula FROM, lo que constituye el método recomendado. La siguiente consulta contiene la misma condición de combinación especificada en la cláusula WHERE:
SELECT C.CustomerID, C.Commpanyname, O.Orderid, O.Orderdate FROM dbo.Customers as C, dbo.Orders as O WHERE C.CustomerID = O.CustomerID and O.Orderdate > '01-01-1998' AND C.Companyname LIKE N'F%' GO
La lista de selección de una combinación puede hacer referencia a todas las columnas de las tablas combinadas o a cualquier subconjunto de las columnas. No es necesario que la lista de selección contenga columnas de cada tabla de la combinación. Por ejemplo, en una combinación de tres tablas, sólo se puede usar una tabla para pasar de una de las dos tablas a la tercera y no es necesario que se haga referencia a ninguna columna de la tabla intermedia en la lista de selección.
Aunque las condiciones de combinación suelen tener comparaciones de igualdad (=), también se pueden especificar otros operadores relacionales o de comparación, así como otros predicados. .
Cuando SQL Server procesa combinaciones, el motor de consultas elige el método más eficaz entre varias posibilidades para procesar la combinación. La ejecución física de varias combinaciones puede utilizar muchas optimizaciones diferentes y, por consiguiente. no se puede predecir de forma confiable.
No es necesario que las columnas utilizadas en una condición de combinación tengan el mismo nombre o sean del mismo tipo de datos. Sin embargo, si los tipos de datos no son idénticos, deben ser compatibles, o bien deben ser tipos que SQL Server pueda convertir implícitamente. Si los tipos de datos no se pueden convertir implícitamente, la condición de combinación debe convertir explícitamente el tipo de datos mediante la función CAST.
La mayor parte de las consultas que usan una combinación se pueden volver a escribir con una subconsulta (una consulta anidada dentro de otra consulta). La mayor parte de las subconsultas se pueden volver a escribir como combinaciones.
Código de Ejemplo:
----------------Consultas de Varias Tablas-------- Use Northwind go ---Inner Join solo incluye los registros donde ambas tablas coinciden Select customers.customerid, customers.companyname,customers.contactname, customers.country, orders.orderid, orders.orderdate from customers inner join orders on customers.customerid=orders.customerid ---Inner join usando alias Select c.customerid, c.companyname,c.contactname, c.country, o.orderid, o.orderdate from customers as c inner join orders as o on c.customerid=o.customerid ---Left Outer join incluye los campos donde ambas tablas coinciden mas los datos de ---la tabla de la izquierda que no coinciden con elementos de la tabla de la derecha Select c.customerid, c.companyname,c.contactname, c.country, o.orderid, o.orderdate from customers as c left outer join orders as o on c.customerid=o.customerid ---Left Outer join mostrando los elementos de la tabla de la izquierda que no ---coinciden con elementos de la tabla de la derecha Select c.customerid, c.companyname,c.contactname, c.country, o.orderid, o.orderdate from customers as c left outer join orders as o on c.customerid=o.customerid where o.orderid is null ---Right Outer join incluye los campos donde ambas tablas coinciden mas los datos de ---la tabla de de la derecha que no coinciden con elementos de la tabla de la izquierda Select c.customerid, c.companyname,c.contactname, c.country, o.orderid, o.orderdate from customers as c right outer join orders as o on c.customerid=o.customerid ---Right Outer join mostrando los elementos de la tabla de la derecha que no ---coinciden con elementos de la tabla de la izquierda Select c.customerid, c.companyname,c.contactname, c.country, o.orderid, o.orderdate from customers as c right outer join orders as o on c.customerid=o.customerid where c.customerid is null ---Cross Outer join muestra todas las combinaciónes posibles entre los elementos ---de la tabla uno contra los elementos de la tabla dos Select c.customerid, c.companyname,c.contactname, c.country, o.orderid, o.orderdate from customers as c cross join orders as o ---Join de la tabla con ella misma Select j.firstname + ' ' + j.lastname as jefe , e.firstname + ' ' + e.lastname as subalterno from employees as j inner join employees as e on j.employeeid=e.reportsto
Limita las filas devueltas en un conjunto de resultados de consulta a un número especificado de filas o porcentaje de filas en SQL Server 2017. Cuando se utiliza TOP junto con la cláusula ORDER BY, el conjunto de resultados se limita al primer N número de filas ordenadas; De lo contrario, devuelve el primer N número de filas en un orden no definido. Utilice esta cláusula para especificar el número de filas devueltas de una sentencia SELECT o afectadas por una instrucción INSERT, UPDATE, MERGE o DELETE.
SELECT TOP (expression) [PERCENT] [ WITH TIES ] Campo1, Campo2, ... CampoN FROM TABLA
Es la expresión numérica que especifica el número de filas a devolver. La expresión se convierte implícitamente en un valor flotante si se especifica PERCENT; De lo contrario, se convierte en bigint.
Indica que la consulta devuelve sólo el primer porcentaje de expresión de filas del conjunto de resultados. Los valores fraccionarios se redondean al siguiente valor entero.
Se utiliza cuando se desea devolver dos o más filas que empatan en el último lugar del conjunto de resultados limitados. Debe utilizarse con la cláusula ORDER BY. WITH TIES puede provocar que se devuelvan más filas que el valor especificado en la expresión. Por ejemplo, si la expresión se establece en 5 pero 2 filas adicionales coinciden con los valores de las columnas ORDER BY en la fila 5, el conjunto de resultados contendrá 7 filas. TOP ... WITH TIES sólo se puede especificar en sentencias SELECT y sólo si se especifica una cláusula ORDER BY. La orden devuelta de atar registros es arbitraria. ORDER BY no afecta a esta regla.
En una instrucción SELECT, siempre use una cláusula ORDER BY con la cláusula TOP. Esta es la única manera de indicar de manera previsible qué filas están afectadas por TOP.
Utilice OFFSET y FETCH en la cláusula ORDER BY en lugar de la cláusula TOP para implementar una solución de paginación de consulta. Una solución de paginación (es decir, el envío de trozos o "páginas" de datos al cliente) es más fácil de implementar mediante las cláusulas OFFSET y FETCH. Para obtener más información, consulte la cláusula ORDER BY (Transact-SQL).
Utilice TOP (o OFFSET y FETCH) en lugar de SET ROWCOUNT para limitar el número de filas devueltas. Estos métodos se prefieren sobre el uso de SET ROWCOUNT por las siguientes razones:
La cláusula OFFSET-FETCHT proporciona una opción para capturar solo una ventana o una página de resultados del conjunto de resultados. OFFSET-FETCH solo puede utilizarse con la cláusula ORDER BY.
[ORDER BY { order_by_expression [ 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]}
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Especifica el número de filas que omitir, antes de empezar a devolver filas en la expresión de consulta. El argumento de la cláusula OFFSET puede ser un entero o una expresión que sea mayor o igual que cero. Puede usar ROW y ROWS indistintamente.
FETCH { FIRST|NEXT } <rowcount expression> { ROW|ROWS } ONLY
Especifica el número de filas que se devuelven, tras procesar la cláusula OFFSET. El argumento de la cláusula FETCH puede ser un entero o una expresión que sea mayor o igual que uno. Puede usar ROW y ROWS indistintamente. Del mismo modo, FIRST y NEXT se pueden usar indistintamente.
En los ejemplos siguientes se muestra el uso de la cláusula OFFSET-FETCH con ORDER BY.
Ejemplo 1 Se omiten las 10 primeras filas del conjunto de resultados ordenado y se devuelven las filas restantes.
SELECT First Name + ' ' + Last Name FROM Employees ORDER BY First Name OFFSET 10 ROWS;
Ejemplo 2 Se omiten las 10 primeras diez filas del conjunto de resultados ordenado y se devuelven las 5 filas siguientes.
SELECT First Name + ' ' + Last Name FROM Employees ORDER BY First Name OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;
| Grupo | Tipo de dato | Intervalo | Almacenamiento | ||
|---|---|---|---|---|---|
| Numéricos exactos | bigint | De -263 (-9.223.372.036.854.775.808) a 263 - 1 (9.223.372.036.854.775.807) | 8 bytes | ||
| int | De -231 (-2.147.483.648) a 231 - 1 (2.147.483.647) | 4 bytes | |||
| smallint | De -215 (-32.768) a 215 - 1 (32.767) | 2 bytes | |||
| tinyint | De 0 a 255 | 1 byte | |||
| bit | Tipo de datos entero que puede aceptar los valores 1, 0 ó NULL | 2 bytes | |||
| decimal, numeric, decimal (p, s) |
| Precisión 1 - 9: 5 bytes | |||
| money | Tipos de datos que representan valores monetarios o de moneda: de -922.337.203.685,4775808 a 922.337.203.685,4775807 | 8 bytes | |||
| smallmoney | De - 214,7483648 a 214,7483647 | 4 bytes | |||
| Numéricos aproximados | float | De - 1,79E+308 a -2,23E-308, 0 y de 2,23E-308 a 1,79E+308 | Depende del valor de n | ||
| real | De - 3,40E + 38 a -1,18E - 38, 0 y de 1,18E - 38 a 3,40E + 38 | 4 Bytes | |||
| Fecha y hora | smalldatetime | Del 1 de enero de 1900 hasta el 6 de junio de 2079 | |||
| datetime | Del 1 de enero de 1753 hasta el 31 de diciembre de 9999 | ||||
| datetime2 | Del 1 de enero del año 1 después de Cristo al 31 de diciembre de 9999 | ||||
| datetimeoffeset | Del 1 de enero del año 1 después de Cristo al 31 de diciembre de 9999 incluye zona horaria | ||||
| Cadenas de caracteres | char (n) | Caracteres no Unicode de longitud fija, con una longitud de n bytes. n debe ser un valor entre 1 y 8.000 | n bytes | ||
| varchar (n) | Caracteres no Unicode de longitud variable. n indica que el tamaño de almacenamiento máximo es de 231 - 1 bytes | n bytes (aprox.) | |||
| text | En desuso, sustituido por varchar. Datos no Unicode de longitud variable con una longitud máxima de 231 - 1 (2.147.483.647) caracteres | max bytes (aprox.) | |||
| Cadenas de caracteres unicode | nchar (n) | Datos de carácter Unicode de longitud fija, con n caracteres. n debe estar comprendido entre 1 y 4.000 | 2 * n bytes | ||
| nvarchar (n) | Datos de carácter Unicode de longitud variable. n indica que el tamaño máximo de almacenamiento es 231 - 1 bytes | 2 * n bytes + 2 bytes | |||
| ntext (n) | En desuso, sustituido por nvarchar. Datos Unicode de longitud variable con una longitud máxima de 230 - 1 (1.073.741.823) caracteres | 2 * n bytes | |||
| Cadenas binarias | binary (n) | Datos binarios de longitud fija con una longitud de n bytes, donde n es un valor que oscila entre 1 y 8.000 | n bytes | ||
| varbinary (n) | Datos binarios de longitud variable. n indica que el tamaño de almacenamiento máximo es de 231 - 1 bytes | n bytes | |||
| image | En desuso, sustituido por varbinary. Datos binarios de longitud variable desde 0 hasta 231 - 1 (2.147.483.647) bytes | ||||
| Otros tipos de datos | cursor | Tipo de datos para las variables o para los parámetros de resultado de los procedimientos almacenados que contiene una referencia a un cursor. Las variables creadas con el tipo de datos cursor aceptan NULL | |||
| timestamp | Tipo de datos que expone números binarios únicos generados automáticamente en una base de datos. El tipo de datos timestamp es simplemente un número que se incrementa y no conserva una fecha o una hora | 8 bytes | |||
| sql_variant | Tipo de datos que almacena valores de varios tipos de datos aceptados en SQL Server, excepto text, ntext, image, timestamp y sql_variant | ||||
| uniqueidentifier | Es un GUID (Globally Unique Identifier, Identificador Único Global) | 16 bytes | |||
| /td> | Es un tipo de datos especial que se puede utilizar para almacenar un conjunto de resultados para su procesamiento posterior. ###em/em### se utiliza principalmente para el almacenamiento temporal de un conjunto de filas devuelto como el conjunto de resultados de una función con valores de tabla
|
INSERT es una sentencia SQL que agrega datos a una tabla. La sentencia INSERT tiene el formato siguiente:
INSERT INTO <nombre de la tabla>
VALUES (valor1, valor2, ...)
En esta sintaxis, <nombre de la tabla> es el nombre de la tabla o vista en la que se desea insertar datos y valor1, valor2 (etc.), son los valores que va a insertar.
La lista de valores de datos después de VALUES debe corresponderse con la lista de columnas de la tabla en la que van a ser insertados. Debe haber el mismo número de valores que de columnas, y cada valor debe tener un tipo de datos que coincida con el de su columna. Como se indica en el ejemplo siguiente, los valores nulos se pueden insertar especificando NULL.
Esta sentencia agrega datos a la tabla PERSERSONAS que contiene los campos ID, NOMBRE, TAREA, SALARIO:
INSERT INTO PERSONAS
VALUES (400, 'GONZALEZ', 20, 'VENTA', NULL, 18000,66, 0)
Inserta esta fila en la tabla PERSONAS:
ID NOMBRE DTO TAREA AÑOS SALARIO COMISION
------ --------- ------ ----- ------ --------- ---------
400 GONZALEZ 20 VENTA - 18000,66 0,00
Insertar valores de columna en una fila
Si desea insertar una fila sin proporcionar valores para todas las columnas de una fila, puede utilizar una lista de columnas con la sentencia INSERT.Especifique los valores que desea insertar en las columnas, como en el ejemplo siguiente:
INSERT INTO PERSERSONAS (ID, NOMBRE, TAREA, SALARIO)
VALUES (510, 'RUBIO', 'OFIC', 11500.75)
Las columnas para las que no se especifican valores no reciben ningún valor (NULL). Si una columna se define como NOT NULL, debe especificar valores para ella.
Copia de filas de una tabla a otra
Se pueden insertar filas en una tabla copiando los datos de otra tabla y utilizando una subconsulta para identificar las columnas que deben insertarse en lugar de utilizar la cláusula VALUES con INSERT. La información recuperada por la subconsulta se coloca en la tabla como si se hubieran entrado varios mandatos INSERT.
La siguiente sentencia copia las columnas ID, NOMBRE, TAREA y AÑOS para los miembros del Departamento 38 de PLANTILLA en PERSONAS:
INSERT INTO PERSONAS (ID, NOMBRE, TAREA, AÑOS)
SELECT ID, NOMBRE, TAREA, AÑOS FROM PLANTILLA
WHERE DEPARTAMENTO = 38
Si el número de columnas seleccionadas es menor que el número de columnas insertadas, las columnas restantes se insertan con nulos.
UPDATE
La instrucción UPDATE cambia el valor de una columna existente especificada en una fila de la tabla. Solo puede actualizar una tabla si ha creado la tabla o tiene permisos específicos para actualizar la tabla.
Una instrucción UPDATE consta de las siguientes partes:
UPDATE especifica la tabla a actualizar.
SET especifica la columna para actualizar y el nuevo valor para poner en la tabla.
WHERE especifica la fila para actualizar.
Una sola instrucción UPDATE puede actualizar una o más filas de una tabla, como se muestra en los 2 ejemplos siguientes. Cuando se omite la cláusula WHERE, la instrucción también puede actualizar todas las filas de la columna.
Ejemplos
En el ejemplo siguiente se actualiza la tabla PERSONAS para el empleado 250. Se cambia TAREA por VENTA y se aumenta SALARIO en un 15%.
UPDATE PERSONAS
SET TAREA='VENTA', SALARIO=SALARIO * 1,15
WHERE ID = 250
Para dar a cada oficinista de PERSONAS un aumento de 300 dólares, utilice una sentencia UPDATE como la siguiente:
UPDATE PERSONAS
SET SALARIO = SALARIO+300
WHERE TAREA='OFICINISTA'
Para aumentar los años de servicio de todas las personas en 1 en la tabla PERSONAS, utilice una sentencia UPDATE sin WHERE como la siguiente instrucción:
UPDATE PERSONAS
SET AÑOS = AÑOS + 1
DELETE
La instrucción DELETE elimina una o varios registros de la tabla. Solo puede eliminar una tabla si ha creado la tabla o tiene permisos específicos para eliminar registros de la tabla.
Una instrucción DELETE básica consta de las siguientes partes:
DELETE especifica la tabla a borrar.
WHERE especifica la fila para borrar.
Una sola instrucción DELETE puede borrar una o más filas de una tabla, como se muestra en los ejemplos siguientes. Cuando se omite la cláusula WHERE, la instrucción también puede borrar todas las filas de la tabla.
Ejemplos
En el ejemplo siguiente borra de la tabla PERSONAS el empleado 250.
DELETE FROM PERSONAS
WHERE ID = 250
Para borrar todos los registros de PERSONAS, utilice una sentencia DELETE como la siguiente:
DELETE FROM PERSONAS
La sentencia FROM se puede omitir:
DELETE PERSONAS
La instrucción INSERT de SQL permite agregar registros a una tabla. Con ella podemos ir añadiendo registros uno a uno, o añadir de golpe tantos registros como nos devuelva una instrucción SELECT.
La sintaxis genérica de INSERT para crear un nuevo registro es la siguiente:
INSERT INTO NombreTabla [(Campo1, …, CampoN)] VALUES (Valor1, …, ValorN)
Donde:
NombreTabla: la tabla en la que se van a insertar las filas.
(Campo1, …, CampoN): representa el campo o campos en los que vamos a introducir valores.
(Valor1, …, ValorN): representan los valores que se van a almacenar en cada campo.
En realidad la lista de campos es opcional especificarla (por eso la hemos puesto entre corchetes en la sintaxis general). Si no se indica campo alguno se considera que por defecto vamos a introducir información en todos los campos de la tabla, y por lo tanto se deben introducir valores para todos ellos y en el orden en el que han sido definidos. En la práctica se suelen especificar siempre por claridad y para evitar errores.
Por otro lado, los valores se deben corresponder con cada uno de los campos que aparecen en la lista de campos, tanto en el tipo de dato que contienen como en el orden en el que se van a asignar. Es decir, si se indican una serie de campos en un orden determinado, la lista de valores debe especificar los valores a almacenar en dichos campos, en el mismo orden exactamente. Si un campo no está en la lista, se almacenará dentro de éste el valor NULL.
Si un campo está definido como NOT NULL (es decir, que no admite nulos o valores vacíos), debemos especificarlo siempre en la lista de campos a insertar. De no hacerlo así se producirá un error al ejecución la correspondiente instrucción INSERT.
Update permite actualizar cualquier dato o conjunto de datos que tengamos almacenado en cualquier tabla, la única precaución que debemos tener es la de incluir una clausula WHERE apropiada que verdaderamente cualifique a los datos que queremos actualizar. El principal error en el uso de esta instrucción es precisamente ese, ya que podríamos acabar actualizando los registros equivocados, haciendo mucho daño en la base de datos. Para evitar problemas conviene realizar una consulta de selección precia que nos permita comprobar que las condiciones utilizadas en el WHERE son las apropiadas. También es conveniente tratar de lanzar la actualización dentro de una transacción que nos permita volver atrás todo el proceso en caso de producirse una equivocación y afectar al número equivocado de registros.
Su sintaxis general es:
UPDATE Nombre_de_Tabla SET Campo1 = Valor1, ..., CampoN = ValorN WHERE Condición Siendo:
Nombre_de_Tabla: el nombre de la tabla en la que vamos a actualizar los datos. SET: indica los campos que se van a actualizar y con qué valores lo vamos a hacer. WHERE: Selecciona los registros de la tabla que se van a actualizar. Se puede aplicar todo lo visto para esta cláusula anteriormente, incluidas las sub-consultas.
La instrucción DELETE permite eliminar uno o múltiples registros. Incluso todos los registros de una tabla, dejándola vacía.
Su sintaxis es general es:
DELETE [FROM] Nombre_de_Tabla WHERE Condición
La condición, como siempre, define las condiciones que deben cumplir los registros que se desean eliminar. Se puede aplicar todo lo visto para esta cláusula anteriormente, incluidas las sub-consultas.
Es una función agregada en SQL Server 2008, realiza operaciones de inserción, actualización o eliminación en una tabla de destino según los resultados de una combinación con una tabla de origen. Por ejemplo, puede sincronizar dos tablas insertando, actualizando o eliminando las filas de una tabla según las diferencias que se encuentren en la otra.
Sintaxis:
MERGE <tabla_destino> [AS TARGET] USING <taba_origen> [AS SOURCE] ON <condicion_compara_llaves> [WHEN MATCHED THEN <accion cuando coinciden> ] [WHEN NOT MATCHED [BY TARGET] THEN <accion cuando no coinciden por destino> ] [WHEN NOT MATCHED BY SOURCE THEN <accion cuando no coinciden por origen> ];
El código Transact de SQL Server incorpora una gran cantidad de funciones adicionales algunas como parte del estándar ISO-ANSI y otras como complemento y mejoras a la funcionalidad de SQL, hablemos de algunas funciones importantes.
Convierte una expresión de un tipo de datos en otro.
Sintaxis
Syntax for CAST: CAST ( expression AS data_type [ ( length ) ] )
Syntax for CONVERT: CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Es una expresión de tipo entero que especifica cómo la función CONVERT traducirá expression. Si style es NULL, se devuelve NULL. data_type determina el intervalo. Para obtener más información, vea la sección Comentarios.
| Expression | Es cualquier expresión válida. |
| Data_type | Es el tipo de datos de destino. Incluye xml, bigint y sql_variant. No se pueden utilizar tipos de datos de alias. |
| Length | Es un número entero opcional que especifica la longitud del tipo de datos de destino. El valor predeterminado es 30. |
Devuelve un valor convertido al tipo de datos que se especifico si la conversión tiene éxito; De lo contrario, devuelve NULL, a diferencia de Convert que devuelve un error. Sin embargo, si solicita una conversión que no está explícitamente permitida, TRY_CONVERT fallará y devolverá un error.
TRY_CONVERT funciona a partir de SQL Server 2012 o el nivel de compatibilidad 110 o superior. Ejemplo:
SET DATEFORMAT dmy; SELECT TRY_CONVERT(datetime2, '12/31/2010') AS Result; GO
PARSE es una de la nueva función de conversión incorporada en Sql Server 2012. La función de PARSE convierte la expresión de la cadena al tipo de datos solicitado. Si no es posible realizar la conversión SQL Server retornará una excepción.
Esta función PARSE no es una función Sql nativa, sino que es una función dependiente de Common Language Run-time .NET Framework . Por lo qué obviamente, tendrá la sobrecarga de rendimiento y también requiere la presencia de .NET CLR en el servidor de base de datos. Continúe usando las funciones CAST y CONVERT existentes donde sea posible.
PARSE (string_value AS data_type [USING cultura])
| String_value: | String expresión que necesita ser analizada. |
| Tipo_de_datos: | Tipo de datos de salida, p. INT, NUMERIC, DATETIME, etc. |
| Culture: | Cadena opcional que identifica la cultura en la que string_value está formateado. Si no se especifica, toma el idioma de la sesión actual. |
Try_PARSE al igual que la función PARSE son incorporadas en Sql Server 2012. La función de Try_PARSE convierte la expresión de la cadena al tipo de datos solicitado. Si no es posible realizar la conversión SQL Server retornará NULL
Esta función Try_PARSE no es una función Sql nativa, sino que es una función dependiente de Common Language Run-time .NET Framework . Por lo qué obviamente, tendrá la sobrecarga de rendimiento y también requiere la presencia de .NET CLR en el servidor de base de datos. Continúe usando las funciones CAST y CONVERT existentes donde sea posible.
TRY_PARSE (string_value AS data_type [USING cultura])
| String_value: | String expresión que necesita ser analizada. |
| Tipo_de_datos: | Tipo de datos de salida, p. INT, NUMERIC, DATETIME, etc. |
| Culture: | Cadena opcional que identifica la cultura en la que string_value está formateado. Si no se especifica, toma el idioma de la sesión actual. |
La función CHOOSE en SQL Server se compone de un parámetro de entrada y una lista de valores, de acuerdo al valor que contenga el primer parámetro de entra, devuelve el elemento de la lista correspondiente. En el siguiente ejemplo se usa la función Month para extraer el mes de una fecha, para que de acuerdo al número de mes coloque el mes en letras, usaremos la función CHOOSE, agregando el listado de nombre de los meses en el orden correspondiente.
Select c.companyname, o.orderid, o.orderdate,
CHOOSE(MONTH(o.[orderdate]), 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre') AS NombreMes
from customers as c inner join orders o
on c.CustomerID=o.customerid
Pongamos atención al parametro que tiene el valor a analizar.
Esta función sustituye NULL con un valor especificado.
El siguiente ejemplo devuelve para todas las filas donde el FAX es nulo, el valor '----'.
SELECT CompanyName, ContactName, ISNULL(Fax,'----') FROM Customers
Devuelve la primera expresión que no tenga el valor NULL entre sus argumentos. Sintaxis: COALESCE (expression [ ,...n ] ) Argumentos
expression : Es una expresión de cualquier tipo. Tipos de valor devueltos
Devuelve el tipo de datos de expression con la precedencia de tipo de datos más alta. Si ninguna de las expresiones admiten valores NULL, el resultado tiene un tipo que no admite valores NULL. Notas:
Tenga en cuenta que si todos los argumentos son NULL, COALESCE devuelve NULL.
Ejemplo:
SELECT ProductID , Description, COALESCE(Offer Price, UnitPrice, 0) AS Precio FROM Productos
Explicación primero del uso de Group by, luego como filtrar con having y finalmente funciones de agregado , también explicamos porque usar como count(*), en vez de contar un campo y count(Distinct)
GROUP BY
La función Group By agrupa un conjunto de filas seleccionado en un conjunto de filas de resumen de acuerdo con los valores de una o más columnas o expresiones en SQL Server. Se devuelve una fila para cada grupo. Las funciones de agregado de la lista <select> de la cláusula SELECT proporcionan información de cada grupo en lugar de filas individuales.
Una cláusula GROUP BY se puede describir como general o como simple:
HAVING
Especifica una condición de filtro para un grupo o agregado. HAVING solo se puede utilizar con la instrucción SELECT. Normalmente, HAVING se utiliza en una cláusula GROUP BY. Cuando no se utiliza GROUP BY, HAVING se comporta como una cláusula WHERE.
FUNCIONES DE AGREGADO
Las funciones de agregado realizan un cálculo sobre un conjunto de valores y devuelven un solo valor. Si exceptuamos la función COUNT, todas las funciones de agregado ignoran los valores NULL. Las funciones de agregado se suelen utilizar con la cláusula GROUP BY de la instrucción SELECT.
Todas las funciones de agregado son deterministas. Esto significa que las funciones de agregado devuelven el mismo valor cada vez que se las llama con un conjunto específico de valores de entrada. Al contrario una función no determinista como por ejemplo la función GETDATE que devuelve la fecha del día, esta función no devuelve siempre el mismo valor ya que esta sujeta al día que se consulta.
Una subconsulta es una consulta anidada en una instrucción SELECT, INSERT, UPDATE o DELETE, o bien en otra subconsulta. Las subconsultas se pueden utilizar en cualquier parte en la que se permita una expresión.
use northwind; go ---Subquery devuelto como un escalar calculando fila por fila Select productname, unitprice, (Select avg(unitprice) from products) as Promedio, (Select avg(unitprice) from products)-unitprice as varianza from products go --------------------Subquery como tabla--------------- Select T.orderid, Sum(T.unitprice*T.quantity) as Total from #Ventas as T group by T.orderid go ----Creacion de una vista Create view ventas as Select c.companyname, o.orderid, o.orderdate, p.productname, d.unitprice, d.quantity from customers as c inner join orders as o on c.customerid=o.customerid inner join [Order Details] as d on d.OrderID=o.orderid inner join products as p on p.ProductID=d.ProductID go ----borrar la vista drop view ventas go ----Crear una tabla temporal Select c.companyname, o.orderid, o.orderdate, p.productname, d.unitprice, d.quantity into #Ventas from customers as c inner join orders as o on c.customerid=o.customerid inner join [Order Details] as d on d.OrderID=o.orderid inner join products as p on p.ProductID=d.ProductID go ----Usando la tabla temporal Select T.orderid, Sum(T.unitprice*T.quantity) as Total from #Ventas as T group by T.orderid go ----borrar la tabla ventas drop table #Ventas go Select T.orderid, Sum(T.unitprice*T.quantity) as Total from ( Select c.companyname, o.orderid, o.orderdate, p.productname, d.unitprice, d.quantity from customers as c inner join orders as o on c.customerid=o.customerid inner join [Order Details] as d on d.OrderID=o.orderid inner join products as p on p.ProductID=d.ProductID ) as T group by T.orderid go ----Sub-consultas correlacionadas ---------------Si existe el query de adentro hace el query de fuera Select c.companyname, c.country, c.contactname from customers as c where exists (Select o.customerid from orders as o where year(o.orderdate)=2016) go ----correlacionandolo --informacion de los clientes que si han ordenado Select c.companyname, c.country, c.contactname from customers as c where exists (Select o.customerid from orders as o where c.CustomerID=o.CustomerID) go ---subquery con resultado de multiples valores Select c.companyname, c.country, c.contactname from customers as c where c.customerid in (Select customerid from orders ) go ----devuelvame todas las ordenes donde se pidieron mas de ----20 unidades del producto 23 Select o.orderid, o.orderdate from orders as o where 20< ( Select d. quantity from [Order Details] as d where o.orderid=d.orderid and d.productid=23 ) go
Acerca de este curso
Este curso proporciona a los estudiantes las habilidades técnicas necesarias para escribir consultas de Transact-SQL para Microsoft SQL Server . Este curso es la base para todas las disciplinas relacionadas con SQL Server; La administración de bases de datos, el desarrollo de bases de datos y la inteligencia de negocios.
El público objetivo principal de este curso son futuros Administradores, desarrolladores de bases de datos y profesionales de BI.
Perfil del usuario objetivo
Este curso está dirigido a todo aquel que desee aprender sobre la creación de consultas sobre SQL, pero también puede ser oportuno para ampliar conocimientos de administradores de bases de datos, desarrolladores de bases de datos y profesionales de Business Intelligence, desarrolladores de la aplicaciones para el cliente.
Al finalizar el curso
Después de completar este curso, los estudiantes serán capaces de:
Describir la arquitectura básica y los conceptos de Microsoft SQL Server.
Comprender las similitudes y diferencias entre Transact-SQL y otros lenguajes informáticos.
Escribir consultas SELECT
Consultar varias tablas
Ordenar y filtrar datos
Describir el uso de tipos de datos en SQL Server
Modificar datos mediante Transact-SQL
Utilice funciones integradas
Datos de grupo y agregados
Utilizar subconsultas
Utilizar expresiones de tabla
Utilizar operadores establecidos
Utilizar las funciones de clasificación de ventanas, desplazamiento y agregado
Implementar conjuntos pivotantes y de agrupación
Ejecutar procedimientos almacenados
Programa con T-SQL
Implementar el manejo de errores
Implementar transacciones