Logo de Adafaceadaface

101 preguntas de entrevista de MySQL que deberías hacer para contratar a los mejores ingenieros

Al evaluar a los candidatos para roles que requieren gestión de datos, es fácil sentirse abrumado por la jerga técnica y los matices de SQL. Al igual que examinar una montaña de datos sin la consulta correcta, evaluar las habilidades de SQL puede parecer caótico si no se está equipado con las preguntas correctas, a diferencia de evaluar las habilidades de un analista de datos.

Esta publicación de blog está estructurada como una lista lista para usar de preguntas de entrevista de SQL para reclutadores y gerentes de contratación. Cubre preguntas básicas, intermedias, avanzadas y de nivel experto junto con algunas preguntas de opción múltiple (MCQ) para asegurarse de encontrar al mejor candidato.

Al usar estas preguntas, puede asegurarse de que su proceso de entrevista esté bien estructurado y sea efectivo. Para garantizar el dominio de SQL del candidato antes de la entrevista, considere usar las evaluaciones de SQL de Adaface.

Tabla de contenido

Preguntas básicas de la entrevista de SQL

Preguntas intermedias de la entrevista de SQL

Preguntas avanzadas de la entrevista de SQL

Preguntas de la entrevista de SQL para expertos

MCQ de SQL

¿Qué habilidades de SQL debe evaluar durante la fase de entrevista?

Optimice su proceso de contratación de SQL con pruebas de habilidades y preguntas específicas

Descargue la plantilla de preguntas de la entrevista de SQL en múltiples formatos

Preguntas básicas de la entrevista de SQL

1. ¿Qué es SQL y por qué lo usamos?

SQL, que significa Lenguaje de Consulta Estructurado, es un lenguaje de programación estándar utilizado para administrar y manipular datos almacenados en un sistema de gestión de bases de datos relacionales (SGBDR). Permite a los usuarios interactuar con bases de datos para realizar varias operaciones.

Usamos SQL principalmente para tareas como:

  • Recuperación de datos: Consultar y recuperar datos específicos de bases de datos.
  • Manipulación de datos: Insertar, actualizar y eliminar datos dentro de las bases de datos.
  • Definición de datos: Crear, modificar y eliminar objetos de la base de datos como tablas y vistas.
  • Control de datos: Gestionar el acceso y los permisos de los usuarios a los recursos de la base de datos.

2. ¿Puede explicar la diferencia entre los comandos DELETE y TRUNCATE?

El comando DELETE elimina filas de una tabla basándose en una condición especificada. Es un comando de Lenguaje de Manipulación de Datos (DML). Las operaciones DELETE se registran y se pueden revertir. Cada fila eliminada se registra individualmente en el registro de transacciones. Puede utilizar una cláusula WHERE para especificar qué filas eliminar.

TRUNCATE es un comando de Lenguaje de Definición de Datos (DDL) que elimina todas las filas de una tabla. Desasigna las páginas de datos utilizadas por la tabla, restableciendo la tabla a un estado vacío. TRUNCATE es más rápido que DELETE porque no registra las eliminaciones de filas individuales y no se puede revertir. Restablece la columna de identidad (autoincremento) a su valor de semilla.

3. ¿Cuáles son los diferentes tipos de joins en SQL?

Los joins de SQL se utilizan para combinar filas de dos o más tablas basándose en una columna relacionada. Hay varios tipos de joins:

  • INNER JOIN: Devuelve filas solo cuando hay una coincidencia en ambas tablas.
  • LEFT (OUTER) JOIN: Devuelve todas las filas de la tabla izquierda y las filas coincidentes de la tabla derecha. Si no hay coincidencia, devuelve valores NULL para las columnas de la tabla derecha.
  • RIGHT (OUTER) JOIN: Devuelve todas las filas de la tabla derecha y las filas coincidentes de la tabla izquierda. Si no hay coincidencia, devuelve valores NULL para las columnas de la tabla izquierda.
  • FULL (OUTER) JOIN: Devuelve todas las filas cuando hay una coincidencia en la tabla izquierda o derecha. Combina los resultados de los JOIN externos LEFT y RIGHT. Los valores faltantes de cualquier tabla se rellenan con NULLs.
  • CROSS JOIN: Devuelve el producto cartesiano de las tablas involucradas; cada fila de la primera tabla se combina con cada fila de la segunda tabla.

4. ¿Cómo se ordenan los resultados de una consulta SQL?

Para ordenar los resultados de una consulta SQL, se utiliza la cláusula ORDER BY. Se especifica la columna o columnas por las que se desea ordenar después de la palabra clave ORDER BY. Por defecto, ORDER BY ordena en orden ascendente.

Para ordenar en orden descendente, se agrega la palabra clave DESC después del nombre de la columna. Por ejemplo, ORDER BY column_name DESC. También se puede ordenar por múltiples columnas, teniendo la primera columna listada precedencia, de la siguiente manera: ORDER BY column1 ASC, column2 DESC.

5. ¿Qué es una clave primaria y por qué es importante?

Una clave primaria es una columna o un conjunto de columnas en una tabla de base de datos que identifica de forma única cada fila de esa tabla. Aplica la unicidad, lo que significa que dos filas no pueden tener el mismo valor de clave primaria, y no puede contener valores NULL.

La importancia de una clave primaria radica en su capacidad para:

  • Identificar registros de forma única: Permite la fácil recuperación, actualización y eliminación de filas específicas.
  • Hacer cumplir la integridad de los datos: Previene registros duplicados y asegura que cada fila represente una entidad distinta.
  • Establecer relaciones: Se utiliza como clave externa en otras tablas para crear relaciones entre tablas.

6. ¿Qué es una clave externa y cómo se relaciona con otras tablas?

Una clave externa es una columna (o conjunto de columnas) en una tabla que se refiere a la clave primaria de otra tabla. Su propósito es establecer y hacer cumplir un enlace entre los datos de las dos tablas.

Esta relación asegura la integridad referencial, lo que significa que no se puede insertar una fila en la tabla que contiene la clave externa si no hay una fila correspondiente en la tabla vinculada (la que tiene la clave primaria). También suele dictar lo que sucede cuando una fila se elimina o se actualiza en la tabla principal. Por ejemplo, se podría establecer ON DELETE CASCADE para que la eliminación de una fila en la tabla principal elimine automáticamente las filas correspondientes en la tabla secundaria. Considere estos ejemplos de SQL:

CREATE TABLE Padre ( id INT PRIMARY KEY ); CREATE TABLE Hijo ( id INT PRIMARY KEY, parent_id INT, FOREIGN KEY (parent_id) REFERENCES Padre(id) );

En este caso, parent_id es una clave externa en la tabla Hijo, que hace referencia a la columna id (clave primaria) en la tabla Padre.

7. ¿Cómo se filtran los datos en SQL? Da algunos ejemplos.

SQL utiliza la cláusula WHERE para filtrar datos. Especifica una condición que las filas deben cumplir para ser incluidas en el conjunto de resultados. La cláusula WHERE se coloca después de la cláusula FROM en una sentencia SELECT, UPDATE o DELETE.

Los ejemplos incluyen el filtrado por igualdad (WHERE columna = 'valor'), desigualdad (WHERE columna != 'valor'), el uso de operadores de comparación (WHERE columna > 10), operadores de rango (WHERE columna BETWEEN 1 AND 10), la comprobación de valores nulos (WHERE columna IS NULL) y la coincidencia de patrones (WHERE columna LIKE 'patrón%'). Se pueden combinar múltiples condiciones utilizando los operadores AND y OR. Ejemplo:

SELECT * FROM empleados WHERE salario > 50000 AND departamento = 'Ventas';

8. ¿Cuál es el propósito de la cláusula `GROUP BY`?

La cláusula GROUP BY en SQL se utiliza para agrupar filas que tienen los mismos valores en una o más columnas en una fila de resumen. Permite realizar funciones agregadas (como COUNT(), SUM(), AVG(), MIN(), MAX()) en estas filas agrupadas.

Esencialmente, GROUP BY le permite categorizar sus datos y luego realizar cálculos en cada categoría, proporcionando información sobre subconjuntos de sus datos en lugar de todo el conjunto de datos en su conjunto.

9. ¿Cómo se usan las funciones agregadas como `COUNT`, `SUM`, `AVG`, `MIN` y `MAX`?

Las funciones agregadas operan en un conjunto de filas y devuelven un único valor de resumen. COUNT devuelve el número de filas, SUM calcula la suma de los valores de una columna, AVG calcula el valor promedio, MIN encuentra el valor más pequeño y MAX encuentra el valor más grande. Estas funciones se utilizan a menudo con la cláusula GROUP BY para calcular valores agregados para diferentes grupos de filas.

Por ejemplo, digamos que tenemos una tabla llamada pedidos con columnas customer_id y order_total. SELECT COUNT(*) FROM orders; devolvería el número total de pedidos. SELECT SUM(order_total) FROM orders WHERE customer_id = 123; devuelve el valor total para el cliente 123. SELECT customer_id, AVG(order_total) FROM orders GROUP BY customer_id; nos daría el promedio total de pedidos para cada cliente. Aquí hay algunos ejemplos más:

  • SELECT MIN(total_orden) FROM ordenes;
  • SELECT MAX(total_orden) FROM ordenes;

10. ¿Qué es una subconsulta? ¿Puede dar un ejemplo de cuándo podría usar una?

Una subconsulta, también conocida como consulta interna o consulta anidada, es una consulta incrustada dentro de otra consulta SQL. Se utiliza para recuperar datos que se usarán en las condiciones o selección de la consulta principal.

Por ejemplo, podría usar una subconsulta para encontrar todos los clientes que realizaron pedidos mayores que el tamaño promedio del pedido. La subconsulta calcularía el tamaño promedio del pedido, y la consulta externa seleccionaría a los clientes con pedidos que excedan ese valor. Una sintaxis SQL de ejemplo se ve así: SELECT id_cliente FROM ordenes WHERE tamaño_pedido > (SELECT AVG(tamaño_pedido) FROM ordenes);

11. Explique la diferencia entre las cláusulas WHERE y HAVING.

La cláusula WHERE filtra los registros antes de que ocurra cualquier agrupación. Opera en filas individuales y se utiliza para seleccionar filas basadas en los valores de las columnas. WHERE se aplica antes de GROUP BY.

Por el contrario, la cláusula HAVING filtra los registros después de la agrupación. Se utiliza para filtrar grupos basados en funciones agregadas. Por lo tanto, HAVING debe usarse con GROUP BY y opera en los resultados de los datos agregados. Puede usar HAVING para verificar condiciones calculadas sobre los grupos.

12. ¿Cómo se combinan los resultados de dos o más sentencias SELECT?

Puede combinar los resultados de dos o más sentencias SELECT utilizando UNION, UNION ALL, INTERSECT o EXCEPT (también a veces llamado MINUS, dependiendo del sistema de base de datos).

  • UNION combina los conjuntos de resultados de dos o más sentencias SELECT en un único conjunto de resultados, eliminando las filas duplicadas. El número y el orden de las columnas deben ser los mismos, y los tipos de datos deben ser compatibles.
  • UNION ALL es similar a UNION, pero incluye todas las filas de las sentencias SELECT, incluyendo las duplicadas.
  • INTERSECT devuelve sólo las filas que son comunes a todas las sentencias SELECT. Se exige la compatibilidad del número de columnas, el orden y el tipo de datos.
  • EXCEPT (o MINUS) devuelve las filas de la primera sentencia SELECT que no están presentes en la(s) sentencia(s) SELECT posterior(es). Se exige la compatibilidad del número de columnas, el orden y el tipo de datos.

SELECT columna1, columna2 FROM tabla1 UNION SELECT columnaA, columnaB FROM tabla2;

13. ¿Qué son los índices y por qué se utilizan?

Los índices son tablas de búsqueda especiales que el motor de búsqueda de la base de datos puede utilizar para acelerar la recuperación de datos. En pocas palabras, un índice es un puntero a los datos de una tabla.

Se utilizan porque, sin índices, la base de datos tendría que escanear toda la tabla para encontrar las filas relevantes, lo que puede ser muy lento para las tablas grandes. Los índices ayudan a reducir drásticamente el número de registros que el servidor de la base de datos necesita examinar para satisfacer una consulta. Mejoran el rendimiento de las consultas, especialmente para las cláusulas WHERE, las operaciones JOIN y las cláusulas ORDER BY. Sin embargo, los índices pueden ralentizar las operaciones INSERT, UPDATE y DELETE porque el índice también necesita ser actualizado.

14. ¿Cómo se pueden evitar las vulnerabilidades de inyección SQL?

Para evitar las vulnerabilidades de inyección SQL, priorice el uso de consultas parametrizadas (también conocidas como sentencias preparadas). Estas tratan las entradas del usuario como datos, no como código ejecutable, lo que impide la inyección de SQL malicioso. Siempre sanee las entradas del usuario, aunque esto debería ser secundario a las consultas parametrizadas.

Específicamente, evite concatenar directamente la entrada del usuario en las consultas SQL. Si debe construir consultas dinámicamente, escape correctamente la entrada del usuario de acuerdo con las reglas de escape de la base de datos. Use un marco ORM (mapeador objeto-relacional), ya que a menudo tienen protección integrada contra la inyección SQL. Emplee cuentas de usuario de base de datos con los privilegios mínimos requeridos. Además, aplique consistentemente parches de seguridad al software del servidor de la base de datos.

15. Describe el concepto de normalización de bases de datos.

La normalización de bases de datos es el proceso de organizar los datos en una base de datos para reducir la redundancia y mejorar la integridad de los datos. Normalmente implica dividir una base de datos en dos o más tablas y definir las relaciones entre las tablas. El objetivo es aislar los datos de modo que las modificaciones de un atributo se puedan realizar en una sola tabla y propagarse a través del resto de la base de datos a través de las relaciones definidas.

La normalización generalmente implica dividir las tablas en tablas más pequeñas y menos redundantes y definir claves externas. Hay varias formas normales (1FN, 2FN, 3FN, FNCB, etc.), cada una construida sobre la anterior. Cada forma normal tiene reglas específicas sobre las dependencias y redundancias que deben abordarse. Lograr formas normales más altas generalmente conduce a más tablas y consultas más complejas, pero garantiza la consistencia de los datos y reduce el riesgo de anomalías durante la modificación de los datos.

16. ¿Cuáles son las diferentes formas normales en el diseño de bases de datos?

La normalización de bases de datos reduce la redundancia de datos y mejora la integridad de los datos al organizar los datos en tablas de tal manera que las restricciones de la base de datos apliquen adecuadamente las dependencias. Las diferentes formas normales son:

  • 1FN (Primera Forma Normal): Elimina los grupos de datos repetidos. Cada columna debe contener solo valores atómicos y debe haber una clave principal.
  • 2FN (Segunda Forma Normal): Debe estar en 1FN y elimina los datos redundantes al asegurar que cada atributo que no es clave dependa funcionalmente por completo de la clave principal completa. Solo es relevante cuando la clave principal es compuesta.
  • 3FN (Tercera Forma Normal): Debe estar en 2FN y elimina las dependencias transitivas. Ningún atributo que no sea clave debe depender de otro atributo que no sea clave.
  • FNBC (Forma Normal de Boyce-Codd): Una versión más fuerte de 3FN. Cada determinante debe ser una clave candidata.
  • 4FN (Cuarta Forma Normal): Debe estar en FNBC y elimina las dependencias multivaluadas.
  • 5FN (Quinta Forma Normal): Debe estar en 4FN y elimina la redundancia al aislar las múltiples relaciones semánticamente relacionadas.

17. ¿Cómo se hace una copia de seguridad y se restaura una base de datos?

La copia de seguridad y la restauración de bases de datos son cruciales para la protección de datos y la recuperación ante desastres. Las copias de seguridad implican crear una copia de la base de datos, mientras que la restauración usa esa copia para recuperar la base de datos a un estado anterior.

Los métodos comunes incluyen: 1. Copias de seguridad lógicas: Exportar el esquema y los datos de la base de datos a un archivo (por ejemplo, usando mysqldump para MySQL o pg_dump para PostgreSQL). 2. Copias de seguridad físicas: Copiar los archivos de datos subyacentes (por ejemplo, usando instantáneas del sistema de archivos o herramientas especializadas). La restauración normalmente implica importar el archivo de copia de seguridad lógica o restaurar los archivos de datos físicos. Las copias de seguridad incrementales pueden optimizar el tiempo y el espacio de la copia de seguridad al hacer una copia de seguridad solo de los cambios desde la última copia de seguridad. Siempre verifique las copias de seguridad para garantizar la integridad.

18. ¿Qué son las transacciones en SQL? ¿Por qué son importantes?

Las transacciones en SQL son una secuencia de una o más operaciones SQL (por ejemplo, INSERT, UPDATE, DELETE) tratadas como una única unidad lógica de trabajo. O todas las operaciones dentro de la transacción tienen éxito, o ninguna de ellas lo hace. Esta propiedad de "todo o nada" también se conoce como atomicidad.

Son importantes porque aseguran la consistencia e integridad de los datos. Si un sistema falla a mitad de una serie de operaciones, las transacciones garantizan que la base de datos volverá a su estado consistente anterior, evitando la corrupción de datos y asegurando la confiabilidad. Las transacciones se adhieren a las propiedades ACID: Atomicidad, Consistencia, Aislamiento y Durabilidad. Sin transacciones, el acceso concurrente y las fallas parciales podrían conducir a datos inconsistentes y poco confiables.

19. Explique las propiedades ACID de una transacción de base de datos.

Las propiedades ACID garantizan transacciones de base de datos fiables. Atomicidad significa que una transacción se trata como una única unidad de trabajo indivisible; o se aplican todos los cambios, o no se aplica ninguno. Consistencia garantiza que una transacción transforma la base de datos de un estado válido a otro, adhiriéndose a las reglas y restricciones definidas. Aislamiento dicta que las transacciones concurrentes no deben interferir entre sí, apareciendo como si se ejecutaran secuencialmente. Durabilidad garantiza que una vez que se confirma una transacción, sus cambios se almacenan permanentemente y sobrevivirán incluso a fallos del sistema.

Por ejemplo, en una transacción bancaria de transferencia de fondos, la atomicidad asegura que si la deducción de fondos de una cuenta falla, los fondos no se acrediten a la otra cuenta. La consistencia asegura que el saldo total en todas las cuentas permanezca correcto. El aislamiento evita que otra transacción lea el saldo de una cuenta a mitad de la transferencia. La durabilidad asegura que una vez confirmada la transferencia, los cambios persistirán incluso si el servidor de la base de datos se bloquea inmediatamente después.

20. ¿Qué es un procedimiento almacenado?

Un procedimiento almacenado es una colección precompilada de sentencias SQL almacenadas bajo un nombre y ejecutadas como una unidad. Piense en ello como un mini-programa o función dentro de una base de datos. Los procedimientos almacenados pueden aceptar parámetros de entrada, realizar operaciones como la recuperación o modificación de datos, y devolver valores de salida. Son útiles para encapsular lógica compleja, mejorar el rendimiento al reducir el tráfico de red y la sobrecarga de análisis, y mejorar la seguridad al otorgar permisos para ejecutar el procedimiento en lugar de acceder directamente a las tablas subyacentes.

Los beneficios de usar procedimientos almacenados incluyen:

  • Reducción del tráfico de red: Solo la llamada al procedimiento se envía a través de la red.
  • Seguridad mejorada: Se puede otorgar acceso a los procedimientos en lugar de a las tablas.
  • Reutilización de código: Los procedimientos se pueden llamar desde múltiples aplicaciones.
  • Mejor rendimiento: Los procedimientos almacenados están precompilados, lo que significa que se analizan y optimizan cuando se crean.

21. ¿Qué son las vistas en SQL?

En SQL, una vista es una tabla virtual basada en el conjunto de resultados de una declaración SQL. Es esencialmente una consulta almacenada. Las vistas no almacenan datos físicamente; en cambio, proporcionan una forma de ver las tablas subyacentes de una manera específica y personalizada.

Las vistas pueden simplificar consultas complejas, ocultar la complejidad de los datos a los usuarios y restringir el acceso a ciertas columnas o filas. También promueven la independencia de los datos, por lo que los cambios en la estructura de la tabla subyacente no necesariamente requieren cambios en las aplicaciones que utilizan la vista. Las vistas pueden ser de solo lectura o actualizables, dependiendo de su complejidad y del sistema de base de datos.

22. Explique la diferencia entre índices agrupados y no agrupados.

Los índices agrupados determinan el orden físico de los datos en una tabla. Solo puede haber un índice agrupado por tabla porque los datos solo se pueden ordenar físicamente de una manera. Piense en ello como una guía telefónica donde las entradas se ordenan físicamente por apellido.

Los índices no agrupados, por otro lado, son como crear una tabla de búsqueda separada que hace referencia a los datos reales. Una tabla puede tener múltiples índices no agrupados. Contienen las columnas indexadas y un puntero a la fila de datos real (ya sea el ID de la fila para una tabla de montón o la clave del índice agrupado para una tabla con un índice agrupado). Esto es como el índice al final de un libro de texto, que apunta a páginas específicas donde se encuentra la información.

23. ¿Cómo se puede optimizar una consulta SQL de ejecución lenta?

Para optimizar una consulta SQL de ejecución lenta, comience por usar EXPLAIN para comprender el plan de ejecución de la consulta e identificar los cuellos de botella. Luego:

  • Indexar adecuadamente: Agregar índices a las columnas usadas en las cláusulas WHERE, JOIN y ORDER BY.
  • Reescribir la consulta: Simplificar consultas complejas, evitar usar SELECT * y usar nombres de columna específicos.
  • Optimizar las uniones: Asegurar condiciones de unión eficientes y considerar usar INNER JOIN en lugar de OUTER JOIN cuando sea posible.
  • Limitar la recuperación de datos: Usar LIMIT para restringir el número de filas devueltas si solo se necesita un subconjunto.
  • Actualizar estadísticas: Asegurar que las estadísticas de la base de datos estén actualizadas para que el optimizador de consultas pueda tomar decisiones informadas. Por ejemplo, en Postgres ejecutar ANALYZE nombre_de_la_tabla.
  • Particionar tablas: Para tablas grandes, considerar la partición para mejorar el rendimiento de las consultas en rangos de datos específicos.

24. ¿Cuál es el propósito del operador EXISTS en SQL?

El operador EXISTS en SQL se usa para probar la existencia de filas en una subconsulta. Retorna TRUE si la subconsulta devuelve al menos una fila, y FALSE si la subconsulta no devuelve ninguna fila. A diferencia de otros operadores de subconsulta, EXISTS no compara valores entre la consulta externa y la subconsulta. Solo verifica la existencia de filas coincidentes.

Así es como funciona:

  • Se ejecuta la consulta externa.
  • Para cada fila en la consulta externa, se ejecuta la subconsulta en la cláusula EXISTS.
  • Si la subconsulta devuelve al menos una fila, EXISTS evalúa como TRUE, y la fila de la consulta externa se incluye en el conjunto de resultados. De lo contrario, si la subconsulta no devuelve filas, EXISTS evalúa como FALSE, y la fila de la consulta externa se excluye.

25. Describe un escenario donde podrías usar una auto-unión (self-join).

Una auto-unión es útil cuando necesitas comparar filas dentro de la misma tabla. Imagina una tabla de empleados que incluye el ID de cada empleado y el ID de su gerente. Para encontrar todos los empleados que reportan a un gerente específico, o para listar los empleados junto con los nombres de sus gerentes, una auto-unión es apropiada.

Por ejemplo, considera una tabla Empleados con columnas IDEmpleado, NombreEmpleado e IDGerente. Podrías usar una auto-unión como esta (usando SQL):

SELECT e.NombreEmpleado, m.NombreEmpleado AS NombreGerente FROM Empleados e JOIN Empleados m ON e.IDGerente = m.IDEmpleado;

Esto te permite recuperar el nombre de cada empleado junto con el nombre de su gerente, todo desde la misma tabla.

Preguntas de entrevista SQL intermedias

1. Explica la diferencia entre los tipos de datos CHAR y VARCHAR. ¿Cuándo elegirías uno sobre el otro?

CHAR y VARCHAR son tipos de datos de cadena que se utilizan para almacenar datos de caracteres, pero difieren en cómo manejan el almacenamiento. CHAR es un tipo de datos de longitud fija. Cuando defines una columna CHAR con una longitud de, digamos, 10, siempre ocupa 10 caracteres de almacenamiento, incluso si la cadena real almacenada es más corta. Cualquier espacio no utilizado se rellena con espacios. VARCHAR, por otro lado, es un tipo de datos de longitud variable. Solo usa el espacio de almacenamiento necesario para la cadena real almacenada, más una pequeña sobrecarga para almacenar la longitud de la cadena.

Elegirías CHAR cuando sabes que la longitud de la cadena siempre será la misma, como al almacenar abreviaturas de estados (por ejemplo, 'CA', 'NY'). Esto puede ofrecer ligeras ventajas de rendimiento debido a la longitud fija. VARCHAR es preferido cuando la longitud de la cadena varía significativamente, ya que conserva espacio de almacenamiento. Ejemplos incluyen nombres, direcciones o descripciones. Usar CHAR para datos de longitud variable puede desperdiciar una cantidad considerable de espacio. En muchos sistemas de bases de datos modernos, la diferencia de rendimiento entre CHAR y VARCHAR es insignificante, lo que convierte a VARCHAR en la opción más común debido a su eficiencia de almacenamiento.

2. ¿Cuál es el propósito de usar funciones de ventana en SQL, y puedes proporcionar un ejemplo de un escenario en el que serían beneficiosas?

Las funciones de ventana en SQL te permiten realizar cálculos en un conjunto de filas de la tabla que están relacionadas con la fila actual. A diferencia de las funciones agregadas (como SUM(), AVG(), COUNT()), las funciones de ventana no colapsan las filas en una única fila de resumen. En cambio,, devuelven un valor para cada fila en la consulta, basado en el marco de ventana especificado. Son extremadamente útiles para tareas como calcular totales acumulados, clasificar filas dentro de un grupo o calcular promedios móviles sin recurrir a subconsultas complejas o auto-uniones.

Por ejemplo, imagina que tienes una tabla de datos de ventas con columnas fecha, producto y monto_ventas. Podrías usar una función de ventana para calcular las ventas acumuladas de cada producto a lo largo del tiempo. La consulta SQL podría ser así: SELECT fecha, producto, monto_ventas, SUM(monto_ventas) OVER (PARTITION BY producto ORDER BY fecha) AS ventas_acumuladas FROM tabla_ventas;. En este caso, la función SUM() está operando como una función de ventana debido a la cláusula OVER(). Las ventas acumuladas de cada producto, hasta esa fecha, se muestran en una nueva columna ventas_acumuladas sin agrupar los datos.

3. Describe el uso de las expresiones de tabla comunes (CTE). ¿Cómo simplifican las consultas complejas?

Las Expresiones de Tabla Comunes (CTE) son conjuntos de resultados temporales con nombre que existen solo dentro del alcance de una única consulta. Se definen utilizando la cláusula WITH y pueden ser referenciadas múltiples veces dentro de esa consulta. Las CTEs ayudan a descomponer consultas complejas en partes más pequeñas, más manejables y legibles.

Las CTEs simplifican las consultas complejas al:

  • Mejorar la legibilidad: Al dar nombres significativos a los conjuntos de resultados intermedios, las CTE hacen que las consultas sean más fáciles de entender.
  • Desglosar la lógica: La lógica compleja se puede dividir en pasos más pequeños y lógicos, cada uno representado por una CTE.
  • Habilitar la recursión: Las CTE admiten consultas recursivas, que son útiles para recorrer datos jerárquicos.
  • Evitar la redundancia: Se puede hacer referencia a una CTE varias veces en una consulta, evitando la necesidad de repetir la misma lógica de subconsulta. Por ejemplo:

WITH SalesSummary AS ( SELECT ProductID, SUM(SalesAmount) AS TotalSales FROM SalesTable GROUP BY ProductID ) SELECT ProductID, TotalSales FROM SalesSummary WHERE TotalSales > 1000;

4. ¿Cómo se puede optimizar una consulta SQL de ejecución lenta? Mencione al menos tres técnicas.

Para optimizar una consulta SQL de ejecución lenta, considere estas técnicas:

  • Indexación: Agregue índices a las columnas que se usan con frecuencia en las cláusulas WHERE, las condiciones JOIN y las cláusulas ORDER BY. Los índices aceleran la recuperación de datos al permitir que la base de datos ubique rápidamente las filas que coinciden con los criterios de la consulta. Por ejemplo, CREATE INDEX idx_customer_id ON customers (customer_id);
  • Reescritura de consultas: Analice el plan de ejecución de la consulta y vuelva a escribirlo para un mejor rendimiento. Esto podría implicar el uso de EXISTS en lugar de DISTINCT, simplificar las operaciones JOIN complejas o evitar SELECT *. Optimice las subconsultas convirtiéndolas en uniones o usando tablas temporales. Revise el uso de funciones dentro de las cláusulas WHERE, ya que pueden impedir el uso del índice.
  • Analizar las estadísticas de la tabla: Asegúrese de que la base de datos tenga estadísticas actualizadas sobre las tablas. El optimizador de consultas utiliza estas estadísticas para elegir el plan de ejecución más eficiente. En PostgreSQL, esto se hace usando ANALYZE table_name;. En MySQL, se hace usando ANALYZE TABLE table_name;.

5. Explique el concepto de normalización en el diseño de bases de datos y por qué es importante.

La normalización de bases de datos es el proceso de organizar los datos para reducir la redundancia y mejorar la integridad de los datos. Implica dividir las bases de datos en tablas y definir las relaciones entre ellas. El objetivo es aislar los datos para que las modificaciones, como adiciones y eliminaciones, se puedan realizar en una sola tabla y luego propagarse al resto de la base de datos a través de las relaciones definidas.

La normalización es importante porque minimiza la redundancia de datos, lo que ahorra espacio de almacenamiento y reduce el riesgo de inconsistencias. También mejora la integridad de los datos, haciendo que la base de datos sea más confiable y fácil de mantener. Las bases de datos correctamente normalizadas soportan un mejor rendimiento de las consultas, porque hay menos datos para escanear y más oportunidades para la indexación.

6. ¿Cuáles son los diferentes tipos de joins disponibles en SQL? Describa sus diferencias con ejemplos.

Los joins de SQL se utilizan para combinar filas de dos o más tablas basadas en una columna relacionada entre ellas. Los tipos principales son:

  • INNER JOIN: Devuelve filas solo cuando hay una coincidencia en ambas tablas. SELECT * FROM TablaA INNER JOIN TablaB ON TablaA.columna = TablaB.columna;
  • LEFT (OUTER) JOIN: Devuelve todas las filas de la tabla izquierda (TablaA) y las filas coincidentes de la tabla derecha (TablaB). Si no hay coincidencia en TablaB, devuelve valores NULL para las columnas de TablaB. SELECT * FROM TablaA LEFT JOIN TablaB ON TablaA.columna = TablaB.columna;
  • RIGHT (OUTER) JOIN: Devuelve todas las filas de la tabla derecha (TablaB) y las filas coincidentes de la tabla izquierda (TablaA). Si no hay coincidencia en TablaA, devuelve valores NULL para las columnas de TablaA. SELECT * FROM TablaA RIGHT JOIN TablaB ON TablaA.columna = TablaB.columna;
  • FULL (OUTER) JOIN: Devuelve todas las filas cuando hay una coincidencia en la tabla izquierda (TablaA) o en la tabla derecha (TablaB). Combina los resultados de los JOIN externos LEFT y RIGHT. SELECT * FROM TablaA FULL OUTER JOIN TablaB ON TablaA.columna = TablaB.columna; (Nota: Algunas bases de datos como MySQL no admiten directamente FULL OUTER JOIN, pero pueden emularlo usando UNION ALL.)
  • CROSS JOIN: Devuelve el producto cartesiano de las tablas. Cada fila de la primera tabla se combina con cada fila de la segunda tabla. SELECT * FROM TablaA CROSS JOIN TablaB;

7. ¿Cómo manejas los valores NULL en las consultas SQL? Explica los operadores IS NULL e IS NOT NULL.

En SQL, NULL representa un valor faltante o desconocido, y requiere un manejo especial. Los operadores de comparación estándar (=, !=, >, <) no funcionan con NULL. Para verificar valores NULL, se utilizan los operadores IS NULL e IS NOT NULL.

IS NULL verifica si un valor es NULL. Por ejemplo, WHERE column_name IS NULL devolverá las filas donde column_name contiene un valor NULL. IS NOT NULL verifica si un valor no es NULL. La declaración WHERE column_name IS NOT NULL devolverá las filas donde column_name no contiene un valor NULL. No se pueden usar los operadores = o <> para encontrar o excluir con precisión valores NULL.

8. Explica la diferencia entre índices agrupados y no agrupados.

Un índice agrupado determina el orden físico de los datos en una tabla. Solo puede haber un índice agrupado por tabla porque los datos solo se pueden ordenar físicamente de una manera. Piense en ello como una guía telefónica ordenada por apellido; la disposición física es el índice. Los índices no agrupados, por otro lado, almacenan una copia separada del índice junto con un puntero a la fila de datos real. Una tabla puede tener múltiples índices no agrupados. Imagine una guía telefónica con un índice separado basado en el código de área; te apunta a la página relevante (fila de datos) en la guía telefónica principal.

Diferencias clave:

  • Agrupado: Determina el orden físico, uno por tabla.
  • No agrupado: Índice separado, se permiten múltiples, contiene punteros a las filas de datos. Debido a que los índices no agrupados implican una búsqueda adicional, tienden a ser más lentos que los índices agrupados.

9. ¿Qué son las funciones agregadas en SQL? Dé ejemplos y explique cómo usar la cláusula GROUP BY con ellas.

Las funciones agregadas en SQL realizan cálculos en un conjunto de filas y devuelven un único valor de resumen. Ejemplos comunes incluyen:

  • COUNT(): Devuelve el número de filas.
  • SUM(): Devuelve la suma de valores.
  • AVG(): Devuelve el valor promedio.
  • MIN(): Devuelve el valor mínimo.
  • MAX(): Devuelve el valor máximo.

La cláusula GROUP BY se utiliza con funciones agregadas para agrupar filas que tienen los mismos valores en una o más columnas. La función agregada se aplica luego a cada grupo individualmente. Por ejemplo, para encontrar el salario promedio para cada departamento:

SELECT departamento, AVG(salario) AS salario_promedio FROM empleados GROUP BY departamento;

10. Describa el propósito y el uso de subconsultas en SQL. Dé un ejemplo de escenario.

Las subconsultas en SQL son consultas anidadas dentro de otra consulta. Se utilizan para recuperar datos que se usarán en las condiciones o cálculos de la consulta principal. Una subconsulta puede aparecer en las cláusulas SELECT, FROM, WHERE o HAVING. El propósito es generalmente dividir consultas complejas en partes más manejables y legibles, y para realizar operaciones que son difíciles o imposibles de lograr con una sola consulta.

Por ejemplo, considere un escenario en el que desea encontrar todos los clientes que realizaron pedidos mayores que el tamaño promedio del pedido. Podría usar una subconsulta para calcular primero el tamaño promedio del pedido y luego usar ese resultado en la cláusula WHERE de la consulta principal para filtrar los clientes.

SELECT id_cliente, total_pedido FROM pedidos WHERE total_pedido > (SELECT AVG(total_pedido) FROM pedidos);

11. ¿Cómo se pueden prevenir los ataques de inyección SQL? ¿Qué son las consultas parametrizadas?

Los ataques de inyección SQL se pueden prevenir principalmente mediante el uso de consultas parametrizadas (también conocidas como sentencias preparadas) y empleando la validación de entrada y la codificación de salida.

Las consultas parametrizadas tratan las entradas del usuario como datos, no como código SQL ejecutable. En lugar de incrustar directamente la entrada del usuario en la cadena de consulta SQL, se utilizan marcadores de posición. El controlador de la base de datos envía entonces por separado la estructura de la consulta y los parámetros de entrada a la base de datos, que los combina de forma segura. Esto garantiza que, incluso si un usuario introduce código SQL malicioso como entrada, se tratará como una cadena literal y no se ejecutará. Por ejemplo, en Python, usando psycopg2, una consulta parametrizada se vería así: cur.execute("SELECT * FROM users WHERE username = %s", (username,)) donde username es la entrada proporcionada por el usuario.

12. Explique las propiedades ACID de una transacción de base de datos. ¿Por qué son importantes?

Las propiedades ACID son un conjunto de principios que garantizan que las transacciones de la base de datos se procesen de forma fiable. Son: Atomicidad (todas las operaciones tienen éxito o fracasan como una única unidad), Consistencia (la transacción mueve la base de datos de un estado válido a otro), Aislamiento (las transacciones concurrentes no interfieren entre sí) y Durabilidad (una vez que una transacción se ha confirmado, permanece así, incluso en caso de pérdida de energía o fallo del sistema).

Estas propiedades son cruciales porque garantizan la integridad y fiabilidad de los datos. Sin las propiedades ACID, una base de datos podría volverse inconsistente o corromperse, lo que llevaría a resultados imprecisos, pérdidas financieras u otros problemas graves. Por ejemplo, en un sistema bancario, una transferencia de fondos requiere atomicidad para evitar que se deduzca dinero de una cuenta sin que se acredite a otra, lo que garantiza la consistencia de los saldos de las cuentas. El aislamiento evita las condiciones de carrera donde múltiples transferencias interfieren entre sí. La durabilidad asegura que las transacciones completadas nunca se pierdan, incluso si el sistema se bloquea inmediatamente después de que se confirme la transacción.

13. ¿Cuál es la diferencia entre las sentencias DELETE, TRUNCATE y DROP en SQL?

DELETE, TRUNCATE y DROP son comandos SQL utilizados para eliminar datos o tablas enteras de una base de datos, pero funcionan de manera diferente.

  • DELETE elimina filas específicas de una tabla en función de una condición. Es un comando del Lenguaje de Manipulación de Datos (DML) y registra cada eliminación, lo que lo hace más lento. Se puede revertir. Sintaxis: DELETE FROM nombre_tabla WHERE condición;
  • TRUNCATE elimina todas las filas de una tabla. Es un comando del Lenguaje de Definición de Datos (DDL) y desasigna las páginas de datos. Es más rápido que DELETE ya que no registra las eliminaciones de filas individuales. TRUNCATE restablece la columna de identidad (auto-incremento). No se puede revertir. Sintaxis: TRUNCATE TABLE nombre_tabla;
  • DROP elimina toda la tabla (estructura y datos) de la base de datos. Es un comando DDL. Todos los privilegios e índices de la tabla también se eliminan. No se puede revertir. Sintaxis: DROP TABLE nombre_tabla;

14. ¿Cómo diseñaría un esquema de base de datos para una aplicación de comercio electrónico simple?

Un esquema de base de datos de comercio electrónico simple podría incluir tablas para users (usuarios), products (productos), orders (pedidos) y order_items (artículos_de_pedido). La tabla users almacenaría información del usuario (id, nombre, correo electrónico, contraseña, dirección). La tabla products almacenaría detalles del producto (id, nombre, descripción, precio, image_url). La tabla orders almacenaría información del pedido (id, user_id, order_date, total_amount, shipping_address). Finalmente, la tabla order_items vincularía los pedidos a los productos (order_id, product_id, quantity, price).

Relaciones:

  • Relación uno a muchos entre users y orders (un usuario puede tener múltiples pedidos).
  • Relación uno a muchos entre orders y order_items (un pedido puede tener múltiples elementos de pedido).
  • Relación muchos a uno entre order_items y products (múltiples elementos de pedido pueden referirse al mismo producto).

Claves:

  • Claves primarias para las columnas de identificación (id)
  • Las claves externas enlazan las tablas relacionadas

15. Explique el uso de la cláusula HAVING en SQL. ¿En qué se diferencia de la cláusula WHERE?

La cláusula HAVING en SQL se utiliza para filtrar los resultados de una consulta GROUP BY. Permite especificar condiciones que deben ser cumplidas por los propios grupos, en lugar de por filas individuales. Se utiliza para filtrar grupos basándose en funciones agregadas como COUNT, SUM, AVG, MIN o MAX aplicadas al grupo.

La diferencia clave entre HAVING y WHERE es cuándo se aplican. WHERE filtra las filas antes de que se produzca el agrupamiento, afectando así a qué filas se incluyen en los grupos. HAVING, por otro lado, filtra los grupos después de que se haya realizado el agrupamiento y la agregación. Esencialmente, WHERE filtra registros individuales, y HAVING filtra grupos de registros. Por ejemplo, la cláusula WHERE filtra las filas antes de cualquier agrupamiento, pero la cláusula HAVING filtra las filas después de que se haya aplicado la cláusula GROUP BY.

16. Describe la utilización de los operadores UNION y UNION ALL en SQL. ¿Cuál es la diferencia clave entre ellos?

Los operadores UNION y UNION ALL en SQL se utilizan para combinar los conjuntos de resultados de dos o más sentencias SELECT en un único conjunto de resultados. Ambos operadores requieren que las sentencias SELECT tengan el mismo número de columnas y tipos de datos compatibles para las columnas correspondientes.

La diferencia clave es que UNION elimina las filas duplicadas del conjunto de resultados combinado, mientras que UNION ALL incluye todas las filas, incluidas las duplicadas. Por lo tanto, UNION ALL es generalmente más rápido porque no tiene que realizar la eliminación de duplicados. Si sabe que sus conjuntos de resultados no contendrán duplicados, o si no le importan los duplicados, UNION ALL es la opción preferida por razones de rendimiento.

17. ¿Cómo se crea un procedimiento almacenado en SQL? ¿Cuáles son los beneficios de usar procedimientos almacenados?

Para crear un procedimiento almacenado en SQL, se utiliza la sentencia CREATE PROCEDURE seguida del nombre del procedimiento, cualquier parámetro de entrada y el código SQL a ejecutar. Por ejemplo:

CREATE PROCEDURE GetCustomerByID (@CustomerID INT) AS BEGIN SELECT * FROM Customers WHERE CustomerID = @CustomerID END

Los beneficios de usar procedimientos almacenados incluyen:

  • Rendimiento Mejorado: Los procedimientos almacenados están precompilados y almacenados en el servidor de la base de datos, lo que reduce la sobrecarga de análisis y compilación.
  • Seguridad Mejorada: Pueden ayudar a prevenir ataques de inyección SQL encapsulando el código SQL y controlando el acceso.
  • Reutilización de Código: Los procedimientos almacenados se pueden llamar varias veces desde diferentes aplicaciones, lo que reduce la duplicación de código.
  • Tráfico de Red Reducido: Solo se envía la llamada al procedimiento a través de la red, en lugar de todo el código SQL.
  • Mantenimiento Simplificado: Los cambios en la lógica de la base de datos se pueden realizar en un solo lugar (el procedimiento almacenado) sin afectar a las aplicaciones que lo llaman.

18. Explique el concepto de disparadores de base de datos. Proporcione un ejemplo de cuándo podría usar un disparador.

Los disparadores de base de datos son procedimientos almacenados especiales que se ejecutan automáticamente en respuesta a ciertos eventos en una tabla o vista. Estos eventos pueden ser operaciones INSERT, UPDATE o DELETE. Los disparadores se utilizan para hacer cumplir reglas de negocio, mantener la integridad de los datos, auditar cambios o reaccionar a modificaciones de datos. Se pueden ejecutar BEFORE (ANTES) o AFTER (DESPUÉS) de que ocurra el evento.

Un ejemplo de cuándo podrías usar un disparador es para crear automáticamente un registro de auditoría cada vez que se actualiza una fila en una tabla Empleados. Este disparador capturaría los valores antiguos y nuevos de la fila modificada y los insertaría en una tabla RegistroAuditoriaEmpleados. Esto ayuda a rastrear los cambios de datos y con fines de auditoría. Aquí hay un poco de código SQL de ejemplo:

CREATE TRIGGER EmployeeUpdateTrigger AFTER UPDATE ON Employees FOR EACH ROW BEGIN INSERT INTO EmployeeAuditLog (EmployeeID, OldSalary, NewSalary, UpdateDate) VALUES (OLD.EmployeeID, OLD.Salary, NEW.Salary, NOW()); END;

19. ¿Cuál es el propósito de usar la instrucción EXPLAIN antes de una consulta SQL? ¿Cómo puede ayudar con la optimización?

La instrucción EXPLAIN en SQL se utiliza para analizar el plan de ejecución de una consulta sin ejecutarla realmente. Muestra cómo la base de datos tiene la intención de ejecutar la consulta, incluyendo las tablas a las que accederá, los índices que podría usar, el orden de las uniones y el número estimado de filas a procesar. Esto es crucial para comprender las características de rendimiento de la consulta.

Al examinar la salida de EXPLAIN, puede identificar posibles cuellos de botella, como:

  • Índices faltantes: Indicado por escaneos completos de la tabla en lugar de búsquedas de índice.
  • Órdenes de unión ineficientes: La base de datos podría estar uniendo tablas en un orden subóptimo.
  • Uso de tablas temporales: La base de datos podría estar creando tablas temporales en la memoria o en el disco, lo cual puede ser lento.
  • Escaneos completos de la tabla: Evitar el uso de índices puede ser un asesino de rendimiento.

Basado en el análisis, puedes optimizar la consulta agregando índices, reescribiendo la consulta para usar uniones más eficientes o simplificando subconsultas complejas. Por ejemplo, si EXPLAIN muestra un escaneo completo de la tabla, agregar un índice en la columna relevante podría mejorar significativamente el rendimiento. Específicamente, EXPLAIN SELECT * FROM users WHERE email = 'test@example.com'; podría revelar que la columna de correo electrónico necesita un índice.

20. ¿Cómo se gestionan los problemas de concurrencia en un entorno de base de datos? Explique conceptos como el bloqueo.

Los problemas de concurrencia en un entorno de base de datos surgen cuando múltiples usuarios o aplicaciones intentan acceder y modificar los mismos datos simultáneamente, lo que lleva a problemas de inconsistencia o integridad de los datos. Se emplean varias técnicas para gestionar estos problemas, siendo el bloqueo un mecanismo principal. El bloqueo evita que múltiples transacciones accedan a los mismos datos de forma concurrente. Existen diferentes tipos de bloqueos, como:

  • Bloqueos exclusivos (bloqueos de escritura): Estos bloqueos evitan que cualquier otra transacción lea o escriba en los datos.
  • Bloqueos compartidos (bloqueos de lectura): Permiten que múltiples transacciones lean los datos, pero evitan que cualquier transacción escriba en ellos.

Otras técnicas de control de concurrencia incluyen el bloqueo optimista (versionado), marcas de tiempo y control de concurrencia de múltiples versiones (MVCC). El bloqueo optimista asume que los conflictos son raros, por lo que solo verifica los conflictos en el momento de la escritura, lo que potencialmente revierte las transacciones si ocurren conflictos. MVCC crea instantáneas de los datos, por lo que los lectores y escritores no se bloquean entre sí.

Preguntas avanzadas de entrevista de SQL

1. Explique cómo optimizar una consulta SQL de bajo rendimiento. ¿Cuáles son los pasos clave que tomaría?

Para optimizar una consulta SQL de bajo rendimiento, comenzaría por comprender el problema. Primero, usaría EXPLAIN para analizar el plan de ejecución de la consulta. Esto ayuda a identificar cuellos de botella como escaneos de tabla completos o índices faltantes. Basado en el análisis, me enfocaría en algunas áreas clave:

  • Indexación: Asegúrese de que existan los índices apropiados en las columnas utilizadas en las cláusulas WHERE, las condiciones JOIN y las cláusulas ORDER BY. Los índices incorrectos o faltantes son un problema común de rendimiento.
  • Estructura de la consulta: Revise la consulta en busca de posibles ineficiencias. Esto incluye evitar SELECT *, optimizar el orden JOIN (especialmente para tablas grandes) y reescribir subconsultas o subconsultas correlacionadas cuando sea posible (a veces usando operaciones JOIN o tablas temporales en su lugar).
  • Tipos de datos: Verifique que los tipos de datos utilizados en WHERE y JOIN coincidan. Las conversiones implícitas pueden obstaculizar el uso de índices.
  • Estadísticas: Asegúrese de que la base de datos tenga estadísticas actualizadas sobre las tablas involucradas. Esto permite que el optimizador de consultas tome mejores decisiones.
  • Hardware/Configuración: Ocasionalmente, las consultas lentas indican problemas con el hardware del servidor de la base de datos (por ejemplo, memoria insuficiente, E/S de disco lenta) o la configuración. Ajustar configuraciones como el tamaño del grupo de búferes a veces puede ayudar.

2. Describa la diferencia entre los índices agrupados y no agrupados en SQL.

Un índice agrupado determina el orden físico de los datos en una tabla. Una tabla solo puede tener un índice agrupado porque los datos en sí mismos solo pueden ordenarse en un orden físico. Piense en ello como una guía telefónica ordenada por apellido; el libro físico está ordenado.

Los índices no agrupados, por otro lado, son como una tabla de búsqueda separada que apunta a la ubicación real de los datos. Una tabla puede tener múltiples índices no agrupados. Es como un índice en la parte posterior de un libro de texto; apunta a las páginas que contienen temas específicos sin reordenar todo el libro.

3. ¿Cómo se manejan los interbloqueos en SQL Server? Explique con ejemplos de escenarios.

Los interbloqueos se producen cuando dos o más procesos de SQL Server se bloquean indefinidamente, cada uno esperando un recurso que el otro tiene. Para manejar los interbloqueos, SQL Server elige automáticamente uno de los procesos como víctima y lo termina, permitiendo que el otro(s) proceso(s) continúe(n). La transacción de la víctima se revierte. Esto se llama detección y resolución de interbloqueos.

Por ejemplo, considere dos transacciones: la transacción A quiere actualizar la tabla X y luego la tabla Y, mientras que la transacción B quiere actualizar la tabla Y y luego la tabla X. Si la transacción A adquiere un bloqueo en la tabla X y la transacción B adquiere un bloqueo en la tabla Y, y luego la transacción A intenta adquirir un bloqueo en la tabla Y (bloqueada por B) y la transacción B intenta adquirir un bloqueo en la tabla X (bloqueada por A), se produce un interbloqueo. SQL Server eliminará uno de los procesos (A o B), revertirá los cambios y proporcionará el error 1205. Las estrategias para la prevención incluyen: Acceder a las tablas en el mismo orden en todas las transacciones concurrentes, usar transacciones más cortas, reducir los niveles de aislamiento (con consideración) y usar conexiones enlazadas.

4. ¿Cuáles son las ventajas y desventajas de usar procedimientos almacenados?

Las ventajas de los procedimientos almacenados incluyen un mejor rendimiento debido a la precompilación y ejecución en el servidor de la base de datos, la reducción del tráfico de red ya que solo se envía la llamada al procedimiento, la mayor seguridad al otorgar acceso a los procedimientos en lugar de a las tablas subyacentes y la reutilización del código en múltiples aplicaciones. También proporcionan consistencia de datos al centralizar la lógica de acceso a datos.

Las desventajas incluyen una mayor complejidad de mantenimiento, la posible dependencia del proveedor ya que los lenguajes de procedimientos almacenados son específicos de la base de datos (por ejemplo, T-SQL para SQL Server, PL/SQL para Oracle) y dificultades de depuración en comparación con el código de la aplicación. Los procedimientos almacenados también pueden aumentar la carga en el servidor de la base de datos, especialmente si no están optimizados, y el control de versiones puede ser más difícil. Es posible que no sean adecuados para consultas simples que se manejan de manera más eficiente con ORMs.

5. Explique las funciones de ventana en SQL y proporcione ejemplos de cómo se pueden usar.

Las funciones de ventana en SQL realizan cálculos en un conjunto de filas de la tabla que están relacionadas con la fila actual. Este conjunto de filas se llama "ventana". A diferencia de las funciones agregadas que agrupan filas en una sola fila de salida, las funciones de ventana conservan las filas individuales mientras proporcionan información agregada o clasificada.

Algunos ejemplos comunes incluyen:

  • ROW_NUMBER(): Asigna un entero secuencial único a cada fila dentro de una partición de un conjunto de resultados.

SELECT employee_id, department, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as row_num FROM employees;

  • RANK(): Asigna una clasificación a cada fila dentro de una partición en función del orden especificado. Las filas con el mismo valor reciben la misma clasificación y la siguiente clasificación se omite.

SELECCIONE nombre_producto, categoría, precio, RANK() OVER (PARTITION BY categoría ORDER BY precio DESC) AS rango_precio FROM productos;

  • SUM(), AVG(), MIN(), MAX(): Pueden usarse como funciones de ventana para calcular agregaciones sobre una ventana. Por ejemplo, calcular una suma acumulativa de ventas:

SELECCIONE fecha_orden, ventas, SUM(ventas) OVER (ORDER BY fecha_orden) AS ventas_acumuladas FROM ordenes;

6. Describa los diferentes niveles de aislamiento en SQL Server y cómo afectan la concurrencia.

SQL Server define niveles de aislamiento que controlan el grado en que las transacciones están aisladas de las modificaciones de otras. Los niveles de aislamiento más altos reducen la concurrencia pero proporcionan una mayor consistencia de datos. Los niveles de aislamiento clave incluyen:

  • Read Uncommitted (Lectura sin confirmar): Permite lecturas sucias (lectura de datos sin confirmar). Mayor concurrencia, menor consistencia de datos.
  • Read Committed (Lectura confirmada): Evita lecturas sucias; solo lee datos confirmados. Un valor predeterminado común.
  • Repeatable Read (Lectura repetible): Evita lecturas sucias y lecturas no repetibles (asegura que si una transacción lee una fila varias veces, verá los mismos datos cada vez).
  • Serializable (Serializable): El nivel de aislamiento más alto; evita lecturas sucias, lecturas no repetibles y lecturas fantasma (asegura que una consulta ejecutada varias veces devolverá el mismo conjunto de resultados). Menor concurrencia debido al bloqueo intensivo.
  • Snapshot (Instantánea): Utiliza el versionado de filas para proporcionar consistencia transaccional. Los lectores no bloquean a los escritores y los escritores no bloquean a los lectores. Sin embargo, puede encontrar conflictos de actualización.

7. ¿Cómo puedes implementar la paginación en consultas SQL?

La paginación en SQL se puede implementar usando las cláusulas LIMIT y OFFSET. LIMIT especifica el número máximo de filas a devolver, mientras que OFFSET especifica el número de filas a omitir desde el principio del conjunto de resultados.

Por ejemplo, para obtener la segunda página de resultados con un tamaño de página de 10, usarías: SELECT * FROM table_name ORDER BY some_column LIMIT 10 OFFSET 10;. Ten en cuenta que diferentes bases de datos tienen una sintaxis ligeramente diferente (por ejemplo, SQL Server usa las cláusulas ROW_NUMBER() y FETCH NEXT, y algunas versiones más antiguas pueden no ser compatibles con OFFSET). Siempre incluye una cláusula ORDER BY para garantizar resultados de paginación consistentes.

8. Explica el propósito de las sugerencias de consulta y cuándo podrías usarlas.

Las sugerencias de consulta son instrucciones dadas al optimizador de la base de datos para influir en el plan de ejecución de una consulta. Si bien el optimizador generalmente selecciona el plan más eficiente, hay situaciones en las que podría tomar decisiones subóptimas. Las sugerencias proporcionan una forma de anular el comportamiento predeterminado del optimizador y obligarlo a usar un índice específico, un orden de unión u otras estrategias.

Usa las sugerencias de consulta con prudencia. Los casos de uso comunes incluyen:

  • Forzando el uso del índice: Cuando el optimizador no elige el mejor índice para una consulta en particular, una sugerencia puede indicarle que use un índice específico, mejorando el rendimiento.
  • Optimización del orden de las uniones: En consultas complejas con múltiples uniones, las sugerencias pueden controlar el orden en que se unen las tablas, reduciendo potencialmente el tiempo total de ejecución.
  • Pruebas y depuración: Las sugerencias se pueden usar para experimentar con diferentes planes de ejecución e identificar cuellos de botella de rendimiento.
  • Evitando las limitaciones del optimizador: Ocasionalmente, los optimizadores tienen limitaciones que les impiden elegir el plan ideal. Las sugerencias pueden solucionar estas limitaciones. Tenga en cuenta que depender en gran medida de las sugerencias puede hacer que las consultas sean frágiles, ya que los cambios en la distribución de datos o el esquema pueden invalidar los supuestos en los que se basan las sugerencias, lo que lleva a regresiones de rendimiento. Deben usarse como último recurso cuando se hayan agotado otras técnicas de optimización. Ejemplo de SQL Server: SELECT * FROM table1 WITH (INDEX(index_name)) WHERE condition;

9. ¿Cómo diseñaría un esquema de base de datos SQL para un sitio web de comercio electrónico?

Un esquema de base de datos de comercio electrónico generalmente involucra varias tablas, incluyendo usuarios, productos, pedidos, artículos_de_pedido y categorías. La tabla usuarios almacena información del usuario (user_id, nombre_de_usuario, contraseña, correo electrónico, dirección, etc.). La tabla productos almacena detalles del producto (product_id, nombre, descripción, precio, category_id, etc.). La tabla categorías almacena información de la categoría (category_id, nombre). La tabla pedidos almacena detalles del pedido (order_id, user_id, fecha_del_pedido, monto_total, dirección_de_envío, etc.). La tabla artículos_de_pedido actúa como una tabla de unión para manejar la relación de muchos a muchos entre pedidos y productos (order_id, product_id, cantidad, precio). Las claves externas se utilizan para establecer relaciones entre estas tablas (por ejemplo, user_id en pedidos hace referencia a usuarios.user_id).

Los índices son cruciales para el rendimiento; deben agregarse en columnas consultadas con frecuencia como user_id en orders, product_id en order_items y category_id en products. Los tipos de datos deben elegirse apropiadamente (por ejemplo, INT para IDs, VARCHAR para nombres, DECIMAL para precios, TIMESTAMP para fechas). Las consideraciones para la escalabilidad pueden involucrar el particionamiento o la replicación de la base de datos a medida que el sitio crece. El uso de los principios de normalización puede reducir la redundancia de datos y mejorar la integridad de los datos.

10. Describa las vulnerabilidades comunes de inyección SQL y cómo prevenirlas.

Las vulnerabilidades de inyección SQL ocurren cuando la entrada proporcionada por el usuario se incorpora directamente en las consultas SQL sin la sanitización o validación adecuadas. Los tipos comunes incluyen:

  • Inyección basada en cadenas: Manipulación de literales de cadena dentro de una consulta (por ejemplo, ' OR '1'='1).
  • Inyección basada en números: Inyección de valores numéricos maliciosos para omitir las comprobaciones.
  • Inyección ciega basada en booleanos: Inferir información basada en la veracidad de las condiciones inyectadas.
  • Inyección ciega basada en tiempo: Inferir información observando los retrasos causados ​​por los comandos inyectados (por ejemplo, WAITFOR DELAY '0:0:5').

Para prevenir la inyección SQL:

  • Usar consultas parametrizadas (sentencias preparadas): Estas tratan la entrada del usuario como datos, no como código. Ejemplo (Python):

cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))

  • Validación y saneamiento de entradas: Validar tipos, longitudes y patrones de entrada. Sanear escapando caracteres especiales.
  • Principio del mínimo privilegio: Otorgar a los usuarios de la base de datos solo los permisos necesarios.
  • Usar un ORM (Mapeador Objeto-Relacional): Los ORM a menudo manejan la construcción de consultas y la parametrización automáticamente, reduciendo el riesgo de inyección.

11. ¿Qué son las expresiones de tabla comunes (CTEs) y cómo pueden ser útiles?

Las Expresiones de Tabla Comunes (CTEs) son conjuntos de resultados temporales y con nombre que se pueden definir dentro de una única sentencia SQL (como SELECT, INSERT, UPDATE o DELETE). Piense en ellas como vistas temporales que existen solo durante la duración de la consulta.

Las CTEs son útiles para:

  • Mejorar la legibilidad: Dividir consultas complejas en bloques más pequeños y lógicos.
  • Simplificar consultas recursivas: Las CTEs se utilizan a menudo para manejar datos jerárquicos, por ejemplo, para recorrer un organigrama.
  • Referenciar una tabla varias veces en la misma consulta: Evitar subconsultas redundantes.
  • Organizar el código: Hacer que el código SQL sea más fácil de entender y mantener.

12. ¿Cómo optimizaría una consulta SQL que involucra múltiples uniones (joins)?

Para optimizar una consulta SQL con múltiples uniones (joins), se pueden emplear varias estrategias. Primero, asegúrese de que existan índices apropiados en las columnas de unión; esto acelera significativamente el proceso de coincidencia. Analice el plan de ejecución de la consulta utilizando herramientas como EXPLAIN para identificar cuellos de botella, como los escaneos completos de tablas.

Reescriba la consulta para minimizar la cantidad de datos que se unen y procesan. Esto puede implicar filtrar temprano en el proceso utilizando cláusulas WHERE para reducir el tamaño de los conjuntos de resultados intermedios antes de que ocurran las uniones. Considere reescribir el orden de las uniones, ya que el optimizador de la base de datos no siempre puede elegir el más eficiente. A veces, el uso de tablas temporales o Expresiones de Tabla Común (CTE) puede dividir consultas complejas en partes más pequeñas y manejables, mejorando el rendimiento. Por ejemplo, materialice una pequeña tabla intermedia usando un CTE antes de unirla con una tabla más grande.

13. Explique el concepto de normalización y desnormalización en el diseño de bases de datos.

La normalización es el proceso de organizar datos en una base de datos para reducir la redundancia y mejorar la integridad de los datos. Típicamente implica dividir tablas grandes en tablas más pequeñas y manejables, y definir relaciones entre ellas. Esto ayuda a minimizar la duplicación de datos y asegura que los datos se almacenen de forma consistente en toda la base de datos. La desnormalización, por otro lado, es el proceso de agregar redundancia de nuevo a una base de datos para mejorar el rendimiento de lectura. Esto podría implicar la combinación de tablas o la adición de columnas duplicadas para evitar uniones complejas durante las consultas. Si bien puede acelerar las operaciones de lectura, la desnormalización también puede aumentar el riesgo de inconsistencias de datos y hacer que el mantenimiento de datos sea más complejo. Un diseñador de bases de datos debe sopesar cuidadosamente los beneficios de un mejor rendimiento de lectura frente a los costos potenciales de una mayor redundancia de datos y complejidad al considerar la desnormalización.

14. Describa los diferentes tipos de uniones SQL y sus casos de uso.

Las uniones SQL se utilizan para combinar filas de dos o más tablas basándose en una columna relacionada entre ellas. Los diferentes tipos de uniones incluyen: INNER JOIN (devuelve filas solo cuando hay una coincidencia en ambas tablas), LEFT JOIN (devuelve todas las filas de la tabla izquierda y las filas coincidentes de la tabla derecha, rellenando con NULLs para las no coincidentes), RIGHT JOIN (devuelve todas las filas de la tabla derecha y las filas coincidentes de la tabla izquierda, rellenando con NULLs para las no coincidentes), y FULL OUTER JOIN (devuelve todas las filas cuando hay una coincidencia en la tabla izquierda o derecha, rellenando con NULLs para las no coincidentes). Un CROSS JOIN devuelve el producto cartesiano de los conjuntos de filas de las tablas unidas.

Los casos de uso varían. INNER JOIN es ideal para recuperar datos relacionados que existen en ambas tablas. LEFT JOIN es útil cuando se necesitan todos los registros de una tabla y la información coincidente de otra, incluso si no siempre existe una coincidencia. FULL OUTER JOIN se utiliza cuando se desean todos los registros de ambas tablas, independientemente de si coinciden. Finalmente, CROSS JOIN tiene casos de uso limitados, como generar todas las combinaciones posibles de datos; sin embargo, debe usarse con precaución, ya que puede producir conjuntos de resultados muy grandes.

15. ¿Cómo se gestionan los errores y las excepciones en los procedimientos almacenados SQL?

En los procedimientos almacenados SQL, el manejo de errores se logra principalmente mediante bloques TRY...CATCH. El código que podría generar un error se coloca dentro del bloque TRY. Si ocurre un error, el control se transfiere inmediatamente al bloque CATCH. Dentro del bloque CATCH, se pueden usar funciones como ERROR_NUMBER(), ERROR_MESSAGE(), ERROR_SEVERITY() y ERROR_STATE() para recuperar detalles sobre el error. Estos detalles se pueden registrar, usar para realizar operaciones de reversión o devolver a la aplicación que realiza la llamada.

Específicamente, después de detectar un error en el bloque CATCH, las acciones importantes usualmente involucran la reversión de transacciones si ocurrió modificación de datos y volver a lanzar el error (o un error personalizado) para informar al que llama. Esto evita enmascarar el problema original y permite a las aplicaciones que llaman manejar la situación apropiadamente. Usar RAISERROR dentro del bloque CATCH es un método común para volver a lanzar el error. También debe considerar implementar mecanismos de registro para registrar detalles de errores con propósitos de depuración y auditoría.

16. Explique los conceptos de almacenamiento de datos y su importancia.

El almacenamiento de datos es el proceso de recopilar y almacenar datos de varias fuentes en un repositorio central, típicamente para análisis e informes. Involucra procesos de extracción, transformación y carga (ETL) de datos para limpiar y estructurar los datos. Los datos se optimizan luego para propósitos de consulta e informes, a menudo utilizando un esquema de estrella o de copo de nieve.

El almacenamiento de datos es importante porque proporciona una única fuente de verdad para la inteligencia empresarial, lo que permite a las organizaciones obtener valiosos conocimientos sobre sus operaciones, el comportamiento de los clientes y las tendencias del mercado. Esto apoya una mejor toma de decisiones, una mejora en la previsión y un mejor rendimiento empresarial. Sin el almacenamiento de datos, analizar datos de fuentes dispares se vuelve complejo y consume mucho tiempo, lo que dificulta las estrategias empresariales efectivas.

17. ¿Cómo puede mejorar el rendimiento de la búsqueda de texto completo en SQL Server?

  • Utilice tipos de datos adecuados: Asegúrese de que las columnas que está buscando sean de tipos adecuados (por ejemplo, VARCHAR, NVARCHAR, TEXT, NTEXT).
  • Utilice índices de texto completo: Asegúrese de haber creado índices de texto completo en las columnas que está consultando. Optimícelos con listas de palabras vacías y configuraciones de idioma adecuadas.
  • Optimice las consultas: Utilice los predicados CONTAINS o FREETEXT de manera eficiente. Prefiera CONTAINSTABLE o FREETEXTTABLE cuando sea importante clasificar los resultados.
  • Mantenimiento regular de índices: Realice un mantenimiento regular de los índices para evitar la fragmentación. Programe reconstrucciones o reorganizaciones de índices durante las horas de menor actividad.
  • Optimice las palabras vacías: Personalice la lista de palabras vacías para eliminar palabras comunes específicas de su dominio que no agregan valor a los resultados de búsqueda. Esto reduce el tamaño del índice y mejora el rendimiento.
  • Aumente los recursos: Asigne suficiente memoria a SQL Server, ya que la búsqueda de texto completo consume mucha memoria. El almacenamiento más rápido (SSD) también puede mejorar significativamente el rendimiento.
  • Índices filtrados: Considere el uso de índices filtrados en las tablas subyacentes si el índice de texto completo se utiliza junto con filtros específicos. Esto permite que el optimizador elija un plan de ejecución más eficiente.
  • Particionamiento: Para tablas grandes, considere particionar la tabla y el índice de texto completo asociado. Esto puede mejorar la capacidad de gestión y el rendimiento de las consultas.

18. Describe el uso de los disparadores en SQL Server y sus posibles inconvenientes.

Los disparadores en SQL Server son procedimientos almacenados especiales que se ejecutan automáticamente en respuesta a ciertos eventos en una tabla o vista. Estos eventos pueden incluir operaciones INSERT, UPDATE o DELETE. Los disparadores se utilizan para la auditoría, la aplicación de la integridad de los datos o la reacción a los cambios de datos con lógica adicional. Por ejemplo, un disparador podría registrar automáticamente los cambios en una tabla o actualizar las tablas relacionadas cuando se elimina una fila. Los disparadores pueden ser AFTER (DESPUÉS), que se activan después del evento desencadenante, o INSTEAD OF (EN LUGAR DE), que reemplazan por completo el evento desencadenante.

Los posibles inconvenientes incluyen la sobrecarga de rendimiento, especialmente con lógica compleja. Los disparadores también pueden dificultar la depuración y la comprensión de las modificaciones de datos porque la lógica está oculta e implícita. Además, los disparadores en cascada pueden provocar comportamientos inesperados y problemas de rendimiento si no se diseñan cuidadosamente. La lógica compleja de los disparadores puede ser más difícil de mantener que los procedimientos almacenados explícitos o el código de la aplicación.

19. ¿Cómo diseñaría un esquema de base de datos para almacenar datos de series temporales?

Para los datos de series temporales, un enfoque común es utilizar una tabla con columnas para la marca de tiempo (timestamp), el nombre de la métrica y el valor. Por ejemplo:

CREATE TABLE datos_series_temporales ( timestamp TIMESTAMP NOT NULL, metric_name VARCHAR(255) NOT NULL, value DOUBLE PRECISION, PRIMARY KEY (timestamp, metric_name) );

Las consideraciones incluyen elegir un tipo de dato apropiado para el valor (por ejemplo, DOUBLE PRECISION, INTEGER), indexar la columna de marca de tiempo para una consulta eficiente y potencialmente particionar la tabla por rango de tiempo para mejorar el rendimiento y la capacidad de gestión, especialmente cuando se trata de grandes volúmenes de datos. Dependiendo de las características de los datos, un almacenamiento de columnas anchas o una base de datos especializada en series temporales (como InfluxDB o TimescaleDB) pueden ser más adecuados.

20. Explique el concepto de particionamiento de datos en SQL Server.

El particionamiento de datos en SQL Server divide tablas o índices grandes en piezas más pequeñas y manejables. Esto mejora el rendimiento de las consultas, la capacidad de gestión y la disponibilidad. SQL Server admite el particionamiento horizontal, donde las filas se dividen en múltiples particiones basadas en una función de particionamiento. Cada partición puede residir en un grupo de archivos diferente, potencialmente en diferentes discos o niveles de almacenamiento.

  • Rendimiento: Las consultas dirigidas a particiones específicas escanean menos datos, lo que lleva a una ejecución más rápida.
  • Gestionabilidad: Permite operaciones de archivo, copia de seguridad y mantenimiento más fáciles en particiones individuales.
  • Disponibilidad: Puede realizar operaciones de mantenimiento en una partición mientras que otras permanecen disponibles.

Por ejemplo, una tabla que contiene datos de ventas podría estar particionada por año. Las consultas para un año específico solo necesitarían acceder a la partición de ese año. SQL Server utiliza una función de particionamiento y un esquema de particionamiento para definir cómo se distribuyen los datos entre las particiones.

21. ¿Cómo implementaría la auditoría en una base de datos de SQL Server?

SQL Server ofrece varias formas de implementar la auditoría. SQL Server Audit es una función integrada que le permite rastrear eventos de la base de datos como modificaciones de datos, cambios de esquema o eventos de seguridad. Puede escribir registros de auditoría en archivos o en el registro de eventos de Windows. Puede definir especificaciones de auditoría a nivel de servidor o de base de datos para especificar qué acciones auditar.

Alternativamente, puede usar desencadenadores. Los desencadenadores pueden registrar automáticamente los cambios en tablas específicas en una tabla de auditoría. El desencadenador captura los valores anteriores y posteriores de los datos modificados, el usuario que realizó el cambio y la marca de tiempo. Este enfoque ofrece más flexibilidad para personalizar la información de auditoría, pero requiere más configuración y mantenimiento manuales, con consideraciones sobre la sobrecarga de rendimiento. Las tablas temporales también proporcionan auditoría automática, lo que le permite ver los cambios de datos a lo largo del tiempo.

22. Describa el papel del Agente SQL Server y sus casos de uso.

El Agente SQL Server es un servicio de Microsoft Windows que automatiza las tareas administrativas en SQL Server. Ejecuta trabajos programados que contienen scripts T-SQL, comandos de línea de comandos, paquetes SSIS y otras operaciones. Actúa como un programador de trabajos, monitor de eventos y sistema de alertas, liberando a los administradores de bases de datos (DBAs) de tareas manuales repetitivas.

Los casos de uso comunes incluyen:

  • Copias de seguridad de bases de datos: Programación de copias de seguridad regulares de bases de datos.
  • Mantenimiento de índices: Reconstrucción o reorganización de índices.
  • Actualizaciones de estadísticas: Actualización de estadísticas para la optimización de consultas.
  • Alertas: Envío de notificaciones basadas en eventos de SQL Server, como errores o umbrales de rendimiento.
  • Importación/exportación de datos: Automatización de las transferencias de datos entre sistemas.
  • Ejecución de procedimientos almacenados: Ejecución de procedimientos almacenados según una programación o en respuesta a eventos.
  • Envío de registros / Replicación: Automatización de tareas relacionadas con estas tecnologías.

23. ¿Cómo puede monitorear el rendimiento de SQL Server e identificar cuellos de botella?

El monitoreo del rendimiento de SQL Server involucra varias herramientas y técnicas. El Monitor de Actividad de SQL Server Management Studio (SSMS) proporciona una vista general en tiempo real del uso de los recursos del servidor. El Monitor de Rendimiento (PerfMon) permite rastrear varios contadores del sistema como la utilización de la CPU, la E/S del disco y el uso de la memoria. Extended Events (XEvents) captura información detallada sobre las operaciones del servidor, lo que permite un análisis en profundidad. El Asesor de Ajuste del Motor de Base de Datos analiza la carga de trabajo y recomienda mejoras en los índices y consultas.

Para identificar los cuellos de botella, analice las estadísticas de espera para determinar en qué recursos están esperando las consultas (por ejemplo, CPU, E/S, bloqueos). Busque consultas de larga duración utilizando sp_who2 o Vistas de Administración Dinámica (DMV) como sys.dm_exec_requests y sys.dm_exec_query_stats. Examine el uso de índices para identificar índices faltantes o no utilizados. Considere usar SQL Profiler (en desuso pero aún funcional) o Extended Events para rastrear consultas específicas y señalar problemas de rendimiento.

24. Explique los diferentes métodos para realizar copias de seguridad y restaurar una base de datos SQL Server.

SQL Server ofrece varios métodos para realizar copias de seguridad y restaurar bases de datos. El comando T-SQL BACKUP DATABASE realiza copias de seguridad, y RESTORE DATABASE realiza restauraciones. Existen diferentes tipos de copias de seguridad:

  • Copias de seguridad completas: Capturan toda la base de datos. Son la base para otros tipos de copias de seguridad.
  • Copias de seguridad diferenciales: Capturan los cambios desde la última copia de seguridad completa. Son más rápidas de crear que las copias de seguridad completas, pero requieren una copia de seguridad completa para restaurar.
  • Copias de seguridad del registro de transacciones: Capturan los registros del registro de transacciones. Se utilizan para restaurar a un punto específico en el tiempo. Requieren una copia de seguridad completa como punto de partida.

Para la restauración, se restaura la última copia de seguridad completa, luego la última copia de seguridad diferencial (si la hay), y luego todas las copias de seguridad del registro de transacciones en secuencia. SQL Server Management Studio (SSMS) proporciona una interfaz gráfica para estas operaciones, y los planes de mantenimiento pueden automatizar los programas de copias de seguridad. Otros métodos incluyen el uso de Azure Backup para copias de seguridad basadas en la nube y herramientas de terceros.

25. ¿Cómo se puede implementar el control de acceso basado en roles en SQL Server?

El control de acceso basado en roles (RBAC) en SQL Server se puede implementar utilizando roles y permisos. Primero, cree roles de base de datos utilizando la instrucción CREATE ROLE. Luego, otorgue permisos específicos a estos roles utilizando la instrucción GRANT, especificando el objeto y los permisos deseados (por ejemplo, SELECT, INSERT, UPDATE, DELETE). Finalmente, agregue usuarios o grupos de SQL Server a estos roles utilizando sp_addrolemember. Esto asegura que los usuarios hereden los permisos asociados con los roles a los que pertenecen.

Por ejemplo:

CREATE ROLE DataReaders; GRANT SELECT ON MyTable TO DataReaders; EXEC sp_addrolemember 'DataReaders', 'MyUser';

Esto crea un rol DataReaders, otorga permiso SELECT en MyTable, y agrega el usuario MyUser a ese rol.

26. Describa el propósito del SQL Server Profiler y cómo usarlo.

SQL Server Profiler es una interfaz gráfica de usuario para monitorear eventos en una instancia de SQL Server. Captura datos sobre el rendimiento del servidor, la ejecución de consultas, eventos de seguridad y otras actividades. Esta información es valiosa para identificar consultas de ejecución lenta, interbloqueos, vulnerabilidades de seguridad y cuellos de botella de rendimiento en general. Ha sido desaprobado, y Extended Events es ahora el método preferido.

Para usarlo (aunque está desaprobado), haría lo siguiente:

  1. Abra SQL Server Profiler.
  2. Conéctese a la instancia de SQL Server deseada.
  3. Defina un nuevo rastreo. Esto incluye seleccionar los eventos a capturar (por ejemplo, SQL:BatchCompleted, SP:StmtCompleted) y las columnas de datos a recopilar para cada evento (por ejemplo, TextData, Duración, CPU, Lecturas, Escrituras).
  4. Establezca filtros para reducir los eventos capturados (por ejemplo, filtre por base de datos, aplicación o usuario).
  5. Ejecute el rastreo y analice los datos capturados. Puede guardar los datos del rastreo en un archivo o tabla para su análisis posterior.

Extended Events se usa de manera similar creando sesiones y definiendo eventos y destinos.

27. ¿Cómo puede migrar datos entre diferentes bases de datos de SQL Server?

Existen varios métodos para migrar datos entre bases de datos SQL Server. Los enfoques comunes incluyen el uso del Asistente para Importar y Exportar de SQL Server, una herramienta basada en GUI adecuada para migraciones simples. Alternativamente, puede utilizar bcp (Programa de Copia Masiva), una utilidad de línea de comandos para la transferencia rápida de datos, especialmente útil para conjuntos de datos grandes. Para escenarios más complejos o cuando se necesitan transformaciones, SQL Server Integration Services (SSIS) proporciona una plataforma robusta para construir paquetes ETL (Extraer, Transformar, Cargar). Los Servidores Vinculados también se pueden usar para consultar y transferir datos directamente entre servidores usando las sentencias SELECT INTO o INSERT INTO ... SELECT. Finalmente, generar scripts SQL (usando herramientas o manualmente) para crear tablas e insertar datos es una opción viable, que ofrece mayor control pero requiere más esfuerzo manual.

28. Explique el concepto de cifrado de datos en SQL Server y sus beneficios.

El cifrado de datos en SQL Server protege los datos confidenciales convirtiéndolos en un formato ilegible (texto cifrado), evitando el acceso no autorizado. SQL Server ofrece varias funciones de cifrado como Cifrado de Datos Transparente (TDE), cifrado a nivel de columna utilizando claves simétricas o asimétricas y Always Encrypted.

Los beneficios incluyen:

  • Confidencialidad de los datos: Protege los datos de visualizaciones no autorizadas.
  • Cumplimiento: Ayuda a cumplir con los requisitos regulatorios como GDPR, HIPAA.
  • Integridad de los datos: Asegura que los datos no han sido manipulados.
  • Seguridad mejorada: Protege los datos en reposo y en tránsito.
  • Auditoría: Realiza un seguimiento del uso de la clave de cifrado con fines de auditoría.

Preguntas de entrevista de expertos en SQL

1. ¿Cómo optimizaría una consulta SQL de ejecución lenta, detallando los pasos desde la identificación hasta la implementación?

Para optimizar una consulta SQL de ejecución lenta, comenzaría por identificar el cuello de botella. Utilizaría herramientas como EXPLAIN PLAN para comprender el plan de ejecución de la consulta y señalar operaciones lentas como escaneos de tabla completos o uniones ineficientes. Luego, me concentraría en lo siguiente:

  • Indexación: Asegúrese de que existan los índices apropiados en las columnas utilizadas en las cláusulas WHERE, las condiciones JOIN y las cláusulas ORDER BY. Agregar índices faltantes puede mejorar drásticamente el rendimiento.
  • Reescritura de consultas: Optimice la estructura de la consulta. Esto podría implicar simplificar subconsultas complejas, reescribir uniones o usar funciones más eficientes. Examine la cláusula WHERE para ver si es "sargable". Por ejemplo, WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31' es mejor que WHERE YEAR(order_date) = 2023 AND MONTH(order_date) = 1 porque la primera puede usar un índice en order_date.
  • Optimización de datos: Considere la partición de datos o el archivado de datos antiguos para reducir la cantidad de datos que se están escaneando. Analice las estadísticas de la tabla y actualícelas si es necesario para que el optimizador de consultas pueda tomar la mejor decisión.
  • Hardware/Configuración: Si las optimizaciones de software son insuficientes, revise los recursos de hardware (CPU, memoria, E/S de disco) y los parámetros de configuración de la base de datos. Aumentar la memoria asignada a la base de datos puede mejorar significativamente el rendimiento de la consulta.

Después de cada cambio, volvería a evaluar el rendimiento de la consulta utilizando EXPLAIN PLAN y métricas de tiempo para asegurar que la optimización sea efectiva. Es un proceso iterativo.

2. Explique el concepto de un 'índice de cobertura' y cómo puede mejorar el rendimiento de la consulta. Dé un ejemplo práctico.

Un índice de cobertura es un tipo especial de índice de base de datos que incluye todas las columnas necesarias para satisfacer una consulta en particular. Cuando una consulta se puede resolver completamente desde el índice en sí, sin necesidad de acceder a las filas reales de la tabla, se denomina 'consulta cubierta'. Esto evita la necesidad de una búsqueda en la tabla, que es una operación relativamente costosa. Esto mejora significativamente el rendimiento de la consulta, porque la base de datos puede recuperar todos los datos requeridos directamente del índice, que suele ser más pequeño y se almacena en un formato más eficiente que la tabla completa.

Por ejemplo, considere una tabla empleados con columnas id, nombre, edad y departamento. Si ejecuta con frecuencia consultas como SELECT nombre, edad FROM empleados WHERE departamento = 'Ventas', un índice de cobertura en (departamento, nombre, edad) podría acelerar drásticamente estas consultas. Sin el índice, la base de datos necesitaría escanear la tabla empleados y recuperar el nombre y la edad de cada fila donde departamento = 'Ventas'. Con el índice de cobertura, la base de datos puede recuperar directamente el nombre y la edad del índice, sin necesidad de leer la tabla en absoluto. Crear tal índice en SQL podría verse así: CREATE INDEX idx_departamento_nombre_edad ON empleados (departamento, nombre, edad);

3. Describa un escenario en el que el uso de una subconsulta correlacionada sea más eficiente que el uso de una unión, y explique por qué.

Una subconsulta correlacionada puede ser más eficiente que una unión cuando necesita seleccionar datos en función de una condición que depende de cada fila de la tabla externa y solo necesita un pequeño subconjunto de columnas de la tabla relacionada. Considere un escenario en el que necesita encontrar todos los clientes que han realizado al menos un pedido con un importe superior a su importe medio de pedido. El uso de una unión requeriría calcular el importe medio del pedido para cada cliente y luego unirlo a la tabla de pedidos, lo que puede ser computacionalmente costoso, especialmente si las tablas son grandes. Una subconsulta correlacionada puede lograr esto de manera eficiente verificando la condición para cada cliente directamente:

SELECT c.customer_id FROM Clientes c WHERE EXISTS ( SELECT 1 FROM Ordenes o WHERE o.customer_id = c.customer_id AND o.order_amount > ( SELECT AVG(order_amount) FROM Ordenes o2 WHERE o2.customer_id = c.customer_id ) );

En este caso, la subconsulta correlacionada es más eficiente porque evita la necesidad de calcular el importe promedio de la orden para todos los clientes a la vez, en cambio, lo calcula solo para aquellos clientes que están siendo considerados por la consulta externa. La cláusula EXISTS optimiza aún más la consulta al detener la ejecución de la subconsulta tan pronto como encuentra una fila coincidente.

4. ¿Cómo se maneja la asimetría de datos en una base de datos y cuáles son las posibles implicaciones en el rendimiento?

La asimetría de datos se refiere a una distribución desigual de datos entre particiones o nodos en una base de datos. Esto puede llevar a cuellos de botella en el rendimiento porque algunas particiones/nodos manejan significativamente más carga de trabajo que otras. Las estrategias comunes para abordar la asimetría de datos incluyen: salado (añadir un prefijo aleatorio a los valores sesgados para distribuirlos), pre-división (crear particiones manualmente basadas en la distribución de datos anticipada) y el uso de técnicas como la agrupación o el hashing consistente.

Las implicaciones de rendimiento de la asimetría de datos pueden ser graves. Las consultas dirigidas a datos sesgados pueden experimentar tiempos de procesamiento más largos, lo que lleva a una ralentización general. Esto también puede causar contención de recursos en los nodos sobrecargados, lo que afecta el rendimiento de otras consultas y potencialmente conduce a la inestabilidad del sistema. La mitigación efectiva de la asimetría es crucial para mantener el rendimiento y la escalabilidad de la base de datos.

5. Explique los diferentes niveles de aislamiento en SQL y su impacto en la concurrencia y la integridad de los datos. Proporcione ejemplos de cuándo usar cada nivel.

  • Lectura no confirmada: El nivel más bajo; las transacciones pueden leer cambios no confirmados de otras transacciones (lecturas sucias). Esto ofrece la mayor concurrencia, pero la menor integridad de los datos. Caso de uso de ejemplo: Cuando no importa potencialmente leer datos inexactos, como en algunos escenarios de informes.
  • Lectura confirmada: Las transacciones solo pueden leer cambios confirmados. Previene lecturas sucias, pero son posibles las lecturas no repetibles (una transacción lee la misma fila dos veces pero obtiene valores diferentes). Caso de uso de ejemplo: Operaciones comerciales básicas donde las lecturas sucias son inaceptables.
  • Lectura repetible: Previene lecturas sucias y lecturas no repetibles. Sin embargo, las lecturas fantasma aún son posibles (una transacción ejecuta la misma consulta dos veces y obtiene filas diferentes). Caso de uso de ejemplo: Transacciones financieras donde las lecturas consistentes dentro de una sola transacción son cruciales.
  • Serializable: El nivel más alto; proporciona aislamiento completo al evitar lecturas sucias, lecturas no repetibles y lecturas fantasma. Las transacciones se ejecutan de manera efectiva en serie. Caso de uso de ejemplo: Escenarios que exigen la mayor integridad de los datos, como la actualización de datos financieros críticos o la gestión de inventario donde la consistencia es primordial, incluso a costa de la concurrencia.

6. Describe el proceso de sharding de base de datos, sus beneficios y desventajas. ¿Cómo lo implementaría en un escenario real?

El sharding de base de datos es el proceso de particionar horizontalmente una base de datos en partes más pequeñas y manejables llamadas shards. Cada shard contiene un subconjunto del total de datos y puede residir en un servidor separado. Esto permite distribuir la carga de trabajo entre múltiples máquinas, mejorando el rendimiento y la escalabilidad. Los beneficios incluyen una mayor capacidad de almacenamiento, menor latencia de consulta y una mejor disponibilidad. Las desventajas involucran una mayor complejidad en la gestión de datos, la posibilidad de datos inconsistentes entre shards y la necesidad de una estrategia de clave de sharding.

En un escenario de comercio electrónico del mundo real, implementaría el sharding basado en la ID del cliente. Por ejemplo, customer_id % número_de_shards podría determinar en qué shard residen los datos de un cliente. Este enfoque distribuye a los usuarios de manera relativamente uniforme entre los shards. Implementar un sistema de monitoreo robusto es crucial para identificar shards calientes y reequilibrar los datos si es necesario. Un algoritmo de hashing consistente podría ser preferible para una mayor flexibilidad a medida que el sistema crece. La lógica de la aplicación necesitaría ser actualizada para determinar el shard correcto para cada consulta, o se podría usar un proxy de base de datos para manejar este enrutamiento.

7. Explique la diferencia entre índices agrupados y no agrupados, y cuándo elegiría uno sobre el otro?

Los índices agrupados determinan el orden físico de los datos en una tabla. Una tabla solo puede tener un índice agrupado. Los índices no agrupados, por otro lado, almacenan un puntero a los datos y los datos se almacenan por separado del índice. Una tabla puede tener múltiples índices no agrupados.

Elija un índice agrupado cuando necesite recuperar con frecuencia filas completas en un orden específico o realizar consultas de rango en una columna. Elija índices no agrupados cuando necesite acelerar las consultas en columnas específicas sin afectar el orden físico de los datos o cuando necesite índices en múltiples columnas.

8. ¿Cómo se pueden usar las funciones de ventana para resolver problemas analíticos complejos? Proporcione un ejemplo específico.

Las funciones de ventana permiten cálculos en un conjunto de filas de la tabla que están relacionadas con la fila actual. Son útiles para tareas como calcular totales acumulados, medias móviles, clasificaciones y percentiles sin auto-uniones ni usar subconsultas, simplificando así consultas analíticas complejas. Esencialmente, define una "ventana" de filas para cada fila en su conjunto de resultados, basada en algunos criterios.

Por ejemplo, considere calcular una media móvil de ventas para cada producto. Usando funciones de ventana, puede calcular fácilmente las ventas promedio de los últimos 'n' días para cada producto sin subconsultas complejas. El SQL se vería algo así: sql SELECT product_id, sale_date, sale_amount, AVG(sale_amount) OVER (PARTITION BY product_id ORDER BY sale_date ASC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as moving_average FROM sales_table; Esto evita auto-uniones desordenadas y mejora la legibilidad de la consulta.

9. ¿Cuáles son algunas estrategias para lidiar con los interbloqueos en un sistema de base de datos y cómo puede prevenirlos?

Los interbloqueos en los sistemas de bases de datos se pueden abordar utilizando varias estrategias. Las técnicas de prevención tienen como objetivo eliminar las condiciones que conducen a los interbloqueos. Estas incluyen: Orden de bloqueo (establecer un orden global para adquirir bloqueos), Tiempo de espera del bloqueo (liberar bloqueos después de un cierto período) y Detección y recuperación de interbloqueos (permitir que ocurran interbloqueos, luego detectarlos y abortar una o más transacciones involucradas para romper el ciclo).

Otra estrategia es la evitación de interbloqueos, donde el sistema analiza las posibles solicitudes de bloqueo de cada transacción y las aprueba solo si no causarán un interbloqueo. Una implementación común son los esquemas de espera-muere y herida-espera. La detección de interbloqueos generalmente implica la creación de un gráfico de espera para identificar ciclos que representan interbloqueos. Una vez detectado, se elige una transacción víctima (basada en factores como la antigüedad de la transacción o el número de recursos retenidos) y se revierte, liberando sus bloqueos y permitiendo que otras transacciones continúen. Algunas bases de datos manejan automáticamente la detección y resolución de interbloqueos, mientras que otras requieren manejo a nivel de aplicación.

10. Explique el concepto de sugerencias de consulta y cuándo deben (y no deben) usarse.

Las sugerencias de consulta son instrucciones agregadas a las consultas SQL para guiar al optimizador del motor de la base de datos sobre cómo ejecutar la consulta. Esencialmente anulan el comportamiento predeterminado del optimizador. Se usan sugerencias cuando sabe más sobre los datos o el entorno de ejecución de lo que sabe el optimizador y cree que puede mejorar el rendimiento forzando un plan de ejecución en particular.

Las sugerencias deben usarse con moderación y precaución. El uso excesivo puede provocar una degradación del rendimiento, especialmente si las distribuciones de datos o las estructuras de bases de datos subyacentes cambian. Úselas cuando el optimizador elija consistentemente un plan subóptimo, y solo después de investigar a fondo otras opciones de optimización como la indexación o la reestructuración de consultas. Evite las sugerencias si se vuelven difíciles de mantener o si su beneficio de rendimiento es marginal o inconsistente. Una buena regla general es que si una sugerencia se vuelve necesaria, el problema subyacente debe investigarse, ya que existe una posible solución a largo plazo fuera de forzar un plan de ejecución específico. Algunos ejemplos incluyen forzar un índice SELECT * FROM table WITH (INDEX(index_name)) o especificar un orden de unión SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.table1_id OPTION (ORDER JOIN);

11. ¿Cómo diseñaría un esquema de base de datos para almacenar y consultar eficientemente datos de series temporales?

Para los datos de series temporales, generalmente se prefiere un enfoque de tabla ancha. Usaría una tabla con columnas para la marca de tiempo (timestamp), el nombre de la métrica y el valor. La marca de tiempo (timestamp) sería la clave principal o parte de una clave compuesta, lo que permitiría consultas de rango eficientes. Considere la posibilidad de particionar la tabla por rangos de tiempo (por ejemplo, diarios o mensuales) para optimizar aún más el rendimiento de las consultas. Utilice los tipos de datos apropiados para la columna de valor en función de los datos que se están almacenando (por ejemplo, numérico, cadena).

Para mejorar el rendimiento de las consultas, también crearía índices en las columnas de marca de tiempo y nombre de la métrica. Si se requieren agregaciones con frecuencia, considere precalcularlas y almacenarlas en tablas separadas o usar vistas materializadas. Para volúmenes de datos muy altos, considere usar una base de datos especializada para series temporales como TimescaleDB o InfluxDB, que están optimizadas para este tipo de datos y ofrecen características integradas para la compresión, las políticas de retención y el downsampling.

12. Describa la diferencia entre el bloqueo optimista y el pesimista, y explique cuándo es apropiado cada uno.

El bloqueo optimista asume que los conflictos son raros. Lee datos, realiza cálculos y luego verifica si los datos han sido modificados por otra transacción antes de escribir los cambios. Esta verificación generalmente se realiza a través de un número de versión o una marca de tiempo. Si los datos han cambiado, la actualización falla y la transacción debe reintentarse. El bloqueo optimista es adecuado para escenarios con baja contención, donde el costo de reintentar una transacción es menor que la sobrecarga de mantener bloqueos.

El bloqueo pesimista, por otro lado, asume que los conflictos son comunes. Adquiere un bloqueo en los datos antes de leerlos, impidiendo que otras transacciones modifiquen los datos hasta que se libere el bloqueo. Esto asegura que los datos permanezcan consistentes a lo largo de la transacción. El bloqueo pesimista es apropiado para escenarios con alta contención, donde la consistencia de los datos es crítica y el costo de bloquear otras transacciones es aceptable. Por ejemplo, al actualizar el saldo de una cuenta bancaria, generalmente se usa el bloqueo pesimista. SQL SELECT ... FOR UPDATE es una forma de implementar esto.

13. ¿Cómo implementaría una capacidad de búsqueda de texto completo en una base de datos SQL?

La búsqueda de texto completo en bases de datos SQL se puede implementar principalmente utilizando las capacidades de indexación de texto completo incorporadas de la base de datos. Por ejemplo, en MySQL y MariaDB, usaría índices FULLTEXT y la sintaxis MATCH ... AGAINST. En PostgreSQL, usaría los tipos tsvector y tsquery junto con los índices GIN o GIST. SQL Server utiliza índices de texto completo y los predicados CONTAINS o FREETEXT.

Normalmente, crearía un índice de texto completo en las columnas relevantes (por ejemplo, campos de texto). El proceso de indexación implica tokenizar el texto, eliminar las palabras vacías y realizar stemming. Luego, las consultas usan una sintaxis especial para buscar en el índice, clasificando los resultados por relevancia. Por ejemplo, en MySQL:

CREATE FULLTEXT INDEX idx_articles_body ON articles(body); SELECT * FROM articles WHERE MATCH (body) AGAINST ('search terms');

14. Explique el concepto de normalización y desnormalización en el diseño de bases de datos. ¿Cuándo elegiría desnormalizar una base de datos?

La normalización es el proceso de organizar datos en una base de datos para reducir la redundancia y mejorar la integridad de los datos. Implica dividir tablas grandes en tablas más pequeñas y manejables y definir relaciones entre ellas. La desnormalización, por otro lado, es el proceso de agregar redundancia a una base de datos para mejorar el rendimiento de lectura. Esto se logra típicamente combinando datos de múltiples tablas en una sola tabla.

Se elegiría desnormalizar una base de datos cuando el rendimiento de lectura es crítico y supera el costo de una mayor redundancia de datos y posibles inconsistencias en los datos. Los escenarios comunes incluyen bases de datos de informes donde se requieren frecuentemente uniones complejas, o cuando se trata de conjuntos de datos muy grandes donde el rendimiento de la consulta es primordial. La desnormalización puede reducir significativamente el número de uniones necesarias para las consultas, lo que lleva a tiempos de respuesta más rápidos.

15. ¿Cómo auditaría los cambios en los datos de una base de datos SQL?

La auditoría de los cambios de datos en una base de datos SQL se puede lograr a través de varios métodos. Un enfoque común es usar Disparadores (Triggers). Los disparadores se pueden configurar en las tablas para registrar automáticamente los cambios (INSERT, UPDATE, DELETE) en una tabla de auditoría separada. Esta tabla de auditoría normalmente almacenaría información como el usuario que realizó el cambio, la marca de tiempo del cambio, el tipo de cambio y los valores originales y nuevos de las columnas afectadas.

Otro enfoque es aprovechar las funciones de Captura de datos de cambios (CDC) o Seguimiento de cambios, si son compatibles con su sistema de base de datos específico. CDC captura los cambios a medida que ocurren y los pone a disposición para su consumo por otras aplicaciones, mientras que el Seguimiento de cambios simplemente rastrea qué filas se han modificado. Estas funciones ofrecen soluciones más eficientes y robustas en comparación con los disparadores, especialmente para sistemas transaccionales de alto volumen. Un ejemplo de sintaxis de disparador:

CREATE TRIGGER audit_table_changes ON your_table AFTER INSERT, UPDATE, DELETE AS BEGIN -- Insertar registro de auditoría en la tabla de auditoría INSERT INTO audit_table (table_name, column_name, old_value, new_value, changed_by, changed_at) SELECT 'your_table', 'your_column', (SELECT column_name FROM deleted), -- Valor antiguo (SELECT column_name FROM inserted), -- Valor nuevo SYSTEM_USER, GETDATE(); END;

16. Describe cómo manejaría el versionado de datos en una base de datos SQL.

Hay varias estrategias para manejar el versionado de datos en bases de datos SQL. Un enfoque común es usar tablas temporales (también conocidas como tablas con versión del sistema). Estas tablas rastrean automáticamente el período de validez de cada fila, almacenando datos históricos junto con los datos actuales. Esto permite consultar la base de datos tal como existía en cualquier momento. Otro enfoque es usar tablas de auditoría, donde los cambios en tablas específicas se registran en tablas separadas junto con una marca de tiempo e información del usuario. Finalmente, podría implementar el versionado a nivel de aplicación agregando columnas como version_number, valid_from y valid_to a sus tablas y administrando la lógica de versionado en el código de su aplicación.

17. ¿Cómo se diagnostican y resuelven los cuellos de botella de rendimiento relacionados con la E/S de disco en un sistema de base de datos?

Para diagnosticar los cuellos de botella de E/S de disco, comience por monitorear métricas clave como la utilización del disco, la latencia de lectura/escritura y las operaciones de E/S por segundo (IOPS). Herramientas como iostat, vmstat y los monitores de rendimiento específicos de la base de datos son valiosas. Identifique las consultas o procesos de ejecución lenta que consumen recursos de disco excesivos.

La resolución de estos cuellos de botella implica varias estrategias: optimizar las consultas (usando índices, reescribiendo consultas ineficientes), mejorar el diseño del esquema de la base de datos, actualizar a un almacenamiento más rápido (SSD), implementar mecanismos de almacenamiento en caché (por ejemplo, ajuste del grupo de búferes) y considerar la partición o el striping del disco para distribuir la carga de E/S. El mantenimiento regular de la base de datos, incluidas las reconstrucciones de índices y las actualizaciones de estadísticas, también puede mejorar el rendimiento. Si el cuello de botella se debe a operaciones intensivas en escritura, considere técnicas como la consolidación de escritura o el uso de un motor de almacenamiento optimizado para escritura.

18. Explique el papel del optimizador de consultas en SQL Server. ¿Cómo se puede influir en su comportamiento?

El optimizador de consultas de SQL Server es responsable de determinar el plan de ejecución más eficiente para una consulta SQL determinada. Analiza las diferentes formas posibles de recuperar y procesar los datos, considerando factores como los índices disponibles, la distribución de datos y los algoritmos de combinación, y selecciona el plan con el costo estimado más bajo. El objetivo es minimizar el consumo de recursos (CPU, E/S, memoria) y mejorar el rendimiento de las consultas.

Se puede influir en el comportamiento del optimizador de consultas de varias maneras:

  • Actualización de estadísticas: Asegúrese de que las estadísticas estén actualizadas para que el optimizador tenga información precisa sobre los datos.
  • Uso de índices: Cree los índices apropiados para ayudar al optimizador a localizar rápidamente los datos relevantes.
  • Reescritura de consultas: A veces, reescribir una consulta de una manera diferente, aunque lógicamente equivalente, puede conducir a un mejor plan de ejecución. Por ejemplo, simplificar cláusulas WHERE complejas.
  • Sugerencias de consulta: Use sugerencias de consulta (por ejemplo, OPTION (OPTIMIZE FOR), OPTION (INDEX()), OPTION (HASH JOIN)) como último recurso para obligar al optimizador a usar un plan o algoritmo de combinación específico, pero esto debe hacerse con cautela y solo después de pruebas exhaustivas, ya que a veces puede tener consecuencias no deseadas.
  • Nivel de compatibilidad de la base de datos: Los niveles de compatibilidad más recientes a menudo vienen con mejoras en el optimizador de consultas.
  • Detección de parámetros (Parameter Sniffing): Sea consciente de los problemas de detección de parámetros y use OPTION (RECOMPILE) u otras técnicas para mitigarlos.

19. Describa cómo implementaría un almacén de datos utilizando SQL. ¿Cuáles son las consideraciones clave?

La implementación de un almacén de datos utilizando SQL implica varias consideraciones clave. El núcleo es diseñar un esquema de estrella o copo de nieve, centrándose en las tablas de hechos (que contienen métricas) y las tablas de dimensiones (que contienen atributos descriptivos). Los procesos ETL (Extraer, Transformar, Cargar) son cruciales para poblar el almacén de datos. Esto generalmente implica extraer datos de varios sistemas de origen, transformarlos para que se ajusten al esquema del almacén de datos (limpiando, agregando y conformando datos) y cargarlos en el almacén. SQL se utiliza ampliamente para estos procesos ETL, a menudo utilizando procedimientos almacenados y trabajos programados.

Las consideraciones clave incluyen la elección de tipos de datos e estrategias de indexación apropiadas para un rendimiento óptimo de las consultas. La partición de tablas grandes puede mejorar la velocidad de las consultas y la manejabilidad. La calidad de los datos es primordial; la implementación de rutinas de validación y limpieza de datos es vital. Además, considere la seguridad; la implementación de controles de acceso y mecanismos de auditoría apropiados. Finalmente, planifique cuidadosamente la escalabilidad para acomodar el crecimiento futuro de los datos y las necesidades comerciales en evolución. Elegir el sistema de base de datos SQL adecuado también es muy importante.

20. ¿Cómo gestiona de manera eficiente los tipos de datos de objetos grandes (LOB) en las bases de datos SQL?

La gestión eficiente de datos LOB implica varias estrategias. Primero, considere usar técnicas como la compresión para reducir el espacio de almacenamiento. Muchas bases de datos admiten la compresión a nivel de tabla o de columna. En segundo lugar, evite seleccionar todos los datos LOB a menos que sea absolutamente necesario. En su lugar, recupere solo la porción o metadatos requeridos. Utilice la transmisión (streaming) para leer y escribir datos LOB en fragmentos, evitando el agotamiento de la memoria, especialmente para objetos muy grandes.

Diferentes bases de datos ofrecen mecanismos especializados. Por ejemplo, en algunos sistemas puede usar sistemas de archivos que están optimizados para tratar archivos grandes. Otras veces, puede usar punteros a archivos físicos, a los que luego se hace referencia mediante el registro SQL. Considere la proporción de lectura-escritura del LOB; para escenarios predominantemente de lectura, el almacenamiento en caché de LOB de acceso frecuente puede mejorar significativamente el rendimiento. Finalmente, asegúrese de que su base de datos esté configurada correctamente para manejar los tamaños de archivo.

21. Explique cómo optimizar las consultas SQL que involucran uniones complejas en múltiples tablas.

La optimización de consultas SQL complejas con múltiples uniones a menudo implica varias estrategias. Comience analizando el plan de ejecución de la consulta utilizando las herramientas proporcionadas por su sistema de base de datos (por ejemplo, EXPLAIN en MySQL o PostgreSQL). Esto revela cuellos de botella de rendimiento, como índices faltantes u órdenes de unión ineficientes. Agregar índices apropiados en las columnas de unión de las tablas es crucial. Considere el uso de índices de cobertura que incluyan todas las columnas necesarias en la consulta para evitar búsquedas en la tabla.

Otra aproximación efectiva es reescribir la consulta para reducir la cantidad de datos que se unen. Esto puede implicar filtrar datos al principio de la consulta utilizando cláusulas WHERE o utilizando subconsultas o Expresiones de Tabla Común (CTEs) para pre-agregar datos antes de unirse. Evalúe diferentes tipos de unión (por ejemplo, INNER JOIN, LEFT JOIN) y asegúrese de que está utilizando el más apropiado para sus necesidades. En algunos casos, desnormalizar ligeramente el esquema de la base de datos, agregando columnas redundantes para evitar uniones complejas, podría mejorar el rendimiento, pero considere las compensaciones en la integridad de los datos.

22. ¿Cómo maneja la migración de datos entre diferentes sistemas de bases de datos con un tiempo de inactividad mínimo?

Para manejar la migración de datos entre diferentes sistemas de bases de datos con un tiempo de inactividad mínimo, una estrategia común es utilizar una combinación de técnicas. Inicialmente, configure un mecanismo de replicación (por ejemplo, utilizando herramientas como pglogical, Debezium o características de replicación específicas de la base de datos) para sincronizar los datos de la base de datos de origen a la base de datos de destino. Esto permite que la base de datos de destino se llene con una copia casi en tiempo real de los datos.

Una vez que la base de datos de destino esté suficientemente sincronizada, realice un cambio. Esto implica detener las escrituras en la base de datos de origen, permitiendo que la replicación se ponga al día por completo y, luego, redirigir el tráfico de la aplicación a la base de datos de destino. Una estrategia de implementación azul/verde puede minimizar aún más el tiempo de inactividad al tener la aplicación lista para usar la base de datos de destino inmediatamente después del cambio. Las pruebas y la validación exhaustivas después del cambio son cruciales para garantizar la integridad de los datos y la funcionalidad de la aplicación.

23. Describa cómo implementaría una solución de datos geoespaciales utilizando SQL.

Para implementar una solución de datos geoespaciales utilizando SQL, aprovecharía un sistema de base de datos con extensiones espaciales integradas como PostGIS (para PostgreSQL) o extensiones espaciales en MySQL o SQL Server. Primero, definiría tablas para almacenar características geoespaciales, incluyendo columnas para la geometría (por ejemplo, puntos, líneas, polígonos) utilizando los tipos de datos de la extensión (por ejemplo, geometry en PostGIS). Luego, usaría consultas SQL para realizar operaciones espaciales:

  • Almacenamiento de datos geoespaciales: Use ST_GeomFromText() o funciones similares para insertar datos de geometría en las columnas espaciales. Los formatos Well-Known Text (WKT) o Well-Known Binary (WKB) se utilizan comúnmente.
  • Consultas espaciales: Utilice funciones como ST_Distance() (calcula la distancia entre geometrías), ST_Contains() (verifica si una geometría contiene otra), ST_Intersects() (verifica la intersección) y ST_Buffer() (crea un buffer alrededor de una geometría). También crearía índices espaciales en las columnas de geometría para optimizar el rendimiento de las consultas. Ejemplo: CREATE INDEX idx_geom ON my_table USING GIST (my_geometry_column) para acelerar las búsquedas en la columna espacial my_geometry_column.
  • Transformaciones: Utilice funciones como ST_Transform() para cambiar los sistemas de referencia de coordenadas.

24. Explique el concepto de particionamiento de bases de datos y sus ventajas y desventajas.

El particionamiento de bases de datos divide una tabla grande en piezas más pequeñas y manejables. Esto mejora el rendimiento de las consultas, ya que la base de datos solo necesita escanear un subconjunto de los datos. Otras ventajas incluyen una mejor capacidad de gestión (respaldos y restauraciones más fáciles) y una mayor disponibilidad (la falla de una partición no necesariamente derriba todo el sistema). Los esquemas de particionamiento comunes incluyen el particionamiento horizontal (sharding), vertical y basado en directorio.

Sin embargo, el particionamiento también introduce complejidad. El enrutamiento de consultas se vuelve más complejo, ya que necesita determinar qué partición contiene los datos. El mantenimiento puede ser más complicado. Además, si no se implementa con cuidado, el particionamiento puede conducir a una distribución de datos desigual (puntos críticos), lo que niega los beneficios de rendimiento. La integridad de los datos puede verse afectada si las transacciones abarcan múltiples particiones.

25. ¿Cómo se asegura la consistencia de los datos en múltiples bases de datos en un entorno distribuido?

Asegurar la consistencia de los datos en múltiples bases de datos en un entorno distribuido es un desafío, pero crucial. Se pueden emplear varias estrategias, a menudo en combinación. La confirmación en dos fases (2PC) proporciona una consistencia fuerte al garantizar que todas las bases de datos confirmen o reviertan una transacción juntas, pero puede afectar el rendimiento debido al bloqueo. Otro enfoque es la consistencia eventual, donde los datos eventualmente se vuelven consistentes en todas las bases de datos. Esto se puede lograr a través de técnicas como la replicación asíncrona, colas de mensajes (por ejemplo, Kafka) para propagar actualizaciones y mecanismos de resolución de conflictos.

Elegir el enfoque correcto depende de los requisitos específicos de la aplicación. Para transacciones críticas donde la integridad de los datos es primordial, 2PC podría ser necesario. Para datos menos críticos, la consistencia eventual puede proporcionar un mejor rendimiento y escalabilidad. Técnicas como las transacciones de compensación también se pueden usar para deshacer operaciones si ocurren fallas, ofreciendo un equilibrio entre consistencia y disponibilidad.

26. Describe cómo implementaría un sistema de recomendación utilizando SQL.

Implementar un sistema de recomendación directamente en SQL implica aprovechar las consultas de base de datos para encontrar elementos o usuarios similares basados en criterios definidos. Para recomendaciones basadas en elementos, normalmente comenzarías con una tabla de interacciones de usuarios (por ejemplo, compras, calificaciones). Luego, puedes usar SQL para calcular las puntuaciones de similitud entre elementos. Por ejemplo, si dos elementos son comprados con frecuencia por los mismos usuarios, es probable que sean similares. Una consulta podría calcular el número de usuarios que compraron tanto el artículo A como el artículo B, dividido por el número de usuarios que compraron el artículo A o el artículo B, lo que resulta en un índice de Jaccard que representa la similitud. Podrías crear una tabla de similitudes precalculadas para acelerar las recomendaciones.

Para recomendaciones basadas en usuarios, encontrarías usuarios con gustos similares. Esto implica calcular la similitud entre los perfiles de los usuarios en función de sus interacciones con los elementos. SQL puede realizar cálculos como la similitud del coseno o la correlación de Pearson entre usuarios. Los resultados serían usuarios que interactuaron con elementos similares. Una vez que tengas usuarios similares, puedes recomendar elementos con los que estos usuarios hayan interactuado pero con los que el usuario actual no lo haya hecho. Podrías filtrar en función de la calificación promedio proporcionada por usuarios similares para un artículo específico y solo sugerirlo si está por encima de un cierto umbral. La clasificación de los elementos en orden de relevancia predicha podría lograrse ordenando los resultados de tu consulta SQL en función de algún tipo de puntuación calculada.

27. Explique el propósito y el uso de las expresiones de tabla comunes (CTEs) en consultas complejas.

Las expresiones de tabla comunes (CTEs) son conjuntos de resultados temporales con nombre que existen solo dentro del ámbito de ejecución de una sola instrucción SQL. Mejoran la legibilidad y la modularidad en consultas complejas al dividirlas en unidades lógicas más pequeñas y manejables. Los CTE se definen utilizando la cláusula WITH.

Los CTE son útiles para:

  • Mejorar la legibilidad: Al dar nombres a los resultados intermedios, los CTE hacen que las consultas complejas sean más fáciles de entender.
  • Simplificar la lógica compleja: Permiten dividir una consulta grande en pasos lógicos más pequeños.
  • Consultas recursivas: Los CTE se pueden usar para implementar consultas recursivas, que son útiles para recorrer datos jerárquicos.
  • Evitar cálculos redundantes: Un CTE se puede definir una vez y hacer referencia a él varias veces en la misma consulta, evitando cálculos repetitivos.

28. ¿Cómo se pueden utilizar eficazmente las consultas recursivas en SQL para resolver problemas de datos jerárquicos?

Las CTE (Expresiones de Tabla Común) recursivas en SQL son excelentes para manejar datos jerárquicos, como estructuras organizativas o árboles de categorías. La estructura básica involucra dos partes principales: un miembro ancla (el caso base, típicamente seleccionando los elementos raíz) y un miembro recursivo (que hace referencia al CTE en sí mismo para atravesar la jerarquía). El operador UNION ALL combina estas dos partes.

Para usarlos eficazmente:

  • Identificar la raíz: Determinar el(los) elemento(s) de nivel superior en su jerarquía.
  • Definir la recursión: Especificar cómo moverse de padre a hijo dentro de la jerarquía.
  • Manejar la terminación: Asegurar que su recursión eventualmente se detenga definiendo condiciones apropiadas en el miembro recursivo, previniendo bucles infinitos.
  • Considerar el rendimiento: Para jerarquías muy grandes, la indexación y otras técnicas de optimización podrían ser necesarias para mejorar la velocidad de la consulta. Use SELECT MAX(profundidad_recursión) FROM nombre_cte para limitar la profundidad máxima de la recursión. Limitar el número de niveles recursivos usando OPTION (MAXRECURSION profundidad). Por ejemplo,

CON EmployeeHierarchy RECURSIVA COMO ( SELECCIONAR EmployeeID, ManagerID, EmployeeName, 0 COMO Nivel DE Empleados DONDE ManagerID ES NULO -- Miembro ancla: empleado raíz UNION TODO SELECCIONAR e.EmployeeID, e.ManagerID, e.EmployeeName, eh.Nivel + 1 DE Empleados e UNIRSE INTERNAMENTE A EmployeeHierarchy eh EN e.ManagerID = eh.EmployeeID -- Miembro recursivo: encontrar hijos ) SELECCIONAR * DE EmployeeHierarchy;

SQL MCQ

Pregunta 1.

¿Cuál de las siguientes sentencias SQL actualiza correctamente múltiples columnas en una tabla llamada 'Empleados'?

Opciones:

ACTUALIZAR Empleados ESTABLECER Salario = 50000, Departamento = 'Ventas' DONDE EmployeeID = 123;

ACTUALIZAR Empleados ESTABLECER (Salario = 50000, Departamento = 'Ventas') DONDE EmployeeID = 123;

ACTUALIZAR Empleados ESTABLECER Salario = 50000 Y Departamento = 'Ventas' DONDE EmployeeID = 123;

ACTUALIZAR Empleados DONDE EmployeeID = 123 ESTABLECER Salario = 50000, Departamento = 'Ventas';

Pregunta 2.

¿Qué declaración SQL recupera correctamente todos los registros de la tabla 'Pedidos' donde la 'FechaPedido' está entre el 1 de enero de 2023 y el 31 de enero de 2023 (inclusive)?

opciones:

Opciones:

SELECCIONAR * DE Pedidos DONDE FechaPedido ENTRE '2023-01-01' Y '2023-01-31';

SELECCIONAR * DE Pedidos DONDE FechaPedido = '2023-01-01' Y '2023-01-31';

SELECCIONAR * DE Pedidos DONDE FechaPedido EN ('2023-01-01', '2023-01-31');

SELECCIONAR * DE Pedidos DONDE FechaPedido > '2023-01-01' O FechaPedido < '2023-01-31';

Pregunta 3.

¿Cuál de las siguientes sentencias SQL recupera correctamente todos los nombres de clientes de la tabla 'Clientes' que comienzan con la letra 'A'?

Opciones:

SELECCIONAR NombreCliente DE Clientes DONDE NombreCliente = 'A%';

SELECCIONAR NombreCliente DE Clientes DONDE NombreCliente LIKE 'A%';

SELECCIONAR NombreCliente DE Clientes DONDE NombreCliente LIKE '%A';

SELECCIONAR NombreCliente DE Clientes DONDE NombreCliente = 'A*';

Pregunta 4.

¿Qué declaración SQL recupera registros de la tabla 'Empleados' donde el salario del empleado es mayor a $60,000 Y trabajan en el departamento de 'Ventas' O su puesto de trabajo es 'Gerente'?

Opciones:

SELECCIONAR * DE Empleados DONDE Salario > 60000 Y Departamento = 'Ventas' O TítuloTrabajo = 'Gerente';

SELECCIONAR * DE Empleados DONDE Salario > 60000 O Departamento = 'Ventas' Y TítuloTrabajo = 'Gerente';

SELECCIONAR * DE Empleados DONDE Salario > 60000 Y (Departamento = 'Ventas' O TítuloTrabajo = 'Gerente');

SELECCIONAR * DE Empleados DONDE Salario > 60000 O (Departamento = 'Ventas' Y TítuloTrabajo = 'Gerente');

Pregunta 5.

¿Qué instrucción SQL recupera el salario más alto de la tabla 'Empleados'?

Opciones:

SELECCIONAR TOP 1 salario DE Empleados ORDENAR POR salario DESC;

SELECCIONAR MAX(salario) DE Empleados;

SELECCIONAR salario DE Empleados DONDE salario = (SELECCIONAR MAX(salario) DE Empleados);

SELECCIONAR salario ORDENAR POR salario DESC LIMIT 1 DE Empleados;

Pregunta 6.

Necesita determinar el valor promedio del pedido para cada cliente en la tabla 'Pedidos'. ¿Qué consulta SQL calculará y mostrará correctamente el valor promedio del pedido agrupado por ID de cliente?

Opciones:

SELECCIONAR CustomerID, PROMEDIO(ValorPedido) DE Pedidos

SELECCIONAR CustomerID, PROMEDIO(ValorPedido) DE Pedidos AGRUPAR POR CustomerID

SELECCIONAR CustomerID, PROMEDIO(ValorPedido) DE Pedidos AGRUPAR POR CustomerID

SELECCIONAR PROMEDIO(ValorPedido) DE Pedidos AGRUPAR POR CustomerID

Pregunta 7.

¿Qué sentencia SQL recupera todas las columnas de la tabla productos para los productos con un precio igual al precio más bajo de la tabla? Opciones:

Opciones:

SELECCIONAR * DE productos DONDE precio = (SELECCIONAR MIN(precio) DE productos);

SELECCIONAR * DE productos DONDE precio EN (SELECCIONAR MIN(precio) DE productos);

SELECCIONAR * DE productos DONDE precio = MIN(precio) DE productos;

SELECCIONAR * DE productos DONDE precio = CUALQUIERA(SELECCIONAR precio DE productos);

Pregunta 8.

¿Qué sentencia SQL recupera todas las combinaciones únicas de departamento y ubicación de la tabla empleados, eliminando cualquier par duplicado?

Opciones:

SELECCIONAR DISTINTOS departamento, ubicación DE empleados;

SELECCIONAR ÚNICOS departamento, ubicación DE empleados;

SELECCIONAR departamento, ubicación DE empleados AGRUPAR POR departamento, ubicación;

SELECCIONAR DISTINTOSFILA departamento, ubicación DE empleados;

Necesita recuperar los nombres de todos los empleados y los nombres de sus departamentos correspondientes. La tabla empleados tiene las columnas employee_id, employee_name y department_id. La tabla departamentos tiene las columnas department_id y department_name. ¿Qué consulta SQL logrará esto?

Opciones:

SELECT employee_name, department_name FROM employees WHERE department_id = departments.department_id;

SELECT employee_name, department_name FROM employees INNER JOIN departments ON employees.department_id = departments.department_id;

SELECT employee_name, department_name FROM employees LEFT JOIN departments ON employees.employee_id = departments.department_id;

SELECT employee_name, department_name FROM employees, departments;

Pregunta 10.

¿Qué declaración SQL recupera correctamente todas las filas de la tabla 'empleados' donde la columna 'job_title' contiene la cadena 'Manager' usando la función INSTR?

Opciones:

SELECT * FROM employees WHERE INSTR(job_title, 'Manager') > 0;

SELECT * FROM employees WHERE job_title = 'Manager';

SELECT * FROM employees WHERE INSTR('Manager', job_title) > 0;

SELECT * FROM employees WHERE job_title LIKE 'Manager';

Pregunta 11.

Necesita categorizar los productos en categorías de precios 'Bajo', 'Medio' y 'Alto' según su columna 'precio'. 'Bajo' es por debajo de 50, 'Medio' es entre 50 y 100 (inclusive), y 'Alto' es superior a 100. ¿Qué declaración SQL asigna correctamente estas categorías?

Opciones:

SELECT product_name, CASE WHEN price < 50 THEN 'Low' WHEN price BETWEEN 50 AND 100 THEN 'Medium' ELSE 'High' END AS price_category FROM products;

SELECCIONA nombre_producto, IF(precio < 50, 'Bajo', IF(precio ENTRE 50 Y 100, 'Medio', 'Alto')) AS categoría_precio FROM productos;

SELECCIONA nombre_producto, CASE precio CUANDO < 50 ENTONCES 'Bajo' CUANDO ENTRE 50 Y 100 ENTONCES 'Medio' SINO 'Alto' FIN AS categoría_precio FROM productos;

SELECCIONA nombre_producto, DECODE(precio, < 50, 'Bajo', ENTRE 50 Y 100, 'Medio', 'Alto') AS categoría_precio FROM productos;

Pregunta 12.

¿Qué consulta SQL recupera correctamente el segundo salario más alto de la tabla 'empleados'?

Opciones:

SELECCIONA MAX(salario) DE empleados DONDE salario < (SELECCIONA MAX(salario) DE empleados)

SELECCIONA salario DE empleados ORDENAR POR salario DESC LIMIT 1 OFFSET 1

SELECCIONA DISTINCT salario DE empleados ORDENAR POR salario DESC LIMIT 2

SELECCIONA MAX(salario) DE empleados

Pregunta 13.

Necesita recuperar los nombres de todos los empleados que pertenecen a un departamento específico y han trabajado en un proyecto gestionado por un gerente en particular. Las tablas relevantes son Empleados (IDEmpleado, NombreEmpleado, IDDepartamento), Departamentos (IDDepartamento, NombreDepartamento), Proyectos (IDProyecto, NombreProyecto, IDGerente) y ProyectosEmpleados (IDEmpleado, IDProyecto). ¿Qué consulta SQL logrará esto?

opciones:

Opciones:

```sql SELECT e.EmpName FROM Employees e JOIN Departments d ON e.DeptID = d.DeptID JOIN EmployeeProjects ep ON e.EmpID = ep.EmpID JOIN Projects p ON ep.ProjectID = p.ProjectID WHERE d.DeptName = 'SpecificDepartment' AND p.ManagerID = 'SpecificManagerID'; ```

```sql SELECT EmpName FROM Employees, Departments, EmployeeProjects, Projects WHERE Departments.DeptName = 'SpecificDepartment' AND Projects.ManagerID = 'SpecificManagerID'; ```

```sql SELECT EmpName FROM Employees WHERE DeptID = (SELECT DeptID FROM Departments WHERE DeptName = 'SpecificDepartment') AND EmpID IN (SELECT EmpID FROM EmployeeProjects WHERE ProjectID IN (SELECT ProjectID FROM Projects WHERE ManagerID = 'SpecificManagerID')); ```

```sql SELECT e.EmpName FROM Employees e LEFT JOIN Departments d ON e.DeptID = d.DeptID LEFT JOIN EmployeeProjects ep ON e.EmpID = ep.EmpID LEFT JOIN Projects p ON ep.ProjectID = p.ProjectID WHERE d.DeptName = 'SpecificDepartment' OR p.ManagerID = 'SpecificManagerID'; ```

Pregunta 14.

Dadas dos tablas, employees (columnas: emp_id, emp_name, dept_id) y departments (columnas: dept_id, dept_name), ¿qué consulta SQL recupera correctamente el nombre del empleado junto con el nombre de su departamento?

Opciones:

SELECCIONAR e.nombre_empleado, d.nombre_departamento DE empleados e UNIRSE INTERNAMENTE departamentos d EN e.id_empleado = d.id_departamento;

SELECCIONAR e.nombre_empleado, d.nombre_departamento DE empleados e UNIRSE EXTERNAMENTE A LA IZQUIERDA departamentos d EN e.id_departamento = d.id_departamento;

SELECCIONAR e.nombre_empleado, d.nombre_departamento DE empleados e UNIRSE INTERNAMENTE departamentos d EN e.id_departamento = d.id_departamento;

SELECCIONAR nombre_empleado, nombre_departamento DE empleados, departamentos DONDE id_empleado = id_departamento;

Pregunta 15.

¿Qué instrucción SQL cuenta correctamente el número de clientes en cada país y ordena el resultado por el conteo en orden descendente?

opciones:

Opciones:

SELECCIONAR país, CONTAR(*) DE clientes ORDENAR POR país;

SELECCIONAR país, CONTAR(*) DE clientes AGRUPAR POR país ORDENAR POR CONTAR(*) DESC;

SELECCIONAR país, CONTAR(*) DE clientes ORDENAR POR CONTAR(*) ASC;

SELECCIONAR CONTAR(*), país DE clientes AGRUPAR POR país;

Pregunta 16.

¿Cuál de las siguientes instrucciones SQL es la forma correcta de insertar múltiples filas en una tabla llamada 'Productos' con las columnas 'IDProducto', 'NombreProducto' y 'Precio'?

Opciones:

INSERTAR EN Productos (IDProducto, NombreProducto, Precio) VALORES (1, 'Laptop', 1200), (2, 'Ratón', 25), (3, 'Teclado', 75);

INSERTAR EN Productos (IDProducto, NombreProducto, Precio) VALOR (1, 'Laptop', 1200), VALOR (2, 'Ratón', 25), VALOR (3, 'Teclado', 75);

INSERTAR EN Productos VALORES (1, 'Laptop', 1200), (2, 'Ratón', 25), (3, 'Teclado', 75);

INSERTAR EN Productos (IDProducto, NombreProducto, Precio) VALORES (1, 'Laptop', 1200); INSERTAR EN Productos (IDProducto, NombreProducto, Precio) VALORES (2, 'Ratón', 25); INSERTAR EN Productos (IDProducto, NombreProducto, Precio) VALORES (3, 'Teclado', 75);

Pregunta 17.

¿Qué instrucción SQL recupera todos los clientes que NO han realizado ningún pedido?

opciones:

Opciones:

SELECCIONAR * DE Clientes DONDE IDCliente NO EN (SELECCIONAR IDCliente DE Pedidos);

SELECCIONAR * DE Clientes DONDE IDCliente EN (SELECCIONAR IDCliente DE Pedidos);

SELECCIONAR * DE Clientes DONDE IDCliente NO EXISTE (SELECCIONAR IDCliente DE Pedidos);

SELECT * FROM Clientes WHERE CustomerID EXISTS (SELECT CustomerID FROM Órdenes);

Pregunta 18.

¿Cuál de las siguientes sentencias SQL calcula correctamente la diferencia en días entre dos fechas, 'fecha1' y 'fecha2'?

Opciones:

SELECT DATEDIFF(day, fecha1, fecha2);

SELECT fecha1 - fecha2 FROM días;

SELECT DIFFDATE(fecha1, fecha2, 'día');

SELECT DAYS_BETWEEN(fecha1, fecha2);

Pregunta 19.

¿Qué sentencia SQL calcula correctamente el salario promedio para cada departamento y solo incluye departamentos con más de 5 empleados?

Opciones:

SELECT departamento, AVG(salario) FROM empleados WHERE COUNT(*) > 5 GROUP BY departamento;

SELECT departamento, AVG(salario) FROM empleados GROUP BY departamento HAVING COUNT(*) > 5;

SELECT departamento, AVG(salario) FROM empleados WHERE departamento IN (SELECT departamento FROM empleados GROUP BY departamento HAVING COUNT(*) > 5);

SELECT departamento, AVG(salario) FROM empleados GROUP BY departamento ORDER BY COUNT(*) > 5;

Pregunta 20.

¿Qué sentencia SQL actualiza correctamente la tabla Clientes, estableciendo IsActivo en FALSO para los clientes cuyo CustomerID existe en la tabla ClientesInactivos?

Opciones:

UPDATE Clientes SET IsActivo = FALSE WHERE CustomerID IN (SELECT CustomerID FROM ClientesInactivos);

UPDATE Clientes SET IsActivo = FALSE FROM ClientesInactivos WHERE Clientes.CustomerID = ClientesInactivos.CustomerID;

UPDATE Clientes SET IsActivo = FALSE IF EXISTS (SELECT 1 FROM ClientesInactivos WHERE Clientes.CustomerID = ClientesInactivos.CustomerID);

UPDATE Clientes SET IsActivo = FALSE WHERE EXISTS (SELECT CustomerID FROM ClientesInactivos WHERE CustomerID = Clientes.CustomerID);

Pregunta 21.

¿Qué declaración SQL devolverá la fecha y hora actuales?

Opciones:

SELECT NOW();

SELECT CURRENT_DATETIME();

SELECT TODAY();

SELECT GETDATE();

Pregunta 22.

¿Qué consulta SQL recupera los nombres de los empleados que ganan un salario más alto que todos los empleados del departamento de 'Ventas'?

Opciones:

SELECT name FROM Employees WHERE salary > ALL (SELECT salary FROM Employees WHERE department = 'Sales');

SELECT name FROM Employees WHERE salary > (SELECT MAX(salary) FROM Employees WHERE department = 'Sales');

SELECT name FROM Employees WHERE salary > ANY (SELECT salary FROM Employees WHERE department = 'Sales');

SELECT name FROM Employees WHERE salary > SOME (SELECT salary FROM Employees WHERE department = 'Sales');

Pregunta 23.

¿Cuál de las siguientes declaraciones SQL crea correctamente una vista llamada EmployeeView que muestra el employee_id, first_name y last_name de la tabla Employees?

Opciones:

CREATE VIEW EmployeeView AS SELECT employee_id, first_name, last_name FROM Employees;

VIEW CREATE EmployeeView AS SELECT employee_id, first_name, last_name FROM Employees;

CREATE TABLE EmployeeView AS SELECT employee_id, first_name, last_name FROM Employees;

SELECT VIEW EmployeeView AS employee_id, first_name, last_name FROM Employees;

Pregunta 24.

¿Qué declaración SQL recupera correctamente el nombre de pila de los empleados cuyo apellido comienza con 'S' y muestra el nombre de pila en mayúsculas?

Opciones:

SELECT UPPER(first_name) FROM employees WHERE last_name LIKE 'S%';

SELECT first_name FROM employees WHERE UPPER(last_name) LIKE 'S%';

SELECT UCASE(first_name) FROM employees WHERE substring(last_name, 1, 1) = 'S';

SELECT UPPER(first_name) FROM employees WHERE last_name = 'S*';

Pregunta 25.

¿Qué declaración SQL recupera correctamente el nombre del departamento y el número de empleados en cada departamento, ordenando los resultados por el número de empleados en orden descendente?

Opciones:

SELECT department_name, COUNT(*) FROM employees GROUP BY department_name ORDER BY COUNT(*) DESC;

SELECT department_name, SUM(employee_id) FROM employees GROUP BY department_name ORDER BY employee_count DESC;

SELECCIONA department_name, COUNT(employee_id) DE empleados ORDENADO POR COUNT(*) DESC;

SELECCIONA department_name, COUNT(*) AS employee_count DE empleados ORDENADO POR employee_count ASC;

¿Qué habilidades de SQL deberías evaluar durante la fase de entrevista?

Si bien una sola entrevista no puede revelar por completo las capacidades de un candidato, centrarse en las habilidades clave de SQL te ayudará a tomar decisiones de contratación informadas. Evaluar estas competencias básicas garantiza que estás contratando a alguien que realmente puede trabajar con datos de manera efectiva. Exploremos qué habilidades de SQL deberías priorizar al evaluar durante la fase de entrevista.

¿Qué habilidades de SQL deberías evaluar durante la fase de entrevista?

Recuperación de datos

Evaluar las habilidades de recuperación de datos con preguntas de opción múltiple es una forma rápida de filtrar a los candidatos. Un test de evaluación de SQL con preguntas de opción múltiple relevantes puede ayudarte a identificar a los candidatos con una sólida comprensión de la sintaxis de SQL y la construcción de consultas.

Para evaluar las habilidades de recuperación de datos de un candidato, haz preguntas de entrevista específicas. Esto te permite observar su enfoque de resolución de problemas y su dominio de SQL en tiempo real.

Dada una tabla llamada 'Empleados' con las columnas 'employee_id', 'nombre', 'departamento' y 'salario', escribe una consulta para recuperar los nombres y salarios de todos los empleados del departamento de 'Marketing'.

Busque candidatos que puedan usar correctamente la cláusula WHERE para filtrar los resultados según el departamento. La consulta correcta debe seleccionar las columnas 'nombre' y 'salario' de la tabla 'Empleados' donde el 'departamento' es 'Marketing'.

Manipulación de datos

Puede evaluar eficientemente las habilidades de manipulación de datos de un candidato con preguntas de opción múltiple. Una evaluación de codificación SQL que presenta escenarios de manipulación de datos puede identificar rápidamente a los candidatos calificados.

Prepare preguntas de entrevista para evaluar directamente las habilidades de manipulación de datos de un candidato. Estas preguntas pueden revelar su comprensión de los comandos DML (Lenguaje de manipulación de datos) de SQL.

Dada una tabla llamada 'Productos' con las columnas 'product_id', 'nombre' y 'precio', escriba una consulta para aumentar el precio de todos los productos de la categoría 'Electrónica' en un 10%.

La respuesta ideal implica el uso de la instrucción UPDATE con una cláusula WHERE para apuntar a la categoría 'Electrónica'. El candidato debe demostrar cómo modificar los datos existentes utilizando SQL.

Diseño de base de datos

Si bien el diseño directo de la base de datos no se puede probar completamente con preguntas de opción múltiple, la comprensión de conceptos como la normalización y las relaciones sí se puede. Considere incluir preguntas de razonamiento lógico para evaluar su comprensión de los principios de diseño subyacentes.

Utilice preguntas de entrevista para evaluar su conocimiento del diseño de bases de datos. Esto puede revelar su capacidad para pensar críticamente sobre las estructuras y relaciones de los datos.

Describa los diferentes tipos de relaciones que pueden existir entre tablas en una base de datos relacional (por ejemplo, uno a uno, uno a muchos, muchos a muchos) y cómo los implementaría usando claves externas.

Busque candidatos que puedan articular los diferentes tipos de relaciones y cómo las claves externas hacen cumplir estas relaciones. Puntos extra si pueden explicar los conceptos de normalización y por qué son importantes.

Optimice su proceso de contratación de SQL con pruebas de habilidades y preguntas específicas

Al contratar para roles que requieren experiencia en SQL, evaluar con precisión las habilidades de los candidatos es primordial. Asegúrese de que su próxima contratación de SQL posea las habilidades adecuadas para contribuir eficazmente al éxito de su equipo.

La forma más efectiva de evaluar la competencia en SQL es a través de evaluaciones de habilidades dedicadas. Explore la gama de pruebas de SQL de Adaface, incluida nuestra Prueba en línea de SQL y pruebas especializadas como Prueba de Python SQL.

Aproveche los resultados de las pruebas para identificar a los mejores candidatos e invítelos a entrevistas específicas. Esto asegura que su proceso de entrevista se centre en validar las habilidades ya demostradas a través de las pruebas.

¿Listo para encontrar a su próximo gran experto en SQL? Regístrese en Adaface hoy y comience a evaluar candidatos con confianza. También puede explorar nuestra diversa biblioteca de pruebas en nuestra página de pruebas de evaluación.

Prueba en línea de SQL

25 minutos | 10 MCQs

La prueba en línea de SQL evalúa la capacidad de un candidato para diseñar y construir bases de datos relacionales y tablas desde cero, aplicar opciones CRUD, escribir consultas y subconsultas eficientes para filtrar datos y crear índices eficientes para consultas SQL más rápidas.

[

Probar la prueba en línea de SQL

](https://www.adaface.com/assessment-test/sql-online-test)

Descargar plantilla de preguntas de entrevista de SQL en múltiples formatos

Descargar plantilla de preguntas de entrevista de SQL en formato PNG, PDF y TXT

Preguntas frecuentes sobre las preguntas de la entrevista de SQL

Algunas buenas preguntas básicas de la entrevista de SQL cubren temas como las declaraciones SELECT, la cláusula WHERE, las operaciones JOIN y el filtrado básico de datos. Estas preguntas evalúan la comprensión del candidato de los conceptos fundamentales de SQL.

Las preguntas intermedias de la entrevista de SQL exploran temas como subconsultas, funciones agregadas (por ejemplo, COUNT, AVG, SUM), la cláusula GROUP BY y la optimización básica de consultas. Evalúan la capacidad del candidato para escribir consultas más complejas.

Las preguntas avanzadas de la entrevista de SQL se centran en temas como las funciones de ventana, los procedimientos almacenados, los desencadenadores, las estrategias de indexación y las técnicas avanzadas de optimización de consultas. Estas preguntas evalúan la experiencia de un candidato en SQL.

Las preguntas de la entrevista de expertos en SQL examinan temas como los principios de diseño de bases de datos, la optimización del rendimiento, la indexación avanzada, el análisis del plan de consultas y los conceptos de bases de datos NoSQL. Estas preguntas miden el dominio de un candidato de SQL y los sistemas de bases de datos.

Las pruebas de habilidades ayudan a optimizar el proceso de contratación de SQL al evaluar objetivamente las habilidades de un candidato. Proporcionan una forma estandarizada de evaluar las habilidades antes de las entrevistas, lo que ahorra tiempo y garantiza una mejor adaptación.