Está en la página 1de 20

Tema 10: La base de datos de ejemplo: Neptuno.

mdb
El presente tema contiene instrucciones SQL de ejemplo sobre la base de datos
Neptuno.mdb que se incluye en la instalación de Ms-Access y en diversos
productos de Microsoft como son MS Office o MS Visual Estudio en sus
diferentes versiones.

La base de datos Neptuno es una aplicación completa de ejemplo que consta


de tablas, relaciones, formularios, informes, macros, consultas y datos de una
empresa ficticia dedicada a la comercialización y venta de productos
alimenticios que contiene tablas de Clientes, Proveedores, Catálogo
(Productos), Compañías de envío y otras.

Desde Ms-Access podemos acceder a sus tablas, vistas, relaciones y datos para
realizar la gestión de los mismos, añadir, borrar, modificar, extraer y buscar
datos mediante instrucciones SQL.

Para comenzar busquemos la base de datos Neptuno.MDB que se puede


encontrar en:

C:\Archivos de programa\Microsoft Office\Office\Samples

Si no la encuentra solicitela a su profesor.

Una vez localizada Haga una copia de la misma y deposítela en su carpeta de


trabajo del curso.

Entre a Ms_Access y abra la base de datos Neptuno.MDB (La copia)


En la ventana anterior Abrir Base de Datos ACCESS seleccionamos la base
de datos Neptuno.mdb y pulsamos en Abrir.

Aparece en el Marco de Datos la primera tabla de la base de datos y en la


barra de herramientas de base de datos vemos información sobre la misma.
Tras abrir correctamente la base de datos de Access Neptuno.mdb ya podemos
ejecutar las siguientes instrucciones SQL. En SQL es indiferente escribir en
mayúsculas o minúsculas.

Recordamos que el al mostrar la sintaxis las palabras en azul forman parte del
lenguaje SQL y deben escribirse como se muestran, las palabras en rojo se
deben cambian por el nombre de la tabla o índice concreto a utilizar y el texto
entre corchetes [...] es opcional.

El texto en negro es el nombre de los campos y el tipo a utilizar en las


instrucciones SQL.
10.1 EJEMPLOS DE INSTRUCCIONES DE DEFINICIÓN DE DATOS.

Las instrucciones de definición de datos gestionan las estructuras que


contienen los datos, permitiendo crear tablas, eliminar tablas, modificar tablas
y crear y borrar índices.

Dentro de Access y una vez abierta la base de datos Neptuno.MDB, coloquese


en el apartado de consultas, Seleccione Nuevo, Seleccione Vista Diseño: En la
ventana que aparece cierra la correspondiente a Mostrar Tabla, debe obtener
una vista como la que se muestra a continuación:

dar 1 click derecho en el. Área de diseño de consultas. Y al aparecer el menú


emergente seleccione la opción Vista SQL:

Borre la instrucción que aparezca...


A) Crear tablas:
Permite crear una tabla con sus campos y el tipo de cada uno es estos como se
explica en el capitulo 10 sobre las instrucciones SQL, recordamos que la
sintaxis es:

Create table NombreTabla


(NombreCampo1 TipoCampo1, NombreCampo2, TipoCampo2, ..., )

Escriba y ejecute la siguiente instrucción que crea una tabla llamada


MisClientes con 3 campos

Create table MisClientes


(Nombre char(15), Apellidos char(25), Direccion char(30));

Ejecute la instrucción SQL presionando el botón

Observe que el tipo de consulta cambia

cierre la Ventana, cuando Access le pregunte si desea guardar presione el


botón de SI y ponga como nombre CDD_1

Cambiese al apartado de Tablas de Su Base de Datos, Si no se ha actualizado


la ventana (NO aparece su tabla recién creada MisClientes) presione la tecla
F5 para actualizar...ya debe tener su nueva tabla, dar clic en botón Diseño y
verifique los nombres de los campos y su longitud.

Tras su creación, podemos seleccionar la nueva tabla MisClientes desde la lista


Tabla, donde vemos que se ha creado correctamente y que esta vacía, pues
contiene 0 Registros:

De la misma forma podemos crear otras tablas para practicar como las
siguientes:
Create table Coches (Marca char(10), Modelo char(20), Color
char(12), Precio integer, Velocidad integer, Longitud
integer, Matricula char(8));

Create table Cuentas (Cliente char(25), NumCuenta char(20),


LimiteGasto integer);

Tras crear las tablas podemos empezar a introducir datos directamente desde
la aplicación seleccionando la tabla y escribiéndolos en la cuadricula de datos o
bien mediante la instrucción SQL Insert Into descrita en el puno 11.2 A)

Debemos tener en cuenta al crear las tablas que no exista otra del mismo
nombre, utilizar los caracteres permitidos y crea cada campo con el tipo de
dato correcto para la base de datos.

B) Borrar tablas:
Si no deseamos trabajar con una tabla y queremos borrarla de la base de
datos podemos hacerlo con la instrucción Drop cuya sintaxis es: Drop table
NombreTabla

Drop table MisClientes;

Tras esta instrucción vemos que la tabla MisClientes ya no existe en la base de


datos. Volvemos a crearla para los ejemplos, ahora con cuatro campos
Nombre, Apellidos, Direccion y DNI: (Seleccione CDD_1 del apartado de
Consultas, presione el botón diseño, modifique. No olvide guardar)

Create table MisClientes (Nombre char(15), Apellidos


char(25), Direccion char(30), DNI integer);

C) Modificar tablas:

(Vaya guardando sus consultas con un nombre que contenga prefijo C de


Consulta y una abreviatura de la función que ejecuta. CalterTelef, p.pe)

Podemos modificar los campos de una tabla de la base de datos según las
instrucciones SQL específicas de cada base de datos, la sintaxis en Access es:

Alter table NombreTabla Add NombreCampo TipoCampo(Longitud) ;

En Access la siguiente instrucción modifica la tabla MisCliente añadiendo un


campo teléfono de 12 caracteres:

Alter table MisClientes Add Telefono char(12) ;


La siguiente instrucción modifica la tabla MisCliente añadiendo un campo
sueldo del tipo entero.

Alter table MisClientes Add Sueldo integer;

Podemos añadir varios campos a la vez separándolos con comas como en la


instrucción:

Alter table MisClientes Add EstadoCivil char(10), NumeroSS


char(12), Ciudad char(20) ;
Podemos elegir la tabla MisClientes del cuadro Tabla: con lo cual vemos que la
tabla MisClientes posee los campos que hemos añadido:

Podemos eliminar campos con la instrucción Alter table NombreTabla


Drop NombreCampo

Por ejemplo para eliminar el campo sueldo de la tabla MisClientes,


escribiremos:

Alter table MisClientes drop sueldo;

D) Crear indices:
Los índices permiten acelerar los procesos de búsqueda de datos dentro de las
tablas de la base de datos y crear relaciones entre las tablas mediante un
campo índice.

Al crear el índice podemos especificar si se debe ordenar de forma ascendente


o no, también si será la clave primaria de la tabla o si admitirá nulos en ese
campo. La sintaxis es:

Create index NombreIndice On NombreTabla(CampoTabla) [with


primary]

Para crear un índice es necesario indicar el nombre de este y sobre que tabla y
campo deseamos crearlo, vamos a crear un índice sobre la tabla MisClientes
como vemos:

Create index ClientesCiudad On MisClientes(Ciudad) ;


La instrucción anterior crea un índice llamado ClientesCiudad para la tabla
MisClientes por el campo Ciudad.
Al tener un índice por el campo Ciudad podemos buscar más rápidamente los
Clientes de una ciudad, realizar ordenaciones por ciudad, y otras operaciones
por este campo.

Verifique que se ha creado el índice de la siguiente forma:

Otro Ejemplo:

Create index MisClientesDNI On MisClientes(DNI) with Primary;

La instrucción anterior crea un índice llamado MisClientesDNI para la tabla


MisClientes por el campo DNI que será la clave primaria de la tabla.
Si intentamos crear un índice que sea clave principal de una tabla y ya existe
vemos el error siguiente:

Si que podemos crear el mismo índice en tablas diferentes de la base de datos,


pues el sistema detecta que se utilizan en tablas diferentes y no están
duplicados.

E) Borrar indices:
El índice de una clave primaria de la tabla no puede borrarse, ni los índices que
se utilizan para realizar restricciones.

Para borrar el índice anterior usamos las instrucciones :

Alter Table Misclientes Drop constraint MisClientesDNI;

Drop index MisClientesDNI On MisClientes;

No aparece ningún mensaje de aviso si se borra el índice correctamente.


Indicando el nombre de índice y la tabla a la que pertenece, pues en diferentes
tablas pueden existir índices con el mismo nombre.

Para finalizar estos ejercicios borramos la tabla MisClientes con la instrucción:


Drop table MisClientes;

10.2 INSTRUCCIONES DE MANIPULACIÓN DE DATOS.

El Lenguaje de manipulación de datos es el aspecto más potente del SQL


puesto que sus sentencias operan con conjuntos enteros de registros (filas) de
las tablas, no de uno en uno.
La función del SQL es especificar que datos queremos manipular o recuperar, y
el SGBD realiza las acciones necesarias para conseguir los resultados.
Volvemos a crear la tabla MisClientes:
Create table MisClientes (Nombre char(15), Apellidos
char(25), Direccion char(30), Telefono Integer, EstadoCivil
char(10), NumeroDNI Integer, Edad Integer) ;

A) Inserción de datos.
Esta instrucción permite insertar datos en una tabla de la base de datos, los
valores deben cumplir las restricciones de las columnas, es decir si las
columnas están definidas como números (integer) no podemos introducir
texto.

Para insertar un registro completo en la tabla MisClientes usamos la


instrucción:

Insert into MisClientes


Values(“Federico”,”Gamas Pina”,”Santa Pola
34”,33333,”Casado”,7333222,29);

No es necesario indicar en que columnas insertamos los datos pues están en


orden.

Si tenemos en el Abierta la tabla MisClientes veremos los datos insertados:

Vemos que los datos se han insertado correctamente.

Para insertar algunos campos en la tabla MisClientes indicamos los campos


como la instrucción:

Insert into MisClientes(Nombre,Apellidos,Direccion)


Values("Juan","Gallardo Peset","Santa Pola 99");

Como vemos solo se han insertado el nombre, apellidos y Dirección, el resto de


campos reciben el valor Nulo. Si existe un campo clave primaria siempre se
debe insertar un valor.

Podemos insertar un registro indicando todos los campos como en el ejemplo:


Insert into MisClientes(Nombre,
Apellidos,Direccion,Telefono,EstadoCivil,NumeroDNI,Edad)
Values ("Vicente","Silvestre Lino","Santa Pola
34",6665563,"Casado",6333222,28) ;

Si observamos el contenido de la tabla MisClientes, vemos que ha incluido


correctamente los datos:

Podemos insertar múltiples registros en una única instrucción SQL como vemos
en el siguiente ejemplo, aunque no funciona con Access si que funciona con
otras bases de datos. Debemos consultar la documentación especifica de
nuestro SGBD.

Insert into MisClientes Values


(‘Vicente’,’Silvestre Lino’,’Santa Pola
34’,6665563,’Casado’,6333222,28),
(‘José’,’Edo Vidal’,’Santa Pola
34’,3565643,’Casado’,3783222,23),
(‘Fernando’,’Jimenez Tena’,’C/ Mayor
3’,3445733,’Casado’,3833267,55),
(‘Felix’,’Goza Herrero’,’San Fola
13’,5656656,’Casado’,7333223,24),
(‘Antonio’,’Amas Reno’,’Polica
48’,5988776,’Casado’,73345522,49);
B) Extracción de datos.
Vamos a poder consultar información a la base de datos, de manera que nos
proporcione aquellos valores que requerimos.

Para ver como podemos extraer información, empezaremos por aquellas


consultas más sencillas

La sentencia básica de consulta de datos es la Select que indica qué campos


y de qué tabla deseamos extraer información.

Select Nombre_campos from Nombre_Tabla [where] Condición;

* significa todos los campos de la tabla.

Extraemos los datos de los proveedores con la instrucción:

Select * from Proveedores;

vemos los resultados en el Marco de Resultado SQL:

Podemos indicar los campos a seleccionar escribiendo sus nombres:


Select NombreContacto, CargoContacto, Dirección from proveedores;
Y si incluimos condiciones selecciona los campos deseados que cumplen la
condición:
Select NombreContacto, CargoContacto, Dirección from
proveedores
where País='Japón';

Muestra los campos deseados de los registros de proveedores de Japón.


Ejemplos de funciones de agregado en la instrucción SELECT.
La instrucción Select permite realizar cálculos sobre los campos de las tablas,
estos cálculos son los habituales de tipo matemático y lógico. Además
podemos utilizar las siguientes funciones para extraer información de los
campos de las tablas, como se explica con detalle en el capitulo 10.
En esta apartado solo veremos los ejemplos de las funciones de agregado del
SQL.
Avg
Sintaxis:
Avg (colexpr)
Descripción: Devuelve la media de colexpr cuando se realiza el cálculo en el
juego completo de filas recuperadas. La función es válida solamente como
parte de una lista de columnas de una sentencia Select.
Count
Sintaxis:
Count (colexpr | * )
Descripción: Devuelve el número de filas recuperadas cuando colexpr no es
Null. Si se especifica un asterisco, se devolverá el número total de filas sin
que se consideren los valores Null.
Max
Sintaxis:
Max (colexpr)
Descripción: Devuelve el valor mayor de colexpr cuando se hace el cálculo en
el juego completo de filas recuperadas. La función solo es legal como parte de
una lista de columnas de la sentencia Select.
Min
Sintaxis:
Min (colexpr)
Descripción: Devuelve el valor menor de colexpr cuando se calcula en todo el
conjunto de filas recuperadas. La función es legal solamente como parte de
una lista de columnas de una sentencia Select.
Sum
Sintaxis:
Sum (colexpr)
Descripción: Devuelve el total de todos los valores de colexpr cuando se
realiza el cálculo del conjunto completo de filas recuperadas. La función es
válida solamente como parte de una lista de columnas de la sentencia Select.
Podemos escribir los ejemplos de las funciones siguientes que obtienen valores
sobre la base de datos Neptuno.mdb:

Selecciona el importe (cargo) máximo de todos los Pedidos de


la tabla Pedidos:
select max(Cargo) from Pedidos;
Selecciona el máximo numero de artículos en existencia los
Productos:
select max(UnidadesEnExistencia) from Productos;

Selecciona la media del importe (cargo) de todos los Pedidos


de la tabla Pedidos:
select avg(Cargo) from Pedidos;

Selecciona la suma del importe (cargo) de todos los Pedidos


de la tabla Pedidos:
select sum(Cargo) from Pedidos;

Cuenta los Pedidos que se han realizado:


select count(*) from Pedidos;

Al realizar una extracción de datos de una o mas tablas de la base de datos en


ocasiones en la que se realizan cálculos y agrupamientos es conveniente dar al
resultado un nombre adecuado al valor mostrado, por ejemplo llamaremos
NumeroDePedidos al resultado de la instrucción anterior:
Select count(*) AS NumeroDePedidos From Pedidos;
Cuenta los Pedidos que ha realizado cada empleado:
select count(*),idEmpleado from Pedidos group by IdEmpleado;
Muestra el siguiente resultado:
Vemos que el empleado numero 1 es el que más pedidos ha realizado, será
conveniente mostrar también el nombre del empleado, para ello debemos
relacionar dos tablas por medio de su campo clave que es IdEmpleado como
vemos:
select count(*), Pedidos.IdEmpleado, Apellidos, Nombre
from Pedidos, Empleados where
Empleados.idEmpleado=Pedidos.IdEmpleado
group by Pedidos.IdEmpleado, Apellidos, Nombre;
Esta instrucción muestra el siguiente resultado:

Donde vemos además del numero de pedidos por empleado, sus apellidos y
nombre.

C) Borrado de datos.
Con la instrucción DELETE vamos a poder borrar registros de la base de datos,
de forma que los datos desaparecen de la tablas. La sintaxis básica es:
Delete from NombreTabla [where CampoTabla=Valor]
Con la siguiente instrucción borramos un registro de la tabla MisClientes con el
campo Nombre=’Juan’ , debe ir entre comillas simples si el campo es texto y
sin comillas si el campo es numérico. IMPORTANTE: Si no ponemos una
condición borramos todos los datos de la tabla.
Delete from MisClientes where nombre='Juan';
En caso de que la instrucción se ejecute correctamente aparecen el numero de
registros que se han visto afectados por la instrucción:

Si la instrucción no encuentra registros que cumplan la condición de búsqueda


se muestra el siguiente mensaje de error:
Si la instrucción no tiene una condición se eliminan todos los registros de la
tabla, la instrucción:
Delete from MisClientes;
Eliminará todos los registros que existan en la tabla MisClientes.

Si intentamos borrar un registro que tiene registros relacionados en otra tabla


se muestra el mensaje:

D) Actualización de datos.
Permite modificar valores de los campos de los registros de la base de datos.
La sintaxis es:
Update NombreTabla set NombreCampo1='TextoNuevo' ,
NombreCampo2='TextoNuevo', ...,
where Condicion;
Sentencia realizada en la base de datos Access, Neptuno.mdb actualiza el
campo NombreContacto='JUAN' de la tabla Proveedores para el Proveedor de
idProveedor=1
Update Proveedores set NombreContacto='JUAN' where
idProveedor=1;

Si esta sentencia modifica el NombreContacto de forma correcta muestra un


mensaje del numero de registros afectados por la instrucción,
en caso de que no se encuentre el Proveedor con idPoveedor=1 veremos un
mensaje de error:
Podemos modificar múltiples columnas en la misma instrucción separándolas
con comas como vemos en el siguiente ejemplo:
Update Proveedores set NombreCompañía='Comidas
Castellonenses',
NombreContacto='Federico Logan',
CargoContacto='Director de Compras',
Dirección='Calle Enmedio',
Ciudad='Castellón',
País='España'
where idProveedor=1;
Antes de ejecutar la instrucción los datos eran los siguientes:

Tras ejecutar la instrucción de actualización los datos quedan como vemos:

El proveedor de código IdProveedor=1 tiene los campos especificados en la


instrucción UPDATE cambiados por los nuevos valores.
Podemos utilizar varias condiciones para realizar una actualización unidas
mediante una AND o bien un OR.

Si suponemos que un directivo o encargado de una empresa proveedora a


cambiado a otra de la competencia que también es nuestra proveedora en
unas determinadas ciudades, podemos cambiar el Nombre de contacto de un
proveedor para varias ciudades como vemos en el siguiente ejemplo, datos
iniciales:
Update Proveedores set NombreContacto='ANDRES HERBE'
where ciudad='Berlín' or ciudad='Frankfurt' or
ciudad='Göteborg';
Tras ejecutar la instrucción vemos que los tres Nombres de contacto de las
ciudades especificadas han cambiado a ANDRES HERBE:

Los cambios se visualizan al volver a cargar la tabla proveedores.

10.3 INSTRUCCIONES DE CONTROL DE DATOS.

A) Control de acceso.
Las instrucciones de control de acceso permiten o evitan que se actualicen
varias tablas por diferentes instrucciones SQL al mismo tiempo, lo que crearía
una inconsistencia de los datos.
Estas instrucciones no están disponibles en Microsoft Acces, pero si en MS SQL
Server y en otros sistemas de base de datos tipo servidor.
Existen dos formas de bloqueo, exclusivo o compartido, en el modo exclusivo,
la tabla se bloquea completamente, de modo que ninguna otra transacción
puede acceder a ninguna parte de la tabla para ningún propósito mientras se
mantenga el bloqueo.
La sintaxis de la instrucción que cierra una tabla de manera exclusiva es la
siguiente:
Lock Nombre_Tabla in exclusive mode;
Si deseamos que otras instrucciones SQL puedan leer información de la tabla
pero no modificar ninguna datos de esta usaremos la instrucción:
Lock Nombre_Tabla in shared mode;
Para desbloquear una tabla usamos la instrucción:
Unlock Nombre_Tabla;

B) Control de permisos de usuario.


El SQL estándar permite conceder y retirar permisos a los usuarios sobre las
tablas de la base de datos mediante dos sentencias complementarias: Grant y
Revoke.
Grant
La sentencia Grant se utiliza para dar o conceder a un usuario o usuarios
varios privilegios de seguridad sobre una base de datos, la sintaxis es:
Grant privilegios on Nombre_Tabla To Usuario;
Por ejemplo la siguiente instrucción concede permiso de borrado (delete) a la
tabla proveedores a todos los usuarios de la base de datos (public).
Grant delete on proveedores to public;
Revoke
La sentencia Revoke se utiliza para retirar varios privilegios de seguridad a un
usuario o grupo de usuarios de una base de datos. Los privilegios se basan en
objects tales como Database, Index, Package, Schema o Table, la
sintaxis es:
Revoke privilegios on Nombre_Tabla To Usuario;
Por ejemplo la siguiente instrucción retira el permiso de borrado (delete) a la
tabla proveedores a todos los usuarios de la base de datos (public).
Revoke delete on proveedores from public;
Access no permite ejecutar estas sentencias de control de permisos de usuario,
MS SQL Server si admite las instrucciones Grant y Revoke.
Desde MS Access se muestra un error al intentar ejecutar estas instrucciones:

10.4 LAS TRANSACCIONES EN INSTRUCCIONES SQL.

Una transacción es un conjunto de sentencias o instrucciones SQL que deben


ser considerados como un todo en su ejecución por parte de la base de datos.
Una transacción debe completar todas las sentencias que posee para su
finalización correcta o no realizar ninguna de ellas si por cualquier motivo se ha
producido un error o no se ha podido completar alguna de las instrucciones
contenidas en la transacción.
Por ejemplo supongamos que estamos realizando una aplicación que permita
pagar compras por el numero de la tarjeta de crédito sobre una cuenta
corriente de la que se extrae el dinero del comprador que va a parar a otra
cuenta corriente del vendedor.
Durante las instrucciones que realizan la transacción debemos tener un control
total sobre el sistema que permita completar la operación de compra de una
cuenta a la otra o que no realice ningún cambio en las cuentas implicadas.
Suponemos que el comprador tiene el NumerodeTarjeta=9999999999, el
NumerodeCuenta=111111111 y que el vendedor tiene el
NumerodeCuenta=222222222 y el precio de la compra son 100 Euros.
Las instrucciones SQL para realizar la compra serán similares a las siguientes:
Select NumeroCuenta from Clientes where
NumerodeTarjeta=9999999999;
Comprobamos si existe el Cliente con este Numero de Tarjeta.
Si no existe el numero de cuenta, se produce un error y no continua la
transacción.
Si existe la cuenta para esta tarjeta debemos transferir 100 Euros de la cuenta
corriente del comprador a la del vendedor mediante estas dos instrucciones
inseparables:
Update CuentaCorriente Set Saldo = Saldo - 100 Where
NumeroCuenta=111111111;
Update CuentaCorriente Set Saldo = Saldo + 100 Where
NumeroCuenta=222222222;
Si no se han producido errores se deben confirmar las actualizaciones, si se ha
producido algún error debemos cancelar todas las instrucciones contenidas en
la transacción.
Para indicar al sistema que deseamos comenzar una transacción, finalizarla o
anularla debemos hacerlo con las sentencias:
Begin transaction
Inicia una Transacción, a partir de este momento el sistema controla las
instrucciones SQL para comprobar que se ejecutan correctamente hasta el
siguiente Commit.
Commit transaction
Finaliza una transacción correctamente, todos los cambios en curso desde el
anterior Begin son guardados en la base de datos y ya no se pueden
deshacer.
Rollback transaction
Anula una transacción deshaciendo las instrucciones SQL que se ejecutaron
desde el inicio de la misma mediante Commit.
La forma correcta de controlar el pago y cobro de que no se produzcan errores
durante la asignación de valores será controlando las instrucciones SQL con
Begin y Commit.
Begin transaction;
Select NumeroCuenta from Clientes where
NumerodeTarjeta=9999999999;
Update CuentaCorriente Set Saldo = Saldo - 100 Where
NumeroCuenta=111111111;
Update CuentaCorriente Set Saldo = Saldo + 100 Where
NumeroCuenta=222222222;
Commit transaction;
Podemos anular la transacción si observamos que alguna sentencia ha sido
errónea o bien si al introducir sentencias de una transacción y ejecutarlas paso
a paso por cualquier motivo deseamos anularla, para ello usaremos la
sentencia Rollback.
No podremos cerrar una conexión mientras tengamos una transacción en
curso, deberemos finalizarla con Commit o Rollback para poder finalizar la
conexión o la aplicación Expert SQL.
Podemos ejecutar las Instrucciones SQL paso a paso o de forma continuada,
en ambos casos si se detecta un error durante la transacción esta se anula de
forma automática.

También podría gustarte