Está en la página 1de 98

Unidad 1.

El entorno gráfico SSMS


1.1. Introducción:
SQL Server 2005 es un sistema gestor de bases de datos relacionales de Microsoft Corporation
orientado a sistemas medianos y grandes aunque también puede rodar en ordenadores
personales. SQL Server Management Studio (SSMS) es la herramienta de SQL Server que
permite definir y gestionar todas las bases de datos almacenadas en el servidor SQL Server
2005.
En este tema veremos cómo utilizar el SQL Server Management Studio para manejar las bases
de datos del servidor y organizaremos el texto en los siguientes puntos:

 Instalar SQL Server 2005.


 Entrada al SQL Server Management Studio
 Las bases de datos: Estructura interna, crear, adjuntar, conectar y desconectar.
 Las tablas: crear tablas, definirlas, modificar su contenido, etc.
 Relacionar tablas
 Las Consultas
 Las Vistas

Si no sabes lo que es una base de datos relacional o no tienes conocimientos previos acerca de
las bases de datos, puedes leer una introducción a las bases de datos en el siguiente básico

1.2. Instalar SQL Server 2005


Existen diferentes versiones (ediciones) del producto, por lo que es un producto muy versátil, que
puede cumplir con las exigencias de cualquier empresa, puede ser utilizado para gestionar
bases de datos en un PC en modo local a gestionar todo el sistema de información de grandes
empresas pasando por sistemas que requieran menos potencia y por sistemas móviles.

Actualmente se utiliza más en entornos Cliente/servidor con equipos medianos y grandes.

Para realizar este curso te recomendamos instalar la versión gratuita: Express. Puedes
descargarla desde la página web de Microsoft, desde el enlace para iniciar descarga. Si quieres
ver las diferentes ediciones y sus características principales visita el siguiente avanzado

Si la instalación se realiza a partir del archivo descargado de Internet, la descarga se empaqueta


como un único ejecutable mediante una tecnología de instalación de Microsoft llamada SFXCab.
Al hacer doble clic en el .exe se inicia automáticamente el proceso de instalación.

Tan sólo deberemos seguir el asistente. Los puntos más importantes a tener en cuenta son:

 Habilitar el SQL Server Management Studio en la instalación (si no lo está por defecto)
cuando nos pregunte qué componentes deseamos instalar.
 Indicar que se trata de una Instancia predeterminada.

1.3. Entrada al SQL Server Management Studio


Aunque trabajemos en modo local, la entrada a la herramienta es la misma. Para empezar
entramos a través del acceso directo o a través de Inicio, Programas, Microsoft SQL Server
2005, SQL Server Management Studio.
Lo primero que deberemos hacer es establecer la conexión con el servidor:
Seleccionamos el nombre del servidor y pulsamos el botón Conectar. Se abrirá la ventana inicial
del SQL Server Management Studio (en adelante SSMS):

En la parte izquierda tenemos abierto el panel Explorador de Objetos en el que aparece


debajo del nombre del servidor con el que estamos conectados una serie de carpetas y objetos
que forman parte del servidor.
En el panel de la derecha se muestra la zona de trabajo, que varía según lo que tengamos
seleccionado en el Explorador de objetos, en este caso vemos el contenido de la carpeta que
representa el servidor ord01.
En la parte superior tenemos el menú de opciones y la barra de herramientas Estándar.

Con las siguientes opciones:


1. Nueva consulta 6. Consulta de SQL Server 11. Resumen
Mobile
2. Consulta de motor de Base de 7. Abrir archivo 12. Explorador de
datos Objetos
3. Consulta MDX de Análisis 8. Guardar 13. Explorador de
Services Plantillas
4. Consulta DMX de Análisis 9. Guardar todo 14. Ventana de
Services Propiedades
5. Consulta MXLA de Análisis 10. Servidores registrados
Services

En caso de que utilices la versión Express, es posible que no dispongas de algunos de éstos
botones.

1.4. Estructura interna de una base de datos


Antes de empezar tenemos que tener claro cómo se organiza la información en una base de
datos SQL Server 2005.
Las bases de datos de SQL Server 2005 utilizan tres tipos de archivos:
Archivos de datos principales
En una base de datos SQL Server los datos se pueden repartir en varios archivos para mejorar
el rendimiento de la base de datos.
El archivo de datos principal es el punto de partida de la base de datos y apunta a los otros
archivos de datos de la base de datos. Cada base de datos tiene obligatoriamente un archivo
de datos principal. La extensión recomendada para los nombres de archivos de datos
principales es.
Archivos de datos secundarios
Los archivos de datos secundarios son todos los archivos de datos menos el archivo de datos
principal. Puede que algunas bases de datos no tengan archivos de datos secundarios,
mientras que otras pueden tener varios archivos de datos secundarios. La extensión de nombre
de archivo recomendada para los archivos de datos secundarios es.
Además los archivos de datos se pueden agrupar en grupos de archivos. Para cada base de
datos pueden especificarse hasta 32.767 archivos y 32.767 grupos de archivos.
Archivos de registro
Los archivos de registro (archivos de log) almacenan toda la información de registro que se
utiliza para recuperar la base de datos, el también denominado registro de transacciones.
Como mínimo, tiene que haber un archivo de registro por cada base de datos, aunque puede
haber varios. La extensión recomendada para los nombres de archivos de registro es.

SQL Server 2005 no exige las extensiones de nombre de archivo mdf, ndf y ldf, pero estas
extensiones ayudan a identificar las distintas clases de archivos y su uso.
Cada base de datos tiene al menos 2 archivos (un archivo de datos principal y un archivo de
registro) y opcionalmente un grupo de archivos.

Los archivos de datos y de registro de SQL Server se pueden colocar en sistemas de archivos
FAT o NTFS. Se recomienda utilizar NTFS por los aspectos de seguridad que ofrece. No se
pueden colocar grupos de archivos de datos de lectura y escritura, y archivos de registro, en un
sistema de archivos NTFS comprimido. Sólo las bases de datos de sólo lectura y los grupos de
archivos secundarios de sólo lectura se pueden colocar en un sistema de archivos NTFS
comprimido.
1.5. Crear una base de datos en SSMS
En el Explorador de objetos, si desplegamos la carpeta Bases de datos nos aparecen Bases
de datos del sistema y las bases de datos de usuario después de la carpeta Instantáneas..
Después de la instalación, en la carpeta Bases de datos del sistema se habrá creado una
especial denominada master se utiliza como base de datos de usuario por defecto.
Las demás bases de datos forman también parte del diccionario de datos y las utiliza el sistema
para llevar a cabo su gestión.

Las bases de datos de los usuarios se deben crear preferentemente fuera de la carpeta Bases
de datos del sistema.
Para crear una nueva base de datos de usuario nos posicionamos sobre la carpeta Bases de
datos y con el botón derecho del ratón desplegamos el menú contextual del que elegimos la
opción Nueva base de datos…

Se abre a continuación el cuadro de diálogo donde definiremos la base de datos que queremos
crear:
Lo mínimo a introducir será el campo Nombre de la base de datos, éste es el nombre de la
base de datos lógica, la base de datos a la que nos referiremos dentro del SSMS, a nivel
conceptual (en la imagen Mibase).

Esta base de datos está asociada a dos archivos físicos, en la parte inferior aparecen esos
archivos. Para facilitarnos la tarea, al teclear el nombre de la bd lógica, se rellenan
automáticamente los nombres de los archivos físicos, el de datos con el mismo nombre y el del
archivo de registro con el mismo nombre seguido de _log. Estos nombres son los nombres que
se asumen por defecto pero los podemos cambiar, posicionando el cursor en el nombre y
cambiándolo.

Para cada archivo físico podemos definir una serie de parámetros como el tipo de archivo (si es
de datos o de transacciones Registro) y su ocupación inicial (Tamaño inicial).

Si no indicamos ninguna ubicación podemos ver que los guarda en la carpeta del SQL
Server/MSSQL.n/MSSQL/DATA.
“N” representa un número que puede variar de una instalación a otra.
Estos son los archivos mínimos en los que se almacenará la base de datos, pero como ya
vimos anteriormente se puede almacenar en más archivos, los tenemos que definir todos en
esta ventana a continuación de los dos obligatorios.

Para añadir más archivos físicos disponemos del botón Agregar.


Al pulsar el botón Agregar se crea una nueva fila en la tabla de archivos físicos donde
deberemos escribir el nombre del archivo, su tipo (desplegando la lista podemos elegir entre de
datos o de registro) y demás parámetros.

Al agregar un nuevo archivo se activa el botón Quitar, siempre que estemos posicionados
encima de un archivo secundario para poder así eliminarlo si lo queremos.
Si nos fijamos en la zona de la izquierda, vemos que nos encontramos en la pestaña General,
podemos cambiar otros parámetros de la base de datos pulsando en Grupos de archivos o
en Opciones:

Al final pulsamos en Aceptar y se creará la base de datos.

Aparecerá dentro de la carpeta Bases de datos. Si no se ve pulsa en el icono Actualizar.

Desde el Explorador de Windows podemos ver que en la carpeta indicada se han creado los
archivos físicos con los nombres que le hemos indicado.
1.6. Adjuntar una base de datos
En ocasiones no necesitaremos crear la base de datos desde cero, porque ésta ya estará
creada. Éste es el caso de los ejercicios del curso. Para realizarlos, deberás adjuntar una
base de datos ya existente a tu servidor. Para ello, lo que tenemos que hacer es pegar los
archivos en la ubicación que queramos, y luego indicar al SQL Server que vamos a utilizar esta
base de datos, de la siguiente manera:
En el Explorador de objetos, sobre la carpeta Bases de datos desplegar el menú contextual
y elegir Adjuntar...

En la siguiente ventana elegimos la base de datos:


Pulsando en Agregar indicamos el archivo de datos primario en su ubicación y
automáticamente se adjuntará la base de datos lógica asociada a este archivo.

Finalmente pulsamos en Aceptar y aparece la base de datos en nuestro servidor.

La opción Adjuntar sólo se utiliza la primera vez, cuando todavía no tenemos la base de datos
en el disco.

1.7. Conectar y Desconectar la base de datos


Una vez hemos creado la base de datos o la hemos adjuntado a nuestro servidor, nos daremos
cuenta de que no podremos manipular los archivos de la base desde fuera del gestor SSMS,
por ejemplo, desde el Explorador de Windows. Es decir, no podremos copiar, cortar, mover o
eliminar los archivos fuente mdf, ndf y ldf. Si lo intentamos se mostrará un aviso de que la base
de datos está en uso.

Esto es así porque SQL Server sigue en marcha, a pesar de que se cierre el gestor. Ten en
cuenta que el servidor de base de datos normalmente se crea para que sirva información a
diferentes programas, por eso sería absurdo que dejara de funcionar cuando cerramos el
programa gestor, que sólo se utiliza para realizar modificaciones sobre la base.
Para poder realizar acciones sobre la base de datos, ésta debe estar desconectada. Para ello,
desde el SSMS, desplegamos el menú contextual de la base de datos que nos interese
manipular y seleccionaremos la opción Poner fuera de conexión:

Aparecerá un símbolo a la izquierda de la base de datos indicándonos que la base de


datos está desconectada, a partir de este momento Windows nos dejará manipular los
archivos.

Para volver a conectar la base de datos y seguir trabajando con ella, accederemos al mismo
menú contextual pero elegiremos la opción Poner en conexión:

El caso más inmediato en el que puedes necesitar conectar y desconectar la base de datos es
copiar a un pendrive los archivos de las bases que utilizarás en los ejercicios para poder
trabajar en diferentes ordenadores con ellos.

En caso de que tu versión de SQL Server no tenga las opciones Poner en conexión y Poner
fuera de conexión, deberás utilizar la opción Separar... y luego volver a adjuntarla.

1.8. Crear una nueva tabla


Para crear una nueva tabla primero nos tenemos que posicionar en la base de datos donde
queremos que se almacene la tabla, desplegar el menú contextual y seleccionar la
opción Nueva tabla.

En la ventana que se abre debemos definir las columnas de la tabla:


A cada columna se le asigna un nombre, un tipo de datos, y opcionalmente una serie de
propiedades, en este tema veremos las básicas y las demás las veremos con más detalle
cuando veamos la instrucción SQL CREATE TABLE.
De momento no tenemos definida ninguna columna, al teclear un nombre se crea una primera
entrada en esta tabla con la definición de la primera columna. En la columna Tipo de
datos elegimos qué tipo de valores se podrán almacenar en la columna.

1.9. Tipos de datos

Podemos elegir entre todos los tipos que aparecen arriba.

Algunos tipos no necesitan más, como por ejemplo el tipo entero (int), y otros se pueden
completar con una longitud, como los tipos alfanuméricos:
En este ejemplo hemos definido una columna (Codigo) de tipo Entero corto (Smallint), y una
columna (Nombre) que almacenará hasta 20 caracteres alfanuméricos (nchar(20)), en este
caso la longitud la indicamos en la pestaña Propiedades de columna en la propiedad Longitud.
Las propiedades de la columna pueden variar dependiendo del tipo de datos de la columna
seleccionada, por ejemplo los campos enteros no tienen la propiedad longitud, ya que el
propio tipo define la longitud del campo, en cambio los campos de tipo numeric o decimal no
tiene la propiedad longitud pero sí las propiedades escala y precisión, los valores que permiten
definir el tamaño del campo.

1.10. Valores nulos


También podemos indicar si la columna permitirá valores nulos o no, o bien cambiando la
propiedad Permitir valores nulos que aparece debajo de la propiedad Longitud, o bien
simplemente marcando o desmarcando la casilla de la columna Permitir valores nulos que se
encuentra al lado de la columna Tipo de datos. Si la casilla está marcada, el usuario podrá no
rellenar el campo cuando inserte una fila de datos en la tabla.

1.11. Columna con contador


En la mayoría de los sistemas gestores de bases de datos tenemos un tipo de datos de tipo
contador, auto numérico, auto incremental, etc. Este tipo hace que el propio sistema es el
encargado de rellenar el campo con un valor que va incrementando conforme se crean más
filas de datos en la tabla.

Las columnas de este tipo se utilizan normalmente para numerar las filas de la tabla, como no
habrán dos filas con el mismo valor (el sistema se encarga de incrementar el valor cada vez
que se crea una nueva fila), estos campos se suelen utilizar como claves primarias.

En SQL Server 2005 no existe el tipo de datos Contador pero se consigue el mismo
funcionamiento asignando a la columna un tipo de datos numérico y definiendo la columna
como columna de identidad.

En las propiedades de la columna marcamos Sí en la propiedad (Identidad) y a continuación


podemos indicar en qué valor queremos que empiece el contador (Inicialización de identidad) y
en cuánto incrementará cada vez que se cree un nuevo registro (Incremento de identidad).

Aunque este tipo de columnas se utiliza frecuentemente como clave primaria, SQL Server no le
asigna automáticamente esta función, la tenemos que definir nosotros mismos, pero sí fuerza a
que sea una columna sin valores nulos. No se puede definir más de una columna de identidad
por tabla.

1.12. Clave primaria


Para definir una columna como clave primaria, posicionamos el puntero del ratón sobre la
columna, desplegamos el menú contextual y seleccionamos la opción Establecer Clave
principal:

Aparecerá una llave a la izquierda del nombre, símbolo de las claves principales:

Para definir una clave primaria compuesta por varias columnas, seleccionamos las columnas
manteniendo pulsada la tecla Ctrl y luego seleccionamos la opción.

Para quitar una clave principal, hacemos lo mismo pero en esta ocasión seleccionamos la
opción Quitar clave principal.

También podemos utilizar el icono de la barra de herramientas.


1.13. Añadir o eliminar columnas
Una vez definidas algunas columnas, si queremos añadir una nueva columna entre dos, nos
posicionamos en la segunda y seleccionamos la opción Insertar columna del menú contextual.

La nueva columna se colocará delante:

Del mismo modo si queremos eliminar la definición de una columna, nos posicionamos en la
columna a eliminar y seleccionamos la opción Eliminar columna:

O simplemente hacemos clic en la zona a la izquierda del nombre y pulsamos la tecla Supr.

Finalmente guardamos la tabla, nos pedirá el nombre de la tabla:

La nueva tabla aparecerá en la lista de tablas de la base de datos:


1.14. Modificar la definición de una tabla
Para entrar a la ventana de definición de la tabla utilizamos la opción Modificar de su menú
contextual (También es posible que se llame Diseño):

Se abrirá la ventana que ya conocemos para definir las columnas de la tabla

1.15. Insertar datos en la tabla


Ahora que tenemos la tabla creada podemos rellenarla con datos. Para eso debemos abrir la
tabla:

Se abrirá una ventana parecida a esta:

La primera columna sirve para indicarnos el estado de una fila, por ejemplo el * nos indica que
es una nueva fila, esta fila realmente no está en la tabla, nos sirve de contenedor para los
nuevos datos que queremos insertar.

Para insertar una nueva fila de datos sólo tenemos que rellenar los campos que aparecen en
esa fila (la del *), al cambiar de fila los datos se guardarán automáticamente en la tabla a no ser
que alguno infrinja alguna regla de integridad, en ese caso SQL Server nos devuelve un
mensaje de error para que corrijamos el dato erróneo, si no lo podemos corregir entonces sólo
podemos deshacer los cambios.

1.16. Modificar datos


Para modificar un valor que ya está en una fila de la tabla sólo tenemos que posicionarnos en
el campo y rectificar el valor. En cuanto modificamos un valor, la fila aparece con un lápiz
escribiendo (ver imagen), este lápiz nos indica que la fila se ha modificado y tiene nuevos datos
por guardar. Al salir de la fila ésta se guardará automáticamente a no ser que el nuevo valor
infrinja alguna regla de integridad. Si queremos salir de la fila sin guardar los cambios, tenemos
que cancelar la actualización pulsando la tecla ESC.

1.17. Eliminar filas


Para eliminar una fila completa, la seleccionamos y pulsamos la tecla Supr o bien
desplegamos su menú contextual y seleccionamos la opción Eliminar.

En cualquiera de los dos casos nos aparece un mensaje de confirmación.

1.17. Relacionar tablas


Como ya hemos visto, en una base de datos relacional, las relaciones entre las tablas se
implementan mediante la definición de claves ajenas, que son campos que contienen valores
que señalan a un registro en otra tabla, en esta relación así creada, la tabla referenciada se
considera principal y la que contiene la clave ajena es la subordinada.

Desde el entorno gráfico del SSMS podemos definir claves ajenas entrando en el diseño de la
tabla y desplegando el menú contextual del campo que va a ser clave ajena:

Seleccionamos la opción Relaciones y se abre la ventana:


Al pulsar el botón que se encuentra en la fila Especificación de tablas y columnas se abre el
diálogo donde definiremos la relación:

En la parte derecha tenemos la tabla en la que estamos y el campo que va a actuar como clave
ajena, sólo nos queda elegir en el desplegable de la izquierda la tabla a la que hace referencia
la clave y al seleccionar una tabla, a la izquierda del campo clave ajena podremos elegir el
campo de la otra tabla por el que se relacionarán las tablas. En nuestro caso será:

De esta forma hemos definido una relación entre las tablas Facturas y Clientes. Para ver las
relaciones existentes entre las diferentes tablas tenemos los diagramas.

Primero debemos definir el diagrama, para ello seleccionamos la opción correspondiente:


Si no tenemos todavía ningún diagrama creado, nos aparece un mensaje:

Elegimos Sí y se crea digamos el soporte donde se pintará el diagrama.

A continuación nos aparece el nuevo diagrama ahora si elegimos crear un nuevo diagrama nos
preguntará las tablas a incluir en el diagrama:

Seleccionamos cada una y pulsamos Agregar, cuando hayamos agregado al diagrama todas
las que queremos pulsamos en Cerrar y aparecerán en el diagrama las tablas con las
relaciones que tengan definidas en ese momento:
La llave indica la tabla principal (padre) y el símbolo infinito señala la tabla que contiene la
clave ajena.

En el examinador de objetos en la carpeta Diagramas de base de datos aparecen todos los


diagramas definidos hasta el momento:

Hemos aprendido hasta ahora lo básico para poder crear una base de datos y rellenarla con
tablas relacionadas entre sí y con datos, ahora veamos cómo recuperar esos datos.

1.18. Abrir una nueva consulta


Vamos a ver ahora cómo crear consultas SQL y ejecutarlas desde el entorno del SSMS.

Para ello debemos abrir la zona de trabajo de tipo Query, abriendo una nueva consulta,
seleccionando previamente el servidor y pulsando el botón de la barra de
botones o si queremos realizar la consulta sobre un servidor con el cual todavía no hemos
establecido conexión, seleccionando de la barra de menús la opción Nuevo > Consulta de
motor de base de datos:

En este último caso nos aparecerá el cuadro de diálogo para establecer la conexión (el mismo
que vimos al principio del tema).

A continuación se abrirá una nueva pestaña donde podremos teclear las sentencias SQL:
Además aparece una nueva barra de botones que nos permitirá ejecutar los comandos más
útiles del modo query.

1.19. Escribir y ejecutar código TRANSACT-SQL


Sólo tenemos que teclear la sentencia a ejecutar, por ejemplo empezaremos por crear la base
de datos.

Utilizaremos la sentencia CREATE DATABASE mínima:

CREATE DATABASE ventas;


Al pulsar el botón Ejecutar se ejecuta la sentencia y aparece en la parte inferior el resultado de
la ejecución, en la pestaña Mensajes:

Si ahora desplegamos la carpeta Bases de Datos del Explorador de Objetos, observaremos


la base de datos que hemos creado:
Si la ejecución de la sentencia produce un error, el sistema nos devolverá el mensaje de error
escrito en rojo en la pestaña Mensajes.

Podemos incluir en una misma consulta varias sentencias SQL, cuando pulsamos Ejecutar se
ejecutarán todas una detrás de otra. Si tenemos varias consultas y sólo queremos ejecutar una,
la seleccionaremos antes de ejecutarla

1.20. La base de datos predeterminada


Cuando ejecutamos consultas desde el editor, nos tenemos que fijar sobre qué base de datos
se va a actuar.
Fijándonos en la pestaña de la consulta, en el nombre aparece el nombre del servidor seguido
de un punto y el nombre de la base de datos sobre la que se va a actuar y luego un guión y el
nombre de la consulta.
En la imagen anterior tenemos ord01.master – SQLQuery1.sql, lo que nos indica que la
consulta se llama SQLQuery1.sql, y que se va a ejecutar sobre la base de datos master que
se encuentra en el servidor ord01.

Cuando creamos una nueva consulta, ésta actuará sobre la base de datos activa en ese
momento. Por defecto la base de datos activa es la predeterminada (master). Si queremos que
la base de datos activa sea por ejemplo la base de datos ventas, hacemos clic sobre su
nombre en el Explorador de objetos, y ésta pasará a ser la base de datos activa. Si ahora
creamos una nueva consulta, ésta actuará sobre la base de datos ventas.

Si queremos crear una consulta que siempre actúe sobre una determinada base de datos y no
nos queremos preocupar de qué base de datos tenemos activa podemos añadir al principio de
la consulta la instrucción USE nombreBaseDatos; esto hará que todas las instrucciones que
aparezcan después, se ejecuten sobre la base de datos indicada.
Por ejemplo:

USE ventas;

SELECT * FROM pedidos;


Obtiene todos los datos de la tabla pedidos que se encuentra en la base de datos ventas.
Si no utilizamos USE y almacenamos la consulta, al abrirla otra vez, cogerá como base de
datos la predeterminada (no la activa) y se volverá a ejecutar sobre la base de datos master.

Normalmente utilizaremos como base de datos la nuestra y no la base de datos master, por lo
que nos será útil cambiar el nombre de la base de datos por defecto, esto lo podemos hacer
cambiando la base de datos por defecto en el id de sesión.
Para ello, cuando vamos a conectar con el servidor:

Pulsamos en el botón Opciones >>

En la pestaña Propiedades de conexión, en el cuadro Conectar con base de datos:


Seleccionamos <Examinar servidor > para elegir la base de datos.
La elegimos y aceptamos. A partir de ese momento la base de datos elegida será la que SQL
Server coja por defecto en todas las sesiones de ese usuario.

1.21. El editor de texto


Para facilitarnos la redacción y corrección de las sentencias, el editor de SQL presenta las
palabras de distintos colores según su categoría y podemos utilizar el panel Explorador de
Objetos para arrastrar desde él los objetos sobre la zona de trabajo y así asegurarnos de que
los nombres de los objetos (por ejemplo nombre de tabla, de columna, etc.) sean los correctos.
Como hemos dicho el texto que se escribe en este editor de código se colorea por categoría.
Los colores son los mismos que se utilizan en todo el entorno SQL Server. En esta tabla
aparecen los colores más comunes.

Color Categoría

Rojo Cadena de caracteres

Verde oscuro Comentario

Negro sobre fondo plateado Comando SQLCMD

Fucsia Función del sistema

Verde Tabla del sistema

Azul Palabra clave

Verde azulado Números de línea o parámetro de plantilla

Rojo oscuro Procedimiento almacenado de SQL Server

Gris oscuro Operadores


1.22. Configurar un esquema de colores personalizado
En el menú Herramientas > Opciones, desplegando la opción Entorno, Fuentes y colores,
se puede ver la lista completa de colores y sus categorías, así como configurar un esquema de
colores personalizado:

En la lista Mostrar valores para, seleccionamos el entorno que se verá afectado.

El botón Usar predeterminados nos permite volver a la configuración predeterminada.

Ahora sólo nos queda aprender a redactar sentencias SQL, cosa que se verá en otro momento,
mientras tanto podemos utilizar el Generador de Consulta que incluye SSMS y que veremos a
continuación en el apartado sobre vistas.

1.23. Las Vistas


Las consultas que hemos visto hasta ahora son trozos de código SQL que podemos guardar en
un archivo de texto y abrir y ejecutar cuando queramos, pero si queremos que nuestra consulta
de recuperación de datos se guarde en la propia base de datos y se comporte como una tabla
(algo parecido a una consulta almacenada de Access), la tenemos que definir como una vista.
Esta vista tiene la ventaja entre otras de poder ser utilizada como si fuese una tabla en otras
consultas. Realmente al ejecutarla obtenemos una tabla lógica almacenada en memoria y lo
que se guarda en la base de datos es su definición, la instrucción SQL que permite recuperar
los datos.
Para definir una vista en el Explorador de Objetos desplegamos la base de datos donde la
guardaremos y elegimos la opción Nueva vista del menú contextual de la carpeta Vistas, se
pondrá en funcionamiento el generador de consultas pidiéndonos las tablas en las que se
basará la vista. Pulsamos sobre la tabla a añadir al diseño de la vista y pulsamos el
botón Agregar, podemos añadir así cuántas tablas queramos.

Después de Cerrar, vemos a la derecha del Explorador de Objetos la pestaña con la


definición de la vista que puede incluir varios paneles:
La aparición de estos paneles es configurable, en la barra de herramientas Diseñador de
vistas los iconos remarcados en azul son los correspondientes a cada panel:

Nosotros, a lo largo del curso, crearemos las vistas desde el panel SQL que veremos más
adelante.
1.24. El panel de diagrama
Es el primero que aparece, incluye una representación gráfica de las tablas con sus campos y
de la forma en que se juntan en la vista. En este caso, como las tablas tienen relaciones
definidas (claves ajenas), esta relación ha aparecido automáticamente al añadir la segunda
tabla. Pero se puede cambiar el tipo de relación eligiendo la opción correspondiente en el menú
contextual que aparece con el clic derecho sobre la relación:

Desde el panel diagrama podemos añadir cómodamente campos de las tablas a la consulta
marcando la casilla correspondiente. En la imagen anterior la única casilla seleccionada es la
del * en la tabla Libros por lo que se visualizarán todas las columnas de la tabla Libros y
ninguna de la tabla Préstamos.
Conforme vamos marcando casillas de las tablas del panel diagrama, los cambios se ven
reflejados en los demás paneles excepto en el panel de resultados que se actualiza ejecutando
la consulta.

1.25. El panel de criterios


Es una rejilla en la que podemos definir las columnas del resultado de la consulta (las
columnas de la vista).

En cada fila de la rejilla se define una columna del resultado o una columna que se utiliza para
obtener el resultado.

En Columna tenemos el nombre de la columna de la se obtienen los datos o la expresión


cuando se trata de una columna calculada.

En Alias escribimos el nombre que tendrá la columna en la vista, también corresponde con el
encabezado de la columna en la rejilla de resultado. Si se deja el campo en blanco, por defecto
se asume el mismo nombre que hay en Columna.

En Tabla tenemos el nombre de la tabla del origen de la consulta a la que pertenece


la Columna, por ejemplo la primera columna del resultado se saca de la columna Codigo de la
tabla LIBROS y se llamará CodLibro. La cuarta columna de la vista cogerá sus datos de la
columna Usuario de la tabla Prestamos y se llamará Usuario (Alias se ha dejado en blanco por
lo que asume el nombre que hay en Columna.

En la columna Resultados indicamos si queremos que la columna se visualice o no, las


columnas con la casilla marcada se visualizan.
Las columnas Criterio de ordenación y Tipo de orden permiten ordenar las filas del resultado
según una o más columnas. Se ordena por las columnas que tienen algo en Tipo de orden y
cuando se ordena por varias columnas Criterio de ordenación indica que primero se ordena por
la columna que lleva el nº 1 y después por la columna que lleva el nº 2 y así sucesivamente. En
el ejemplo las filas del resultado se ordenarán primero por código de libro y después por código
de préstamo, todas las filas dentro del mismo libro se ordenarán por código de préstamo.

Si queremos añadir unos criterios de selección tenemos las columnas Filtro y O…

En cada celda indicamos una condición que debe cumplir la columna correspondiente y se
puede combinar varias condiciones mediante O (OR) e Y (AND) según coloquemos las
condiciones en la misma columna o en columnas diferentes. En el ejemplo anterior tenemos la
condición compuesta: ((usuario=1) AND (Dias>5)) OR (Usuario=2).

Podemos variar el orden de aparición de las columnas arrastrando la fila correspondiente de la


rejilla hasta el lugar deseado.

También podemos Elimnar filas de la rejilla para eliminar columnas del resultado, lo
conseguimos seleccionando la fila haciendo clic sobre su extremo izquierda y cuando aparece
toda la fila remarcada pulsamos Supr o desde el menú contextual de la fila.

Podemos definir consultas más complejas como por ejemplo consultas de resumen, pulsando
sobre el botón Agrupar por de la barra de herramientas, se añade a la rejilla una nueva
columna Agrupar por con las siguientes opciones:

1.26. El panel SQL


En él vemos la instrucción SQL generada, también podemos redactar directamente la
sentencia SQL en el panel y ver los cambios equivalentes en los distintos paneles. Para ver
estos cambios debemos de ejecutar o Comprobar la sintaxis para que se actualicen los
demás paneles.
Por defecto el generador añade a la consulta una cláusula TOP (100) PERCENT que indica
que se visualizarán el 100% de las filas. Esta cláusula no la hemos definido nosotros sino que
la añade automáticamente el generador.

Una vez tenemos la vista definida la guardamos y podremos hacer con ella casi todo lo que
podemos hacer con una tabla. De hecho si nos fijamos en el Explorador de objetos, en la
carpeta Vistas:

Vemos que la estructura es muy similar a la estructura de una tabla. Y que podemos modificar
su definición y ejecutarla, igual que con las tablas:

Modificar para modificar la definición de la vista

Abrir vista para ejecutarla y ver los datos como si fuese una tabla real.

Ejercicio 1: Crear una base de datos


Se desea implementar una base de datos para el control de una biblioteca. Crea la base de
datos con el nombre Biblioteca y las opciones por defecto.

Ejercicio 2: Crear y definir tablas


Crea las tablas Libros, Préstamos y Usuarios de forma que sigan el siguiente esquema:

Tabla Libros
NOMBRE CAMPO TIPO DE DATOS TAMAÑO

Codigo Numérico Byte

Nombre Texto 60

Editorial Texto 25

Autor Texto 25

Genero Texto 20

País Autor Texto 20

Paginas Numérico Entero

Any Edición Fecha/Hora Fecha mediana

Precio Moneda

Dias Numérico Entero

TABLA DE PRÉSTAMOS

NOMBRE CAMPO TIPO DE DATOS TAMAÑO

Codigo Auto numérico

Libro Numérico Byte

Usuario Numérico Byte

F Salida Fecha/Hora Fecha mediana

F Máxima Fecha/Hora Fecha mediana

F Devol Fecha/Hora Fecha mediana

TABLA DE USUARIOS
NOMBRE CAMPO TIPO DE DATOS TAMAÑO

Codigo Auto numérico

Nombre Texto 15

Apellidos Texto 25

DNI Texto 12

Domicilio Texto 50

Población Texto 30

Provincia Texto 20
F Nacim Fecha/Hora Fecha mediana

Máximo permitido Numérico Entero

EJERCICIO 3: INSERTAR DATOS EN LAS TABLAS


Inserta los datos en las tablas de forma que el resultado sea el siguiente:

Ejercicio 4: Modificar la definición de las tablas


Observando los datos, averigua:

Claves primarias

Claves ajenas

Valores no nulos (supondremos que una columna no admite nulos si en los datos
suministrados no hay ningún nulo en esa columna).

Modifica la definición de las tablas para incorporar esta información.


Ejercicios unidad 3: Consultas simples
Te aconsejamos que, para realizar consultas SQL más fácilmente, te hagas estas preguntas:

¿Dónde están los datos necesarios? La respuesta dará la FROM.

¿Qué columnas quiero que se visualicen en el listado? La respuesta dará la lista de selección
(SELECT).

¿Quiero que se ordenen por algún valor? Si la respuesta es sí, necesitarás utilizar ORDER BY.

¿Tienen que aparecer todas las filas del resultado? Si la respuesta es NO, deberás:

Utilizar TOP para quedarte con las N primeras.

Utilizar DISTINCT si no quieres que se muestren las repetidas.

O bien utilizar la cláusula WHERE para expresar la condición que deben cumplir para ser
mostradas.

Para realizar los ejercicios, deberás utilizar la base de datos GestionSimples, en la carpeta
Ejercicios del curso tienes el PDF Tablas_Gestion para consultar en qué tablas está cada
campo.

Ejercicio 1: Listas de selección


Listar todos los empleados.

Resultado:

Nume Nombre Eda Oficin Titulo Contrato Jefe Cuota ventas


n d a
101 Antonio 45 12 representa 1986-10- 104 30000, 30500,
Viguer nte 20 00 00
00:00:00.0
00
102 Alvaro 48 21 representa 1986-12- 108 35000, 47400,
Jaumes nte 10 00 00
00:00:00.0
00
103 Juan 29 12 representa 1987-03- 104 27500, 28600,
Rovira nte 01 00 00
00:00:00.0
00
104 José 33 12 dir ventas 1987-05- 106 20000, 14300,
Gonzále 19 00 00
z 00:00:00.0
00
105 Vicente 37 13 representa 1988-02- 104 35000, 36800,
Pantalla nte 12 00 00
00:00:00.0
00
106 Luis 52 11 director 1988-06- NUL 27500, 29900,
Antonio general 14 L 00 00
00:00:00.0
00
107 Jorge 49 22 representa 1988-11- 108 30000, 18600,
Gutiérre nte 14 00 00
z 00:00:00.0
00
108 Ana 62 21 dir ventas 1989-10- 106 35000, 36100,
Bustama 12 00 00
nte 00:00:00.0
00
109 María 31 NULL representa 1999-10- 106 3000,0 39200,
Santa nte 12 0 00
00:00:00.0
00
110 Juan 41 NULL representa 1990-01- 104 NULL 7600,0
Víctor nte 13 0
00:00:00.0
00
111 Juan 50 NULL representa 2005-05- NUL 10000, 60000,
Gris nte 01 L 00 00
00:00:00.0
00
112 Julián 50 NULL representa 2006-05- NUL 10000, 91000,
Martell nte 01 L 00 00
00:00:00.0
00
113 Juan 18 NULL representa 2007-01- NUL 10000, 0,00
Gris nte 01 L 00
00:00:00.0
00

Listar todos los empleados, al igual que en el ejercicio anterior, pero cambiando el nombre de
la columna contrato por fecha de contrato

Ejercicio 2: Utilizando ORDER BY


Listar de cada región las oficinas por orden de mejores ventas.

Resultado:

Región Ciudad Ventas


NULL Elx 0,00
NULL Valencia NULL
centro Aranjuez 15000,00
Centro Móstoles 0,00
centro Madrid NULL
este Alicante 73500,00
este Valencia 69300,00
este Castellón 36800,00
este Valencia 2100,00
este Valencia 0,00
norte Pamplona 200000,00
norte pamplona NULL
oeste Badajoz 84400,00
oeste A Coruña 18600,00

Saber los productos que tienen un precio superior o igual al precio de la mitad de los
productos.

Resultado:

Idfab Idproducto Descripción Precio existencias


rei 2a44l bomba l 45,00 12
rei 2a44r bomba r 45,00 12
imm 779c reóstato 3 18,75 0
imm 775c reóstato 2 14,25 5
imm 773c reóstato 9,75 28
bic 41003 manivela 6,52 3
imm 887x manivela 4,75 32
qsa xk47 red 3,55 38
rei 2a44g pas 3,50 14
fea 114 cubo 2,43 15
bic 41089 rodamiento 2,25 78
bic 41672 plato 1,80 0
fea 112 cubo 1,48 115
qsa xk48a red 1,48 37

EJERCICIO 2: Utilizando WHERE


Listar los empleados que tienen ventas pero que no han alcanzado su cuota.

Resultado:

Numemp Nombre Ventas cuota


104 José González 14300,00 20000,00
107 Jorge Gutiérrez 18600,00 30000,00

Hallar los empleados que no están a cargo del empleado 106

Resultado:
Numemp nombre
101 Antonio Viguer
102 Álvaro Jaumes
103 Juan Rovira
105 Vicente Pantalla
106 Luis Antonio
107 Jorge Gutiérrez
110 Juan Víctor
111 Juan Gris
112 Julián Martell
113 Juan Gris

Listar cada jefe su código y el Codigo y nombre de sus subordinados ordenados por nombres.

Resultado:

Jefe Numemp nombre


104 101 Antonio Viguer
104 103 Juan Rovira
104 110 Juan Víctor
104 105 Vicente Pantalla
106 108 Ana Bustamante
106 104 José González
106 109 María Santa
108 102 Álvaro Jaumes
108 107 Jorge Gutiérrez

EJERCICIOS UNIDAD 4: Consultas Multitabla

Para realizar los ejercicios, deberás utilizar la base de datos GestionSimples, en la carpeta
Ejercicios del curso tienes el PDF Tablas_Gestion para consultar en qué tablas está cada
campo.

Ejercicio 1: La composición de tablas

Listar todos los pedidos, mostrando el precio y la descripción del producto.

Resultado:

Codig Numpedid Fecha Clie Rep Fab Produc Cant Import Preci descripció
o o pedido to e o n

1 110036 1989-10-12 210 110 aci 4100z 9 22,50 NULL mont


00:00:00.00 7
0
2 110037 1989-10-12 211 106 rei 2a44l 7 31,50 45,00 bomba l
00:00:00.00 7
0

3 112963 2008-05-10 210 105 aci 41004 28 3,276 NULL art t4


00:00:00.00 3
0

4 112968 1990-01-11 210 101 aci 41004 34 39,78 NULL art t4


00:00:00.00 2
0

5 112975 2008-02-11 211 103 rei 2a44g 6 21,00 3,50 Pas


00:00:00.00 1
0

6 112979 1989-10-12 211 108 aci 4100z 6 150,00 NULL Mont


00:00:00.00 4
0

7 112983 2008-05-10 210 105 aci 41004 6 7,02 NULL art t4


00:00:00.00 3
0

8 112987 2008-01-01 210 105 aci 4100y 11 275,00 NULL Extractor


00:00:00.00 3
0

9 112989 2008-12-10 210 106 fea 114 6 14,58 2,43 Cubo


00:00:00.00 1
0

10 112992 1990-04-15 211 108 aci 41002 10 7,60 NULL Bisagra


00:00:00.00 8
0

11 112993 2008-03-10 210 102 rei 2a45c 24 18,96 0,79 Junta


00:00:00.00 6
0

12 112997 2008-04-04 212 107 bic 41003 1 6,52 6,52 Manivela


00:00:00.00 4
0

13 113003 2008-02-05 210 109 im 779c 3 56,25 18,75 reostato 3


00:00:00.00 8 m
0
14 113007 2008-01-01 211 108 im 773c 3 29,25 9,75 Reostato
00:00:00.00 2 m
0

15 113012 2008-05-05 211 105 aci 41003 35 37,45 NULL art t3


00:00:00.00 1
0

16 113013 2008-12-28 211 108 bic 41003 1 6,52 6,52 Manivela


00:00:00.00 8
0

17 113024 2008-07-04 211 108 qsa xk47 20 71,00 3,55 Red


00:00:00.00 4
0

18 113027 2008-02-05 210 105 aci 41002 54 450,00 NULL Bisagra


00:00:00.00 3
0

19 113034 2008-11-05 210 110 rei 2a45c 8 6,32 0,79 Junta


00:00:00.00 7
0

20 113042 2008-01-01 211 101 rei 2a44r 5 225,00 45,00 bomba r


00:00:00.00 3
0

21 113045 2008-07-02 211 110 rei 2a44r 10 450,00 45,00 bomba r


00:00:00.00 2
0

22 113048 2008-02-02 212 102 im 779c 2 37,50 18,75 reóstato 3


00:00:00.00 0 m
0

23 113049 2008-04-04 211 108 qsa xk47 2 7,76 3,55 Red


00:00:00.00 8
0

24 113051 2008-07-06 211 108 qsa xk47 4 14,20 3,55 Red


00:00:00.00 8
0

25 113055 2009-04-01 210 101 aci 4100x 6 1,50 NULL Junta


00:00:00.00 8
0
26 113057 2008-11-01 211 103 aci 4100x 24 NULL NULL Junta
00:00:00.00 1
0

27 113058 1989-07-04 210 109 fea 112 10 14,80 1,48 Cubo


00:00:00.00 8
0

28 113062 2008-07-04 212 107 bic 41003 10 24,30 6,52 Manivela


00:00:00.00 4
0

29 113065 2008-06-03 210 102 qsa xk47 6 21,30 3,55 Red


00:00:00.00 6
0

30 113069 2008-08-01 210 107 im 773c 22 313,50 9,75 Reóstato


00:00:00.00 9 m
0

Listar los pedidos superiores a 250 euros, incluyendo el nombre del vendedor que tomo el
pedido y el nombre del cliente que lo solicito.

Resultado:

Numpedido Fecha Clie Rep Fab Produc Cant Precio Cliente Vendedor
pedido to

112987 01/01/08 2103 105 aci 4100y 11 275,00 Jaime Vicente


Llorens Pantalla

113027 05/02/08 2103 105 aci 41002 54 450,00 Jaime Vicente


Llorens Pantalla

113045 02/07/08 2112 110 rei 2a44r 10 450,00 María Juan Víctor
Silva

113069 01/08/08 2109 107 im 773c 22 313,50 Alberto Jorge


m Juanes Gutiérrez

Listar los pedidos superiores a 250 euros, mostrando el nombre del cliente que solicito el
pedido y el nombre del vendedor asignado a ese cliente.

Resultado:
Codigo Numpedido Fechapedido Clie Rep Fab Producto Cant Importe Cliente Vendedor
asignado

8 112987 2008-01-01 2103 105 aci 4100y 11 275,00 Jaime Juan Víctor
00:00:00.000 Llorens

18 113027 2008-02-05 2103 105 aci 41002 54 450,00 Jaime Juan Víctor
00:00:00.000 Llorens

21 113045 2008-07-02 2112 110 rei 2a44r 10 450,00 María Ana


00:00:00.000 Silva Bustamante

30 113069 2008-08-01 2109 107 imm 773c 22 313,50 Alberto Juan Rovira
00:00:00.000 Juanes

Listar los pedidos superiores a 250 euros, mostrando además el nombre del cliente que solicitó
º el pedido y el nombre del vendedor asignado a ese cliente y la ciudad de la oficina donde el
vendedor trabaja.

Resultado:

Numpedido Clie Rep Cliente Repclie Vendedor asignado ciudad

112987 2103 105 Jaime Llorens 105 Juan Víctor NULL

113027 2103 105 Jaime Llorens 105 Juan Víctor NULL

113045 2112 110 María Silva 110 Ana Bustamante Badajoz

113069 2109 107 Alberto Juanes 107 Juan Rovira Alicante

Hallar los pedidos recibidos los días en que un nuevo empleado fue contratado.

Resultado:

Numpedido Fechapedido Rep Numemp Nombre Contrato

110036 1989-10-12 110 108 Ana 1989-10-12


00:00:00.000 Bustamante 00:00:00.000

110037 1989-10-12 106 108 Ana 1989-10-12


00:00:00.000 Bustamante 00:00:00.000

112979 1989-10-12 108 108 Ana 1989-10-12


00:00:00.000 Bustamante 00:00:00.000
Hallar los empleados que realizaron su primer pedido el mismo día que fueron contratados

Resultado:

Numemp Nombre Contrato Numpedido Rep Fechapedido

108 Ana 1989-10-12 112979 108 1989-10-12


Bustamante 00:00:00.000 00:00:00.000

Mostrar de cada empleado su código, nombre, ventas, oficina y ciudad en la que está ubicada
su oficina.

Resultado:

Numemp Nombre ventas Oficina Ciudad

101 Antonio Viguer 30500,00 12 Alicante

102 Álvaro Jaumes 47400,00 21 Badajoz

103 Juan Rovira 28600,00 12 Alicante

104 José González 14300,00 12 Alicante

105 Vicente Pantalla 36800,00 13 Castellón

106 Luis Antonio 29900,00 11 Valencia

107 Jorge Gutiérrez 18600,00 22 A Coruña

108 Ana Bustamante 36100,00 21 Badajoz

109 María santa 39200,00 NULL NULL

110 Juan Víctor 7600,00 NULL NULL

111 Juan Gris 60000,00 NULL NULL

112 Julián Martell 91000,00 NULL NULL

113 Juan Gris 0,00 NULL NULL

Listar los empleados con una cuota superior a la de su jefe, los campos a obtener son el
número, nombre y cuota del empleado y numero, nombre y cuota de su jefe.

Resultado:

Numemp Nombre Cuota Jefe Nombre jefe Cuota jefe

101 Antonio Viguer 30000,00 104 José González 20000,00


103 Juan Rovira 27500,00 104 José González 20000,00

105 Vicente Pantalla 35000,00 104 José González 20000,00

108 Ana Bustamante 35000,00 106 Luis Antonio 27500,00

Desde el entorno grafico cambia el empleado 111, asígnale el jefe 110 y la oficina 21.
Después cambia la sentencia anterior para que salgan también los empleados cuyo jefe no
tenga cuota.

Resultado:

Numemp Nombre Cuota Jefe Nombre jefe Cuota jefe

101 Antonio Viguer 30000,00 104 José González 20000,00

103 Juan Rovira 27500,00 104 José González 20000,00

105 Vicente Pantalla 35000,00 104 José González 20000,00

108 Ana Bustamante 35000,00 106 Luis Antonio 27500,00

111 Juan Gris 10000,00 110 Juan Víctor NULL

Listar los empleados que no están asignados a la misma oficina que su jefe, queremos número,
nombre y número de oficina tanto del empleado como de su jefe.

Resultado:

Numemp Nombre Oficina Jefe Nombre jefe Oficina jefe

104 José González 12 106 Luis Antonio 11

105 Vicente Pantalla 13 104 José González 12

107 Jorge Gutiérrez 22 108 Ana Bustamante 21

108 Ana Bustamante 21 106 Luis Antonio 11

En el punto anterior no salen los que no tienen oficina, cambiar la sentencia para que
aparezcan.

Resultado:

Numemp Nombre Oficina Jefe Nombre jefe Oficina jefe

104 José González 12 106 Luis Antonio 11

105 Vicente Pantalla 13 104 José González 12


107 Jorge Gutiérrez 22 108 Ana Bustamante 21

108 Ana Bustamante 21 106 Luis Antonio 11

109 María Santa NULL 106 Luis Antonio 11

110 Juan Victor NULL 104 José González 12

111 Juan Gris 21 110 Juan Víctor NULL

Lo mismo que la anterior pero queremos que aparezca también la ciudad de las oficinas (tanto
del empleado como de su jefe).

Resultado:

Numemp Nombre Oficina Ciudad Jefe Nombre jefe Oficina ciudad


jefe

104 José González 12 Alicante 106 Luis Antonio 11 Valencia

105 Vicente 13 Castellón 104 José González 12 Alicante


Pantalla

107 Jorge Gutiérrez 22 A Coruña 108 Ana 21 Badajoz


Bustamante

108 Ana 21 Badajoz 106 Luis Antonio 11 Valencia


Bustamante

109 María Santa NULL NULL 106 Luis Antonio 11 Valencia

110 Juan Víctor NULL NULL 104 José González 12 Alicante

111 Juan Gris 21 Badajoz 110 Juan Víctor NULL NULL

Ejercicio 2: comparar tablas

Obtener los empleados de GestionSimples que aparecen en Gestion con otra oficina.

El resultado será que no devuelve filas.

Ejercicios unidad 5: Consultas de resumen


Para realizar los ejercicios, deberás utilizar la base de datos GestionSimples.

Ejercicio 1: Funciones de agregado

¿Cuántas oficinas tenemos en Valencia?

Resultado:
Valencianas

Hallar cuantos pedidos hay de más de 250 euros.

Resultado:

Superiores a 250

¿Cuántos títulos (cargos) de empleados se usan?

Resultado:

Cuántos títulos

¿Entre que cuotas se mueven los empleados?

Resultado:

Cuota mínima Cuota máxima

3000,00 35000,00

EJERCICIO 2: Agrupamiento de filas: GROUP BY

De cada vendedor (todos) queremos saber su nombre y el importe total vendido. En caso de
que el importe sea NULL, cambiarlo por 0,00 con la función ISNULL ().

Resultado:

Numemp nombre Importe vendido

101 Antonio Viguer 266,28

102 Álvaro Jaumes 77,76

103 Juan Rovira 21,00

104 José González 0,00

105 Vicente Pantalla 772,746

106 Luis Antonio 46,08


107 Jorge Gutiérrez 344,32

108 Ana Bustamante 286,33

109 María Santa 71,05

110 Juan Víctor 478,82

111 Juan Gris 0,00

112 Julián Martell 0,00

113 Juan Gris 0,00

114 Pablo Moreno 0,00

De cada empleado, obtener el importe vendido a cada cliente.

Resultado:

Importe
Rep Cliente
vendido

106 2101 14,58

101 2102 39,78

105 2103 735,296

102 2106 40,26

110 2107 28,82

101 2108 1,50

109 2108 71,05

107 2109 313,50

103 2111 21,00

105 2111 37,45

108 2112 29,25

110 2112 450,00

101 2113 225,00

108 2114 221,00


106 2117 31,50

108 2118 36,08

102 2120 37,50

107 2124 30,82

Repetir la consulta anterior pero ahora deben aparecer también los empleados que no han
vendido nada.

Resultado:

Rep Cliente Importe vendido

101 2102 39,78

101 2108 1,50

101 2113 225,00

102 2106 40,26

102 2120 37,50

103 2111 21,00

104 NULL NULL

105 2103 735,296

105 2111 37,45

106 2101 14,58

106 2117 31,50

107 2109 313,50

107 2124 30,82

108 2112 29,25

108 2114 221,00

108 2118 36,08

109 2108 71,05

110 2107 28,82


110 2112 450,00

111 NULL NULL

112 NULL NULL

113 NULL NULL

114 NULL NULL

Repetir la consulta pero ahora debe aparecer también el total de cuanto ha vendido cada
empleado. ( recuerda una opción de la cláusula GROUP BY)

Resultado:

rep clie Importe vendido

NULL NULL 2364,386

101 NULL 266,28

101 2102 39,78

101 2108 1,50

101 2113 225,00

102 NULL 77,76

102 2106 40,26

102 2120 37,50

103 NULL 21,00

103 2111 21,00

104 NULL NULL

104 NULL NULL

105 NULL 772,746

105 2103 735,296

105 2111 37,45

106 NULL 46,08

106 2101 14,58


106 2117 31,50

107 NULL 344,32

107 2109 313,50

107 2124 30,82

108 NULL 286,33

108 2112 29,25

108 2114 221,00

108 2118 36,08

109 NULL 71,05

109 2108 71,05

110 NULL 478,82

110 2107 28,82

110 2112 450,00

111 NULL NULL

111 NULL NULL

112 NULL NULL

112 NULL NULL

113 NULL NULL

113 NULL NULL

114 NULL NULL

114 NULL NULL

En los resultados anteriores no se distinguen bien las líneas que corresponden a totales.
Modificar la consulta para obtener este resultado.

Agrupa Agrupa
Rep Clie Importe vendido Clie Numemp

NULL NULL 2364,386 1 1


101 NULL 266,28 1 0

101 2102 39,78 0 0

101 2108 1,50 0 0

101 2113 225,00 0 0

102 NULL 77,76 1 0

102 2106 40,26 0 0

102 2120 37,50 0 0

103 NULL 21,00 1 0

103 2111 21,00 0 0

104 NULL NULL 0 0

104 NULL NULL 1 0

... .... ... (sigue) ... ...

Ahora modifica la consulta para que las filas de totales aparezcan más claras. (recuerda la
función CASE)

Resultado:

Agrupa
Rep Clie Importe vendido Agrupa Clie
Numemp

NULL NULL 2364,386 Total empleado Total final

101 NULL 266,28 Total empleado

101 2102 39,78

101 2108 1,50

101 2113 225,00

102 NULL 77,76 Total empleado

102 2106 40,26

102 2120 37,50

103 NULL 21,00 Total empleado


103 2111 21,00

104 NULL NULL

104 NULL NULL Total empleado

... .... ... (sigue) ... ...

Ahora coloca las columnas agrupa delante de las demás columnas:

Resultado:

Agrupa
Agrupa Clie Rep Clie Importe vendido
Numemp

Total final Total empleado NULL NULL 2364,386

Total empleado 101 NULL 266,28

101 2102 39,78

101 2108 1,50

101 2113 225,00

Total empleado 102 NULL 77,76

102 2106 40,26

102 2120 37,50

Total empleado 103 NULL 21,00

103 2111 21,00

104 NULL NULL

Total empleado 104 NULL NULL

... (sigue) ... ... .... ...

Ahora queremos que “total empleado” aparezca en la columna Clie. Piensa primero en cuantas
columnas quieres y luego en cada columna que tiene que salir.

Resultado:

Agrupa
Numemp Clie Importe vendido
Numemp
Total final NULL Total empleado 2364,386

101 Total empleado 266,28

101 2102 39,78

101 2108 1,50

101 2113 225,00

102 Total empleado 77,76

102 2106 40,26

102 2120 37,50

103 Total empleado 21,00

103 2111 21,00

104 NULL NULL

104 Total empleado NULL

... (sigue) ... .... ...

El empleado 104 (y otros) no ha vendido a nadie y por eso sale en la columna Clie la palabra
NULL, queremos que estos casos no aparezca nada (se deje en blanco), y el importe si es NULL
que salga un cero.

Resultado:

Agrupa
Numemp Clie Importe vendido
Numemp

Total final NULL Total empleado 2364,386

101 2102 39,78

101 2108 1,50

101 2113 225,00

101 Total empleado 266,28

102 2106 40,26

102 2120 37,50

102 Total empleado 77,76


103 2111 21,00

103 Total empleado 21,00

104 0,00

104 Total empleado 0,00

... (sigue) ... .... ...

Lo rematamos par que el resultado quede asi.

Numemp Clie Importe vendido

Total final ... ... 2364,386

101 2102 39,78

101 2108 1,50

101 2113 225,00

101 Total empleado 266,28

102 2106 40,26

102 2120 37,50

102 Total empleado 77,76

103 2111 21,00

103 Total empleado 21,00

104 0,00

104 Total empleado 0,00

... (sigue) ... .... ...

Ejercicios unidad 6: las subconsultas

Para realizar los ejercicios, deberás utilizar la base de datos GestionSimples.

1. Listar los clientes (numclie, nombre) asignados a Juan que no han remitido un pedido
superior a 300 euros.

numclie nombre
2107 Julián
López
2107 Julián
López
2121 Vicente
Ríos
2125 Pepito
Grillo

Listar los empleados (Numemp, nombre) mayores de 40 años que dirigen a un vendedor con
superávit (ha venido más que su cuota).
Numemp Nombre
106 Luis Antonio

108 Ana
Bustamante
110 Juan Víctor

Listar los empleados (código de empleado) cuyo importe de pedido medio para productos
fabricados por ACI es superior al importe medio global (de todos los pedidos de todos los
empleados).
Rep
105

Listar los empleados (Numemp, nombre, ventas) cuyas ventas son iguales o superiores al
objetivo de las oficinas de una determinada ciudad (de todas las oficinas de esa ciudad). Las
oficinas con objetivo nulo no se deben de tener en cuenta (como si no existiesen). Y si no hay
oficinas en la ciudad no queremos que salga ningún empleado. Intentar primero resolver la
consulta utilizando >=ALL.

Probar primero con A Coruña:

Numemp nombre ventas


102 Álvaro Jaumes 47400,00
111 Juan Gris 60000,00
112 Julián Martell 91000,00

Ahora con pamplona. Pamplona tiene una oficina con objetivo nulo, en este caso no queremos
que esa oficina cuente.

numemp nombre Ventas


101 Antonio Viguer 30500,00
102 Álvaro Jaumes 47400,00
103 Juan Rovira 28600,00
105 Vicente Pantalla 36800,00
106 Luis Antonio 29900,00
108 Ana Bustamante 36100,00
109 María Santa 39200,00
111 Juan Gris 60000,00
112 Julián Martell 91000,00
114 Pablo Moreno 37000,00

Para Barcelona. En este caso no tenemos oficinas en Barcelona por lo que no tiene que salir
ningún empleado.

Ahora para Madrid. Como en Madrid sólo hay una oficina y no tiene objetivo no tiene que salir
ningún empleado.

Intentar resolver la consulta sin utilizar ALL.

5. Listar las oficinas en donde todos los empleados tienen ventas que superan al 50% del
objetivo de la oficina.

oficina ciudad
11 Valencia
13 Castellón
22 A Coruña

EJERCICIOS UNIDAD 7: Actualización de datos (1)

Para realizar los ejercicios, deberás utilizar la base de datos Gestion8.

1. Añadir a la oficina 40 otro empleado, Luis Valverde, con número de empleado 436, con los
mismos datos que el anterior pero su jefe será el director de la oficina 40 (no sabemos qué
número tiene).

2. Pasar los pedidos de octubre 1989 a diciembre 2008. (3 filas afectadas)

3. Queremos actualizar el importe de los pedidos del mes actual con el precio almacenado en
la tabla productos.
Ayuda: En un primer paso obtener los pedidos del mes actual obteniendo también el precio
unitario dentro del pedido y el precio del producto de la tabla de productos.

código Numpedido Fechapedido Cant importe precio precio


pedido
1 110036 2008-12-12 9 22,50 2,50 NULL
00:00:00.000
2 110037 2008-12-12 7 31,50 4,50 45,00
00:00:00.000
6 112979 2008-12-12 6 150,00 25,00 NULL
00:00:00.000
9 112989 2008-12-10 6 14,58 2,43 2,43
00:00:00.000
16 113013 2008-12-28 1 6,52 6,52 5,16
00:00:00.000

Actualizar después la tabla de pedidos cambiando los importes para que el precio unitario
corresponda con el precio del producto. Los pedidos de los productos que no tienen precio se
quedarán como estaban. (3 filas afectadas).

código Numpedido Fechapedido Cant importe precio Precio


pedido
1 110036 2008-12-12 9 22,50 2,50 NULL
00:00:00.000
2 110037 2008-12-12 7 315,00 4,50 45,00
00:00:00.000
6 112979 2008-12-12 6 150,00 25,00 NULL
00:00:00.000
9 112989 2008-12-10 6 14,58 2,43 2,43
00:00:00.000
16 113013 2008-12-28 1 5,16 6,52 5,16
00:00:00.000

Se ven algunos productos que no tienen precio, ahora vamos a actualizar el precio de estos
productos con el precio medio utilizado en los pedidos donde aparecen.
Ayuda: Primero sacamos los productos que queremos actualizar con los pedidos
correspondientes:

Idfab Idproducto precio código Numpedido Fechapedido importe precio


pedido
Aci 41001 NULL NULL NULL NULL NULL NULL
Aci 41002 NULL 10 112992 1990-04-15 7,60 0,76
20:00:00.000
Aci 41002 NULL 18 113027 2008-02-05 450,00 8,3333
00:00:00.000
Aci 41003 NULL 15 113012 2008-05-05 37,45 1,07
00:00:00.000
Aci 41004 NULL 3 112963 2008-05-10 3,276 0,117
00:00:00.000
Aci 41004 NULL 4 112968 1990-01-11 39,78 1,17
00:00:00.000
Aci 41004 NULL 7 112983 2008-05-10 7,02 1,17
00:00:00.000
Aci 4100x NULL 25 113055 2009-04-01 1,50 0,25
00:00:00.000
Aci 4100x NULL 26 113057 2008-11-01 NULL NULL
00:00:00.000
aci 4100y NULL 8 112987 2008-01-01 275,00 25,00
00:00:00.000
aci 4100z NULL 1 110036 2008-12-12 22,50 2,50
00:00:00.000
aci 4100z NULL 6 112979 2008-12-12 150,00 25,00
00:00:00.000

Vemos que el producto ACI 41001 no se podrá actualizar porque no tiene pedidos. Pero los
demás se actualizarán con el precio medio de sus pedidos, deberán quedar así (7 filas
afectadas):

Idfab Idproducto precio

aci 41001 NULL

aci 41002 4,55

aci 41003 1,07

aci 41004 0,82

aci 4100x 0,25 *

aci 4100y 25,00

aci 4100z 13,75


EJERCICIOS UNIDAD 7: Actualización de datos (2)

5. Eliminar los pedidos del representante Luis Antonio. (2 filas afectadas)

6. Eliminar las oficinas que no tengan empleados. (11 filas afectadas)

7. Intenta eliminar el empleado 102. Te saldrá un error : "Instrucción DELETE en conflicto


con la restricción..."

Reflexiona sobre el error y elabora una consulta que liste los empleados que pueden dar
problemas (aquí no se trata de utilizar operaciones aprendidas en este tema sino de practicar la
integridad referencial y de paso recordar instrucciones vistas en temas anteriores).

Elabora ahora una consulta que liste los que se pueden borrar sin problemas, estos son:

Numemp
112
113
114
115
436

Borra el primero de la lista, éste sí lo puedes borrar.

8. Eliminar los pedidos de productos de ACI cuyo precio de venta en el pedido no corresponda
con el precio unitario del producto de la tabla de productos. (4 filas afectadas)

9. Ahora vamos a recuperar las tablas tal cual estaban al principio, para ello utilizaremos las
copias realizadas al principio de Nueva oficinas, etc.

Lo más cómodo será vaciar las tablas y rellenarlas de nuevo con los datos de las tablas
Nueva...
Pero como las tablas tienen claves ajenas y la tabla de pedidos un campo de identidad, lo
tendrás que hacer de forma que no dé error.
Al final las tablas pedidos, clientes,... deben tener los mismos datos que Nueva Pedidos, Nueva
Clientes...

Empieza por eliminar los datos de las tablas.


Ayuda: Recuerda el campo de identidad (Codigo) que tenemos en la tabla de pedidos, cuando
insertemos las filas deberá empezar otra vez por el valor 1, para poder eliminar todas las filas
igual tienes que eliminar algunos valores (por lo de la integridad referencial), hazlo siempre con
SQL.

Inserta los datos de las tablas Nueva.. a las tablas normales.


Ayuda: Necesitarás una o varias instrucciones por cada tabla (recuerda las reglas de
integridad referencial), en algunos casos las filas se tendrán que rellenar en varios pasos, y el
orden en que rellenes las tablas también es importante.

Ejercicios unidad 8: El DDL, Lenguaje de Definición de Datos


1. Crea una nueva base de datos Gestion2, los archivos físicos se llamarán
también Gestion2 y se creará en la misma carpeta que la base de datos Gestion.
2. En Gestion2, crea las mismas tablas que tenemos en Gestion con las mismas relaciones
entre ellas. Este ejercicio se resuelve con varias sentencias.

3. La tabla Productos de Gestion2 consideramos que sufre pocas operaciones de nuevos


registros o eliminación de registros y el único campo que sufre actualizaciones frecuentes es el
campo existencias; por otro lado es frecuente consultar los productos por el campo descripcion
(aunque varios productos puedan tener la misma descripción). ¿Se podría mejorar la base de
datos? Si es que sí indica de qué forma y escribe la instrucción correspondiente; en cualquier
caso justifica la respuesta.

4. ¿Qué se puede hacer para que no puedan existir en la tabla de clientes dos clientes con el
mismo nombre?

5. En nuestro sistema vamos a efectuar muchas consultas recuperando a la vez los pedidos y
los productos asociados a cada uno de ellos, por eso sería bueno…. Completa la frase y
escribe la sentencia SQL correspondiente.

6. Elimina la tabla clientes dejando en pedidos el campo cliente a NULL. Este ejercicio se
resuelve con varias sentencias y se puede resolver de varias maneras. Resuélvelo de distintas
formas.

7. Ahora queremos permitir que dos clientes tengan el mismo nombre.

8. Elimina la base de datos Gestion2, así podrás volver a hacer los ejercicios.

Ejercicios unidad 9: Programación en TRANSACT SQL


Nota: Para realizar los ejercicios, utiliza Gestion10 que has creado en los ejercicios paso a
paso de este tema.

1. Añadir a la tabla de productos un campo Stock Minimo, y rellenarlo de tal forma que el stock
mínimo valorado de cada artículo sea de 100€. El stock mínimo valorado es el resultado de
multiplicar el stock mínimo por el precio del producto. No hace falta incluir estas sentencias en
un procedimiento ya que sólo nos sirven para preparar la tabla productos pero redactarlas en
Transact-SQL para repasar temas anteriores.
Seguidamente, escribir un procedimiento que se pueda ejecutar en cualquier momento y que
actualice una lista de productos bajo stock. Esta lista se guarda en una tabla Productos A
Pedir y contiene el código completo del producto, su descripción, existencias y cantidad a pedir
(para que el producto supere en 5 unidades su stock mínimo). Si un producto bajo mínimo
(cuyas existencias no llegan al stock mínimo) no está en esa tabla, insertarlo, si está actualizar
el campo Cantidad A Pedir, y si ya no está bajo mínimo y está en la tabla, eliminar el registro
de ProductosAPedir.

2. Obtener un listado de las oficinas de una determinada región con ventas superiores a un
determinado importe.

3. Crea un nuevo procedimiento parecido al anterior pero que nos devuelva también el número
de oficinas recuperadas. Utilizar un parámetro de salida.

4. Crea un nuevo procedimiento parecido al anterior pero que nos devuelva también el número
de oficinas recuperadas. Sin utilizar parámetros de salida.

5. Crea un procedimiento que muestre los n productos más caros, n es un valor que se
indicará en la llamada.
6. Crea otro procedimiento que muestre los n productos más caros con empates y nos
devuelva cuántos hay.

7. No dejar eliminar productos que tengan existencias.

8. Hacer que no se pueda insertar un pedido si no hay suficiente stock.

9. Crea un procedimiento que impida eliminar varias oficinas en una sóla operación DELETE.

Prueba evaluativa unidad 9: Programación en TRANSACT


SQL
Sólo una respuesta es válida por pregunta. Haz clic en la respuesta que consideres
correcta.
Contesta todas las preguntas y haz clic en el botón Corregir para ver la solución.
Si pulsas Restablecer podrás repetir la evaluación.

1. Existen dos tipos de procedimientos: los del sistema (que se encuentran en la base
master) y los del usuario (los que creamos).

a) Verdadero.

b) Falso.

2. El ámbito de un procedimiento puede ser local o global.

a) Verdadero.

b) Falso.

3. Para eliminar un procedimiento utilizaremos:

a) DROP PROC.

b) DROP PROCEDURE.

c) A y B son ciertas.

d) A y B son falsas.

4. Los procedimientos pueden contener:

a) Parámetros de entrada.

b) Parámetros de salida.

c) A y B son ciertas.

d) A y B son falsas.
5. Un procedimiento puede contener bucles, condiciones y control de excepciones.

a) Verdadero.

b) Falso.

6. Cuál de las siguientes cláusulas no es un tipo de desencadente:

a) FOR.

b) WAITFOR.

c) AFTER.

d) INSTEAD OF.

7. Para evitar que se borren registros en una tabla al lanzar una sentencia DELETE,
utilizamos:

a) FOR.

b) WAITFOR.

c) AFTER.

d) INSTEAD OF.

8. Cuando lanzamos un trigger sobre una sentencia UPDATE:

a) Deberemos trabajar con los datos de la tabla Updated.

b) Deberemos trabajar con los datos de las tablas Deleted e Inserted.

c) A y B son ciertas.

d) A y B son falsas.

9. Cuál de los triggers siguientes sería posible realizar:

a) Sobre una cláusula ALTER DATABASE.

b) Sobre una cláusula CREATE INDEX.

c) Sobre un ALTER TABLE que pretenda insertar una columna (ADD).

d) Sobre un ALTER TABLE que pretenda cambiar el nombre de una


columna.

10. En un trigger, DROP y DISABLE se distinguen en que:


a) DROP lo elimina permanentemente y DISABLE lo desactiva
temporalmente.

b) DISABLE lo elimina permanentemente y DROP lo desactiva


temporalmente

Unidad 2: Introducción al SQL. Transact-SQL (I)


2.1. Conceptos básicos de SQL
SQL (Structured Query Language), Lenguaje Estructurado de Consulta es el lenguaje
utilizado para definir, controlar y acceder a los datos almacenados en una base de datos
relacional.

Como ejemplos de sistemas gestores de bases de datos que utilizan SQL podemos citar
DB2, SQL Server, Oracle, MySql, Sybase, PostgreSQL o Access.

El SQL es un lenguaje universal que se emplea en cualquier sistema gestor de bases de


datos relacional. Tiene un estándar definido, a partir del cual cada sistema gestor ha
desarrollado su versión propia.

En SQL Server la versión de SQL que se utiliza se llama TRANSACT-SQL.

EL SQL en principio es un lenguaje orientado únicamente a la definición y al acceso a los


datos por lo que no se puede considerar como un lenguaje de programación como tal ya
que no incluye funcionalidades como son estructuras condicionales, bucles, formateo de la
salida, etc. (aunque veremos que esto está evolucionando).

Se puede ejecutar directamente en modo interactivo, pero también se suele emplear


embebido en programas escritos en lenguajes de programación convencionales. En estos
programas se mezclan las instrucciones del propio lenguaje (denominado anfitrión) con
llamadas a procedimientos de acceso a la base de datos que utilizan el SQL como
lenguaje de acceso. Como por ejemplo en Visual Basic, Java, C#, PHP .NET, etc.

Las instrucciones SQL se clasifican según su propósito en tres grupos:

El DDL (Data Description Language) Lenguaje de Descripción de Datos.

El DCL (Data Control Language) Lenguaje de Control de Datos.

El DML (Data Manipulation Language) Lenguaje de Manipulación de Datos.

El DDL, es la parte del SQL dedicada a la definición de la base de datos, consta de


sentencias para definir la estructura de la base de datos, permiten crear la base de datos,
crear, modificar o eliminar la estructura de las tablas, crear índices, definir reglas de
validación de datos, relaciones entre las tablas, etc. Permite definir gran parte del nivel
interno de la base de datos. Por este motivo estas sentencias serán utilizadas
normalmente por el administrador de la base de datos.

El DCL (Data Control Language) se compone de instrucciones que permiten:

Ejercer un control sobre los datos tal como la asignación de privilegios de acceso a los
datos (GRANT/REVOKE).

La gestión de transacciones (COMMIT/ROLLBACK).


Una transacción se puede definir como un conjunto de acciones que se tienen que realizar
todas o ninguna para preservar la integridad de la base de datos.
Por ejemplo supongamos que tenemos una base de datos para las reservas de avión.
Cuando un usuario pide reservar una plaza en un determinado vuelo, el sistema tiene que
comprobar que queden plazas libres, si quedan plazas reservará la que quiera el usuario
generando un nuevo billete y marcando la plaza como ocupada. Aquí tenemos un proceso
que consta de dos operaciones de actualización de la base de datos (crear una nueva fila
en la tabla de billetes y actualizar la plaza reservada en el vuelo, poniéndola como
ocupada) estas dos operaciones se tienen que ejecutar o todas o ninguna, si después de
crear el billete no se actualiza la plaza porque se cae el sistema, por ejemplo, la base de
datos quedaría en un estado inconsistente ya que la plaza constaría como libre cuando
realmente habría un billete emitido para esta plaza. En este caso el sistema tiene el
mecanismo de transacciones para evitar este error. Las operaciones se incluyen las dos
en una misma transacción y así el sistema sabe que las tiene que ejecutar las dos, si por
lo que sea no se pueden ejecutar las dos, se encarga de deshacer los cambios que se
hubiesen producido para no ejecutar ninguna.

Las instrucciones que gestionan las autorizaciones serán utilizadas normalmente por
el administrador mientras que las otras, referentes a proceso de transacciones serán
utilizadas también por los programadores.

No todos los sistemas disponen de ellas.

El DML se compone de las instrucciones para el manejo de los datos, para insertar
nuevos datos, modificar datos existentes, para eliminar datos y la más utilizada, para
recuperar datos de la base de datos. Veremos que una sola instrucción de recuperación
de datos es tan potente que permite recuperar datos de varias tablas a la vez, realizar
cálculos sobre estos datos y obtener resúmenes.

El DML interactúa con el nivel externo de la base de datos por lo que sus instrucciones
son muy parecidas, por no decir casi idénticas, de un sistema a otro, el usuario sólo indica
lo que quiere recuperar no cómo se tiene que recuperar, no influye el cómo están
almacenados los datos.

Es el lenguaje que utilizan los programadores y los usuarios de la base de datos. A lo


largo del curso se explicarán cada una de las formas de explotación de la base de datos.
Dependiendo de tu perfil profesional (programador o administrador) o de tu interés
personal te resultará más útil un bloque u otro.

2.2. Introducción al TRANSACT-SQL


Como hemos dicho, el sistema gestor de base de datos SQL-Server 2005 utiliza su propia
versión del lenguaje SQL, el TRANSACT-SQL.

TRANSACT-SQL es un lenguaje muy potente que nos permite definir casi cualquier tarea
que queramos efectuar sobre la base de datos. En este tema veremos que TRANSACT-
SQL va más allá de un lenguaje SQL cualquiera ya que incluye características propias de
cualquier lenguaje de programación, características que nos permiten definir la lógica
necesaria para el tratamiento de la información:

Tipos de datos.

Definición de variables.

Estructuras de control de flujo.

Gestión de excepciones.

Funciones predefinidas.
Sin embargo no permite:

Crear interfaces de usuario

Crear aplicaciones ejecutables, sino elementos que en algún momento llegarán al servidor
de datos y serán ejecutados.

Debido a estas restricciones se emplea generalmente para crear procedimientos


almacenados, trigger y funciones de usuario.

Puede ser utilizado como cualquier SQL como lenguaje embebido en aplicaciones
desarrolladas en otros lenguajes de programación como Visual Basic, C, Java, etc. Y por
supuesto los lenguajes incluidos en la plataforma .NET.

También lo podremos ejecutar directamente de manera interactiva, por ejemplo desde el


editor de consultas de SSMS (SQL Server Management Studio) el entorno de gestión que
ya conocemos. Esta es la forma en que lo utilizaremos nosotros.

Unidad 2. Introducción al SQL. Transact-SQL (II)


2.3. Características generales del lenguaje Transact-SQL
El lenguaje SQL se creó con la finalidad de ser un lenguaje muy potente y a la vez muy
fácil de utilizar, se ha conseguido en gran medida ya que con una sola frase (instrucción)
podemos recuperar datos complejos (por ejemplo datos que se encuentran en varias
tablas, combinándolos, calculando resúmenes), y utilizando un lenguaje muy cercano al
lenguaje hablado (¡suponiendo que hablamos inglés, claro!).

Por ejemplo:

SELECT codigo, nombre FROM Clientes WHERE localidad=’Valencia’;

Esta instrucción nos permite SELECCIONAR el código y nombre DE los Clientes CUYA
localidad sea Valencia.

La sencillez también radica en que lo que indicamos es lo que queremos obtener, no el


cómo lo tenemos que obtener, de eso se encargará el sistema automáticamente.

Las sentencias SQL además siguen todo el mismo patrón:

Empiezan por un verbo que indica la acción a realizar,

completado por el objeto sobre el cual queremos realizar la acción,

seguido de una serie de cláusulas (unas obligatorias, otras opcionales) que completan la
frase, y proporcionan más detalles acerca de lo que se quiere hacer.

Si sabemos algo de inglés nos será más fácil interpretar a la primera lo que quiere decir la
instrucción, y de lo contrario, como el número de palabras que se emplean es muy
reducido, enseguida nos las aprenderemos.

Por ejemplo en el DDL (acciones sobre la definición de la base de datos), tenemos 3


verbos básicos:

CREATE (Crear)

DROP (Eliminar)

ALTER (Modificar)
Completados por el tipo de objeto sobre el que actúan y el objeto concreto:

CREATE DATABASE mibase.......;

Permite crear una base de datos llamada mibase, a continuación escribiremos las demás
cláusulas que completarán la acción, en este caso dónde se almacenará la base de datos,
cuánto ocupará, etc...

CREATE TABLE mitabla (.....);

Permite crear una nueva tabla llamada mitabla, entre paréntesis completaremos la acción
indicando la definición de las columnas de la tabla.

CREATE INDEX miindex...;

Lo mismo para crear un índice (¿a que lo habíais adivinado?).

DROP DATABASE mibase;

Permite borrar, eliminar la base de datos mibase.

DROP TABLE mitabla;

Elimina la tabla mitabla.

ALTER TABLE mitabla.....;

Permite modificar la definición de la tabla mitabla.

En el DML (acciones sobre los datos almacenados) utilizaremos los verbos

INSERT (Crear, es decir, insertar una nueva fila de datos)

DELETE (Eliminar filas de datos)

UPDATE (Modificar filas de datos)

SELECT (Seleccionar, obtener)

Por ejemplo:

INSERT INTO mitabla ..... Inserta nuevas filas en mitabla

DELETE FROM mitabla Eliminar filas de mitabla

UPDATE mitabla ....... Actualiza filas de mitabla

Como ejemplo de cláusula dentro de una instrucción tenemos:

SELECT codigo, nombre


FROM Clientes
WHERE localidad=’Valencia’;

En esta sentencia nos aparecen dos cláusulas, la cláusula FROM que nos permite indicar
de dónde hay que coger los datos y la cláusula WHERE que permite indicar una condición
de selección.

Otra característica de una sentencia SQL es que acaba con un punto y


coma (;) originalmente éste era obligatorio y servía para indicar el fin de la instrucción,
pero ahora se puede omitir, aunque se recomienda su uso.
En una sentencia utilizaremos palabras reservadas (las fijas del lenguaje), y
nombres de objetos y variables (identificadores).
Las palabras reservadas no se pueden utilizar para otro propósito, por ejemplo una tabla
no se puede llamar FROM, y los nombres (los identificadores) siguen las reglas detalladas
en el punto siguiente.

Nombres cualificados. En ocasiones deberemos utilizar nombres cualificados, por


ejemplo cuando se escribe un nombre de tabla, SQL presupone que se está refiriendo a
una de las tablas de la base de datos activa, si queremos hacer referencia a una tabla de
otra base de datos utilizamos su nombre
cualificado nombrebasedatos.nombredeesquema.nombretabla, utilizamos el punto para
separar el nombre del objeto y el nombre de su contenedor.

O por ejemplo si en una consulta cuyo origen son dos tablas, queremos hacer referencia a
un campo y ese nombre de campo es un nombre de campo en las dos tablas, pues
utilizaremos su nombre cualificado nombretabla.nombrecampo.

El valor NULL.

Puesto que una base de datos es un modelo de una situación del mundo real, ciertos
datos pueden inevitablemente faltar, ser desconocidos o no ser aplicables, esto se debe
de indicar de alguna manera especial para no confundirlo con un valor conocido pero que
sea cero por ejemplo, SQL tiene para tal efecto el valor NULL que indica precisamente la
ausencia de valor.

Por ejemplo: no es lo mismo que el alumno no tenga nota a que tenga la nota cero, esto
afectaría también a todos los cálculos que se pueden realizar sobre la columna nota.

Unidad 2. Introducción al SQL. Transact-SQL (III)


2.4. Reglas de formato de los identificadores
Los identificadores son los nombres de los objetos de la base de datos. Cualquier
elemento de Microsoft SQL Server 2005 puede tener un identificador: servidores, bases
de datos, tablas, vistas, columnas, índices, desencadenadores, procedimientos,
restricciones, reglas, etc.

Las reglas de formato de los identificadores normales dependen del nivel de


compatibilidad de la base de datos, que se establecía con el parámetro sp_dbcmptlevel
pero que ahora Microsoft aconseja no utilizar ya que desaparecerá en versiones
posteriores en vez de eso se tiene que utilizar la cláusula SET COMPATIBILITY_LEVEL
de la instrucción ALTER TABLE. Cuando el nivel de compatibilidad es 90, (el asignado por
defecto) se aplican las reglas siguientes para los nombres de los identificadores:

No puede ser una palabra reservada.

El nombre debe tener entre 1 y 128 caracteres, excepto para algunos tipos de objetos en
los que el número es más limitado.

El nombre debe empezar por:

Una letra, como aparece definida por el estándar Unicode 3.2. La definición Unicode de
letras incluye los caracteres latinos de la "a" a la "z" y de la "A" a la "Z".

El carácter de subrayado ( _ ), arroba ( @ ) o número ( # ).

Ciertos símbolos al principio de un identificador tienen un significado especial en SQL


Server. Un identificador que empieza con el signo de arroba indica un parámetro o una
variable local. Un identificador que empieza con el signo de número indica una tabla o
procedimiento temporal. Un identificador que empieza con un signo de número doble (##)
indica un objeto temporal global.

Algunas funciones de Transact-SQL tienen nombres que empiezan con un doble signo de
arroba (@@). Para evitar confusiones con estas funciones, se recomienda no utilizar
nombres que empiecen con @@.

No se permiten los caracteres especiales o los espacios incrustados.

Si queremos utilizar un nombre que no siga estas reglas, normalmente para poder incluir
espacios en blanco, lo tenemos que escribir encerrado entre corchetes [ ] (también se
pueden utilizar las comillas pero recomendamos utilizar los corchetes).

2.5. Tipos de datos


En SQL Server 2005, cada columna, expresión, variable y parámetro está asociado a un
tipo de datos.
Un tipo de datos, realmente define el conjunto de valores válidos para los campos
definidos de ese tipo. Indica si el campo puede contener: datos numéricos, de caracteres,
moneda, fecha y hora, etc.

SQL Server proporciona un conjunto de tipos de datos del sistema que define todos los
tipos de datos que pueden utilizarse. También podemos definir nuestros propios tipos de
datos en Transact-SQL o Microsoft .NET Framework.

Los tipos de datos más utilizados son:

Los numéricos: int, decimal, money

Los de fecha y hora: datetime

Y las cadenas de caracteres: varchar

Si quieres conocer todos los tipos de datos disponibles en SQLServer 2005, visita el
siguiente avanzado .

2.6. Las constantes


Una constante es un valor específico o un símbolo que representa un valor de dato
específico. El formato de las constantes depende del tipo de datos del valor que
representan. En este apartado veremos las más utilizadas.

Las constantes numéricas se escriben mediante una cadena de números, con la


consideración de que el separador decimal es un punto, no una coma, y que si se trata de
un valor monetario deberemos incluir la moneda al inicio de la constante. Por
ejemplo: 85.90 y €85.90, el primero sería un valor decimal y el segundo un valor money.
De forma predeterminada, los valores serán positivos. Para indicar lo contrario escribimos
el signo - al principio.

Las constantes de fecha y hora van entre comillas simples y con un formato de fecha y
hora adecuado. Por ejemplo: '03/10/90'.

Y las constantes en cadenas de caracteres van entre comillas simples. Por


ejemplo: 'Juan García López'.

Para indicar valores negativos y positivos añadimos el prefijo + o - según sea el valor
positivo o negativo. Sin prefijo se entiende que el valor es positivo.

Si quieres ver cómo definir constantes para otros tipos de datos, visita el siguiente
avanzado.
Unidad 2. Introducción al SQL. Transact-SQL (IV)
2.7. Las expresiones
Una expresión es una combinación de símbolos y operadores que el motor de base de
datos de SQL Server evalúa para obtener un único valor. Una expresión simple puede ser
una sola constante, variable, columna o función escalar. Los operadores se pueden usar
para combinar dos o más expresiones simples y formar una expresión compleja.
Dos expresiones pueden combinarse mediante un operador si ambas tienen tipos de
datos admitidos por el operador y se cumple al menos una de estas condiciones:

Las expresiones tienen el mismo tipo de datos.

El tipo de datos de menor prioridad se puede convertir implícitamente al tipo de datos de


mayor prioridad.

La función CAST puede convertir explícitamente el tipo de datos con menor prioridad al
tipo de datos con mayor prioridad o a un tipo de datos intermedio que pueda convertirse
implícitamente al tipo de datos con la mayor prioridad.

Tipos de operadores:

Operadores numéricos:

suma +
resta -
multiplicación *
división /
módulo %
(resto de una división)

Operadores bit a bit: realizan manipulaciones de bits entre dos expresiones de cualquiera de
los tipos de datos de la categoría del tipo de datos entero.

AND &
OR |
OR exclusivo ^

Operadores de comparación

Igual a =
Mayor que >
Menor que <
Mayor o igual que >=
Menor o igual que <=
Distinto de <>
No es igual a !=
No menor que !<
No mayor que !>

Operadores lógicos
Aquí sólo los nombraremos ya que en el tema de consultas simples los veremos en detalle.

ALL IN
AND LIKE
ANY NOT
BETWEEN OR
EXISTS SOME

Operadores de cadena

Concatenación +

Resultado de la expresión

Si se combinan dos expresiones mediante operadores de comparación o lógicos, el tipo de


datos resultante es booleano y el valor es uno de los
siguientes: TRUE, FALSE o UNKNOWN.

Cuando dos expresiones se combinan mediante operadores aritméticos, bit a bit o de


cadena, el operador determina el tipo de datos resultante.

Las expresiones complejas formadas por varios símbolos y operadores se evalúan como un
resultado formado por un solo valor. El tipo de datos, intercalación, precisión y valor de la
expresión resultante se determina al combinar las expresiones componentes de dos en dos,
hasta que se alcanza un resultado final. La prioridad de los operadores de la expresión
define la secuencia en que se combinan las expresiones.

Unidad 2. Introducción al SQL. Transact-SQL (V)


2.8. Funciones
SQL Server 2005 proporciona numerosas funciones integradas y permite crear funciones
definidas por el usuario.

Existen diferentes tipos de funciones:

Funciones de conjuntos de filas: devuelven un objeto que se puede utilizar, en instrucciones


Transact-SQL, en lugar de una referencia a una tabla.

Funciones de agregado (también llamadas funciones de columna): Operan sobre una


colección de valores y devuelven un solo valor de resumen. Por ejemplo, la función
de suma sobre la columna importe para conocer el importe total: SUM(importe)

Funciones de categoría: Devuelven un valor de categoría para cada fila de un conjunto de


filas, por ejemplo devuelve el número de la fila, el ranking de la fila en una determinada
ordenación, etc.

Funciones escalares: Operan sobre un valor y después devuelven otro valor. Son las
funciones que estamos acostumbrados a utilizar. Las funciones escalares se clasifican
según el tipo de datos de sus operandos.

Las variables
En Transact-SQL podemos definir variables, que serán de un tipo de datos determinado,
como tipos de datos podemos utilizar los propios de la base de datos SQL-SERVER, pero
también podemos utilizar tipos propios del lenguaje que no pueden ser utilizados en DDL. El
tipo Cursor y el tipo Table son dos de estos tipos.

Las variables se definen utilizando la instrucción DECLARE con el siguiente formato:

DECLARE @nbvariable tipo

El nombre de la variable debe empezar por el símbolo @, este símbolo hace que SQL
interprete el nombre como un nombre de variable y no un nombre de objeto de la base de
datos.

Por ejemplo: DECLARE @empleados INT

Con esto hemos definido la variable @empleados de tipo entero.

Para asignar un valor a una variable, la asignación se realiza con la palabra SELECT y el
signo igual con el formato:

SELECT @nbvariable = valor

El valor puede ser cualquier valor constante, otro nombre de variable, una expresión válida o
algo más potente, parte de una sentencia SELECT de SQL.
Por ejemplo:

SELECT @empleados = 0;

SELECT @empleados = @otra * 100;

SELECT @EMPLEADOS = COUNT (numemp) FROM empleados;

El valor almacenado en la variable se puede visualizar mediante la orden PRINT. o SELECT

PRINT @nbvariable o SELECT @nbvariable

El valor almacenado en la variable se visualizará en la pestaña de resultados. También se


puede usar para escribir mensajes:

PRINT 'Este es el mensaje'

Otros elementos del lenguaje


Comentarios. Como en cualquier otro lenguaje de programación, debemos utilizar
comentarios destinados a facilitar la legibilidad del código. En SQL se insertan comentarios
con los signos:

/* */ Varias líneas /* Esto es un comentario


en varias líneas */

-- Una única línea -- Esto es un comentario en una única línea.

Use.
Cambia el contexto de la base de datos al de la base de datos especificada.

USE nbBaseDeDatos

Hace que la base de datos activa pase a ser la base de datos indicada en la instrucción, las
consultas que se ejecuten a continuación se harán sobre tablas de esa base de datos si no
se indica lo contrario. Es una instrucción útil para asegurarnos de que la consulta se ejecuta
sobre la base de datos correcta.
GO

GO no es una instrucción Transact-SQL, sino un comando reconocido por las


utilidades sqlcmd y osql, así como por el Editor de código de SQL Server Management
Studio.
Las utilidades de SQL Server interpretan GO como una señal de que deben enviar el lote
actual de instrucciones Transact-SQL a una instancia de SQL Server. El lote actual de
instrucciones está formado por todas las instrucciones específicadas desde el último
comando GO o desde el comienzo de la sesión o script si se trata del primer comando GO.
Por ejemplo si queremos crear una consulta para crear una base de datos y sus tablas,
después del CREATE DATABASE…; tenemos que poner GO antes del primer CREATE
TABLE para que el sistema efectúe la primera operación y la base de datos esté creada
antes de ejecutar el primer CREATE TABLE.BEGIN...END

Encierra un conjunto de instrucciones Transact-SQL de forma que estas instrucciones


formen un bloque de instrucciones.

Prueba evaluativa unidad 2: Introducción al SQL. Transact-


SQL
Principio del formulario
Sólo una respuesta es válida por pregunta. Haz clic en la respuesta que consideres
correcta.
Contesta todas las preguntas y haz clic en el botón Corregir para ver la solución.
Si pulsas Restablecer podrás repetir la evaluación.

1. El lenguaje SQL es:

a) Propio de SQLServer.

b) Propio de SQLServer y otros sistemas gestores de Microsoft, como


Access.

c) Universal, se puede utilizar en cualquier sistema gestor de base de datos


relacional.

d) Todas son falsas.

2. El DDL engloba las instrucciones SQL que permiten:

a) Definir la estructura de una base de datos, como: crear una base de datos
o crear y eliminar tablas.

b) Realizar cambios en los datos contenidos en la base de datos: incluir


registros, borrarlos, editarlos...

c) Ejercer control sobre los procesos que ejecutan transacciones y los


permisos de la base de datos.

d) Todas son ciertas.

3. El DCL engloba las instrucciones SQL que permiten:


a) Definir la estructura de una base de datos, como: crear una base de datos
o crear y eliminar tablas.

b) Realizar cambios en los datos contenidos en la base de datos: incluir


registros, borrarlos, editarlos...

c) Ejercer control sobre los procesos que ejecutan transacciones y los


permisos de la base de datos.

d) Todas son ciertas.

4. El DML engloba las instrucciones SQL que permiten:

a) Definir la estructura de una base de datos, como: crear una base de datos
o crear y eliminar tablas.

b) Realizar cambios en los datos contenidos en la base de datos: incluir


registros, borrarlos, editarlos...

c) Ejercer control sobre los procesos que ejecutan transacciones y los


permisos de la base de datos.

d) Todas son ciertas.

5. El lenguaje Transact-SQL es una variante del SQL estándar, que incluye caracerísticas
como:

a) Herramientas para la creación de interfaces para el usuario de la base de


datos.

b) La posibilidad de crear aplicaciones ejecutables.

c) Estructuras de control de flujo.

d) Todas son ciertas.

6. Deberemos cualificar un nombre cuando:

a) Referenciemos un campo, tabla o vista que forme parte de una base de


datos externa, es decir, que no forme parte de la base de datos que está activa.

b) Si realizamos una consulta con varias tablas y necesitamos referenciar


un campo que se encuentra en más de una de ellas.

c) A y B son ciertas.

d) A y B son falsas.

7. Para llamar a un campo Fecha contrato deberemos...


a) Escribir (Fecha contrato). Entre paréntesis.

b) Escribir [Fecha contrato]. Entre corchetes.

c) No se puede escribir espacios en los nombres de los campos, deberemos


escribir Fecha_contrato.

d) Todas son falsas.

8. Señala cuál es un comentario válido para SQL.

a) /* Esto es un comentario */

b) - Esto es un comentario.

c) // Esto es un comentario.

d) <!-- Esto es un comentario -->

9. Transact-SQL permite definir:

a) Variables.

b) Constantes.

c) Funciones propias.

d) Todas son ciertas.

Prueba evaluativa unidad 3: Consultas simples


Principio del formulario
Sólo una respuesta es válida por pregunta. Haz clic en la respuesta que consideres
correcta.
Contesta todas las preguntas y haz clic en el botón Corregir para ver la solución.
Si pulsas Restablecer podrás repetir la evaluación.

1. La cláusula FROM indica el origen de datos para la consulta y puede constar de:

a) Una tabla.

b) Una vista.

c) A y B son ciertas.

d) A y B son falsas.

2. Si queremos utilizar la tabla de una base de datos externa (Base2) en nuestra consulta...
a) Deberemos cualificarla, de la siguiente forma: FROM Base2.tabla.

b) Podremos indicar el nombre de la tabla directamente : FROM tabla.

c) No podemos utilizar más de una base de datos en la misma consulta.

d) Deberemos desconectar de la base de datos actual y conectar con la


Base2.

3. El alias se puede aplicar en:

a) El origen, por ejemplo: tablaempleados as Empleados

b) La lista de selección, por ejemplo: nomemp as [Nombre Empleado]

c) A y B son ciertas.

d) A y B son falsas.

4. Señala cuál de los siguientes ejemplos es correcto:

a) SELECT nom as Nombre FROM empleados WHERE Nombre='Juan'.

b) SELECT nom Nombre FROM empleados WHERE Nombre='Juan'

c) SELECT nom Nombre FROM empleados ORDER BY Nombre

d) SELECT nom Nombre FROM empleados ORDER BY


Apellido='García'

5. Señala cuál de los siguientes ejemplos es incorrecto:

a) SELECT precio_unidad = (importe/cantidad)...

b) SELECT (importe/cantidad) AS precio_unidad...

c) SELECT precio_unidad = ROUND(importe/cantidad)...

d) SELECT precio_unidad = ROUND((importe/cantidad), 2)...

6. ¿Dónde utilizamos la palabra clave *?

a) En la lista de selección, para indicar que queremos mostrar todas las


columnas del origen indicado.

b) En el origen de datos, para indicar que queremos utilizar como origen


todas las tablas de la base de datos.

c) A y B son ciertas.
d) A y B son falsas.

7. Si a una consulta aplicamos una ordenación mediante el ORDER BY...

a) Deberemos indicar si queremos ordenar de forma ascendente (ASC) o


descendente (DESC) o dará error.

b) Deberemos indicar si queremos ordenar de forma ascendente o


descendente. Si no indicamos nada, se ordenará de forma ascendente por defecto.

c) Deberemos indicar ASC o DESC, pero sólo en caso de que se trate de


un campo alfabético. Para otros tipos de datos no funciona (como fechas o campos
numéricos).

d) Todas son falsas.

8. La cláusula DISTINCT...

a) Agiliza las consultas, porque debe mostrar menos resultados.

b) Se utiliza para no mostrar las filas que repitan el mismo valor en un


determinado campo (columna).

c) Se utiliza para no mostrar las filas que se repitan en todos sus campos,
es decir, que sea idénticas. Ralentiza la consulta porque debe evaluar al final si se
repiten y eliminarlas del listado generado.

d) Se ejecuta de forma predeterminada. Para que no sea así debemos


indicar ALL, por ejemplo: SELECT ALL oficina FROM empleados.

9. La cláusula TOP...

a) Tiene más sentido en consultas con ORDER BY. Al ejecutarse, primero


se ordenan según un criterio y luego se extraen las N primeras.

b) Puede ir acompañada de WITH TIES, si queremos mostrar todos los


valores iguales al último del ranking.

c) Puede ser porcentual, es decir, mostrar el 8% del total de registros, por


ejemplo, para que el listado sea proporcional a su volumen.

d) Todas son ciertas.

10. La cláusula WHERE...

a) Permite indicar una condición para filtrar los resultados. Por ejemplo:
WHERE nombre='Juan'.
b) Admite funciones. Por ejemplo: WHERE YEAR(contrato)=1985.

c) Admite intervalos de valores. Por ejemplo: WHERE YEAR(contrato)


BETWEEN 1985 AND 1995.

d) Todas son ciertas.

Prueba evaluativa unidad 4: consultas multitabla


Sólo una respuesta es válida por pregunta. Haz clic en la respuesta que consideres
correcta.
Contesta todas las preguntas y haz clic en el botón Corregir para ver la solución.
Si pulsas Restablecer podrás repetir la evaluación.

1. Para unir dos tablas con la cláusula UNION, éstas deberán:

a) Tener los datos de una o más columnas en común. Por ejemplo, que en
ambas tablas se referencie a un código.

b) Tener el mismo esquema de tabla, es decir, mismo número de columnas


y mismo tipo de datos, en el mismo orden.

c) Tener registros (filas) en común.

d) Estar en la misma base de datos.

2. Cuando utilizamos UNION con dos tablas, sin incluir una cláusula ORDER BY, se muestra
una única tabla...

a) Situando los registros de la primera tabla de la sentencia SQL a la


derecha. Se mantienen los encabezados de ambas.

b) Situando los registros de la primera tabla de la sentencia SQL a la


izquierda. Se mantienen los encabezados de ambas.

c) Situando los registros de la primera tabla de la sentencia SQL encima de


la segunda. Se utilizan los encabezados de la primera.

d) Situando los registros de la segunda tabla de la sentencia SQL encima


de la primera. Se utilizan los encabezados de la segunda.

3. Cuando utilizamos UNION...

a) Es una buena práctica escribir la cláusula DISTINCT, para que se


eliminen los registros repetidos.

b) No necesitamos incluir un DINSTINCT, porque lo realiza


automáticamente, a menos que indiquemos lo contrario (ALL).
c) No podremos utilizar las cláusulas DISTINCT/ALL.

d) La consulta se realiza más rápidamente porque por defecto ejecuta la


cláusula DISTINCT.

4. Las cláusulas INTERSECT y EXCEPT:

a) Tienen una sintaxis similar.

b) Se basan en la comparación de tablas. Una muestra los registros que


tienen en común y la otra los que están en la primera tabla pero no en la segunda.

c) A y B son ciertas.

d) A y B son falsas.

5. UNION, INTERSECT y EXCEPT sólo permiten comparar tablas que tienen el mismo
esquema.

a) Verdadero.

b) Falso.

6. Señala la afirmación incorrecta. La composición de tablas...

a) Amplia la información de una tabla con la de otra, emparejando filas.

b) Muestra datos de dos tablas, que pueden tener un esquema diferente.

c) Se consigue indicando más de una tabla de origen en la FROM.

d) Precisa obligatoriamente de la cláusula ON, donde se indica la columna


que tienen en común ambas tablas.

7. Indica si la siguiente sentencia es correcta: SELECT * FROM empleados INNER JOIN


oficinas ON oficina = oficina;

a) No, porque en las tablas compuestas no se puede utilizar la palabra clave


*.

b) No, porque si el campo se llama igual en ambas tablas hay que


cualificarlo: empleados.oficina y oficinas.oficina.

c) No, porque la sentencia correcta sería: SELECT * FROM empleados,


oficinas WHERE empleados.oficina=oficinas.oficina;.

d) Sí, es correcta.
8. Se pueden incluir varias combinaciones de tablas en una única consulta.

a) Verdadero.

b) Falso.

Prueba evaluativa unidad 5: Consultas de resumen


Principio del formulario
Sólo una respuesta es válida por pregunta. Haz clic en la respuesta que consideres
correcta.
Contesta todas las preguntas y haz clic en el botón Corregir para ver la solución.
Si pulsas Restablecer podrás repetir la evaluación.

1. Las funciones de columna o de agregado:

a) Realizan un cálculo, operación o comprobación sobre los valores de una


columna.

b) Hacen que se ejecute una consulta de resumen, de forma que es posible


que no veamos los registros originales, sino el resultado del cálculo que se ha
realizado sobre ellos.

c) A y B son ciertas.

d) A y B son falsas.

2. DISTINCT no se puede utilizar en las consultas de resumen.

a) Verdadero.

b) Falso.

3. Si aplicamos la cláusula WHERE en una consulta cuya lista de selección contiene una
función de columna, por ejemplo SUM()...

a) El WHERE se ejecuta antes de realizar el sumatorio.

b) El WHERE se ejecuta después de realizar el sumatorio.

c) El WHERE no se ejecuta.

d) La consulta dará error, porque debemos utilizar HAVING.

4. La función COUNT(numemp) incluye en su recuento los valores NULL.

a) Verdadero.
b) Falso.

5. La función COUNT(*) incluye en su recuento las filas que contienen valores NULL.

a) Verdadero.

b) Falso.

6. Si una consulta contiene en su lista de selección columnas y funciones a la vez, por


ejemplo: SELECT oficina, COUNT(numemp) as [Num empleados]...

a) El GROUP BY deberá contener obligatoriamente las columnas no


calculadas, en este caso oficina.

b) El GROUP BY deberá contener obligatoriamente las columnas


calculadas, en este caso COUNT(numemp) as [Num empleados].

c) A y B son ciertas.

d) A y B son falsas.

7. CUBE y ROLLUP:

a) Muestran filas de resumen.

b) Se incluyen en la cláusula GROUP BY.

c) A y B son ciertas.

d) A y B son falsas.

8. La función de agregado GROUPING...

a) Se indica en la lista de selección, y sirve para saber si se trata de una fila


de resumen, resultado de un CUBE o un ROLLUP.

b) Muestra una fila más, que incluye el total final de la función de


agregado.

c) No se puede utilizar en consultas que incluyan un GROUP BY.

d) Se escribe a continuación del GROUP BY.

9. La cláusula HAVING...

a) Actúa sobre las filas resultantes de una consulta de resumen y funciona


igual que la cláusula WHERE.

b) Actúa igual que la cláusula WHERE, sobre las filas origen.


c) Se puede utilizar en consultas sin GROUP BY.

d) Sólo se puede utilizar en consultas con ORDER BY.

Prueba evaluativa unidad 6: las subconsultas


Sólo una respuesta es válida por pregunta. Haz clic en la respuesta que consideres
correcta.
Contesta todas las preguntas y haz clic en el botón Corregir para ver la solución.
Si pulsas Restablecer podrás repetir la evaluación.

1. Las subconsultas (o consulta interna)...

a) Se escriben entre corchetes.

b) Se escriben entre paréntesis.

c) Se escriben entre llaves.

d) Se finalizan con un punto y coma (;).

2. Las subconsultas no pueden contener la cláusula ORDER BY.

a) A menos que contengan, además, la cláusula TOP.

b) Porque no tendría sentido, ya que la subconsulta sirve para realizar una


comprobación y no se va a visualizar.

c) A y B son ciertas.

d) A y B son falsas, ya que no hay problema en incluir un ORDER BY


dentro de una subconsulta.

3. La subconsulta...

a) Se ejecuta al final, después de recorrer todos los registros de la consulta


principal.

b) Se ejecuta por cada una de las filas de la consulta principal.

4. La referencia externa en una subconsulta es:

a) Un campo que no se encuentra en el origen de datos de la subconsulta,


sino en el de la consulta principal.

b) Un campo que no se encuentra en el origen de datos de la consulta


principal, sino que es exclusivo de la propia subconsulta.
5. Las subconsultas normalmente se utilizan en las cláusulas...

a) WHERE y TOP.

b) WHERE y FROM.

c) WHERE y HAVING.

d) WHERE y GROUP BY.

6. En las subconsultas introducidas por la cláusula EXISTS...

a) Normalmente será necesario utilizar una referencia externa.

b) Se utiliza la palabra clave * en la lista de selección, porque lo que se


evalúa es si devuelve o no filas, y no nos interesa ningún campo en particular.

c) A y B son ciertas.

d) A y B son falsas.

7. Utilizar la expresión IN es equivalente a utilizar = ANY.

a) Verdadero.

b) Falso.

8. La subconsulta necesariamente debe tener un origen (FROM) diferente al de la consulta


principal (externa).

a) No, son independientes. Pueden ejecutar consultas tanto sobre la misma


tabla o vista como sobre orígenes diferentes.

b) No, porque las subconsultas no tienen origen de datos FROM.

c) Sí, porque no se puede ejecutar dos consultas sobre la misma tabla o


vista a la vez.

d) Todas son falsas.

9. Una subconsulta puede contener una subconsulta dentro de ella.

a) Verdadero.

b) Falso.

Prueba evaluativa unidad 7: Actualización de datos


Sólo una respuesta es válida por pregunta. Haz clic en la respuesta que consideres
correcta.
Contesta todas las preguntas y haz clic en el botón Corregir para ver la solución.
Si pulsas Restablecer podrás repetir la evaluación.

1. Podemos insertar datos en una tabla nueva mediante la cláusula INSERT INTO.

a) Verdadero.

b) Falso.

2. La cláusula SELECT ... INTO requiere especificar una definición para la nueva tabla.

a) Verdadero.

b) Falso.

3. En las consultas INSERT ...

a) Es obligatorio utilizar la palabra INTO de la siguiente forma: INSERT


INTO.

b) No podemos utilizar vistas como origen de datos.

c) No se puede introducir valores nulos (NULL).

d) Todas son falsas.

4. El peligro de insertar datos con la cláusula INSERT INTO es que no podemos saber si
estamos infringiendo una regla de integridad.

a) Verdadero.

b) Falso.

5. ¿Se puede actualizar (UPDATE) una columna de identidad?

a) Sí, siempre que le asignemos un valor que no exista.

b) Sí, siempre que asignemos el valor que debería tener: si estamos


actualizando el registro con identidad 7 y el valor máximo de la tabla es 30,
deberíamos asignar el 31.

c) No, porque este campo lo gestiona el sistema y daría error.

d) Todas son falsas.

6. Para indicar qué filas queremos modificar, podemos aplicar la cláusula...


a) WHERE, para aplicar una condición de filtro y modificar las que
coincidan con el criterio.

b) TOP, para indicar cuántas filas queremos modificar, aleatoriamente.

c) A y B son ciertas.

d) A y B son falsas.

7. Si una consulta UPDATE falla porque infringe una regla de integridad o hay un problema
aritmético...

a) El proceso de actualización continua, y se crea un listado con las filas


que han sufrido algún error.

b) El proceso de actualización continua y se añaden valores nulos a las


columnas que generan errores.

c) El proceso hace dos barridos: en el primero comprueba si podrá ejecutar


el UPDATE completo y si hay errores te pregunta si deseas continuar, a pesar de
que es posible que la integridad de los datos se comprometa o que se pierda
información.

d) El proceso se interrumpe y muestra un error.

8. DELETE permite eliminar...

a) Una fila por cada consulta.

b) Una fila o más.

c) Un campo en concreto de una fila en particular.

d) Una columna completa.

9. Indica cuál de las siguientes consultas no borrará todos los registros de tabla1:

a) DELETE * FROM tabla1;

b) DELETE tabla1;

c) DELETE FROM tabla1 ;

d) DELETE TOP (100) PERCENT FROM tabla1;

10. Para borrar todos los datos de una tabla sin restricciones, lo más rápido es:

a) Utilizar DELETE.
b) Utilizar UPDATE y actualizar todos los registros a NULL.

c) Utilizar TRUNCATE.

Prueba evaluativa unidad 9: Programación en TRANSACT


SQL
Sólo una respuesta es válida por pregunta. Haz clic en la respuesta que consideres
correcta.
Contesta todas las preguntas y haz clic en el botón Corregir para ver la solución.
Si pulsas Restablecer podrás repetir la evaluación.

1. Existen dos tipos de procedimientos: los del sistema (que se encuentran en la base
master) y los del usuario (los que creamos).

a) Verdadero.

b) Falso.

2. El ámbito de un procedimiento puede ser local o global.

a) Verdadero.

b) Falso.

3. Para eliminar un procedimiento utilizaremos:

a) DROP PROC.

b) DROP PROCEDURE.

c) A y B son ciertas.

d) A y B son falsas.

4. Los procedimientos pueden contener:

a) Parámetros de entrada.

b) Parámetros de salida.

c) A y B son ciertas.

d) A y B son falsas.

5. Un procedimiento puede contener bucles, condiciones y control de excepciones.

a) Verdadero.
b) Falso.

6. Cuál de las siguientes cláusulas no es un tipo de desencadente:

a) FOR.

b) WAITFOR.

c) AFTER.

d) INSTEAD OF.

7. Para evitar que se borren registros en una tabla al lanzar una sentencia DELETE,
utilizamos:

a) FOR.

b) WAITFOR.

c) AFTER.

d) INSTEAD OF.

8. Cuando lanzamos un trigger sobre una sentencia UPDATE:

a) Deberemos trabajar con los datos de la tabla Updated.

b) Deberemos trabajar con los datos de las tablas Deleted e Inserted.

c) A y B son ciertas.

d) A y B son falsas.

9. Cuál de los triggers siguientes sería posible realizar:

a) Sobre una cláusula ALTER DATABASE.

b) Sobre una cláusula CREATE INDEX.

c) Sobre un ALTER TABLE que pretenda insertar una columna (ADD).

d) Sobre un ALTER TABLE que pretenda cambiar el nombre de una


columna.

10. En un trigger, DROP y DISABLE se distinguen en que:

a) DROP lo elimina permanentemente y DISABLE lo desactiva


temporalmente.
b) DISABLE lo elimina permanentemente y DROP lo desactiva
temporalmente

Unidad 3: Consultas simples (I)


3.1. Introducción
Vamos a empezar por la instrucción que más se utiliza en SQL, la sentencia SELECT. La
sentencia SELECT es, con diferencia, la más compleja y potente de las sentencias SQL, con
ella podemos recuperar datos de una o más tablas, seleccionar ciertos registros e incluso
obtener resúmenes de los datos almacenados en la base de datos. Es tan compleja que la
estudiaremos a lo largo de varias unidades didácticas incorporando poco a poco nuevas
funcionalidades.

El resultado de una SELECT es una tabla lógica que alberga las filas resultantes de la
ejecución de la sentencia.

La sintaxis completa es la siguiente:

SELECT sentencia::=[WITH <expresion_tabla_comun> [,...n]]

<expresion_consulta>

[ORDER BY {expression_columna|posicion_columna [ASC|DESC] }

[,...n]]

[COMPUTE

{{AVG|COUNT|MAX|MIN|SUM} (expression)}[ ,...n ] [BY expression[ ,...n ]]

[<FOR clausula_for>]

[OPTION (<query_hint>[ ,...n ])]

<expresion_consulta> ::=

{<especificacion_consulta> | ( < expresion_consulta > ) }

[ {UNION [ALL]|EXCEPT|INTERSECT}

<especificacion_consulta> | (<expresion_consulta>) [...n ]

<especificacion_consulta> ::=

SELECT [ALL|DISTINCT]

[TOP expresion [PERCENT] [WITH TIES] ]

<lista_seleccion>

[INTO nueva_tabla]

[FROM { <origen> } [ ,...n ] ]

[WHERE <condicion_busqueda> ]
[GROUP BY [ ALL ] expresion_agrupacion [ ,...n ]

[WITH { CUBE | ROLLUP } ]

[HAVING < condicion_busqueda > ]

Debido a la complejidad de la sentencia (en la sintaxis anterior no se han detallado algunos


elementos), la iremos viendo poco a poco, empezaremos por ver consultas básicas para
luego ir añadiendo más cláusulas.

Empezaremos por ver las consultas más simples, basadas en una sola tabla y nos
limitaremos a la siguiente sintaxis:

SELECT [ALL|DISTINCT]

[TOP expresion [PERCENT] [WITH TIES]]

<lista_seleccion>

FROM <origen>

[WHERE <condicion_busqueda> ]

[ORDER BY {expression_columna|posicion_columna [ASC|DESC]} [ ,...n ]]

3.2. Origen de datos FROM

De la sintaxis anterior, el elemento <origen> indica de dónde se va a extraer la información


y se indica en la cláusula FROM, es la única cláusula obligatoria. En este tema veremos un
origen de datos basado en una sola tabla.

La sintaxis será la siguiente:

<origen>::=

nb_tabla | nb_vista [[ AS ] alias_tabla ]

nb_tabla representa un nombre de tabla.

nb_vista un nombre de vista.


Tanto para las tablas como para las vistas, podemos hacer referencia a tablas que están en
otras bases de datos (siempre que tengamos los permisos adecuados), en este caso
tenemos que cualificar el nombre de la tabla, indicando delante el nombre de la base de
datos (Lógica) y el nombre del esquema al que pertenece la tabla dentro de la base de
datos.

Por ejemplo: MiBase.dbo.MiTabla se refiere a la tabla MiTabla que se encuentra en el


esquema dbo de la base de datos MiBase.

Cuando no se definen esquemas, SQL-Server crea uno por defecto en cada base de datos
denominado dbo.

Opcionalmente podemos definir un nombre de alias.

Un nombre de alias (alias_tabla) es un nombre alternativo que se le da a la tabla dentro


de la consulta.
Si se define un nombre de alias, dentro de la consulta, será el nombre a utilizar para
referirnos a la tabla, el nombre original de la tabla ya no tendrá validez.

Se utilizan los nombres de alias para simplificar los nombres de tablas a veces largos y
también cuando queremos combinar una tabla consigo misma; ya volveremos sobre los
alias de tabla cuando veamos consultas multitabla.

La palabra AS no añade ninguna operatividad, está más por estética.

Podemos escribir:

SELECT...

FROM tabla1 Sacamos los datos de la tabla tabla1

SELECT ...

FROM tabla1 t1 Sacamos los datos de la tabla tabla1 y le asignamos un alias de tabla: t1

SELECT ...

FROM tabla1 AS t1 Es equivalente a la sentencia anterior.

Si la tabla o la vista están en otra base de datos del mismo equipo que está ejecutando la
instancia de SQL Server, se utiliza el nombre cualificado con el
formato nbBaseDatos.nbEsquema.nbTabla.

Si la tabla o la vista están fuera del servidor local en un servidor vinculado, se utiliza un
nombre de cuatro partes con el formato nbservidor.catalogo.nbEsquema.nbTabla.
Volveremos más adelante sobre las conexiones remotas.

Unidad 3. Consultas simples (II)


3.3. La lista de selección
En la lista de selección <lista_seleccion> indicamos las columnas que se tienen que
visualizar en el resultado de la consulta.

<lista_seleccion> ::=

{ *

| {nombre_tabla|nombre_vista|alias_tabla}.*

| { [{nombre_tabla|nombre_vista|alias_tabla}.]

{nb_columna|$IDENTITY|$ROWGUID}

|<expresion>

}[[AS] alias_columna]

| alias_columna = <expresion>

} [,...n ]

Separamos la definición de cada columna por una coma y las columnas del resultado
aparecerán en el mismo orden que en la lista de selección.
Para cada columna del resultado su tipo de datos, tamaño, precisión y escala son los
mismos que los de la expresión que da origen a esa columna.

Podemos definir las columnas del resultado de varias formas, mediante:

Una expresión simple:

una referencia a una función.

una variable local

una constante

una columna del origen de datos,

Una subconsulta escalar, que es otra instrucción SELECT que devuelve un único valor y se
evalúa para cada fila del origen de datos (esto no lo veremos de momento).

Una expresión compleja generada al usar operadores en una o más expresiones simples.

La palabra clave *.

La asignación de variables con el formato @variable_local = expresión.

La palabra clave $IDENTITY.

La palabra clave $ROWGUID.

3.4. Columnas del origen de datos


Cuando queremos indicar en la lista de selección una columna del origen de datos, la
especificamos mediante su nombre simple o nombre cualificado. El nombre cualificado
consiste en el nombre de la columna precedido del nombre de la tabla donde se encuentra la
columna.

Si en el origen de datos hemos utilizado una vista o un nombre de alias, deberemos utilizar
ese nombre. Es obligatorio utilizar el nombre cualificado cuando el nombre de la columna
aparece en más de una tabla del origen de datos.

Ejemplos de consulta simple.

Listar nombres, oficinas, y fechas de contrato de todos los empleados:

SELECT nombre, oficina, contrato

FROM empleados;

El resultado sería:

nombre oficina Contrato


Antonio Viguer 12 1986-10-20
Alvaro Jaumes 21 1986-12-10
Juan Rovira 12 1987-03-01
José González 12 1987-05-19
Vicente Pantalla 13 1988-02-12
Luis Antonio 11 1988-06-14
Jorge Gutiérrez 22 1988-11-14
Ana Bustamante 21 1989-10-12
María Sunta 11 1999-10-12
Juan Victor NULL 1990-01-13

Listar una tarifa de productos:

SELECT idfab, idproducto, descripcion, productos.precio

FROM productos;
Hemos cualificado la columna precio aunque no es necesario en este caso.

El resultado sería:

Idfab idproducto descripcion precio


aci 41001 arandela 0,58
aci 41002 bisagra 0,80
aci 41003 art t3 1,12
aci 41004 art t4 1,23
aci 4100x junta 0,26
aci 4100y extractor 28,88
aci 4100z mont 26,25
bic 41003 manivela 6,52
bic 41089 rodamiento 2,25

Unidad 3: Consultas simples (III)


3.5. Alias de columna
Por defecto, en el encabezado de cada columna del resultado, aparece el nombre de la
columna origen, pero esto se puede cambiar definiendo un alias de columna, el alias de
columna es un nombre alternativo que se le da a esa columna.

El alias de columna se indica mediante la cláusula AS. Se escribe el nuevo texto tal cual sin
comillas siguiendo las reglas de los identificadores.

Ejemplo:

SELECT numclie,nombre AS nombrecliente

FROM clientes;

El resultado será:

Numclie nombrecliente
2101 Luis García Antón
2102 Alvaro Rodríguez
2103 Jaime Llorens
En vez de:

Numclie nombre

2101 Luis García Antón

2102 Alvaro Rodríguez

2103 Jaime Llorens

Las palabras AS es opcional.

SELECT numclie,nombre nombrecliente

FROM clientes;
Sería equivalente a la consulta anterior

Si queremos incluir espacios en blanco en el nombre lo debemos encerrar entre corchetes.

SELECT numclie,nombre AS [nombre cliente]

FROM clientes;

Nota importante: Este nombre de alias se podrá utilizar en la lista de selección y en la


cláusula ORDER BY pero no en la cláusula WHERE.

3.6. Funciones
Existen funciones que podemos utilizar en la lista de selección, e incluso en otras cláusulas
que veremos más adelante, como el WHERE. Las principales funciones son las siguientes:

Funciones de fecha:
Función Descripción Ver
+

GETDATE Devuelve la fecha actual.

GETUTCDATE Devuelve la hora UTC.

DATEPART Devuelve un entero que corresponde a la parte de la fecha solicitada.

DAY Devuelve el día de la fecha indicada.

MONTH Devuelve el mes de la fecha indicada.

YEAR Devuelve el año de la fecha indicada.

DATENAME Devuelve una cadena de caracteres que representa el valor de la unidad


especificada de una fecha especificada.

DATEADD Devuelve un valor datetime nuevo que resulta de sumar un intervalo de tiempo
a una fecha especificada.>

DATEDIFF Devuelve el nº de intervalos que hay entre dos fechas.

@@DATEFIRST Devuelve el primer día de la semana establecido con SET DATEFIRST.

SET DATEFIRST Establece el primer día de la semana en un número del 1 al 7.

Unidad 3: consultas simples (IV)

Funciones de cadena.

Función Descripción Ver


+
ASCII Devuelve el valor de código ASCII del carácter situado más a la izquierda de una
expresión de caracteres.
CHAR Devuelve el carácter ASCII del entero indicado.
NCHAR Devuelve el carácter Unicode del entero indicado.
UNICODE Devuelve el entero que se corresponde al carácter Unicode indicado.
LEN Devuelve el total de caracteres de una cadena, excluidos los espacios en blanco
finales.
LTRIM Devuelve una cadena tras quitarle los espacios en blanco iniciales.
RTRIM Devuelve una cadena tras quitarle los espacios en blanco finales.
LEFT Devuelve los N últimos caracteres de una cadena.
RIGHT Devuelve los N primeros caracteres de una cadena.
SUBSTRING Devuelve parte de una expresión.
LOWER Devuelve la cadena convertida a minúsculas.
UPPER Devuelve la cadena convertida a mayúsculas.
REPLACE Reemplaza una determinada cadena.
STUFF Elimina el número de caracteres especificados e insertos otro conjunto de caracteres
en el punto de inicio indicado.
QUOTENAME Devuelve una cadena Unicode con los delimitadores agregados para convertirla en
un identificador delimitado válido de Microsoft SQL Server 2005.
SPACE Devuelve una cadena de espacios repetidos.
STR Devuelve una cadena de caracteres a partir de datos numéricos.
REPLICATE Repite una cadena N veces.
REVERSE Devuelve una cadena invertida.
CHARINDEX Devuelve la posición inicial de la expresión especificada en una cadena de caracteres.
PATINDEX Devuelve la posición inicial de la primera repetición de un patrón en la expresión
especificada, o ceros si el patrón no se encuentra, en todos los tipos de datos de texto
y caracteres.

Otras funciones:

Función Descripción Ver


+

ROUND Redondea un valor a la longitud y precisión indicadas.

CAST y CONVERT Convierten de un tipo de datos a otro de forma explícita.

CASE Evalúa una lista de condiciones.

ISNULL Reemplaza el valor NULL por otro especificado.

COALESCE Devuelve la primera expresión distinta de NULL entre sus argumentos.

Unidad 3: Consultas simples (V)


3.7. Columnas calculadas
Además de las columnas que provienen directamente de la tabla origen, una consulta SQL
puede incluir columnas calculadas cuyos valores se evalúan a partir de una expresión.

La expresión puede contener cualquier operador válido (+, -, *, /, &…), cualquier función
válida, nombres de columnas del origen de datos, nombres de parámetros o constantes y
para combinar varias operaciones se pueden utilizar los paréntesis.

Ejemplos de columnas calculadas:

Listar la ciudad, región y el superávit de cada oficina. Consideraremos el superávit como el


volumen de ventas que se encuentran por encima o por debajo del objetivo de la oficina.

SELECT ciudad, región, (ventas-objetivo) AS superávit

FROM oficinas;

El resultado será:

Ciudad region superavit


Valencia este 11800,00
Alicante este -6500,00
Castellon este 1800,00
Badajoz oeste 11100,00
A Coruña oeste -11400,00
Madrid centro NULL
Madrid centro -10000,00
Pamplona norte NULL
Valencia este -90000,00
De cada producto queremos saber el id de fabricante, id de producto, su descripción y el
valor de sus existencias.

SELECT Idfab, Idproducto, descripción, (existencias*precio) AS valoración


FROM productos;

El resultado sería:

Idfab idproducto descripcion valoracion


aci 41001 arandela 160,66
aci 41002 bisagra 133,60
aci 41003 art t3 231,84
aci 41004 art t4 170,97
aci 4100x junta 9,62
aci 4100y extractor 722,00
aci 4100z mont 735,00
bic 41003 manivela 19,56
bic 41089 rodamiento 175,50

Unidad 3: Consultas simples (VI)


Listar el nombre, mes y año del contrato de cada vendedor.

SELECT nombre, MONTH (contrato) AS [Mes de contrato], YEAR(contrato) AS [Año de contrato]

FROM empleados;

El resultado será:

Nombre Mes de contrato Año de contrato


Antonio Viguer 10 1986

Alvaro Jaumes 12 1986


Juan Rovira 3 1987

Listar las ventas en cada oficina con el formato: 22 tiene ventas de 186,042.00 €

SELECT oficina, 'tiene ventas de ' AS [ ], ventas

FROM oficinas;

El resultado sería:

oficina Ventas
11 tiene ventas de 69300,00
12 tiene ventas de 73500,00
13 tiene ventas de 36800,00
21 tiene ventas de 83600,00
22 tiene ventas de 18600,00
23 tiene ventas de NULL
24 tiene ventas de 15000,00
26 tiene ventas de NULL
28 tiene ventas de 0,00

El incluir una constante como columna en la lista de selección puede parecer inútil (se
repetirá el mismo valor en todas las filas) pero veremos más adelante que tiene utilidad en
ciertos casos.

También podemos utilizar la sintaxis:

alias_columna = <expresion>

Ejemplo:

SELECT oficina, superavit = ventas-objetivo

Esto tiene el mismo efecto que

SELECT oficina, ventas-objetivo AS superávit.

Unidad 3. Consultas simples (VII)


3.8. Utilización del asterisco *
Si queremos visualizar todas las columnas del origen de datos, en lugar de indicar todas las
columnas una a una se puede utilizar el carácter de sustitución *.

Mostrar todos los datos de la tabla oficinas.

SELECT *

FROM oficinas;

Obtener todos los datos y el superávit de cada oficina.

SELECT *, (ventas-objetivo) AS superavit

FROM oficinas;

También podemos cualificar el * con un nombre de tabla, de vista o un alias de tabla:

SELECT oficinas.*

FROM oficinas;

oficinas.* se interpreta como: todas las columnas de la tabla oficinas.

Esta forma se utiliza normalmente cuando el origen está basado en varias tablas y queremos
indicar todas las columnas no del origen completo sino de una tabla concreta.

3.9. Las palabras clave $IDENTITY y $ROWGUID


La palabra clave $IDENTITY se interpreta como la columna de la tabla que tiene la
propiedad IDENTITY (la columna de identidad que vimos en un tema anterior).

Por ejemplo, si en la columna codigo de la tabla usuarios (BD Biblio) se ha definido la


propiedad IDENTITY.

SELECT $IDENTITY, nombre, apellidos


FROM usuarios;

Es equivalente a:

SELECT codigo, nombre, apellidos

FROM usuarios;

La palabra clave $ROWGUID se interpreta como la columna de la tabla que tiene la


propiedad ROWGUIDCOL y se puede utilizar de la misma forma que $IDENTITY.

Unidad 3. Consultas simples (VIII)


3.10. Ordenación de las filas del resultado ORDER BY
Si queremos que las filas del resultado de la consulta aparezcan ordenadas, lo podemos
indicar mediante la cláusula ORDER BY.

ORDER BY {expression_columna | posicion_columna [ASC|DESC]} [ ,...n ]

Podemos indicar una columna o varias separadas por una coma, la columna de ordenación
se especifica mediante el nombre de columna en el origen de datos o su posición dentro de
la lista de selección. Si utilizamos el nombre de columna, no hace falta que la columna
aparezca en la lista de selección. Si utilizamos la posición es la posición de la columna
dentro de la lista de selección empezando en 1.

Por defecto la filas se ordenarán en modo ascendente (ASC), de menor a mayor; si


queremos invertir ese orden añadimos detrás de la columna la palabra DESC.

Si la columna de ordenación es alfanumérica, las filas se ordenarán por orden alfabético.

Si la columna de ordenación es numérica, las filas se ordenarán de menor a mayor.

Si la columna de ordenación es de tipo fecha, las filas se ordenarán de más antigua a más
reciente o futura.

Ejemplos:

Mostrar las ventas de cada oficina, ordenadas por orden alfabético de región y dentro de
cada región por ciudad.

SELECT oficina, region, ciudad, ventas

FROM oficinas

ORDER BY region, ciudad;

Da como resultado:

Oficina region ciudad ventas


24 centro Aranjuez 15000,00
23 centro Madrid NULL
12 este Alicante 73500,00
13 este Castellón 36800,00
11 este Valencia 69300,00
28 este Valencia 0,00
26 norte Pamplona NULL
22 oeste A Coruña 18600,00
21 oeste Badajoz 83600,00

Listar las oficinas de manera que las oficinas de mayores ventas aparezcan en primer lugar.

SELECT ciudad, region, ventas


FROM oficinas
ORDER BY ventas DESC;

ciudad region ventas

Badajoz Oeste 83600,00

Alicante Este 73500,00


Valencia Este 69300,00

Castellon este 36800,00


A Coruña Oeste 18600,00

Aranjuez centro 15000,00


Valencia Este 0,00

Pamplona Norte NULL


Madrid Centro NULL

Listar las oficinas clasificadas en orden descendente de rendimiento de ventas, de modo que
las de mayor rendimiento aparezcan las primeras.

SELECT ciudad, region, ventas-objetivo

FROM oficinas

ORDER BY 3 DESC;

Lo mismo que el anterior pero agrupadas por región.

SELECT region, ciudad, (ventas-objetivo) AS superavit

FROM oficinas

ORDER BY region, superavit DESC;

Resultado:

Region ciudad superavit


Centro Aranjuez -10000,00
Centro Madrid NULL
Este Valencia 11800,00
Este Castellón 1800,00
Este Alicante -6500,00
Este Valencia -90000,00
norte Pamplona NULL
oeste Badajoz 11100,00
oeste A Coruña -11400,00

En este caso hemos utilizado el alias de columna para hacer referencia a la columna
calculada y también se puede observar que las filas aparecen ordenadas por región
ascendente (no hemos incluido nada después del nombre de la columna) y dentro de cada
región por superávit y descendente.

Unidad 3. Consultas simples (IX)


3.11. Eliminar filas duplicadas DISTINCT/ALL
SQL no elimina las filas duplicadas en el resultado de la consulta, si nosotros no queremos
que se repitan las filas, tenemos la cláusula DISTINCT.
Al incluir la cláusula DISTINCT en la SELECT, se eliminará del resultado las repeticiones de
filas de resultado. Si por el contrario queremos que aparezcan todas las filas seleccionadas
podemos incluir la cláusula ALL o nada, ya que ALL es el valor por defecto.
Listar los nº de empleado de los directores de las oficinas.

SELECT dir

FROM oficinas;

Dir
106
104
105
108
108
108
108
NULL
NULL

Si un mismo empleado dirige varias oficinas (por ejemplo el 108), su código aparece repetido
en el resultado. Para evitarlo modificamos la consulta:

SELECT DISTINCT dir


FROM oficinas;

Han desaparecido los valores duplicados.

Los que se eliminan son valores duplicados de filas del resultado, por ejemplo:
SELECT DISTINCT dir, region
FROM oficinas;

dir region
NULL Este
NULL Norte
104 este

105 este
106 este

108 Centro
108 Oeste

Ahora el 108 aparece dos veces porque las dos filas donde aparece no son iguales (porque
tienen distinta región).

NOTA: La cláusula DISTINCT hace que la consulta tarde algo más en ejecutarse debido al
proceso adicional de buscar y eliminar las repeticiones, por lo que se aconseja utilizarla
únicamente cuando sea imprescindible.

Unidad 3. Consultas simples (X)

3.12. La cláusula TOP

[TOP <expresión> [PERCENT] [WITH TIES]]

La cláusula TOP indica que en el resultado no deben aparecer todas las filas resultantes sino
un cierto número de registros, las n primeras. Si la consulta incluye la cláusula ORDER BY,
se realiza la ordenación antes de extraer los n primeros registros.

La expresión representa ese número n y debe devolver un número entero sin signo.

Por ejemplo tenemos la siguiente tabla:

SELECT * FROM productos:

Si ordenamos por ventas:

SELECT * FROM productos


ORDER BY ventas;
Obtenemos el siguiente resultado:

Si añadimos la cláusula TOP:

SELECT TOP 3 * FROM productos

ORDER BY ventas

Obtenemos los 3 primeros registros:

También podría gustarte