10 - Funciones de cadena
SQL y MySQL
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.