Está en la página 1de 160

Administración de bases de datos con LibreOffice Base

Capítulo 1: LibreOffice Base


Bases de datos

Desde su nacimiento, la informática se ha encargado de proporcionar herramientas que


faciliten la manipulación de los datos. Antes de la aparición de las aplicaciones
informáticas, las empresas tenían como únicas herramientas de gestión de datos los
ficheros con cajones, carpetas y fichas de cartón. En este proceso manual, el tiempo
requerido para manipular estos datos era enorme. Pero la propia informática ha adaptado
sus herramientas para que los elementos que el usuario utiliza en cuanto a manejo de
datos se parezcan a los manuales. Por eso se sigue hablado de ficheros, formularios,
carpetas, directorios, etc. Muchas veces, para referirse a una base de datos, simplemente
se dice BD.

Base de datos LibreOffice Base

LibreOffice Base, al que de ahora en adelante se le llamará solamente Base, es una


interfaz de base de datos de escritorio con todas las funciones, diseñado para satisfacer las
necesidades de una amplia gama de usuarios. Pero Base también atiende a los usuarios
avanzados y requerimientos empresariales, y proporciona controladores nativos para
algunos de los motores de bases de datos multiusuario más utilizados: MySQL/MariaDB,
Adabas D, MS Access y PostgreSQL. Además, el soporte incorporado para los controladores
JDBC y ODBC estándar permite conectar a prácticamente cualquier otro motor de base de
datos existente.

Esta es la ventana del entorno de trabajo de Base

1
Administración de bases de datos con LibreOffice Base

Cuando se crea una base de datos con Base, se genera un archivo con extensión: .odb

Estructura mínima de almacenamiento en una base de datos relacional

Las bases de datos relacionales se dividen, básicamente, en los siguientes componentes:

Tabla
Objeto de almacenamiento perteneciente a una BD. Es una estructura organizada en filas y
columnas donde se almacenan registros o filas de datos. Cada tabla tiene un nombre único
en la BD.

Registro o fila
Cada una de las filas de una tabla, esta compuesto por campos o atributos.

Campo o columna
Es cada una de las casillas de un registro donde se guardan los datos. Cada campo tiene un
nombre único para la tabla de la cual forma parte, además es de un tipo (naturaleza)
determinado, por tanto no podemos guardar limones en el cajón de las naranjas, en
términos informáticos y a modo de ejemplo, no encontraremos un dato alfanumérico
(letras y números) en un campo diseñado para guardar datos numéricos. Se describirán
los tipos de datos más adelante.

Bases de datos relacionales


Base genera bases de datos relacionales. En un modelo relacional, cada grupo de datos
está representado por tablas las cuales tienen relación entre sí.

Campos o columnas de la tabla


Tabla Estudiante

CodigoEstudiante NombreEstudiante
10-2020 Marco del Cid
11-2020 Vilma Pérez

Registros o filas de la tabla

2
Administración de bases de datos con LibreOffice Base

Clave primaria

En el diseño de bases de datos relacionales, se llama clave principal a un campo o a una


combinación de campos que identifica de forma única a cada fila de una tabla. Una clave
primaria comprende de esta manera una columna o conjunto de columnas. No puede
haber dos filas en una tabla que tengan la misma clave primaria.
Ejemplos de claves primarias son DPI (asociado a una persona) o ISBN (asociado a un
libro), el código de un producto, el número de carné de un estudiante, por citar algunos
ejemplos.

En la tabla Estudiante, el código del estudiante es llave primaria o clave principal.

En Base, las claves


primarias, se
acompañan de una
llave.

Llaves compuestas

Se le llama así, a una llave que está conformada por más de un campo. En el siguiente
ejemplo, un estudiante puede tener varias materias asignadas y, si llegara a reprobar la
materia, podrá volver a asignársela.

Diagrama o Modelo Relacional

3
Administración de bases de datos con LibreOffice Base

En la tabla AsignacionMateria, la clave principal está formada por tres campos.

CodigoEstudiante CodigoMateria FechaAsignacionMateria NotaMateria


10-2020 10 15/1/2020 85
11-2020 08 10/1/2020 90
12-2020 10 12/1/2020 42
13-2020 07 25/1/2020 70
12-2020 10 8/5/2020 71

Este alumno se ha asignado dos veces el mismo curso pero, en fechas distintas

Como puede notarse, el estudiante con código: 12-020 se asignó la materia con código: 10
en fecha: 12/1/2020. Al no haber alcanzado una nota satisfactoria, se ha tenido que volver
a asignar la materia en otra fecha, habiendo obtenido, esta vez, una nota aprobada. En
este caso los dos campos se repiten, por lo que ambos deben formar la clave principal
unido con la fecha de asignación de materia, para diferenciar cuando un estudiante se
vuelve a asignar una materia (en caso de haberla reprobado)

A continuación se muestra,un caso más, de clave primaria compuesta:

La base de datos servirá para llevar registros de los productos, proveedores y pedidos.

Tabla Producto: En esta tabla, la clave primaria es el código del producto.

Tabla Proveedor: La clave principal es el código del proveedores

Tabla Pedido: La clave principal consta de tres campos.

4
Administración de bases de datos con LibreOffice Base

En la tabla Pedido, el campo CodigoProveedor no se puede definir como clave primaria


porque ya es clave primaria en la tabla Proveedor. Así mismo, el campo CodigoProducto
no se puede establecer como campo clave primaria en la tabla Pedido porque ya lo es en
la tabla Producto porque: Un único campo no puede ser clave primaria en más de una
tabla.

En el caso de la tabla Pedido, los campos CodigoProveedor y CodigoProducto sí podrían


(juntos) ser clave primaria compuesta pero, como a un mismo proveedor se le puede
comprar el mismo producto varias veces, los datos se repetirían y, al ser ambos, clave
primaria no se podría registrar este hecho. Para ello, debe incluirse como clave primaria, al
campo FechaPedido.

La siguiente tabla muestra lo explicado:

CodigoProveedor CodigoProducto FechaPedido Cantidad


10 100 20/1/2020 30
10 200 20/1/2020 45
20 300 7/3/2020 65
20 400 7/3/2020 72
10 200 9/4/2020 250
10 100 9/4/2020 52

Al proveedor con código 10 se le han comprado los productos con códigos 100 y 200 en
distintas fechas, lo que hace que la clave principal: CodigoProveedor + CodigoProducto +
Fecha sea única.

5
Administración de bases de datos con LibreOffice Base

Clave Foránea

Una clave foránea es una columna o grupo de columnas de una tabla que contiene valores
que coinciden con la clave primaria de otra tabla. Las claves foráneas se utilizan para unir
tablas.

En el ejemplo anterior, en la tabla Pedido hay dos claves foráneas: CodigoProveedor y


CodigoProducto, debido a que cada uno de ellos, en sus correspondientes tablas
(Proveedor y Producto) son claves primarias.

Un campo que no esté definido como clave primaria, también, puede ser clave foránea,
como se muestra en el siguiente ejemplo:

Entidad débil

Entidad fuerte

Clave foránea o campo de


enlace, el cual vincula la tabla
Estudiante con la tabla Pago

Tabla Principal o entidad fuerte


La tabla principal es la que tiene un único registro que puede estar relacionado con varios
de la tabla secundaria. Por lo que si la relación es 1 a varios, la que tenga el 1 sería la
principal.

Tabla secundaria o entidad débil


Es una tabla que depende de la existencia de otra . Por ejemplo la tabla Pago es una
entidad débil porque depende de la tabla Estudiante. La tabla Estudiante es entidad
fuerte porque puede existir sin la participación de la tabla Pago.

6
Administración de bases de datos con LibreOffice Base

Actividad

A) En cada uno de los siguientes casos, identifique una clave principal que pueda
identificar a cada objeto.

1) Un automóvil
2) Un afiliado al IGSS
3) Los libros en una biblioteca
4) Los estudiantes en un colegio
5) Una cuenta bancaria

B) Escriba los campos de cada tabla para que permitan llevar registro de lo solicitado.
Incluya la clave principal.
1) Medicamentos en un hospital
2) Empleados en una empresa
3) Vehículos en un parqueo
4) Pacientes en una veterinaria
5) Libros en una biblioteca

7
Administración de bases de datos con LibreOffice Base

Relaciones entre tablas

Las relaciones son los vínculos que tiene una tabla con otras en una base de datos
relacional. La diferencia de las bases de datos relacionales con respecto a una base de
datos plana consiste en que los datos sólo se introducen una sola vez en una tabla, pero
gracias a las relaciones pueden aparecer en las tablas que se quiera.

Cualquier modificación sólo hay que efectuarla una sola vez y automáticamente se
realizará en todas las demás tablas. De este modo se ahorra mucho tiempo, espacio y
exactitud en los datos que siempre estarán actualizados independientemente de la tabla
en la que estemos.

Tipos de relaciones

Existen tres tipos de relaciones, que se explican a continuación. Más adelante se verá
cómo quedan guardadas relaciones de este tipo en Base.

Relación uno a uno

Cada registro de la tabla A se relaciona sólo con un registro de una tabla B. En la práctica
se utilizan muy poco. En el siguiente diagrama relacional, se muestra el hecho de que en
un aula puede haber, solamente, un proyector. Las relaciones uno a uno se dan de clave
primaria a clave primaria.

8
Administración de bases de datos con LibreOffice Base

Relación uno a varios

Cada registro de la tabla A está relacionado con varios registros de la tabla B y cada
registro de la tabla B está relacionado con un sólo un registro de la tabla A.

Una relación de este tipo se daría entre las tablas Estudiante y Pago, debido a que un
estudiante puede realizar varios pagos. El diagrama relacional, se muestra a continuación:

La letra “n” significa: varios

Relación varios a varios (muchos a muchos)

Cada registro de la tabla A puede estar relacionado con más de un registro de la tabla B y
cada registro de la tabla B puede estar relacionado con más de un registro de la tabla A.

En el ejemplo, la relación varios a varios existe entre las tablas Proveedor y Producto. Un
proveedor puede abastecer varios productos y un producto puede ser solicitado a varios
proveedores. Puede notarse que se trata de una relación uno a varios recíproca entre las
dos tablas. Sin embargo, para poder implementarla, se hace necesaria una tercer tabla
que una a las otras dos. Esta tabla se denomina: Tabla de Enlace. Se trata de una tabla
secundaria que une a dos tablas primarias. El nombre de esta tabla , se puede obtener de
la acción que se lleva a cabo entre las otras dos; en este caso: A un proveedor se le
pueden PEDIR varios productos . Como los nombre de las tablas no deben ser verbos, se
opta por su correspondiente sustantivo: Pedido.

9
Administración de bases de datos con LibreOffice Base

Tabla de enlace

Observación: Sin una tabla de enlace, no se puede realizar una relación varios a varios.
Integridad Referencial

En la relación que hemos definido en el apartado anterior, se impide que cualquier registro
relacionado sea modificado o eliminado. Esta propiedad es lo que se conoce como
integridad referencial. Por ejemplo, a un estudiante que no esté registrado no se le puede
registrar pago alguno. Primero ha de existir en la tabla Estudiante para que luego sea
posible almacenar los pagos que realice.

Cuando existe una relación entre 2 tablas, cualquier operación con los datos ha de
respetar la relación. En caso contrario, no se realizará.

Tipos de campos en Base

Texto [VARCHAR]: Texto hasta 32700 caracteres, número de caracteres es variable, es


aconsejable para un campo como puede ser Observaciones.

Texto (fijo) [CHAR]: Texto hasta 255 caracteres, número de caracteres es fijo, es una buena
definición para campos como Nombre, apellidos, domicilio, etc.

10
Administración de bases de datos con LibreOffice Base

Texto [VARCHAR_IGNORECASE]: No distingue entre mayúsculas y minúsculas, cuidado con


este tipo de campo, ya que si es una base de datos que hace documentos para público
puede tener algún problema.

Nota [LONGVARCHAR]: Textos largos, 2 Gigabytes en caracteres, un buen formato para


escribir largos textos.

Tiny Integer [TINYINT]: Números enteros de -127 a 127.

Small Integer [SMALLINT]: Números enteros entre -32.768 y + 32.768.

Integer [INTEGER]: Números enteros hasta 10 dígitos. Acepta valor automático.

Big Integer [BIGINT]: Números enteros hasta 19 dígitos. Acepta valor automático.

Numero [NUMERIC]: Números enteros con muchísimos dígitos y 18 decimales.

Decimal [DECIMAL]: Similar al anterior.

Double [DOUBLE]: Números decimales con una precisión hasta 14 dígitos.

Float [FLOAT]: Números decimales con una precisión hasta 7 dígitos.

Real [REAL]: Similar al anterior.

Hora [TIME]: Datos tipo hora.

Fecha [DATE]: Datos tipo fecha, formato adecuado para fecha de nacimiento, fechas de
alta.

Fecha/Hora [TIMESTAMP]: Datos fecha y hora, un buen formato para cuando tengamos
que tener un registro de entrada y salida, en el cual debe figurar tanto la fecha como la
hora.

Sí/No [BOOLEAN]: Valores son true-false, verdadero-falso o 1-0, funciona como un


biestable.

Imagen [LONGVARBINARY]: Objetos OLE, imágenes, videos, etc...

11
Administración de bases de datos con LibreOffice Base

Actividad

A) Dibujar el modelo relacional de cada caso que se presenta. Todas las relaciones son
uno a varios. Identifique las tablas principales y secundarias. No olvide acompañar
de una llave, sus claves primarias. Identificar, también, las claves foráneas.

1) Un médico puede atender a varios pacientes


2) Un departamento empresarial puede tener varios empleados
3) A un equipo de fútbol le corresponden varios jugadores
4) Un cuenta-habiente puede realizar varios depósitos a su cuenta bancaria
5) A una categoría pueden pertenecer varios libros.

B) Dibujar el modelo relacional de cada caso que se presenta. Todas las relaciones son
varios a varios. Identifique las tablas principales y secundarias. No olvide
acompañar de una llave, sus claves primarias y foráneas.

1) Un médico puede atender a varios pacientes y, un paciente puede ser atendido por
varios médicos.
2) Un estudiante puede prestar varios libros en la biblioteca y, un libro puede ser
prestado a varios alumnos.
3) Un cliente puede comprar varios productos y un producto puede ser vendido a
varios clientes.
4) En una empresa, un vehículo puede ser conducido por varios empleados y, un
empleado puede conducir varios vehículos.
5) En un curso pueden inscribirse varios estudiantes y , un estudiante puede
inscribirse en varios cursos.

12
Administración de bases de datos con LibreOffice Base

Creación de una base de datos en LibreOffice Base

Para crear una BD en Base, deben seguirse los siguientes pasos:

1) Luego de poner en marcha Base, se mostrará el asistente de bases de datos, en el


cual debe estar seleccionada la opción: Crear una base de datos nueva.
2) Clic en Siguiente >

13
Administración de bases de datos con LibreOffice Base

3) Si la base de datos va a ser utilizada por otras aplicaciones de la suite de


LibreOffice, entonces marque la opción: Sí, registrar la base de datos, de lo
contrario marcar la opción No.

4) Clic en Finalizar

14
Administración de bases de datos con LibreOffice Base

A continuación se debe seleccionar la carpeta donde se desea guardar la BD y digitar el


nombre con el que se almacenará.
5) Clic en Guardar.

6) Luego de lo anterior, se mostrará el entorno de trabajo de Base


7) Para crear una tabla, hacer clic en: Crear tabla en modo de diseño...

15
Administración de bases de datos con LibreOffice Base

9) En la ventana de diseño de la tabla, se deben ingresar los nombre de los campos y


el tipo de dato de cada uno.

Si deseamos que una clave principal tenga


un valor automático, seleccionamos el campo
y en esta propiedad marcamos Sí

Estableciendo la clave principal

Siguiendo con el ejemplo anterior, estableceremos el campo Codigo como clave principal.
Para ello, hacer lo siguiente:

1) Clic derecho en encabezado de


columna del campo a configurar.
2) Seleccionar: Clave
principal
1

16
Administración de bases de datos con LibreOffice Base

Guardar la estructura de una tabla

Una vez que se ha creado la estructura de una tabla, se debe guardar para que los
cambios realizados sean permanentes. Esto se lleva a cabo de la siguiente manera:

1) Clic en la X para cerrar la ventana de diseño de tablas


2) Digitar el nombre con el que guardará la tabla.
3) Clic en Aceptar

La propiedad Valor automático

Con esta propiedad podemos indicar si el valor de un campo será asignado,


automáticamente por Base. Al establecerlo a: Sí, Base le dará un valor al campo, cada vez
que se ingrese un registro. Si lo dejamos marcado en: No, el usuario deberá ingresar el
valor para el campo. Los valores automáticos solamente funcionan con tipos de datos :
Entero, Entero largo y Entero corto.

Editar tablas

Se entiende por edición, al proceso de modificar la estructura de una tabla; es decir,


agregar o quitar campos, cambiar los tipos de datos, cambiar los nombres de los campos.
Para editar una tabla se debe realizar lo siguiente:

17
Administración de bases de datos con LibreOffice Base

1) Clic derecho sobre el nombre dela tabla a editar


2) Clic en Editar...

3) La tabla se mostrará en vista diseño, con lo cual se podrán realizar las


modificaciones deseadas.

18
Administración de bases de datos con LibreOffice Base

Eliminar campos de una tabla

En Base, se elimina un campo de una tabla de la siguiente forma:


1) Clic derecho sobre el encabezado de fila del campo a eliminar
2) Clic en Eliminar
3) Para que los cambios efectuados tengan efecto, cerrar la ventana de diseño de
tablas (haciendo clic en la X)
4) Clic en Sí, para guardar los cambios.

19
Administración de bases de datos con LibreOffice Base

Guardar una base de datos

Para guardar una base de datos se puede proceder de dos formas:

Forma 1:

1) Clic en Archivo
2) Clic en Guardar

Forma 2:
• Clic en el icono de Guardar

20
Administración de bases de datos con LibreOffice Base

Ingresar registros a una tabla


1) Para ingresar registros a una tabla, hacer doble clic sobre su nombre.

2) Luego de lo cual, se mostrará la ventana de vista de datos de la tabla


3) Para que los registros se guarden, hacer Clic en el icono Guardar registro actual.

2
3

Cómo el campo Codigo se ha configurado con


Valo automático, el usuario no debe ingresar su
valor. Por eso se muestra <Campo automático>

21
Administración de bases de datos con LibreOffice Base

Relacionando tablas en Base

El proceso se explica mediante un ejemplo, en el cual se establecerá una relación de uno a


varios: Un departamento puede tener varios empleados (un empleado puede pertenecer
a un sólo departamento).

A) Crear una base de datos llamada Empresa

B) Crear las siguientes tablas


No use tildes ni espacios para los
nombres de campos.
• Tabla : Departamento

CodigoDepartamento Entero (con propiedad valor automático en Sí)


NombreDepartamento Texto

• Tabla : Empleado Por lo general, los nombres de


tablas se establecen en singular
CodigoEmpleado Entero
CodigoDepartamento Texto
NombreEmpleado Texto

Clave foránea

Las tablas quedarán como se muestra a continuación:

En las propiedades del campo


Sueldo, por ser de tipo Decimal,
establecer en 2 la cantidad de decimales

22
Administración de bases de datos con LibreOffice Base

En el entorno de Base, se muestran las dos tablas creadas.

C) Para relacionar las tablas, hacer lo siguiente:


1) Clic en Herramientas
2) Hacer clic en Relaciones…

23
Administración de bases de datos con LibreOffice Base

Se mostrará la ventana de diseño de relaciones


3) Seleccionar, una a una, cada tabla y hacer clic en Añadir o hacer doble clic
sobre el nombre de cada una.
4) Luego de lo anterior, las tablas se mostrarán en el diseñador
5) Clic en Cerrar

6
5

7) Arrastre y suelte el campo: CodigoDepartamento de la tabla Departamento, hacia


el campo: CodigoDepartamento de la tabla Empleado.

Tabla secundaria
7

Tabla primaria Arrastrar campos,


siempre, de tabla
primaria hacia la
tabla secundaria

24
Administración de bases de datos con LibreOffice Base

En el supuesto de que un departamento fuera eliminado de la tabla, los correspondientes


empleados (de ese departamento), también serían eliminados de la tabla empleados; es
decir, se respetará la Integridad Referencial.

8) Se muestra la ventana de Relaciones, en la cual se marcarán las opciones:


Actualización en cascada y Eliminar en cascada. Con estas dos opciones
marcadas, Base hará que se establezca la Integridad Referencial.

9) Clic en Aceptar

25
Administración de bases de datos con LibreOffice Base

10) En la ventana de diseño de relaciones, se mostrarán las tablas con una relación
uno a varios.

Puede agregar más


tablas de la base de
datos, haciendo clic
sobre este icono.

Línea de relación

11) Al cerrar la ventana de relaciones, se deben guardar los cambios realizados,


haciendo clic en Sí.

12) A continuación se ingresan los registros, comenzando con la entidad fuerte o tabla
principal. Para este caso, la tabla: Departamento.

26
Administración de bases de datos con LibreOffice Base

13) Luego, se ingresan registros en la tabla secundaria (entidad débil)

El departamento con código cero tiene


3 empleados, el departamento 1 tiene 2

¿Qué sucede, si en la tabla Empleado agregamos un código de departamento que no


existe en la tabla Departamento?

Este mensaje indica que


el registro ingresado no es
válido por infringir la
integridad referencial

Se genera un error porque el departamento con código 3 no existe en la tabla


Departamento. Hacer clic en Aceptar y corregir el registro con un dato válido
Modificar o eliminar una relación

27
Administración de bases de datos con LibreOffice Base

Para tal propósito, hacer clic derecho sobre la línea de relación a cambiar y seleccionar la
acción requerida (Eliminar o editar) .

Errores en la creación de relaciones

Cuando se crean las estructuras de las tablas, debe tomarse en cuenta que las claves
principales y las correspondientes claves foráneas, deben ser del mismo tipo de datos. Por
ejemplo: Si la clave principal CodigoProducto es de tipo Entero y la clave foránea
CodigoProducto (en la otra tabla) es de tipo Texto, se generará el siguiente error.

Hacer clic en Aceptar y hacer las correcciones.

Cambiar el nombre de una tabla

28
Administración de bases de datos con LibreOffice Base

1) Hacer clic derecho sobre nombre de la tabla.


2) Clic en Cambiar nombre...

Actividad

Desarrollar las bases de datos que se piden a continuación. Implementar las soluciones en
Base, estableciendo las relaciones que corresponden.

1) Una base de datos para una pequeña empresa debe contener información acerca
de clientes, artículos y pedidos. Hasta el momento se registran los siguientes datos
en documentos varios:
• Para cada cliente: Número de cliente (único), Direcciones de envío (varias por
cliente), Saldo, Límite de crédito (depende del cliente, pero en ningún caso debe
superar los Q10,000.00 , Descuento.

• Para cada artículo: Número de artículo (único), proveedor que distribuye,


Existencias de ese artículo en cada fábrica, Descripción del artículo.

Para cada pedido: Cada pedido tiene una cabecera y el cuerpo del pedido. La
cabecera está formada por el número de cliente, dirección de envío y fecha del
pedido. El cuerpo del pedido son varias líneas, en cada línea se especifican el

29
Administración de bases de datos con LibreOffice Base

número del artículo pedido y la cantidad. Además, se ha determinado que se debe


almacenar la información de las fábricas. Sin embargo, dado el uso de
distribuidores, se usará: Número de la fábrica (único) y Teléfono de contacto.

2) Le contratan para hacer una BD que permita apoyar la gestión de un


sistema de ventas. La empresa necesita llevar un control de proveedores,
clientes, productos y ventas. Un proveedor tiene un código nombre, dirección,
teléfono y página web. Un cliente también tiene NIT, nombre, dirección, pero
puede tener varios teléfonos de contacto. Un producto tiene un id único,
nombre, precio actual, stock y código del proveedor . Además se organizan en
categorías, y cada producto va sólo en una categoría. Una categoría tiene id,
nombre y descripción. Por razones de contabilidad, se debe registrar la
información de cada venta con un id, fecha, cliente, descuento y monto final.
Además se debe guardar el precio al momento de la venta, la cantidad vendida y el
monto total por el producto.

3) Crear una base de datos para un sistema de control de vuelos adaptado a las
siguientes reglas de gestión (indicar las entidades, interrelaciones, etc., que se
deducen de cada una de las reglas):

a) De cada aeropuerto se conoce su código, nombre, departamento y país. b) En


cada aeropuerto pueden tomar tierra diversos modelos de aviones (el
modelo de un avión determina su capacidad, es decir, el número de asientos. c)
En cada aeropuerto existe una colección de programas de vuelo. En cada programa
de vuelo se indica el número de vuelo, línea aérea y días de la semana en que
existe dicho vuelo. d) Cada programa de vuelo despega de un aeropuerto y aterriza
en otro. e) Los números de vuelo son únicos para todo el mundo. f) En cada
aeropuerto hay múltiples aterrizajes y despegues. Todos los aeropuertos
contemplados están en activo, es decir, tienen algún aterrizaje y algún despegue. g)
Cada vuelo realizado pertenece a un cierto programa de vuelo. Para cada vuelo se
quiere conocer su fecha, plazas vacías y el modelo de avión utilizado. h) Algunos
programas de vuelo incorporan escalas técnicas intermedias entre los aeropuertos
de salida y de llegada. Se entiende por escala técnica a un aterrizaje y despegue
consecutivos sin altas ó bajas de pasajeros. i) De cada vuelo se quieren conocer las
escalas técnicas ordenadas asignándole a cada una un número de orden. Por
ejemplo, el programa de vuelo 555 de Iberia con vuelos los lunes y jueves
despega de Guatemala y aterriza en Canadá teniendo las siguientes escalas
México, Estados Unidos.

30
Administración de bases de datos con LibreOffice Base

Formularios

Los formularios son muy útiles a la hora de introducir datos, ya que aparte de la
comodidad que ofrecen, con su uso se pueden evitar también los posibles errores que
podrían ocurrir usando la vista Hoja de Datos.

Los formularios se pueden vincular tanto a tablas como a consultas.

Crear un formulario usando el asistente

En la parte izquierda de la ventana principal hemos de hacer clic en el icono Formularios y


a su derecha en Usar el asistente para crear formulario:

31
Administración de bases de datos con LibreOffice Base

Se mostrará la siguiente ventana, y en el cuadro de diálogo Asistente para formularios:

1) Seleccionar la tabla de la cual se tomarán los campos para el formulario


2) Pueden seleccionarse los campos, uno por uno, haciendo doble clic sobre el
nombre o seleccionando cada uno y haciendo clic sobre el botón >. Para pasar
todos los campos al formulario, en un solo clic, presionamos el botón >>.
3) Se muestran los campos que se visualizaran en el formulario
4) Clic en Siguiente>

32
Administración de bases de datos con LibreOffice Base

5) En caso de que se desee agregar una tabla secundaria puede hacerse en esta
ventana. De lo contrario clic en Siguiente>

6) La forma en que se visualizarán los controles se elige en este ventana


7) Clic en Siguiente>

33
Administración de bases de datos con LibreOffice Base

8) La ventana de modo de entrada de datos, ofrece varias opciones. Si desea que el


formulario tenga todas las funcionalidades, deje marcada la opción: El formulario
mostrará todos los datos. Clic en Siguiente>

9) Seleccionar el estilo deseado para el formulario. Clic en Siguiente>

34
Administración de bases de datos con LibreOffice Base

10) Ingresar el nombre para el formulario. Puede dejarse el nombre asignado por
defecto.
11) Clic en Finalizar

10

11

12) Se muestra el formulario con los campos de la tabla seleccionada y el primer


registro.

Usando la barra de navegación podrá: buscar, agregar, guardar, eliminar, filtrar y


moverse entre registros (hacia el anterior o siguiente)

35
Administración de bases de datos con LibreOffice Base

13) Al terminar de trabajar con el formulario, cerrarlo y guardar los cambios.


14) En entorno de Base, se mostrarán los nombres de los formularios creados.

• Se puede modificar el diseño de un formulario,


haciendo clic derecho sobre su nombre y luego
clic en Editar...

Formulario con subformulario

Al trabajar con datos relacionales (datos relacionados que están almacenados en tablas
independientes), a menudo necesita ver los datos de varias tablas o consultas en el mismo
formulario. Por ejemplo, puede que quiera ver al mismo tiempo datos de los
departamentos de una tabla e información sobre los empleados desde otra tabla. Los
subformularios son una herramienta útil para hacerlo. Con este tipo de formularios, hay
una sección de encabezado (entidad fuerte) y una de detalle (entidad débil)

Para la creación de un formulario con subformualrio, seguir el siguiente proceso:

36
Administración de bases de datos con LibreOffice Base

1) Clic en: Crear un formulario mediante asistente…

2) Seleccionar la tabla principal (para la sección de detalle)


3) Trasladar todos los campos de la tabla al formulario, haciendo clic en el botón >>
4) Los campos se mostrarán en el cuadro de la derecha
5) Clic en Siguiente>

3
4

37
Administración de bases de datos con LibreOffice Base

6) Se mostrará la ventana para agregar la entidad débil como subformulario. Marcar


la casilla: Agregar subformulario y el botón de radio: Subformulario basado en
relación existente.
7) Seleccionar, con un clic, el nombre de la tabla secundaria para la sección de detalle
8) Clic en Siguiente>

9) Seleccione cada campo de la tabla secundaria, haciendo doble clic. No elija la clave
foránea (para este caso, el campo CodigoDepartamento no seleccionarlo)
10) Los campos pasaran al cuadro de la derecha. Clic en: Siguiente>

9
10

Las claves foráneas no deben pasarse


a este cuadro

38
Administración de bases de datos con LibreOffice Base

11) Esta ventana permite organizar los controles en los formularios. Para la tabla
principal (detalle), seleccione: En columnas. Para la tabla secundaria, elija: Como
hoja de datos. Clic en Siguiente>

11

12) Dejar marcada esta opción. Clic en Siguiente>

12

39
Administración de bases de datos con LibreOffice Base

13) Seleccionar el estilo deseado. Clic en Siguiente>

13

Puede cambiar el aspecto de los


campos, seleccionando estas opciones

14) Digitar el nombre para el formulario. Clic en Finalizar.

14

40
Administración de bases de datos con LibreOffice Base

15) Se muestra en formulario, con la tabla principal como encabezado y el


subformulario con los campos y registros de la tabla secundaria.

La tabla principal es el encabezado

La tabla secundaria es el detalle

Creación de formulario sin asistente

Los formularios pueden ser generados sin necesidad de asistentes. Esto es útil
cuando se desea personalizar, lo más posible, el aspecto de un formulario.
Seguir los siguientes pasos:

1) Seleccionar la opción Formularios y luego un


clic en : Crear un formulario en modo diseño.

41
Administración de bases de datos con LibreOffice Base

2) Clic en el icono de Navegador de formularios…

3) Se mostrará la ventana para crear un nuevo formulario. Clic derecho sobre:


Formularios , luego seleccionar: Nuevo, clic en: Formulario

42
Administración de bases de datos con LibreOffice Base

4) En la ventana del navegador de formularios, se habrá agregado un formulario. Es


conveniente cambiarle en nombre que Base le ha asignado, para ello: Clic derecho
sobre el nombre y seleccionar: Cambiar nombre.

5) Digitar el nombre deseado y luego oprimir Enter.


6) Se le debe asignar una tabla o consulta. Hacer clic derecho sobre el nombre del
formulario y luego clic en Propiedades.

43
Administración de bases de datos con LibreOffice Base

7) En ventana de Propiedades del formulario, pestaña Datos, elegir el tipo de


contenido (tabla, consulta, orden de SQL). En este caso, seleccionar: Tabla.
8) En Contenido, elegir la tabla que servirá para el formulario. Por ejemplo: Empleado
9) Clic en X, para cerrar la ventana

9
7

10) Clic en el icono: Añadir campo...

10

44
Administración de bases de datos con LibreOffice Base

11) Se mostrara la ventana de registros de la tabla, de la cual, con clic sostenido


arrastrar y soltar los campos hacia el formulario.

11

12) Organizar los campos en el formulario, para que se vea estético.


13) Desactivar o activar el modo de diseño haciendo clic en este icono.
14) El formulario mostrará cada registro de la tabla

13

Puede navegar entre


registros, haciendo clic en
las flechas.

45
Administración de bases de datos con LibreOffice Base

Agregar controles a un formulario

La finalidad de un formulario es, principalmente, la de ofrecer una forma agradable y


eficiente de ingresar registros a una tabla. Por ello, es conveniente mejorar su aspecto
agregando etiquetas, colores, etc.

Incorporar etiquetas

1) Estando el formulario en modo de diseño, hacer clic sobre el control Etiqueta y


dibujar un rectángulo en el área deseada dentro del formulario.
2) Hacer doble clic sobre el rectángulo de la etiqueta para que se muestren sus
propiedades.
3) Modificar la propiedad etiqueta con el texto deseado.
4) En Tipo de letra, en el botón … , puede modificar la fuente, el tamaño, color.

5) Guardar las modificaciones hechas en el formulario

46
Administración de bases de datos con LibreOffice Base

Cuadro combinado

Este tipo de control permite seleccionar una entre varias opciones. Es muy útil para validar
o restringir el ingreso de datos en un campo. Los cuadros combinados pueden hacer
referencia a datos almacenados en tablas.

Cualquier control que represente a un campo de una tabla, está compuesto por dos
controles: Una etiqueta y un cuadro de texto.

Para transformar un cuadro de texto en un cuadro combinado, primero deben separarse la


etiqueta del cuadro de texto. Para tal propósito;

1) Hacer clic derecho sobre el cuadro de texto a modificar


2) Clic en Desagrupar
3) Eliminar el cuadro de texto

47
Administración de bases de datos con LibreOffice Base

4) Seleccionar con un clic el control Cuadro combinado y “dibujarlo” en la ubicación


deseada dentro del formulario.
5) Se abrirá el Asistente de Cuadro combinado, en el cual se ha de seleccionar la
tabla que proporcionará los datos. En este caso, la tabla Departamento
6) Clic en Siguiente>

48
Administración de bases de datos con LibreOffice Base

7) Con un clic, elegir el campo que se visualizará en el cuadro combinado. Debe ser la
clave foránea. Para este ejemplo: CodigoDepartamento.
8) Clic en Siguiente>

9) El valor seleccionado en el cuadro combinado, se deberá guardar en la


tabla, por lo que debe seleccionarse esta opción.
10) Elegir el campo en el que se almacenará. Clic en Finalizar

10

Este campo debe ser


la clave foránea de la
tabla secundaria.

49
Administración de bases de datos con LibreOffice Base

Al ejecutar el formulario, se mostrará el primer registro de la tabla. Haciendo clic sobre el


cuadro combinado, se visualizarán los códigos de departamento almacenados en la tabla
Departamento.

Concatenación de campos

En el formulario anterior, puede observarse el inconveniente de que el cuadro combinado


muestra, solamente, los códigos de los departamentos. Sería conveniente que se
mostraran tanto los códigos como los nombres de los departamentos registrados. Para
lograrlo, se hará uso de la funcionó SQL denominada: Concat. Su sintaxis es la siguiente:

Concat(campo o texto1, campo o texto2, …)

donde todos sus argumentos deben ser de tipo texto.

Aplicándolo al formulario de ejemplo, se debe realizar lo siguiente:

1) Abrir el formulario en modo de diseño


2) Doble clic sobre el cuadro combinado

1
2

50
Administración de bases de datos con LibreOffice Base

3) Se mostrará la ventana de propiedades del cuadro combinado.


4) En la ficha Datos , propiedad: Contenido de lista, agregue lo siguiente:

SELECT DISTINCT Concat("CodigoDepartamento", "NombreDepartamento") FROM


"Departamento"

No borre el contenido de la lista; solamente


modifíquelo, agregando la función Concat y
los nombres de campos que desea unir,
encerrados entre comillas.

5) Cerrar la ventana de propiedades


6) Ejecute el formulario y seleccione una opción del cuadro combinado.

Se muestran los códigos junto


con el nombre del departamento

51
Administración de bases de datos con LibreOffice Base

Consultas

Las bases de datos tienen información almacenada para diversos fines, entre ellos el de
poder consultar los datos que queramos en un determinado momento. Por ello uno de los
elementos que más se suele utilizar son las consultas, ya que éstas nos van a permitir
extraer la información para, posteriormente, poder tratarla.

Mediante una consulta seleccionamos y filtramos la información a mostrar de una o varias


tablas.

El resultado de una consulta se denomina: Hoja de Datos y presenta aspecto de tabla; sin
embargo, las consultas no crean nuevas tablas, sino que muestran parte de la tabla o las
tablas sobre las que se realiza la consulta.

Asistente para consultas

El Asistente para consultas sencillas crea consultas que recuperan datos de los campos
especificados en una o más tablas o consultas, aunque hemos de recordar que éstas no
podrán tener un grado de complejidad grande, ya que para este tipo de consultas
debemos implementarlas en vista Diseño.

El asistente contiene una serie de pasos en los que iremos configurando la consulta y que
nos mostrarán, al terminarlos, el resultado obtenido.

Para crear una consulta con el asistente, seguir los siguientes pasos:
1) Seleccionar la opción : Consultas
2) Clic en: Usar el asistente para crear una consulta…

52
Administración de bases de datos con LibreOffice Base

3) Seleccionar la tabla sobre la que se hará la consulta.

4) Se mostrarán los campos de la tabla seleccionada. Con doble clic, sobre el nombre
de cada campo, puede seleccionarlos para que se muestren en la consulta. Si se
necesitan todos los campos de la tabla, pueden seleccionarse haciendo clic en el
botón >>
5) Clic en Siguiente

4
Los campos
pasarán hacia el
cuadro derecho
5

53
Administración de bases de datos con LibreOffice Base

6) Si se quiere una consulta que muestre los campos en algún orden, puede
establecerse en esta ventana. Clic en Siguiente>

7) Pueden establecerse condiciones sobre los campos, para que se muestren


solamente aquellos que cumplan con determinadas condiciones. En el ejemplo se
ha establecido la condición de que se muestren, únicamente, los empleados cuyo
sueldo sea mayor que 7000 . Clic en Siguiente>

54
Administración de bases de datos con LibreOffice Base

8) Clic en Siguiente>

9) No se desea usar alias, por lo tanto, clic en Siguiente>

55
Administración de bases de datos con LibreOffice Base

10) Puede darsele un nombre, a la consulta, en este espacio. Clic en Finalizar.

11) Se muestra la consulta con los registros de la tabla

Unicamente se muestran los registros cuyo


campo sueldo es mayor a 7000

56
Administración de bases de datos con LibreOffice Base

Creación de consultas sin asistente

Se pueden crear consultas sin recurrir al asistente y con ello poder personalizarla. Seguir
los siguientes pasos:

1) Seleccionar la opción Consultas


2) Clic en : Crear consulta en modo de diseño...

3) Con doble clic, seleccionamos la(s) tabla(s) necesarias. Clic en Cerrar.

57
Administración de bases de datos con LibreOffice Base

4) Se muestran las tablas seleccionadas

Las consultas que se crean en


este entorno, se denominan:
Query by example (Consultas
por ejemplo)

5) Con clic sostenido, arrastrar y soltar hacia la fila Campo, los campos que desean
visualizarse en la consulta.

58
Administración de bases de datos con LibreOffice Base

6) Para guardar la consulta, hacer clic en este botón.


7) Se mostrará la ventana para darle un nombre a la consulta, hacer clic en Sí.

8) Digitar el nombre deseado. Clic en Aceptar

59
Administración de bases de datos con LibreOffice Base

9) Para visualizar la consulta, presionar el botón: Ejecutar consulta

10) Se mostrarán los registros con los campos que fueron seleccionados para la
consulta

Las consultas anteriores se denominan consultas de selección.

60
Administración de bases de datos con LibreOffice Base

Operadores Relacionales usados en consultas

Estos operadores son necesarios para construir condiciones (criterios) que deberán
cumplir los registros que deseamos consultar. Dichos operadores se listan a continuación:

> mayor que


< menor que
>= mayor o igual que
<= menor o igual que
<> diferente que
= igual que
Like Como
Betwen Entre

Ejemplo de uso de operadores relacionales:

Mostrar los empleados que ganan menos de Q9000.00.


En la fila Criterios y en la columna donde se ubica el campo Sueldo, escribimos : <9000

Se pueden agregar y borrar criterios,


tantas veces como se desee.

61
Administración de bases de datos con LibreOffice Base

Al ejecutar la consulta, se mostraran los registros cuyo campo sueldo cumple con la
condición establecida.

Consultas con más de una condición

Cuando deseamos consultar registros de una tabla que cumplan con más de una
condición, debemos tener cuidado de identificar si las condiciones estarán conectadas con
Y o con O.

Uso de condiciones Y

Suponga que deseamos consultar nuestra tabla Empleado, de tal manera que se muestren
únicamente los registros los empleados del departamento de Contabilidad que ganan mas
de Q9000.00. En este caso deben cumplirse ambas condiciones:

Que el departamento sea Contabilidad y que sueldo sea mayor que 9000

62
Administración de bases de datos con LibreOffice Base

LibreOffice Base identifica las condiciones tipo Y, cuando todas las condiciones están
colocadas en la fila Criterio.

Al ejecutar la consulta, se muestran los registros que cumplen con las dos condiciones

63
Administración de bases de datos con LibreOffice Base

Uso de condiciones O

Podemos utilizar este tipo de condiciones cuando deseamos una consulta que muestre los
registros que cumplan cualquiera de las condiciones (no necesariamente todas). Para
establecer condiciones O, utilizamos a partir de la fila O del diseño de consultas. Cada
criterio O debe escribirse en una Fila distinta.

Ejemplo: Deseamos una consulta que muestre los empleados que sean del
departamento de programación o los que ganen más de Q7500.00

Filas O

Las condiciones O, se
colocan en filas
distintas, a partir de la
fila Criterio.

64
Administración de bases de datos con LibreOffice Base

Al ejecutar la consulta se mostrarán los registros que cumplen una u otra condición: O que
sean del departamento de contabilidad o que ganen más de Q7500.00.

Tipos de consultas

Consultas de selección

Son las consultas que extraen o nos muestran únicamente los datos que le especificamos.
Este tipo de consultas son las anteriormente vistas.

Consultas de acción

Este tipo de consultas se utilizan para realizar cambios a los registros en una sola
operación. Para implementarlas se utiliza la ventana de: Ejecutar instrucción de SQL.
Existen tres tipos de consultas de acción:
• De eliminación
• De actualización
• De tablas de referencias cruzadas.

Consulta de eliminación (Delete)

Como su nombre lo indica, este tipo de consultas nos permiten la eliminación de los
registros de una tabla que cumplen con ciertas condiciones.

Ejemplo:

La tabla Empleado tiene los siguientes registros:

65
Administración de bases de datos con LibreOffice Base

Se desea eliminar a los empleados que ganan menos de Q3000.00. Como se podrá
observar, hay sólo un empleado que cumple la condición: Juan Ortiz.

1) Clic en Herramientas
2) Clic en SQL…
3) En la ventana SQL, escribir la instrucción para la eliminación de los registros que
cumplan la condición, la cual se traduce como:
Borrar los registros desde la tabla Empleado donde el sueldo sea menor a 3000
4) Clic en Ejecutar

3
2

66
Administración de bases de datos con LibreOffice Base

5) Cerrar la ventana de SQL.


6) Al abrir la tabla, los registros que cumplieron la condición de eliminación fueron
borrados.

El empleado Juan Ortiz fue eliminado de la tabla

Consulta de actualización (Update)

Este tipo de consultas nos permiten modificar los registros cuyos campos cumplan con los
criterios establecidos. Mediante la sentencia Update podemos realizar la actualización. La
sintaxis de Update es:

Update “nombre-tabla” Set “campo” = valor Where Condición

Veamos esto con un ejemplo.

A los empleados del departamento de Programación, se les dará un aumento del Q500.00

Los datos de la tabla son los siguientes:

67
Administración de bases de datos con LibreOffice Base

1) En la ventana SQL, escribir la siguiente instrucción:

2) Clic en Ejecutar

El departamento
con código 1 es el
de programación

3) Abrir la tabla y verificar los cambios. Puede observarse que, solamente, los
empleados del departamento de programación recibieron el aumento de Q500.00

Si hubiésemos querido darle el aumento a todos los empleados; independientemente a


qué departamento pertenecieran, la instrucción no tendría Where. Como se muestra a
continuación:

Update "Empleado" set "sueldo" = "sueldo" + 500

68
Administración de bases de datos con LibreOffice Base

Observación: En una instrucción SQL en Base, los nombres de tablas y campos se encierran
entre comillas.

Consultas de actualización de condiciones compuestas

Se dice que una condición es compuesta cuando el criterio está formado por más de una
condición. Para establecer condiciones compuestas se utilizan los operadores lógicos, los
cuales son:

• And
• Or

Operador And

La consulta afecta a los registros que cumplan, necesariamente, todas las condiciones.

Ejemplo:

Descontar Q75.00 por seguro médico, a los empleados de Contabilidad que ganen más de
Q10000.00.

Solución:
En la ventana SQL, escriba lo siguiente:

Update "Empleado" set "sueldo" = "sueldo" - 75 where


"sueldo" > 10000 And "CodigoDepartamento" = 0

Ejecute el código y verifique los resultados

Operador Or

Podemos utilizar este tipo de condiciones cuando deseamos una consulta que muestre los
registros que cumplan cualquiera de las condiciones (no necesariamente todas).

69
Administración de bases de datos con LibreOffice Base

Ejemplo:

Crear una consulta que descuente Q50.00 a los empleados que sean del departamento de
Programación o a los que ganen más de Q10000.00. Los registros de la tabla son:

Abrir la ventana SQL y digitar lo siguiente:

Update "Empleado" set "sueldo" = "sueldo" - 50 where


"CodigoDepartamento" = 1 Or "sueldo" > 10000

Abriendo la tabla, se puede corroborar que los cambios han sido realizados en los registros
que cumplieron una u otra condición (o ambas).

Uso de Like

Este operador nos permite comparar campos de tipo texto con datos del mismo tipo. Se
usa con frecuencia acompañado del comodín *. El comodin * representa “cualquier
texto”.

Sintaxis:

Like ‘caracter*’ Que comience con determinado carácter o texto


Like ‘*caracter’ Que termine con determinado carácter o texto
Like ‘*caracter*’ Que tenga determinado carácter o texto en cualquier parte del texto

70
Administración de bases de datos con LibreOffice Base

Ejemplo:

Deseamos una consulta que muestre los empleados cuyo nombre comience con V o con
M (para esto usaremos Like*).

Crear una Query by example (es decir, una consulta donde no ingresaremos -
directamente- instrucciones SQL). Para ello:

1) Clic en: Crear una consulta en modo de diseño…

2) Trasladar a la fila Campo, los registros a visualizar. En la fila


3) La primera sentencia Like ‘V*’ (encerrada entre apóstrofes) significa: Que empiece
con V sin importar los caracteres restantes.
4) Al tratarse de una condición O, la siguiente debe ponerse en la fila de abajo.

Puede ocultar la
visualización de un
campo, desmarcando
esta opción

3
4

71
Administración de bases de datos con LibreOffice Base

5) Ejecutar la consulta, haciendo clic sobre este botón:

6) Se mostrarán los registros que cumplen una u otra condición.

Uso de Between (entre)

Se utiliza para establecer rangos de valores en una consulta.

Su sintaxis es:

Between valor1 And valor2

Ejemplo:

Mostrar los empleados que ganen entre Q9000.00 y Q10000.00

72
Administración de bases de datos con LibreOffice Base

En la fila Criterio, se digita la condición

Al ejecutar la consulta, se mostrarán los registros que cumplen la condición.

73
Administración de bases de datos con LibreOffice Base

Consultas con parámetros

Una consulta de este tipo es aquella en la que al momento de ejecutarla se nos pide el
ingreso de un dato, necesario para la consulta. Un parámero se establece de acuerdo a
esta sintaxis:

operador :Identificador de parámetro

Donde, operador es relacional (>, <, >=, <=, <>,=) y texto de entrada es el mensaje que se
mostrará para solicitar datos. Este último no debe llevar espacios.

Ejemplo 1:

Hacer una consulta que muestre los empleados que ganan más de un valor ingresado por
el usuario. La instrucción es:

> :Ingrese_Sueldo

Entre los : y el identificador de


parámetro, no debe haber espacio

Donde, Ingrese_Sueldo es el parámetro.

Texto de entrada

74
Administración de bases de datos con LibreOffice Base

Al ejecutar la consulta, se mostrará esta vetana, solicitando un valor. Digitar el dato y hacer
clic en Aceptar.

Texto de entrada

Luego de lo cual, se muestran los registros que cumplen con la condición, con relación al
valor del parámetro.

Ejemplo 2:

Hacer una consulta que muestre los empleados que ganan entre un rango de valores
solicitados por parámetros.

La solucion necesita el uso de Between, como se muestra a continuación:

75
Administración de bases de datos con LibreOffice Base

Al ejecutar la consulta se pedirán dos datos:

• Ingresar el primero y luego clic en Siguiente


• Ingresar el segundo y clic en Aceptar

Empleados que ganan


entre Q8000 y Q9000

Se muestran los registros coincidentes con los valores que estan entre los parámetros
ingresados.

76
Administración de bases de datos con LibreOffice Base

Campos calculados en consultas

Un campo calculado es aquel que, mediante una expresión aritmética, lógica o de texto,
toma su valor de otros campos de una tabla. . Un campo calculado, además de una
expresión que le dé un valor, necesita un encabezado con el cual mostrarse en la consulta.
A este encabezado se denomina: Alias. El Alias es el encabezado de columna con el que se
mostrará cuando se ejecute la consulta.

La forma de escribir correctamente un campo calculado es:

“CampoDeLaTabla” Operador Valor

A todo campo calculado, es recomendable un alias. Estos campos se agregan,


manualmente, en la fila Campo.

Ejemplo:

Calcular el IGSS (4.83%) de todos los empleados. Como el símbolo de % no puede


utilizarse para ese propósito en Base, usar su equivalente: 4.83 /100

La expresión para el cálculo del IGSS es:

“sueldo” * 4.83 / 100

Campo calculado que se


mostrará con el
encabezado IGSS

Si la fila Alias no está visible, haga clic en este botón.

77
Administración de bases de datos con LibreOffice Base

Al ejecutar la consulta, se mostrará el campo calculado con su respectivo Alias.

Observaciones:

• En la fila Alias, pude cambiarle los encabezados a todos lo campo.


• Los alias puede contener texto con espacios
• Los campos calculados no se almacenan en la base de datos.

Consulta de tablas de referencias cruzadas

Una consulta de referencias cruzadas es aquella que nos permite visualizar los datos
agrupados, con respecto a un campo. Al agrupar, podemos: sumar, calcular promedios,
mostrar el mínimo o máximo, etc.

Ejemplo 1:

Se desea saber el total de sueldos de los departamentos de Contabilidad y Programación.

1) Se crea una consulta en modo de diseño.


2) Se agregan las tablas que servirán para el proceso. En este caso: tabla
Departamento y tabla Empleado.
3) Agregar los campos necesarios. Hacer, antes, un análisis de los campos que serán
útiles.
4) En la fila: Función, elija Agrupar para determinar el campo por el cual se hará el
agrupamiento de datos. Para este ejemplo, se necesita agrupar los datos por
Departamento. El campo de agrupamiento es el Encabezado de fila.
5) De igual forma, en la fila: Función, Identificar el campo sobre el cual se hará el
cálculo. En el problema planteado se nos indica que se debe calcular el total de
sueldos, por lo tanto se utilizará la función: Suma.

78
Administración de bases de datos con LibreOffice Base

Agregar un alias
adecuado

4 5

6) Ejecutar la consultar

Alias

Encabezados de fila

79
Administración de bases de datos con LibreOffice Base

Actividad

Crear las siguientes tablas:

Tabla: Vendedor

Tabla: Venta

Establecer la relación:

Un vendedor puede realizar varias ventas

80
Administración de bases de datos con LibreOffice Base

Ingresar los siguientes registros a cada tabla:

Tabla: Vendedor

Tabla: Ventas

Generar una consulta de tablas de referencias cruzadas, que muestre el total vendido por
cada persona.

81
Administración de bases de datos con MariaDB (MySQL)

82
Administración de bases de datos con MariaDB (MySQL)

Capítulo 2: MariaDB (MySQL )


El administrador de bases de datos MariaDB (Mysql)

SQL, Structure Query Language (Lenguaje de Consulta Estructurado) es un lenguaje de


programación para trabajar con base de datos relacionales como MariaDB, MySQL, Oracle,
etc.

MySQL es un interpretador de SQL, es un servidor de base de datos.


MariaDB puede decirse que es lo mismo que MySQL, con la diferencia de que este último
ya es software privativo (se paga licencia por su uso), mientras que MariaDB es software
libre por el que no se paga licencia alguna.

MariaDB permite crear base de datos y tablas, insertar datos, modificarlos, eliminarlos,
ordenarlos, hacer consultas y realizar muchas operaciones, etc., resumiendo: administrar
bases de datos.

Ingresando instrucciones en la linea de comandos o embebidas en un lenguaje como PHP


nos comunicamos con el servidor. Cada sentencia debe acabar con punto y coma (;).

La sensibilidad a mayúsculas y minúsculas, es decir, si hace diferencia entre ellas, depende


del sistema operativo, Windows no es sensible, pero Linux si. Por ejemplo Windows
interpreta igualmente las siguientes sentencias:

create database administracion;


Create DataBase administracion;

Pero Linux interpretará como un error la segunda.

Se recomienda usar siempre minúsculas.


Durante este curso utilizaremos la versión "MySQL Community" que es Open Source.

Mostrar bases de datos (show databases)

Una base de datos es un conjunto de tablas. Una base de datos tiene un nombre con el cual
accederemos a ella.
Supongamos que vamos a trabajar en una base de datos ya creada , llamada
"administracion".

Para que el servidor nos muestre las bases de datos existentes, se lo solicitamos enviando la
instrucción:

83
Administración de bases de datos con MariaDB (MySQL)

show databases;

Nos mostrará los nombres de las bases de datos, debería aparecer, otras, "administracion".

Creación de una tabla y mostrar sus campos

Una base de datos almacena sus datos en tablas.


Una tabla es una estructura de datos que organiza los datos en columnas y filas; cada
columna es un campo (o atributo) y cada fila, un registro. La intersección de una columna
con una fila, contiene un dato específico, un solo valor.

Cada registro contiene un dato por cada columna de la tabla.

Cada campo (columna) debe tener un nombre. El nombre del campo hace referencia a la
información que almacenará.

Cada campo (columna) también debe definir el tipo de dato que almacenará.

nombre clave
--------------------------------------
Mario Pérez Marito
Maria García Mary
Diego Rodríguez z8080

Acá tenemos la tabla usuarios, que contiene dos campos llamados:nombre y clave. Luego
tenemos tres registros almacenados en esta tabla, el primero almacena en el campo nombre
el valor "Mario Pérez" y en el campo clave "Marito", y así sucesivamente con los otros dos
registros.

Creación de tablas

La tabla debe ser definida con un nombre que la identifique y con el cual accederemos a
ella.

Creamos una tabla llamada "usuarios", digitamos:

create table usuarios (


nombre varchar(30),
clave varchar(10)
);

84
Administración de bases de datos con MariaDB (MySQL)

Si intentamos crear una tabla con un nombre ya existente (existe otra tabla con ese
nombre), mostrará un mensaje de error indicando que la acción no se realizó porque ya
existe una tabla con el mismo nombre.

Para ver las tablas existentes en una base de datos digitamos nuevamente:

show tables;

Ahora aparece "usuarios" entre otras que ya pueden estar creadas.

Cuando se crea una tabla debemos indicar su nombre y definir sus campos con su tipo de
dato. En esta tabla "usuarios" definimos 2 campos:

- nombre: que contendrá una cadena de hasta 30 caracteres de longitud,


que almacenará el nombre de usuario y
- clave: otra cadena de caracteres de 10 de longitud, que guardará la clave de
cada usuario.

Cada usuario ocupará un registro de esta tabla, con su respectivo nombre y clave.

Mostrando la estructura de una tabla

Para ver la estructura de una tabla usamos el comando "describe" junto al nombre de la
tabla:

describe usuarios;

Aparece lo siguiente:

Field Type Null


_________________________
nombre varchar(30) YES
clave varchar(10) YES

Esta es la estructura de la tabla "usuarios"; nos muestra cada campo, su tipo, lo que ocupa
en bytes y otros datos como la aceptación de valores nulos etc, que veremos más adelante
en detalle.

Para eliminar una tabla usamos "drop table". digitamos:

drop table usuarios;

Si digitamos nuevamente:

85
Administración de bases de datos con MariaDB (MySQL)

drop table usuarios;

Aparece un mensaje de error, indicando que no existe, ya que intentamos borrar una tabla
inexistente.

Para evitar este mensaje podemos escribir:

drop table if exists usuarios;

En la sentencia precedente especificamos que elimine la tabla "usuarios" , si existe.

Cada vez que ingresamos a MySQL debemos seleccionar la base de datos a usar, mediante
la cláusula "use" y posteriormente ejecutar comandos SQL sobre dicha base de datos. Por
ejemplo si deseamos trabajar con la base de datos administracion, digitamos la siguiente
orden:

use administración;

Actividad

A) Queremos almacenar los datos de nuestros amigos.

1- Elimine la tabla "agenda" si existe:


drop table if exists agenda;

2- Cree una tabla llamada "agenda", debe tener los siguientes campos:

create table agenda(


nombre varchar(20),
domicilio varchar(30),
telefono varchar(11)
);

3- Intente crearla nuevamente. Aparece mensaje de error.

4- Visualice las tablas existentes (show tables).

5- Visualice la estructura de la tabla "agenda" (describe agenda).

6- Elimine la tabla, si existe (drop table, if exists).

7- Intente eliminar la tabla sin la cláusula if exists (drop table agenda).


Debe aparecer un mensaje de error cuando no existe la tabla.

86
Administración de bases de datos con MariaDB (MySQL)

B) Queremos almacenar información referente a nuestros libros.

1- Elimine la tabla "libros", si existe.

2- Cree una tabla llamada "libros".


Debe definirse con los siguientes campos:
titulo varchar(20),
autor varchar(30),
y editorial varchar(15)

3- Intente crearla nuevamente. Aparece mensaje de error.

4- Visualice las tablas existentes.

5- Visualice la estructura de la tabla "libros".

6- Elimine la tabla, si existe.

7- Intente eliminar la tabla.

Abrir una base de datos

Para poder trabajar con una base de datos, que ha sido previamente creada, tenemos que
abrila con el fin de poder habilitarla para su uso. Esto se logra mediante la sentencia: Use.
La sintaxis es:

Use nombreBaseDeDatos;

Por ejemplo, si deseamos abrir una base de datos llamada: Clientes, debemos abrila con:

use Clientes;

Tipos de datos básicos en MySQL

Al crear una tabla debemos resolver qué campos (columnas) tendrá y que tipo de datos
almacenará cada uno de ellos, es decir, su estructura. Estos son algunos tipos de datos
básicos:

varchar: se usa para almacenar cadenas de caracteres. Una cadena es una secuencia de
caracteres. Se coloca entre comillas (simples): 'Hola'. El tipo "varchar" define una cadena
de longitud variable en la cual determinamos el máximo de caracteres. Puede guardar hasta
65535 caracteres (versiones antiguas de MySQL permitían solo 255). Para almacenar

87
Administración de bases de datos con MariaDB (MySQL)

cadenas de hasta 30 caracteres, definimos un campo de tipo varchar(30). Si asignamos una


cadena de caracteres de mayor longitud que la definida, la cadena se corta. Por ejemplo, si
definimos un campo de tipo varchar(10) y le asignamos la cadena 'Buenas tardes', se
almacenará 'Buenas tar' ajustándose a la longitud de 10 caracteres.

integer: se usa para guardar valores numéricos enteros, de -2000000000 a 2000000000


aprox. Definimos campos de este tipo cuando queremos representar, por ejemplo,
cantidades.

float: se usa para almacenar valores numéricos decimales. Se utiliza como separador el
punto (.). Definimos campos de este tipo para precios, por ejemplo.

Antes de crear una tabla debemos pensar en sus campos y optar por el tipo de dato
adecuado para cada uno de ellos. Por ejemplo, si en un campo almacenaremos números
enteros, el tipo "float" sería una mala elección; si vamos a guardar precios, el tipo "float" es
correcto, no así "integer" que no tiene decimales.
Servidor de MySQL instalado en forma local.

Crearemos una tabla en la base de datos "administracion" con una serie de campos de
distinto tipo:

create database libreria;


use librería;
create table libros(
titulo varchar(40),
autor varchar(20),
editorial varchar(15),
precio float,
cantidad integer
);

Procederemos a insertar una serie de filas:

insert into libros values ('El


aleph','Borges','Emece',45.50,100);

insert into libros values('Alicia en el país de las


maravillas','Lewis Carroll','Planeta',25,200);

insert into values ('Matematica estas


ahi','Paenza','Planeta',15.8,200);

88
Administración de bases de datos con MariaDB (MySQL)

Actividad

A) Un videoclub que alquila películas en video almacena la información de sus


películas en una tabla llamada "peliculas"; para cada película necesita los siguientes
datos:
-nombre, cadena de caracteres de 20 de longitud
-actor, cadena de caracteres de 20 de longitud
-duración, valor numérico entero
-cantidad de copias: valor entero

1- Cree una base de datos llamada videoclub y habilitarla para su uso:


create database videoclub;
use videoclub;

2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo:

create table peliculas(


nombre varchar(20),
actor varchar(20),
duracion integer,
cantidad integer
);
3- Vea la estructura de la tabla:

describe peliculas;

4- Ingrese los siguientes registros:


insert into peliculas values ('Mision imposible','Tom
Cruise',120,3);
insert into peliculas values ('Mision imposible 2','Tom
Cruise',180,2);
insert into peliculas values ('Mujer bonita','Julia
R.',90,3);

insert into peliculas values ('Elsa y Fred','China


Zorrilla',90,2);

5- Muestre todos los registros:


select * from peliculas;

B) Una empresa almacena los datos de sus empleados en una tabla "empleados" que
guarda los siguientes datos: nombre, documento, sexo, domicilio, sueldobase.

89
Administración de bases de datos con MariaDB (MySQL)

1- Crear la base de datos con nombre: Empresa y habitarla para poder usarla.
Create database Empresa;
Use Empresa;

2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo:


create table empleados(
nombre varchar(20),
documento varchar(8),
sexo varchar(1),
domicilio varchar(30),
sueldobase float
);

3- Vea la estructura de la tabla:


describe empleados;

4- Ingrese algunos registros:


insert into empleados values ('Marco del
Cid','22345678','m','zona 1',9000);
insert into empleados values ('Vilma Yolanda
Pérez','24345678','f','zona 6',5000);
insert into empleados values ('Marcos
Torres','27345678','m','zona 7',8000);

5- Seleccione todos los registros:


select * from empleados;

Seleccionar campos con select

Hemos aprendido cómo ver todos los registros de una tabla:

select * from libros;

El comando "select" recupera los registros de una tabla. Con el asterisco (*) indicamos que
seleccione todos los campos de la tabla que nombramos.

Podemos especificar el nombre de los campos que queremos ver separándolos por comas:

select titulo,autor,editorial from libros;

En la sentencia anterior la consulta mostrará sólo los campos "titulo", "autor" y "editorial".
En la siguiente sentencia, veremos los campos correspondientes al título y precio de todos
los libros:

select titulo,precio from libros;

90
Administración de bases de datos con MariaDB (MySQL)

Para ver solamente la editorial y la cantidad de libros tipeamos:

select editorial,cantidad from libros;

Procedamos a crear una tabla, insertar algunas filas y mostrar solo algunas columnas de
dicha tabla:

drop table if exists libros;

create table libros(


titulo varchar(100),
autor varchar(30),
editorial varchar(15),
precio float,
cantidad integer
);

insert into libros values ('Leyendas de Guatemala','Miguel


Angel Asturias','Salvat',45.50,100);

insert into values ('Alicia en el pais de las


maravillas','Lewis Carroll','Planeta',25,200);

insert into values ('Matematica estas


ahi','Paenza','Planeta',15.8,200);

select titulo,precio from libros;


select editorial,cantidad from libros;

select * from libros;

Actividad

A) Un videoclub que alquila películas en video almacena la información de sus


películas en alquiler en una tabla llamada "peliculas".

1- Elimine la tabla, si existe:

drop table if exists peliculas;

2- Cree la tabla:

create table peliculas(


titulo varchar(20),
actor varchar(20),
duracion integer,

91
Administración de bases de datos con MariaDB (MySQL)

cantidad integer
);

3- Vea la estructura de la tabla:

describe peliculas;

4- Ingrese los siguientes registros:

insert into peliculas values ('Mision imposible','Tom


Cruise',120,3);

insert into peliculas values ('Mision imposible 2','Tom


Cruise',180,2);

insert into peliculas values ('Mujer bonita','Julia


R.',90,3);

insert into peliculas values ('Elsa y Fred','China


Zorrilla',90,2);

5- Realice un "select" mostrando solamente el título y actor de todas las películas:

select titulo,actor from peliculas;

6- Muestre el título y duración de todas las películas.

7- Muestre el título y la cantidad de copias.

B) Una empresa almacena los datos de sus empleados en una tabla llamada
"empleados".

1- Elimine la tabla, si existe:


drop table if exists empleados;

2- Cree la tabla:
create table empleados(
nombre varchar(20),
documento varchar(8),
sexo varchar(1),
domicilio varchar(30),
sueldobase float
);

3- Vea la estructura de la tabla:


describe empleados;

92
Administración de bases de datos con MariaDB (MySQL)

4- Ingrese algunos registros:


insert into empleados values ('Marco del
Cid','22345678','m','zona 1',9000);

insert into empleados values ('Ana


Acosta','24345678','f','zona 8',5000);

insert into empleados ('Juan Torres','27345678','m','zona


5',8000);

5- Muestre todos los datos de los empleados.

6- Muestre el nombre y documento de los empleados.

7- Realice un "select" mostrando el nombre, documento y sueldo básico de todos los


empleados.

C) Un comercio que vende artículos de computación registra la información de sus


productos en la tabla llamada "articulos".

1- Elimine la tabla si existe:

drop table if exists articulos;

2- Cree la tabla "articulos" con los campos necesarios para almacenar los siguientes datos:
- código del artículo: entero,
- nombre del artículo: 20 caracteres de longitud,

- descripción: 30 caracteres de longitud,


- precio: float.

3- Vea la estructura de la tabla (describe).

4- Ingrese algunos registros:

insert into articulos values (1,'impresora','Epson Stylus


C45',400.80);
insert into articulos values(2,'impresora','Epson Stylus
C85',500);
insert into articulos values (3,'monitor','Samsung 14',800);

5- Muestre todos los campos de todos los registros.

6- Muestre sólo el nombre, descripción y precio.

93
Administración de bases de datos con MariaDB (MySQL)

Selección de registros condicional con Where

El comando "select" recupera los registros de una tabla. Detallando los nombres de los
campos separados por comas, indicamos que seleccione todos los campos de la tabla que
nombramos.

Existe una cláusula, "where" que es opcional, con ella podemos especificar condiciones
para la consulta "select". Es decir, podemos recuperar algunos registros, sólo los que
cumplan con ciertas condiciones indicadas con la cláusula "where". Por ejemplo, queremos
ver el usuario cuyo nombre es "MarioPerez", para ello utilizamos "where" y luego de ella,
la condición:

select nombre, clave from usuarios where nombre='MarioPerez';

Para las condiciones se utilizan operadores relacionales (tema que trataremos más adelante
en detalle). El signo igual(=) es un operador relacional. Para la siguiente selección de
registros especificamos una condición que solicita los usuarios cuya clave es igual a
'municipal':

select nombre, clave from usuarios where clave='municipal';

Si ningún registro cumple la condición establecida con el "where", no aparecerá ningún


registro.

Ingresar a PHPMyAdmin o Workbench y ejecutar los siguientes comandos SQL:

create database sistema;


use sistema;
create table usuarios (
nombre varchar(30),
clave varchar(10)
);

describe usuarios;

insert into usuarios values ('Marco','madcr');


insert into usuarios values ('MarioPerez','Marito');
insert into usuarios values ('Marcelo','municipal');
insert into usuarios values ('Gustavo','municipal');

select nombre, clave from usuarios;


select nombre, clave from usuarios where nombre='Marco';

94
Administración de bases de datos con MariaDB (MySQL)

select nombre, clave from usuarios where clave='municipal';


select nombre, clave from usuarios where clave='river';

Actividad

A) Crear una base de datos llamada: Contactos


Crear una tabla denominada: "agenda".
1- Eliminamos "agenda", si existe:

drop table if exists agenda;

2- Creamos la tabla, con los siguientes campos:

nombre (cadena de 20), domicilio (cadena de 30) y telefono


(cadena de 11).

3- Visualice la estructura de la tabla "agenda".(describe).

4- Ingrese los siguientes registros:


'Alberto Mores','zona 4','4234567',
'Juan Torres','zona 5','4458787',
'Mariana López','zona 7','4545454',
'Fernando López','zona 18','4545454'.

5- Seleccione todos los registros de la tabla. (select).

6- Seleccione el registro cuyo nombre sea 'Juan Torres'.

7- Seleccione el registro cuyo domicilio esté en 'zona 4'.

8- Muestre los datos de quienes tengan el teléfono '4545454'.

B) Un comercio que vende artículos de computación registra los datos de sus artículos
en una tabla llamada: articulos. La base de datos se debe llamar Liberia (sin tilde).

1- Elimine la tabla si existe.

95
Administración de bases de datos con MariaDB (MySQL)

2- Cree la tabla "articulos" con la siguiente estructura:


create table articulos(
codigo integer,
nombre varchar(20),
descripcion varchar(30),
precio float
);

3- Vea la estructura de la tabla (describe).

4- Ingrese algunos registros:


insert into articulos values (1,'impresora','Epson Stylus
C45',400.80);
insert into articulos values (2,'impresora','Epson Stylus
C85',500);
insert into articulos values (3,'monitor','Samsung
14',800);
insert into articulos values (4,'teclado','ingles
Biswal',100);
insert into articulos values (5,'teclado','español
Biswal',90);

5- Seleccione todos los datos de los registros cuyo nombre sea "impresora".

6- Muestre sólo el código, descripción y precio de los teclados.

Operadores relacionales

Hemos aprendido a especificar condiciones de igualdad para seleccionar registros de una


tabla; por ejemplo:
select * from libros where autor='Miguel Angel Asturias';

Utilizamos el operador relacional de igualdad.


Los operadores relacionales vinculan un campo con un valor para que MySQL compare
cada registro (el campo especificado) con el valor dado.
Los operadores relacionales son los siguientes:
= igual
<> distinto
> mayor
< menor
>= mayor o igual
<= menor o igual

96
Administración de bases de datos con MariaDB (MySQL)

Podemos seleccionar los registros cuyo autor sea diferente de 'Asturias', para ello usamos la
condición:
select * from libros where autor <>'Asturias';

Podemos comparar valores numéricos. Por ejemplo, queremos mostrar los libros cuyos
precios sean mayores a 20 quetzales:
select * from libros where precio > 20;

También, los libros cuyo precio sea menor o igual a 30 quetzales:


select * from libros where precio <= 30;

Ingresemos al programa PHPMyAdmin o Workbench y ejecutamos los siguientes


comandos SQL donde utilizamos los operadores relacionales:

Create database libreria;


use librería;

create table libros(


titulo varchar(20),
autor varchar(30),
editorial varchar(15),
precio float
);

insert into libros values ('Leyendas de


Guatemala’,'Aturias','Salvat',62.50);

insert into libros values ('Martin Fierro','José


Hernandez','Emece',16.00);

insert into libros values ('Aprenda PHP','Mario


Molina','Emece',35.40);

insert into libros values ('El señor


Presidente','Asturias','F&G Editores',100);

select titulo, autor,editorial,precio from libros;

select titulo, autor,editorial,precio from libros


where autor <> 'Asturias';

select titulo, autor,editorial,precio from libros where


precio > 20;

97
Administración de bases de datos con MariaDB (MySQL)

select titulo,autor,editorial,precio from libros


where precio <= 30;

Eliminación de registros con Delete


Para eliminar los registros de una tabla usamos el comando "delete":
delete from usuarios;

La ejecución del comando indicado en la línea anterior borra TODOS los registros de la
tabla.
Si queremos eliminar uno o varios registros debemos indicar cuál o cuáles, para ello
utilizamos el comando "delete" junto con la clausula "where" con la cual establecemos la
condición que deben cumplir los registros a borrar. Por ejemplo, queremos eliminar aquel
registro cuyo nombre de usuario es 'Marco':
delete from usuarios where nombre='Marco';

Si solicitamos el borrado de un registro que no existe, es decir, ningún registro cumple con
la condición especificada, no se borrarán registros, pues no encontró registros con ese dato.
El comando delete hay que tener mucho cuidado en su uso, una vez eliminado un registro
no hay forma de recuperarlo. Si por ejemplo ejecutamos el comando:
delete from usuarios;

Si la tabla tiene 1000000 de filas, todas ellas serán eliminadas.

Evitar borrados masivos


En MySQL hay una variable de configuración llamada SQL_SAFE_UPDATES que puede
almacenar los valores 1 (activa) y 0 (desactiva). Cuando tiene el valor 1 no permite ejecutar
comandos delete sin indicar un where y que dicho where se relacione a una clave primaria,
tema que veremos más adelante.

Ingresemos al programa "Workbench" y ejecutamos los siguientes comandos SQL donde


utilizamos entre otros el comando delete:
Create database sistema;
use sistema;

create table usuarios (


nombre varchar(30),

98
Administración de bases de datos con MariaDB (MySQL)

clave varchar(10)
);

insert into usuarios values ('Marco','marcocid');


insert into usuarios values ('Mario Pérez','Marito');
insert into usuarios values ('Marcelo','municipal');
insert into usuarios values ('Gustavo','municipal');
delete from usuarios;

delete from usuarios where nombre='Marco';

select nombre,clave from usuarios;

delete from usuarios where clave='municipal';

select nombre,clave from usuarios;

Si ejecutamos este conjunto de comandos SQL se produce un error en el primer comando


'delete' debido a que la variable 'SQL_SAFE_UPDATES' tiene el valor 1 (es decir está
activa), en MySQL 8.0 se instala por defecto para la variable 'SQL_SAFE_UPDATES' con
el valor 1.

La idea de que no se puedan ejecutar ciertos comandos 'delete' es para evitar borrados
masivos de datos que luego no podemos recuperar.

Tenemos dos soluciones para resolver el problema de los 'delete', la primera es encerrar
todo el bloque donde ejecutamos los comandos delete cambiando el esta de la variable
'SQL_SAFE_UPDATES':

Método 1:

El primer método es cambiar el estado de la variable SQL_SAFE_UPDATES en forma


temporal:

Create database sistema;


drop table if exists usuarios;

create table usuarios (


nombre varchar(30),
clave varchar(10)
);

insert into usuarios values ('Marco','marcocid');


insert into usuarios values ('Mario Pérez','Marito');

99
Administración de bases de datos con MariaDB (MySQL)

insert into usuarios values ('Marcelo','municipal');


insert into usuarios values ('Gustavo','municipal');

set SQL_SAFE_UPDATES=0;
delete from usuarios;

delete from usuarios where nombre='Marco';


select nombre,clave from usuarios;

delete from usuarios where clave='municipal';

select nombre,clave from usuarios;


set SQL_SAFE_UPDATES=1;

Tengamos en cuenta que disponer la variable SQL_SAFE_UPDATES para que los borrados
sean solo seguros es muy conveniente cuando hay programadores que recién están
comenzando en SQL y hay datos valiosos ya almacenados.

Podemos saber el estado global de la variable 'SQL_SAFE_UPDATES' mediante la


consulta:

select @@sql_safe_updates;

Método 2:

El segundo método es cambiar el estado de la variable SQL_SAFE_UPDATES a nivel


general, para ello desde el programa "Workbench" ingresamos a la opción Edit ->
Preferences...:

100
Administración de bases de datos con MariaDB (MySQL)

Debemos cerrar y volver a entrar al programa "Workbench" para que el cambio se haga
efectivo.
Si prueba en el servidor tutorialesprogramacionya.com el comando SQL 'delete' verá que
no hay restricciones en el borrado de filas, es decir que la variable SQL_SAFE_UPDATES
se encuentra en '0'.
Seguramente cambiará el estado de la variable 'SQL_SAFE_UPDATES' a '0' en su servidor,
pero es bueno tener cuidado cada vez que ejecutamos un comando SQL 'delete':

Actualización de registros con Update


Para modificar uno o varios datos de uno o varios registros utilizamos "update"
(actualizar).
Por ejemplo, en nuestra tabla "usuarios", queremos cambiar los valores de todas las claves,
por "Comunicaciones":
update usuarios set clave='Comunicaciones';

Utilizamos "update" junto al nombre de la tabla y "set" junto con el campo a modificar y su
nuevo valor. El cambio afectará a todos los registros.
Podemos modificar algunos registros, para ello debemos establecer condiciones de
selección con "where".
Por ejemplo, queremos cambiar el valor correspondiente a la clave de nuestro usuario
llamado 'Mario Pérez', queremos como nueva clave 'Boca', necesitamos una condición
"where" que afecte solamente a este registro:

update usuarios set clave='Comunicaciones' where


nombre='Mario Pérez';

Si no encuentra registros que cumplan con la condición del "where", ningún registro es
afectado. Las condiciones no son obligatorias, pero si omitimos la cláusula "where", la
actualización afectará a todos los registros.
También se puede actualizar varios campos en una sola instrucción:
update usuarios set nombre='Marcela Duarte', clave='Marce'
where nombre='Marcela';

101
Administración de bases de datos con MariaDB (MySQL)

Para ello colocamos "update", el nombre de la tabla, "set" junto al nombre del campo y el
nuevo valor y separado por coma, el otro nombre del campo con su nuevo valor.

Igual al concepto anterior cuando utilizamos el comando 'update' si la variable


'SQL_SAFE_UPDATES' se encuentra con un 1 (activa) luego solo se pueden ejecutar
actualizaciones de una única fila disponiendo en el where la clave primaria (tema que no
hemos visto)

Por el momento es aconsejable cambiar 'SQL_SAFE_UPDATES' al valor cero si no lo hizo


en el concepto anterior.
Luego de cambiar 'SQL_SAFE_UPDATES' a cero puede ejecutar este conjunto de
sentencias SQL en el "Workbench":
create database empleados;
use empleados,

create table usuarios (


nombre varchar(30),
clave varchar(10)
);
insert into usuarios values ('Marco','marcocid');
insert into usuarios values ('Mario Pérez','Marito');
insert into usuarios values ('Marcela','Comunicaciones');
insert into usuarios values ('Gustavo','Comunicaciones');

select * from usuarios;

update usuarios set clave='Comunicaciones';


select nombre,clave from usuarios;
update usuarios set nombre='Gustavo García'
where nombre='Gustavo';

update usuarios set nombre='Marcela Duarte', clave='Marce'


where nombre='Marcela';

select nombre,clave from usuarios;

102
Administración de bases de datos con MariaDB (MySQL)

Actividad

Cree o abra una base de datos llamada: Contactos. Trabaje con la tabla "agenda" que
almacena los datos de sus amigos.

1- Abra la base de datos


use contactos;

2- Cree la tabla:
create table agenda(
apellido varchar(30),
nombre varchar(20),
domicilio varchar(30),
telefono varchar(11)
);

3- Visualice la estructura de la tabla "agenda" (describe).

4- Ingrese los siguientes registros (insert into):

Mores,Alberto,zona 4,4234567,
Torres,Juan,zona 3,4458787,
Lopez,Mariana,zona 6,4545454,
Lopez,Jose,zona 7,4545454,
Peralta,Susana,zona 18,4123456.

5- Modifique el registro cuyo nombre sea "Juan" por "Juan Jose"(update- where):

update agenda set nombre='Juan Jose' where nombre='Juan';

6- Actualice los registros cuyo número telefónico sea igual a '4545454' por '4445566':

update agenda set telefono='4445566' where


telefono='4545454';

7- Actualice los registros que tengan en el campo "nombre" el valor "Juan" por "Juan Jose"
(ningún registro afectado porque ninguno cumple con la condición del "where"):

update agenda set nombre='Juan Jose' where nombre='Juan';

103
Administración de bases de datos con MariaDB (MySQL)

Clave Primaria (primary key)


Una clave primaria es un campo (o varios) que identifica 1 solo registro (fila) en una
tabla.
Para un valor del campo clave existe solamente 1 registro. Los valores no se repiten ni
pueden ser nulos.
Veamos un ejemplo, si tenemos una tabla con datos de personas, el número de documento
puede establecerse como clave primaria, es un valor que no se repite; puede haber personas
con igual apellido y nombre, incluso el mismo domicilio (padre e hijo por ejemplo), pero su
documento será siempre distinto.
Si tenemos la tabla "usuarios", el nombre de cada usuario puede establecerse como clave
primaria, es un valor que no se repite; puede haber usuarios con igual clave, pero su nombre
de usuario será siempre distinto.
Establecemos que un campo sea clave primaria al momento de creación de la tabla:
create table usuarios (
codigo int primary key,
nombre varchar(20),
clave varchar(10),
);

Para definir un campo como clave primaria agregamos "primary key" luego de la definición
de todos los campos y entre paréntesis colocamos el nombre del campo que queremos como
clave.
Si visualizamos la estructura de la tabla con "describe" vemos que el campo "nombre" es
clave primaria y no acepta valores nulos(más adelante explicaremos esto detalladamente).
Ingresamos algunos registros:
insert into usuarios values (1,'Marco','marcocid');
insert into usuarios values (2,'Mario Perez','Marito');
insert into usuarios values (3,'Marcela','Comunicaciones');
insert into usuarios values (4,'Gustavo','Comunicaciones');

Si intentamos ingresar un valor para el campo clave que ya existe, aparece un mensaje de
error indicando que el registro no se cargó pues el dato clave existe. Esto sucede porque los
campos definidos como clave primaria no pueden repetirse.
Ingresamos un registro con clave de usuario repetida, por ejemplo:

insert into usuarios values (1,'Antonio','Municipal');

104
Administración de bases de datos con MariaDB (MySQL)

Una tabla sólo puede tener una clave primaria. Cualquier campo (de cualquier tipo)
puede ser clave primaria, debe cumplir como requisito, que sus valores no se repitan.

Al establecer una clave primaria estamos indexando la tabla, es decir, creando un índice
para dicha tabla; a este tema lo veremos más adelante.

Create database sistema;


use sistema;

create table usuarios (


codigo int primary key,
nombre varchar(20),
clave varchar(10)
);

describe usuarios;

insert into usuarios values (1 ,'Marco','marcocid');


insert into usuarios values (2, 'MarioPerez','Marito');
insert into usuarios values (3, 'Marcela','Comunicaciones');
insert into usuarios values (4, 'Gustavo','Comunicaciones');
insert into usuarios values (1, 'Antonio','Municipal');

Este registro no se almacenaría,


generaría un error porque el registro
con código 1 ya existe

Clave primaria entera con auto incremento

105
Administración de bases de datos con MariaDB (MySQL)

Un campo de tipo entero puede tener otro atributo extra 'auto_increment'. Los valores de
un campo 'auto_increment', se inician en 1 y se incrementan en 1 automáticamente.
Se utiliza generalmente en campos correspondientes a códigos de identificación para
generar valores únicos para cada nuevo registro que se inserta.

Sólo puede haber un campo "auto_increment" y debe ser clave primaria (o estar
indexado).

Para establecer que un campo auto incremente sus valores automáticamente, éste debe ser
entero (integer) y debe ser clave primaria:
create table libros(
codigo int primary key auto_increment,
titulo varchar(50),
autor varchar(50),
editorial varchar(25),

);

Para definir un campo auto incrementable colocamos "auto_increment" luego de la


definición del campo al crear la tabla.
Hasta ahora, al ingresar registros, colocamos el nombre de todos los campos antes de los
valores; es posible ingresar valores para algunos de los campos de la tabla, pero recuerde
que al ingresar los valores debemos tener en cuenta los campos que detallamos y el orden
en que lo hacemos.
Cuando un campo tiene el atributo "auto_increment" no es necesario ingresar valor para él,
porque se inserta automáticamente tomando el último valor como referencia, o 1 si es el
primero.
Para ingresar registros digitamos null el campo definido como "auto_increment", por
ejemplo:
insert into libros values( null, 'El señor
Presidente,','Asturias','Salvat');

Este primer registro ingresado guardará el valor 1 en el campo correspondiente al código.


Si continuamos ingresando registros, el código (dato que no ingresamos) se cargará
automáticamente siguiendo la secuencia de auto incremento.
Un campo "auto_increment" funciona correctamente sólo cuando contiene únicamente
valores positivos. Más adelante explicaremos cómo definir un campo con sólo valores
positivos.

106
Administración de bases de datos con MariaDB (MySQL)

Está permitido ingresar el valor correspondiente al campo "auto_increment", por ejemplo:


insert into libros values(6,'Martin Fierro','Jose
Hernandez','Paidos');

Pero debemos tener cuidado con la inserción de un dato en campos "auto_increment".


Debemos tener en cuenta que:
- si el valor está repetido aparecerá un mensaje de error y el registro no se
ingresará.

- si el valor dado saltea la secuencia, lo toma igualmente y en las siguientes


inserciones, continuará la secuencia tomando el valor más alto.

- si el valor ingresado es 0, no lo toma y guarda el registro continuando la


secuencia.

- si el valor ingresado es negativo (y el campo no está definido para aceptar sólo


valores positivos), lo ingresa.

Para que este atributo funcione correctamente, el campo debe contener solamente valores
positivos; más adelante trataremos este tema.

Probemos el siguiente bloque de comandos SQL desde "Workbench" para trabajar con un
campo con auto incremento:
create database librería;
use libreria;

create table libros(


codigo integer primary key auto_increment,
titulo varchar(50),
autor varchar(50),
editorial varchar(25),
primary key (codigo)
);

describe libros;
insert into libros values(null,'El señor
presidente','Asturias','Salvat');

select * from libros libros;


insert into libros values(null,'Martin Fierro','Jose
Hernandez','Emece');

107
Administración de bases de datos con MariaDB (MySQL)

insert into libros values(null,'Aprenda PHP','Mario


Molina','Emece');
insert into libros values(null,'Cervantes y el
quijote','Borges','Paidos');
insert into libros values(null,'Matematica estas ahi',
'Paenza', 'Paidos');

select codigo,titulo,autor,editorial from libros;

insert into libros values(6,'Martin Fierro','Jose


Hernandez','Paidos');

insert into libros values(2,'Martin Fierro','Jose


Hernandez','Planeta');

insert into libros values(15,'Harry Potter y la piedra


filosofal','J.K. Rowling','Emece');

insert into libros values(null,'Harry Potter y la camara


secreta','J.K. Rowling','Emece');

insert into libros values(0,'Alicia en el pais de las


maravillas','Lewis Carroll','Planeta');

insert into libros values(-5,'Alicia a traves del


espejo','Lewis Carroll','Planeta');

select * from libros;

Indique el registro que generó error y explique el por qué:

Eliminación de registros con truncate table

108
Administración de bases de datos con MariaDB (MySQL)

Aprendimos que para borrar todos los registro de una tabla se usa "delete" sin condición
"where".
También podemos eliminar todos los registros de una tabla con "truncate table". Por
ejemplo, queremos vaciar la tabla "libros", usamos:
truncate table libros;

La sentencia "truncate table" vacía la tabla (elimina todos los registros) y vuelve a crear la
tabla con la misma estructura.
La diferencia con "drop table" es que esta sentencia borra la tabla, "truncate table" la vacía.
La diferencia con "delete" es la velocidad, es más rápido "truncate table" que "delete" (se
nota cuando la cantidad de registros es muy grande) ya que éste borra los registros uno a
uno.
Otra diferencia es la siguiente: cuando la tabla tiene un campo "auto_increment", si
borramos todos los registros con "delete" y luego ingresamos un registro, al cargarse el
valor en el campo autoincrementable, continúa con la secuencia teniendo en cuenta el valor
mayor que se había guardado; si usamos "truncate table" para borrar todos los registros, al
ingresar otra vez un registro, la secuencia del campo autoincrementable vuelve a iniciarse
en 1.
Por ejemplo, tenemos la tabla "libros" con el campo "codigo" definido "auto_increment", y
el valor más alto de ese campo es "5", si borramos todos los registros con "delete" y luego
ingresamos un registro sin valor de código, se guardará el valor "6"; si en cambio, vaciamos
la tabla con "truncate table", al ingresar un nuevo registro sin valor para el código, iniciará
la secuencia en 1 nuevamente.

Probemos ejecutar este conjunto de comandos SQL en nuestro servidor local de MySQL
accediendo al mismo desde el programa "Workbench":
create database libreria2020;
use libreria2020;

create table libros(


codigo primary key integer auto_increment,
titulo varchar(50),
autor varchar(50),
editorial varchar(25),
);

insert into libros values(null,'Martin Fierro','Jose


Hernandez','Planeta');

109
Administración de bases de datos con MariaDB (MySQL)

insert into libros values(null,'Aprenda PHP','Mario


Molina','Emece');
insert into libros values(null,'Cervantes y el
quijote','Borges','Paidos');
insert into libros values(null,'Matematica estas ahi',
'Paenza', 'Paidos');
insert into libros values(null,'El señor presidente',
'Asturias', 'Salvat');

delete from libros;


select * from libros;

insert into libros values(null,'Antología poetica', 'Borges',


'Emece');

select * from libros;

truncate table libros;


insert into libros values(null,'Antología poetica',
'Borges', 'Emece');
select * from libros;

Explique los resultados obtenidos

Tipos de datos

110
Administración de bases de datos con MariaDB (MySQL)

Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es,
definir los campos y sus tipos más precisos, según el caso. Por ejemplo, si un campo
numérico almacenará solamente valores enteros positivos el tipo "integer" con el atributo
"unsigned" es más adecuado que, por ejemplo un "float".
Hasta ahora hemos visto 3 tipos de datos: varchar, integer (con y sin signo) y float (con y
sin signo). Hay más tipos, incluso, subtipos.
Los valores que podemos guardar son:
A) TEXTO: Para almacenar texto usamos cadenas de caracteres. Las cadenas se colocan
entre comillas simples. Podemos almacenar dígitos con los que no se realizan operaciones
matemáticas, por ejemplo, códigos de identificación, números de documentos, números
telefónicos. Tenemos los siguientes tipos: varchar, char y text.
B) NUMEROS: Existe variedad de tipos numéricos para representar enteros, negativos,
decimales. Para almacenar valores enteros, por ejemplo, en campos que hacen referencia a
cantidades, precios, etc., usamos el tipo integer. Para almacenar valores con decimales
utilizamos: float o decimal.
C) FECHAS Y HORAS: para guardar fechas y horas dispone de varios tipos: date (fecha),
datetime (fecha y hora), time (hora), year (año) y timestamp.
D) OTROS TIPOS: enum y set representan una enumeración y un conjunto
respectivamente. Lo veremos más adelante.
E) Otro valor que podemos almacenar es el valor "null". El valor 'null' significa “valor
desconocido” o "dato inexistente", ya lo estudiamos. No es lo mismo que 0 o una cadena
vacía.

111
Administración de bases de datos con MariaDB (MySQL)

Tipos de datos numéricos


Hasta ahora hemos visto 2 tipos de datos para almacenar valores numéricos: integer (con
y sin signo) y float (con y sin signo). Existe variedad de tipos numéricos para representar
enteros, negativos, decimales.
Para almacenar valores enteros, por ejemplo, en campos que hacen referencia a cantidades,
precios, etc., usamos:
1) integer(x) o int(x): su rango es de -2000000000 a 2000000000 aprox. El tipo "int
unsigned" va de 0 a 4000000000. El tipo "integer" tiene subtipos:
- mediumint(x): va de –8000000 a 8000000 aprox. Sin signo va de 0 a 16000000 aprox.
- smallint(x): va de –30000 a 30000 aprox., sin signo, de 0 a 60000 aprox.
- tinyint(x): define un valor entero pequeño, cuyo rango es de -128 a 127. El tipo sin signo
va de 0 a 255.
- bool o boolean: sinónimos de tinyint(1). Un valor cero se considera falso, los valores
distintos de cero, verdadero.
- bigint(x): es un entero largo. Va de –9000000000000000000 a 9000000000000000000
aprox. Sin signo es de 0 a 10000000000000000000.
Para almacenar valores con decimales utilizamos:
2) float (t,d): número de coma flotante. Su rango es de -3.4e+38 a –1.1e-38 (9 cifras).
3) decimal o numeric (t,d): el primer argumento indica el total de dígitos y el segundo, la
cantidad de decimales. El rango depende de los argumentos, también los bytes que ocupa.
Si queremos almacenar valores entre 0.00 y 99.99 debemos definir el campo como tipo
"decimal (4,2)". Si no se indica el valor del segundo argumento, por defecto es 0. Para los
tipos "float" y "decimal" se utiliza el punto como separador de decimales.
Todos los tipos enteros pueden tener el atributo "unsigned", esto permite sólo valores
positivos y duplica el rango. Los tipos de coma flotante también aceptan el atributo
"unsigned", pero el valor del límite superior del rango no se modifica.
Es importante elegir el tipo de dato adecuado según el caso, el más preciso. Por ejemplo, si
un campo numérico almacenará valores positivos menores a 10000, el tipo "int" no es el
más adecuado, porque su rango va de -2000000000 a 2000000000 aprox., conviene el tipo
"smallint unsigned", cuyo rango va de 0 a 60000 aprox. De esta manera usamos el menor
espacio de almacenamiento posible.

112
Administración de bases de datos con MariaDB (MySQL)

Tipo Bytes de almacenamiento


_______________________________________
tinyint 1
smallint 2
mediumint 3
int 4
bigint 8
float 4
decimal(t,d) t+2 si d>0, t+1 si d=0 y d+2 si t<d

Probemos en "Workbench" crear una tabla con campos de distinto tipo y luego ejecutar el
comando describe:
drop table if exists libros;

create table libros(


codigo int unsigned primary key auto_increment,
titulo varchar(20) not null,
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,
cantidad smallint unsigned,

);
describe libros;

Tipos de datos para Fechas y horas


Para guardar fechas y horas dispone de varios tipos:
1) date: representa una fecha con formato "YYYY-MM-DD". El rango va de "1000-01-01"
a "9999-12-31".
2) datetime: almacena fecha y hora, su formato es "YYYY-MM-DD HH:MM:SS". El
rango es de "1000-01-01 00:00:00" a "9999-12-31 23:59:59".
3) time: una hora. Su formato es "HH:MM:SS". El rango va de "-838:59:59" a "838:59:59".
4) year(2) y year(4): un año. Su formato es "YYYY" o "YY". Permite valores desde 1901
a 2155 (en formato de 4 dígitos) y desde 1970 a 2069 (en formato de 2 dígitos).
Si ingresamos los valores como cadenas, un valor entre "00" y "69" es convertido a valores
"year" en el rango de 2000 a 2069; si el valor está entre "70" y "99", se convierten a valores
"year" en el rango 1970 a 1999.

113
Administración de bases de datos con MariaDB (MySQL)

Si ingresamos un valor numérico 0, se convierte en "0000"; entre 1 y 69, se convierte a


valores "year" entre 2001 a 2069; entre 70 y 99, es convertido a valores "year" de 1970 a
1999.
Para almacenar valores de tipo fecha se permiten como separadores "/", "-" y ".".
• Si ingresamos '06-12-31' (año de 2 dígitos), lo toma como '2006-12-31'.
• Si ingresamos '2006-2-1' (mes y día de 1 dígito), lo toma como '2006-02-01'.
• Si ingresamos '20061231' (cadena sin separador), lo toma como '2006-12-31'.
• Si ingresamos 20061231 (numérico), lo toma como '2006-12-31'.
• Si ingresamos '20061231153021' (cadena sin separadores), lo toma como '2006-12-
31 15:30:21'.
• Si ingresamos '200612311530' (cadena sin separadores con un dato faltante) no lo
reconoce como fechahora y almacena ceros.
• Si ingresamos '2006123' (cadena sin separadores con un dato faltante) no lo
reconoce como fecha y almacena ceros.
• Si ingresamos '2006-12-31 11:30:21' (valor date time) en un campo 'date', toma sólo
la parte de la fecha, la hora se corta, se guarda '2006-12-31'.
Es importante elegir el tipo de dato adecuado según el caso, el más preciso. Por ejemplo, si
sólo necesitamos registrar un año (sin día ni mes), el tipo adecuado es "year" y no "date".

Tipo Bytes de almacenamiento


_______________________________________
date 3
datetime 8
time 3
year 1

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones


SQL para probar campos de tipo time:
drop table if exists vehiculos;

create table vehiculos(


placa char(6)primary key,
tipo char (4),
horallegada time not null,

114
Administración de bases de datos con MariaDB (MySQL)

horasalida time
);

insert into vehiculos values ('ACD123','auto','8:30');


insert into vehiculos values('BGF234','moto','8:35');
insert into vehiculos values('KIU467','auto','9:40');

select * from vehiculos;

update vehiculos set horasalida='11:45'


where patente='ACD123';

insert into vehiculos values('LIO987','auto','10',null);


select * from vehiculos;

Campos calculados

Es posible obtener salidas en las cuales una columna sea el resultado de un cálculo y no
un campo de una tabla.
Si queremos ver los títulos, precio y cantidad de cada libro escribimos la siguiente
sentencia:
select titulo,precio,cantidad from libros;

Si queremos saber el monto total en dinero de un título podemos multiplicar el precio por la
cantidad por cada título, pero también podemos hacer que MySQL realice el cálculo y lo
incluya en una columna extra en la salida:

select titulo, precio,cantidad,precio*cantidad


from libros;

Si queremos saber el precio de cada libro con un 10% de descuento podemos incluir en la
sentencia los siguientes cálculos:
select titulo, precio,precio*0.1,precio-(precio*0.1)
from libros;

Ejecutemos el siguiente bloque de instrucciones SQL donde generamos columnas


calculadas en los comandos select:

115
Administración de bases de datos con MariaDB (MySQL)

create database librería;


use librería;

create table libros(


codigo int primary key unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,
cantidad smallint unsigned,
);

insert into libros values(null,'El señor


presidente','Asturias','Salvat',100,25);

insert into libros values(null,'Martin Fierro','Jose


Hernandez','Emece',22.20,200);

insert into libros values(null,'Antologia


poetica','Borges','Planeta',40,150);

insert into libros values(null,'Aprenda PHP','Mario


Molina','Emece',18.20,200);

insert into libros values(null,'Cervantes y el


quijote','Borges','Paidos',36.40,100);

insert into libros values(null,'Manual de PHP', 'J.C. Paez',


'Paidos',30.80,100);

insert into libros values(null,'Harry Potter y la piedra


filosofal','J.K. Rowling','Paidos',45.00,500);

insert into libros values('Harry Potter y la cámara


secreta','J.K. Rowling','Paidos',46.00,300);

insert into libros values(null,'Alicia en el país de las


maravillas','Lewis Carroll','Paidos',null,50);

select titulo, precio,cantidad,precio*cantidad


from libros;

select titulo, precio,precio*0.1,precio-(precio*0.1)


from libros;

Con qué encabezado se muestran los campos calculados?

116
Administración de bases de datos con MariaDB (MySQL)

Definición de Alias con As

Un "alias" se usa como nombre de un campo o de una expresión o para referenciar una
tabla cuando se utilizan más de una tabla (tema que veremos más adelante). En los campos
calculados, es muy conveniente usarlos porque, nos permiten rotular, adecuadamente un
resultado. Los alias se implementan con la palabra: as. Por ejemplo:

En el caso de los campos calculados del ejemplo anterior, podemos utilizar alias para que al
ejecutar la consulta, se muestren con un encabezado de columna que identifique el
resultado. La forma con alias es la siguiente:

select titulo, precio,cantidad,precio*cantidad as total


from libros;

select titulo, precio,precio*0.1 as descuento,precio-


(precio*0.1)as “precio con descuento” from libros;

Un alias puede contener varias


palabras con espacio. En este caso,
debe encerrarse entre comillas.

Actividad

Una empresa almacena los datos de sus empleados en una tabla "empleados".

1- Cree una bd, llamada: Planilla.

2- Cree una tabla llamada "empleados" con la estructura necesaria para almacenar la
siguiente información:
- nombre del empleado,
- documento,
- sexo,
- domicilio,
- sueldo base ,
- hijos a cargo,
- clave primaria: documento.

3- Ingrese algunos registros:

117
Administración de bases de datos con MariaDB (MySQL)

• La empresa está pensando en aumentar un 10% el sueldo a los empleados, y quiere


saber a cuánto subiría cada sueldo básico, para ello usamos la siguiente sentencia en
la cual incluimos una columna que hará el cálculo de cada sueldo más el 15%:

• La empresa paga un bono familiar por hijos a cargo, Q200 por cada hijo.
Necesitamos el nombre del empleado, el sueldo base, la cantidad de hijos a cargo, el
total del salario familiar y el sueldo final (incluyendo el bono familiar):

Ordenamientos

Podemos ordenar el resultado de un "select" para que los registros se muestren ordenados
por algún campo, para ello usamos la cláusula "order by".
Por ejemplo, recuperamos los registros de la tabla "libros" ordenados por el título:
select codigo,titulo,autor,editorial,precio from libros order
by titulo;

Aparecen los registros ordenados alfabéticamente por el campo especificado.


También podemos colocar el número de orden del campo por el que queremos que se
ordene en lugar de su nombre. Por ejemplo, queremos el resultado del "select" ordenado
por "precio":
select codigo,titulo,autor,editorial,precio from libros order
by 5;

Por defecto, si no aclaramos en la sentencia, los ordena de manera ascendente (de menor a
mayor). Podemos ordenarlos de mayor a menor, para ello agregamos la palabra clave
"desc":
select codigo,titulo,autor,editorial,precio from libros order
by editorial desc;

También podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial":
select codigo,titulo,autor,editorial,precio from libros order by titulo, editorial;

Incluso, podemos ordenar en distintos sentidos, por ejemplo, por "titulo" en sentido
ascendente y "editorial" en sentido descendente:
select codigo,titulo,autor,editorial,precio
from libros order by titulo asc, editorial desc;

118
Administración de bases de datos con MariaDB (MySQL)

Debe aclararse al lado de cada campo, el tipo de ordenamiento, pues estas palabras claves
afectan al campo inmediatamente anterior.
Ejecutemos el siguiente bloque de instrucciones SQL:

drop table if exists libros;

create table libros(


codigo int unsigned primary key auto_increment,
titulo varchar(40),
autor varchar(30),
editorial varchar(15),
precio decimal (5,2) unsigned,
);

insert into libros values(null,'El señor


presidente','Asturias','Salvat',100);
insert into libros values(null,'Martin Fierro','Jose
Hernandez','Emece',22.90);
insert into libros values(null,'Martin Fierro','Jose
Hernandez','Planeta',39);
insert into libros values(null,'Aprenda PHP','Mario
Molina','Emece',19.50);
insert into libros values(null,'Cervantes y el
quijote','Borges','Paidos',35.40);
insert into libros values(null,'Matematica estas ahi',
'Paenza', 'Paidos',19);
select codigo,titulo,autor,editorial,precio
from libros
order by titulo;

select * from libros order by 5;


select * from libros order by titulo, editorial;

select codigo,titulo,autor,editorial,precio from libros


order by titulo asc, editorial desc;

119
Administración de bases de datos con MariaDB (MySQL)

Actividad

Cree una base de datos denominada Farmacia con una tabla llamada "medicamentos" que
almacena la información de los productos que se venden.

1- Elimine la tabla, si existe.

2- Cree la tabla con la siguiente estructura:

create table medicamentos(


codigo int unsigned primary key auto_increment,
nombre varchar(20),
laboratorio varchar(20),
precio decimal(5,2),
cantidad int unsigned,

);

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros (insert into):

5- Ordene los registros por precio, de mayor a menor.

6- Ordene los medicamentos por número del campo "cantidad".

7- Ordene los registros por "laboratorio" (descendente) y cantidad (ascendente).

Condiciones compuestas con and y or


Hasta el momento, hemos aprendido a establecer una condición con "where" utilizando
operadores relacionales. Podemos establecer más de una condición con la cláusula
"where", para ello aprenderemos los operadores lógicos.
Son los siguientes:
- and, significa "y",
- or, significa "y/o",
- xor, significa "o",
- not, significa "no", invierte el resultado
- (), paréntesis

Los operadores lógicos se usan para combinar condiciones.

120
Administración de bases de datos con MariaDB (MySQL)

Queremos recuperar todos los registros cuyo autor sea igual a "Borges" y cuyo precio no
supere los 20 pesos, para ello necesitamos 2 condiciones:
select * from libros
where (autor='Aturias') and
(precio<=20);

Los registros recuperados en una sentencia que une 2 condiciones con el operador "and",
cumplen con las 2 condiciones.
Queremos ver los libros cuyo autor sea "Borges" y/o cuya editorial sea "Planeta":
select * from libros
where autor='Asturias' or
editorial='Planeta';

En la sentencia anterior usamos el operador "or", indicamos que recupere los libros en los
cuales el valor del campo "autor" sea "Asturias" y/o el valor del campo "editorial" sea
"Planeta", es decir, seleccionará los registros que cumplan con la primera condición, con la
segunda condición o con ambas condiciones.
Los registros recuperados con una sentencia que une 2 condiciones con el operador "or",
cumplen 1 de las condiciones o ambas.
Queremos ver los libros cuyo autor sea "Asturias" o cuya editorial sea "Planeta":
select * from libros
where (autor='Borges') xor
(editorial='Planeta');

En la sentencia anterior usamos el operador "xor", indicamos que recupere los libros en los
cuales el valor del campo "autor" sea "Borges" o el valor del campo "editorial" sea
"Planeta", es decir, seleccionará los registros que cumplan con la primera condición o con
la segunda condición pero no los que cumplan con ambas condiciones. Los registros
recuperados con una sentencia que une 2 condiciones con el operador "xor", cumplen 1 de
las condiciones, no ambas.
Queremos recuperar los libros que no cumplan la condición dada, por ejemplo, aquellos
cuya editorial NO sea "Planeta":
select * from libros
where not (editorial='Planeta');

El operador "not" invierte el resultado de la condición a la cual antecede.


Los registros recuperados en una sentencia en la cual aparece el operador "not", no
cumplen con la condición a la cual afecta el "NO".

121
Administración de bases de datos con MariaDB (MySQL)

Los paréntesis se usan para encerrar condiciones, para que se evalúen como una sola
expresión.
Cuando explicitamos varias condiciones con diferentes operadores lógicos (combinamos
"and", "or") permite establecer el orden de prioridad de la evaluación; además permite
diferenciar las expresiones más claramente.
Por ejemplo, las siguientes expresiones devuelven un resultado diferente:
select * from libros
where (autor='Asturias') or
(editorial='Paidos' and precio<20);

select*from libros
where (autor='Borges' or editorial='Paidos') and
(precio<20);

Si bien los paréntesis no son obligatorios en todos los casos, se recomienda utilizarlos para
evitar confusiones.
El orden de prioridad de los operadores lógicos es el siguiente: "not" se aplica antes que
"and" y "and" antes que "or", si no se especifica un orden de evaluación mediante el uso de
paréntesis.
El orden en el que se evalúan los operadores con igual nivel de precedencia es indefinido,
por ello se recomienda usar los paréntesis.
Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones
SQL donde probamos los operadores lógicos and, or, not y xor:
create database biblioteca2;
use biblioteca2;

create table libros(


codigo int unsigned primary key auto_increment,
titulo varchar(40),
autor varchar(30),
editorial varchar(15),
precio decimal(5,2),
);

insert into libros values(null,'El señor


presidente','Asturias','Salvat',100);

insert into libros values(null,'Martin Fierro','José


Hernandez','Emece',22.90);

122
Administración de bases de datos con MariaDB (MySQL)

insert into libros values(null,'Martin Fierro','José


Hernandez','Planeta',39);
insert into libros values(null,'Aprenda PHP','Mario
Molina','Emece',19.50);
insert into libros values(null,'Cervantes y el
quijote','Borges','Paidos',35.40);

insert into libros values(null,'Matemática estas ahí',


'Paenza', 'Paidos',19);

select * from libros


where autor='Asturias' and
precio<=20;
select * from libros
where autor='Paenza' or
editorial='Planeta';

select * from libros


where (autor='Asturias') xor
(editorial='Planeta');

select * from libros


where not (editorial='Planeta');

select * from libros


where (autor='Asturias') or
(editorial='Paidos' and precio<20);
select * from libros
where (autor='Asturias' or editorial='Paidos')
and (precio<20);

123
Administración de bases de datos con MariaDB (MySQL)

Actividad

Trabaje con la tabla llamada "medicamentos" de una base de datos denominada: farmacia.

1- Elimine la tabla, si existe.

2- Cree la tabla con la siguiente estructura:


create table medicamentos(
codigo int unsigned primary key auto_increment,
nombre varchar(20),
laboratorio varchar(20),
precio decimal(5,2) unsigned,
cantidad int unsigned,
primary key(codigo)
);

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros (insert into):


insert into medicamentos
values(null,'Sertal','Roche',5.2,100);

insert into medicamentos


values(null,'Buscapina','Roche',4.10,200);

insert into medicamentos values(null,'Amoxidal


500','Bayer',15.60,100);

insert into medicamentos values(null,'Paracetamol


500','Bago',1.90,200);

insert into medicamentos


values(null,'Bayaspirina','Bayer',2.10,150);

insert into medicamentos values(null,'Amoxidal


jarabe','Bayer',5.10,250);

5- Recupere los códigos y nombres de los medicamentos cuyo laboratorio sea 'Roche' y
cuyo precio sea menor a 5

Quedó seleccionado 1 registro, es el único que cumple con ambas condiciones.

6- Recupere los medicamentos cuyo laboratorio sea 'Roche' o cuyo precio sea menor a 5:

Note que la salida es diferente, hemos cambiado el operador de la sentencia anterior. Ahora
se recuperaron todos los registros cuyo laboratorio es igual a 'Roche' y todos los registros

124
Administración de bases de datos con MariaDB (MySQL)

cuyo precio es menor a 5. Aquellos registros que no cumplieron con la condición 1 (no son
de "Roche") ni con la condicion2 (no cuestan menos de 5) no aparecen.

7- Muestre todos los registros que no sean de "Bayer" usando el operador "not".

8- Muestre todos los medicamentos cuyo laboratorio NO sea "Bayer" y cuya cantidad
9- Muestre todos los medicamentos cuyo laboratorio sea "Bayer" y cuya cantidad NO
sea=100:

10- Elimine todos los registros cuyo laboratorio sea igual a "Bayer" y su precio sea mayor a
10:

11- Cambie la cantidad por 200, a todos los medicamentos de "Roche" cuyo precio sea
mayor a 5:

12- Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio sea menor a 3.
Antes veamos cuáles cumplen con la condición, los registros 5 y 6 son de "Bayer, cumplen
con la primera condición, los registros 4 y 5 cumplen con la segunda condición, es decir, se
borrarán 3 registros:

el 4 porque cumple con la segunda condición, el 5 porque cumple con ambas y el 6 porque
cumple con la primera.

Operadores relacionales Between - in

Hemos visto los operadores relacionales:


= (igual), <> (distinto), > (mayor), < (menor), >= (mayor o igual), <= (menor o igual), is
null/is not null (si un valor es NULL o no).
Existen otros que simplifican algunas consultas:
Para recuperar de nuestra tabla "libros" los registros que tienen precio mayor o igual a 20 y
menor o igual a 40, usamos 2 condiciones unidas por el operador lógico "and":
select * from libros
where precio>=20 and precio<=40;

Podemos usar "between":


select * from libros
where precio between 20 and 40;

125
Administración de bases de datos con MariaDB (MySQL)

"between" significa "entre". Averiguamos si el valor de un campo dado (precio) está entre
los valores mínimo y máximo especificados (20 y 40 respectivamente).
Si agregamos el operador "not" antes de "between" el resultado se invierte.
Para recuperar los libros cuyo autor sea 'Paenza' o 'Asturias' usamos 2 condiciones:
select * from libros
where autor='Asturias' or autor='Paenza';

Podemos usar "in":


select * from libros
where autor in('Asturias','Paenza');

Con "in" averiguamos si el valor de un campo dado (autor) está incluido en la lista de
valores especificada (en este caso, 2 cadenas).
Para recuperar los libros cuyo autor no sea 'Paenza' ni 'Asturias' usamos:
select * from libros where autor<>'Asturias' and
autor<>'Paenza';

También podemos usar "in" :


select * from libros
where autor not in ('Asturias','Paenza');

Con "in" averiguamos si el valor del campo está incluido en la lista, con "not" antecediendo
la condición, invertimos el resultado.
Ejecutemos el siguiente bloque de instrucciones SQL para utilizar los operadores
relacionales 'between' y 'in'.
Create database libreria;
use libreria;

create table libros(


codigo int unsigned primary key auto_increment,
titulo varchar(40),
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,

);

insert into libros values(null,'El señor


presidente','Asturias','Salvat',100);

126
Administración de bases de datos con MariaDB (MySQL)

insert into libros values(null,'Martin Fierro','José


Hernandez','Emece',22.90);

insert into libros values(null,'Martin Fierro','José


Hernandez','Planeta',39);
insert into libros values(null,'Aprenda PHP','Mario
Molina','Emece',19.50);
insert into libros values(null,'Cervantes y el
quijote','Borges','Paidos',35.40);

insert into libros values(null,'Matemática estas ahí',


'Paenza', 'Paidos',19);

select * from libros


where precio>=20 and
precio<=40;
select * from libros
where precio between 20 and 40;
select * from libros
where autor='Borges' or
autor='Paenza';

select * from libros


where autor in('Asturias','Paenza');

select * from libros


where autor<>'Asturias' and
autor<>'Paenza';

select * from libros


where autor not in ('Asturias','Paenza');

Actividad

1.Trabaje con la tabla llamada "medicamentos" de una farmacia. Abra la base de datos
Farmacia, con Use.

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros:


insert into medicamentos
values(null,'Sertal','Roche',5.2,100);

127
Administración de bases de datos con MariaDB (MySQL)

insert into medicamentos


values(null,'Buscapina','Roche',4.10,200);

insert into medicamentos values(null,'Amoxidal


500','Bayer',15.60,100);

insert into medicamentos values(null,'Paracetamol


500','Bago',1.90,200);

insert into medicamentos


values(null,'Bayaspirina','Bayer',2.10,150);

insert into medicamentos values(null,'Amoxidal


jarabe','Bayer',5.10,250);

5- Recupere los nombres y precios de los medicamentos cuyo precio esté entre 5 y 15:

6- Seleccione los registros cuyo laboratorio sea "Bayer" o "Bago":

7- Elimine los registros cuya cantidad esté entre 100 y 200:


delete from medicamentos
where cantidad between 100 and 200;

Tanto between como in,


pueden usarse con select,
delete y update

Búsqueda de patrones con Like y not Like

Se han realizado consultas utilizando operadores relacionales para comparar cadenas. Por
ejemplo, sabemos recuperar los libros cuyo autor sea igual a la cadena "Asturias":
select * from libros
where autor='Asturias';

Los operadores relacionales nos permiten comparar valores numéricos y cadenas de


caracteres. Pero al realizar la comparación de cadenas, busca coincidencias de cadenas
completas.
Imaginemos que tenemos registrados estos 2 libros:
El señor Presidente de Asturias;
Leyendas de Guatemala de M.A. Asturias;

128
Administración de bases de datos con MariaDB (MySQL)

Si queremos recuperar todos los libros cuyo autor sea "Asturias", y especificamos la
siguiente condición:
select * from libros
where autor='Asturias';

sólo aparecerá el primer registro, ya que la cadena "Asturias" no es igual a la cadena "M.A.
Asturias".
Esto sucede porque el operador "=" (igual), también el operador "<>" (distinto) comparan
cadenas de caracteres completas. Para comparar porciones de cadenas utilizamos los
operadores "like" y "not like".
Entonces, podemos comparar trozos de cadenas de caracteres para realizar consultas. Para
recuperar todos los registros cuyo autor contenga la cadena "Asturias" debemos digitar:
select * from libros
where autor like "%Asturias%";

El símbolo "%" (porcentaje) reemplaza cualquier cantidad de caracteres (incluyendo ningún


caracter). % es un carácter comodín. "like" y "not like" son operadores de comparación que
señalan igualdad o diferencia.
Para seleccionar todos los libros que comiencen con "A":
select * from libros
where titulo like 'A%';

Note que el símbolo "%" ya no está al comienzo, con esto indicamos que el título debe
tener como primera letra la "A" y luego, cualquier cantidad de caracteres.
Para seleccionar todos los libros que no comiencen con "A":
select * from libros
where titulo not like 'A%';

Así como "%" reemplaza cualquier cantidad de caracteres, el guión bajo "_" reemplaza un
caracter, es el otro caracter comodín. Por ejemplo, queremos ver los libros de "Lewis
Carroll" pero no recordamos si se escribe "Carroll" o "Carrolt", entonces tipeamos esta
condición:
select * from libros
where autor like "%Carrol_";

Si necesitamos buscar un patrón en el que aparezcan los caracteres comodines, por ejemplo,
queremos ver todos los registros que comiencen con un guión bajo, si utilizamos '_%',
mostrará todos los registros porque lo interpreta como "patrón que comienza con un

129
Administración de bases de datos con MariaDB (MySQL)

carácter cualquiera y sigue con cualquier cantidad de caracteres". Debemos utilizar "\_%",
esto se interpreta como 'patrón que comienza con guión bajo y continúa con cualquier
cantidad de caracteres". Es decir, si queremos incluir en una búsqueda de patrones los
caracteres comodines, debemos anteponer al carácter comodín, la barra invertida "\", así lo
tomará como carácter de búsqueda literal y no como comodín para la búsqueda. Para buscar
el carácter literal "%" se debe colocar "\%".

Digitar el siguiente bloque de instrucciones SQL:


create databas libreriaCultura;
use libreriaCultura;
create table libros(
codigo int unsigned primary key auto_increment,
titulo varchar(40),
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,
primary key(codigo)
);
insert into libros values(null,'El señor
presidente','Asturias','Salvat',100);
insert into libros
values(null,'Martin Fierro','Jose
Hernandez','Emece',22.90);

insert into libros


values(null,'Leyendas de Guatemala','M.A. Asturias','Piedra
Santa',39);

insert into libros


values(null,'Aprenda PHP','Mario Molina','Emece',19.50);

insert into libros


values('Cervantes y el quijote','Bioy Casare- J.L.
Borges','Paidos',35.40);
insert into libros
values(null,'Manual de PHP', 'J.C. Paez', 'Paidos',19);
insert into libros
values(null,'Harry Potter y la piedra filosofal','J.K.
Rowling','Paidos',45.00);

130
Administración de bases de datos con MariaDB (MySQL)

insert into libros


values(null,'Harry Potter y la camara secreta','J.K.
Rowling','Paidos',46.00);

insert into libros


values(null,'Alicia en el pais de las maravillas','Lewis
Carroll','Paidos',36.00);
select * from libros
where autor='Asturias';
select * from libros
where autor like '%Asturias%';
select * from libros
where titulo like 'A%';

select * from libros


where titulo not like 'A%';

select * from libros


where autor like '%Carrol_';

select * from libros


where titulo like '%Harry Potter%';

select * from libros


where titulo like '%PHP%';

Contar registros con la función count

Existen en MySQL funciones que nos permiten contar registros, calcular sumas,
promedios, obtener valores máximos y mínimos. Veamos algunas de ellas.
Imaginemos que nuestra tabla "libros" contiene muchos registros. Para averiguar la
cantidad sin necesidad de contarlos manualmente usamos la función "count()":
select count(*) from libros;

La función "count()" cuenta la cantidad de registros de una tabla, incluyendo los que tienen
valor nulo.
Para saber la cantidad de libros de la editorial "Planeta" tipeamos:
select count(*) from libros
where editorial='Planeta';

131
Administración de bases de datos con MariaDB (MySQL)

También podemos utilizar esta función junto con la clausula "where" para una consulta más
específica. Por ejemplo, solicitamos la cantidad de libros que contienen la cadena
"Asturias":
select count(*) from libros
where autor like '%Asturias%';

Para contar los registros que tienen precio (sin tener en cuenta los que tienen valor nulo),
usamos la función "count()" y en los paréntesis colocamos el nombre del campo que
necesitamos contar:
select count(precio) from libros;

Note que "count(*)" retorna la cantidad de registros de una tabla (incluyendo los que tienen
valor "null") mientras que "count(precio)" retorna la cantidad de registros en los cuales el
campo "precio" no es nulo. No es lo mismo. "count(*)" cuenta registros, si en lugar de un
asterisco colocamos como argumento el nombre de un campo, se contabilizan los registros
cuyo valor en ese campo no es nulo.

Observación: Tenga en cuenta que no debe haber espacio entre el nombre de la función y
el paréntesis, porque puede confundirse con una referencia a una tabla o campo. Las
siguientes sentencias son distintas:
select count(*) from libros;
select count (*) from libros;

La primera es correcta, la segunda no.


Digitar y ejecutar el siguiente bloque de instrucciones SQL para probar la función 'count':
drop table if exists libros;
create table libros(
codigo int unsigned primary key auto_increment,
titulo varchar(40),
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,
primary key(codigo)
);
insert into libros values(null,'El señor
presidente','Asturias','Salvat',100);
insert into libros
values(null,'Martin Fierro','Jose
Hernandez','Emece',22.90);

132
Administración de bases de datos con MariaDB (MySQL)

insert into libros


values(null,'Leyendas de Guatemala','M.A. Asturias','Piedra
Santa',39);

insert into libros


values(null,'Aprenda PHP','Mario Molina','Emece',19.50);

insert into libros


values(null,'Cervantes y el quijote','Bioy Casare- J.L.
Borges','Paidos',35.40);
insert into libros
values(null,'Manual de PHP', 'J.C. Paez', 'Paidos',19);
insert into libros
values(null,'Harry Potter y la piedra filosofal','J.K.
Rowling','Paidos',45.00);

insert into libros


values(null,'Harry Potter y la camara secreta','J.K.
Rowling',null,46.00);

insert into libros


values('Alicia en el pais de las maravillas','Lewis
Carroll',null,36.00);

select count(*) from libros;

select count(*) from libros


where editorial='Emece';

select count(*) from libros where autor like '%Asturias%';


select count(precio) from libros;

Cuenta todos los registros


cuyo precio no es nulo

Funciones de grupo

Existen en MySQL funciones que nos permiten contar registros, calcular sumas,
promedios, obtener valores máximos y mínimos. Ya hemos aprendido "count()", veamos
otras.
La función "sum()" retorna la suma de los valores que contiene el campo especificado. Por
ejemplo, queremos saber la cantidad de libros que tenemos disponibles para la venta:
select sum(cantidad) from libros;

133
Administración de bases de datos con MariaDB (MySQL)

También podemos combinarla con "where". Por ejemplo, queremos saber cuántos libros
tenemos de la editorial "Planeta":
select sum(cantidad) from libros
where editorial ='Paidos';

Para averiguar el valor máximo o mínimo de un campo usamos las funciones "max()" y
"min()" respectivamente. Ejemplo, queremos saber cuál es el mayor precio de todos los
libros:
select max(precio) from libros;

Queremos saber cuál es el valor mínimo de los libros de "Rowling":


select min(precio) from libros
where autor like '%Rowling%';

La función avg() retorna el valor promedio de los valores del campo especificado. Por
ejemplo, queremos saber el promedio del precio de los libros referentes a "PHP":
select avg(precio) from libros
where titulo like '%PHP%';

Estas funciones se denominan "funciones de agrupamiento" porque operan sobre conjuntos


de registros, no con datos individuales.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones


SQL para probar varias funciones de agrupamiento:
drop table if exists libros;
create table libros(
codigo int unsigned primary key auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,
cantidad mediumint unsigned,
primary key(codigo)
);

insert into libros values(null,'El señor


presidente','Asturias','Salvat',100,25);

insert into libros values(null,'Martin Fierro','José


Hernandez','Emece',22.20,200);

134
Administración de bases de datos con MariaDB (MySQL)

insert into libros values(null,'Antología poetica','J.L.


Borges','Planeta',40,150);

insert into libros values(null,'Aprenda PHP','Mario


Molina','Emece',18.20,200);

insert into libros values(null,'Cervantes y el quijote','Bioy


Casares- J.L. Borges','Paidos',36.40,100);

insert into libros values(null,'Manual de PHP', 'J.C. Paez',


'Paidos',30.80,120);

insert into libros values(null,'Harry Potter y la piedra


filosofal','J.K. Rowling','Paidos',45.00,50);

insert into libros values(null,'Harry Potter y la cámara


secreta','J.K. Rowling','Paidos',46.00,100);

insert into libros values(null,'Alicia en el país de las


maravillas','Lewis Carroll','Paidos',null,200);

select sum(cantidad) from libros;

select sum(cantidad) from libros


where editorial ='Planeta';

select max(precio) from libros;

select * from libros


order by precio desc;

select min(precio) from libros


where autor like '%Rowling%';

select * from libros


where autor like '%Rowling%'
order by 5;

select avg(precio) from libros


where titulo like '%PHP%';

select * from libros


where titulo like '%PHP%';

select count(*) from libros;

Agrupamiento de registros

135
Administración de bases de datos con MariaDB (MySQL)

Hemos aprendido que las funciones de agrupamiento permiten contar registros, calcular
sumas y promedios, obtener valores máximos y mínimos. También dijimos que dichas
funciones operan sobre conjuntos de registros, no con datos individuales.
Generalmente esta funciones se combinan con la sentencia "group by", que agrupa registros
para consultas detalladas.
Queremos saber la cantidad de visitantes de cada departamento, podemos tipear la siguiente
sentencia:
select count(*) from visitantes
where departamento='Guatemala';

y repetirla con cada valor de "departamento":


select count(*) from visitantes
where departamento='Petén';
select count(*) from visitantes
where departamento='Sacatepéquez';
...

Pero hay otra manera, utilizando la cláusula "group by":


select departamento, count(*)
from visitantes
group by departamento;

Entonces, para saber la cantidad de visitantes que tenemos en cada departamento utilizamos
la función "count()", agregamos "group by" y el campo por el que deseamos que se realice
el agrupamiento, también colocamos el nombre del campo a recuperar.
La instrucción anterior solicita que muestre el nombre de la departamento y cuente la
cantidad agrupando los registros por el campo "departamento". Como resultado aparecen
los nombres de las departamentoes y la cantidad de registros para cada valor del campo.
Para obtener la cantidad visitantes con teléfono no nulo, de cada departamento utilizamos la
función "count()" enviándole como argumento el campo "telefono", agregamos "group by"
y el campo por el que deseamos que se realice el agrupamiento (departamento):
select departamento, count(telefono)
from visitantes
group by departamento;

Como resultado aparecen los nombres de las departamentoes y la cantidad de registros de


cada una, sin contar los que tienen teléfono nulo. Recuerde la diferencia de los valores que
retorna la función "count()" cuando enviamos como argumento un asterisco o el nombre de

136
Administración de bases de datos con MariaDB (MySQL)

un campo: en el primer caso cuenta todos los registros incluyendo los que tienen valor nulo,
en el segundo, los registros en los cuales el campo especificado es no nulo.
Para conocer el total de las compras agrupadas por sexo:
select sexo, sum(montocompra)
from visitantes
group by sexo;

Para saber el máximo y mínimo valor de compra agrupados por sexo:


select sexo, max(montocompra) from visitantes
group by sexo;
select sexo, min(montocompra) from visitantes
group by sexo;

Se pueden simplificar las 2 sentencias anteriores en una sola sentencia, ya que usan el
mismo "group by":
select sexo, max(montocompra),
min(montocompra)
from visitantes
group by sexo;

Para calcular el promedio del valor de compra agrupados por departamento:


select departamento, avg(montocompra) from visitantes
group by departamento;

Podemos agrupar por más de un campo, por ejemplo, vamos a hacerlo por "departamento"
y "sexo":
select departamento, sexo, count(*) from visitantes
group by departamento,sexo;

También es posible limitar la consulta con "where".


Vamos a contar y agrupar por departamento sin tener en cuenta "Cordoba":
select departamento, count(*) from visitantes
where departamento<>'Petén'
group by departamento;

Podemos usar las palabras claves "asc" y "desc" para una salida ordenada:
select departamento, count(*) from visitantes
group by departamento desc;

137
Administración de bases de datos con MariaDB (MySQL)

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones


SQL para analizar la cláusula 'group by':
create database turismo;
use turismo;

create table visitantes(


nombre varchar(30),
edad tinyint unsigned,
sexo char(1),
domicilio varchar(30),
departamento varchar(20),
telefono varchar(11),
montocompra decimal (6,2) unsigned
);

insert into visitantes values (null,'Susana Molina',


28,'f','zona 3','Guatemala',null,45.50);

insert into visitantes values (null,'Marcela


Mercado',36,'f','zona 4','Petén','4545454',0);
insert into visitantes values (null,'Alberto
Garcia',35,'m','zona 7','Sacatepéquez','03547123456',25);
insert into visitantes values (null,'Teresa
Garcia',33,'f','zona 16','Guatemala','03547123456',0);
insert into visitantes values (null,'Roberto
Perez',45,'m','zona 10','Guatemala','4123456',33.20);

values (null,'Roxana Lopez',20,'f','zona 5','Petén',null,0);

-- Para saber la cantidad de visitantes que tenemos de cada


departamento digitamos:

select departamento, count(*)


from visitantes
group by departamento;
-- Necesitamos conocer la cantidad visitantes con teléfono no
nulo, de cada departamento:
select departamento, count(telefono)
from visitantes
group by departamento;

138
Administración de bases de datos con MariaDB (MySQL)

-- Queremos conocer el total de las compras agrupadas por


sexo:
select sexo, sum(montocompra) from visitantes
group by sexo;
-- Para obtener el máximo y mínimo valor de compra agrupados
por sexo:
select sexo, max(montocompra) from visitantes
group by sexo;

select sexo, min(montocompra) from visitantes


group by sexo;

-- Se pueden simplificar las 2 sentencias anteriores en una


sola sentencia, ya que usan el mismo "group by":
select sexo, max(montocompra),
min(montocompra)
from visitantes
group by sexo;

-- Queremos saber el promedio del valor de compra agrupados


por departamento:

select departamento, avg(montocompra) from visitantes


group by departamento;
-- Contamos los registros y agrupamos por 2 campos,
"departamento" y "sexo":

select departamento, sexo, count(*) from visitantes


group by departamento,sexo;

-- Limitamos la consulta, no incluimos los visitantes de


"Petén", contamos y agrupar por departamento:

select departamento, count(*) from visitantes


where departamento<>'Petén'
group by departamento;
-- Usando la palabra clave "desc" obtenemos la salida
ordenada en forma descendente:
select departamento, count(*) from visitantes
group by departamento desc;

139
Administración de bases de datos con MariaDB (MySQL)

Seleccionar un grupo de registros con having

Así como la cláusula "where" permite seleccionar (o rechazar) registros individuales; la


cláusula "having" permite seleccionar (o rechazar) un grupo de registros.
Si queremos saber la cantidad de libros agrupados por editorial usamos la siguiente
instrucción ya aprendida:
select editorial, count(*) from libros
group by editorial;

Si queremos saber la cantidad de libros agrupados por editorial pero considerando sólo
algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente
instrucción:
select editorial, count(*) from libros
group by editorial
having count(*)>2;

Se utiliza "having", seguido de la condición de búsqueda, para seleccionar ciertas filas


retornadas por la cláusula "group by".
Veamos otros ejemplos. Queremos el promedio de los precios de los libros agrupados por
editorial:
select editorial, avg(precio) from libros
group by editorial;

Ahora, sólo queremos aquellos cuyo promedio supere los 25 pesos:


select editorial, avg(precio) from libros
group by editorial
having avg(precio)>25;

En algunos casos es posible confundir las cláusulas "where" y "having". Queremos contar
los registros agrupados por editorial sin tener en cuenta a la editorial "Planeta".
Analicemos las siguientes sentencias:
select editorial, count(*) from libros
where editorial<>'Planeta'
group by editorial;
select editorial, count(*) from libros
group by editorial
having editorial<>'Planeta';

Ambas devuelven el mismo resultado, pero son diferentes.

140
Administración de bases de datos con MariaDB (MySQL)

La primera, selecciona todos los registros rechazando los de editorial "Planeta" y luego los
agrupa para contarlos. La segunda, selecciona todos los registros, los agrupa para contarlos
y finalmente rechaza la cuenta correspondiente a la editorial "Planeta".
No debemos confundir la cláusula "where" con la cláusula "having"; la primera establece
condiciones para la selección de registros de un "select"; la segunda establece condiciones
para la selección de registros de una salida "group by".

Más ejemplos, combinando "where" y "having"


Queremos la cantidad de libros, sin considerar los que tienen precio nulo, agrupados por
editorial, sin considerar la editorial "Planeta":
select editorial, count(*) from libros
where precio is not null
group by editorial
having editorial<>'Planeta';

Aquí, selecciona los registros rechazando los que no cumplan con la condición dada en
"where", luego los agrupa por "editorial" y finalmente rechaza los grupos que no cumplan
con la condición dada en el "having".
Generalmente se usa la cláusula "having" con funciones de agrupamiento, esto no puede
hacerlo la cláusula "where". Por ejemplo queremos el promedio de los precios agrupados
por editorial, de aquellas editoriales que tienen más de 2 libros:
select editorial, avg(precio) from libros
group by editorial
having count(*) > 2;

Podemos encontrar el mayor valor de los libros agrupados por editorial y luego seleccionar
las filas que tengan un valor mayor o igual a 30:
select editorial, max(precio) from libros
group by editorial
having max(precio)>=30;

Esta misma sentencia puede usarse empleando un "alias", para hacer referencia a la
columna de la expresión:
select editorial, max(precio) as 'mayor' from libros
group by editorial
having mayor>=30;

141
Administración de bases de datos con MariaDB (MySQL)

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones


SQL para analizar la cláusula having:
create database liberia2020;
use librería2020;
create table libros(
codigo int unsigned primary key auto_increment,
titulo varchar(60) not null,
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,

);
insert into libros values(null,'El señor
presidente','Asturias','Salvat',100);
insert into libros values(null,'Martin Fierro','José
Hernandez','Emece',22.20);
insert into libros values(null,'Antologia
poetica','Borges','Planeta',40);
insert into libros values(null,'Aprenda PHP','Mario
Molina','Emece',18.20);
insert into libros values('Cervantes y el
quijote','Borges','Paidos',36.40);

insert into libros values(null,'Manual de PHP', 'J.C. Paez',


'Paidos',30.80);

insert into libros values(null,'Harry Potter y la piedra


filosofal','J.K. Rowling','Paidos',45.00);

insert into libros values(null,'Harry Potter y la cámara


secreta','J.K. Rowling','Paidos',46.00);

insert into libros values(null,'Alicia en el país de las


maravillas','Lewis Carroll','Paidos',null);

-- Queremos averiguar la cantidad de libros agrupados por


editorial:

select editorial, count(*) from libros


group by editorial;

-- Queremos conocer la cantidad de libros agrupados por


--editorial pero considerando
-- sólo los que devuelvan un valor mayor a 2

142
Administración de bases de datos con MariaDB (MySQL)

select editorial, count(*) from libros


group by editorial
having count(*)>2;
-- Necesitamos el promedio de los precios de los libros
-- agrupados por editorial:
select editorial, avg(precio)
from libros
group by editorial;

-- sólo queremos aquellos cuyo promedio supere los 25 pesos:


select editorial, avg(precio)
from libros
group by editorial
having avg(precio)>25;

-- Queremos contar los registros agrupados por editorial sin


--tener en cuenta a la editorial "Planeta"

select editorial, count(*) from libros


where editorial<>'Planeta'
group by editorial;

select editorial, count(*) from libros


group by editorial
having editorial<>'Planeta';

-- Queremos la cantidad de libros, sin tener en cuenta los


--que tienen precio nulo, agrupados por editorial,
--rechazando los de editorial "Planeta"
select editorial, count(*) from libros
where precio is not null
group by editorial
having editorial<>'Planeta';

-- promedio de los precios agrupados por editorial, de


-- aquellas editoriales que tienen más de 2 libros

select editorial, avg(precio) from libros


group by editorial
having count(*) > 2;
-- mayor valor de los libros agrupados por editorial y luego
seleccionar las filas que tengan un valor mayor o igual a 30
select editorial, max(precio)
from libros

143
Administración de bases de datos con MariaDB (MySQL)

group by editorial
having max(precio)>=30;

-- Para esta misma sentencia podemos utilizar un "alias" para


-- hacer referencia a la columna de la expresión

select editorial, max(precio) as 'mayor'


from libros
group by editorial
having mayor>=30;

Omitir registros duplicados con distinct

Con la cláusula "distinct" se especifica que los registros con ciertos datos duplicados sean
obviadas en el resultado. Por ejemplo, queremos conocer todos los autores de los cuales
tenemos libros, si utilizamos esta sentencia:

select autor from libros;

Aparecen repetidos. Para obtener la lista de autores sin repetición usamos:

select distinct autor from libros;

También podemos tipear:

select autor from libros


group by autor;

Note que en los tres casos anteriores aparece "null" como un valor para "autor"· Si sólo
queremos la lista de autores conocidos, es decir, no queremos incluir "null" en la lista,
podemos utilizar la sentencia siguiente:

select distinct autor from libros


where autor is not null;

Para contar los distintos autores, sin considerar el valor "null" usamos:

select count(distinct autor)


from libros;

Note que si contamos los autores sin "distinct", no incluirá los valores "null" pero si los
repetidos:

select count(autor)
from libros;

Esta sentencia cuenta los registros que tienen autor.

144
Administración de bases de datos con MariaDB (MySQL)

Para obtener los nombres de las editoriales usamos:

select editoriales from libros;

Para una consulta en la cual los nombres no se repitan tipeamos:

select distinct editorial from libros;

Podemos saber la cantidad de editoriales distintas usamos:

select count(distinct editoriales) from libros;

Podemos combinarla con "where". Por ejemplo, queremos conocer los distintos autores de
la editorial "Planeta":

select distinct autor from libros


where editorial='Planeta';

También puede utilizarse con "group by":

select editorial, count(distinct autor)


from libros
group by editorial;

Para mostrar los títulos de los libros sin repetir títulos, usamos:

select distinct titulo from libros


order by titulo;

La cláusula "distinct" afecta a todos los campos presentados. Para mostrar los títulos y
editoriales de los libros sin repetir títulos ni editoriales, usamos:

select distinct titulo,editorial


from libros
order by titulo;

Note que los registros no están duplicados, aparecen títulos iguales pero con editorial
diferente, cada registro es diferente.

145
Administración de bases de datos con MariaDB (MySQL)

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones


SQL:

drop table if exists libros;

create table libros(


codigo int unsigned primary key auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,

);

insert into libros values(null,'El señor


presidente','Asturias','Salvat',100);

insert into libros values(null,'Martin Fierro','José


Hernandez','Emece',22.20);

insert into libros values(null,'Martin Fierro','José


Hernandez','Planeta',42.20);

insert into libros values(null,'Antología


poetica','Borges','Planeta',40);

insert into libros values(null,'Aprenda PHP','Mario


Molina','Emece',18.20);

insert into libros values(null,'Cervantes y el


quijote','Bioy Casares- Borges','Paidos',36.40);

insert into libros values(null,'Manual de PHP', null,


'Paidos',30.80);

insert into libros values(null,'Harry Potter y la piedra


filosofal','J.K. Rowling','Planeta',45.00);

insert into libros values(null,'Harry Potter y la cámara


secreta','J.K. Rowling','Planeta',46.00);

insert into libros values(null,'Alicia en el pais de las


maravillas','Lewis Carroll','Paidos',null);

insert into libros values(null,'Alicia en el pais de las


maravillas','Lewis Carroll','Emece',12.10);

-- Para obtener la lista de autores sin repetición usamos


--"distinct"

146
Administración de bases de datos con MariaDB (MySQL)

select distinct autor


from libros;

-- Si sólo queremos la lista de autores conocidos, es decir,


-- no queremos incluir "null" en la lista

select distinct autor


from libros
where autor is not null;

-- Para contar los distintos autores, sin considerar el valor


-- "null"

select count(distinct autor)


from libros;

-- contamos los autores sin "distinct", no incluirá los


-- valores "null" pero si los repetidos:

select count(autor)
from libros;

-- los nombres de las editoriales


select editorial
from libros;
-- Nombres de las editoriales sin repetición

select distinct editorial


from libros;

-- cantidad de editoriales distintas

select count(distinct editorial)


from libros;

-- distintos autores de la editorial "Planeta"


select distinct autor from libros
where editorial='Planeta';
-- contar la cantidad de autores distintos de cada editorial
-- podemos usar "distinct" y "group by"

147
Administración de bases de datos con MariaDB (MySQL)

select editorial,count(distinct autor)


from libros
group by editorial;
-- mostrar los títulos y editoriales de los libros sin –
--repetir títulos ni editoriales
select distinct titulo,editorial
from libros
order by titulo;

Clave primaria compuesta

Las claves primarias pueden ser simples, formadas por un solo campo o compuestas, más
de un campo.

Recordemos que una clave primaria identifica 1 solo registro en una tabla. Para un valor del
campo clave existe solamente 1 registro. Los valores no se repiten ni pueden ser nulos.

Retomemos el ejemplo de la playa de estacionamiento que almacena cada día los datos de
los vehículos que ingresan en la tabla llamada "vehiculos" con los siguientes campos:

- patente char(6) not null,


- tipo char (4),
- horallegada time not null,
- horasalida time,

Necesitamos definir una clave primaria para una tabla con los datos descriptos arriba. No
podemos usar la patente porque un mismo auto puede ingresar más de una vez en el día a la
playa; tampoco podemos usar la hora de entrada porque varios autos pueden ingresar a una
misma hora. Tampoco sirven los otros campos.

Como ningún campo, por si solo cumple con la condición para ser clave, es decir, debe
identificar un solo registro, el valor no puede repetirse, debemos usar 2 campos.

Definimos una clave compuesta cuando ningún campo por si solo cumple con la condición
para ser clave.

En este ejemplo, un auto puede ingresar varias veces en un día a la playa, pero siempre será
a distinta hora.

Usamos 2 campos como clave, la patente junto con la hora de llegada, así identificamos
unívocamente cada registro.

148
Administración de bases de datos con MariaDB (MySQL)

Para establecer más de un campo como clave primaria usamos la siguiente sintaxis:

create table vehiculos(


patente char(6) not null,
tipo char(4),
horallegada time not null
horasalida time,
primary key(patente,horallegada)
);

Nombramos los campos que formarán parte de la clave separados por comas.

Si vemos la estructura de la tabla con "describe" vemos que en la columna "key", en ambos
campos aparece "PRI", porque ambos son clave primaria.

Un campo que es parte de una clave primaria puede ser autoincrementable sólo si es el
primer campo que compone la clave, si es secundario no se permite.

Es posible eliminar un campo que es parte de una clave primaria, la clave queda con los
campos restantes. Esto, siempre que no queden registros con clave repetida. Por ejemplo,
podemos eliminar el campo "horallegada":

alter table vehiculos drop horallegada;

siempre que no haya registros con "patente" duplicada, en ese caso aparece un mensaje de
error y la eliminación del campo no se realiza.

En caso de ejecutarse la sentencia anterior, la clave queda formada sólo por el campo
"patente".

Ejecutemos el siguiente bloque de instrucciones SQL donde creamos una tabla con clave
primaria compuesta:

drop table if exists vehiculos;


create table vehiculos(
patente char(6) not null,
tipo char(4),
horallegada time not null,
horasalida time,
primary key(patente,horallegada)
);

describe vehiculos;

insert into vehiculos values('ACD123','auto','8:30','9:40');


insert into vehiculos values('AKL098','auto','8:45','11:10');

149
Administración de bases de datos con MariaDB (MySQL)

insert into vehiculos values('HGF123','auto','9:30','11:40');


insert into vehiculos values('DRT123','auto','15:30',null);
insert into vehiculos values('FRT545','moto','19:45',null);
insert into vehiculos
values('GTY154','auto','20:30','21:00');

describe vehiculos;
insert into vehiculos values('ACD123','auto','16:00',null);

-- Intentamos ingresar un vehículo con clave primaria


repetida:
insert into vehiculos values('ACD123','auto','16:00',null);
-- Si ingresamos un registro con hora de ingreso repetida, no
hay problemas,siempre que la patente sea diferente
insert into vehiculos values('ADF123','moto','8:30','10:00');

-- Intentamos eliminar el campo "horallegada"


-- No se puede porque quedarían registros con clave repetida.

alter table vehiculos drop horallegada;

-- Elimine los registros con patente "ACD123":


delete from vehiculos
where patente='ACD123';
-- Intentamos nuevamente eliminar el campo "horallegada"
-- Ahora si lo permite.
alter table vehiculos drop horallegada;

describe vehiculos;

150
Administración de bases de datos con MariaDB (MySQL)

151
Relacionando tablas

Capítulo 3: Relacionando tablas


Los tipos de relaciones entre tablas es un tema que ya fue tratado con anterioridad. En
MySQL las relaciones se implementan mediante el uso de combinaciones (joins). La
combinación que trataremos en este capítulo es la más usada: inner join (unión interna).

Hasta ahora hemos trabajado con una sola tabla, pero en general, se trabaja con varias
tablas.

Para evitar la repetición de datos y ocupar menos espacio, se separa la información en


varias tablas. Cada tabla tendrá parte de la información total que queremos registrar.

Por ejemplo, los datos de nuestra tabla "libros" podrían separarse en 2 tablas, una "libros"
y otra "editoriales" que guardará la información de las editoriales. En nuestra tabla "libros"
haremos referencia a la editorial colocando un código que la identifique. Veamos:

create table libros(


codigo int unsigned primary key auto_increment,
titulo varchar(40) not null,
autor varchar(30) not null default 'Desconocido',
codigoeditorial tinyint unsigned not null,
precio decimal(5,2) unsigned,
cantidad smallint unsigned default 0,

);

create table editoriales(


codigo tinyint unsigned prmary key auto_increment,
nombre varchar(20) not null,

);

De este modo, evitamos almacenar tantas veces los nombres de las editoriales en la tabla
"libros" y guardamos el nombre en la tabla "editoriales"; para indicar la editorial de cada
libro agregamos un campo referente al código de la editorial en la tabla "libros" y en
"editoriales".

Al recuperar los datos de los libros:

select * from libros;

152
Relacionando tablas

vemos que en el campo "codigoeditorial" aparece el código, pero no sabemos el nombre


de la editorial. Para obtener los datos de cada libro, incluyendo el nombre de la editorial,
necesitamos consultar ambas tablas, traer información de las dos.

Cuando obtenemos información de más de una tabla decimos que hacemos un "join"
(unión). Veamos un ejemplo:

select * from libros


join editoriales
on libros.codigoeditorial=editoriales.codigo;

Analicemos la consulta anterior.

Indicamos el nombre de la tabla luego del "from" ("libros"), unimos esa tabla con "join" y
el nombre de la otra tabla ("editoriales"), luego especificamos la condición para enlazarlas
con "on", es decir, el campo por el cual se combinarán. "on" hace coincidir registros de las
dos tablas basándose en el valor de algún campo, en este ejemplo, los códigos de las
editoriales de ambas tablas, el campo "codigoeditorial" de "libros" y el campo "codigo" de
"editoriales" son los que enlazarán ambas tablas.

Cuando se combina (join, unión) información de varias tablas, es necesario indicar qué
registro de una tabla se combinará con qué registro de la otra tabla.

Si no especificamos por qué campo relacionamos ambas tablas, por ejemplo:

select * from libros


join editoriales;

el resultado es el producto cartesiano de ambas tablas (cada registro de la primera tabla se


combina con cada registro de la segunda tabla), un "join" sin condición "on" genera un
resultado en el que aparecen todas las combinaciones de los registros de ambas tablas. La
información no sirve en este ejemplo.

Note que en la consulta

select * from libros


join editoriales
on libros.codigoeditorial=editoriales.codigo;

al nombrar el campo usamos el nombre de la tabla también. Cuando las tablas


referenciadas tienen campos con igual nombre, esto es necesario para evitar confusiones y
ambiguedades al momento de referenciar un campo. En este ejemplo, si no especificamos

153
Relacionando tablas

"editoriales.codigo" y solamente tipeamos "codigo", MySQL no sabrá si nos referimos al


campo "codigo" de "libros" o de "editoriales".

Si omitimos la referencia a las tablas al nombrar el campo "codigo" (nombre de campo que
contienen ambas tablas):

select * from libros


join editoriales
on codigoeditorial=codigo;

aparece un mensaje de error indicando que "codigo" es ambiguo.

Entonces, si en las tablas, los campos tienen el mismo nombre, debemos especificar a cuál
tabla pertenece el campo al hacer referencia a él, para ello se antepone el nombre de la
tabla al nombre del campo, separado por un punto (.).

Entonces, se nombra la primer tabla, se coloca "join" junto al nombre de la segunda tabla
de la cual obtendremos información y se asocian los registros de ambas tablas usando un
"on" que haga coincidir los valores de un campo en común en ambas tablas, que será el
enlace.

Para simplificar la sentencia podemos usar un alias para cada tabla:

select * from libros as l


join editoriales as e
on l.codigoeditorial=e.codigo;

Cada tabla tiene un alias y se referencian los campos usando el alias correspondiente. En
este ejemplo, el uso de alias es para fines de simplificación, pero en algunas consultas es
absolutamente necesario.

En la consulta anterior vemos que el código de la editorial aparece 2 veces, desde la tabla
"libros" y "editoriales". Podemos solicitar que nos muestre algunos campos:

select titulo,autor,nombre from libros as l


join editoriales as e
on l.codigoeditorial=e.codigo;

Al presentar los campos, en este caso, no es necesario aclarar a qué tabla pertenecen
porque los campos solicitados no se repiten en ambas tablas, pero si solicitáramos el
código del libro, debemos especificar de qué tabla porque el campo "codigo" se repite en
ambas tablas ("libros" y "editoriales"):

select l.codigo,titulo,autor,nombre from libros as l

154
Relacionando tablas

join editoriales as e
on l.codigoeditorial=e.codigo;

Si obviamos la referencia a la tabla, la sentencia no se ejecuta y aparece un mensaje


indicando que el campo "codigo" es ambiguo.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones


SQL:

drop table if exists libros, editoriales;

create table libros(


codigo int unsigned primary key auto_increment,
titulo varchar(40) not null,
autor varchar(30) not null default 'Desconocido',
codigoeditorial tinyint unsigned not null,
precio decimal(5,2) unsigned,
cantidad smallint unsigned default 0,
);

create table editoriales(


codigo tinyint unsigned primary key auto_increment,
nombre varchar(20) not null,
);

insert into editoriales values(null,'Paidos');


insert into editoriales values(null,'Emece');
insert into editoriales values(null,'Planeta');
insert into editoriales values(null,'Sudamericana');

insert into libros values(null,'El señor


presidente','Asturias',3,100,200);

insert into libros values(null,'Alicia en el pais de las


maravillas','Lewis Carroll',2,33.5,100);

insert into libros values(null,'Aprenda PHP','Mario


Perez',1,55.8,50);

insert into libros values(null,'Java en 10 minutos','Juan


Lopez',1,88,150);

insert into libros values(null,'Alicia a traves del


espejo','Lewis Carroll',1,15.5,80);

insert into libros values(null,'Cervantes y el


quijote','Borges- Bioy Casares',3,25.5,300);

155
Relacionando tablas

select * from libros;

select * from libros


join editoriales
on libros.codigoeditorial=editoriales.codigo;

select * from libros


join editoriales;

-- el codigo es ambiguo
select * from libros
join editoriales
on codigoeditorial=codigo;

select * from libros as l


join editoriales as e
on l.codigoeditorial=e.codigo;

select titulo,autor,nombre from libros as l


join editoriales as e
on l.codigoeditorial=e.codigo;
select l.codigo,titulo,autor,nombre from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo;

-- el codigo es ambiguo
select codigo,titulo,autor,nombre from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo;

Clave foránea (foreign key)

Un campo que se usa para establecer un "join" (unión) con otra tabla en la cual es clave
primaria, se denomina "clave ajena o foránea".

En el ejemplo de la librería en que utilizamos las tablas "libros" y "editoriales" con los
campos:

libros: codigo (clave primaria), titulo, autor, codigoeditorial, precio, cantidad y


editoriales: codigo (clave primaria), nombre.

el campo "codigoeditorial" de "libros" es una clave foránea, se emplea para enlazar la tabla
"libros" con "editoriales" y es clave primaria en "editoriales" con el nombre "codigo".

156
Relacionando tablas

Cuando alteramos una tabla, debemos tener cuidado con las claves foráneas. Si
modificamos el tipo, longitud o atributos de una clave foránea, ésta puede quedar
inhabilitada para hacer los enlaces.

Las claves foráneas y las claves primarias deben ser del mismo tipo para poder enlazarse. Si
modificamos una, debemos modificar la otra para que los valores se correspondan.

Una clave foránea se identifica con las palabras reservadas: foreign key. La sintaxis es:

• foreign key (campo)


• foreign key (campo1, campo2) para relaciones varios a varios.

Para establecer una relación, además de indicar la(s) clave(s) foránea(s), se debe hacer la
referencia a la tabla y el campo con el que se une la llave foránea. Esto se logra con la
palabra: references. La sintaxis es:

• references nombreTablaPrincipal (campoClavePrimaria)

Ejemplo: Relación uno a varios

Ingresar a Workbench y realizar lo siguiente:

Se crea, primero, la tabla


create database librería; principal
use librería;
create table editoriales(
codigo tinyint unsigned primary key auto_increment,
nombre varchar(20) not null

);

– A continuación se define la tabla secundaria


create table libros(
codigo int unsigned primary key auto_increment,
titulo varchar(40) not null,
autor varchar(30) not null default 'Desconocido',
codigoeditorial tinyint unsigned not null,
precio decimal(5,2) unsigned,
cantidad smallint unsigned default 0,
foreign key (codigoeditorial) references editoriales
(codigo)

);
Junto a la clave foránea,
se hace la referencia a la
tabla principal
157
Relacionando tablas

insert into editoriales values(1,'Salvat');


insert into editoriales values(2,'Emece');
insert into editoriales values(15,'Planeta');
insert into editoriales values(23,'Paidos');
insert into libros values(1,'El señor
presidente ,'Asturias',1,100,10);
insert into libros values(2,'Alicia en el país de las
maravillas','Lewis Carroll',2,11.55,2);
insert into libros values(3,'Martín Fierro','José
Hernandez',15,7.12,4);

select * from libros; En las uniones, es


conveniente usar
select l.titulo,e.nombre alias
from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo;

Definir las claves foráneas, nos permite generar diagramas relacionales correctos. El
diagrama del ejemplo anterior se muestra a continuación:

158
Relacionando tablas

En Workbench, los diagramas relacionales se generan de la sigiente forma:

1) Clic en Database
2) Clic en Reverse Engineer…
3) Seguir las indicaciones del asistente

159

También podría gustarte