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

SQL SERVER

I. ¿QUÉ ES SQL Y TRANSACT-Q SQL? Bit 0ó1


Byte 8 bits
SQL: SQL Structured Query Language, en español
Kilobyte 1024 bytes
Lenguaje de consulta Estructurado, es un lenguaje
Megabyte 1024 kilobytes
específico utilizado en programación, diseñado para
administrar, y recuperar información de sistemas de Gigabyte 1024 megabytes
gestión de bases de datos relacionales. Una de sus Terabyte 1024 gigabytes
principales características es el manejo de álgebra y el Petabyte 1024 terabytes
cálculo relacional para realizar consultas y obtener
información de forma sencilla, y además para realizar
Tipos de datos estándar en Sql (mas utilizados):
cambios en ella.
BIT, TINYINT,
T-SQL (Transact-SQL): es la manera en que se Entero SMALLINT, INT,
comunican las instrucciones de manipulación de datos Numérico
BIGINT
que gestiona el usuario con el Servidor; las cuales Decimal MONEY, DECIMAL
permiten realizar operaciones claves en SQL Server, CHAR, VARCHAR,
como creación y modificación de esquemas de base de Texto y Texto
NCHAR, NVARCHAR
datos, inserción y modificación de datos y además la binario
Binario BINARY, VARBINARY
administración del propio Servidor de Base de Datos. DATE, TIME,
Esto se realiza mediante el envío de sentencias e Fecha y hora DATETIME,
instrucciones en T-SQL que son procesadas por el SMALLDATETIME
servidor y los resultados regresan a la aplicación cliente.
Transact-SQL incluye características propias de
Descripción de tipos de datos y tamaños
cualquier lenguaje de programación que nos permiten
definir: RANGO -
TIPO TAMAÑO VALORES
 Tipos de datos. 0, 1 true, false
 Definición de variables. BIT 1 byte
 Estructuras de control de flujo. TINYINT 1 byte 0 HASTA 255
 Gestión de excepciones. SMALLINT 2 bytes -215 hasta 215-1
 Funciones predefinidas. -32768 a 32767
INT 4 bytes -231 hasta 231-1
Sin embargo, no nos permite: -2,147,483,648 a 2,147,483,647
BIGINT 8 bytes -263 hasta 263-1
 Crear interfaces de usuario. -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
 Crear aplicaciones ejecutables. 8 bytes Valores monetarios
MONEY
-922,337,203,685,477.5808 HASTA
Microsoft Sql Server: es un sistema de manejo de 922,337,203,685,477.5807
bases de datos del modelo relacional, desarrollado por 5 bytes P: 1 a 9 dígitos
la empresa Microsoft. El lenguaje utilizado (que puede 9 bytes P: 10 a 19 dígitos
DECIMAL(P,S)
ser ejecutado por línea de comandos o mediante la 13 bytes P: 20 a 28 dígitos
interfaz gráfica de Management Studio) es Transact- 17 bytes P: 29 a 38 dígitos
SQL T-SQL. P: precisión → cantidad total de dígitos
S: escala → cantidad de dígitos decimales
15221001,165→ P=11, S=3 → 9 bytes
II. TABLA, CAMPOS Y REGISTROS
Las tablas son objetos de base de datos que contienen 1 byte por carácter 1 a 8000
CHAR
todos sus datos. En las tablas, los datos se organizan con definido (UTF-8) caracteres
arreglo a un formato de filas y columnas, similar al de una CHAR(10)=”Juan” → tamaño: 10 bytes
hoja de cálculo. Cada fila representa un registro único y 1 byte por carácter 1 a 8000
VARCHAR
cada columna un campo dentro del registro. Por ejemplo, variable (UTF-8) caracteres
en una tabla que contiene los datos de los empleados de VARCHAR(10)=”Juan” → tamaño: 4 bytes
una compañía puede haber una fila para cada empleado y 1 byte por
VARCHAR(MA
distintas columnas en las que figuren detalles de los carácter variable 2^31-1 bytes
X)
mismos, como el número de empleado, el nombre, la (UTF-8)
dirección, el puesto que ocupa y su número de teléfono 2 bytes por
1 a 4000
particular. NCHAR carácter definido
caracteres
(UTF-16)
III. TIPOS DE DATOS
Unidades de medida en informática:
un mismo cliente, pero habrá uno y sólo un #Cliente por
2 byte por cliente que ingrese a la tabla CLIENTES.
2^31-1
NVARCHAR(MAX) carácter variable
bytes Integridad Referencial
(UTF-16)
Binarios
BINARY 1 byte por valor fijo
hexadecimales
1 byte por valor Binarios Primary key
VARBINARY
variable hexadecimales

3 bytes
01/01/0001 hasta
DATE Formato: YYYY-
31/12/9999
MM-DD
5 bytes 00:00:00.0000000
TIME Formato: hasta Foreign key
hh:mm:ss:nnnnnnn 23:59:59.9999999
8 bytes 01/01/1753 hasta
DATE Formato: 31/12/9999
TIME YYYY-MM-DD 00:00:00 hasta
hh:mm:ss:nnn 23:59:59.997 Cuando se define una columna como clave foránea, las
01/01/1900 hasta filas de la tabla pueden contener en esa columna o bien el
SMALL 4 bytes
06/06/2079 valor nulo (ningún valor), o bien un valor que existe en la
DATE Formato: YYYY-
00:00:00 hasta otra tabla, un error sería asignar a un habitante una
TIME MM-DD hh:mm:ss
23:59:59 población que no está en la tabla de poblaciones. Eso es
lo que se denomina integridad referencial y consiste en
que los datos que referencian otros (claves foráneas)
IV. PRIMARY KEYS Y FOREIGN KEYS deben ser correctos. La integridad referencial hace que el
Primary key: permite identificar unívocamente a un sistema gestor de la base de datos se asegure de que no
registro, es decir que un registro sea único dentro de la hayan en las claves foráneas valores que no estén en la
tabla, que no tenga duplicados. Un campo que es primary tabla principal.
key no puede permitir ser valor nulo. Una primary key V. CAMPOS IDENTITY
puede estar compuesta por uno o más campos.
Identity es una propiedad que permite que un campo en
Tabla pacientes: una tabla incremente su valor de manera automática al
DNI NOMBRE EDAD GENERO insertar los registros en ella. Para el uso de la propiedad
19100012 Juan Medina 22 M Identity el tipo de dato debe ser entero Int. Por defecto el
45788754 Ana Vega 28 F valor inicial es 1 al igual que el incremento, pero esto se
15478854 Diego Losa 19 M puede modificar. Solamente puede existir una columna
21145789 Mauricio Garcia 41 M por tabla con la propiedad Identidad.
En la tabla anterior la primary ley podría ser DNI, ya que
no existirán dos personas que tengan el mismo DNI. VI. NORMALIZACIÓN

Tabla turnos: El proceso de normalización de una base de datos


relacional consiste en aplicar una serie de reglas para
MEDICO PACIENTE FECHA ESPECIALIDAD evitar a futuro realizar queries, o consultas
Rosa Juan 02/02/2051 innecesariamente complejas. En otras palabras, están
CARDIOLOGÍA
Rojas Medina 07:45 enfocadas en eliminar redundancias e inconsistencias de
Manuel 01/07/2055 dependencia en el diseño de las tablas.
Diego Losa PSICOLOGÍA
Ramos 10:00
Manuel 15/07/2055 Las bases de datos se normalizan para:
Diego Losa PSICOLOGÍA
Ramos 15:00
 Tener almacenado con la menor espacio posible
En este caso podríamos elegir como claves primarias a
médico, paciente y fecha para garantizar que el registro  Evitar la redundancia de datos
sea único.  Proteger la integridad de los datos
 Evitar problemas de actualización de los datos
Foreign key: una clave foránea es una columna o grupo en las tablas
de columnas de una tabla que contiene valores que
coinciden con la clave primaria de otra tabla. Las claves
foráneas se utilizan para unir tablas. Para poder decir que nuestra base de datos está
normalizada deben respetarse 3 niveles de
Las claves foráneas no necesitan ser claves únicas en la normalización.
tabla donde están y sí a donde están referenciadas. Por
ejemplo, el #Cliente puede ser una clave foránea en la 1ra Forma Normal: una tabla esta en primera forma
tabla deVENTAS. Se permite que haya varias ventas para normal si
 Todos los atributos son atómicos. Un atributo es Ejemplo (continuación ..)
atómico si los elementos del dominio son simples e
indivisibles.
 No debe existir variación en el número de
columnas.
 Los campos no clave deben identificarse por la
clave (dependencia funcional).
 Debe existir una independencia del orden tanto de
las filas como de las columnas; es decir, si los datos NumMateria identifica a materia, entonces es su clave
cambian de orden no deben cambiar sus primaria, entonces materia depende funcionalmente de
significados. NumMateria. Materia no tiene ninguna dependencia
con matrícula, entonces se separa en dos tablas.
Ejemplo

Tabla no normalizada

3ra Forma Normal: la tabla se encuentra en 3FN si es


2FN y si no existe ninguna dependencia funcional
transitiva en los atributos que no son clave.

Observamos que carrera depende del alumno (nombre),


pero nombre depende de la clave primaria Matricula,
entonces existe una dependencia transitiva entre carrera
y matricula, la cual debemos eliminar.
2da Forma Normal: sabremos si nuestra base de datos
tiene en la segunda forma normal si ésta previamente
cumple con las normas de la Primera forma Normal y si
sus atributos no principales dependen de forma
completa de la clave principal. Es decir que no existen
Entonces la base de datos estaría normalizada hasta la
dependencias parciales.
3ra forma normal.
Dependencia funcional: cuando un atributo depende
directamente de la clave primaria.
Supongamos que A es clave primaria.
El atributo B depende directamente de
A.
El atributo C depende directamente de
A.

Dependencia transitiva: cuando un atributo depende VII. DISEÑO DE BASE DE DATOS


de otro y éste depende de la clave primaria
1.- Creación de base de datos: Una base de datos está
Supongamos que A es clave primaria. compuesta por 2 archivos, Los Archivos Maestros de
Bases de Datos (Master Database Files o MDF) y
El atributo B depende directamente de A. Archivos de Registros de Bases de Datos (Log Database
El atributo C depende directamente de B. Files o LDF). Con estos dos archivos se hacen los
backups.
Por lo tanto el atributo C depende
transitivamente de la clave primaria A. Nota: se recomienda guardar la base de datos en una
partición diferente a la del sistema operativo para evitar
que si en un futuro existen problemas con el sistema
operativo se comprometa la base de datos.
Archivo Maestro de bases de datos
Los MDF están donde toda la información de la base de
datos está almacenada. Contiene las filas, columnas,
campos y datos creados por una aplicación o usuario. La
creación de una columna de base de datos, las
modificaciones e información de la creación de los
registros, todo está almacenado en este archivo para el
uso las aplicaciones y de búsquedas.
Archivo de registro de base de datos
Durante varios procesos de creación y modificación
dentro del MDF, toda la actividad es registrada en el
LDF. Mientras la información dinámica está siendo
procesada hacia adentro y fuera de la memoria, llamado
transacciones, los datos son almacenados en el LDF
para el manejo de errores. Consecuentemente, toda la
actividad del usuario es registrada por referencia.
2.- Solución en Sql Server
3.- Tipos de datos definidos por el usuario
Una solución de SQL Server Management Studio es una
colección de uno o más proyectos relacionados. Los SQL Server permite crear tipos de datos que el usuario
proyectos son contenedores que los desarrolladores de puede definir en base a los tipos de datos de SQL Server.
software usan para organizar los archivos relacionados, La creación de tipos de datos definidos por el usuario va
como conjuntos de scripts de uso común. a permitir el uso de los datos nativos de SQL Server de
manera más fácil, por ejemplo, para datos de tipo
caracter que tengan una longitud variable entre 2 a 80
caracteres, se pueden definir un tipo de datos con una
longitud de 100 para que alcance cualquier texto que
pase los 80 caracteres y ponerle un nombre de fácil
recuerdo como Texto100.
Instrucción Create Type

Create type NombreTipoDato from


TipoDatoSQLServer

Ejemplo:
Create type TextoObligatorio100
from nvarchar(100) not null
Instrucción Drop Type
Este no debe estar en uso por ninguna tabla, para
poder eliminarlo.

Drop type NombreTipoDato

Listar los tipos de datos definidos por el usuario


select * from sys.types where is_user_defined = 1 go

Ver si existe un tipo de dato creado por el usuario


select * from sys.types where name = ‘NombreTipoDato’ go

Uso de los tipos de datos definidos por el usuario.

Create table Agencias (


AgenciasCodigo Codigo10,
AgenciasDescripcion TextoObligatorio100,
AgenciasReponsable nvarchar(150),
AgenciasDireccion Texto100 constraint
AgenciasDireccionDF Default » )
go
4.- Ejemplo
 Creación de la base de datos

o Tabla Historia

idHistoria → identity

o Tabla HistoriaPaciente

o Tabla Turno

idTurno → identity
o Tabla TurnoPaciente

 Creación de tablas

o Tabla Especialidad

idEspecialidad → identity
o Tabla Pais
o Tabla paciente
o Tabla Medico Establecer el tipo de dato dato

o Tabla MedicoEspecialidad

 Modelar el diagrama entidad relación

o Tabla Pagos
A través de Query:

 Creación tipo de datos definido por usuario

Establecer relación entre paciente y pais:


Arrastar el campo idPais de la tabla Paciente al
campo idPais de la tabla Pais

Diagrama Entidad Relacion

A través de Query:
VIII. COMANDOS SQL PARA MANIPULACIÓN expresión lógica y en ella utilizar diversos operadores
DE REGISTROS como:

 SELECT  > (Mayor)


 >= (Mayor o igual)
Permite seleccionar las columnas que se van a mostrar.
 < (Menor)
Iinstrucción que la base de datos interpreta como que
 <= (Menor o igual)
vamos a solicitar información.
 = (Igual)
SELECT [ ALL / DISTINC ] [ * ] /  <> o != (Distinto)
[ListaColumnas_Expresiones] AS  IS [NOT] NULL (para comprobar si el valor de
[Expresion] una columna es o no es nula, es decir, si
FROM Nombre_Tabla_Vista contiene o no contiene algún valor)
WHERE Condiciones
ORDER BY ListaColumnas [ ASC / DESC Se dice que una columna de una fila es NULL si está
] completamente vacía. Hay que tener en cuenta que si se
All y Distinct ha introducido cualquier dato, incluso en un campo
alfanumérico si se introduce una cadena en blanco o un
cero en un campo numérico, deja de ser NULL.
ALL es el valor predeterminado, especifica que el
conjunto de resultados puede incluir filas duplicadas.
Por regla general nunca se utiliza. Like: para la comparación de un modelo. Para ello
utiliza los caracteres comodín especiales: “%” y “_”.
Con el primero indicamos que en su lugar puede ir
DISTINCT especifica que el conjunto de resultados
cualquier cadena de caracteres, y con el segundo que
sólo puede incluir filas únicas. Es decir, si al realizar una
puede ir cualquier carácter individual (un solo carácter).
consulta hay registros exactamente iguales que aparecen
Con la combinación de estos caracteres podremos
más de una vez, éstos se eliminan. Muy útil en muchas
obtener múltiples patrones de búsqueda. Por ejemplo:
ocasiones.
El nombre empieza por A: Nombre LIKE ‘A%’
Nombres de campos: Se debe especificar una lista de
El nombre acaba por A: Nombre LIKE ‘%A’
nombres de campos de la tabla que nos interesan y que
El nombre contiene la letra A: Nombre LIKE ‘%A%’
por tanto queremos devolver. Normalmente habrá más
El nombre empieza por A y después contiene un solo
de uno, en cuyo caso separamos cada nombre de los
carácter cualquiera: Nombre LIKE ‘A_’
demás mediante comas.
El nombre empieza una A, después cualquier carácter,
Se puede anteponer el nombre de la tabla al nombre de
luego una E y al final cualquier cadena de caracteres:
las columnas, utilizando el formato Tabla.Columna.
Nombre LIKE ‘A_E%’
Además de nombres de columnas, en esta lista se
pueden poner constantes, expresiones aritméticas, y
funciones, para obtener campos calculados de manera Between: para un intervalo de valores. Por ejemplo:
dinámica.
Si queremos que nos devuelva todos los campos de la Clientes entre el 30 y el 100: CodCiente BETWEEN 30
tabla utilizamos el comodín “*” (asterisco). AND 100
Los nombres indicados deben coincidir exactamente Clientes nacidos entre 1970 y 1979:
con los nombres de los campos de la tabla, pero si FechaNac BETWEEN ‘19700101’ AND ‘19791231’
queremos que en nuestra tabla lógica de resultados
tengan un nombre diferente podemos utilizar As. IN( ): para especificar una relación de valores
concretos. Por ejemplo:
As: Permite renombrar columnas si lo utilizamos en la
cláusula SELECT, o renombrar tablas si lo utilizamos Ventas de los Clientes 10, 15, 30 y 75: CodCliente
en la cláusula FROM. Es opcional. IN(10, 15, 30, 75)

From: Esta cláusula permite indicar las tablas o vistas Por supuesto es posible combinar varias condiciones
de las cuales vamos a obtener la información. simples de los operadores anteriores utilizando los
operadores lógicos OR, AND y NOT, así como el uso
Where: Especifica la condición de filtro de las filas de paréntesis para controlar la prioridad de los
devueltas. Se utiliza cuando no se desea que se operadores (como en matemáticas). Por ejemplo: …
devuelvan todas las filas de una tabla, sino sólo las que (Cliente = 100 AND Provincia = 30) OR Ventas > 1000
cumplen ciertas condiciones. Lo habitual es utilizar esta … que sería para los clientes de las provincias 100 y 30
cláusula en la mayoría de las consultas. o cualquier cliente cuyas ventas superen 1000.

Condiciones: Son expresiones lógicas a comprobar ORDER BY: Define el orden de las filas del conjunto
para la condición de filtro, que tras su resolución de resultados. Se especifica el campo o campos
devuelven para cada fila TRUE o FALSE, en función (separados por comas) por los cuales queremos ordenar
de que se cumplan o no. Se puede utilizar cualquier los resultados.
ASC / DESC: ASC es el valor predeterminado, gestor de datos, incrementando en 1 su valor cada vez
especifica que la columna indicad en la cláusula que se inserta un nuevo registro en la tabla. Por ello en
ORDER BY se ordenará de forma ascendente, o sea, de estos casos no es necesario especificar este tipo de
menor a mayor. Si por el contrario se especifica DESC campos en las instrucciones INSERT, ahorrándonos
se ordenará de forma descendente (de mayor a menor). tener que indicar el identificador.
Por ejemplo, para ordenar los resultados de forma
ascendente por ciudad, y los que sean de la misma Nota: Aunque las tablas estén relacionadas entre sí de
ciudad de forma descendente por nombre, utilizaríamos manera unívoca (por ejemplo, cada cabecera de factura
esta cláusula de ordenación: con sus líneas de factura), no es posible insertar de un
golpe los registros de varias tablas. Es necesario
… ORDER BY Ciudad, Nombre DESC … siempre introducir los registros uno a uno y tabla a tabla.

Como a la columna Ciudad no le hemos puesto ASC o Inserción masiva de filas partiendo de consultas
DESC se usará para la misma el valor predeterminado
(que es ASC) Una segunda variante genérica de la instrucción
INSERT es la que nos permite insertar de golpe
 INSERT múltiples registros en una tabla, bebiendo sus datos
desde otra tabla (o varias tablas) de nuestra base de
datos o, incluso en algunos SGBDR, de otra base de
La instrucción INSERT de SQL permite añadir registros
datos externa. En cualquier caso obteniéndolos a partir
a una tabla. Con ella podemos ir añadiendo registros uno
de una consulta SELECT convencional.
a uno, o añadir de golpe tantos registros como nos
devuelva una instrucción SELECT.
INSERT INTO NombreTabla [(Campo1, …,
INSERT INTO NombreTabla [(Campo1, …, CampoN)]
CampoN)] VALUES (Valor1, …, ValorN)
SELECT ...

 NombreTabla: la tabla en la que se van a insertar


las filas. El SELECT se indica a continuación de a lista de
 (Campo1, …, CampoN): representa el campo o campos, y en lugar de especificar los valores con
campos en los que vamos a introducir valores. VALUES, se indica una consulta de selección. Es
 (Valor1, …, ValorN): representan los valores que indispensable que los campos devueltos por esta
se van a almacenar en cada campo. instrucción SELECT coincidan en número y tipo de
datos con los campos que se han indicado antes, o se
La lista de campos es opcional especificarla. Si no se producirá un error de ejecución y no se insertará ningún
indica campo alguno se considera que por defecto registro.
vamos a introducir información en todos los campos de
Lo que se suele hacer en estos casos es crear
la tabla, y por lo tanto se deben introducir valores para
primeramente la consulta de selección, que
todos ellos y en el orden en el que han sido definidos.
generalmente será más compleja y puede involucrar
Los valores se deben corresponder con cada uno de los
varias tablas que no tienen porque tener los mismos
campos que aparecen en la lista de campos, tanto en el
campos. Esta consulta la única condición que debe
tipo de dato que contienen como en el orden en el que
cumplir es que los campos devueltos tienen que ser del
se van a asignar. Es decir, si se indican una serie de
mismo tipo y orden que los que hay en la tabla donde
campos en un orden determinado, la lista de valores
insertamos o que los que indiquemos opcionalmente en
debe especificar los valores a almacenar en dichos
la consulta de inserción.
campos, en el mismo orden exactamente. Si un campo
no está en la lista, se almacenará dentro de éste el valor
NULL.  UPDATE

Si un campo está definido como NOT NULL (es decir, Esta instrucción nos permite actualizar los valores de los
que no admite nulos o valores vacíos), debemos campos de una tabla, para uno o varios registros, o
especificarlo siempre en la lista de campos a insertar. incluso para todos los registros de una tabla.
De no hacerlo así se producirá un error a la ejecución la
correspondiente instrucción INSERT. UPDATE NombreTabla
SET Campo1 = Valor1, ..., CampoN = ValorN
En la mayor parte de los casos los campos de WHERE Condición
identificación de los registros, también conocidos
como claves primarias, serán campos de tipo numérico  NombreTabla: el nombre de la tabla en la que
con auto-incremento. Esto quiere decir que el vamos a actualizar los datos.
identificador único de cada registro (el campo que  SET: indica los campos que se van a actualizar
normalmente contiene un ID en su nombre, como y con qué valores lo vamos a hacer.
idPais o idMedico) lo genera de manera automática el
 WHERE: Selecciona los registros de la tabla
UPDATE Products
que se van a actualizar.

Ejemplos: SET UnitPrice = (SELECT UnitPrice FROM


- Corrige el apellido del paciente con Products WHERE ProductID = 5)
identificador 5. El correcto es "Smith":
WHERE CategoryID = (SELECT CategoryID
UPDATE Paciente FROM Categories
SET apellido = 'Smith' WHERE CategoryName
WHERE idPaciente = 5 = 'Beverages')

- Elimina el valor del campo observaciones


(Notes) de todos los turnos:  DELETE

La instrucción DELETE permite eliminar uno


UPDATE Turno
SET observacion = NULL o múltiples registros. Incluso todos los
registros de una tabla, dejándola vacía.
Es muy importante incluir una cláusula WHERE en las
instrucciones UPDATE salvo en casos muy concretos
como el del ejemplo anterior. De no hacerlo se DELETE [FROM] NombreTabla
actualizarán todos los registros de la tabla como
acabamos de ver. Es habitual que, por error, se omita WHERE Condición
esta cláusula y se pierdan datos de forma
irreversible (salvo que dispongamos de copias de
seguridad o tengamos la posibilidad de hacer un Es extremadamente importante definir bien la cláusula
ROLLBACK (cancelación de las instrucciones) si no WHERE. De otro modo podríamos eliminar muchos
hemos finalizado la transacción). registros que no pretendíamos o incluso, en un caso
extremo, borrar de un plumazo todas las filas de la tabla.
Subconsultas como apoyo a la actualización Es habitual que, por error, se omita esta cláusula y se
pierdan datos de forma irreversible (salvo, claro está,
Podemos incluir una o varias subconsultas dentro una que dispongamos de copias de seguridad o tengamos la
sentencia UPDATE. Éstas pueden estar contenidas en la posibilidad de retroceder una transacción abierta).
cláusula WHERE o formar parte también de la cláusula
SET. En este último caso se deben seleccionar el mismo Ejemplos:
número de campos y con los tipos de datos apropiados,
para que cada uno de los valores pueda ser almacenado - Eliminar de la base de datos al empleado cuyo
en la columna que hay a la izquierda del signo igual “=”, identificador interno es el 9:
entre paréntesis, al lado de la instrucción SET.
DELETE Employees WHERE EmployeeID = 9
Ejemplos:
- Para todos los productos de la categoría bebidas
('beverages'), de la cual no conocemos su - Borrar a los clientes cuyo apellido (LastName)
identificador, duplica su precio: contenga la palabra "Desconocido":

UPDATE Products DELETE Customers WHERE LastName LIKE


'%Desconocido%'

SET UnitPrice = UnitPrice * 2


- Eliminar todos los productos de la categoría
WHERE CategoryID = (SELECT CategoryID bebidas ("beverages"):
FROM Categories
WHERE CategoryName
= 'Beverages') DELETE Products WHERE CategoryID =

(SELECT CategoryID FROM Categories


- Asignar a todos los productos de la categoría
bebidas ('beverages'), el mismo precio que tiene
el producto con número de identificador (clave WHERE CategoryName = 'Beverages')
primaria) igual a 5:
- Eliminar todos los productos de la categoría
bebidas ("beverages") cuyo precio unitario
(UnitPrice) sea superior a 50:
TOP (expression) [PERCENT]
DELETE Products WHERE CategoryID =
[ WITH TIES ]
(SELECT CategoryID FROM Categories
WHERE CategoryName = 'Beverages')  Expresion: dato numérico que especifica el
número de filas que se van a devolver. Es de
tipo float si se especifica percent, de lo
AND UnitPrice > 50 contrario es de tipo bigint.
 PERCENT: Indica que la consulta devuelve
solo el primer porcentaje de filas de expression
IX. CLAUSULAS del conjunto de resultados. Los valores
fraccionarios se redondean al siguiente valor
 WHERE entero.
 WHIT TIES: Devuelve dos o más filas que
Especifica la condición de búsqueda de las filas ocupan el último lugar en el conjunto de
devueltas por la consulta. resultados limitado. Se debe utilizar con la
clausula ORDER BY. WHIT TIES puede hacer
Ejemplos: que se devuelvan más filas que las del valor
especificado en expression. Por ejemplo, si
- Buscar una fila utilizando una igualdad simple expression está establecido en 5, pero dos filas
adicionales coinciden con los valores de las
SELECT EmployeeKey, LastName columnas ORDER BY en la fila 5, el conjunto
FROM DimEmployee de resultados contendrá siete filas.
WHERE LastName = 'Smith' ; Puede especificar la cláusula TOP con el
argumento WITH TIES solo en instrucciones
SELECT y solo si también ha especificado la
- Buscar las filas que contienen un valor como cláusula ORDER BY. El orden devuelto de los
parte de una cadena registros enlazados es arbitrario. ORDER BY
SELECT EmployeeKey, LastName
no afecta a esta regla.
FROM DimEmployee
WHERE LastName LIKE ('%Smi%'); Ejemplos:

- Top con un valor constante


- Buscar las filas que deben cumplir varias (10 primeras filas sin definir)
condiciones SELECT TOP(10)JobTitle, HireDate
FROM HumanResources.Employee;
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE EmployeeKey <= 500 AND LastName (primeros 10 empleados contratados)
LIKE '%Smi%' AND FirstName LIKE '%A%' SELECT TOP(10)JobTitle, HireDate
FROM HumanResources.Employee
- Buscar las filas que están en una lista de valores ORDER BY HireDate DESC;
SELECT EmployeeKey, LastName
FROM DimEmployee - Top con una variable
WHERE LastName IN ('Smith', 'Godfrey', -
DECLARE @p AS int = 10;
'Johnson');
SELECT TOP(@p)JobTitle, HireDate,
VacationHours
FROM HumanResources.Employee
ORDER BY VacationHours DESC;
 TOP
- Especificar un porcentaje
Limita las filas devueltas en un conjunto de resultados
SELECT TOP(5)PERCENT JobTitle, HireDate
de la consulta a un número o porcentaje de filas
FROM HumanResources.Employee
especificado en SQL Server.
ORDER BY HireDate DESC;
Al usar TOP con la cláusula ORDER BY, el conjunto
de resultados se limita al primer número N de filas - Utilizar WITH TIES para incluir las filas que
ordenadas. De lo contrario, TOP devuelve el primer coinciden con los valores de la última fila
número N de filas en un orden indefinido.
SELECT TOP (31) WITH TIES FirstName,
Se utiliza para especificar el número de filas devueltas LastName
de una instrucción SELECT. O bien, use TOP para FROM DimEmployee ORDER BY LastName;
especificar las filas afectadas por una instrucción
INSERT, UPDATE, MERGE o DELETE.
- Utilizar TOP para limitar el número de filas intercalación de la columna definida en la tabla
eliminadas o vista. collation_name puede ser un nombre de
(las primeras 20 arbitrariamente que cumplan la intercalación de Windows o un nombre de
condicion) intercalación de SQL. COLLATE se aplica a las
DELETE TOP (20)
columnas de tipo char, varchar, nchar y
FROM Purchasing.PurchaseOrderDetail
nvarchar.
WHERE DueDate < '20020701';
 ASC | DESC: Indica que los valores de la
(10 filas con las fechas de vencimiento más columna especificada se deben ordenar en
antiguas) sentido ascendente o descendente. ASC ordena
DELETE FROM
del valor mínimo al valor máximo. DESC
Purchasing.PurchaseOrderDetail ordena del valor máximo al valor mínimo. ASC
WHERE PurchaseOrderDetailID IN es el criterio de ordenación predeterminado.
(SELECT TOP 10 PurchaseOrderDetailID Los valores NULL se tratan como los valores
FROM Purchasing.PurchaseOrderDetail más bajos posibles.
ORDER BY DueDate ASC);

 OFFSET { integer_constant |
 ORDER BY offset_row_count_expression } { ROW |
ROWS }: Especifica el número de filas que se
Ordena los datos devueltos por una consulta en SQL deben omitir antes de comenzar a devolver filas
Server. de la expresión de consulta. El valor puede ser
una expresión o constante entera mayor o igual
ORDER BY order_by_expression [ COLLATE que cero.
collation_name ]
[ ASC | DESC ] {  FETCH { FIRST | NEXT }
OFFSET { integer_constant |
{ integer_constant | fetch_row_count_expre
offset_row_count_expression } { ROW |
ROWS }
ssion } { ROW | ROWS } ONLY: Especifica
[ FETCH { FIRST | NEXT } el número de filas que se devolverán después de
{integer_constant | procesar la cláusula OFFSET. El valor puede
fetch_row_count_expression } { ROW | ROWS ser una expresión o constante entera mayor o
} ONLY ] igual que uno.
}

 order_by_expression: Especifica una columna En una instrucción SELECT TOP (N), use siempre una
o expresión según la que se ordenará el cláusula ORDER BY. Esta es la única manera de indicar
conjunto de resultados de la consulta. Una previsiblemente a qué filas afecta TOP
columna de ordenación se puede especificar
como un nombre o un alias de columna, o un No hay ningún límite en cuanto al número de columnas
entero no negativo que representa la posición de de la cláusula ORDER BY; sin embargo, el tamaño total
la columna en la lista de selección. de las columnas especificadas en una cláusula ORDER
BY no puede superar los 8.060 bytes.
Es posible especificar varias columnas de
ordenación. Los nombres de columna tienen Las columnas de tipo ntext, text, image, geography,
que ser únicos. La secuencia de las columnas de geometry y xml no se pueden usar en una cláusula
ordenación de la cláusula ORDER BY define la ORDER BY.
organización del conjunto de resultados
ordenado. Es decir, el conjunto de resultados se Si los nombres de tabla están asociados a un alias en la
ordena conforme a la primera columna y, a cláusula FROM, solo pueden usarse los nombres de
continuación, esa lista ordenada se ordena alias para calificar sus columnas en la cláusula ORDER
según la segunda columna, y así sucesivamente. BY.

Los nombres de columna a los que se hace Ejemplos:


referencia en la cláusula ORDER BY deben
corresponderse con una columna o un alias de  Especificar una sola columna definida en la
columna de la lista de selección, o bien con una lista de selección
columna definida en la tabla especificada en la
cláusula FROM sin ambigüedades.
(ordena el conjunto de resultados por la
columna numérica ProductID.)
 COLLATE collation_name: Especifica que la
operación ORDER BY debe realizarse SELECT ProductID, Name FROM
conforme a la intercalación especificada en Production.Product
collation_name, y no conforme a la WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID;
- Especificar una columna que no está definida  GROUP BY
en la listaProductID,
SELECT de selección Name, Color
FROM Production.Product Permite organizar las filas de una consulta en grupos. Se
ORDER BY ListPrice; utiliza para juntar filas de resultados que coincidan en el
valor de alguna columna seleccionada. Los
- Especificar un alias como columna de agrupamientos se utilizan cuando en un listado existen
ordenación funciones de agregado en algunos campos con campos
SELECT name, SCHEMA_NAME(schema_id) AS
que no las tienen.
SchemaName
Se puede agrupar por más de un campo, en tal caso
FROM sys.objects todos los campos que se especifican en la cláusula
WHERE type = 'U' "group by" deben estar en la lista de selección.
ORDER BY SchemaName;
SELECT columna, funcion(columna)
- Especificar una expresión como columna de FROM tabla
ordenación GROUP BY columna
HAVING condición
SELECT BusinessEntityID, JobTitle,
HireDate GROUP BY {
FROM HumanResources.Employee column-expression
ORDER BY DATEPART(year, HireDate); | ROLLUP ( <group_by_expression> [
,...n ] )
- Especificar orden ascendente y también
| CUBE ( <group_by_expression> [ ,...n
descendente
] )
SELECT LastName, FirstName FROM | GROUPING SETS ( <grouping_set> [
Person.Person ,...n ] )
WHERE LastName LIKE 'R%' | () --calculates the grand total
ORDER BY FirstName ASC, LastName DESC ; } [ ,...n ]

- Limitar el número de filas devueltas  Columna-expresson: Agrupa los resultados de la


(omitir los primeros 5 resultados) instrucción SELECT según los valores en una lista
con una o varias expresiones de columna. Estos
SELECT DepartmentID, Name, GroupName valores deben indicarse en la instrucción SELECT.
FROM HumanResources.Department
ORDER BY DepartmentID OFFSET 5 ROWS; Ejemplo: dada la siguiente tabla:
- Limitar el número de filas devueltas
(omitir los primeros 0 resultados y mostrar los
siguientes 10)

SELECT DepartmentID, Name, GroupName


FROM HumanResources.Department
ORDER BY DepartmentID
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;
SELECT Pais, Region, SUM(sales) AS
Ventastotales
 DISTINCT FROM Sales
GROUP BY Country, Region;
Evalúa un conjunto especificado, quita tuplas
duplicadas del conjunto y devuelve el conjunto La consulta agrupa el país y la región y devuelve la
resultante. suma de agregados de cada combinación de valores. El
Distinct(Set_Expression) resultado de la consulta tiene tres filas, ya que hay tres
combinaciones de valores para el país y la región. El
valor de las ventas totales para Canadá y Columbia
Si el Distinct función encuentra tuplas duplicadas Británica es la suma de dos filas.
del conjunto especificado, la función conserva sólo
la primera instancia de la tupla duplicada dejando
intacto el orden del conjunto.

Ejemplos:

SELECT DISTINCT store_name FROM


Store_Information;

No mostrará los Store_name repetidos.


 Group by ROLLUP(): Crea un grupo para cada únicos de (Country, Region), (NULL, Region),
combinación de expresiones de columna. Además, (Country, NULL) y (NULL, NULL).
"acumula" los resultados en subtotales y totales
generales. Para ello, mueve de derecha a izquierda
reduciendo el número de expresiones de columna
para las que crea grupos y agregaciones.
El orden de las columnas influye en la salida de
ROLLUP y también puede afectar al número de
filas del conjunto de resultados.
Por ejemplo, GROUP BY ROLLUP (col1, col2,
col3, col4) crea grupos para cada combinación de
expresiones de columna en las listas siguientes.

Ejemplo: Con la tabla del ejemplo anterior


 Group by GROUPING SETS ( ): La opción
SELECT Pais, Region, SUM(sales) AS GROUPING SETS permite combinar varias
Ventastotales cláusulas GROUP BY en una cláusula GROUP
FROM Sales BY. Los resultados son equivalentes a usar la
GROUP BY ROLLUP (Pais, Region); instrucción UNION ALL en los grupos
especificados.
El resultado de la consulta tiene las mismas Por ejemplo, GROUP BY ROLLUP (Country,
agregaciones que la operación GROUP BY simple sin Region) y GROUP BY GROUPING SETS (
ROLLUP. Además, crea subtotales para cada valor de ROLLUP (Country, Region) ) devuelven los
país. Por último, proporciona un total general para todas mismos resultados.
las filas. El resultado tiene el aspecto siguiente: Cuando GROUPING SETS tiene dos o más
elementos, los resultados son la unión de los
 Pais, Region
elementos. En este ejemplo se devuelve la
 Pais, null unión de los resultados ROLLUP y CUBE para
 Null, null el país y la región.

SELECT Country, Region, SUM(Sales) AS


TotalSales
FROM Sales
GROUP BY GROUPING SETS ( ROLLUP
(Country, Region), CUBE (Country,
Region) )
Los resultados son los mismos que los de esta
consulta que devuelve la unión de las dos
instrucciones GROUP BY.

SELECT Country, Region, SUM(Sales) AS


TotalSales
FROM Sales
 Group by CUBE(): GROUP BY CUBE crea grupos GROUP BY ROLLUP (Country, Region)
para todas las combinaciones posibles de columnas. UNION ALL
Para GROUP BY CUBE (a, b), el resultado tiene SELECT Country, Region, SUM(Sales) AS
grupos de valores únicos de (a, b), (NULL, b), (a, TotalSales
NULL) y (NULL, NULL). FROM Sales
GROUP BY CUBE (Country, Region);
Ejemplo: Con la tabla del ejemplo anterior
SELECT Pais, Region, SUM(sales) AS SQL no consolida los grupos duplicados
Ventastotales generados para una lista GROUPING SETS.
FROM Sales Por ejemplo, en GROUP BY ( (), CUBE
GROUP BY CUBE (Pais, Region); (Country, Region) ), ambos elementos
devuelven una fila para el total general y ambas
El resultado de la consulta tiene grupos para valores filas se mostrarán en los resultados.
 Group by (): Especifica el grupo vacío que - Calcular totales de grupo con mas de una
genera el total general. Esto resulta útil como columna
uno de los elementos de GROUPING SET. Por
SELECT Color, SUM(ListPrice)AS
ejemplo, esta instrucción proporciona el total TotalList,
de ventas de cada país y, después, el total SUM(StandardCost) AS
general para todos los países. TotalCost
FROM dbo.DimProduct
SELECT Country, SUM(Sales) AS GROUP BY Color
TotalSales ORDER BY Color;
FROM Sales
GROUP BY GROUPING SETS ( Country, () );
 AVG: Esta función devuelve el promedio de los
X. FUNCIONES DE AGREGADO valores de un grupo. Omite los valores NULL.
Una función de agregado realiza un cálculo sobre un AVG ( [ ALL | DISTINCT ] expression )
conjunto de valores y devuelve un solo valor. Con la
o ALL: aplica la función de agregado a todos los
excepción de COUNT, las funciones de agregado ignoran
valores. ALL es el valor predeterminado.
los valores NULL. Las funciones de agregado se suelen
o DISTINCT: especifica que AVG opere solo en
usar con la cláusula GROUP BY de la instrucción
una instancia única de cada valor,
SELECT.
independientemente del número de veces que
SUM GROUPING aparezca el valor.
AVG GROUPING_ID
MAX STDEV Tipos devueltos:
MIN STDEVP
COUNT STRING_AGG
COUNT_BIG VAR
APPROX_COUNT_DISTINCT
CHECKSUM_AGG VARP

 SUM: Devuelve la suma de todos los valores o solo


de los valores DISTINCT de la expresión. SUM
solo puede utilizarse con columnas numéricas. Se
omiten los valores NULL.

SUM ( [ ALL | DISTINCT ] expression )


o ALL: aplica la función de agregado a todos los
valores. ALL es el valor predeterminado.
o DISTINCT: especifica que SUM devuelve la
suma de los valores únicos. Ejemplos:

Tipos devueltos: - Devolver datos de resumen

SELECT AVG(VacationHours)AS 'Average


vacation hours',
SUM(SickLeaveHours) AS 'Total sick
leave hours'
FROM HumanResources.Employee
WHERE JobTitle LIKE 'Vice President%';

En este ejemplo se calcula el promedio de horas de


vacaciones y la suma de horas de baja por enfermedad
que han utilizado los vicepresidentes de Adventure
Works Cycles. Cada una de estas funciones de agregado
produce un valor único de resumen para todas las filas
recuperadas.
Ejemplos: - Con la clausula Group By
- Devolver datos de resumen Cuando se utiliza con una cláusula GROUP BY, cada
función de agregado produce un solo valor que cubre
SELECT Color, SUM(ListPrice)As Suma cada grupo, en vez un solo valor que cubra toda la tabla.
FROM Production.Product
GROUP BY Color;
SELECT TerritoryID, AVG(Bonus)as  COUNT Y COUNT_BIG: devuelven el número
'Average bonus', SUM(SalesYTD) as 'YTD de elementos encontrados en un grupo. COUNT
sales' funciona como la función COUNT_BIG. Estas
FROM Sales.SalesPerson funciones difieren solo en los tipos de datos de sus
GROUP BY TerritoryID; valores devueltos. COUNT siempre devuelve un
GO valor de tipo de datos int. COUNT_BIG siempre
devuelve un valor de tipo de datos bigint.
COUNT ( [ ALL | DISTINCT ] expression )
 MAX: Devuelve el valor máximo de la expresión.
Devolverá: si la columna es numérica, el número
COUNT_BIG ( [ ALL | DISTINCT ] expression
mayor de todos, si la columna es carácter, la palabra
)
que en orden alfabético esté última, si la columna es
fecha, la que tiene la fecha más reciente. o ALL: aplica la función de agregado a todos los
valores. ALL es el valor predeterminado.
MAX ( [ ALL | DISTINCT ] expression ) o DISTINCT: especifica que COUNT devuelva
el número de valores únicos no NULL.
o ALL: aplica la función de agregado a todos los
o *: especifica que COUNT debe contar todas las
valores. ALL es el valor predeterminado.
filas para determinar el total de filas de la tabla
o DISTINCT: especifica que se tiene en cuenta
a devolver. No toma ningún parámetro y no
cada valor único. DISTINCT no tiene ningún
admite el uso de DISTINCT. No requiere el
significado con MAX y solo se incluye para la
parámetro expression porque, por definición,
compatibilidad con ISO.
no usa información sobre ninguna columna
MAX se puede usar con columnas numeric, concreta. Devuelve el número de filas de una
character, uniqueidentifier y datetime, pero no con tabla especificada y conserva las filas
columnas bits. duplicadas. Cuenta cada fila por separado. Esto
incluye las filas que contienen valores NULL.
Tipos devueltos: devuelve un valor igual a la
expresión Tipos devueltos: int

Ejemplos: COUNT(*) devuelve el número de elementos de un


grupo. Esto incluye los valores NULL y los duplicados
- Ejemplo básico
COUNT(ALL expresión) evalúa expresión en todas las
SELECT MAX(TaxRate)
filas del grupo y devuelve el número de valores no
FROM Sales.SalesTaxRate;
NULL.
GO
COUNT(DISTINCT expresión) evalúa expresión en
 MIN: Devuelve el valor minimo de la expresión. todas las filas del grupo y devuelve el número de valores
Devolverá: si la columna es numérica, el número únicos no NULL.
menor de todos, si la columna es carácter, la palabra
que en orden alfabético esté primera, si la columna Para valores devueltos superiores a 2^31-1, COUNT
es fecha, la que tiene la fecha más antigua. devuelve un error. En estos casos, utilice COUNT_BIG
en su lugar.
MIN ( [ ALL | DISTINCT ] expression )
 APPROX_COUNT_DISTINCT: devuelve el
o ALL: aplica la función de agregado a todos los número aproximado de valores no nulos únicos de
valores. ALL es el valor predeterminado. un grupo.
o DISTINCT: especifica que se tiene en cuenta
cada valor único. DISTINCT no tiene ningún APPROX_COUNT_DISTINCT ( expression )
significado con MIN y solo se incluye para la
Tipos devueltos: bigint
compatibilidad con ISO.
Evalúa una expresión para cada fila de un grupo y
MIN se puede usar con columnas numeric, char,
devuelve el número aproximado de valores no nulos
varchar, uniqueidentifier y datetime, pero no con
únicos de un grupo. Esta función está diseñada para
columnas bits.
proporcionar agregaciones de conjuntos de datos de
Tipos devueltos: devuelve un valor igual a la gran tamaño en los que la capacidad de respuesta
expresión resulta más fundamental que la precisión absoluta.

Ejemplos: La implementación de la función garantiza una tasa


de error de hasta 2 % dentro de una probabilidad del
- Ejemplo básico 97 %.
Ejemplos:
SELECT MIN(TaxRate)
FROM Sales.SalesTaxRate; - Este ejemplo devuelve el número aproximado
GO de claves de pedido diferentes desde la tabla de
pedidos.
SELECT APPROX_COUNT_DISTINCT(O_OrderKey) Devuelve: 262
AS Approx_Distinct_OrderKey
FROM dbo.Orders; UPDATE Production.ProductInventory
SET Quantity=125
WHERE Quantity=100;
- Este ejemplo devuelve el número aproximado de GO
claves de pedido diferentes según el estado del --Get the checksum of the modified
pedido desde la tabla de pedidos. column.
SELECT O_OrderStatus, SELECT CHECKSUM_AGG(CAST(Quantity AS
APPROX_COUNT_DISTINCT(O_OrderKey) AS int))
Approx_Distinct_OrderKey FROM Production.ProductInventory;
FROM dbo.Orders
GROUP BY O_OrderStatus
ORDER BY O_OrderStatus; Devuelve: 287

 CHECKSUM_AGG: devuelve la suma de  GROUPING:


comprobación de los valores de un grupo.
Suma de comprobacion: (también llamada checksum),
en telecomunicación e informática, es una función de
redundancia que tiene como propósito principal detectar
cambios accidentales en una secuencia de datos para
proteger la integridad de estos, verificando que no haya
discrepancias entre los valores obtenidos al hacer una
comprobación inicial y otra final tras la transmisión. La
idea es que se transmita el dato junto con su valor
checksum, de esta forma el receptor puede calcular
dicho valor y compararlo así con el valor de checksum
recibido. Si hay una discrepancia se pueden rechazar los
datos o pedir una retransmisión.

CHECKSUM_AGG ( [ ALL | DISTINCT ]


expression )

o ALL: aplica la función de agregado a todos los


valores. ALL es el valor predeterminado.
o DISTINCT: especifica que
CHECKSUM_AGG devuelve la suma de
comprobación de valores únicos.

Tipos de datos devueltos: devuelve la suma de


comprobación de todos los valores de
expression como int.
CHECKSUM_AGG puede detectar cambios en una
tabla.
El resultado CHECKSUM_AGG no depende del orden
de las filas de la tabla. Asimismo, las funciones
CHECKSUM_AGG permiten el uso de la palabra clave
DISTINCT y de la cláusula GROUP BY.
Si se cambia un valor de una lista de expresiones,
probablemente también cambiará la lista de valores de
la suma de comprobación de lista, aunque hay una
pequeña posibilidad de que la suma de comprobación
calculada no cambie.
Ejemplos:
- En estos ejemplos se usa CHECKSUM_AGG
para detectar cambios en la columna Quantity
de la tabla ProductInventory.
SELECT CHECKSUM_AGG(CAST(Quantity AS
int))
FROM Production.ProductInventory;