febrero 23, 2018

Más ejercicios resueltos de MySQL: Combinando funciones

Introducción

Esta es la tercera parte de unos posts que vengo escribiendo sobre ejercicios propuestos de MySQL. Ahora veremos cómo combinar algunas funciones que vimos en los otros tutoriales. Son pocos, pero al principio son difíciles.

Ejercicios con solución

Tabla

Recordemos que vamos a estar utilizando esta tabla para todos los ejercicios:

Nota: no es la misma tabla que antes, ya que a ésta la hemos modificado de tal manera que a algunos usuarios se les asignó un segundo nombre, mismo que será de utilidad para los ejercicios.

Una vez dicho eso, vamos allá.

Listar el primer nombre de todos los usuarios

Seleccionar el primer nombre de los usuarios. En caso de que tengan sólo un nombre lo seleccionamos. En caso de que tengan dos, seleccionamos el primero. Casos de uso:

JOSE RAÚL => JOSE

OSCAR => OSCAR

Solución

Utilizamos INSTR, que devuelve la posición que tiene una subcadena dentro de una cadena. Recordemos que si dicha subcadena no se encuentra, el resultado al llamar la función es 0. Sabiendo esto, utilizamos IF para ver si la posición es 0.

Si la posición es 0, significa que no había espacios; es decir, que la persona sólo tiene un nombre. En caso de que no sea 0, cortamos la cadena con LEFT.

Listar el segundo nombre de los usuarios, y listar el primero en caso de que no lo tengan

Ahora hagamos lo contrario si así se le puede llamar. Listar el segundo nombre del usuario en caso de que éste tenga, y si no, pues listamos sólo el primero. Los casos de uso:

JOSE RAÚL => RAÚL

OSCAR => OSCAR

PD: ya sé que JOSÉ lleva acento pero así estaba en la base de datos y me dio pereza arreglarlo; además, no afecta.

Rápidamente nuestra mente nos traicionará y dirá: cambia sólo LEFT por RIGHT en la consulta anterior, y listo.

Pero no, no es así. Esto requiere un poco más de concentración. Si sólo cortamos con RIGHT desde donde está el espacio, cortará la cadena “invertida” y nos dará un nombre como “E RAÚL” (suponiendo que es JOSE RAÚL).

Recordemos que LEFT funcionó porque comienza a contar caracteres al igual que INSTR. Es decir, ambos cuentan desde la izquierda. Así que si usamos el mismo índice para ambos todo irá bien. En cambio, RIGHT comienza a contar desde la derecha.

La solución es simple, utilizamos RIGHT pero lo combinamos con CHAR_LENGTH para que reste la posición del índice.

Queda así:

Otra solución

La solución que utiliza RIGHT con CHAR_LENGTH fue la que se me ocurrió a mí, pero siempre hay muchas formas de hacer las cosas. Un amigo lo hizo con MID y a mi parecer quedó más elegante. Aquí dejo la consulta:

Listar los nombres de los usuarios que comiencen con una letra vocal

Para esto utilizamos LIKE y el comodín %, dicho comodín quiere decir “cualquier cosa” así que con que comiencen con A, E, I, O, U y terminen con lo que sea estarán bien.

Listar los nombres de los usuarios que finalicen con una letra vocal

Utilizamos de nuevo el comodín % pero ahora al revés, de manera que al principio tengan cualquier cosa pero que siempre terminen con alguna vocal.

Listar los nombres de los usuarios que tengan la letra A u O intermedias

Ahora utilizamos el comodín pero 2 veces, así: %%. De esta forma indicamos que pueden tener lo que sea a la izquierda así como a la derecha, mientras tengan la letra mencionada en alguna parte del centro.

Listar los nombres de los usuarios que no utilicen correo electrónico de Microsoft (Outlook, Hotmail, live)

Para terminar, usamos un NOT combinado con LIKE.  Los utilizamos 3 veces para descartar opciones de outlook, hotmail  y live.

Conclusión

Con esos ejercicios terminamos hoy.

Aquí hay más:

Ejercicios resueltos de consultas con MySQL

Ejercicios resueltos con MySQL: Funciones de cadena, UPDATE y DELETE