Intro a SQL y MySQL - Tema 10 - Funciones de cadena
En MySQL tenemos muchas funciones para manipular cadenas: calcular
su longitud, extraer un fragmento situado a la derecha, a la izquierda
o en cualquier posición, eliminar espacios finales o iniciales,
convertir a hexadecimal y a binario, etc. Vamos a comentar las más
habituales. Los ejemplos estarán aplicados directamente sobre cadenas,
pero (por supuesto) también se pueden aplicar a campos de una
tabla:
10.1. Funciones de conversión a mayúsculas/minúsculas
- LOWER o LCASE convierte una cadena a minúsculas: SELECT
LOWER('Hola'); ⇒ hola
- UPPER o UCASE convierte una cadena a mayúsculas: SELECT
UPPER('Hola'); ⇒ HOLA
10.2. Funciones de extracción de parte de la cadena
- LEFT(cadena, longitud) extrae varios caracteres del comienzo (la
parte izquierda) de la cadena: SELECT LEFT('Hola',2); ⇒ Ho
- RIGHT(cadena, longitud) extrae varios caracteres del final (la
parte derecha) de la cadena: SELECT RIGHT('Hola',2); ⇒ la
- MID(cadena, posición, longitud), SUBSTR(cadena, posición,
longitud) o SUBSTRING(cadena, posición, longitud) extrae varios
caracteres de cualquier posición de una cadena, tantos como se
indique en "longitud": SELECT SUBSTRING('Hola',2,3); ⇒ ola
(Nota: a partir MySQL 5 se permite un valor negativo en la posición,
y entonces se comienza a contar desde la derecha -el final de la
cadena-)
- CONCAT une (concatena) varias cadenas para formar una nueva:
SELECT CONCAT('Ho', 'la'); ⇒ Hola
- CONCAT_WS une (concatena) varias cadenas para formar una nueva,
usando un separador que se indique (With Separator): SELECT
CONCAT_WS('-','Ho','la','Que','tal'); ⇒ Ho-la-Que-tal
- LTRIM devuelve la cadena sin los espacios en blanco que pudiera
contener al principio (en su parte izquierda): SELECT LTRIM('
Hola'); ⇒ Hola
- RTRIM devuelve la cadena sin los espacios en blanco que pudiera
contener al final (en su parte derecha): SELECT RTRIM('Hola ');
⇒ Hola
- TRIM devuelve la cadena sin los espacios en blanco que pudiera
contener al principio ni al final: SELECT TRIM(' Hola '); ⇒
Hola (Nota: realmente, TRIM puede eliminar cualquier prefijo, no
sólo espacios; mira el manual de MySQL para más detalles)
10.3. Funciones de conversión de base numérica
- BIN convierte un número decimal a binario: SELECT BIN(10); ⇒
1010
- HEX convierte un número decimal a hexadecimal: SELECT HEX(10);
⇒ 'A' (Nota: HEX también tiene un uso alternativo menos
habitual: puede recibir una cadena, y entonces mostrará el código
ASCII en hexadecimal de sus caracteres: SELECT HEX('Hola'); ⇒
'486F6C61')
- OCT convierte un número decimal a octal: SELECT OCT(10); ⇒
12
- CONV(número,baseInicial,baseFinal) convierte de cualquier base a
cualquier base: SELECT CONV('F3',16,2); ⇒ 11110011
- UNHEX convierte una serie de números hexadecimales a una cadena
ASCII, al contrario de lo que hace HEX: SELECT UNHEX('486F6C61');
⇒ 'Hola')
10.4. Otras funciones de modificación de la cadena
- INSERT(cadena,posición,longitud,nuevaCadena) inserta en la cadena
otra cadena: SELECT INSERT('Hola', 2, 2, 'ADIOS'); ⇒
HADIOSa
- REPLACE(cadena,de,a) devuelve la cadena pero cambiando ciertas
secuencias de caracteres por otras: SELECT REPLACE('Hola', 'l',
'LLL'); ⇒ HoLLLa
- REPEAT(cadena,numero) devuelve la cadena repetida varias veces:
SELECT REPEAT(' Hola',3); ⇒ HolaHolaHola
- REVERSE(cadena) devuelve la cadena "del revés": SELECT
REVERSE('Hola'); ⇒ aloH
- SPACE(longitud) devuelve una cadena formada por varios espacios
en blanco: SELECT SPACE(3); ⇒ " "
10.5. Funciones de información sobre la cadena
- CHAR_LENGTH o CHARACTER_LENGTH devuelve la longitud de la cadena en caracteres
- LENGTH devuelve la longitud de la cadena en bytes
- BIT_LENGTH devuelve la longitud de la cadena en bits
- INSTR(cadena,subcadena) o LOCATE(subcadena,cadena,posInicial)
devuelve la posición de una subcadena dentro de la cadena: SELECT
INSTR('Hola','ol'); ⇒ 2
(Más detalles en el
apartado
12.5 del manual de referencia MySQL 5.5).
10.6. Ejercicios propuestos
- 10.1. Crea una base de datos "ejercicio10", en la que
guardaremos información sobre selecciones nacionales de baloncesto.
Para ello tendremos: una tabla "PAISES" y una tabla "JUGADORES",
unidas por una relación 1:M (cada país podrá tener muchos jugadores
y cada jugador sólo podrá formar parte -en un instante dado- de la
selección de un país). De cada país guardaremos el nombre (por
ejemplo, "España") y un código que actuará como clave primaria (por
ejemplo, "ESP). De cada jugador anotaremos código, nombre,
apellidos, posición y, como resultado de esa relación 1:M, código
de la selección a la que pertenece.
- 10.2a. Añade los países:
- ESP, España
- ARG, Argentina
- AUS, Australia
- LIT, Lituania
- 10.2b. Añade los jugadores:
- RUB, Ricky, Rubio, Base (España)
- NAV, Juan Carlos, Navarro, Alero (España)
- SCO, Luis, Scola, Ala-Pivot (Argentina)
- DEL, Carlos, Delfino, Escolta (Argentina)
- MAC, Jonas, Maciulis, Alero (Lituania)
- BOG, Andrew, Bogut, Pivot (Australia)
- 10.3. Muestra los nombres y apellidos de todos los jugadores,
en mayúsculas, ordenados por apellido y nombre.
- 10.4. Muestra el nombre y apellidos del jugador o jugadores
cuyo apellido es el más largo (formado por más letras).
- 10.5. Muestra el apellido, una coma, un espacio y después el
nombre de todos los jugadores de "España" (aparecerán datos como
"Rubio, Ricky"). Para ello, usa la función "CONCAT". Los resultados
deben aparecer como si se tratase de un campo llamado "nombreJug".
- 10.6. Muestra las 4 primeras letras de los apellidos de los
jugadores que tenemos anotados de "Argentina", ordenados de forma
descendente.
- 10.7. Muestra los nombres de todos los jugadores, reemplazando
"Ricky" por "Ricard".
- 10.8. Muestra "Don " seguido del nombre y del apellido de los
jugadores (aparecerán datos como "Don Andrew Bogut"), usando
"CONCAT" e "INSERT" para crar al vuelo un nuevo campo llamado
"nombreJug".
- 10.9. Muestra el nombre y apellidos de todos los jugadores
cuyo país contenga una N en el nombre. Debes eliminar los espacios
iniciales y finales de ambos campos, en caso de que existan.
- 10.10. Muestra al revés el apellido de los jugadores de
Australia que tenemos en nuestra base de datos.
- 10.11. Muestra una cadena formada por 10 guiones, 10 espacios
y otros 10 guiones.