MYSQL. EDICIÓN REVISADA Y ACTUALIZADA 2009

MYSQL. EDICIÓN REVISADA Y ACTUALIZADA 2009

DUBOIS, PAUL

69,80 €
IVA incluido
Editorial:
ANAYA MULTIMEDIA, S.A.
Año de edición:
2009
ISBN:
978-84-415-2551-1
Páginas:
928
Encuadernación:
Otros
Colección:
LA BIBLIA

Disponibilidad:

  • Calle Doce de OctubreConsulte disponibilidad
  • Calle Valeriano MirandaConsulte disponibilidad

Introducción

Por qué seleccionar MySQL

Si ya tiene otro RDBMS

Herramientas proporcionadas con MySQL

Objetivos del libro

Estructura del libro

Parte I: Uso general de MySQL

Parte II: Utilizar interfaces de programación MySQL

Parte III: Administración de MySQL

Parte IV: Apéndices

Cómo leer este libro

Versiones de software analizadas en el libro

Convenciones

Contenido extra

Recursos adicionales





Parte I. Uso generalde MySQL



1. Primeros pasos con MySQL

Cómo puede ayudarle MySQL

Base de datos de ejemplo

La U.S. Historical League

El proyecto de las calificaciones

Aplicación de la base de datos de ejemplo

Terminología básica de bases de datos

Terminología estructural

Terminología del lenguaje de consultas

Terminología arquitectónica de MySQL

Curso práctico de MySQL

Obtener la distribución de la base de datos de ejemplo

Requisitos previos

Establecer y terminar conexiones al servidor MySQL

Ejecutar instrucciones SQL

Crear una base de datos

Crear tablas

Tablas para la organización U.S. Historical League

Añadir nuevas filas

Añadir filas con INSERT

Añadir nuevas filas desde un archivo

Restablecer la base de datos sampdb a un estado conocido

Recuperar información

Especificar criterios de recuperación

El valor NULL

Ordenar los resultados de una consulta

Limitar los resultados de una consulta

Calcular y asignar nombre a valores de columna de un resultado

Trabajar con fechas

Comparar patrones

Permitir y utilizar variables definidas por el usuario

Generar resúmenes

Recuperar información de varias tablas

Borrar o actualizar filas existentes

Consejos para interactuar con mysql

Simplificar el proceso de conexión

Usar un archivo de opciones

Utilizar el historial de la utilidad de línea de comandos

Utilizar alias y secuencias de comandos

Ejecutar instrucciones con mayor facilidad

Utilizar el editor de líneas de entrada de mysql

Utilizar cortar y pegar para ejecutar instrucciones

Utilizar mysql para ejecutar archivos de secuencias de comandos

A continuación



2. Utilizar SQL para administrar datos

El modo SQL del servidor

Sintaxis de identificadores MySQL y reglas de nomenclatura

Uso de mayúsculas y minúsculas en instrucciones SQL

Conjuntos de caracteres

Especificar conjuntos de caracteres

Determinar la disponibilidad y configuración de conjuntos de caracteres

Compatibilidad con Unicode

Compatibilidad de Unicode antes de MySQL 6.0

Compatibilidad de Unicode en MySQL 6.0 y posteriores

Seleccionar, crear, eliminar y modificar bases de datos

Seleccionar bases de datos

Crear bases de datos

Eliminar bases de datos

Modificar bases de datos

Crear, eliminar, indexar y modificar tablas

Características de motores de almacenamiento

Comprobar los motores de almacenamiento disponibles

Representar tablas en disco

El motor de almacenamiento MyISAM

El motor de almacenamiento MERGE

El motor de almacenamiento MEMORY

El motor de almacenamiento InnoDB

El motor de almacenamiento Falcon

El motor de almacenamiento FEDERATED

El motor de almacenamiento NDB

Otros motores de almacenamiento

Características de portabilidad de los motores de almacenamiento

Crear tablas

Opciones de tabla

Crear tablas provisionales

Tablas temporales

Crear una tabla a partir de otras tablas o resultados de consultas

Usar tablas MERGE

Usar tablas particionadas

Usar tablas FEDERATED

Eliminar tablas

Indexar tablas

Características de índices de motores de almacenamiento

Crear índices

Eliminar índices

Modificar la estructura de tablas

Obtener metadatos de base de datos

Obtener metadatos con SHOW

Obtener metadatos con INFORMATION_SCHEMA

Obtener metadatos desde la línea de comandos

Recuperaciones de varias tablas con combinaciones

Combinaciones internas

Cualificar referencias a columnas de tablas combinadas

Combinaciones externas por la izquierda o la derecha

Realizar recuperaciones de varias tablas con subconsultas

Subconsultas con operadores de comparación relativos

IN y NOT IN en subconsultas

Subconsultas ALL, ANY y SOME

Subconsultas EXISTS y NOT EXISTS

Subconsultas correlativas

Subconsultas en la cláusula FROM

Recuperar subconsultas como combinaciones

Rescribir subconsultas que seleccionan valores que coinciden

Rescribir subconsultas que seleccionan valores que no coinciden

Recuperar varias tablas con UNION

Utilizar vistas

Eliminar y actualizar en varias tablas

Realizar transacciones

Utilizar transacciones para garantizar la ejecución de instrucciones

Utilizar puntos de recuperación de transacciones

Aislamiento de transacciones

Enfoques no transaccionales a problemas transaccionales

Claves secundarias e integridad referencial

Crear y utilizar claves secundarias

Vivir sin claves secundarias

Utilizar búsquedas FULLTEXT

Búsquedas FULLTEXT de lenguaje natural

Búsquedas FULLTEXT en modo Booleano

Búsquedas FULLTEXT de expansión de consultas

Configurar el motor de búsqueda FULLTEXT



3. Tipos de datos

Categorías de valores de datos

Valores numéricos

Números de valor exacto y aproximado

Valores de campo de bits

Valores de cadena

Tipos de cadenas y conjuntos de caracteres admitidos

Variables del sistema relacionadas con conjuntos de caracteres

Valores de fecha y hora (temporales)

Valores espaciales

Valores Booleanos

El valor NULL

Tipos de datos de MySQL

Presentación de los tipos de datos

Especificar tipos de columna en definiciones de tabla

Especificar valores predeterminados de columna

Tipos de datos numéricos

Tipos de datos numéricos de valor exacto

Tipos de datos numéricos de valor aproximado

El tipo de datos BIT

Atributos de tipos de datos numéricos

Seleccionar tipos de datos numéricos

Tipos de datos de cadena

Los tipos de datos CHAR y VARCHAR

Los tipos datos BINARY y VARBINARY

Tipos de datos BLOB y TEXT

Tipos de datos ENUM y SET

Atributos de tipos de datos de cadena

Seleccionar tipos de datos de cadena

Tipos de datos de fecha y hora

Tipos de datos DATE, TIME y DATETIME

El tipo de datos TIMESTAMP

El tipo de datos YEAR

Atributos de los tipos de datos de fecha y hora

Trabajar con valores de fecha y hora

Interpretar valores de año ambiguos

Tipos de datos espaciales

Procesar valores de datos incorrectos

Trabajar con secuencias

Propiedades generales de AUTO_INCREMENT

Propiedades AUTO_INCREMENT específicas de motores de almacenamiento

AUTO_INCREMENT para tablas MyISAM

AUTO_INCREMENT para tablas MEMORY

AUTO_INCREMENT para tablas InnoDB

Problemas con columnas AUTO_INCREMENT

Consejos para trabajar con columnas AUTO_INCREMENT

Añadir una columna de números secuenciales a una tabla

Modificar la secuencia de una columna existente

Generar secuencias sin AUTO_INCREMENT

Evaluar expresiones y convertir tipos

Escribir expresiones

Tipos de operadores

Precedencia de operadores

Valores NULL en expresiones

Convertir tipos

Reglas de interpretación de fechas y horas

Probar y forzar la conversión de tipos

Seleccionar tipos de datos

Tipos de valores que puede almacenar una columna

Intervalo de los valores

Interrelación entre los problemas de selección de tipos de datos



4. Programas almacenados

Instrucciones compuestas y delimitadores de instrucciones

Funciones y procedimientos almacenados

Privilegios de funciones y procedimientos almacenados

Tipos de parámetros de procedimientos almacenados

Desencadenadores

Eventos

Seguridad en vistas y programas almacenados



5. Optimizar consultas

Utilizar índices

Ventajas de la indexación

Inconvenientes de los índices

Seleccionar índices

El optimizador de consultas de MySQL

Funcionamiento del optimizador

Utilizar EXPLAIN para comprobar el funcionamiento del optimizador

Seleccionar tipos de datos para consultas eficaces

Carga eficaz de datos

Problemas de programación y bloqueo

Cambiar las prioridades de programación de instrucciones

Utilizar inserciones retrasadas

Utilizar inserciones concurrentes

Niveles de bloqueo y concurrencia

Optimizaciones de nivel administrativo

Utilizar cachés de claves MyISAM

Utilizar la caché de consultas

Optimizaciones de hardware





Parte II. Utilizar interfaces de programación MySQL



6. Introducción a la programación MySQL

Crear programas MySQL propios

API disponibles para MySQL

El API C

El API Perl DBI

El API PHP

Seleccionar un API

Entorno de ejecución

Rendimiento

Lenguajes compilados frente a lenguajes interpretados

Versiones independientes frente a versiones de módulo de los intérpretes del lenguaje

Tiempo de desarrollo

Portabilidad



7. Diseñar programas MySQL con C

Compilar y vincular programas cliente

Conectarse al servidor

Procesar errores y opciones de comandos

Comprobar errores

Obtener parámetros de conexión en el tiempo de ejecución

Acceder a contenidos de archivos de opciones

Procesar argumentos de línea de comandos

Incorporar procesamiento de opciones a un programa cliente MySQL

Procesar instrucciones SQL

Procesar instrucciones que modifican filas

Procesar instrucciones que devuelven un conjunto de resultados

Un procesador de instrucción de carácter general

Enfoques alternativos al procesamiento de instrucciones

mysql_store_result() frente a mysql_use_result()

Utilizar metadatos de conjuntos de resultados

Código de caracteres especiales y datos binarios

Trabajar con cadenas que contienen caracteres especiales

Trabajar con datos binarios

Programa interactivo de ejecución de instrucciones

Crear clientes con compatibilidad SSL

Utilizar la biblioteca de servidor incrustada

Escribir una aplicación de servidor incrustado

Generar el binario ejecutable de la aplicación

Utilizar ejecución de varias instrucciones

Utilizar instrucciones preparadas del lado del servidor



8. Crear programas MySQL con Perl DBI

Características de las secuencias de comandos Perl

Presentación de Perl DBI

Tipos de datos DBI

Una sencilla secuencia de comandos DBI

Solucionar errores

Procesar instrucciones que modifican filas

Procesar instrucciones que devuelven un conjunto de resultados

Crear bucles de recuperación de filas

Determinar el número de filas devueltas por una instrucción

Obtener resultados de una sola fila

Trabajar con conjuntos de resultados completos

Comprobar valores NULL

Delimitar caracteres especiales en cadenas de instrucciones

Marcadores de posición e instrucciones preparadas

Vincular resultados de consulta a variables de secuencias de comandos

Especificar parámetros de conexión

Depuración

Depurar con instrucciones de impresión

Depuración con seguimiento

Utilizar metadatos de conjuntos de resultados

Realizar transacciones

DBI en acción

Generar el directorio de la Historical League

Generar la lista de miembros en texto sencillo

Generar el directorio RTF

Enviar avisos de renovación de suscripciones

Editar entradas de la Historical League

Buscar miembros de la Historical League con intereses comunes

Mostrar en línea el directorio de la Historical League

Utilizar DBI en aplicaciones Web

Configurar Apache para secuencias de comandos CGI

Breve compendio de CGI.pm

Comprobar parámetros de entrada Web

Generar resultados Web

Escapar texto HTML y de URL

Crear páginas multifunción

Conectarse al servidor MySQL desde secuencias de comandos Web

Navegador de base de datos basado en la Web

Buscador de calificaciones

Buscar intereses afines en la Historical League

Realizar búsquedas con comparación de patrones

Realizar búsquedas con un índice FULLTEXT



9. Crear programas MySQL con PHP

Presentación de PHP

Una sencilla secuencia de comandos PHP

Utilizar archivos de la biblioteca PHP para encapsular código

Una sencilla página de recuperación de datos

Procesar resultados de instrucciones

Procesar instrucciones que modifican filas

Procesar instrucciones que devuelven un conjunto de resultados

Probar valores NULL en resultados de consultas

Utilizar instrucciones preparadas

Utilizar marcadores de posición para controlar problemas de delimitación de datos

Controlar errores

PHP en acción

Aplicación de introducción de calificaciones en línea

Obtener entradas Web en PHP

Mostrar e introducir calificaciones

Crear un cuestionario interactivo en línea

Editar en línea entradas de miembros de la Historical League





Parte III. Administración de MySQL



10. Introducción a la administración con MySQL

Componentes de MySQL

Administración general de MySQL

Control de acceso y seguridad

Mantenimiento de bases de datos, copias de seguridad y duplicación



11. El directorio de datos de MySQL

Ubicación del directorio de datos

Estructura del directorio de datos

Acceso a datos desde el servidor MySQL

Representar bases de datos en el sistema de archivos

Representar tablas en el sistema de archivos

Representar vistas y desencadenadores en el sistema de archivos

Asignar instrucciones SQL a operaciones de archivos de tabla

Restricciones del sistema operativo para los nombres de objetos de base de datos

Factores que afectan al tamaño máximo de las tablas

Implicaciones de la estructura del directorio de datos para el rendimiento del sistema

Archivos de estado y registro de MySQL

El archivo de ID de proceso

Los registros MySQL

Reasignar los contenidos del directorio de datos

Métodos de reasignación

Precauciones de reasignación

Evaluar el efecto de la reasignación

Reasignar el directorio de datos completo

Reasignar bases de datos concretas

Reasignar tablas

Reasignar el espacio de tablas compartido InnoDB

Reasignar archivos de registro y estado



12. Administración general de MySQL

Proteger una nueva instalación de MySQL

Crear contraseñas para las cuentas MySQL iniciales

Crear contraseñas para otro servidor

Iniciar y apagar el servidor MySQL

Ejecutar el servidor MySQL en Unix

Ejecutar el servidor con una cuenta de inicio de sesión sin privilegios

Iniciar el servidor en Unix

Ejecutar el servidor MySQL en Windows

Ejecutar el servidor manualmente en Windows

Ejecutar el servidor como servicio de Windows

Especificar opciones de inicio del servidor

Detener el servidor

Controlar el servidor cuando no pueda conectarse

Controlar cómo se escuchan conexiones en el servidor

Administrar cuentas de usuario de MySQL

Administración de cuentas MySQL de nivel superior

Especificar nombres de cuentas

Especificar el nombre de host local en nombres de cuentas

Conceder privilegios

Definir los privilegios de una cuenta

Utilizar el privilegio USAGE

Exigir a una cuenta el uso de conexiones seguras

Permitir la administración de privilegios en una cuenta

Limitar el consumo de recursos de una cuenta

Mostrar privilegios de cuentas

Revocar privilegios y eliminar usuarios

Cambiar contraseñas o restablecer contraseñas perdidas

Mantener registros

El registro de errores

El registro de errores en Unix

El registro de errores en Windows

El registro general de consultas

El registro de consultas lentas

El registro binario y el archivo de índice del registro binario

El registro de relevo y el archivo de registros de relevo

Usar tablas de registro

Administrar registros

Rotar archivos de registro con nombres fijos

Caducidad de archivos de registro binario y de registro de relevo

Automatizar el procedimiento de caducidad de registros

Caducidad o rotación de tablas de registro

Ajustar el servidor

Comprobar y establecer valores de variables del sistema

Comprobar valores de variables del sistema

Establecer variables del sistema al iniciar el servidor

Establecer variables del sistema en tiempo de ejecución

Variables de sistema de propósito general

Comprobar valores de variable de estado

Configurar motores de almacenamiento

Seleccionar los motores de almacenamiento compatibles con un servidor

Configurar el motor de almacenamiento MyISAM

Configurar el motor de almacenamiento InnoDB

Configurar el espacio de tablas InnoDB

Volver a configurar el espacio de tablas compartido

Variables del motor de almacenamiento InnoDB

Configurar el motor de almacenamiento Falcon

Habilitar y deshabilitar la función LOCAL de LOAD DATA

Problemas de internacionalización y localización

Configurar zonas horarias

Seleccionar el idioma de los mensajes de error

Configurar compatibilidad con conjuntos de caracteres

Ejecutar varios servidores

Problemas del uso de varios servidores

Configurar y compilar diferentes servidores

Estrategias para especificar opciones de inicio

Utilizar mysqld_multi para administrar servidores

Ejecutar varios servidores en Windows

Actualizar MySQL



13. Control de acceso y seguridad

Seguridad interna: evitar accesos no autorizados al sistema de archivos

Apropiarse de datos

Proteger su instalación MySQL

Proteger el archivo de socket de Unix

Proteger archivos de opciones

Seguridad externa: evitar accesos de red no autorizados

Estructura y contenidos de las tablas de permisos de MySQL

Columnas de ámbito de acceso

Columnas de privilegios de las tablas de permisos

Privilegios administrativos

Privilegios de bases de datos y tablas

Representación de los privilegios en las tablas de permisos

Columnas relacionadas con SSL de las tablas de permisos

Columnas de administración de recursos de las tablas de permisos

Controlar el acceso de clientes

Contenidos de columnas de ámbito

Verificar acceso de instrucciones

Orden de comparación de las columnas de ámbito

Puzzle de privilegios

Riesgos que evitar en tablas de permisos

Establecer conexiones seguras



14. Mantenimiento de bases de datos, copias de seguridad y duplicación

Principios de mantenimiento preventivo

Mantenimiento de bases de datos con el servidor en ejecución

Bloquear tablas concretas para acceso de sólo lectura o de lectura/escritura

Bloquear una tabla para acceso de sólo lectura

Bloquear una tabla para acceso de lectura/escritura

Bloquear todas las bases de datos para acceso de sólo lectura

Mantenimiento preventivo general

Utilizar las funciones de recuperación automática del servidor

Programar el mantenimiento preventivo

Realizar copias de seguridad

Crear copias de seguridad en texto con mysqldump

Crear copias de seguridad binarias

Crear una copia de seguridad binaria completa

Crear una copia de seguridad binaria parcial

Crear copias de seguridad con mysqlhotcopy

Crear copias de seguridad de tablas InnoDB o Falcon

Copiar bases de datos a otro servidor

Copiar bases de datos con un archivo de copia de seguridad

Copiar bases de datos entre servidores

Comprobar y reparar tablas de bases de datos

Utilizar el servidor para comprobar y reparar tablas

Comprobar tablas con CHECK TABLE

Reparar tablas con REPAIR TABLE

Utilizar mysqlcheck para comprobar y reparar tablas

Utilizar myisamchk para comprobar y reparar tablas

Comprobar tablas con myisamchk

Reparar tablas con myisamchk

Aumentar la velocidad de ejecución de myisamchk

Utilizar copias de seguridad para recuperar datos

Recuperar bases de datos

Recuperar tablas concretas

Volver a ejecutar instrucciones en archivos de registro binario

Problemas de recuperación automática de InnoDB

Configurar servidores de duplicación

Funcionamiento de la duplicación

Establecer una relación de duplicación

Formatos de registro binario

Utilizar un servidor esclavo de duplicación para realizar copias de seguridad





Parte IV. Apéndices



Apéndice A. Obtener e instalar software

Obtener la distribución sampdb

Obtener MySQL y software relacionado

Seleccionar una versión de MySQL

Instalar MySQL en Unix

Crear una cuenta de inicio de sesión para el usuario MySQL

Obtener e instalar una distribución MySQL en Unix

Instalar una distribución binaria en archivo tar

Instalar una distribución RPM

Instalar una distribución de código fuente

Pasos posteriores a la instalación

Configurar la variable de entorno PATH

Inicializar el directorio de datos y las tablas de permisos

Iniciar el servidor

Instalar o actualizar tablas adicionales del sistema

Instalar compatibilidad Perl DBI en Unix

Instalar Apache y PHP en Unix

Instalar MySQL en Windows

Instalar compatibilidad Perl DBI en Windows

Instalar Apache y PHP en Windows



Apéndice B. Tipos de datos

Tipos numéricos

Tipos enteros

Tipos de coma fija

Tipos de coma flotante

El tipo BIT

Tipos de cadena

Tipos de cadena binarios

Tipos de cadena no binarios

Tipos ENUM y SET

Tipos de fecha y hora

Tipos espaciales



Apéndice C. Operadores y funciones

Operadores

Preferencia de operadores

Operadores de agrupación

Operadores aritméticos

Operadores de comparación

Operadores de bits

Operadores lógicos

Operadores de conversión

Operadores de comparación de patrones

Funciones

Funciones de comparación

Funciones de conversión

Funciones numéricas

Funciones de cadena

Funciones de fecha y hora

Funciones de resumen

Funciones de seguridad y compresión

Funciones de bloqueo

Funciones espaciales

Funciones de conversión de formato de valores espaciales

Funciones de propiedades espaciales

Funciones de relaciones espaciales

Funciones XML

Otras funciones



Apéndice D. Variables del sistema, de estado y de usuario

Variables del sistema

Variable del sistema de sesión

Variables de estado

Variables de estado de InnoDB

Variables de estado de la caché de consultas

Variables de estado SSL

Variables definidas por el usuario



Índice alfabético

Si lo que está buscando es un sistema de administración de bases de datos gratuita o de bajo coste, sin duda MySQL es la mejor elección, ya que se compone de unas características muy atractivas: gran velocidad, facilidad de uso, compatibilidad con el lenguaje de consultas, prestaciones, conectividad y seguridad, portabilidad, tamaño reducido, disponibilidad y coste, distribución y código fuente abiertos.



Este libro es la mejor herramienta con la que dominará MySQL de forma eficaz y con la que conseguirá aumentar la productividad de su trabajo. Aprenderá, entre otros aspectos, a generar páginas Web dinámicas creadas con Perl y PHP, crear cuentas de usuario, realizar copias de seguridad de bases de datos y garantizar la seguridad de los sitios.

Artículos relacionados

  • SIEMPRE ON
    CELLAN-JONES, RORY
    Vivimos en una época en la que miles de millones de personas tienen acceso a una tecnología increíblemente potente. La herramienta más extraordinaria que se ha inventado en el último siglo, el smartphone, ha generado cambios radicales en nuestra forma de vivir y trabajar y, a diferencia de tecnologías anteriores, está en manos de casi todo el mundo. Junto con el auge de las red...

    28,95 €

  • SEGURIDAD DE EQUIPOS INFORMÁTICOS
    El libro constituye una guía completa para aquellos usuarios que quieren proteger su información personal, su privacidad y su seguridad en línea. Con esta obra aprenderá a proteger su información y estar preparados para actuar en caso de una violación de seguridad. Todo el contenido está redactado de forma clara y didáctica, para que sea accesible por cualquier usuario, con o s...

    24,90 €

  • CLICKBAIT
    PARMEGIANI, SIMON
    A kaleidoscopic journey through time, space and the many faces of reality. Sewn from Al's looms, this book represents the glory of machine precision and human creativity, producing a narrative both strange and exciting. In these pages, you will find worlds that are eerily strangely familiar, yet delightfully disparate. From the vibrant underwater fashion scene of Brooklyn to th...

    39,95 €

  • LA INTELIGENCIA ARTIFICIAL EXPLICADA A LOS HUMANOS
    TORRES, JORDI
    Ante el avance de la IA en cada vez más ámbitos de la vida cotidiana, La inteligencia artificial explicada a los humanos propone al lector un acercamiento a esta revolucionaria tecnología a través de un lenguaje cercano y accesible para todos.Un libro divulgativo, ameno y claro que nos ayuda a comprender cómo funciona la IA y aclara algunos de los interrogantes que se plantean ...

    15,00 €

  • MINECRAFT
    AB, MOJANG
    LIBRO OFICIAL DEL VIDEOJUEGO MÁS VENDIDO DE TODOS LOS TIEMPOS MÁS DE 100.000 EJEMPLARES VENDIDOS DE LA SERIE ¿Eres un constructor experto? ¿Buscas inspiración para tu próxima construcción épica? Visita estas 12 construcciones únicas y alucinantes que seguro que despertarán tu imaginación. Aquí aprenderás los mejores trucos y recibirás los mejores consejos, con los que logr...

    20,90 €

  • PUBLICACIÓN DE PÁGINAS WEB
    FERNÁNDEZ CASADO, PABLO E.
    Esta obra es una guía práctica y completa diseñada para ayudar a los principiantes a publicar un sitio web de forma que este sea lo más visible, atractivo y accesible posible. Se abordan todos los aspectos esenciales para que los lectores aprendan a lanzar sus propias páginas web de forma segura con los protocolos y herramientas que garanticen la protección ante intentos de hac...

    22,90 €