0% encontró este documento útil (0 votos)
3 vistas72 páginas

4 SQL

El documento proporciona una visión general del lenguaje SQL y su uso con Microsoft SQL Server, destacando su evolución y características principales. Se describen las categorías de instrucciones SQL (DDL, DCL, DML) y los métodos de ejecución, así como la importancia de los sistemas de gestión de bases de datos relacionales. Además, se incluyen instrucciones sobre la instalación y conexión a SQL Server Management Studio, así como una breve descripción de las bases de datos del sistema en SQL Server.

Cargado por

peter
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
3 vistas72 páginas

4 SQL

El documento proporciona una visión general del lenguaje SQL y su uso con Microsoft SQL Server, destacando su evolución y características principales. Se describen las categorías de instrucciones SQL (DDL, DCL, DML) y los métodos de ejecución, así como la importancia de los sistemas de gestión de bases de datos relacionales. Además, se incluyen instrucciones sobre la instalación y conexión a SQL Server Management Studio, así como una breve descripción de las bases de datos del sistema en SQL Server.

Cargado por

peter
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Bases de datos y herramientas de Business Intelligence

El lenguaje de consulta SQL


con Microsoft SQL Server

Autor: Yolanda Hernández Haro

Actualizado diciembre 2019


Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

SQL

SQL (Structured Query Language por sus siglas en inglés) es un lenguaje que se basa en
el modelo relacional. Este lenguaje permite la implementación física de un modelo
relacional y permite la manipulación de datos almacenados en una base de datos
relacional. Si revisamos una última vez el diagrama siguiente:

Requisitos de datos

Diseño conceptual

Modelo Conceptual

Diseño lógico

Modelo lógico

Diseño físico

Modelo físico

Nos encontramos en la fase de diseño físico con la intención de producir un modelo


físico listo para su implementación. El lenguaje SQL nos proporcionará las
herramientas necesarias para implementar este modelo.

El lenguaje SQL se desarrolló en los años 70 como consecuencia de la introducción del


modelo relacional. En 1986 ANSI (American National Standards Institute) publicó el
primer estándar publicado para el lenguaje, denominado SQL-86. El estándar se ha ido
actualizando en años sucesivos: 1989, 1992, 2003 y 2006. Los distintos estándares de

2
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

SQL han ido añadiendo más funcionalidad al original, como procedimientos, funciones
o conceptos de la programación orientada a objetos.

El lenguaje SQL es diferente de otros lenguajes de programación como C o Java, que


son de procedimiento. Los lenguajes de procedimiento definen cómo se deben realizar
las operaciones y el orden en el cuál se realizan. SQL es un lenguaje declarativo, donde
se define qué es lo que se desea obtener o lo que se está buscando y el intérprete de
SQL decidirá cómo satisfacer esta petición. Aun así, numerosos SGBD contienen
procedimientos almacenados, que son parte del estándar 2006 de SQL y proporcionan
capacidades parecidas al procedimiento.

A menudo SQL se considera como un sublenguaje de datos ya que carece de muchas


capacidades básicas de programación de la mayoría de los lenguajes computacionales.
SQL se utiliza con frecuencia junto a otros lenguajes de programación como C y Java,
que no fueron diseñados para la manipulación de datos almacenados en una base de
datos.

Tipos de instrucciones de SQL

Las instrucciones SQL se pueden dividir en tres categorías dependiendo de la función


que realizan:

a) Lenguaje de definición de datos (DDL, Data Definition Language)

El lenguaje de definición de datos se usa para crear, modificar o eliminar objetos de


una base de datos como tablas, esquemas, vistas o procedimientos almacenados.
Este tipo de instrucciones suelen empezar por las palabras clave CREATE, ALTER y
DROP. Por ejemplo, usaremos la instrucción CREATE TABLE para crear una tabla
(esquema de relación en el modelo relacional), ALTER TABLE para modificarla y
DROP TABLE para eliminarla.

b) Lenguaje de control de datos (DCL, Data Control Language)

El lenguaje de control de datos permite controlar la seguridad de la base de datos.


Con este tipo de instrucciones se controla quién tiene acceso a qué objetos de la
base de datos y qué tipo de acceso. Se puede otorgar o restringir el acceso
utilizando instrucciones GRANT o REVOKE. Por ejemplo, con el DCL podemos
determinar qué usuarios puede ver un conjunto de datos específico y qué usuarios
pueden manipular esos datos.

3
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

c) Lenguaje de manipulación de datos (DML, Data manipulation Language)

El lenguaje de manipulación de datos se usa para manipular los datos de una base
de datos, es decir, recuperar, añadir, modificar o borrar datos almacenados en ella.
Este tipo de instrucciones suelen empezar por las palabras clave SELECT, INSERT,
UPDATE y DELETE. Por ejemplo, se puede usar la instrucción SELECT para recuperar
datos de varias tablas y la instrucción INSERT para insertar datos en una tabla.

Tipos de ejecución

Las instrucciones SQL se pueden ejecutar de varias formas:

d) Invocación directa o ad hoc

Mediante el uso de este método se pueden ejecutar instrucciones SQL


directamente desde una aplicación de usuario, como Management Studio en
Microsoft SQL Server, en la base de datos. Para ello sólo es necesario introducir la
consulta en la ventana de aplicación y ejecutarla. Los resultados de la consulta se
devolverán tan rápido como sea posible.

e) SQL integrado

Al usar este método las instrucciones SQL están codificadas o integradas en el


código de un lenguaje de programación (como C o Java). Las instrucciones SQL se
integran en el código fuente para permitir al programa acceder y modificar los
datos y la estructura de la base de datos subyacente.

f) Módulo cliente de SQL

Mediante este método se crean bloques de instrucciones SQL separados del


lenguaje de programación anfitrión. Se diferencia de SQL integrado en que los
módulos clientes de SQL se encuentran separados del lenguaje de programación. El
lenguaje anfitrión contiene llamadas que invocan al módulo, que ejecutará las
instrucciones SQL dentro de ese módulo.

g) CLI (Call Level Interface)

CLI es una interfaz de programación de aplicaciones (API por sus siglas en inglés)
para acceder a bases de datos relacionales utilizando un conjunto de rutinas
predefinidas que permiten que un lenguaje de programación se comunique con
una base de datos SQL. Una de las implementaciones más conocidas del modelo
4
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

CLI es ODBC (Open Database Connectivity) de Microsoft. Otra API de gran


popularidad es OLE-DB de Microsoft, más eficiente que ODBC y además soporta
acceso a otro tipo de fuentes además de SQL.

Para los ejercicios de este módulo usaremos el tipo de ejecución ad hoc aunque el
método más utilizado en aplicaciones hoy en día es el de SQL integrado.

SGBDR (Sistema de Gestión de Base de Datos


Relacional)

Un sistema de gestión de bases de datos relacional es una aplicación que se encarga de


almacenar, administrar, recuperar, modificar y manipular información en bases de
datos relacionales. Entre los SGBDR más populares se encuentran Microsoft SQL
Server, DB2, Oracle y MySQL. Estas aplicaciones permiten interactuar con la
información que se almacena en ellos. No es necesario que un SGBDR se base en SQL,
pero la mayoría de ellos lo hacen y tratan de ajustarse al estándar SQL. Además de
implementar los estándares SQL, estos productos incluyen instrucciones SQL
adicionales, herramientas de administración e interfaces de usuario que permiten la
consulta y modificación de información.

El núcleo de un SGBDR basado en SQL es, por supuesto, el lenguaje SQL. Sin embargo,
el lenguaje que se utiliza no es SQL puro, sino que cada SGBDR extiende el lenguaje
SQL y lo implementa de una forma ligeramente distinta. Por ejemplo, en Microsoft SQL
Server el lenguaje SQL que se utiliza se denomina Transact SQL (T-SQL) y en Oracle se
llama PL/SQL.

En este curso el SGBDR que utilizaremos es Microsoft SQL Server 2016. Su instalación
para que puedan acceder los alumnos se ha realizado en una máquina virtual a través
de Microsoft Azure en la nube. En la máquina virtual se ha instalado un servidor de
Microsoft SQL Server 2016. En este producto la interfaz de usuario con la que se
interacciona con el sistema se llama SQL Server Management Studio. Esta herramienta
la utilizan los administradores de la base de datos y usuarios para administrar
múltiples servidores, crear bases de datos, etc.

En el estándar SQL no se define el concepto de una base de datos. Esto ha llevado a


que los distintos SGBDR pueden definir una base de datos como un objeto distinto,
pudiendo así encontrar distintas arquitecturas. Por ejemplo, en Microsoft SQL Server
una instancia o copia del software puede almacenar cualquier número de base de

5
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

datos, donde cada base de datos almacena una colección lógica de objetos que se
escogen para administrarlos juntos. Sybase, DB2 y MySQL tienen una arquitectura
parecida. Sin embargo, Oracle implementa una arquitectura distinta. En Oracle cada
instancia del software administra una sola base de datos y el usuario de cada base de
datos tiene un esquema distinto donde almacenar una base de datos de objetos que
pertenecen a ese usario. De hecho, un esquema de Oracle es muy similar a una base
de datos de SQL Server.

Para realizar los ejercicios que se proponen en este tema es necesario tener instalado
SQL Server Management Studio. Mediante esta interfaz cliente nos conectaremos al
servidor virtual instalado para los alumnos de este máster. La herramienta SQL Server
Management Studio la proporciona Microsoft de forma gratuita y será necesario que
los alumnos la descarguen e instalen en sus ordenadores personales.

La versión de SQL Server Management Studio que podrán instalar dependerá del
sistema operativo que tengan en sus ordenadores personales.

Si el alumno dispone de uno de los siguientes sistemas operativos podrá seguir las
instrucciones detalladas a continuación.

Windows 10 (64-bit) *

Windows 8.1 (64-bit)

Windows Server 2019 (64-bit)

Windows Server 2016 (64-bit) *

Windows Server 2012 R2 (64-bit)

Windows Server 2012 (64-bit)

Windows Server 2008 R2 (64-bit)

* Requiere versión 1607 (10.0.14393) o posterior

Para instalar SQL Server Management Studio abra en un navegador el siguiente enlace:

[Link]
ssms?view=sql-server-ver15

En esta página pulse en “Download SQL Server Management Studio”. Esto abrirá la
siguiente ventana:

6
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Pulse “Save File” y proporcione una ruta donde guardar el fichero. Una vez que la
descarga haya finalizado ejecute el fichero, esto iniciará la aplicación para la instalación
de SQL Server Management Studio que mostrará la siguiente ventana:

7
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Pulse “Install”. Seguidamente aparecerá otra ventana preguntado “Do you want to
allow this app to make changes to your device?”, pulse Yes.

Si no dispone de uno de los sistemas operativos mencionados anteriormente deberá


instalar Azure Data Studio (disponible para Mac y Linux). Está disponible en el
siguiente enlace:

[Link]
ver15

Azure Data Studio está disponible para los siguientes sistemas operativos:

Windows

Windows 10 (64-bit)

Windows 8.1 (64-bit)

Windows 8 (64-bit)

Windows 7 (SP1) (64-bit) - Requires KB2533623

Windows Server 2019

Windows Server 2016

Windows Server 2012 R2 (64-bit)

Windows Server 2012 (64-bit)

Windows Server 2008 R2 (64-bit)

macOS

macOS 10.13 High Sierra

macOS 10.12 Sierra

Linux

Red Hat Enterprise Linux 7.4

Red Hat Enterprise Linux 7.3


8
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

SUSE Linux Enterprise Server v12 SP2

Ubuntu 16.04

Una vez instalado SQL Server Management Studio podemos lanzar la aplicación a
través de Windows -> Microsoft SQL Server 2016 -> Microsoft SQL Server
Management Studio.

Al abrir SQL Server Management Studio lo primero que nos preguntará es por los datos
de la conexión.

Introduzca lo siguiente:

Server Type -> Database Engine

Server name -> [Link]

Authentication -> SQL Server Authentication

9
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Login -> Introduzca el login suministrado por correo electrónico

Password -> Introduzca la contraseña suministrada por correo


electrónico

Seleccione “Remember password” para no tener que introducir la contraseña


de nuevo.

Pulse Connect.

Y así nos conectamos a la instancia de base de datos [Link] (VM31FA82B) a


través de su dirección IP.

10
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

En la pantalla anterior podemos ver la ventana Object Explorer. En esta ventana


podemos ver los objetos que existen en una base de datos en una estructura de árbol.
En esta ventana se presenta información sobre todos los servidores a los que está
conectado el usuario.
Otra de las ventanas que se usan con frecuencia es “Registered Servers”. Podemos
mostrarla en pantalla desde el menú View -> Registered Servers.

Esta ventana se utiliza para registrar los servidores que utilizamos con frecuencia. Para
añadir un servidor a la lista expanda Database Engine y pulse con el botón derecho del
ratón en Local Server Groups. En el menú que aparece pulse sobre New Server
Registration.

11
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Aparecerá la siguiente ventana:

Introduzca los datos del servidor que está registrando de la misma forma que lo hizo al
conectarse al servidor. Se puede probar que la conexión será satisfactoria pulsando el
botón “Test”. Una vez que ha comprobado que la conexión funciona pulse el botón
“Save”. Esto hará que los datos del servidor de bases de datos queden registrado para
poder utilizarlos en una siguiente ocasión.
12
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Base de datos de SQL Server

En SQL Server nos encontramos con bases de datos de usuario y bases de datos del
sistema. Las bases de datos de usuario almacenan los datos de las aplicaciones de
usuario mientras que las bases de datos del sistema almacenan información que
permite administrar el sistema de bases de datos. SQL Server dispone de varias bases
de datos ejemplo como Northwind y Pubs que usaremos para ejecutar nuestras
consultas de prueba. Nos encontramos con las siguientes bases de datos del sistema:

h) master, registra toda la información del sistema para una instancia de SQL
Server.
i) model, se utiliza como plantilla para crear todas las bases de datos de usuario.
j) tempdb, contiene objetos temporales y resultados intermedios.
k) msdb, base de datos del agente de SQL Server (SQL Server Agent). El agente se
encarga de programar alertas y trabajos.

Puede ver las bases de datos del sistema en Databases->System Databases:

Objetos básicos de T-SQL

En esta sección veremos los objetos elementales que se incluyen en el lenguaje T-SQL:

• Literales

Un literal es una constante numérica, hexadecimal o alfanumérica:

13
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

a) Literal alfanumérico
En T-SQL los literales alfanuméricos se rodean de comillas simples (’ ’) o
dobles (“ ”). Se prefiere el uso de comillas simples debido a los múltiples
usos de las comillas dobles. Para incluir una comilla simple en un literal
alfanumérico se introducen dos comillas simples seguidas.
Por ejemplo:

‘Madrid’

‘Fernado López Santos’

‘C\Limón nº7 3ºA’

‘Este literal continene una comilla ‘’ como esta’

b) Literal numérico

Los literales numéricos se usan para representar constantes numéricas.


Por ejemplo:

345

-2345

-40.77

-0.65E7 (notación científica, nEm significa n multiplicado por 10m)

c) Literal hexadecimal

Se utilizan para representar datos binarios. Empiezan con los caracteres


0x seguidos de un número de letras (A – F) y números. Por ejemplo:

0x34526C0D

0x12Ef

0x69048AEFDD010E

• Identificadores

Los identificadores se usan para nombrar los objetos de una base de datos, como
tablas, índices o columnas. En T-SQL se representan por cadenas alfanuméricas de
hasta 128 caracteres y pueden contener letras, números o los caracteres siguientes: _,
@, # y $. Un identificador tiene que empezar por una letra o por los caracteres _, @ o

14
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

$. Los delimitadores que empiezan por # son objetos temporales y los que empiezan
por @ son variables.

Estas reglas no se aplican a los identificadores delimitados que veremos a


continuación.

• Delimitadores

En T-SQL las comillas dobles tienen dos significados: para delimitar una cadena de
caracteres y para tener un identificador delimitado. Los identificadores delimitados se
usan para permitir el uso de palabras reservadas y espacios en los identificadores.

• Comentarios

Hay dos formas de escribir comentarios en T-SQL. Podemos usar /* y */ para delimitar
un bloque de texto que formará nuestro comentario. También podemos usar --(dos
guiones) para indicar que una línea es un comentario.

• Palabras reservadas

Cada lenguaje de programación usa un conjunto de palabras que tienen un significado


especial. Estas palabras se tienen que escribir y usar en un formato determinado. Las
palabras de este tipo se llaman palabras reservadas. Por ejemplo, SELECT, FROM,
INSERT, UPDATE, SUM son palabras reservadas.

Lenguaje de definición de datos (DDL)

En esta sección describiremos las instrucciones para la creación, modificación y


borrado de objetos.

Una base de datos se organiza mediante muchos objetos diferentes. Los objetos de
una base de datos se pueden clasificar en físicos o lógicos. Los objetos físicos están
relacionados con la organización de los datos en un dispositivo físico como un disco.
Los objetos lógicos representan la forma en la que el usuario ve la base de datos. Por
ejemplo, las tablas, las columnas o las vistas son objetos lógicos de la base de datos. A
continuación, veremos cómo podemos crear, modificar y eliminar objetos de la base
de datos:

15
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Bases de datos
A pesar de que el estándar SQL no define qué es una base de datos la mayoría de los
SGBDR basan su estructura jerárquica en la creación de un objeto de base de datos.

La instrucción SQL para crear una base de datos es CREATE DATABASE. Esta instrucción
tiene una serie de parámetros, por ejemplo, se puede especificar el nombre de la base
de datos y en qué ficheros se almacenará esta. Veamos la instrucción más sencilla para
crear una base de datos de nombre Saturno:

CREATE DATABASE Saturno

Esta instrucción creará la base de datos Saturno en la localización por defecto del
servidor de base de datos.

SQL Server almacena la base de datos en ficheros en disco. Cada fichero contiene los
datos de una sola base de datos.

Para borrar una base de datos utilizaremos el comando DROP DATABASE. Podemos
borrar la base de datos creada con anterioridad con el siguiente comando:

DROP DATABASE Saturno

En el servidor SQL que utilizaremos para completar los ejercicios del máster se ha
creado una base de datos para cada alumno donde podrán crear sus propios objetos.
El nombre de la base de datos asignada para cada alumno está incluido en el correo
que cada alumno ha recibido con los datos de conexión.

Esquemas
Un esquema en SQL Server es un objeto que agrupa un conjunto de objetos dentro de
una base de datos. Esto permite agrupar tablas y otros objetos en grupos para facilitar
su gestión de forma independiente. Dentro de una misma base de datos se pueden
crear varios esquemas. Se pueden aplicar reglas de seguridad a un esquema para que
los permisos se hereden por todos los objetos pertenecientes al esquema. Mediante la
siguiente instrucción se crea un esquema:

CREATE SCHEMA nombre_esquema

Pasaremos a crear un esquema en la base de datos asignada para cada alumno. Abra la
herramienta SQL Server Management Studio y conéctese al servidor de base de datos
del máster.

16
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Navegue en el Object Explorer hasta encontrar la base de datos asignada al alumno. Si


pulsa con el botón derecho en el nombre de la base de datos aparecerá un menú
donde se encuentra la opción “New Query”. Este comando abrirá una ventana donde
podremos ejecutar nuestra sentencia para la creación de un esquema.

Otra forma alternativa para abrir una ventana donde lanzar instrucciones SQL es
mediante el botón “New Query” en la barra superior:

En este caso será necesario escoger la base de datos donde deseamos ejecutar nuestra
consulta de la forma siguiente:

Una vez que ya estemos conectados a la base de datos podremos empezar a escribir
nuestra consulta para poder ejecutarla después.

17
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Nuestra primera instrucción va a ser la creación de un esquema. Escriba la siguiente


instrucción:

CREATE SCHEMA universidad

Ejecute este comando SQL pulsando “Execute”.

El panel de mensajes nos mostrará el resultado de la ejecución:

En esta ocasión recibimos el mensaje “Command(s) completed successfully.” que nos


indica que la instrucción se ejecutó con éxito.

Podemos ver el esquema que hemos creado en el explorador de objetos (Object


Explorer). Los esquemas se pueden encontrar en Security -> Schemas:
18
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Si no puede ver el esquema universidad en la lista de esquemas necesitará refrescar el


contenido de la carpeta Schemas. Para ello, pulse con el botón derecho del ratón sobre
Schemas y seleccione Refresh:

19
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Esta técnica funciona en todo el explorador de objetos: si no encuentra un objeto


refresque la carpeta donde espera encontrarlo.

Otra forma de asegurarnos de que el conjunto de instrucciones SQL se ejecuten en la


base de datos deseada es mediante el comando USE. La sintaxis es la siguiente:

USE nombre_basedatos

Este comando cambia la sesión a la base de datos especificada en


nombre_basedatos.

Por ejemplo, podríamos escribir el comando anterior de la siguiente forma:

USE Madrid

GO

CREATE SCHEMA universidad

Al usar el comando USE nos aseguramos de que nuestra instrucción CREATE SCHEMA
se ejecute en la base de datos especificada.

La eliminación de un esquema se puede realizar utilizando el comando DROP SCHEMA.


Podríamos borrar el esquema anterior utilizando el siguiente comando:

DROP SCHEMA universidad

Tablas
Las tablas son la unidad básica de gestión de datos en el entorno SQL. La mayoría de la
interacción con el entorno se hace a través de estas. Las tablas son la representación
física de un esquema de relación del modelo relacional. El estándar SQL proporciona
tres instrucciones para la creación, modificación y eliminación de tablas. Se utiliza la
instrucción CREATE TABLE para crear una tabla, la instrucción ALTER TABLE para
modificar una tabla y la instrucción DROP TABLE para borrar una tabla. De estas tres
instrucciones CREATE TABLE presenta la sintaxis más compleja, aunque la creación de
una tabla es un proceso relativamente sencillo.

Podemos encontrar tres tipos de tablas:

a) Tablas persistentes, es el tipo más común y contiene los datos que se


almacenan en la base de datos. Se crean con la instrucción CREATE
TABLE nombre y se pueden llamar desde cualquier sesión de SQL.

20
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

b) Tablas temporales globales, estas tablas se crean mediante la


instrucción CREATE TABLE ##nombre y son visibles desde todas las
sesiones. Este tipo de tablas se usan para almacenar resultados
intermedios a los que se podrá acceder desde sesiones distintas de
donde se crearon.
c) Tablas temporales locales, se crean mediante la instrucción CREATE
TABLE #nombre y son visibles sólo en la sesión actual. Este tipo de tablas
se usan para almacenar resultados intermedios y sólo se puede acceder
a ellas desde la sesión actual.

Una sesión SQL se refiere a la conexión entre un usuario y un programa donde se


ejecutan instrucciones SQL (como Management Studio). Durante una sesión se
ejecutan un conjunto de sentencias SQL. Las tablas temporales se almacenan en la
base de datos del sistema tempdb y se eliminan automáticamente al final de la sesión
de usuario.

La sintaxis que se utiliza para especificar instrucciones T-SQL utiliza una serie de
caracteres con un significado específico:

- [ ] (corchetes), indican que un elemento es opcional.


- | (barra vertical), indica una alternativa. Por ejemplo [NOT NULL|
NULL]significa NOT NULL o NULL.
- { } (llaves), indican que un elemento es obligatorio.

La sintaxis básica para la creación de una tabla es la siguiente:

CREATE TABLE nombre_tabla


(nombre_columna1 tipo1 [NOT NULL| NULL]
[{, nombre_columna2 tipo2 [NOT NULL| NULL]} …]}

Con esta instrucción especificamos el nombre de la tabla, las columnas de las que se
compone, el tipo de datos o dominio al que pertenece y si admite o no valores nulos.

Cuando se crea un objeto en una base de datos es opcional especificar el esquema al


que pertenece. Si no especificamos el esquema SQL Server asignará el esquema por
defecto llamado dbo. El esquema dbo pertenece a la cuenta de usuario dbo. Por
defecto, los usuarios que se crean con el comando CREATE USER utilizan dbo como
esquema predeterminado.

El nombre de un objeto de la base de datos puede contener cuatro partes de la


siguiente forma:

21
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

nombre_servidor.nombre_basedatos.nombre_esquema.nombre_obje
to

nombre_objeto es el nombre del objeto, nombre_esquema es el nombre del


esquema al que pertenece el objeto. nombre_servidor y nombre_basedatos
son los nombres del servidor y la base de datos a los que pertenece el objeto de la
base de datos. El nombre de la tabla combinado con el nombre del esquema debe ser
único en la base de datos.

No es obligatorio especificar las cuatro partes al referirnos a un objeto. Como mínimo


usaremos nombre_objeto o usaremos nombre_esquema.nombre_objeto
cuando el objeto pertenece a un esquema que no es dbo. Esto se debe a que cuando
se hace referencia a un objeto de la base de datos que sólo contiene el
nombre_objeto, SQL Server buscará en primer lugar en el esquema
predeterminado del usuario. Si no encuentra el objeto entonces buscará en el
esquema dbo y si no lo encuentra dará un error.

Por ejemplo, crearemos nuestra primera tabla con la instrucción a continuación.


Cambie el nombre de la base de datos Madrid por el nombre de la base de datos
asignada al alumno y ejecute el comando siguiente en Management Studio:

USE Madrid

CREATE TABLE [Link]


(
CodigoAsignatura char(5) NOT NULL,
Nombre varchar(100) NOT NULL,
NumCreditos INT NOT NULL
)

Esta instrucción crea la tabla Asignatura en el esquema universidad. Si eliminó el


esquema universidad anteriormente vuelva a crearlo de nuevo. Podemos ver el
resultado de nuestro comando SQL en el explorador de objetos en la carpeta Tables.
Refresque el contenido de la carpeta si no puede ver su nueva tabla:

22
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Cuando especificamos una columna en una instrucción CREATE TABLE es necesario


proporcionar el nombre de la columna y el tipo de datos o dominio al que pertenece.
El tipo de dato limita los valores que pueden introducirse en esa columna. Por ejemplo,
algunos tipos de datos limitan los valores de la columna a datos numéricos o a cadenas
de caracteres. Veamos los tipos de datos más comunes en SQL Server:

a) Tipos de datos numéricos

Se usan para representar números. Todos los tipos de datos numéricos tienen
una precisión y algunos tienen escala. La precisión es el número de dígitos que
se puede almacenar y la escala es el número de dígitos de la parte fraccional del
número, es decir, los dígitos a la derecha de la parte decimal. Disponemos de
los siguientes tipos:

a. Numéricos exactos, los valores permitidos tienen precisión y escala. Nos


encontramos con los siguientes:
o INTEGER, números enteros (escala 0) almacenados en 4 bytes.
Rango de valores es desde -2,147,483,648 hasta 2,147,483,647.
o SMALLINT, números enteros almacenados en 2 bytes. Rango de
valores desde -32768 hasta 32767.

23
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

o TINYINT, números no negativos almacenados en 1 byte. El rango


de valores es de 0 a 255.
o BIGINT, números enteros almacenados en 8 bytes. El rango de
valores es desde -263 hasta 263-1.
o DECIMAL(p,[s]) o NUMERIC(p,[s]), valor numérico con una
precisión y escala. El argumento p especifica el número total de
dígitos (incluyendo los decimales) y s el número de decimales.
o MONEY, se usa para representar valores monetarios. Se
almacena en 8 bytes y se almacenan 4 dígitos decimales.
o SMALLMONEY, como MONEY pero se almacena en 4 bytes.
o BIT, tipo de dato entero que admite los valores 1, 0 o NULL.
b. Numéricos aproximados, los valores permitidos tienen precisión, pero
no escala. En este tipo de números el punto decimal se puede localizar
en cualquier lugar dentro del número y por eso se dice que no tienen
escala. Nos encontramos con los siguientes:
o REAL, se usa para números de coma flotante.
o FLOAT[(n)], representa números de coma flotante como el tipo
de datos REAL pero en este caso se puede especificar n, donde n
es el número de bits que se usan para almacenar la mantisa. Por
ejemplo, el número 345670 se expresa en coma flotante
mediante el número 0.34567x106, donde 34567 es la mantisa y 6
es el exponente.
b) Tipos de datos de fecha y hora

Se utilizan para representar fechas y horas. Disponemos de los siguientes tipos:

o DATETIME, representa una fecha y una hora del día con fracciones
de segundos basada en un reloj de 24 horas. El rango de valores es
desde 01/01/1753 hasta 31/12/9999.
o SMALLDATETIME, representa una fecha y una hora del día. La hora
está en un formato de día de 24 horas, con segundos siempre a cero
(: 00) y sin fracciones de segundo. El rango de valores es desde
01/01/1900 hasta 06/06/2079.
o DATE, representa una fecha.
o TIME, representa una hora de un día. La hora no distingue la zona
horaria y está basada en un reloj de 24 horas.
o DATETIME2, una extensión del tipo DATETIME que tiene un rango de
fechas mayor.

24
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

o DATETIMEOFFSET, representa una fecha y una hora del día con


reconocimiento de zona horaria y basado en un reloj de 24 horas.

Los valores de fecha en T-SQL se especifican por defecto en SQL Server


mediante una cadena de caracteres con el formato ‘mmm dd yyyy’ (por
ejemplo, ‘Jan 23 2017’). También es posible especificar una fecha con valores
numéricos para los meses y separados por / (barra inclinada) o – (guión). La
forma en la que SQL Server interpreta el formato de una fecha se puede
cambiar mediante la instrucción SET DATEFORMAT formato. Donde formato
puede ser cualquier combinación del tipo mdy, ydm, dmy, etc. Por ejemplo, si
quisiéramos especificar si quisiéramos especificar un formato de día més y año:

SET DATEFORMAT dmy

Una vez establecido el formato podríamos especificar fechas como


’11/10/2017’ y el sistema las interpretaría como el 11 de octubre de 2017 en
vez del 10 de noviembre de 2017. En cualquier caso si especificamos los
nombres de los meses por sus tres primeras letras en inglés (Jan, Feb, Mar, Apr,
May, Jun, Jul, Aug, Sep, Oct, Nov, Dec) el sistema siempre interpretará este tipo
de valor correctamente.

c) Tipos de datos de caracteres

Estos tipos de datos permiten especificar cadenas de caracteres. Encontramos


los siguientes tipos:

o CHAR[(n)], almacena cadenas de longitud fija, donde n es el número


de caracteres de la cadena. Se utiliza cuando los tamaños de los
valores de datos en la columna sean consistentes.
o VARCHAR[(n)], almacena cadenas de longitud variable. Se utiliza
cuando los tamaños de los valores de datos en la columna varían de
forma considerable.
o NCHAR[(n)], almacena cadenas de longitud fija de caracteres
Unicode. Este tipo de datos es útil para representar datos en varios
idiomas.
o NVARCHAR[(n)], almacena cadenas de longitud variable de
caracteres Unicode. Este tipo de datos es útil para representar datos
en varios idiomas.

Otra característica valiosa de SQL es que permite especificar un valor por defecto para
una columna. El valor por defecto se asignará a la columna en caso de que no se haya
25
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

asignado un valor para la inserción. El valor por defecto se especifica al crear la tabla.
La sintaxis para definir un valor por defecto en una columna es la siguiente:

Nombre_columna tipo_datos DEFAULT valor_pordefecto

Después de la palabra clave DEFAULT se especificará el valor por defecto. Este valor
puede ser un literal o una función que nos devuelva un valor.

Por ejemplo, crearemos la siguiente tabla:

USE Madrid

CREATE TABLE [Link](


DNIProfesor CHAR(9) NOT NULL,
CodigoAsignatura CHAR(5) NOT NULL,
Rol VARCHAR(100) NOT NULL DEFAULT 'Profesor titular'
)

En esta tabla se insertará el valor por defecto “Profesor titular” cuando no se


especifique un valor para esta columna.

Para modificar la definición de una tabla podemos usar el comando ALTER TABLE. Esta
instrucción permite añadir, modificar o borrar columnas. A continuación, se muestra la
sintaxis reducida de este comando:

ALTER TABLE nombre_tabla


ADD nombre_columna <definición de columna>
| ADD CONSTRAINT nombre_restriccion
DEFAULT valor_pordefecto FOR nombre_columna
| DROP COLUMN nombre_columna

Por ejemplo, podríamos añadir la columna FechaComienzo a la tabla anterior con el


siguiente comando:

ALTER TABLE [Link]


ADD FechaComienzo DATE NOT NULL

También podríamos añadir un valor por defecto a la columna anterior:

ALTER TABLE [Link]


ADD CONSTRAINT def_fechacomienzo
DEFAULT '1Jan2017' FOR FechaComienzo

26
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Si queremos borrar la columna que hemos añadido podríamos hacerlo de la siguiente


manera:

ALTER TABLE [Link]


DROP COLUMN FechaComienzo

El proceso de eliminación de una tabla y sus datos almacenados es muy sencillo. La


sintaxis es la siguiente:

DROP TABLE nombre_tabla

Por ejemplo, si quisiéramos borrar la tabla anterior utilizaríamos el siguiente comando:

DROP TABLE [Link]

Implementación de la integridad de datos


El cometido de una base de datos no es sólo almacenar datos, también debe
asegurarse que los datos sean correctos. Con motivo de asegurar la integridad de los
datos, el lenguaje SQL proporciona una serie de restricciones de integridad. Las
restricciones de integridad son reglas que se aplican a la base de datos para restringir
los valores que se pueden almacenar. Esto aumentará la fiabilidad de los datos y
reducirá el coste de mantenimiento de las aplicaciones.

Usar el SGBDR para definir las restricciones de integridad aumenta la fiabilidad de los
datos porque no se requiere que las aplicaciones las implementen. Si una restricción
de integridad se implementa en un programa de aplicación, entonces todos los
programas que acceden a la base de datos deberían implementarla. Si el código para
implementar la restricción se omite en uno de los programas, provocará que la
integridad de los datos peligre. Una restricción de integridad que no se maneje en el
SGBDR se tiene que definir en cada aplicación que use los datos relacionados con la
restricción. Sin embargo, si una restricción de integridad se implementa en el SGBDR,
la modificación de la restricción se implementa una sola vez, en vez de en cada
programa que la implemente.

Las restricciones se pueden aplicar a una tabla o a columnas individuales y se


implementan mediante las instrucciones CREATE TABLE y ALTER TABLE. Las
restricciones a nivel de columna, junto con el tipo de datos y otras propiedades, se
sitúan en la declaración de la columna. Mientras que las restricciones a nivel de tabla
se sitúan al final de una instrucción CREATE TABLE o ALTER TABLE después de la
definición de las columnas.

27
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Cada restricción de integridad tiene un nombre. El nombre de la restricción se puede


asignar explícitamente usando la palabra clave CONSTRAINT dentro de CREATE TABLE
o ALTER TABLE. Si se omite la palabra clave CONSTRAINT, el motor de la base de datos
asignará un nombre implícito a la restricción. A continuación, veremos las restricciones
de integridad en más detalle.

UNIQUE

Existen dos tipos de restricciones únicas: UNIQUE y PRIMARY KEY. UNIQUE


implementa el concepto de clave candidata y PRIMARY KEY el concepto de clave
principal. La restricción UNIQUE permite exigir que una o varias columnas contengan
valores únicos. La sintaxis es la siguiente:

[CONSTRAINT nombre_restriccion]
UNIQUE ({columna1}, …)

nombre_restriccion es el nombre de la restricción.

columna1 es el nombre de la columna que forma la clave candidata.

El máximo número de columnas en una restricción UNIQUE es 16. Veamos el siguiente


ejemplo:

USE Madrid

CREATE TABLE [Link](


DNI CHAR(9) NOT NULL,
NumSeguridadSocial CHAR(12) NOT NULL,
Nombre VARCHAR(200) NOT NULL,
Direccion VARCHAR(200) NOT NULL
CONSTRAINT ClaveCandidata_Num UNIQUE (NumSeguridadSocial))

Esta restricción UNIQUE nos asegurará que los valores de NumSeguridadSocial sean
únicos.

Las columna de una restricción UNIQUE pueden ser NULL, pero sólo podrá haber un
único valor NULL para esa columna.

PRIMARY KEY

La clave principal de una tabla está formada por una o varias columnas cuyo valor es
diferente para cada fila. La clave principal se define usando PRIMARY KEY en la
instrucción CREATE TABLE o ALTER TABLE. Tiene la siguiente sintaxis:

28
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

[CONSTRAINT nombre_restriccion]
PRIMARY KEY ({columna1}, …)

Al contrario que la restricción UNIQUE, las columnas de la restricción PRIMARY KEY no


admiten nulos. Veamos el siguiente ejemplo utilizando la instrucción ALTER TABLE:

USE Madrid

ALTER TABLE [Link]


ADD CONSTRAINT ClavePrincipal_Profesor PRIMARY KEY (DNI)

En este ejemplo hemos añadido una clave principal a la tabla [Link]


mediante la restricción PRIMARY KEY.

Veamos cómo se utiliza PRIMARY KEY al crear una tabla:

USE Madrid

CREATE TABLE [Link](


DNI CHAR(9) NOT NULL,
Nombre VARCHAR(200) NOT NULL,
Direccion VARCHAR(200) NOT NULL,
FechaNacimiento DATE NOT NULL
CONSTRAINT ClavePrincipal_Alumno PRIMARY KEY (DNI))

En este ejemplo se especifica la restricción PRIMARY KEY a nivel de tabla. Las


restricciones a nivel de tabla se especifican después de las columnas. También es
posible especificar una restricción PRIMARY KEY a nivel de columna. Veamos el
ejemplo siguiente donde eliminamos la tabla anterior y la volvemos a crear con la
restricción PRIMARY KEY a nivel de columna:

USE Madrid

DROP TABLE [Link]

CREATE TABLE [Link](


DNI CHAR(9) NOT NULL CONSTRAINT ClavePrincipal_Alumno
PRIMARY KEY,
Nombre VARCHAR(200) NOT NULL,
Direccion VARCHAR(200) NOT NULL,
FechaNacimiento DATE NOT NULL)

29
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Podemos encontrar las restricciones UNIQUE y PRIMARY KEY en el explorador de


objetos dentro de la carpeta Tables -> Keys.

CHECK

Una restricción CHECK permite especificar qué valores se pueden incluir en una
columna. Cada vez que se inserta o se modifica una fila se tendrá que cumplir la
condición definida en la restricción CHECK. Esta restricción se especifica en las
instrucciones CREATE TABLE o ALTER TABLE. Su sintaxis es la siguiente:

[CONSTRAINT nombre_restriccion]
CHECK expression

El siguiente ejemplo utiliza la restricción CHECK. Borre la tabla [Link] con


el comando DROP TABLE si no la borró con anterioridad:

USE Madrid

CREATE TABLE [Link](


DNIProfesor CHAR(9) NOT NULL,
CodigoAsignatura CHAR(5) NOT NULL,
Rol VARCHAR(100) NOT NULL CHECK (Rol in ('Profesor
titular', 'Profesor asociado', 'Profesor de prácticas'))
)

Con esta restricción nos aseguraremos de que la columna Rol sólo pueda contener los
valores especificados en la restricción CHECK.

FOREIGN KEY

La restricción FOREIGN KEY implementa el concepto de clave externa que vimos en el


modelo relacional. Una clave externa está formada por una o varias columnas de una
tabla donde estas, contienen valores de la clave principal de otra tabla o de la misma
tabla (en el caso de las relaciones recursivas). Cada clave externa se define usando la
restricción FOREIGN KEY en combinación con la palabra clave REFERENCES. Su sintaxis
es la siguiente:

[CONSTRAINT nombre_restriccion]
[FOREIGN KEY ({columna1}, …)]
REFERENCES nombre_tabla ({columna2}, …)]

A continuación de la palabra clave FOREIGN KEY se definen todas las columnas que
pertenecen a la clave externa. Después de la palaba clave REFERENCES se especifica el

30
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

nombre de la tabla y las columnas de su correspondiente clave principal. El número y


los tipos de datos de las columnas en la parte FOREIGN KEY tienen que coincidir con el
número y los tipos de datos de las columnas en la parte REFERENCES. Veamos el
siguiente ejemplo:

ALTER TABLE [Link]


ADD CONSTRAINT fk_Imparte_Profesor
FOREIGN KEY (DNIProfesor)
REFERENCES [Link] (DNI)

Mediante esta restricción FOREIGN KEY definimos que los valores de la columna
DNIProfesor en la tabla [Link] tienen que existir en la columna DNI de la
tabla Profesor. Nótese que para que esta instrucción funcione tiene que existir una
restricción UNIQUE o PRIMARY KEY en la columna DNI de la tabla Profesor.

También podemos crear una restricción a nivel de tabla FOREIGN KEY de la siguiente
manera:

USE Madrid

DROP TABLE [Link]

CREATE TABLE [Link](


DNIProfesor CHAR(9) NOT NULL,
CodigoAsignatura CHAR(5) NOT NULL,
Rol VARCHAR(100) NOT NULL CHECK (Rol in ('Profesor
titular', 'Profesor asociado', 'Profesor de prácticas')),
CONSTRAINT pk_Imparte PRIMARY KEY
(DNIProfesor,CodigoAsignatura),
CONSTRAINT fk_Imparte_Profesor FOREIGN KEY (DNIProfesor)
REFERENCES [Link] (DNI)
)

Eliminación de restricciones

Hemos visto como añadir restricciones a lo largo de esta sección. También podremos
eliminarlas utilizando la instrucción ALTER TABLE. Usaremos la siguiente sintaxis:

ALTER TABLE nombre_tabla


DROP CONSTRAINT nombre_restriccion

Por ejemplo, podríamos eliminar la clave externa que añadimos en la sección anterior
mediante el siguiente comando:
31
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

ALTER TABLE [Link]


DROP CONSTRAINT fk_Imparte_Profesor

Lenguaje de manipulación de datos (DML)

Una de las funciones principales de una base de datos es la capacidad de manejar los
datos que se almacenan dentro de sus tablas. Los usuarios deben ser capaces de
insertar, actualizar y borrar datos según sea necesario. El lenguaje SQL proporciona
tres instrucciones para el manejo de datos: INSERT, UPDATE y DELETE.

Insertar datos
La instrucción INSERT permite agregar datos a las diferentes tablas de una base de
datos. La sintaxis básica es la siguiente:

INSERT INTO nombre_tabla [(nombre_columna1, …)]


VALUES (Valor1,…)

También se pueden insertar valores en una tabla mediante una consulta SELECT (que
veremos en la siguiente sección). Para insertar datos en una tabla mediante una
consulta SELECT usaremos la sintaxis siguiente:

INSERT INTO nombre_tabla [(nombre_columna1, …)]


consulta_select

Si usamos la sintaxis básica se insertará una sola fila en la tabla. La segunda forma
inserta el resultado de una consulta SELECT y podrá contener más de una fila.

Con ambas formas, cada valor insertado tiene que ser de un tipo de dato compatible
con el tipo de datos de la columna correspondiente en la tabla. En ambas formas se
puede omitir la lista de columnas, en cuyo caso será necesario especificar valores para
todas las columnas de la tabla en el orden en que se crearon en la tabla. La mayoría de
los desarrolladores SQL prefieren especificar el listado de columnas dentro de la
cláusula INSERT, esto facilita la lectura del código y su mantenimiento.

Se debe especificar un valor para cada columna de la tabla excepto para las columnas
que admiten valores nulos o que cuentan con una restricción DEFAULT. Se podrá
utilizar el valor NULL para insertar un valor nulo en las columnas en las que esto sea
posible.

Por ejemplo, creemos la siguiente tabla:

32
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

USE Madrid
CREATE TABLE Empleado(
NumEmpleado SMALLINT NOT NULL,
Nombre VARCHAR(100) NOT NULL,
Apellidos VARCHAR(200) NOT NULL,
FechaNacimiento DATE NOT NULL,
LugarNacimiento VARCHAR(100) NOT NULL,
RestriccionAlimentaria VARCHAR(200) NULL,
CONSTRAINT pk_Empleado PRIMARY KEY (NumEmpleado)
)

Nótese que al no especificar un esquema concreto al crear la tabla, ésta se creará en el


esquema por defecto dbo.

A continuación, insertaremos datos en la tabla Empleado:

INSERT INTO Empleado (NumEmpleado, Nombre, Apellidos,


FechaNacimiento, LugarNacimiento, RestriccionAlimentaria)
VALUES (1, 'Felipe', 'García Morales', '13Feb1979',
'Madrid', NULL)

Nótese que hemos especificado el valor NULL para el campo RestriccionAlimentaria ya


que no se dispone de un valor para esta columna en este caso.

Puede consultar los datos de una tabla utilizando la siguiente instrucción:

SELECT * FROM Empleado

La instrucción SELECT la veremos en profundidad más adelante.

Insertemos unos cuantos registros más:

USE Madrid
INSERT INTO Empleado (NumEmpleado, Nombre, Apellidos,
FechaNacimiento, LugarNacimiento, RestriccionAlimentaria)
VALUES (2,'Consuelo','Pérez López','23Mar1983','Sevilla',
'Comida vegetariana')
INSERT INTO Empleado
(NumEmpleado,Nombre,Apellidos,FechaNacimiento,LugarNacimien
to,RestriccionAlimentaria)
VALUES (3, 'Alfonso', 'Castro Jiménez', '7Jun1963',
'Palencia', NULL)

33
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

INSERT INTO Empleado


(NumEmpleado,Nombre,Apellidos,FechaNacimiento,LugarNacimien
to,RestriccionAlimentaria)
VALUES (4,'Candela','Montes Serrano', '13Dec1977', 'Cádiz',
NULL)

Veamos también cómo insertar un registro en la tabla Empleado sin especificar la lista
de columnas:

INSERT INTO Empleado


VALUES (5,'Sonia','Torres Santos', '21Dec1980', 'Soria',
'Alergia a los frutos secos')

Al no haber especificado la lista de columnas en esta instrucción será necesario


proporcionar un valor para cada una de las columnas de la tabla Empleado en el orden
correspondiente.

A continuación, intentemos insertar el registro siguiente:

INSERT INTO Empleado


(NumEmpleado,Nombre,Apellidos,FechaNacimiento,LugarNacimien
to,RestriccionAlimentaria)
VALUES (2,'Mar','Hernández
Romero','21Jul1976','Madrid',NULL)

Al intentar insertar el registro anterior recibimos un error sobre la violación de la


restricción de clave primaria debido a que ya tenemos un empleado en la tabla con
número de empleado 2.

Modificar datos
La instrucción UPDATE se utiliza para modificar los datos de una base de datos. Con
esta instrucción se pueden modificar datos de una o más columnas que afectarán una
o más filas. Su sintaxis básica es la siguiente:

UPDATE nombre_tabla
SET columna1 = {expresión | DEFAULT | NULL} [,…n]
[WHERE condición]

En esta instrucción las cláusulas UPDATE y SET son obligatorias mientras que la
cláusula WHERE es opcional. En la cláusula UPDATE se especifica el nombre de la tabla
que va a ser actualizada. En la cláusula SET se asigna una constante o una expresión a
un conjunto de columnas. En la cláusula WHERE se especifica una condición de

34
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

búsqueda que restringe el número de filas que se actualizarán con la instrucción


UPDATE. Si se omite la cláusula WHERE se actualizarán todas las filas de la tabla.

Veamos el siguiente ejemplo:

UPDATE Empleado
SET RestriccionAlimentaria = 'Comida vegetariana'

La instrucción anterior asigna el valor 'Comida vegetariana' a todas las filas de la tabla
Empleado. El resultado de la actualización puede verse ejecutando una consulta:

SELECT * FROM Empleado

Si queremos asignar el valor 'Comida vegana' al empleado número 2 utilizaremos la


siguiente consulta:

UPDATE Empleado
SET RestriccionAlimentaria = 'Comida vegana'
WHERE NumEmpleado = 2

Si queremos asignar el valor 'Alergia a los lácteos' a la columna RestricciónAlimentaria


y la fecha 1 enero de 1999 a la columna FechaNacimiento para todos los empleados
nacidos en Sevilla escribiríamos la siguiente instrucción:

UPDATE Empleado
SET RestriccionAlimentaria = 'Alergia a los lácteos',
FechaNacimiento = '1Jan1999'
WHERE LugarNacimiento = 'Sevilla'

Borrar datos
La instrucción DELETE se utiliza para borrar datos de una tabla. La sintaxis básica es la
siguiente:

DELETE FROM nombre_tabla


WHERE condición

Con esta instrucción se borrarán todas las filas que cumplan la condición especificada
en la cláusula WHERE. Por ejemplo, veamos como borrar los empleados que han
nacido en Madrid:

DELETE FROM Empleado


WHERE LugarNacimiento = 'Madrid'

35
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Si se omite la cláusula WHERE se borrarán todos los registros de la tabla especificada.

Consultas
Ya hemos visto como crear tablas y poblarlas de datos. Ahora veremos cómo recuperar
información específica de la base de datos. La instrucción SELECT permite formar
consultas que devuelven los datos que se desean recuperar. Es una de las instrucciones
más comunes que utilizan los desarrolladores de SQL. La sintaxis básica de la
instrucción SELECT puede dividirse en varias cláusulas específicas que ayudan a refinar
la consulta para que devuelva los datos requeridos.

La sintaxis de la instrucción SELECT es la siguiente:

SELECT [DISTINCT | ALL] lista_select


[INTO nueva_tabla]
FROM tabla
[WHERE condicion_busqueda]
[GROUP BY expression_groupby]
[HAVING condicion_busqueda]
[ORDER BY expression_orden [ASC | DESC] ]

Las únicas cláusulas requeridas son las cláusulas SELECT y FROM. Las demás cláusulas
son opcionales. Las cláusulas FROM, WHERE, GROUP BY y HAVING actúan como
expresiones de tabla en una consulta, es decir, se evalúan y el resultado es una tabla
virtual que se utiliza en la evaluación siguiente. De esta forma, el resultado de la
primera cláusula evaluada se utiliza en la cláusula siguiente y así sucesivamente. Las
cláusulas de la instrucción SELECT se evalúan en el orden siguiente:

I. Cláusula FROM
II. Cláusula WHERE
III. Cláusula GROUP BY
IV. Cláusula HAVING
V. Cláusula SELECT
VI. Cláusula ORDER BY

Se recomienda que los ejemplos que se muestran en esta sección se ejecuten en la


base de datos de ejemplo pubs que existe en el servidor SQL del máster. Esto permitirá
al alumno ver los resultados de cada consulta.

Por ejemplo, realizaremos una consulta sencilla para seleccionar todos los registros de
la tabla authors en la base de datos pubs:

36
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

USE pubs
SELECT * FROM authors

El símbolo asterisco equivale a la lista de todas las columnas de la tabla authors. Esta
consulta es equivalente a especificar todas las columnas de la tabla:

SELECT au_id, au_lname, au_fname, phone, address, city,


state, zip, contract
FROM authors

A continuación, exploraremos cada una de las cláusulas de la instrucción SELECT.

SELECT y FROM

La cláusula SELECT incluye las palabras clave DISTINCT y ALL. DISTINCT se utiliza para
eliminar filas duplicadas de los resultados de una consulta. ALL se utiliza para devolver
todas las filas de una consulta. Si no se especifica ninguna de las dos se toma por
defecto la palabra clave ALL.

Por ejemplo, si queremos seleccionar las ciudades donde residen los autores de la
tabla authors, escribiremos la siguiente consulta:

USE pubs
SELECT city
FROM authors

Esta consulta nos devuelve un listado de todas las ciudades de la tabla authors. Si
observa los resultados notará que varias ciudades se encuentran repetidas. Para
obtener un listado de ciudades distintas ejecutaremos la siguiente consulta:

USE pubs
SELECT DISTINCT city
FROM authors

La lista de columnas de la cláusula SELECT puede contener los siguientes elementos:

o El símbolo asterisco (*), que significa que queremos seleccionar todas las
columnas de una tabla.
o Una lista de columnas.
o Nombre_columna AS nombre, donde nombre es un alias de Nombre_columna y
reemplaza al nombre de la columna en el resultado de la consulta.
o Una expresión.

37
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

o Una función de agregación: MIN, MAX, AVG, COUNT, SUM.

Por ejemplo, considere la consulta siguiente:

USE pubs
SELECT AVG(discount) AS DescuentoMedio
FROM discounts

En el resultado de la consulta aparecerá el nombre DescuentoMedio como nombre de


la columna en vez de AVG(discount). AVG es una función de agregación que calcula la
media de los valores.

WHERE

La cláusula WHERE toma el resultado devuelto por la cláusula FROM (en una tabla
virtual) y aplica la condición de búsqueda que se define esta cláusula. La cláusula
WHERE actúa como un filtro sobre los resultados devueltos por FROM. Cada fila se
evaluará contra las condiciones especificadas en la cláusula WHERE y se devolverán las
filas que se evalúan como verdaderas. Las que se evalúan como falsas no se incluirán
en los resultados.

Operadores de comparación

En la cláusula WHERE podemos encontrar los siguientes operadores de comparación:

o =, igual
o <> o !=, distinto
o <, menor que
o >, mayor que
o <=, igual o menor que
o >=, igual o mayor que
o !>, no mayor que
o !<, no menor que

El siguiente ejemplo muestra una consulta que utiliza un operador de comparación:

USE pubs
SELECT *
FROM sales
WHERE qty >= 30

En esta consulta seleccionamos las ventas realizadas por una cantidad mayor o igual a
30.
38
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Operadores lógicos

En la cláusula WHERE también podemos encontrar operadores lógicos como AND, OR y


NOT. Si dos condiciones están conectadas por el operador AND, la consulta sólo
devuelve resultados cuando las dos condiciones se satisfacen. Si dos condiciones están
conectadas mediante el operador OR, la consulta devolverá las filas que satisfagan la
primera o segunda condición (o las dos). El operador NOT cambia el valor lógico de una
condición. La negación del valor VERDADERO es FALSO y viceversa. La negación de un
valor NULL es también NULL.

Veamos unas consultas que utilicen estos operadores:

USE pubs
SELECT *
FROM titles
WHERE type = 'popular_comp' AND pubdate >= '1Jan2000'

En esta consulta se seleccionan todas las obras que sean del tipo 'popular_comp' y
cuya fecha de publicación sea mayor o igual que el 1 de enero del año 2000.

USE pubs
SELECT *
FROM titles
WHERE price < 10 OR type <> 'business'

En esta consulta seleccionaremos todas las obras cuyo precio sea inferior a 10 o cuyo
tipo sea distinto de ‘business’.

Veamos otro ejemplo:

USE pubs
SELECT *
FROM titles
WHERE NOT type = 'psychology'

En esta consulta seleccionamos todas las obras que no son de psicología.

Operadores IN y BETWEEN

El operador IN permite especificar dos o más expresiones en una búsqueda. El


resultado de la condición devuelve el valor VERDADERO si el valor de la columna es
igual a una de las expresiones especificadas por el predicado IN. Por ejemplo, veamos
la siguiente consulta:

39
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

USE pubs
SELECT *
FROM titles
WHERE type IN ('mod_cook','trad_cook')

En esta consulta seleccionamos todas las obras que son de tipo 'mod_cook' o
'trad_cook'. El operador IN equivale a una serie de condiciones conectadas por uno o
más operadores OR. El operador IN se puede utilizar en combinación con el operador
NOT. Veamos un ejemplo:

USE pubs
SELECT *
FROM titles
WHERE type NOT IN ('business','psichology','popular_comp')

En esta consulta seleccionaremos todas las obras que no sean de los tipos 'business',
'psichology' o 'popular_comp'.

Al contrario del operador IN que especifica cada valor individual, el operador BETWEEN
especifica un rango de valores. Veamos el siguiente ejemplo:

USE pubs
SELECT *
FROM sales
WHERE qty BETWEEN 20 AND 40

En esta consulta seleccionaremos todas las ventas realizadas por una cantidad entre 20
y 40 inclusive.

Valores NULL

La palabra clave NULL en una instrucción CREATE TABLE especifica que se permite
como valor en una columna un valor especial llamado NULL. Este valor NULL se utiliza
para representar que se desconoce el valor o que no es aplicable. Los valores NULL son
muy distintos de los otros valores de la base de datos. La cláusula WHERE de una
instrucción SELECT generalmente devuelve las filas que son VERDADERAS para la
condición especificada. Nos podemos preguntar entonces cómo se evaluará una
comparación cuando se encuentra con un valor NULL; todas las comparaciones con
valores NULL se evaluarán como FALSAS.

Para poder seleccionar filas que contengan valores NULL debemos utilizar el operador
IS NULL. Veamos un ejemplo:

40
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

USE pubs
SELECT *
FROM titles
WHERE price IS NULL

Esta consulta seleccionará todas las obras que no tienen asignado un precio.

Para seleccionar todas las obras que sí tienen asignado un precio usaríamos la
siguiente consulta:

USE pubs
SELECT *
FROM titles
WHERE price IS NOT NULL

Operador LIKE

El operador LIKE se usa para implementar una búsqueda por patrones, es decir,
compara el valor de una columna con un patrón. El tipo de datos de la columna puede
ser alfanumérico o una fecha. La sintaxis general es la siguiente:

Columna [NOT] LIKE ‘patrón’

El patrón tiene que ser una constante o expresión alfanumérica o de fecha y tiene que
ser compatible con el tipo de datos de la columna correspondiente. La comparación
entre el valor de una columna y el patrón se evalúa como VERDADERA si el valor
coincide con la expresión del patrón.

Algunos caracteres tienen un significado específico en un patrón:

o % (porcentaje), especifica cualquier secuencia de cero o más caracteres


o _ (guión bajo), especifica un solo carácter.
o [] (corchetes), delimita un rango o lista de caracteres.
o ^, especifica la negación de un rango o lista de caracteres.

Veamos un ejemplo:

USE pubs
SELECT *
FROM titles
WHERE title_id LIKE 'BU%'

Esta consulta selecciona todas las obras cuyo title_id empiece por los caracteres ‘BU’ y
después contenga una cadena de caracteres de longitud variable.

41
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Veamos otro ejemplo:

USE pubs
SELECT *
FROM titles
WHERE title_id LIKE '_[S-V]%'

En esta consulta seleccionaremos las obras cuyo title_id empiece por un carácter,
después tenga otro carácter entre S y V y finalmente una secuencia de caracteres.

Cláusula GROUP BY

La cláusula GROUP BY define una o más columnas como un grupo, de forma que todas
las filas de cualesquiera de los grupos tienen los mismos valores para todas las
columnas. Veamos un ejemplo sencillo:

USE pubs
SELECT type
FROM titles
GROUP BY type

En esta consulta se quiere agrupar las filas de la tabla titles en base a la columna type.
La consulta devuelve todos los posibles grupos basados en los valores de la columna
type.

Una tabla se puede agrupar por cualquier combinación de columnas:

USE pubs
SELECT type, pub_id
FROM titles
GROUP BY type, pub_id

En esta columna se forman los grupos en base a las distintas combinaciones que
existen en las columnas type y pub_id.

En una consulta GROUP BY es de gran utilidad añadir funciones de agregación para


obtener valores de resumen. Las funciones de agregación se pueden usar también
cuando la consulta no dispone de una cláusula GROUP BY. Encontramos las siguientes
funciones de agregación:

o MIN, calcula el mínimo


o MAX, calcula el máximo
o SUM, calcula la suma
o AVG, calcula la media
42
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

o COUNT, cuenta el número de filas

Veamos unos ejemplos:

USE pubs
SELECT type,
MIN(price) AS PrecioMinimo,
MAX(price) AS PrecioMaximo,
AVG(price) AS PrecioMedio
FROM titles
GROUP BY type

En esta consulta agrupamos las obras existentes en la tabla titles por la columna type y
calculamos el precio mínimo, máximo y medio para cada tipo.

Veamos otro ejemplo:

SELECT state,
COUNT(*) AS NumeroTiendas
FROM stores
GROUP BY state

Esta consulta nos devuelve el número de tiendas que hay por estado.

SELECT type,
SUM(advance) AS AdelantoTotal
FROM titles
GROUP BY type

En esta consulta obtenemos la suma de los adelantos por cada tipo de obra.

Cláusula HAVING

La cláusula HAVING es similar a la cláusula WHERE en cuanto a que define una


condición de búsqueda. Sin embargo, la cláusula HAVING se utiliza para referirse a
grupos y no a filas individuales. La cláusula HAVING se suele usar en combinación con
la cláusula GROUP BY, pero también se puede usar sin ella. En ese caso todas las filas
de la tabla pertenecen al mismo grupo. Veamos un ejemplo:

USE pubs
SELECT type,
MIN(price) AS PrecioMinimo,
MAX(price) AS PrecioMaximo,
AVG(price) AS PrecioMedio

43
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

FROM titles
GROUP BY type
HAVING AVG(price) > 15

En esta consulta seleccionamos los tipos de obras que tengan un precio medio mayor
de 15.

Cláusula ORDER BY

La cláusula ORDER BY se utiliza para especificar el orden de las filas resultantes de una
consulta. Esta cláusula tiene la siguiente sintaxis:

ORDER BY { [nombre_columna | numero_columna [ASC | DESC] ]


} , …

nombre_columna especifica la columna en base a la que se ordena el resultado de


la consulta.

numero_columna es una forma alternativa de especificar la columna por el número


ordinal de la posición que ocupa en la lista de columnas de la cláusula SELECT.

ASC indica que se quiere ordenar los datos en sentido ascendente y DESC en sentido
descendente (ASC es el valor por defecto).

Veamos el siguiente ejemplo:

USE pubs
SELECT pub_id, pub_name, city, state
FROM publishers
WHERE country = 'USA'
ORDER BY state DESC, city

Esta consulta ordena los resultados primero por la columna state en orden
descendente y después por la columna city. La siguiente consulta es igual que la
anterior, pero utilizando números para especificar las columnas por las que se quiere
ordenar el resultado de la consulta:

SELECT pub_id, pub_name, city, state


FROM publishers
WHERE country = 'USA'
ORDER BY 4 DESC, 3

44
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Operadores de conjunto

En el lenguaje SQL encontramos los siguientes operadores de conjunto:

o UNION
o INTERSECT
o EXCEPT

El operador UNION implementa la unión de dos conjuntos en uno solo. La unión de dos
tablas genera una nueva tabla que contiene todas las filas que aparecen en una o
ambas tablas. La sintaxis es la siguiente:

select_1 UNION [ALL] select_2 {[UNION [ALL] select3]} …

select_1, select_2, … son consultas SELECT que formarán la unión.

Si se usa la opción ALL se mostrarán todas las filas resultantes, incluyendo duplicados.
La palabra clave ALL tiene el mismo significado con la cláusula UNION que con la
cláusula SELECT. La única diferencia es que no es la opción por defecto para UNION
pero sí lo es para SELECT.

Dos tablas se pueden unir mediante el operador UNION si son compatibles. Esto quiere
decir que las dos listas de columnas tienen que tener el mismo número de elementos y
los tipos de datos tienen que ser compatibles (por ejemplo, INT y SMALLINT son tipos
de datos compatibles). Sólo se puede ordenar el resultado de una UNION si la cláusula
ORDER BY se usa en el último SELECT.

Veamos el ejemplo siguiente:

Use pubs
SELECT city, state, zip
FROM authors
UNION
SELECT city, state, zip
FROM stores
ORDER BY 2

En este ejemplo el resultado se ordena por la columna número 2 (state).

El operador de conjunto INTERSECT realiza una intersección entre conjuntos. La


intersección de dos tablas está formada por las filas que pertenecen a ambas tablas. La
siguiente consulta muestra la intersección de dos columnas entre las tablas authors y
publishers:

45
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

SELECT city, state


FROM authors
INTERSECT
SELECT city, state
FROM publishers
ORDER BY 2

El operador de conjunto EXCEPT realiza una diferencia de conjuntos. La diferencia


entre dos tablas está formada por las filas que pertenecen a la primera tabla, pero no a
la segunda. La siguiente consulta muestra la diferencia entre la tabla authors y
publishers:

SELECT city, state


FROM authors
EXCEPT
SELECT city, state
FROM publishers
ORDER BY 2

Expresiones CASE

Las expresiones CASE se usan para modificar la representación de los datos. Por
ejemplo, el estado de una factura se puede codificar usando los valores 1,2 y 3 (que se
corresponde con Enviada, Pendiente de pago o Cobrada respectivamente). Esta técnica
de programación puede asignar fácilmente los nombres de los estados con los
números 1, 2 y 3.

Hay dos tipos de expresiones CASE:

o Expresión CASE simple


o Expresión CASE de búsqueda

Una expresión CASE simple tiene la siguiente sintaxis:

CASE expresión_1
{WHEN expresión_2 THEN resultado_1} …
[ELSE resultado_n]
END

Una consulta SQL con una expresión CASE simple busca la primera expresión de la lista
de cláusulas WHEN que coincide con expresión_1. Se devolverá la expresión que se
encuentra a la derecha de la cláusula THEN correspondiente. Si no hay ninguna
coincidencia se evalúa la parte ELSE. Ejecute el siguiente ejemplo:
46
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

USE pubs
SELECT pub_id,
pub_name,
city,
state,
CASE state
WHEN 'MA' THEN 'Massachusetts'
WHEN 'DC' THEN 'Washington'
WHEN 'CA' THEN 'California'
WHEN 'TX' THEN 'Texas'
WHEN 'NY' THEN 'New York'
WHEN 'IL' THEN 'Ilinois'
ELSE 'Otro estado'
END AS Estado
FROM publishers

En este ejemplo decodificamos las dos iniciales de cada estado para reemplazarlas por
un nombre completo.

La sintaxis de la expresión CASE de búsqueda es la siguiente:

CASE
{WHEN condición_1 THEN resultado_1} …
[ELSE resultado_n]
END

Este tipo de instrucción CASE busca la primera expresión que se evalúe a VERDADERA.
Si ninguna de las condiciones WHEN se evalúan como VERDADERA, se devuelve el
valor de la parte ELSE. Veamos un ejemplo:

USE pubs
SELECT title_id,
title,
type,
CASE
WHEN price < 5 THEN 'Precio bajo'
WHEN price >= 5 and price < 10 THEN 'Precio
medio'
WHEN price >= 10 THEN 'Precio alto'
ELSE 'Sin determinar'
END AS Precio
FROM titles

47
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

En este ejemplo se clasifican los precios en tres tipos dependiendo del valor del precio.
En caso de que no se cumpla ninguna de las condiciones se asigna el valor ‘Sin
determinar’.

Subconsultas

Hasta ahora hemos visto consultas donde se compara valores de columna con
expresiones o constantes. El lenguaje de consulta SQL también ofrece la habilidad de
comparar valores de columna con el resultado de una consulta SELECT. Esta
construcción, donde una o más consultas SELECT están anidadas en la cláusula WHERE
de otra consulta SELECT, se llama subconsulta. La primera consulta SELECT de una
subconsulta se llama consulta externa y la consulta anidada recibe el nombre de
consulta interna. La consulta interna se evalúa primero y la consulta externa recibe los
valores de la consulta interna.

Existen dos tipos de subconsultas:

o Subconsultas independientes
o Subconsultas correlacionadas

En una subconsulta independiente la consulta interna se evalúa sólo una vez. En una
subconsulta correlacionada su valor depende de una variable de la consulta externa y
debido a esto la consulta interna se evalúa cada vez que el sistema recupera una fila
nueva de la consulta externa.

Una subconsulta independiente se puede usar con los siguientes operadores:

o Operadores de comparación
o Operador IN
o Operador ANY o ALL

Veamos el siguiente ejemplo de una subconsulta con el operador = :

USE pubs
SELECT title_id,
title,
type
FROM titles
WHERE pub_id =
(SELECT pub_id
FROM publishers
WHERE pub_name = 'New Moon Books')

48
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

La consulta interna se evalúa primero y una sola vez y devuelve el identificador de la


editorial que se corresponde con el nombre ‘New Moon Books’. Después de que se
evalúe la consulta interna se puede representar la consulta de esta forma:

USE pubs
SELECT title_id,
title,
type
FROM titles
WHERE pub_id = '0736'

Una subconsulta también puede utilizar otros operadores de comparación. Los


operadores de comparación se pueden utilizar siempre y cuando la consulta interna
devuelva una sola fila. Cuando la consulta interna devuelve más de una fila tendremos
que usar los operadores IN, ANY y ALL.

El operador IN se utiliza en una subconsulta cuando se quiere hacer una comparación


con un conjunto de valores. Veamos el siguiente ejemplo:

USE pubs
SELECT title_id,
title,
type
FROM titles
WHERE pub_id IN
(SELECT pub_id
FROM publishers
WHERE country = 'USA')

Esta consulta recupera todas las obras de editoriales que se encuentran en Estados
Unidos (USA). Primero se evalúa la consulta interna que devuelve un conjunto de
valores, en este caso, todas las editoriales que se encuentran en Estados Unidos. Esta
consulta es equivalente a escribir la consulta de esta manera:

USE pubs
SELECT title_id,
title,
type
FROM titles
WHERE pub_id IN ('0736','0877','1389','1622','1756','9952')

49
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Una subconsulta independiente también puede usar los operadores ANY y ALL aunque
no se recomienda su uso. En su lugar se recomienda que este tipo de subconsultas se
escriban utilizando el operador EXISTS usando una subconsulta correlacionada.

En una subconsulta correlacionada la consulta interna depende de la consulta externa


para todos sus valores. La función EXISTS toma la consulta interna como argumento y
devuelve VERDADERO si la consulta interna devuelve una o más filas, y devuelve FALSO
si no devuelve ninguna fila. Veamos el siguiente ejemplo:

USE pubs
SELECT emp_id,
fname,
lname
FROM employee
WHERE EXISTS (SELECT *
FROM publishers
WHERE employee.pub_id =
publishers.pub_id
AND pub_name= 'New Moon Books')

Esta subconsulta devuelve todos los empleados que trabajan para la editorial New
Moon Books. Veamos cómo funciona esta subconsulta. Primero, la consulta externa
considera la primera fila de la tabla employee (Paolo Accorti). A continuación, la
función EXISTS se evalúa para determinar si hay alguna fila en la tabla publishers que
coincida con la fila actual de la consulta externa y cuyo nombre de editorial sea New
Moon Books. Como Paolo Accorti no trabaja en New Moon Books, el resultado de la
consulta externa es un conjunto vacío y por lo tanto Paolo Accorti no se encontrará
dentro del resultado de la consulta. Todas las filas de la tabla employee se evalúan
utilizando este mismo proceso.

Veamos otro ejemplo:

USE pubs
SELECT emp_id,
fname,
lname
FROM employee
WHERE NOT EXISTS (SELECT *
FROM publishers
WHERE employee.pub_id =
publishers.pub_id
AND country= 'USA')

50
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Esta consulta devuelve todos los empleados que trabajan en editoriales que no están
localizadas en Estados Unidos (USA).

JOIN

La operación JOIN nos permite el acceso a varias tablas a la vez. Esta operación es muy
útil cuando se desea consultar datos relacionados de más de una tabla y recuperarlos
de una forma en que las relaciones entre las tablas sean invisibles en la práctica. La
operación JOIN hace coincidir las filas de una tabla con las filas de otra tabla de forma
que las columnas de ambas tablas se puedan colocar unas al lado de otras en los
resultados de la consulta como si vinieran de una sola tabla.

Existen dos sintaxis distintas para realizar una operación JOIN:

o Sintaxis explícita, de acuerdo al estándar ANSI SQL:1992


o Sintaxis implícita, esta sintaxis se considera anticuada

Se prefiere la utilización de la sintaxis explícita que se introdujo en el estándar SQL92


donde se definen las operaciones JOIN de forma explícita, es decir, se asigna un
nombre a cada tipo de operación JOIN. Encontramos las siguientes palabras clave en
SQL Server que representan los distintos tipos de operaciones JOIN:

o [INNER JOIN]
o CROSS JOIN
o LEFT [OUTER] JOIN
o RIGHT [OUTER] JOIN
o FULL [OUTER] JOIN

Join natural
En las operaciones JOIN naturales se equipara los valores de una o más columnas en la
primera tabla con los valores correspondientes de la segunda tabla. Para realizar una
operación JOIN es necesario especificar las columnas donde se realiza la comparación
de ambas tablas.

Por ejemplo, veamos una consulta donde se realiza un join natural entre dos tablas:

USE pubs
SELECT *
FROM employee e, publishers p
WHERE e.pub_id = p.pub_id

51
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

En esta consulta se utiliza la sintaxis implícita de join. La consulta recupera los datos de
todos los empleados y la editorial correspondiente en la que trabajan. Nótese que se
ha definido un alias para la tabla employee ( e ) y para la tabla publishers ( p ). El alias
se puede utilizar en la consulta para referirse a esa tabla en concreto en vez de escribir
el nombre completo de la tabla. En esta consulta se especifican en la cláusula FROM
las tablas que se van a unir y el tipo de join que se va a utilizar (INNER JOIN). En la
cláusula WHERE se especifica las columnas que se van a utilizar para realizar la
operación join. En esta consulta se devuelven las filas de la tabla employee donde la
columna pub_id coincida con la columna pub_id de la tabla publishers. Esta consulta se
puede reescribir usando la sintaxis explícita de la siguiente forma:

USE pubs
SELECT *
FROM employee e INNER JOIN publishers p
ON e.pub_id = p.pub_id

En esta consulta se utiliza la cláusula ON para especificar la condición en la que se basa


la combinación. La condición puede especificar cualquier predicado, aunque se suelen
utilizar columnas y operadores de comparación.

Veamos otro ejemplo donde realizaremos una operación join entre tres tablas:

USE pubs
SELECT *
FROM employee e INNER JOIN publishers p
ON e.pub_id = p.pub_id
INNER JOIN jobs j
ON j.job_id = e.job_id
WHERE [Link] = 'USA' AND j.job_desc = 'Publisher'

En esta consulta se seleccionan los empleados que trabajan para una editorial en
Estados Unidos (USA) y cuyo trabajo es editor (Publisher).

Producto cartesiano
La cláusula CROSS JOIN se utiliza para realizar un producto cartesiano entre dos tablas.
En un producto cartesiano se combinan todas las filas de la primera tabla con todas las
filas de la segunda tabla. El producto cartesiano entre una tabla de n filas y una tabla
de m filas producirá un resultado que contenga n*m filas. Veamos un ejemplo de un
producto cartesiano entre dos tablas:

USE pubs
SELECT *

52
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

FROM employee CROSS JOIN jobs

Esta consulta devuelve el producto cartesiano entre las tablas employee y jobs.

Outer join
En una operación join natural, el resultado sólo incluye las filas que coinciden entre
dos tablas. A veces es necesario recuperar también las filas que no coinciden (además
de las que coinciden). La operación que devuelve las filas que coinciden y las que no
coinciden de una o ambas tablas se llama outer join.

SQL incluye tres tipos de outer joins:

o LEFT OUTER JOIN, devuelve todas las filas que coinciden y todas las filas que no
coinciden de la tabla izquierda.
o RIGHT OUTER JOIN, devuelve todas las filas que coinciden y todas las filas que
no coinciden de la tabla derecha.
o FULL OUTER JOIN, devuelve todas las filas que coinciden y todas las que no
coinciden de ambas tablas.

La operación outer join utiliza la misma sintaxis que la operación join natural y cambia
únicamente la palabra clave que se utiliza para designar el tipo de join: LEFT OUTER
JOIN, RIGHT OUTER JOIN y FULL OUTER JOIN.

Veamos el siguiente ejemplo:

USE pubs
SELECT *
FROM titles t LEFT OUTER JOIN publishers p
ON t.pub_id = p.pub_id

En esta consulta se combinan las obras (titles) con las editoriales (publishers) a las que
pertenecen. Se devolverán todas las filas que existan en ambas tablas más las que sólo
existan en la tabla titles. Se devolverán todos los registros de la tabla titles
independientemente de que coincidan con algún registro de la tabla publishers. Para
las obras que no tienen asignada una editorial todas las columnas de la tabla publishers
aparecerán con valores NULL. Podemos ver el efecto de esta consulta si la
comparamos con el resultado de realizar un INNER JOIN en vez de un OUTER JOIN:

USE pubs
SELECT *
FROM titles t INNER JOIN publishers p
ON t.pub_id = p.pub_id

53
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Esta consulta devuelve dos filas menos que la consulta anterior ya que no incluye en su
resultado las dos filas de la tabla titles que tienen un valor NULL para la columna
pub_id.

Podemos ver cómo funciona la cláusula RIGHT OUTER JOIN si reescribimos una vez
más la misma consulta para que utilice RIGHT OUTER JOIN en vez de LEFT OUTER JOIN:

USE pubs
SELECT *
FROM publishers p RIGHT OUTER JOIN titles t
ON t.pub_id = p.pub_id

Con esta consulta se obtiene el mismo resultado que con la realizada con LEFT OUTER
JOIN. Esta consulta es equivalente debido a que hemos cambiado el orden de las tablas
a ambos lados de la palabra clave RIGHT OUTER JOIN. Por lo tanto, en esta consulta se
devolverán todas las filas que coinciden entre ambas tablas y además las que no
coinciden de la tabla titles.

Podemos realizar la misma consulta, pero utilizando un FULL OUTER JOIN. En este
caso, el operador join devolverá las filas que coincidan más las filas que no coincidan
de ambas tablas, es decir, todas las obras de la tabla titles y todas las editoriales de la
tabla publishers:

USE pubs
SELECT *
FROM publishers p FULL OUTER JOIN titles t
ON t.pub_id = p.pub_id

Índices
Los sistemas de bases de datos utilizan índices para facilitar el acceso rápido a los
datos. Un índice es un objeto de la base de datos que se utiliza para permitir un acceso
eficiente a los datos es el disco. Los índices optimizan el tiempo de respuesta de las
consultas y son fundamentales para conseguir un funcionamiento eficiente.

Se puede comparar un índice con el índice de un libro. Cuando se busca un tema en un


libro se busca en el índice para encontrar la página donde se ubica. De la misma
manera, cuando se busca una fila en una tabla, el motor de la base de datos utiliza el
índice para encontrar donde se encuentra almacenada físicamente. Los índices se
actualizan continuamente a medida que se insertan, modifican y borran filas en la base
de datos.

54
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Cuando una tabla no cuenta con un índice apropiado, la base de datos utiliza una
operación llamada table scan que consiste en recorrer todas las filas de una tabla. En
una operación table scan cada fila se recupera y examina secuencialmente (desde la
primera a la última) y se devuelve si la condición de búsqueda de la cláusula WHERE se
evalúa como VERDADERA. Por lo tanto, todas las filas se recuperan de acuerdo a su
posición en la memoria física. Este método es menos eficiente que el acceso a través
de un índice.

Los índices se almacenan en estructuras de datos que se llaman páginas de índice


(index pages). Para cada fila que está indexada encontraremos una entrada en las
páginas del índice. Cada entrada está formada por la clave del índice y un puntero. Los
índices de la base de datos se construyen usando una estructura de datos en forma de
árbol B+. Un árbol B+ es una estructura de datos de árbol que representa una colección
de datos ordenados de manera que permite una inserción y borrado eficiente de sus
elementos.

Se prefiere el acceso a tablas con muchas filas a través de índices ya que se usarán
menos operaciones de acceso a disco para encontrar un registro que al usar un acceso
secuencial. Existen dos tipos de índices en SQL Server: clúster y no clúster.

Índices clúster

Los índices clúster determinan el orden físico de los datos en una tabla, es decir, los
datos de una tabla se almacenan en el orden dictado por el índice. La base de datos
permite la creación de un único índice clúster por tabla, ya que las filas de la tabla no
se pueden ordenar físicamente de más de una forma. La característica fundamental de
los índices clúster es que los nodos hoja del índice contienen las páginas de datos.
Todos los demás niveles de la estructura de árbol contienen páginas de índice.

Por defecto se crea un índice clúster en cada tabla cuando se crea una restricción
primary key. Todos los índices clúster son por defecto únicos, es decir, cada valor de
dato aparece una única vez en la columna en la que se ha definido el índice clúster.

55
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Aba

Zur

Aba Har Sas

Har Sas Zur

Filas de Filas de Filas de Filas de Filas de Filas de Filas de Filas de Filas de


datos datos datos datos datos datos datos datos datos

Índices no clúster

Los índices no clúster tienen la misma estructura que un índice clúster, pero con dos
diferencias importantes:

o Los índices no clúster no cambian el orden físico de las filas de una tabla
o Las páginas hoja de un índice no clúster están formadas por el valor de entrada
del índice y un puntero.

Por cada índice no clúster el motor de la base de datos crea una estructura de índice
que se almacena en forma de páginas de índice. El puntero del índice no clúster apunta
a la localización física de la fila especificada en la entrada del índice.

AB109

ZZ456

AB109 JK321 RT987

JK321 RT987 ZZ456

Puntero Puntero Puntero Puntero Puntero Puntero Puntero Puntero Puntero

Creación y eliminación de índices

La instrucción SQL para crear un índice es CREATE INDEX. Su sintaxis básica es la


siguiente:

56
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX


nombre_indice
ON nombre_tabla (columna1 ,…)

nombre_indice identifica el nombre del índice que se va a crear.

nombre_tabla (columna1 ,…)identifica el nombre de la tabla y la columna o


columnas donde se va a crear el índice.

La opción UNIQUE especifica que cada valor puede aparecer una única vez en el
índice.

La opción CLUSTERED especifica que es un índice clúster.

La opción NONCLUSTERED especifica que es un índice no clúster, esta es la opción


por defecto.

Veamos unos ejemplos. Cree la siguiente tabla en su base de datos local:

USE Madrid
CREATE TABLE Proyecto(
CodigoProyecto CHAR(5) NOT NULL,
NombreProyecto VARCHAR(100) NOT NULL,
Ubicacion VARCHAR(100) NOT NULL
)

A continuación, cree el siguiente índice:

CREATE UNIQUE CLUSTERED INDEX i_codigoproyecto ON


Proyecto(CodigoProyecto)

Con esta instrucción crearemos un índice único y clúster en la columna CodigoProyecto


de la tabla Proyecto.

Veamos otro ejemplo:

CREATE NONCLUSTERED INDEX i_ubicacion ON


Proyecto(Ubicacion)

Esta instrucción crea un índice no clúster en la columna Ubicacion de la tabla Proyecto.


Puede consultar los índices creados a través del explorador de objetos en la carpeta
Tables -> Proyecto -> Indexes.

Para borrar un índice utilizaremos la instrucción DROP INDEX. Su sintaxis es la


siguiente:

57
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

DROP INDEX nombre_indice ON nombre_tabla

Por ejemplo, para borrar el índice i_ubicacion creado con anterioridad utilizaremos la
instrucción siguiente:

DROP INDEX i_ubicacion ON Proyecto

Vistas
Una vista es una tabla virtual cuya definición existe como un objeto en la base de
datos. Las vistas se crean para ver datos específicos de una o varias tablas y a
diferencia de las tablas persistentes, en las vistas no se almacenan los datos. Las vistas
se crean a partir de una consulta SQL que devuelve datos. Una vez que se ha creado la
vista se puede seleccionar datos de ella llamándola por su nombre como si fuera una
tabla normal.

Una de las ventajas de las vistas es que se pueden utilizar para definir y almacenar
consultas complejas. En vez de crear las consultas cada vez que se necesiten, se puede
invocar la vista. Las vistas también se utilizan para presentar a los usuarios la
información que necesitan, y así mantener oculta la información que no necesitan o no
deben ver. Esto puede ser especialmente relevante para ocultar información
confidencial como sueldos de empleados o números de cuenta. Con una vista
podríamos ocultar este tipo de columnas.

La sintaxis básica de la instrucción CREATE VIEW es la siguiente:

CREATE VIEW nombre_vista [(lista_columnas)]


AS consulta_sql

nombre_vista es el nombre que se le asigna a la vista. Este nombre se usará como


el nombre de una tabla en una consulta.

lista_columnas es la lista de columnas de la vista. Este parámetro es opcional, si


no se especifica se infiere de la consulta SQL.

consulta_sql es la instrucción SELECT que devuelve las filas y columnas de una o


más tablas (o vistas).

Veamos el ejemplo siguiente:

USE Madrid
GO
CREATE VIEW EmpleadoVegetariano

58
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

AS
SELECT Nombre, Apellidos, FechaNacimiento, LugarNacimiento
FROM Empleado
WHERE RestriccionAlimentaria = 'Comida vegetariana'

En este ejemplo se crea una vista que selecciona sólo los empleados vegetarianos de la
tabla Empleado que creamos en un ejemplo anterior. Obsérvese que entre la
instrucción USE Madrid y la instrucción CREATE VIEW hay otra instrucción (GO). La
instrucción GO no es una instrucción SQL, sino que es un comando reconocido por
Management Studio. El comando GO se interpreta como una señal de que se debe
enviar el lote actual de instrucciones SQL a la instancia de SQL Server. El lote actual de
instrucciones está formado por todas las instrucciones desde el último comando GO o
desde el comienzo de la sesión o script. En este caso se inserta el comando GO entre
las dos instrucciones SQL porque la instrucción CREATE VIEW debe ser la primera en un
lote de instrucciones.

Una vez que hemos creado la vista podemos ejecutar una consulta para ver su
contenido de la misma forma que consultaríamos una tabla:

SELECT *
FROM EmpleadoVegetariano

El lenguaje T-SQL también dispone de una instrucción para modificar una vista. Se
utiliza la instrucción ALTER VIEW para modificar una vista. Esta instrucción reemplaza
la definición de la vista por la definición especificada en la instrucción. Por ejemplo,
podemos modificar la definición de la vista EmpleadoVegetariano de la siguiente
forma:

USE Madrid
GO
ALTER VIEW EmpleadoVegetariano
AS
SELECT Nombre, Apellidos, FechaNacimiento, LugarNacimiento
FROM Empleado
WHERE RestriccionAlimentaria IN ('Comida
vegetariana','Comida végana')

Para eliminar una vista se emplea la instrucción DROP VIEW de la siguiente forma:

USE Madrid
DROP VIEW EmpleadoVegetariano

59
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Procedimientos almacenados (stored procedure)


Un procedimiento almacenado es un conjunto de instrucciones SQL predefinidas que
realizan alguna acción sobre la base de datos. Por ejemplo, se podría definir una
instrucción SELECT y almacenarla en un procedimiento almacenado. Una vez que se ha
creado el procedimiento, se puede ejecutar citando su nombre y proporcionando los
parámetros adecuados.

Los procedimientos almacenados de T-SQL son similares a los procedimientos de otros


lenguajes de programación y se utilizan para ejecutar un lote de instrucciones. Entre
las ventajas de utilizar procedimientos almacenados se encuentran la mejora del
rendimiento al ejecutar un conjunto de instrucciones como un lote y la mejora de la
consistencia en tareas repetitivas.

Cuando se define un procedimiento almacenado, se puede definir una lista opcional de


parámetros. El procedimiento acepta los valores correspondientes cada vez que se
invoca. Los procedimientos almacenados pueden de forma opcional devolver un valor.

Los procedimientos almacenados se almacenan precompilados en la base de datos.


Esto ofrece la ventaja de no tener que volver a compilar las instrucciones y por lo tanto
se mejora el rendimiento.

Los procedimientos almacenados se crean con la instrucción CREATE PROCEDURE, que


tiene la sintaxis siguiente:

CREATE PROCEDURE [nombre_esquema.]nombre_procedimiento


[({@parametro1} tipo1 [= valor_por_defecto1] [OUTPUT] , …

nombre_esquema es el nombre del esquema al cual se asignará el procedimiento


almacenado.

nombre_procedimiento es el nombre del procedimiento almacenado.

@parametro1 es un parámetro del procedimiento y tipo1 especifica su tipo de


datos. Un parámetro en un procedimiento almacenado se comporta como una variable
local. Los parámetros son los valores que se pasan al procedimiento al llamarlos y se
usan dentro de él.

valor_por_defecto1 especifica un valor por defecto opcional para el parámetro


correspondiente.

OUTPUT es una opción que indica que el parámetro devuelve un valor.

60
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Veamos un ejemplo. Para realizar este ejemplo primero crearemos la tabla Proyecto e
insertaremos unas filas:

USE Madrid
DROP TABLE Proyecto
CREATE TABLE Proyecto(
CodigoProyecto CHAR(5) NOT NULL,
NombreProyecto VARCHAR(100) NOT NULL,
Ubicacion VARCHAR(100) NOT NULL,
Presupuesto INT NOT NULL
)
GO
INSERT INTO Proyecto
(CodigoProyecto,NombreProyecto,Ubicacion,Presupuesto)
VALUES ('A0001','Redes Sociales','Madrid',5000)
INSERT INTO Proyecto
(CodigoProyecto,NombreProyecto,Ubicacion,Presupuesto)
VALUES ('A0014','Instalacion telefónica','Salamanca',13000)
INSERT INTO Proyecto
(CodigoProyecto,NombreProyecto,Ubicacion,Presupuesto)
VALUES ('B0027','Cambio aire
acondicionado','Granada',25000)
INSERT INTO Proyecto
(CodigoProyecto,NombreProyecto,Ubicacion,Presupuesto)
VALUES ('B0033','Redes Sociales','Madrid',5000)

A continuación, crearemos el siguiente procedimiento almacenado:

USE Madrid
GO
CREATE PROCEDURE IncrementarPresupuesto (@porcentaje INT=2)
AS
UPDATE Proyecto
SET Presupuesto = Presupuesto +
Presupuesto*@porcentaje/100

Este procedimiento incrementa el presupuesto de todos los proyectos por el


porcentaje que se pasa en el parámetro @porcentaje. Si no se pasa ningún valor el
parámetro @porcentaje toma el valor por defecto 2.

Para llamar al procedimiento almacenado anterior utilizaremos la instrucción EXECUTE


de la siguiente forma:

EXECUTE IncrementarPresupuesto 3

61
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Se puede modificar un procedimiento almacenado mediante la instrucción ALTER


PROCEDURE. Esta instrucción cuenta con la misma sintaxis que CREATE PROCEDURE.
La ventaja de usar esta instrucción en vez de eliminar y volver a crear el procedimiento
almacenado otra vez es que se evita tener que reasignar los permisos de nuevo sobre
él.

Para eliminar un procedimiento almacenado utilizaremos la instrucción DROP


PROCEDURE junto con el nombre del procedimiento almacenado que queremos
borrar.

Funciones
Las funciones se diferencian de los procedimientos almacenados en que las funciones
siempre devuelven un valor y se invocan como un valor en una expresión (en lugar de
con la instrucción EXECUTE).

Se utiliza la instrucción CREATE FUNCTION para crear una función. Su sintaxis es la


siguiente:

CREATE FUNCTION [nombre_esquema.]nombre_funcion


[({@parametro} tipo [= valor_por_defecto] {, …}
RETURNS {tipo_escalar | [@variable] TABLE}
[AS] {bloque | RETURN (sentencia_select)}

nombre_esquema es el nombre del esquema al cual se asignará la función.

nombre_funcion es el nombre de la nueva función.

@parametro es un parámetro de entrada y tipo especifica su tipo de datos. Los


parámetros son los valores que se pasan a la función al llamarla y se usan dentro de
ella.

valor_por_defecto especifica un valor por defecto opcional para el parámetro


correspondiente.

RETURNS define el tipo de datos del valor que devuelve la función. Una función puede
devolver cualquiera de los tipos de datos estándares soportados por la base de datos,
incluyendo el tipo de datos TABLE.

Una función puede devolver un valor escalar o una tabla. Cuando se quiere devolver
un valor escalar se especifica un tipo de datos estándar en la cláusula RETURNS. Para
devolver una tabla se especifica el tipo de datos TABLE en la cláusula RETURNS.

62
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Veamos un ejemplo:

USE Madrid
GO
CREATE FUNCTION [Link](@fecha AS DATE)
RETURNS VARCHAR(10)
AS
BEGIN
RETURN CASE DATENAME(dw,@fecha)
WHEN 'Monday' THEN 'Lunes'
WHEN 'Tuesday' THEN 'Martes'
WHEN 'Wednesday' THEN 'Miércoles'
WHEN 'Thursday' THEN 'Jueves'
WHEN 'Friday' THEN 'Viernes'
WHEN 'Saturday' THEN 'Sábado'
WHEN 'Sunday' THEN 'Domingo'
ELSE 'Indeterminado'
END
END

Esta función devuelve el día de la semana en español de una fecha que se pasa como
parámetro. La función usa una función del sistema que se llama DATENAME que
devuelve el nombre del día de la semana en inglés. Podemos llamar a la función de la
manera siguiente:

SELECT [Link]('25Dec2016')

Se puede modificar una función mediante la instrucción ALTER FUNCTION. Esta


instrucción cuenta con la misma sintaxis que CREATE FUNCTION. La ventaja de esta
instrucción es que se evita tener que reasignar los permisos de nuevo a la función.

Para eliminar una función utilizaremos la instrucción DROP FUNCTION junto con el
nombre de la función que queremos borrar.

Transacciones
Generalmente las bases de datos se utilizan por distintos tipos de usuarios para
diferentes propósitos y con frecuencia los usuarios están intentando acceder a los
mismos datos al mismo tiempo. Cuantos más usuarios haya en un sistema más alta
será la probabilidad de que surjan problemas cuando los usuarios intenten consultar o
modificar los mismos datos al mismo tiempo. Todas las bases de datos disponen de
algún mecanismo para solucionar problemas de concurrencia y así evitar
inconsistencias en los datos.
63
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

El lenguaje SQL utiliza transacciones para controlar las acciones de los usuarios. Una
transacción es una unidad de trabajo que está formada por una o más instrucciones
SQL que realizan un conjunto de acciones relacionadas. Por ejemplo, podríamos crear
una transacción para trasferir dinero entre dos cuentas bancarias. La transacción
contendría dos instrucciones SQL, una que substrae el dinero de la cuenta origen y otra
que añade dinero a la cuenta de destino.

Una transacción tiene las siguientes propiedades, que se conocen con el acrónimo
ACID:

o Atómica, esta propiedad garantiza que el conjunto de instrucciones en una


transacción sea indivisible. Es decir, se realizan todas las operaciones de una
transacción o ninguna de ellas.
o Consistente, esta propiedad garantiza que una transacción no generará datos
inconsistentes en la base de datos. Es decir, las transformaciones que se
realizan en una transacción llevarán a la base de datos de un estado
consistente a otro.
o Aislada (Isolated), esta propiedad separa unas transacciones concurrentes de
otras. Es decir, ningún usuario podrá acceder a los datos inconsistentes durante
una transacción implementada por otro usuario cuando los datos impactados
por esa transacción están en un estado inconsistente.
o Durable, esta propiedad asegura que los efectos de una transacción particular
permanecen incluso si hay un fallo en el sistema. Debido a esto, si hay un error
en el sistema mientras que se está ejecutando una transacción, todas las
instrucciones de la transacción se desharán.

Las instrucciones principales para el manejo de transacciones son:

o BEGIN TRANSACTION, inicia una transacción.


o COMMIT, finaliza una transacción y permite guardar todos los cambios en la
base de datos.
o ROLLBACK, finaliza una transacción deshaciendo todos los cambios realizados
hasta ese momento.
o SAVE TRANSACTION, crea un punto de recuperación dentro de una transacción.
Un punto de recuperación marca un punto específico dentro de la transacción
que permite que todas las actualizaciones siguientes se pueden cancelar sin
tener que cancelar la transacción entera.

Veamos el ejemplo siguiente:

64
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

USE Madrid
CREATE TABLE Ejemplo (id INT)
BEGIN TRANSACTION
INSERT INTO Ejemplo VALUES(1)
INSERT INTO Ejemplo VALUES(2)
COMMIT

En este ejemplo creamos la tabla Ejemplo y creamos una transacción donde


insertamos dos filas. Al final de la transacción aparece la instrucción COMMIT que
guardará los cambios en la base de datos. Consulte los valores de la tabla Ejemplo para
comprobar el resultado de la transacción. A continuación, veamos el ejemplo
siguiente:

BEGIN TRANSACTION
INSERT INTO Ejemplo VALUES(3)
INSERT INTO Ejemplo VALUES(4)
ROLLBACK

En este ejemplo la transacción no se llega a guardar en la base de datos porque


termina con una instrucción ROLLBACK. Consulte los datos de la tabla Ejemplo para
comprobar el resultado de la transacción.

65
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Ejercicios 1

Ejercicio 1
Cree las tablas correspondientes a este modelo relacional mediante instrucciones SQL.
Asigne el tipo de datos a las columnas guiándose por su nombre, seleccionando el que
le parezca más razonable.

Incluya restricciones PRIMARY KEY y FOREIGN KEY en la solución.

ZOO (CodigoZoo, Nombre, Tamaño, Calle, Ciudad, Provincia, CP, PresupuestoAnual)

ESPECIE (NombreCientifico, NombreVulgar, Familia)

ANIMAL (NumIndentificacion, AñoNacimiento, Pais, CodigoZoo (FK),


NombreCientifico(FK))

Ejercicio 2
Añada una restricción CHECK a la columna AñoNacimiento de la tabla ANIMAL para
que sus valores estén entre 1950 y 2075.

Ejercicio 3
Añada una clave candidata a la columna NombreVulgar de la tabla ESPECIE.

Ejercicio 4
Añada el valor por defecto España en la columna Pais de la tabla ANIMAL.

Ejercicio 5
Inserte una fila en cada tabla.

Ejercicio 6
Escriba una instrucción SQL para cambiar el presupuesto anual de todos los zoos a
25000.

Ejercicio 7
Cree un índice no clúster en la columna Familia de la tabla ESPECIE.

66
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Soluciones a los ejercicios 1

Ejercicio 1
CREATE TABLE ZOO(
CodigoZoo CHAR(5) NOT NULL,
Nombre VARCHAR(200) NOT NULL,
Tamaño INT NOT NULL,
Calle VARCHAR(100) NOT NULL,
Ciudad VARCHAR(100) NOT NULL,
Provincia VARCHAR(50) NOT NULL,
CP CHAR(5) NOT NULL,
PresupuestoAnual MONEY NOT NULL,
CONSTRAINT pk_ZOO PRIMARY KEY (CodigoZoo))

CREATE TABLE ESPECIE(


NombreCientifico VARCHAR(200) NOT NULL,
NombreVulgar VARCHAR(200) NOT NULL,
Familia VARCHAR(200) NOT NULL,
CONSTRAINT pk_ESPECIE PRIMARY KEY (NombreCientifico)
)

CREATE TABLE ANIMAL(


NumIdentificacion INT NOT NULL,
AñoNacimiento SMALLINT NOT NULL,
Pais VARCHAR(100) NOT NULL,
CodigoZoo CHAR(5) NOT NULL,
NombreCientifico VARCHAR(200) NOT NULL,
CONSTRAINT pk_ANIMAL PRIMARY KEY (NumIdentificacion),
CONSTRAINT fkANIMAL_ZOO FOREIGN KEY (CodigoZoo) REFERENCES
ZOO (CodigoZoo),
CONSTRAINT fkANIMAL_ESPECIE FOREIGN KEY (NombreCientifico)
REFERENCES ESPECIE (NombreCientifico)
)

Ejercicio 2
ALTER TABLE ANIMAL
ADD CONSTRAINT c_AñoNacimiento CHECK (AñoNacimiento BETWEEN
1950 AND 2075)

67
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Ejercicio 3
ALTER TABLE ESPECIE
ADD CONSTRAINT uk_ESPECIE UNIQUE (NombreVulgar)

Ejercicio 4
ALTER TABLE ANIMAL
ADD CONSTRAINT d_Pais DEFAULT 'España' FOR Pais

Ejercicio5
INSERT INTO ZOO
(CodigoZoo,Nombre,Tamaño,Calle,Ciudad,Provincia,CP,Presupue
stoAnual)
VALUES ('A0001','Zoo de Madrid',400,'C\Barranquillo
nº9','Madrid','Madrid','28007',34000)

INSERT INTO ESPECIE (NombreCientifico,NombreVulgar,Familia)


VALUES ('Psittacoidea','Loro','Ave')

INSERT INTO ANIMAL


(NumIdentificacion,AñoNacimiento,Pais,CodigoZoo,NombreCient
ifico)
VALUES (1,2001,'España','A0001','Psittacoidea')

Ejercicio 6
UPDATE ZOO SET PresupuestoAnual = 25000

Ejercicio 7
CREATE NONCLUSTERED INDEX i_ESPECIE ON ESPECIE(Familia)

68
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Ejercicios 2

Para la realización de estos ejercicios se utilizará la base de datos de prueba Northwind


alojada en el servidor del máster.

Ejercicio 1
Proporcione el nombre, dirección, ciudad y región de todos los empleados que viven
en Estados Unidos (USA).

Ejercicio 2
Seleccione los productos que pertenecen a la categoría Seafood.

Ejercicio 3
Proporcione el nombre, dirección, ciudad y región de todos los empleados que han
realizado un pedido que se entregó en Bélgica (Belgium).

Ejercicio 4
Proporcione el nombre del empleado y el nombre del cliente de los pedidos que se
enviaron mediante la empresa Speedy Express a clientes que viven en Londres
(London).

Ejercicio 5
Proporcione los nombres de los clientes que no han comprado ningún producto.

Ejercicio 6
Proporcione el precio medio de los productos por categoría.

Ejercicio 7
Proporcione el identificador de empleado y su nombre junto con el número de pedidos
realizados por él.

69
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Soluciones a los ejercicios 2

Ejercicio 1
SELECT FirstName, LastName, Address, City, Region
FROM Employees
WHERE
Country = 'USA'

Ejercicio 2
SELECT ProductName FROM Products
WHERE
CategoryId= (SELECT CategoryId
FROM Categories
WHERE
CategoryName = 'Seafood')

Ejercicio 3
SELECT DISTINCT FirstName, LastName, Address, City, Region
FROM Employees e INNER JOIN Orders o
ON [Link] = [Link]
WHERE ShipCountry = 'Belgium'

Ejercicio 4

SELECT DISTINCT [Link] + ' ' + [Link] AS


NombreEmpleado,
[Link] AS NombreCliente
FROM Orders o INNER JOIN Employees e
ON [Link] = [Link]
INNER JOIN Customers c
ON [Link] = [Link]
INNER JOIN Shippers s
ON [Link] = [Link]
WHERE
[Link] = 'Speedy Express' AND [Link] = 'London'

Ejercicio 5
SELECT CompanyName FROM Customers
WHERE

70
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

NOT EXISTS (SELECT CustomerID FROM Orders WHERE


[Link] = [Link])

Ejercicio 6
SELECT CategoryName, AVG(UnitPrice) AS PrecioMedio
FROM Products p INNER JOIN Categories c
ON [Link] = [Link]
GROUP BY CategoryName

Ejercicio 7
SELECT [Link], [Link], [Link],
COUNT(OrderID) AS NumeroPedidos
FROM Employees e LEFT OUTER JOIN Orders o
ON [Link] = [Link]
GROUP BY [Link], [Link], [Link]
ORDER BY [Link]

71
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server

Bibliografía

Andy Oppel, Robert Sheldon (2009). Fundamentos de SQL (3ª ed.). McGraw-Hill

Dusan Petkovic (2017). Microsoft SQL Server 2016: A beginner’s guide (6ª ed.).
McGraw-Hill.

[Link]

72

También podría gustarte