Módulo 2 Desarrollo de Bases de Datos
Módulo 2 Desarrollo de Bases de Datos
Índice
Integridad de los datos en SQL SERVER ............................................................................................. 3
Tipos de restricciones de integridad .............................................................................................. 3
Restricciones Default:..................................................................................................................... 3
Restricciones Check ........................................................................................................................ 5
Deshabilitar y habilitar restricciones check ................................................................................... 6
Reglas de restricciones Check: ....................................................................................................... 6
Restricciones usando expresiones regulares ................................................................................. 7
Restricción Primary Key.................................................................................................................. 8
Restricciones UNIQUE .................................................................................................................... 9
Laboratorio de trabajo independiente para trabajar con restricciones ..................................... 10
Índices ............................................................................................................................................... 13
Índice agrupado: ........................................................................................................................... 14
índice no agrupado: ...................................................................................................................... 14
Índice Columnar:........................................................................................................................... 14
Limitaciones: ................................................................................................................................. 16
Reglas de índices columnares ...................................................................................................... 16
¿Como crear índices?.................................................................................................................... 17
Crear un índice agrupado ......................................................................................................... 17
Crear un índice NO agrupado ................................................................................................... 17
Crear un índice Columnar ......................................................................................................... 17
Laboratorio de trabajo independiente para trabajar con índices .............................................. 18
Transact -SQL .................................................................................................................................... 19
Categorías Transact -SQL .............................................................................................................. 19
DML ............................................................................................................................................... 20
Elementos del lenguaje T-SQL: Predicados y operadores ........................................................... 20
Teoría de Conjuntos y SQL Server ................................................................................................ 21
Teoría de conjuntos aplicada a las consultas de SQL Server ....................................................... 21
Lógica de predicados aplicada a consultas de SQL Server .......................................................... 22
Declaración SELECT ........................................................................................................................... 22
Elementos de una declaración SELECT ......................................................................................... 23
Procesamiento de las consultas Lógicas ...................................................................................... 23
Cláusula SELECT ............................................................................................................................ 23
DISTINCT ....................................................................................................................................... 24
Cláusula WHERE............................................................................................................................ 24
TOP ................................................................................................................................................ 25
GROUP BY ..................................................................................................................................... 25
HAVING ......................................................................................................................................... 26
ALIAS de Columna(campo) y ALIAS de Tabla ............................................................................... 27
ALIAS de columna: ........................................................................................................................ 27
ALIAS de Tabla .............................................................................................................................. 28
SUBCONSULTAS ............................................................................................................................ 28
Laboratorio de trabajo independiente sentencia SELECT SQL SERVER ...................................... 30
Sentencia INSERT .............................................................................................................................. 34
Sentencia UPDATE ............................................................................................................................ 34
Sentencia DELETE (cuidado con esta sentencia).............................................................................. 35
Sentencia TRUNCATE ........................................................................................................................ 35
Laboratorio para practicar las sentencias INSERT, UPDATE, DELETE, TRUNCATE. ..................... 36
Integridad de los datos en SQL SERVER
Es importante, al diseñar una base de datos y las tablas que contiene, tener en cuenta la
integridad de los datos, esto significa que la información almacenada en las tablas debe ser válida,
coherente y exacta.
Las restricciones (constraints) son un método para mantener la integridad de los datos,
asegurando que los valores ingresados sean válidos y que las relaciones entre las tablas se
mantengan. Se establecen en los campos y las tablas.
Pueden definirse al crear la tabla (create table) o agregarse a una tabla existente (empleando alter
table) y se pueden aplicar a un campo o a varios. Se aconseja crear las tablas y luego agregar las
restricciones.
Se pueden crear, modificar y eliminar las restricciones sin eliminar la tabla y volver a crearla.
sp_helpconstraint tabla
Restricciones Default:
especifica un valor por defecto para un campo cuando no se inserta explícitamente en un
comando insert Para establecer un valor por defecto para un campo se emplea la cláusula default
al crear la tabla, por ejemplo:
Cada vez que se establece un valor por defecto para un campo de una tabla, SQL Server crea
automáticamente una restricción default para ese campo de esa tabla.
Dicha restricción, recibe un nombre dado por SQL Server que consiste DF (por default), seguido del
nombre de la tabla, el nombre del campo y letras y números aleatorios.
Podemos agregar una restricción default a una tabla existente con la sintaxis básica siguiente:
default VALORPREDETERMINADO
for CAMPO;
En la sentencia siguiente agregamos una restricción default al campo nombre de la tabla existente
Alumno que almacena el valor Desconocido en dicho campo si no ingresamos un valor en un
insert:
default 'Desconocido'
for Nombre;
En la siguiente sentencia se agrega una restricción para el campo documento de la tabla Alumno:
default 0
for documento;
Por convención, cuando demos el nombre a las restricciones default emplearemos un formato
similar al que le da SQL Server: DF_NOMBRETABLA_NOMBRECAMPO
Solamente se permite una restricción default por campo y no se puede emplear junto con la
propiedad identity. Una tabla puede tener varias restricciones default para sus distintos campos.
La restricción default acepta valores tomados de funciones del sistema, por ejemplo, podemos
establecer que el valor por defecto de un campo de tipo datetime sea getdate().
Restricciones Check
La restricción check especifica los valores que acepta un campo, evitando que se ingresen valores
inapropiados o basura.
check CONDICION;
Trabajamos con la tabla Alumno que tiene los siguientes campos y una restricción default para el
campo ciudad.
Crearemos una restricción check para no permitir la inserción o actualización del campo usando
números negativos en el campo Documento:
check (Documento>0);
Este tipo de restricción verifica los datos cada vez que se ejecuta una sentencia insert o update, es
decir, actúa en inserciones y actualizaciones. Sí la tabla ya contiene registros que no cumplen con
la restricción que se va a crear, la restricción no se puede crear, hasta que todos los registros
cumplan con dicha restricción.
La condición del check puede hacer referencia a otros campos de la misma tabla.
Ejemplo: En la siguiente sentencia se crea una restricción para que el número de documento sea
diferente al número de Carnet.
check (Documento<>Carnet);
Deshabilitar y habilitar restricciones check
Sabemos que si agregamos una restricción a una tabla que contiene datos, SQL Server los controla
para asegurarse que cumplen con la condición de la restricción, si algún registro no la cumple, la
restricción no se establece.
Podemos hacerlo cuando agregamos la restricción check a una tabla para que SQL Server acepte
los valores ya almacenados que infringen la restricción. Para ello debemos incluir la opción with
nocheck en la instrucción alter table
with nocheck
check (CONDICION);
Ejemplo:
with nocheck
check (Documento>0);
La restricción no se aplicará a los datos existentes de la tabla, pero si se trata de ingresar un nuevo
valor que no cumpla la restricción, SQL Server no lo permite. También podemos deshabilitar las
restricciones para agregar o actualizar datos sin comprobarla:
Para garantizar la integridad de los datos y la basura en los campos se pueden utilizar las
restricciones check con expresiones regulares.
Si el tipo de datos de la columna es CHAR o VARCHAR es posible utilizar las siguientes expresiones
regulares:
• Esta restricción check solo permite insertar letras mayúsculas, minúsculas y dígitos en el
campo Nombre, de la tabla Alumno.
ALTER TABLE
Alumno
ADD CONSTRAINT
CHK_Alumno
CHECK (Nombre NOT like '%[^0-9-A-Z-az]%')
• Esta restricción check solo permite insertar letras mayúsculas, minúsculas y dígitos en el
campo Nombre, de la tabla Alumno, los caracteres especiales no están permitidos.
ALTER TABLE
Alumno
ADD CONSTRAINT
CHK_Alumno
CHECK (Nombre like '%[^@$%&/*-+?¿()!¡^.,;=<>º#]%')
• Esta restricción check solo permite insertar dígitos en el campo Nombre, de la tabla
Alumno.
ALTER TABLE
Alumno
ADD CONSTRAINT
CHK_Alumno
CHECK (Nombre NOT like '%[^0-9]%')
• Esta restricción check solo permite insertar letras mayúsculas y minúsculas en el campo
Nombre, de la tabla Alumno.
ALTER TABLE
Alumno
ADD CONSTRAINT
CHK_Alumno
CHECK (Nombre NOT like '%[^A-Z-az]%')
Restricción Primary Key
Cada vez que establecíamos la clave primaria para la tabla, SQL Server creaba automáticamente
una restricción primary key para dicha tabla. Dicha restricción, a la cual no le dábamos un nombre,
recibía un nombre dado por SQL Server que comienza con PK(por primary key), seguido del
nombre de la tabla y una serie de letras y números aleatorios.
Podemos agregar una restricción primary key a una tabla existente con la sintaxis básica siguiente:
En el siguiente ejemplo definimos una restricción primary key para nuestra tabla Alumno para
asegurarnos que cada Alumno tendrá un Documento diferente y único:
primary key(Documento);
Con esta restricción, si intentamos ingresar un registro con un valor para el campo Documento
que ya existe o el valor Null, aparece un mensaje de error, porque no se permiten valores
duplicados ni nulos. Igualmente, si actualizamos.
Por convención, cuando demos el nombre a las restricciones primary key seguiremos el formato
PK_NOMBRETABLA_NOMBRECAMPO.
Cuando agregamos una restricción a una tabla que contiene información, SQL Server controla los
datos existentes para confirmar que cumplen las exigencias de la restricción, si no los cumple, la
restricción no se aplica y aparece un mensaje de error. Por ejemplo, si intentamos definir la
restricción primary key para la tabla Alumno y hay registros con códigos repetidos o con un valor
null, la restricción no se establece.
Cuando establecemos una clave primaria al definir la tabla, automáticamente SQL Server redefine
el campo como not null; pero al agregar una restricción primary key, los campos que son clave
primaria DEBEN haber sido definidos not null (o ser implícitamente not null si se definen como
identity).
SQL Server permite definir solamente una restricción primary key por tabla, que asegura la
unicidad de cada registro de una tabla. Si ejecutamos el procedimiento almacenado
sp_helpconstraint junto al nombre de la tabla, podemos ver las restricciones primary key (y todos
los tipos de restricciones) de dicha tabla.
Un campo con una restricción primary key puede tener una restricción check.
Un campo primary key también acepta una restricción default (excepto si es identity), pero no
tiene sentido ya que el valor por defecto solamente podrá ingresarse una vez; si intenta ingresarse
cuando otro registro ya lo tiene almacenado, aparecerá un mensaje de error indicando que se
intenta duplicar la clave.
Restricciones UNIQUE
Las restricciones aplicadas a tablas aseguran valores únicos para cada registro.
Anteriormente vimos la restricción primary key, otra restricción para las tablas es unique.
La restricción unique impide la duplicación de claves alternas (no primarias), es decir, especifica que
dos registros no puedan tener el mismo valor en un campo. Se permiten valores nulos. Se pueden
aplicar varias restricciones de este tipo a una misma tabla, y pueden aplicarse a uno o varios campos
que no sean clave primaria.
Se emplea cuando ya se estableció una clave primaria, pero se necesita asegurar que otros datos
también sean únicos y no se repitan (como número de documento).
unique (CAMPO);
Ejemplo:
unique (Documento);
En el ejemplo anterior se agrega una restricción unique sobre el campo Documento de la tabla
Alumno, esto asegura que no se pueda ingresar un Documento si ya existe. Esta restricción permite
valores nulos, así que, si se ingresa el valor null para el campo Documento, se acepta.
Por convención, cuando se crea el nombre de las restricciones unique seguiremos la misma
estructura: UQ_NOMBRETABLA_NOMBRECAMPO. Quizá parezca innecesario colocar el nombre de
la tabla, pero cuando empleemos varias tablas verá que es útil identificar las restricciones por tipo,
tabla y campo.
Recuerde que cuando agregamos una restricción a una tabla que contiene información, SQL Server
controla los datos existentes para confirmar que cumplen la condición de la restricción, si no los
cumple, la restricción no se aplica y aparece un mensaje de error. En el caso del ejemplo anterior, si
la tabla contiene números de documento duplicados, la restricción no podrá establecerse; si podrá
establecerse si tiene valores nulos. SQL Server controla la entrada de datos en inserciones y
actualizaciones evitando que se ingresen valores duplicados.
Laboratorio de trabajo independiente para trabajar con restricciones
Usando el siguiente script, ejecutar las sentencias indicadas y verificar que se cumplan las
distintas restricciones.
---Crear una base de datos ---
Create database Prematricula
---Usando contexto Prematricula
Use Prematricula
go
--- Este Check con expresión regular permite insertar letras y dígitos, no permite
la inserción de otro tipo de caracteres
ALTER TABLE
Alumno
ADD CONSTRAINT
CHK_Alumno
CHECK(Nombre NOT like '%[^0-9-A-Z-az]%')
---Este Check con expresión regular, solo permite la inserción de letras mayúscula y
minúsculas en el campo Nombre
ALTER TABLE
Alumno
ADD CONSTRAINT
CHK_Alumno
CHECK (Nombre NOT like '%[^A-Z-az]%')
--Insertando unos datos
Use Prematricula
go
Insert into Alumno (IdAlumno,Documento, Nombre, Apellido, FechaNacimiento,
Ciudad)
values
(1, 3454355,'Miguel', 'Garcia', '01-01-2000', DEFAULT)
go
Insert into Alumno (IdAlumno,Documento, Nombre, Apellido, FechaNacimiento,Ciudad)
values
(2, 3454356,'Ana', 'Alvarez', '01-01-1988','Medellin')
go
-- se crea una nueva tabla Alumno2 y se realiza una subconsulta para insertar datos
desde la tabla Alumno creada al inicio
Insert into Alumno2
SELECT * FROM Alumno WHERE Nombre='juan'
Go
--Consultar restricciones
sp_helpconstraint AsignaturaClase
--Deshabilitar el identity-----------------------------------------
---nueva tabla
Create table Clase
(IdClase int identity(1,1) not null primary key,
NombreClase varchar(100)
)
go
---Insertar un dato
Insert into Clase (NombreClase)
values ('Matematicas especiales')
--deshabilitar el identity_insert
Set identity_insert dbo.Clase ON
--Insertar el dato insertando la columna IdClase
Insert into Clase (IdClase,NombreClase)
values (2,'Bases de datos')
--Insertar datos a la nueva tabla
Insert into Clase (IdClase, NombreClase)
values (3,'Ingenieria de Software')
--deshabilitar el identity_insert
Set identity_insert dbo.Clase Off
---Consultando la tabla
SELECT * FROM Alumno
Índices
SQL Server accede a los datos de dos maneras:
• recorriendo las tablas; comenzando el principio y extrayendo los registros que cumplen las
condiciones de la consulta.
• empleando índices; recorriendo la estructura de árbol del índice para localizar los registros
y extrayendo los que cumplen las condiciones de la consulta.
Los índices se emplean para facilitar la obtención de información de una tabla. El índice de una
tabla desempeña la misma función que el índice de un libro: permite encontrar datos
rápidamente; en el caso de las tablas, localiza registros.
Una tabla se indexa por un campo (o varios). Un índice posibilita el acceso directo y rápido
haciendo más eficiente las búsquedas. Sin índice, SQL Server debe recorrer secuencialmente toda
la tabla para encontrar un registro.
Los índices más adecuados son aquellos creados con campos que contienen valores únicos.
Es importante identificar el o los campos por los que sería útil crear un índice, aquellos campos por
los cuales se realizan búsqueda con frecuencia: claves primarias, claves externas o campos que
combinan tablas.
No se recomienda crear índices por campos que no se usan con frecuencia en consultas o no
contienen valores únicos.
SQL Server permite crear tres tipos de índices:
1) agrupados(clustereados)
3) Columnares
Índice agrupado: es similar a un directorio telefónico, los registros con el mismo valor de campo
se agrupan juntos. Un índice agrupado determina la secuencia de almacenamiento de los registros
en una tabla. Se utilizan para campos por los que se realizan búsquedas con frecuencia o se accede
siguiendo un orden.
índice no agrupado: es como el índice de un libro, los datos se almacenan en un lugar diferente
al del índice, los punteros indican el lugar de almacenamiento de los elementos indizados en la
tabla. Un índice no agrupado se emplea cuando se realizan distintos tipos de búsquedas
frecuentemente, con campos en los que los datos son únicos.
Índice Columnar:
Los índices, columnares, surgieron en un proyecto llamado Apollo, este proyecto incluía dos
partes:
Los índices columnares nos aportan la capacidad de resolver consultas, muy complejas, de una
manera mucho más rápida.
Estos índices, no son ni más ni menos que un nuevo modelo de índices que se añaden al modelo
relacional, con una peculiaridad en su modo de almacenamiento. Hasta ahora la información se
almacenaba en páginas de datos, y estas páginas de datos contenían filas con los datos. Ahora ya
no es así, ahora el modo de almacenamiento de estos índices es en columnas, más abajo entro en
más en detalle cuando quiero decir en columnas.
Los índices columnares, traen compresión Vertipaq. Vertipaq surge en SQL Server 2008 R2, con la
aparición de Powerpivot y los sistemas de carga en memoria, donde se desarrollaron nuevos
algoritmos, los cuales comprimen alrededor de 10 veces los datos, más abajo tratamos esto más
en detalle… La compresión nativa que teníamos en versiones anteriores a SQL Server no encaja en
este nuevo tipo de índices, ya que se quiere manejar grandes volúmenes de datos eficientemente.
Anteriormente o en versiones anteriores, cuando hacemos una consulta, SQL Server, se va a disco
y carga las páginas en memoria, se lee toda la tabla y carga las páginas que necesita en memora…
Cada página ocupa 8 k… De esta forma carga información que no es útil en memoria, información
que está dentro de estas páginas… Malgastando la memoria, un recurso que es tan preciado … En
cambio, el almacenamiento por segmentos en columnas, donde tenemos almacenados los
segmentos comprimidos en disco, cuando nos llega la consulta, simplemente va a cargar en
memoria los segmentos necesarios de las columnas necesarias, cargando solo en memoria lo que
realmente es útil y va a usar…
El modo Batch, es un nuevo modo de procesamiento, que viene con los índices columnares,
tenemos que cambiar la filosofía que tenemos hasta ahora. En versiones anteriores cuando
nosotros procesábamos conjuntos de datos lo hacíamos fila por fila, ahora aparece un nuevo
modo Batch, que nos proporciona un procesamiento vectorial, que en lugar de ir fila por fila, nos
procesa conjuntos de filas, donde esos conjuntos de filas suelen ser de 1000 filas
aproximadamente. Con esto se aprovecha el paralelismo mucho más, y al procesar por conjuntos
de filas, reduce el consumo de CPU, produciendo mejor rendimiento a las consultas. Este modo de
procesamiento solo funciona para índices columnares, siempre que usemos otro tipo de índices,
procesará registro a registro, no por conjuntos de registros.
El modo Batch, no se utiliza siempre, aunque usemos índices columnares, para que use ente modo
de procesamiento Batch, nuestra consulta tiene que tener algún JOIN o algún filtro o algún
operador de agregación, que lo que haga es reducir un gran conjunto de datos con la agregación,
es cuando usará este tipo de procesamiento. También si el conjunto de datos para el cual hemos
creado índices columnares, son muy pequeños, (tablas pequeñas), es muy probable que tampoco
use este modo de procesamiento. Lo decide el Optimizador de consultas si utilizarlo o no…
Limitaciones:
Los datos no soportados para índices son:
Aunque existen alternativas, pero a priori no funcionan las modificaciones… Alternativas como
eliminar el índice, hacer las inserciones y volver a crear el índice. Esta operativa probablemente no
encaje en la lógica de tu aplicación, por lo que en este caso tendríamos que olvidarnos de estos
índices columnares.
Otra forma de hacerlo es manteniendo un histórico con la/s tabla/s con índice columnar y una/s
tabla/s auxiliar/es sin índice columnar donde cargaremos los datos diarios, entonces sobre las
tablas con índice c. y sin índice c. crearemos unas vistas con unión sobre las dos tablas, las
consultas irán sobre la vista, y tendremos entonces para un mayor volumen de datos índices
columnares y para los datos diarios no. Cuando crezca demasiado las tablas auxiliares hay que
volcarlas en una ventana de mantenimiento sobre las tablas con índices columnares.
Y una última alternativa es utilizando particionado, donde partimos de nuestra tabla principal, con
un índice columnar creado, y crearemos una tabla intermedia donde realizaremos las cargas y
posteriormente crearemos un índice columnar, para nuestras consultas nos apoyaremos en las
tablas intermedias y no en la tabla principal.
on TABLA(CAMPO);
SQL Server crea automáticamente índices cuando se establece una restricción primary key o
unique en una tabla. Al crear una restricción primary key, si no se especifica, el índice será
agrupado (clustered) a menos que ya exista un índice agrupado para dicha tabla. Al crear una
restricción unique, si no se especifica, el índice será no agrupado (non-clustered).
Puede especificarse que un índice sea agrupado o no agrupado al agregar estas restricciones.
Agregamos una restricción primary key al campo Documento de la tabla Alumno especificando
que cree un índice NO agrupado:
Todos los índices de la base de datos activan se almacenan en la tabla del sistema sysindexes,
podemos consultar dicha tabla tipeando:
Para ver todos los índices de la base de datos activa creados por nosotros podemos tipear la
siguiente consulta:
Transact -SQL
• Lenguaje de consulta estructurado (SQL)
• Desarrollado por IBM en 1970
• Adoptado como norma por los organismos de normas ANSI y ISO
• Ampliamente utilizado en la industria
• PL / SQL, SQL Procedural Language, Transact-SQL
• La implementación de Microsoft es Transact-SQL
• Referido como T-SQL
• Lenguaje de consulta para SQL Server
• SQL es declarativo, no procedural (Describa lo que desea, no especifique los pasos).
Operadores de Comparación =, >, <, >=, <=, <>, !=, !>, !<
Operadores Aritméticos +, -, *, /, %
Concatenación +
Teoría de Conjuntos y SQL Server
La teoría de conjuntos es una base matemática para el modelo de base de datos relacional
¿Qué es un conjunto?
Declaración SELECT
La sentencia SELECT nos permite consultar los datos almacenados en una tabla de una base de
datos.
Cláusula SELECT
Puede ser una sola constante, función de un solo valor o variable
SELECT * FROM
Con el asterisco le indico a SLQ SERVER que retorno todas las columnas de la tabla y todos sus
registros.
DISTINCT
Con la cláusula DISTINCT se especifica que los registros con ciertos datos duplicados sean
ignorados en el resultado. Por ejemplo, queremos conocer todos los autores de los cuales
tenemos libros, si utilizamos esta sentencia:
GROUP BY Nombre r;
Cláusula WHERE
Existe una cláusula, WHERE con la cual podemos especificar condiciones para una consulta SELECT
Es decir, podemos recuperar algunos registros, sólo los que cumplan con ciertas condiciones
indicadas con la cláusula WHERE Por ejemplo, queremos ver el usuario cuyo nombre es Jairo, para
ello utilizamos WHERE y luego de ella, la condición:
Para las condiciones se utilizan operadores relacionales, El signo igual (=) es un operador
relacional.
SELECT Nombre
FROM Alumno
WHERE nombre='Jairo';
FROM NOMBRETABLA
WHERE CONDICION;
Si el retorne de la consulta arroja valores nulos, podemos modificar la sentencia para que ignore
los valores nulos o desconocidos.
FROM Alumno;
Note que, si contamos los autores sin distinct, no incluirá los valores NULL pero si los repetidos:
SELECT count(nombre)
FROM Alumno;
TOP
La palabra clave TOP se emplea para obtener sólo una cantidad limitada de registros, los primeros
N registros de una consulta.
Con la siguiente consulta obtenemos todos los datos de los primeros 2 libros de la tabla:
Es decir, luego del SELECT se coloca TOP seguido de un número entero positivo y luego se continúa
con la consulta.
Se puede combinar con ORDER BY para ordenar los resultados de forma ascendente o
descendente por un campo de la tabla.
FROM Alumno
order by Nombre;
Otro argumento posible cuando utilizamos la cláusula TOP es percent indicando el porcentaje de
registros a recuperar y no la cantidad, por ejemplo:
* FROM Autor
order by Nombre;
• Si colocamos un valor para TOP que supera la cantidad de registros de la tabla, SQL Server
muestra todos los registros.
GROUP BY
Podemos generar valores de resumen para un solo campo, combinando las funciones de agregado
con la cláusula GROUP BY, que agrupa registros para consultas detalladas.
Con GROUP BY podemos agrupar los campos para mostrar los resultados sin repetir.
GROUP BY Carnet;
La instrucción anterior solicita que muestre el nombre del alumno y cuente la cantidad agrupando
los registros por el campo Carnet. Como resultado aparecen los nombres de los alumnos y la
cantidad de registros para cada valor del campo.
Entonces, para saber la cantidad de alumnos que tenemos con cada nombre, utilizamos la función
count(), agregamos GROUP BY (que agrupa registros) y el campo por el que deseamos que se
realice el agrupamiento, también colocamos el nombre del campo a recuperar; la sintaxis básica es
la siguiente:
Sintaxis:
FROM NOMBRETABLA
GROUP BY CAMPO;
También se puede agrupar por más de un campo, en tal caso, luego del GROUP BY se listan los
campos, separados por comas. Todos los campos que se especifican en la cláusula GROUP BY
deben estar en la lista de selección.
FROM NOMBRETABLA
GROUP BY CAMPO1,CAMPO2;
HAVING
Así como la cláusula WHERE permite seleccionar (o rechazar) registros individuales; la cláusula
having permite seleccionar (o rechazar) un grupo de registros.
Si queremos saber la cantidad de Alumno agrupados por Nombre usamos la siguiente instrucción:
FROM libros
GROUP BY editorial;
Si queremos saber la cantidad de alumnos agrupados por nombre, pero considerando sólo algunos
grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instrucción:
GROUP BY Nombre
having count(*)>2;
Se utiliza having, seguido de la condición de búsqueda, para seleccionar ciertas filas retornadas
por la cláusula GROUP BY.
Veamos otros ejemplos. Queremos el promedio de los precios de los productos agrupados por
Categoría, pero solamente de aquellos grupos cuyo promedio supere los $ 50.000:
GROUP BY Categoria
En algunos casos es posible confundir las cláusulas WHERE y HAVING. Queremos contar los
registros agrupados por editorial sin tener en cuenta a la editorial Planeta.
GROUP BY Categoria;
GROUP BY Categoria
Ambas devuelven el mismo resultado, pero son diferentes. La primera, selecciona todos los
registros rechazando los de la categoría Licores y luego los agrupa para contarlos. La segunda,
selecciona todos los registros, los agrupa para contarlos y finalmente rechaza filas con el conteo
correspondiente a la categoría Licores.
ALIAS de columna:
SELECT Nombre AS Name
FROM Alumno
Para reemplazar el nombre de un campo por otro, se coloca la palabra clave AS seguido del texto
del encabezado.
Si el ALIAS consta de una sola cadena las comillas no son necesarias, pero si contiene más de una
palabra, es necesario colocarla entre comillas simples:
Ejemplo:
FROM Alumno;
Entonces, un ALIAS se usa como nombre de un campo o de una expresión. En estos casos, son
opcionales, sirven para hacer más comprensible el resultado.
ALIAS de Tabla
El siguiente ejemplo describe la sentencia para usar un ALIAS de tabla, en donde se utiliza una
letra que se usa como prefijo para identificar el nombre de una tabla dentro de la consulta.
SELECT P.ProductId, P.UnitPrice , P.QuantityPerUnit, P.Discontinued
FROM Products P ;
SUBCONSULTAS
Una subconsulta (subquery) es una sentencia SELECT anidada en otra sentencia SELECT, INSERT
UPDATE, DELETE (o en otra subconsulta).
Las subconsultas se emplean cuando una consulta es muy compleja, entonces se la divide en
varios pasos lógicos y se obtiene el resultado con una única instrucción y cuando la consulta
depende de los resultados de otra consulta.
• en lugar de una expresión, siempre que devuelvan un solo valor o una lista de valores.
• que retornen un conjunto de registros de varios campos en lugar de una tabla o para
obtener el mismo resultado que una combinación (join).
• las que retornan un solo valor escalar que se utiliza con un operador de comparación o en
lugar de una expresión.
• las que retornan una lista de valores, se combinan con in, o los operadores ANY, SOME y
ALL.
• los que testean la existencia con EXIST
o una subconsulta puede estar anidada dentro del WHERE o HAVING de una
consulta externa o dentro de otra subconsulta.
las subconsultas que retornan una lista de valores reemplazan a una expresión en una
cláusula WHERE que contiene la palabra clave IN.
El resultado de una subconsulta con IN (o NOT IN) es una lista. Luego que la
subconsulta retorna resultados, la consulta exterior los usa.
La sintaxis básica es la siguiente:
Ejemplos:
--subconsultas self contained(retorna más de un valor), no tienen dependencia de la
consulta externa IN: incluye únicamente los datos del IN()
SELECT ContactName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID =
Suppliers.supplierID AND UnitPrice = 38.0000);
USE NORTHWIND
GO
-- sintaxis SELECT
--SELECT Campos FROM Tabla;
SELECT country
FROM Customers;
-- No es buena pràctica
SELECT * FROM CUSTOMERS
WHERE COUNTRY=123
--SELECT-WHERE-OR
SELECT * FROM CUSTOMERS
WHERE City='Berlin' OR City='München';
--Alias de Columna
SELECT ProductId, UnitPrice AS Precio
FROM Products;
--Alias de tabla
SELECT P.ProductId, P.UnitPrice , P.QuantityPerUnit, p.Discontinued
FROM Products P ;
-- SELECT-GROUP BY
--Instruccion LIKE todos los que NO comiencen con la letra A, [^]no contiene
SELECT ContactName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID =
Suppliers.supplierID AND UnitPrice = 38.0000);
Ejemplo:
INSERT INTO Alumno (IdAlumno, Documento, Nombre, Apellido, FechaNacimiento,
Ciudad) VALUES (1, 3454355,'Miguel', 'Garcia', '01-01-2000', DEFAULT)
Sentencia UPDATE
Decimos que actualizamos un registro cuando modificamos alguno de sus valores.
Para modificar uno o varios datos de uno o varios registros utilizamos UPDATE (actualizar).
Por ejemplo, en nuestra tabla Alumno queremos cambiar todas las ciudades pro ‘Medellín’, por
Utilizamos UPDATE junto al nombre de la tabla y SET junto con el campo a modificar y su nuevo
valor. El cambio afectará a todos los registros.
Podemos modificar algunos registros, para ello debemos establecer condiciones de selección con
WHERE.
Por ejemplo, necesitamos cambiar la ciudad de residencia por Medellín para los alumnos que
tengan como ciudad Envigado.
Las condiciones no son obligatorias, pero si omitimos la cláusula WHERE la actualización afectará a
todos los registros y puede causar un incidente.
Para ello colocamos UPDATE el nombre de la tabla, SET junto al nombre del campo y el nuevo
valor y separado por coma, el otro nombre del campo con su nuevo valor.
Si no queremos eliminar todos los registros, sino solamente algunos, debemos indicar cuál o
cuáles, para ello utilizamos el comando DELETE junto con la cláusula WHERE con la cual
establecemos la condición que deben cumplir los registros a borrar.
Si solicitamos el borrado de un registro que no existe, es decir, ningún registro cumple con la
condición especificada, ningún registro será eliminado.
Tengan en cuenta que si no colocamos una condición (WHERE), se eliminan todos los registros de
la tabla nombrada.
Sentencia TRUNCATE
Vimos que para borrar todos los registros de una tabla se usa DELETE sin condición WHERE
También podemos eliminar todos los registros de una tabla con TRUNCATE TABLE.
• La sentencia TRUNCATE TABLE vacía la tabla (elimina todos los registros) y conserva la
estructura de la tabla.
• La diferencia con DROP TABLE es que esta sentencia borra la tabla, TRUNCATE TABLE la
vacía.
• La diferencia con DELETE es la velocidad, es más rápido TRUNCATE TABLE que DELETE (se
nota cuando la cantidad de registros es muy grande) ya que éste borra los registros uno a
uno.
• Otra diferencia es la siguiente: cuando la tabla tiene un campo identity, si borramos todos
los registros con DELETE y luego ingresamos un registro, al cargarse el valor en el campo
de identidad, continúa con la secuencia teniendo en cuenta el valor mayor que se había
guardado; si usamos TRUNCATE TABLE para borrar todos los registros, al ingresar otra vez
un registro, la secuencia del campo de identidad vuelve a iniciarse en 1.
Ejemplo:
Tenemos la tabla Alumno con el campo Documento definido como identity (1,1), el valor del
consecutivo de la tabla va en 2, si borramos todos los registros con DELETE y luego insertamos un
nuevo registro, el nuevo registro se guardará con el consecutivo 3, pero si vaciamos la tabla con
TRUNCATE TABLE, al insertar un nuevo registro, el nuevo registro iniciará nuevamente en 1.
Use Master
go
---Crear una base de datos ---
Create database Prematricula
---Usando contexto Universidad
Use Prematricula
go
-- se crea una nueva tabla Alumno2 y se realiza una subconsulta para insertar datos
desde la tabla Alumno creada al inicio
Insert into Alumno2
select * from Alumno where Nombre='juan'
Go
---nueva tabla
Create table Clase
(IdClase int identity(1,1) not null primary key,
NombreClase varchar(100)
)
go
---Insertar un dato
Insert into Clase (NombreClase)
values ('Matematicas especiales')
--deshabilitar el identity_insert
Set identity_insert dbo.Clase ON
--Insertar el dato insertando la columna IdClase
Insert into Clase (IdClase,NombreClase)
values (2,'Bases de datos')
--Insertar datos a la nueva tabla
Insert into Clase (IdClase, NombreClase)
values (3,'Ingenieria de Software')
--deshabilitar el identity_insert
Set identity_insert dbo.Clase Off
---Consultando la tabla
Select * from Alumno