curso
Las 34 mejores preguntas y respuestas de entrevistas sobre MySQL para 2025
¿Te has dado cuenta alguna vez de que MySQL es obligatorio en casi todas las descripciones de puestos de trabajo relacionados con bases de datos? Hay una buena razón para ello: MySQL prácticamente lo impulsa todo, desde tus plataformas de redes sociales favoritas hasta las aplicaciones que utilizas a diario.
He elaborado esta guía para ayudarte a afrontar las preguntas de las entrevistas sobre MySQL. Cubriré todas las bases, desde lo básico que deben saber los desarrolladores junior hasta lo complejo que requieren los puestos senior. Además, compartiré algunos consejos que te ayudarán a parecer un candidato seguro en tus próximas entrevistas relacionadas con los datos.
¿Qué es MySQL?
MySQL es un RDBMS (sistema de gestión de bases de datos relacionales) de código abierto basado en SQL que organiza los datos en tablas estructuradas. Fue desarrollado por Oracle Corporation.
Se clasificó como el SGBD más popular en 2024 porque cada vez más empresas están migrando sus datos a MySQL. Por eso, si estás pensando en conseguir un trabajo en bases de datos, es muy importante que conozcas MySQL y las bases de datos relacionales.
En junio de 2024, MySQL es el sistema de gestión de bases de datos (SGBD) de código abierto más popular del mundo, con una puntuación en el ranking de 1061. Fuente: Statista.
Preguntas básicas de la entrevista sobre MySQL
En la fase inicial de la entrevista, el entrevistador puede hacerte preguntas fundamentales para evaluar tu comprensión de los conceptos básicos de bases de datos y MySQL.
1. ¿Qué es una base de datos y en qué se diferencia de un SGBD?
Una base de datos es un contenedor de almacenamiento que contiene datos a los que podemos acceder, modificar y analizar. Por ejemplo, las plataformas de medios sociales almacenan datos sobre a quién le han gustado nuestras publicaciones en bases de datos.
Un SGBD (Sistema de Gestión de Bases de Datos) es el software que nos permite interactuar con esos datos y gestionarlos mediante la creación de usuarios y la gestión de su acceso. MySQL es una de las opciones de SGBD más populares. Otros ejemplos incluyen PostgreSQL, MongoDB y Microsoft SQL Server.
2. ¿En qué se diferencia MySQL de otros sistemas de gestión de bases de datos relacionales?
MySQL es un sistema de gestión de bases de datos relacionales (RDBMS) de código abierto que utiliza SQL para gestionar los datos. Es conocido por su facilidad de uso, velocidad y compatibilidad con aplicaciones basadas en web.
He aquí en qué se diferencia MySQL de otros RDBMS:
- Sencillez y rendimiento: MySQL suele ser elogiado por su sencillez y su rendimiento optimizado, lo que lo convierte en la opción preferida de los desarrolladores web y las nuevas empresas.
- Funciones avanzadas: Aunque MySQL destaca por su facilidad de uso, puede carecer de las funciones avanzadas de otros RDBMS como PostgreSQL, como un soporte más completo para transacciones ACID, indexación avanzada y un conjunto más amplio de tipos de datos.
- Motores de almacenamiento: MySQL te permite elegir distintos motores de almacenamiento (por ejemplo, InnoDB, MyISAM) para las tablas, lo que les da flexibilidad para casos de uso específicos.
MySQL es ideal para escenarios que requieren velocidad y escalabilidad, pero para funciones más complejas o de nivel empresarial, PostgreSQL puede ser una mejor opción.
3. ¿Cuáles son los principales tipos de datos disponibles en MySQL?
MySQL admite una variedad de tipos de datos clasificados como:
- Numérico:
INT
,DECIMAL
,FLOAT
,DOUBLE
, etc. - Cadena:
CHAR
,VARCHAR
,TEXT
,BLOB
. - Fecha/hora:
DATE
,DATETIME
,TIMESTAMP
,TIME
. - JSON: Para almacenar objetos JSON.
4. ¿Cuál es la diferencia entre los tipos de datos INT y DECIMAL?
INT
almacena números enteros sin decimales. Podemos utilizarlo si no hay necesidad de fracciones. Por el contrario, DECIMAL
puede almacenar valores financieros y es adecuado para cálculos precisos con decimales.
5. ¿En qué se diferencia DATE de DATETIME en MySQL?
La función DATE
de MySQL almacena la fecha en formato año, mes y día:
YYYY-MM-DD
Sin embargo, la función DATETIME
almacena la fecha con la hora, y tiene el siguiente aspecto:
YYYY-MM-DD HH:MM:SS
6. ¿Qué es una clave ajena y cómo se utiliza en las bases de datos?
Una clave externa es un campo de una tabla que enlaza con la clave primaria de otra tabla.
Por ejemplo, en una tabla customers
que almacena información sobre clientes, cada cliente tiene una customer_id
única -en otra tabla llamada transactions
(que almacena registros de compras), utilizamos customer_id
como clave foránea. El customer_id
de la tabla de transacciones vinculará cada compra a un cliente concreto de latabla customers
.
Así es como se ve en SQL:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE transactions (
transaction_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
7. ¿Qué diferencias hay entre INNER JOIN, LEFT JOIN, RIGHT JOIN y FULL JOIN?
Las uniones combinan filas de dos o más tablas basándose en columnas relacionadas. He aquí sus diferencias:
- INNER JOIN: Devuelve las filas en las que hay una coincidencia en ambas tablas.
- JOIN IZQUIERDO: Devuelve todas las filas de la tabla izquierda y las filas coincidentes de la tabla derecha. Si no hay coincidencias, se devuelve
NULL
para las columnas de la tabla correcta. - JOIN DERECHO: Similar a
LEFT JOIN
, devuelve todas las filas de la tabla derecha y las filas coincidentes de la izquierda. - JOIN COMPLETO: Combina los resultados de
LEFT JOIN
yRIGHT JOIN
, incluyendo las filas no coincidentes de ambas tablas.
8. ¿Cuál es la diferencia entre DELETE, TRUNCATE y DROP en MySQL?
Comandos como DELETE
, TRUNCATE
, y DROP
pueden sonar parecidos, pero en realidad tienen comportamientos diferentes:
- BORRAR: Elimina filas de una tabla en función de una condición. Se puede deshacer si está dentro de una transacción. Ejemplo:
DELETE FROM employees WHERE department_id = 5;
- TRUNCAR: Elimina todas las filas de una tabla, pero la estructura de la tabla permanece intacta. Es más rápido que
DELETE
y no puede anularse. Ejemplo:
TRUNCATE TABLE employees;
- BAJA: Elimina completamente la estructura y los datos de la tabla, junto con cualquier dependencia como los índices. Ejemplo:
DROP TABLE employees;
9. ¿Cómo se crea y modifica una tabla en MySQL? Pon ejemplos.
Para crear tablas, puedes utilizar la sentencia CREATE TABLE
, y para modificarlas, normalmente la ALTER TABLE
. He aquí algunos ejemplos:
- Crear tabla:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50));
- Modifica para añadir una columna:
ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);
10. ¿Qué es una tabla temporal en SQL?
Una tabla temporal sólo existe durante la sesión actual de la base de datos. Una vez que cerramos la sesión, la tabla se borra. Este tipo de tabla puede almacenar temporalmente resultados intermedios. Podemos utilizarla para probar, filtrar o preparar datos antes de insertarlos en una tabla permanente.
He aquí un ejemplo:
CREATE TEMPORARY TABLE temp_employees (
id INT,
name VARCHAR(50)
);
INSERT INTO temp_employees VALUES (1, 'John Doe');
SELECT * FROM temp_employees;
11. ¿Qué es una subconsulta en MySQL? Explícalo con un ejemplo.
Una subconsulta (también llamada consulta anidada) está anidada dentro de otra consulta. Descompone las operaciones complejas de la base de datos en pasos más manejables. Por ejemplo, puedes crear una subconsulta para encontrar empleados que ganen por encima del salario medio:
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
Vamos a desglosarlo:
- La consulta interna
SELECT AVG(salary) FROM employees
calcula primero el salario medio. - A continuación, la consulta externa utiliza esta media para encontrar a los empleados que ganan por encima de ella.
12. ¿Cómo utilizarías una sentencia INSERT en MySQL para añadir datos a una tabla? Además, ¿tienes algunas buenas prácticas para esto?
Podemos utilizar la sentencia INSERT()
para añadir datos a una tabla. La sintaxis básica es
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
Aquí tienes algunas buenas prácticas que puedes seguir cuando utilice la declaración INSERT()
:
- Enumera explícitamente tus columnas. Esto hace que el código sea más claro y evita errores si la estructura de la tabla cambia más adelante.
- Para las columnas
AUTO_INCREMENT
, como los ID, omítelas en la declaraciónINSERT()
. MySQL los gestiona automáticamente para evitar los ID duplicados. - Sé coherente con las comillas de cadena. Personalmente prefiero las comillas simples, pero cualquiera de las dos sirve.
- Si vas a insertar varias filas, puedes hacerlo en una única sentencia para mejorar el rendimiento.
13. ¿Qué significa el atributo AUTO_INCREMENT en MySQL?
El atributo AUTO_INCREMENT
en MySQL genera números únicos y secuenciales para una columna, normalmente la clave primaria de una tabla.
Aquí tienes un ejemplo de cómo crear una tabla con una columna AUTO_INCREMENT
:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
Y para insertar filas en él:
INSERT INTO employees (name, department) VALUES ('John Doe', 'Sales');
INSERT INTO employees (name, department) VALUES ('Jane Smith', 'Marketing');
14. ¿Qué es una vista en MySQL?
Una vista es una consulta guardada que funciona como una tabla virtual. Con esto, podemos tomar una consulta compleja, darle un nombre y utilizarla como una tabla para futuras consultas. De este modo, no tendrás que volver a escribir toda la consulta cada vez.
Por ejemplo, para simplificar la consulta de los detalles de los empleados junto con sus nombres de departamento, puedes crear una vista:
CREATE VIEW employee_details AS
SELECT
e.id,
e.name,
d.department_name,
e.salary
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id;
Ahora puedes consultar la vista employee_details
como si fuera una tabla:
SELECT * FROM employee_details;
Sin embargo, no podemos utilizar vistas para insertar y actualizar los datos. La mayoría admiten la opción de sólo lectura e impiden que los usuarios accedan a la base de datos, mejorando la seguridad de los datos. A veces, las vistas pueden ralentizar las consultas, ya que ejecutan la consulta subyacente cada vez que se accede a ellas.
Perfeccionamiento de SQL para principiantes
Preguntas de la entrevista sobre MySQL intermedio
En esta sección trataremos temas de nivel intermedio. Estas preguntas se formulan principalmente para comprobar tus conocimientos sobre los tipos de datos y la estructura de MySQL.
15. ¿Qué son las tablas con versiones del sistema y cómo funcionan?
Las tablas versionadas por el sistema mantienen un historial completo de los cambios realizados en una tabla. Como conservan versiones anteriores de cada fila, podemos utilizarlas para auditar y recuperar datos.
Funcionan añadiendo dos columnas adicionales - StartTime
y EndTime
- para registrar cuándo es válida cada fila. Cuando insertemos, actualicemos o eliminemos datos, estas marcas de tiempo se actualizarán:
- Inserta: Se añade una nueva fila con un
StartTime
fijado en la marca de tiempo actual y unEndTime
de9999-12-31 23:59:59
(o un valor similar que represente "para siempre"). Indica que la fila es válida actualmente. - Actualización: La
EndTime
de la fila original se actualiza con la marca de tiempo actual para marcarla como ya no válida. A continuación, se crea una nueva fila con los datos actualizados, con suStartTime
fijado en la marca de tiempo actual yEndTime
como "para siempre". - Borrar: El
EndTime
de la fila existente se actualiza con la marca de tiempo actual, indicando que la fila ya no es válida.
Utilizando la cláusula FOR SYSTEM_TIME
de SQL, puedes consultar la tabla para ver su estado en un momento determinado o en un intervalo de tiempo. Por ejemplo:
FOR SYSTEM_TIME AS OF '2024-01-01'
: Recupera el estado de la tabla tal y como estaba el 1 de enero de 2024.FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-12-31'
: Muestra todas las filas válidas dentro de este intervalo de fechas.
16. ¿Qué son las transacciones MySQL y cómo se utilizan?
Las transacciones son un conjunto de operaciones ejecutadas como una sola unidad. Garantizan la integridad de los datos permitiendo que todas las operaciones tengan éxito o fracasen juntas.
Aquí tienes un ejemplo de su uso:
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT; -- Saves changes permanently
-- or
ROLLBACK; -- Reverts changes
17. ¿Qué es una restricción por defecto en MySQL? ¿Cómo se establece un valor por defecto para una columna?
Una restricción por defecto en MySQL asigna un valor por defecto a una columna cuando no se proporciona un valor explícito durante una operación INSERT
. Esto garantiza que la columna sea válida aunque el usuario la omita durante la introducción de datos.
A continuación te explicamos cómo crear una tabla con un valor por defecto:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
status VARCHAR(10) DEFAULT 'active'
);
A continuación, puedes insertar una fila sin especificar la dirección status
:
INSERT INTO employees (name) VALUES ('John Doe');
Este enfoque reduce la probabilidad de NULL
o de datos no válidos en columnas críticas y simplifica las consultas al eliminar la necesidad de manejar explícitamente los casos por defecto.
Resultado:
Campo |
Tipo |
Nulo |
Clave |
Por defecto |
Extra |
id |
INT |
NO |
PRI |
NULL |
AUTO_INCREMENTO |
nombre |
VARCHAR(50) |
SÍ |
NULL |
||
estado |
VARCHAR(10) |
SÍ |
activo |
Este comando es útil porque
- Ayuda a los desarrolladores a comprender el esquema de la tabla antes de escribir consultas.
- Puede utilizarse para depurar, sobre todo cuando se trabaja con bases de datos desconocidas.
- Identifica rápidamente las restricciones, como las claves primarias o los valores por defecto.
19. ¿Cómo utilizarías las funciones de cadena en SQL para gestionar el texto?
Diferentes funciones de cadena en SQL trabajan con nombres y otros datos de texto. Por ejemplo:
- La función
LENGTH()
muestra el número de caracteres de un nombre. UPPER()
yLOWER()
convierten el texto a mayúsculas o minúsculas.CONCAT()
une el nombre y el apellido en una columna.SUBSTRING()
extrae partes concretas del texto. Por ejemplo, podemos utilizarlo para separar el mes de la fecha de nacimiento.
Aquí tienes un ejemplo de consulta:
SELECT
UPPER(first_name) AS upper_name,
CONCAT(first_name, ' ', last_name) AS full_name,
SUBSTRING(birthdate, 6, 2) AS birth_month,
TRIM(last_name) AS trimmed_last_name,
REPLACE(first_name, 'a', '@') AS replaced_name
FROM employees;
Esta consulta:
- Convierte los nombres a mayúsculas.
- Combina el nombre y los apellidos en un nombre completo.
- Extrae el mes de nacimiento de una columna
birthdate
. - Elimina los espacios de los apellidos.
- Sustituye todas las apariciones de "a" por "@" en los nombres de pila.
20. ¿Cómo actualizarías una fila concreta de una base de datos con SQL?
Puedes utilizar la sentencia UPDATE
y la cláusula WHERE
para identificar el registro que quieres modificar.
Por ejemplo, si quieres actualizar el género de la película "Inception" de 2010 a "Ciencia ficción", puedes utilizar la siguiente consulta:
UPDATE movies
SET genre = 'Sci-Fi'
WHERE movie_title = 'Inception' AND year = 2010;
Aquí, UPDATE movies
especifica la tabla que queremos actualizar, y la cláusula WHERE
se dirige a la fila en la que el título es "Inception" y el año es "2010".
Preguntas avanzadas de la entrevista MySQL
Las preguntas avanzadas de la entrevista ponen a prueba tu capacidad para gestionar escenarios complejos de MySQL y dan al entrevistador una idea de tu capacidad para tomar decisiones.
21. ¿Qué es un disparador en MySQL? ¿Cómo se pone en práctica?
En MySQL, un disparador es un conjunto de acciones que se ejecutan cuando se produce un evento en la base de datos. Los activadores pueden configurarse para ejecutarse antes o después de eventos como INSERT
, UPDATE
, o DELETE
.
Por ejemplo, supongamos que hay una tabla orders
en la que se añaden nuevos pedidos. Podemos crear un disparador que registre cada nuevo pedido en una tabla order_history
:
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_history (order_id, action, timestamp)
VALUES (NEW.order_id, 'inserted', NOW());
END;
Una vez ejecutado el activador, la tabla order_history
seactualiza automáticamente:
historial_id |
order_id |
acción |
marca de tiempo |
1 |
1 |
insertado |
2024-12-24 10:00:00 |
2 |
2 |
insertado |
2024-12-24 11:00:00 |
22. ¿Por qué añadir un índice hace que las consultas SQL sean más rápidas?
Si no hay índice, la base de datos tendrá que escanear cada fila para encontrar una entrada concreta. Un índice actúa como una tabla de contenidos, permitiendo a la base de datos acceder a las filas relevantes. Por tanto, añadir un índice reduce el tiempo de búsqueda y agiliza las consultas.
Los índices suelen implementarse utilizando estructuras de datos como árboles B o tablas hash, que permiten a la base de datos realizar búsquedas, consultas y exploraciones de rangos de forma eficiente.
Aquí tienes un ejemplo de cómo crear un índice:
-- Without an index:
SELECT * FROM employees WHERE last_name = 'Smith';
-- Adding an index on the last_name column:
CREATE INDEX idx_last_name ON employees(last_name);
-- With the index, the database can quickly locate rows with 'Smith' in the last_name column.
Por ejemplo, los índices tienen algunos inconvenientes:
- Operaciones de escritura más lentas:
INSERT
,UPDATE
, yDELETE operations are slower because the index must be updated each time data changes.
- Coste de almacenamiento: Los índices requieren espacio de almacenamiento adicional.
23. ¿Qué tipo de datos utilizamos para el peso y el precio del producto en una tabla SQL, y por qué?
Utilizamos el tipo de datos FLOAT
o REAL
para almacenar el peso, porque el peso suele incluir valores decimales y acepta un pequeño margen de error. Como estos tipos de datos pueden almacenar valores aproximados, son más adecuados para las columnas de peso.
El tipo de datos DECIMAL
se utiliza habitualmente para almacenar precios, porque los valores financieros como los precios no aceptan ni siquiera un pequeño error de redondeo. Esta precisión sólo se da con el tipo de dato decimal (por ejemplo, DECIMAL(10, 2)
para 10 dígitos, con 2 después del punto decimal).
24. ¿Cómo encontrar filas duplicadas en SQL con una función de ventana?
A continuación te explicamos cómo puedes encontrar duplicados utilizando la función de ventana ROW_NUMBER()
:
WITH DuplicateCheck AS (
SELECT product_name,
category,
ROW_NUMBER() OVER(
PARTITION BY product_name, category
ORDER BY id
) AS row_num
FROM sales
)
SELECT *
FROM DuplicateCheck
WHERE row_num > 1;
Veamos cómo funciona:
1. ROW_NUMBER()
asigna un número a cada fila de nuestro resultado.
2. PARTITION BY
agrupa las filas por product_name
y category
.
3. Dentro de cada grupo, las filas se numeran empezando por 1.
4. Cualquier row_num
mayor que 1 indica un duplicado.
Por ejemplo, si tenemos estos registros
- Producto A, Categoría X, fila_num = 1
- Producto A, Categoría X, fila_num = 2 (duplicado)
- Product B, Category Y, row_num = 1
La consulta nos mostrará la segunda fila ya que su row_num
es mayor que 1.
25. ¿Cómo se crea y utiliza un procedimiento almacenado con parámetros en MySQL? Explícalo con un ejemplo.
Podemos guardar y reutilizar consultas complejas con procedimientos almacenados para que las operaciones de la base de datos sean más eficaces y fáciles de mantener. Veamos cómo crearlos y utilizarlos con parámetros mediante un ejemplo práctico.
Supongamos que tenemos una base de datos de alumnos y queremos crear un procedimiento para filtrar a los alumnos por edad. Así es como podemos hacerlo:
En primer lugar, vamos a crear un procedimiento almacenado sencillo que tome un parámetro de edad:
CREATE PROCEDURE get_student_info(IN age INT)
BEGIN
SELECT * FROM student WHERE student.age = age;
END;
Para utilizar este procedimiento, simplemente CALL
con nuestra edad deseada:
CALL get_student_info(21);
Podemos hacer que nuestros procedimientos sean más sofisticados utilizando parámetros de salida. Por ejemplo, vamos a crear un procedimiento que cuente los alumnos de una edad determinada:
CREATE PROCEDURE count_students_by_age(IN age INT, OUT student_count INT)
BEGIN
SELECT COUNT(*) INTO student_count FROM students WHERE students.age = age;
END;
Para obtener el resultado de este procedimiento:
SET @count = 0;
CALL count_students_by_age(21, @count);
SELECT @count AS total_students;
26. ¿Por qué es importante la integridad referencial en una base de datos?
La integridad referencial mantiene la exactitud de las relaciones entre tablas. Cuando creamos una clave externa, nos aseguramos de que los valores de una tabla coinciden con el valor único de la tabla referenciada.
He aquí un ejemplo práctico: Supón que gestionas una base de datos de comercio electrónico. Tienes una tabla Customers
y una tabla Orders
. Cada pedido debe pertenecer a un cliente real. La integridad referencial, implementada mediante claves foráneas, refuerza esta relación garantizando:
- No puedes crear un pedido para un cliente inexistente.
- No puedes eliminar un cliente con pedidos existentes (a menos que configures específicamente lo que debe ocurrir con esos pedidos).
- No puedes actualizar el ID de un cliente si ese cliente tiene pedidos existentes.
Así, cuando creas una restricción de clave foránea como ésta
ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
La base de datos aplica automáticamente estas normas:
- Cada
CustomerID
de la tablaOrders
debe existir en la tablaCustomers
. - Los intentos de infringir estas normas (como insertar un
CustomerID
no válido) serán rechazados.
Así se evitan incoherencias en los datos que podrían causar graves problemas, como pedidos que no pueden rastrearse hasta los clientes reales o informes generados con información de clientes que falta.
Preguntas de la entrevista MySQL para administradores de bases de datos
Si estás solicitando específicamente un puesto de administrador de base de datos, aquí tienes algunas preguntas que pueden hacerte los reclutadores.
27. ¿Por qué una gran aplicación utilizaría la fragmentación de bases de datos? Háblame también de los retos que supone.
Una gran aplicación utiliza la fragmentación de bases de datos para dividir los big data entre varios servidores. Cada parte o fragmento contiene una pequeña parte de los datos. Como reparte la carga de datos, no hace falta hardware de gama alta. Aunque la velocidad y la escalabilidad también mejoran, también tiene algunos retos:
- Algunas consultas, como las uniones, pueden no funcionar, lo que puede complicar la gestión de los datos.
- Cuando los datos crecen, los fragmentos pueden saturarse, creando puntos calientes que ralenticen el rendimiento.
28. Explica el papel de los redo logs en la recuperación de fallos de MySQL.
Cada vez que se modifican datos en MySQL, hay que escribirlos en el disco. Sin embargo, escribir directamente en archivos de datos es lento y arriesgado. Por eso, antes de que MySQL modifique ningún fichero de datos, primero escribe lo que va a hacer en el registro de rehacer. Esto es más seguro que actualizar aleatoriamente los archivos de datos.
Supongamos que actualizas la dirección de un cliente:
- MySQL escribe primero este cambio en el registro de rehacer.
- Entonces reconoce tu transacción como comprometida.
- Finalmente, aplica el cambio a los archivos de datos reales.
La recuperación de fallos es importante si MySQL se bloquea después de los pasos 1 ó 2, pero antes del paso 3. Cuando MySQL se reinicia, mira sus registros de rehacer y luego completa cualquier trabajo inacabado reproduciendo los cambios registrados en los registros de rehacer. Esto garantiza que las transacciones comprometidas no se pierdan, incluso si MySQL se bloquea en un momento inoportuno.
29. ¿Cuáles son los distintos motores de almacenamiento disponibles en MySQL y en qué se diferencian?
MySQL admite varios motores de almacenamiento, cada uno optimizado para diferentes casos de uso. Aquí tienes una comparación de los más comunes:
Motor de almacenamiento |
Características |
Casos prácticos |
InnoDB |
- Motor de almacenamiento por defecto. - Compatible con ACID. - Bloqueo a nivel de fila. - Admite transacciones y claves foráneas. |
Aplicaciones que requieren una gran integridad de los datos, como las plataformas de comercio electrónico o los sistemas financieros. |
MyISAM |
- Rápido para operaciones pesadas de lectura. - Bloqueo a nivel de tabla. - No admite transacciones ni claves foráneas. |
Aplicaciones de lectura intensiva en las que la velocidad es más crítica que la integridad de los datos. |
Memoria |
- Almacena los datos en la memoria RAM. - Extremadamente rápido. - Los datos se pierden al reiniciar. - Tamaño limitado. |
Almacenamiento temporal de datos, caché o gestión de sesiones. |
CSV |
- Almacena los datos en archivos CSV sin formato. - Fácil integración con herramientas externas. - No admite indexación. |
Intercambio de datos entre aplicaciones o para el simple almacenamiento de datos sin necesidad de consultas complejas. |
Archivo |
- Optimizado para alta compresión. - Sólo admite operaciones INSERT y SELECT. - No hay índices. |
Almacenamiento de datos históricos o de registro cuya recuperación es poco frecuente. |
NDB (en clúster) |
- Almacenamiento distribuido para MySQL Cluster. - Alta disponibilidad y tolerancia a fallos. - Admite transacciones. |
Aplicaciones distribuidas a gran escala que requieren rendimiento en tiempo real. |
30. ¿Cómo se establece un motor de almacenamiento por defecto en MySQL?
En primer lugar, puedes comprobar el motor de almacenamiento predeterminado actual:
SHOW ENGINES;
Se recomienda InnoDB como motor por defecto, ya que admite funciones importantes como:
- Transacciones compatibles con ACID
- Restricciones de clave foránea
- Recuperación de accidentes
- Bloqueo a nivel de fila
Para cambiar temporalmente el motor predeterminado de mi sesión actual, puedes utilizar
SET default_storage_engine = 'InnoDB';
Para un cambio permanente, puedes modificar el archivo de configuración de MySQL añadiendo esta línea en la sección [mysqld]
:
default-storage-engine = InnoDB
31. ¿Cómo reparar tablas corruptas en MySQL?
Primero, puedes comprobar todas las bases de datos con este comando:
mysqlcheck --check --all-databases -u root -p
Escaneará todas las tablas e informará si hay alguna corrupción. A continuación, puedes ejecutar la siguiente consulta para reparar la tabla:
mysqlcheck --repair database_name table_name -u root -p
Las reparaciones pueden provocar la pérdida de datos en casos de corrupción grave, así que asegúrate de hacer una copia de seguridad de los datos.
Preguntas de la entrevista MySQL basadas en escenarios y en la resolución de problemas
Estas preguntas miden tu experiencia en situaciones complejas del mundo real y tu capacidad para resolver problemas.
32. Explica una situación en la que hayas utilizado subconsultas en MySQL.
He aquí cómo puedes responder a una pregunta como ésta:
En mi reciente trabajo gestioné la base de datos de una tienda de comercio electrónico, donde tuve que preparar un informe de productos. El objetivo era encontrar productos que generaran ventas superiores a la media, lo que requería utilizar subconsultas para realizar este análisis de varios pasos.
Aquí tienes la consulta SQL que desarrollé para resolver esto:
SELECT
p.product_id,
p.product_name,
s.sales_amount
FROM products p
JOIN sales s ON p.product_id = s.product_id
WHERE s.sales_amount > (
SELECT AVG(sales_amount)
FROM sales
)
ORDER BY s.sales_amount DESC;
En primer lugar, establecí nuestra base de referencia calculando el importe medio de las ventas de todos los productos. Para ello, utilicé una subconsulta en la cláusula WHERE
que calculaba AVG(sales_amount)
a partir de la tabla de ventas. Esta subconsulta actuaba como umbral dinámico con el que medir el rendimiento de cada producto.
A continuación, la consulta principal unió las tablas de productos y ventas para extraer los detalles relevantes de los productos, mientras que la cláusula WHERE
filtró todos los productos con ventas inferiores a nuestra media calculada.
Al estructurar la consulta de este modo, podía identificar los productos de alto rendimiento en una sola operación de la base de datos, en lugar de ejecutar varias consultas por separado.
33. ¿Puedes explicar una situación en la que hayas utilizado uniones SQL para combinar datos de varias tablas?
He aquí un ejemplo de respuesta a la pregunta anterior:
Hace poco, estuve trabajando en un proyecto en el que teníamos dos tablas principales: una con datos de ventas de productos y otra con detalles de productos. Mi tarea consistía en crear un informe que mostrara sales
, product name
, category
, y price
.
Para combinar los datos relevantes, utilicé un INNER JOIN en la columna común, product_id
, para vincular las transacciones de venta con los detalles del producto:
SELECT
s.sales_date,
p.product_name,
p.category,
s.quantity_sold,
p.price
FROM
sales s
INNER JOIN
products p
ON
s.product_id = p.product_id;
El informe proporcionó una imagen clara de las tendencias de ventas, ayudando a las partes interesadas a identificar qué categorías de productos estaban funcionando bien y cuáles necesitaban atención.
34. ¿Tienes alguna experiencia con los desencadenantes? Explica cómo los has utilizado.
He aquí un ejemplo de respuesta a la pregunta anterior:
Sí, tengo mucha experiencia con los activadores de bases de datos. En mi reciente función, implementé un activador AFTER UPDATE
para la auditoría de cambios de precios.
Deja que te guíe a través de la aplicación concreta: He creado un activador que captura automáticamente el historial de precios cada vez que cambia el precio de un producto. Aquí tienes el script SQL que he desarrollado:
CREATE TRIGGER tr_AuditPriceChanges
ON Products
AFTER UPDATE AS
BEGIN
-- Only execute if the price was actually changed
IF UPDATE(UnitPrice)
BEGIN
INSERT INTO PriceAudit (
ProductID,
OldPrice,
NewPrice,
ChangedBy,
ChangeDate,
PercentageChange
)
SELECT
i.ProductID,
d.UnitPrice AS OldPrice,
i.UnitPrice AS NewPrice,
SYSTEM_USER,
GETDATE(),
ROUND(((i.UnitPrice - d.UnitPrice) / d.UnitPrice * 100), 2)
FROM INSERTED i
JOIN DELETED d ON i.ProductID = d.ProductID
WHERE i.UnitPrice <> d.UnitPrice;
END
END;
Lo que hizo que esta solución fuera especialmente eficaz fue
- Sólo se dispara cuando realmente se producen cambios en los precios.
- Captura al usuario que realiza el cambio utilizando
SYSTEM_USER
. - Calcula el cambio porcentual a efectos de información.
- Incluye una cláusula
WHERE
para filtrar los no cambios que puedan producirse por actualizaciones de otras columnas.
También añadí la gestión de errores y el registro cuando detectamos algunos casos extremos con los precios de NULL
.
Consejos para preparar una entrevista MySQL
Si estás empezando tu carrera, aquí tienes algunos consejos que te ayudarán a superar tu próxima entrevista:
Domina los conceptos básicos de MySQL: Learn los fundamentos de las bases de datos, como la indexación, las transacciones y el optimizador de consultas. Comprende cómo MySQL procesa las consultas y gestiona el almacenamiento de datos. Esto te ayudará a redactar consultas eficaces y a explicar tus soluciones durante la entrevista.
Adquiere experiencia práctica: Instala MySQL en tu ordenador y practicae regularmente. Crea bases de datos de prueba, escribe distintos tipos de consultas e intenta optimizarlas. La práctica real es la mejor manera de aprender cómo funcionan las cosas y de ganar confianza para la entrevista.
Para refrescar aún más tus conocimientos, consulta los recursos de DataCamp:
- Para la introducción al SQL: Curso de Introducción a SQL
- Para practicar SQL: Aplicar SQL a problemas del mundo real
Conoce las herramientas e integraciones de MySQL: Familiarízate con MySQL Workbench u otras herramientas de gestión de bases de datos y supervisión básica. You también puedes explorar cómo funciona MySQL con Python y los frameworks pertinentes, demostrando que puedes trabajar en un entorno de desarrollo real.
Conclusión
¡Ahí lo tienes! He cubierto las 34 mejores preguntas de entrevista sobre MySQL para ayudarte a conseguir tu próximo trabajo. Tanto si aspiras a un puesto inicial como a un puesto avanzado de administrador de datos, debes tener un sólido conocimiento de los fundamentos de MySQL, la optimización de consultas y la gestión de bases de datos para destacar.
Para ampliar tus conocimientos sobre otros sistemas de gestión de bases de datos, consulta los cursos de SQL de DataCamp .
Certifícate en SQL
Soy una estratega de contenidos a la que le encanta simplificar temas complejos. He ayudado a empresas como Splunk, Hackernoon y Tiiny Host a crear contenidos atractivos e informativos para su público.
Aprende más sobre SQL con estos cursos
curso
Joining Data in SQL
curso
Data Manipulation in SQL
blog
Las 80 mejores preguntas y respuestas de entrevistas SQL para principiantes y profesionales intermedios
blog
Las 21 mejores preguntas y respuestas de la entrevista sobre ingeniería de datos
blog
Las 23 mejores preguntas y respuestas de entrevistas sobre Python
blog
30 preguntas de entrevista sobre Azure: De Básico a Avanzado
Josep Ferrer
30 min
blog
Las 30 mejores preguntas de entrevista sobre Excel para todos los niveles
blog