🔏
Base de Datos
  • Bases de Datos
  • Modelo entidad relación
  • Modelo Relacional
  • Sistema de Gestión de Bases de Datos RelacionalMySQL
  • Funciones y operaciones en MySQL
  • Operaciones para la proyección de información MySQL
  • Relación entre tablas y manejo avanzado de los datos mediante algunas cláusulas SQL avanzadas
  • Ejercicio práctico de la aplicación Media Técnica App
Powered by GitBook
On this page
  • INTRODUCCIÓN
  • Claves foráneas y restricciones
  • Clave foránea autorreferencial
  • Sintaxis de una clave foránea en MySQL
  • Creación de llave foránea con PhpMyAdmin
  • Ejemplo en script MySQL
  • Restricción UNIQUE
  • Generar modelo relacional desde PhpMyAdmin
  • Proyección de registros (SELECT)
  • Uso de SELECT para recuperar una sola columna
  • Uso de SELECT para recuperar varias columnas
  • Uso de SELECT para recuperar todas las columnas
  • Uso de los Alias
  • Veamos el siguiente ejemplo:
  • Sentencias de control de flujo
  • CASE – WHEN
  • IF
  • IFNULL
  • Funciones para manipulación de cadenas
  • LENGTH
  • CONCAT
  • CONCAT_WS
  • UPPER Y UCASE
  • LOWER Y LCASE
  • LTRIM
  • RVERSE
  • Funciones matemáticas
  • ABS
  • CEILING Y CEIL
  • FLOOR
  • LN
  • MOD
  • POW
  • SQRT
  • FORMAT
  • Funciones para la manipulación de fechas
  • NOW
  • DATE
  • DATEDIFF
  • DATE_SUB
  • DATE_FORMAT
  • Quiero saber más …
  • Ejercicios
  • Ejercicio 1
  • Ejercicio 2
  • Ejercicio 3
  • Ejercicio 4
  • Ejercicio 5
  • Ejercicio 6
  • Ejercicio 7
  • Ejercicio 8

Was this helpful?

Operaciones para la proyección de información MySQL

Módulo 6

PreviousFunciones y operaciones en MySQLNextRelación entre tablas y manejo avanzado de los datos mediante algunas cláusulas SQL avanzadas

Last updated 4 years ago

Was this helpful?

INTRODUCCIÓN

Con la módulo de esta semana el lector tendrá la oportunidad de conocer la utilidad de algunas funciones de MySQL para la proyección de la información principalmente. De igual manera, este capitulo inicia explicando algunos aspectos para la relación de información, a través del concepto clave foránea.

Otro aspecto interesante a tocar inicialmente será la generación del modelo relacional mediante PhpMyAdmin.

Este módulo enfocara sus esfuerzos en mostrar las diferentes funciones y utilidades con las que podemos contar con MySQL para relacionar información y realzar manipulación de información, para lograr trasformaciones muy puntuales sobre esta y de esta manera lograr solucionar problemas que en la vida real se nos presentan.

Claves foráneas y restricciones

Una clave foránea o clave externa es una columna o grupo de columnas en una tabla que se vincula a una columna o grupo de columnas en otra tabla. La clave foránea impone restricciones a los datos de las tablas relacionadas, lo que permite que MySQL mantenga la integridad referencial.

Echemos un vistazo a las siguientes tablas oficina y empleado de la base de datos empresa_confecciones_limitada (base de datos que estaremos trabajando durante este módulo).

En este diagrama, una oficina puede pertenecer a uno a muchos empleados y un empleado debe tener una oficina asignada.

La relación entre oficina y empleado es de uno a muchos. Y esta relación se establece mediante la clave foránea en la tabla empleado especificada por la columna codigOficina.

La columna codigOficina de la tabla empleado se vincula a la columna codigOficina, la cual es la clave principal de la tabla oficina.

La tabla oficina se denomina tabla principal, y la tabla empleado se conoce como tabla secundaria.

Por lo general, las columnas de clave externa de la tabla secundaria a menudo se refieren a las columnas de clave principal de la tabla principal.

Una tabla puede tener más de una clave externa donde cada clave externa hace referencia a una clave primaria de las diferentes tablas principales.

Una vez que se aplica una restricción de clave externa, las columnas de clave externa de la tabla secundaria deben tener la fila correspondiente en las columnas de clave principal de la tabla principal o los valores en estas columnas de clave externa deben ser NULL.

Clave foránea autorreferencial

A veces, las tablas primaria y secundaria pueden hacer referencia a la misma tabla. En este caso, la clave externa hace referencia a la clave principal dentro de la misma tabla.

La columna jefe es una clave externa que se refiere a la columna numeroEmpleado que es la clave principal de la tabla empleado.

Esta relación permite que la tabla empleado almacene la estructura de informes entre empleados y jefes. Cada empleado informa a cero o un empleado y un empleado puede tener cero o muchos subordinados.

La clave externa de la columna jefe se conoce como clave externa recursiva o autorreferencial.

Sintaxis de una clave foránea en MySQL

Para referenciar la restricción de una llave foránea en MySQL se utiliza la expresión FOREIGN KEY. Esta restricción no aplica en MyISAM como motor de almacenamiento, debido a que no admite relaciones en una base de datos. De los motores vistos y profundizados en estos módulos, solamente InnoDB soportan lleves foráneas.

Una llave foránea puede ser creada desde un CREATE TABLE o ALTER TABLE. La sintaxis para realizarlo por SQL es la siguiente:

[CONSTRAINT constraint_name]
FOREIGN KEY [foreign_key_name] (column_name, ...)
REFERENCES parent_table(colunm_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

En esta sintaxis:

Primero, especifique el nombre de la restricción de clave externa que desea crear después de la palabra clave CONSTRAINT. Si omite el nombre de la restricción, MySQL genera automáticamente un nombre para la restricción de clave externa.

En segundo lugar, especifique una lista de columnas de claves externas separadas por comas después de las palabras claves FOREIGN KEY. El nombre de la clave externa también es opcional y se genera automáticamente si lo omite.

En tercer lugar, especifique la tabla principal seguida de una lista de columnas separadas por comas a las que hacen referencia las columnas de clave externa.

Finalmente, especifique cómo la clave externa mantiene la integridad referencial entre las tablas secundaria y primaria mediante las cláusulas ON DELETE y ON UPDATE. La palabra clave reference_option determina la acción que llevará acabo MySQL cuando los valores de las columnas claves se eliminan (ON DELETE) o actualizados (ON UPDATE).

MySQL tiene cinco opciones de referencia: CASCADE, SET NULL, NO ACTION, RESTRICT y SET DEFAULT.

  • CASCADE: si una fila de la tabla principal se elimina o actualiza, los valores de las filas coincidentes en la tabla secundaria se eliminan o actualizan automáticamente.

  • SET NULL: si una fila de la tabla principal se elimina o actualiza, los valores de la columna (o columnas) de clave externa en la tabla secundaria se establecen en NULL.

  • RESTRICT: si una fila de la tabla principal tiene una fila coincidente en la tabla secundaria, MySQL rechaza eliminar o actualizar filas en la tabla principal.

  • NO ACTION: es lo mismo que RESTRICT.

  • SET DEFAULT: es reconocido por el analizador MySQL. Sin embargo, esta acción es rechazada por las tablas que tienen configuradas el sistema de almacenamiento de InnoDB y NDB.

Si no especifica la cláusula ON DELETE y ON UPDATE, la acción predeterminada es RESTRICT.

Creación de llave foránea con PhpMyAdmin

Suponiendo que ya se tiene creada la base de datos y las tablas de esta, se puede realizar estas relaciones mediante este cliente, veamos:

1. Vamos a la sección Estructura de la tabla, donde se desea crear la llave foránea.

2. Luego nos dirigimos a la sección Vista de relaciones.

3. En esta sección se debe diligenciar la información asociada a la llave foránea, tal como se muestra a continuación y guardamos la o las restricciones ingresadas.

4. Al final obtendremos el script SQL que se generó en MySQL.

Ejemplo en script MySQL

Veamos el siguiente ejemplo. Partamos de la siguiente relación y realizando la creación durante la creación de la tabla y después de haber creado la tabla.

  • Cuando se crea la tabla, el script a ejecutar es el siguiente:

CREATE TABLE `empleado` (
  `numeroEmpleado` int(11) NOT NULL,
  `apellido` varchar(50) NOT NULL,
  `nombre` varchar(50) NOT NULL,
  `extension` varchar(10) NOT NULL,
  `correo` varchar(100) NOT NULL,
  `codigOficina` varchar(10) NOT NULL,
  `jefe` int(11) DEFAULT NULL,
  `titulo` varchar(50) NOT NULL,
  PRIMARY KEY (`numeroEmpleado`),
  KEY `jefe` (`jefe`),
  KEY `codigOficina` (`codigOficina`),
  CONSTRAINT `fk_oficina_empleado` 
  FOREIGN KEY (`codigOficina`) 
  REFERENCES `oficina` (`codigOficina`)
    ON DELETE RESTRICT 
    ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • Después de haber creado la tabla, se debe ejecutar el siguiente script:

ALTER TABLE empleado
ADD CONSTRAINT fk_oficina_empleado
FOREIGN KEY (codigOficina)
REFERENCES oficina(codigOficina)
ON DELETE RESTRICT 
ON UPDATE CASCADE

Restricción UNIQUE

A veces, desea asegurarse que los valores en una columna o un grupo de columnas sean únicos. Por ejemplo, las direcciones de correo electrónico de los usuarios de la tabla usuario o el número de teléfono de los clientes de la tabla cliente deben ser únicos. Para hacer cumplir esta regla, usa una restricción UNIQUE.

Una UNIQUE restricción es una restricción de integridad que asegura que los valores en una columna o grupo de columnas sean únicos. Una restricción UNIQUE puede ser una restricción de columna o una restricción de tabla.

Para definir una restricción UNIQUE para una columna cuando se crea una tabla , use esta sintaxis:

CREATE TABLE nombre_tabla(
    ...,
    nombre_columna tipo_dato UNIQUE,
    ...
);

Para este caso si inserta o actualiza un valor que causa duplicación en nomnbre_columna, MySQL rechaza el cambio y emite un error.

Para definir una restricción UNIQUE para dos o más columnas, utilice la siguiente sintaxis:

CREATE TABLE nombre_tabla(
   ...
   nombre_columna1 tipo_dato,
   nombre_columna2 tipo_dato,
   ...,
   UNIQUE(nombre_columna1,nombre_columna2)
);

En esta sintaxis, agrega una lista de columnas separadas por comas entre paréntesis después de la palabra clave UNIQUE. MySQL usa la combinación de valores en ambas columnas nombre_columna1 y nombre_columna2 para evaluar la unicidad.

Si define una restricción UNIQUE sin especificar un nombre, MySQL genera automáticamente un nombre para ella. Para definir una restricción UNIQUE con un nombre, use esta sintaxis:

[CONSTRAINT constraint_name]
UNIQUE(column_list) 

En esta sintaxis, especifica el nombre de la restricción UNIQUE después de la palabra clave CONSTRAINT.

Veamos el siguiente ejemplo:

CREATE TABLE proveedor (
    proveedor_id INT AUTO_INCREMENT,
    nombre VARCHAR(255) NOT NULL,
    telefono VARCHAR(15) NOT NULL UNIQUE,
    direccion VARCHAR(255) NOT NULL,
    PRIMARY KEY (proveedor_id),
    CONSTRAINT uq_nombre_direccion UNIQUE (nombre, direccion)
);

En este ejemplo, la primera restricción UNIQUE se define para la columna telefono:

telefono VARCHAR(15) NOT NULL UNIQUE

Y la segunda restricción es la combinación de las columnas de nombre y direccion:

CONSTRAINT uq_nombre_direccion UNIQUE (nombre, direccion)

Generar modelo relacional desde PhpMyAdmin

Desde muchos clientes de MySQL es posible generar el modelo relacional de las bases de datos, esto con la finalidad de tener nuestro diagrama lo mas actualizado posible, sin necesidad de invertir mucho tiempo en los posibles cambios que a podido sufrir nuestra base de datos. En PhpMyAdmin contamos con un diseñador que nos permite crear la base de datos y obtener una vista de nuestro modelo relacional.

Para explicar esta generación de este modelo tomaremos como punto de referencia Clever-Cloud, aunque también puede aplicar en el cliente de PhpMyAdmin instalado en XAMPP (es posible que en local esta extensión presente dificultades). Veamos como se genera este modelo.

1. Ingrese a la base de datos creada en Clever Cloud y nos dirigimos a la opción de PhpMyAdmin (en caso de no recordar como ingresar a Clever Cloud, se puede remitir a el módulo 5 de base de datos).

2. Luego seleccionamos la base de datos que nos asigna Clever Cloud (partimos del hecho que ya se crearon las tablas de esta base de datos).

3. Una vez seleccionada la base de datos, nos dirigimos a la opción More > Designer.

4. Organice el modelo, de tal manera que quede lo mas visible las tablas y relaciones que hay entre las tablas.

5. Diríjase al menú lateral del diseñador y seleccione la opción Export schema.

6. Seleccione el método de exportación, para efectos de este ejemplo se exportará el diagrama como SVG.

Proyección de registros (SELECT)

La declaración SQL SELECT le permite leer datos de una o más tablas. Para escribir una declaración SELECT en MySQL, siga esta sintaxis:

SELECT lista_de_campos
FROM nombre_tabla;

Veamos cada parte de la declaración.

Primero, empiece con la palabra clave SELECT. La palabra clave tiene un significado especial en MySQL. En este caso, SELECT indica a MySQL que recupere datos.

Luego, tiene espacio y luego una lista de columnas o expresiones que desea mostrar en el resultado.

Luego, tienes la palabra clave FROM, el espacio y el nombre de la tabla desde donde se van a extraer los datos.

Finalmente, tiene un punto y coma ; al final de la declaración. El punto y coma ; es el delimitador de instrucciones. Especifica el final de una declaración. Si tiene dos o más declaraciones, use el punto y coma ; para separarlas para que MySQL ejecute cada declaración individualmente.

En la declaración SELECT, SELECT y FROM son palabras clave y están escritas en mayúsculas. Básicamente, se trata solo de formatear. Las letras mayúsculas hacen que las palabras clave se destaquen en gran parte de los editores.

Dado que SQL no es un lenguaje que distingue entre mayúsculas y minúsculas, puede escribir las palabras claves en minúsculas o mayúsculas.

También es importante tener en cuenta que la palabra clave FROM está en una nueva línea. MySQL no requiere esto. Sin embargo, colocar la palabra clave FROM en una nueva línea hará que la consulta sea más fácil de leer y más simple de mantener.

Al evaluar la declaración SELECT, MySQL evalúa primero la cláusula FROM y luego la cláusula SELECT:

Uso de SELECT para recuperar una sola columna

El siguiente ejemplo usa la declaración SELECT para seleccionar el nombre de todos los clientes:

SELECT `nombreCliente` 
FROM `cliente`;

La salida de una declaración SELECT se llama resultados o conjunto de resultados, ya que es un conjunto de datos que resulta de una consulta.

Uso de SELECT para recuperar varias columnas

El siguiente ejemplo usa la declaración SELECT para obtener el nombre, apellido 1, apellido 2 y teléfono:

SELECT 
    `nombreCliente`,
    `contactoApellido`,
    `contactoApellido1`,
    `telefono`
FROM 
    `cliente`;

Aunque la tabla cliente tiene muchas columnas, la declaración SELECT solo devuelve datos de cuatro columnas.

Uso de SELECT para recuperar todas las columnas

Si desea recuperar datos de todas las columnas de la tabla cliente, puede especificar todos los nombres de columna en la cláusula SELECT o simplemente use la abreviatura de asterisco (*) como se muestra en la siguiente consulta:

SELECT *
FROM `cliente`;

La consulta devuelve datos de todas las columnas de la tabla cliente.

Nota: Seleccionar datos de esta manera no es muy recomendado cuando se esta integrando en un lenguaje como Node.js, PHP, Java, Python, etc.; debido a la alta latencia o tiempo que puede tardar la respuesta al cliente.

Uso de los Alias

Un alias es como su nombre lo dice, un apodo o forma alternativa de llamar a algo.

Estos alias en MySQL son usados para renombrar o para evitar conflictos con campos repetidos. La cláusula para un alias es AS y su sintaxis es:

SELECT nombre_columna_original AS nuevo_nombre_deseamos 
FROM nombre_tabla;

Veamos el siguiente ejemplo:

SELECT 
    `nombreCliente` AS nombre,
    `contactoApellido` AS apellido1,
    `contactoApellido1` apellido2
FROM 
    `cliente`;

También es posible solo dejar un espacio en blanco, seguido del nombre con el que queremos nombrar esta columna, tal como se observa en el ejemplo anterior.

    `contactoApellido1` apellido2

Sentencias de control de flujo

Las sentencias de control de flujo nos permiten intervenir la salida de lo que queremos proyectar, de acuerdo a una serie de condiciones. Estas sentencias las podemos ver reflejadas en varias partes de una consulta SQL, por ejemplo, un SELECT. Veamos algunas sentencias de este tipo.

CASE – WHEN

La instrucción CASE se usa para aplicar una construcción condicional compleja en MySQL. Tiene la funcionalidad de una instrucción IF-THEN-ELSE al permitirle evaluar condiciones y devolver un valor cuando se cumple la primera condición.

La sintaxis de la función CASE en MySQL es:

CASE [ expression ]

   WHEN condition_1 THEN result_1
   WHEN condition_2 THEN result_2
   ...
   WHEN condition_n THEN result_n

   ELSE result

END

Parámetros o argumentos

expression

Opcional. Es el valor que está comparando con la lista de condiciones. (es decir: condition_1, condition_2, ... condition_n)

condition_1, condition_2, ... condition_n

Evaluado en el orden indicado. Una vez que se determina que una condición es verdadera, la función CASE devolverá el resultado y no evaluará más las condiciones.

result_1, result_2, ... result_n El valor devuelto una vez que se determina que una condición es verdadera.

Nota

Si no se encuentra ninguna condición verdadera, la función CASE devolverá el valor de la cláusula ELSE.

Si se omite la cláusula ELSE y no se determina que ninguna condición sea ​​verdadera, la instrucción CASE devolverá NULL.

Veamos el siguiente ejemplo:

  • Las para la empresa de confecciones es muy importante conocer la localización de las de los productos, el cual esta correlacionado en la siguiente tabla.

Localización numérica

Nombre de la localización

1:10

Estante de cuero

1:12

Estante telas

1:18

Estante materia prima

1:24

Estante de cuerina

1:32

Estante de cintas

1:50

Estante de material variado

1:700

Estante de estampados

1:72

Estante de material desconocido

Se requiere realizar una consulta que muestre el nombre de la localización del producto.

SELECT 
    nombreProducto, 
    CASE localizacionProducto 
        WHEN "1:10" THEN "Estante de cuero" 
        WHEN "1:12" THEN "Estante telas" 
        WHEN "1:18" THEN "Estante materia prima" 
        WHEN "1:24" THEN "Estante de cuerina" 
        WHEN "1:32" THEN "Estante de cintas" 
        WHEN "1:50" THEN "Estante de material variado" 
        WHEN "1:700" THEN "Estante de estampados" 
        ELSE "Estante de material desconocido"
    END AS nombreLocalizacion
FROM `producto`

IF

La sentencia de control IF () toma tres expresiones y si la primera expresión es verdadera, ni cero ni NULL, devuelve la segunda expresión. De lo contrario, devuelve la tercera expresión.

Dependiendo del contexto en el que se use, devuelve un valor numérico o de cadena.

Sintaxis:

IF (expression, expr_true, expr_false)

Dependiendo del contexto en el que se use, devuelve un valor numérico o de cadena.

Parámetros

Nombre

Descripción

Tipo de retorno

expression

Una expresión o condición.

expr_true

Devuelve cuando la condición es VERDADERA.

Una cadena cuando expr_true es una cadena, un valor de punto flotante cuando expr_true es un valor de punto flotante y un número entero cuando expr_true es un número entero.

expr_false

Devuelve cuando la condición es FALSA.

Una cadena cuando expr_false es una cadena, un valor de punto flotante cuando expr_false es un valor de punto flotante y un entero cuando expr_false es un número entero.

Veamos algunos ejemplos:

SELECT IF(1>3,'verdadero','falso');

En la fábrica de confecciones se necesita saber cuándo un producto está agotado en inventario. Para el dueño, tener menos de 1000 elementos de un producto es la alerta para indicar que se debe aumentar el inventario.

Por esto se requiere realizar una consulta que indique cuales productos están agotados o si cuentan con inventario suficiente.

SELECT 
    nombreProducto,
    IF(cantidadEnInventario < 1000,'Agotado','Inventario suficiente') AS existenciaEnInventario
FROM 
    producto;

IFNULL

La función IFNULL () toma dos expresiones y si la primera expresión no es NULL, devuelve la primera expresión. De lo contrario, devuelve la segunda expresión.

Dependiendo del contexto en el que se use, devuelve un valor numérico o de cadena.

Sintaxis:

IFNULL (expresión1, expresión2);

Veamos algunos ejemplos:

SELECT IFNULL(0,2);
SELECT IFNULL(1,2);

En la fábrica de confecciones, el dueño desea saber si un cliente no tiene asignado el estado donde vive, por lo cual se debe construir una consulta para tal fin.

SELECT 
    nombreCliente, 
    IFNULL(estado,'No tiene estado asignado') AS estadoAsignado
FROM 
    cliente;

Funciones para manipulación de cadenas

En MySQL se cuenta con algunas funciones para la manipulación de cadenas de texto, estas funciones tienen fines muy específicos y ayudan al lector en la solución de algunas problemáticas que son muy comunes en su trabajo diario. Veamos algunas de estas funciones.

LENGTH

Retorna la longitud de la cadena enviada como argumento. Veamos algunos ejemplos:

SELECT LENGTH('Hola');

Veamos un ejemplo que permita conocer el tamaño del texto descriptivo de la tabla de la línea de producto.

SELECT 
    lp.lineaProducto, 
    LENGTH(lp.textoDescriptivo)
FROM 
    linea_producto AS lp;

CONCAT

Devuelve una cadena de texto, encadenando o uniéndonos una serie de argumentos que le pasamos a la función. Veamos algunos ejemplos.

SELECT CONCAT('Hola,',' ','como esta?');

Usemos esta función para concatenar todo el nombre del empleado.

SELECT 
    numeroEmpleado,
    CONCAT(nombre, ' ', apellido) AS nombreCompleto 
FROM 
    empleado;

CONCAT_WS

Esta función es igual a la anterior, pero tiene “ws” al final de la función, iniciales de "with separator". La diferencia con la función CONCAT es que esta función espera el primer argumento es el separador de entre los otros argumentos que se pasan. Veamos algunos ejemplos.

SELECT CONCAT_WS(', ','Juan','Pedro','Luis');

Usemos esta función para concatenar todo el nombre del cliente.

SELECT 
    numeroCliente,
    CONCAT_WS(' ', nombreCliente, contactoApellido, contactoApellido1) AS nombreCliente
FROM 
    cliente;

UPPER Y UCASE

A estas funciones se le pasa una cadena de texto y devuelve una cadena de texto con todos sus caracteres en mayúsculas. Veamos los siguientes ejemplos:

SELECT UPPER('HoLA EsTUDIAnte');
SELECT UCASE('hola estudiantes, como ESTA?');

LOWER Y LCASE

A estas funciones se le pasa una cadena de texto y devuelve una cadena de texto con todos sus caracteres en minúscula. Veamos los siguientes ejemplos:

SELECT LOWER('HOLA ESTUDIAnte');
SELECT LCASE('HOLA ESTUDIANTE');

LTRIM

Esta función se le pasa una cadena de texto y esta se encarga de eliminar los espacios del inicio a la izquierda. Veamos el siguiente ejemplo:

SELECT LTRIM('          Hola            saludos        ');

REPLACE

Esta función se encarga de buscar un texto sobre una cadena de texto y remplazar el texto encontrado por otro texto.

Sintaxis:

REPLACE(cadena, cadena_a_buscar, cadena_a_reemplazar)

Veamos el siguiente ejemplo:

SELECT REPLACE('xxx.google.com','x','w');
SELECT REPLACE(' Hola estudiantes, saludos ',' ','-');

RVERSE

La función REVERSE () invierte una cadena y devuelve otra cadena de texto. Veamos el siguiente ejemplo:

SELECT REVERSE('Hola estudiantes, saludos');

Funciones matemáticas

En MySQL también se cuenta con funciones matemáticas para dar solución a múltiples problemas de la vida cotidiana. Es importante resaltar, que por ser funciones matemáticas, se puede presentar errores con facilidad, por lo cual, estas funciones retornan NULL. Veamos algunas de estas funciones.

ABS

Retorna el valor absoluto de un número X que se le pasa a la función. Veamos algunos ejemplos:

SELECT ABS(290);
SELECT ABS(-3892);

CEILING Y CEIL

Estas funciones devuelven el entero más pequeño cuyo valor es mayor que X (valor que se le pasa a la función). El alias CEIL() fue añadido en la versión 4.0.6. El valor de retorno se convierte a BIGINT. Veamos algunos ejemplos:

SELECT CEILING(1.2);
SELECT CEIL(1.8);

FLOOR

Esta función devuelve el entero más grande inferior o igual a X (valor que se le pasa a la función). El valor de retorno se convierte a BIGINT. Veamos algunos ejemplos:

SELECT FLOOR(1.2);
SELECT FLOOR(-1.8);

LN

Devuelve el logaritmo natural de X (valor que se le pasa a la función). Veamos algunos ejemplos:

SELECT LN(2);
SELECT LN(10);

MOD

Módulo (operador % en gran parte de los lenguajes). Devuelve el resto de la división de N entre (MOD(N, M)). También es posible utilizar el operador %. Veamos algunos ejemplos:

SELECT MOD(10, 2);
SELECT 234 % 10;

POW

Esta función retorna el valor de X elevado a la potencia Y (POW(X,Y)). Veamos algunos ejemplos:

SELECT POW(2, 3);
SELECT POW(8, 2);

SQRT

Esta función devuelve la raíz cuadrada no negativa de X (número que se le pasa a la función). Veamos algunos ejemplos:

SELECT SQRT(9);
SELECT SQRT(2);

FORMAT

Formatea el número X según la plantilla '#,###,###.##', redondeando a D decimales (FROMAT(X,D)), y devuelve el resultado como una cadena. Si D es 0, el resultado no tendrá punto decimal ni parte fraccionaría. Veamos algunos ejemplos:

SELECT FORMAT(25900670.98746,2);
SELECT FORMAT(300200.746,0);

Funciones para la manipulación de fechas

Al momento de desarrollar un sistema de información el trabajo con fechas es un dolor de cabeza para los integrantes de un equipo. En ese sentido MySQL incorpora algunas funciones para la manipulación de fechas, permitiendo transformarlas y realizar operaciones complejas con ellas. Veamos algunas de estas funciones.

NOW

La función NOW() devuelve la fecha y hora actual en la zona horaria configurada como una cadena o un número, en el formato 'YYYY-MM-DD HH:MM:DD' o 'YYYYMMDDHHMMSS.uuuuuu'. El formato retornado, depende del contexto en el que se invoque dicha función, veamos:

SELECT NOW();

En este contexto se retorna una cadena de texto formateada como fecha.

SELECT NOW() + 0;

Sin embargo, en el contexto numérico como el siguiente ejemplo, la función NOW() devuelve la fecha y hora actuales como un número.

La función NOW como valor por defecto para una columna.

Puede utilizar la función NOW() para proporcionar un valor predeterminado para una columna DATETIME o TIMESTAMP. Cuando omite el valor de fecha u hora en las declaraciones INSERT y UPDATE, MySQL inserta y actualiza la fecha y hora actuales en la columna cuyo valor predeterminado es NOW(). Esto también se puede conseguir con la instrucción CURRENT_TIMESTAMP.

Veamos el siguiente ejemplo, donde se debe realizar el registro de ingreso y salida de estudiantes en una sesión de clase:

DROP TABLE IF EXISTS registro_clase;
CREATE TABLE registro_clase(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nombre_estudiante VARCHAR(255) NOT NULL,
    ingreso DATETIME NOT NULL DEFAULT NOW(), -- o CURRENT_TIMESTAMP
    observaciones TEXT NULL, 
    salida TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP
);

Ahora insertemos un registro de un estudiante que ingresa.

INSERT INTO registro_clase(nombre_estudiante,observaciones) 
VALUES('Carlos David', 'Entra sin uniforme.');

Ahora generemos la salida del estudiante.

UPDATE registro_clase 
SET observaciones = CONCAT(observaciones,'\nSale con nota en el cuaderno disciplinario.') 
WHERE id = 1;

Observe que en ninguno de los scripts SQL (INSERT y UPDATE) se insertan o modifican las fechas, si no que MySQL lo hace automáticamente de acuerdo a lo declarado en la definición de la estructura.

DATE

Extrae la fecha de la expresión de fecha o fecha y hora. Veamos algunos ejemplos:

SELECT DATE('2003-12-31 01:02:03');
SELECT DATE(NOW());

DATEDIFF

La función DATEDIFF calcula el número de días entre dos valores DATE, DATETIME o TIMESTAMP.

La sintaxis de esta función es la siguiente:

DATEDIFF(date_expression_1,date_expression_2);

La función DATEDIFF acepta dos argumentos que pueden ser cualquier valor válido de fecha o fecha y hora. Si pasa valores DATETIME o TIMESTAMP, la función DATEDIFF solo toma las partes de fecha para el cálculo e ignora las partes de tiempo.

Veamos algunos ejemplos:

SELECT DATEDIFF('2020-09-18','2020-09-08');
SELECT DATEDIFF('2020-09-08','2020-09-18');

DATE_ADD

La función DATE_ADD agrega un intervalo a un valor DATE o DATETIME. A continuación, se ilustra la sintaxis de la función DATE_ADD.

DATE_ADD(start_date, INTERVAL expr unit);

La función DATE_ADD toma dos argumentos:

  • start_date es el valor, en el cual comienza DATE o DATETIME.

  • INTERVAL expr unit es un valor de intervalo que se agregará al valor de la fecha de inicio.

Veamos algunos ejemplos:

SELECT  DATE_ADD('1999-12-31 20:59:59', INTERVAL 1 SECOND) resultado;
SELECT  DATE_ADD('2020-12-31 00:00:01', INTERVAL 1 DAY) resultado;
SELECT DATE_ADD(NOW(), INTERVAL '-1 5' DAY_HOUR) resultado;

DATE_SUB

La función DATE_SUB() resta un valor de tiempo (o un intervalo) de un valor DATE o DATETIME. Lo siguiente ilustra la función DATE_SUB():

DATE_SUB(start_date,INTERVAL expr unit)
  • start_date es el valor, en el cual comienza DATE o DATETIME.

  • INTERVAL expr unit es un valor de intervalo que se restará al valor de la fecha de inicio.

Veamos algunos ejemplos:

SELECT DATE_SUB('2017-07-04',INTERVAL 3 HOUR) resultado;
SELECT DATE_SUB(NOW(),INTERVAL 2 DAY) resultado;
SELECT DATE_SUB('2027-07-03',INTERVAL -2 DAY) resultado;

En el caso que el intervalo sea negativo, la función DATE_SUB se comporta como DATE_ADD.

DATE_FORMAT

Esta función permite formatear una fecha que se envíe en un formato y pueda ser visualizada en otro de los formatos permitidos, vemos su sintaxis:

DATE_FORMAT(date,format)

La función DATE_FORMAT acepta dos argumentos:

  • date: es un valor de fecha válido que desea formatear.

  • format: es una cadena de formato que consta de especificadores predefinidos. Cada especificador está precedido por un carácter de porcentaje (%). Veamos esta tabla de especificadores:

Especificador

Sentido

%a

Nombre del día de la semana abreviado de tres caracteres, p. Ej., lunes, martes, miércoles, etc.

%b

Nombre del mes abreviado de tres caracteres, por ejemplo, enero, febrero, marzo, etc.

%c

Mes en numérico, p. Ej., 1, 2, 3… 12

%D

Día del mes con sufijo en inglés, por ejemplo, 0, 1, 2, etc.

%d

Día del mes con cero a la izquierda si es 1 número, por ejemplo, 00, 01,02,… 31

%e

Día del mes sin cero a la izquierda, p. Ej., 1,2,… 31

%f

Microsegundos en el rango de 000000..999999

%H

Hora en formato de 24 horas con cero a la izquierda, por ejemplo, 00..23

%h

Hora en formato de 12 horas con cero a la izquierda, por ejemplo, 01, 02… 12

%I

Igual que% h

%i

Minutos con cero a la izquierda, por ejemplo, 00, 01,… 59

%j

Día del año con cero a la izquierda, p. Ej., 001,002,… 366

%k

Hora en formato de 24 horas sin cero a la izquierda, por ejemplo, 0,1,2… 23

%l

Hora en formato de 12 horas sin cero a la izquierda, p. Ej., 1,2… 12

%M

Nombre del mes completo, por ejemplo, enero, febrero,… diciembre

%m

Nombre del mes con cero a la izquierda, por ejemplo, 00,01,02,… 12

%p

AM o PM, dependiendo de otros especificadores de tiempo

%r

Hora en formato de 12 horas hh: mm: ss AM o PM

%S

Segundos con cero a la izquierda 00,01,… 59

%s

Igual que% S

%T

Hora en formato de 24 horas hh: mm: ss

%U

Número de semana con cero a la izquierda cuando el primer día de la semana es domingo, por ejemplo, 00,01,02… 53

%u

Número de semana con cero a la izquierda cuando el primer día de la semana es el lunes, por ejemplo, 00,01,02… 53

%V

Lo mismo que tu; se usa con% X

%v

Lo mismo que tu; se usa con% x

%W

Nombre completo del día de la semana, p. Ej., Domingo, lunes,…, sábado

%w

Día de la semana en número (0 = domingo, 1 = lunes, etc.)

%X

Año de la semana en cuatro dígitos donde el primer día de la semana es el domingo; usado a menudo con% V

%x

Año de la semana, donde el primer día de la semana es el lunes, cuatro dígitos; usado con% v

%Y

Año de cuatro dígitos, por ejemplo, 2000 y 2001.

%y

Año de dos dígitos, por ejemplo, 10,11 y 12.

%%

Agregar carácter de porcentaje (%) a la salida

Veamos algunos ejemplos:

  • Si desea lograr que los meses y días de la semana aparezcan en español, tenga en cuenta este ejemplo:

SET lc_time_names = 'es_ES';
SELECT DATE_FORMAT("2010-01-01",'%d - %b - %Y') AS fecha;
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') AS fecha;

Quiero saber más …

Ejercicios

Ejercicio 1

Tome como referencia la base de datos de la empresa de confecciones (tratada en este módulo). El supervisor de recurso requiere que se adicione una nueva tabla, que permita saber el estado de los empleados, los estados que se manejan son: Active, Inactive, Suspended, Disabled y Fired.

  • Cree una tabla de estados para los empleados.

  • Adicione la llave foránea (tenga en cuenta las restricciones) en la tabla de empleado, donde el valor por defecto es Active.

  • Entregue la evidencia de los scripts ejecutados y pantallazo de las tablas creadas en la base de datos.

Ejercicio 2

Genere los modelos relaciones mediante PhpMyAdmin de dos bases de datos de las cuales a trabajados en los módulos de base de datos (No se permite el modelo de la empresa de confecciones tratada en este módulo).

Ejercicio 3

Diseñe 2 consultar con CASE – WHEN y 2 consultas con IF, donde demuestre el uso de estas dos estructuras de control de flujo y sobre estas 4 consultas demuestre el uso de los ALIAS. Aplique dichas consultas en sobre tablas del PPI.

Ejercicio 4

Se tienen las siguientes cadenas de texto

  • "Lavan esa base naval"

  • “LAVAN ESAB ASE NAVAL”

Diseñe una consulta que indique si estas dos palabras son palíndromas o no son palíndromas.

Ejercicio 5

Desarrolle una consulta que me indique si un número (el número va dentro de la consulta, no necesita ser una variable) es palíndromo o no.

Ejercicio 6

En la base de datos de la empresa de confecciones (tratada en este módulo), existe la tabla de pedido; se requiere saber cuántos días han transcurrido entre la fecha límite de entrega (fechaLimitEntrega) y la fecha de envío (fechaEnvio), asegure que el pedido se encuentre en estado Shipped. Diseñe una consulta que permita obtener este dato.

Ejercicio 7

La tabla abordada en el ejercicio anterior (pedido), se requiere ver las fechas en los siguientes formatos.

fechaOrden

'%Y-%m-%d'

fechaLimitEntrega

'%a %D %b %Y'

fechaEnvio

'%W %D %M %Y'

Ejercicio 8

Investigue una función diferente a cada uno de los temas tratados en este módulo:

  • Función para para manipular cadenas.

  • Función matemática.

  • Función para manipulación de fechas.

7. Con esto ya tendremos nuestro modelo exportado. En el siguiente enlace se puede apreciar el modelo descargado:

Para el resto del módulo se usará la siguiente la base de datos empresa_confecciones_limitada, la cual cuenta con datos de prueba para realizar consultas y operaciones sobre estos. A continuación, se deja el modelo relacional y el link donde se puede descargar el script:

https://github.com/devoscarmesa/base_datos_semana_6/blob/master/modelo_relacional_colegio_la_trinidad.svg
https://github.com/devoscarmesa/base_datos_semana_6/blob/master/empresa_confecciones_limitada.sql
https://www.mysql.com/
https://www.clever-cloud.com/en/
https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html
https://dev.mysql.com/doc/refman/8.0/en/select.html
https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html
https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html
https://github.com/devoscarmesa/base_datos_semana_6
Como en este ejemplo el primer argumento es cero y no NULL, devuelve el primer argumento, el cual es cero.
En este caso también devuelve el primer argumento, es decir 1, ya que no es NULL.
En este caso se adiciona -1 día a la fecha actual y se adicionan 5 horas.