4 SQL
4 SQL
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
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.
3
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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
e) SQL integrado
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
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.
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.
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) *
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.
[Link]
ver15
Azure Data Studio está disponible para los siguientes sistemas operativos:
Windows
Windows 10 (64-bit)
Windows 8 (64-bit)
macOS
Linux
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:
9
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
Pulse Connect.
10
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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
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
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.
En esta sección veremos los objetos elementales que se incluyen en el lenguaje T-SQL:
• Literales
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’
b) Literal numérico
345
-2345
-40.77
c) Literal hexadecimal
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.
• 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
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:
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:
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:
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
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
19
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
USE nombre_basedatos
USE Madrid
GO
Al usar el comando USE nos aseguramos de que nuestra instrucción CREATE SCHEMA
se ejecute en la base de datos especificada.
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.
20
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
La sintaxis que se utiliza para especificar instrucciones T-SQL utiliza una serie de
caracteres con un significado específico:
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.
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
USE Madrid
22
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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:
23
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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
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:
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.
USE Madrid
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:
26
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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.
27
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
UNIQUE
[CONSTRAINT nombre_restriccion]
UNIQUE ({columna1}, …)
USE Madrid
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}, …)
USE Madrid
USE Madrid
USE Madrid
29
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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
USE Madrid
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
[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
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
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:
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
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:
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:
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.
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)
)
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
Veamos también cómo insertar un registro en la tabla Empleado sin especificar la lista
de columnas:
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
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:
UPDATE Empleado
SET RestriccionAlimentaria = 'Comida vegana'
WHERE NumEmpleado = 2
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:
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:
35
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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.
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
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 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
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
USE pubs
SELECT AVG(discount) AS DescuentoMedio
FROM discounts
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
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
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
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’.
USE pubs
SELECT *
FROM titles
WHERE NOT type = 'psychology'
Operadores IN y BETWEEN
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:
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.
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
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.
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.
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.
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
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:
ASC indica que se quiere ordenar los datos en sentido ascendente y DESC en sentido
descendente (ASC es el valor por defecto).
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:
44
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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:
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.
Use pubs
SELECT city, state, zip
FROM authors
UNION
SELECT city, state, zip
FROM stores
ORDER BY 2
45
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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.
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.
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.
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.
o Operadores de comparación
o Operador IN
o Operador ANY o ALL
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
USE pubs
SELECT title_id,
title,
type
FROM titles
WHERE pub_id = '0736'
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.
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.
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.
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
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
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.
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.
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.
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.
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
Í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
56
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
La opción UNIQUE especifica que cada valor puede aparecer una única vez en el
índice.
USE Madrid
CREATE TABLE Proyecto(
CodigoProyecto CHAR(5) NOT NULL,
NombreProyecto VARCHAR(100) NOT NULL,
Ubicacion VARCHAR(100) NOT NULL
)
57
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
Por ejemplo, para borrar el índice i_ubicacion creado con anterioridad utilizaremos la
instrucción siguiente:
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.
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
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)
USE Madrid
GO
CREATE PROCEDURE IncrementarPresupuesto (@porcentaje INT=2)
AS
UPDATE Proyecto
SET Presupuesto = Presupuesto +
Presupuesto*@porcentaje/100
EXECUTE IncrementarPresupuesto 3
61
Bases de datos y herramientas de Business Intelligence
El lenguaje de consulta SQL con Microsoft SQL Server
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).
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')
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:
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
BEGIN TRANSACTION
INSERT INTO Ejemplo VALUES(3)
INSERT INTO Ejemplo VALUES(4)
ROLLBACK
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.
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
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))
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)
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
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
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
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
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