SQL – Nivel 3 – Test 1
Respuestas:
1. ¿Cuál es la diferencia entre UNION y UNION ALL en SQL?
Respuesta: UNION elimina duplicados, UNION ALL los mantiene
Explicación:
- UNION: Combina los resultados de dos o más consultas y elimina duplicados.
- UNION ALL: Combina los resultados pero conserva duplicados, lo que puede ser más rápido.
Ejemplo:
SELECT nombre FROM clientes_a
UNION
SELECT nombre FROM clientes_b; — Sin duplicados
SELECT nombre FROM clientes_a
UNION ALL
SELECT nombre FROM clientes_b; — Incluye duplicados
2. ¿Qué es una función de ventana (window function) en SQL?
Respuesta: Una función que opera en una partición de filas
Explicación:
Las funciones de ventana, como ROW_NUMBER o RANK, realizan cálculos sobre un conjunto definido de filas (ventana) mientras preservan los resultados fila por fila.
Ejemplo:
SELECT nombre, salario,
RANK() OVER (PARTITION BY departamento ORDER BY salario DESC) AS ranking
FROM empleados;
3. ¿Qué hace la cláusula OVER en SQL?
Respuesta: Define una ventana de filas para funciones de ventana
Explicación:
OVER especifica cómo se agrupan o clasifican las filas para una función de ventana, como SUM, AVG, o RANK.
Ejemplo:
SELECT departamento, salario,
SUM(salario) OVER (PARTITION BY departamento) AS total_departamento
FROM empleados;
4. Dada la consulta:
WITH salarios_departamento AS (
SELECT departamento_id, AVG(salario) as salario_promedio,
ROW_NUMBER() OVER (ORDER BY AVG(salario) DESC) as ranking
FROM empleados
GROUP BY departamento_id
)
SELECT d.nombre, sd.salario_promedio
FROM salarios_departamento sd
JOIN departamentos d ON sd.departamento_id = d.id
WHERE sd.ranking <= 3;
Respuesta: Lista los 3 departamentos con el salario promedio más alto
Explicación:
- ROW_NUMBER genera un ranking de los departamentos basado en su salario promedio.
- WHERE sd.ranking <= 3 filtra solo los 3 primeros departamentos.
5. ¿Cuál es el propósito de la cláusula MERGE en SQL?
Respuesta: Fusionar datos de una tabla origen en una tabla destino
Explicación:
MERGE combina operaciones INSERT, UPDATE, y DELETE en una sola instrucción, dependiendo de si las filas coinciden o no.
Ejemplo:
MERGE INTO inventario_destino AS destino
USING inventario_origen AS origen
ON destino.id = origen.id
WHEN MATCHED THEN
UPDATE SET cantidad = origen.cantidad
WHEN NOT MATCHED THEN
INSERT (id, cantidad) VALUES (origen.id, origen.cantidad);
6. ¿Qué es un «deadlock» en el contexto de las bases de datos?
Respuesta: Una situación donde dos transacciones se bloquean mutuamente
Explicación:
Un deadlock ocurre cuando dos o más transacciones esperan indefinidamente porque cada una tiene un recurso bloqueado que la otra necesita.
7. ¿Qué es un índice de cobertura (covering index) en SQL?
Respuesta: Un índice que puede satisfacer una consulta sin acceder a la tabla
Explicación:
Un índice de cobertura incluye todas las columnas necesarias para responder a una consulta, eliminando la necesidad de buscar datos adicionales en la tabla.
Ejemplo:
CREATE INDEX idx_empleados_nombre_salario ON empleados(nombre, salario);
8. Considera la consulta:
SELECT e1.nombre, e1.salario
FROM empleados e1
WHERE 2 > (
SELECT COUNT(DISTINCT e2.salario)
FROM empleados e2
WHERE e2.salario > e1.salario
);
Respuesta: Lista los empleados con los dos salarios más altos
Explicación:
La subconsulta cuenta cuántos salarios son mayores que el de e1. Si esta cantidad es menor que 2, significa que e1 tiene uno de los dos salarios más altos.
9. ¿Qué hace la cláusula PARTITION BY en una función de ventana?
Respuesta: Divide el resultado en particiones para cálculos separados
Explicación:
PARTITION BY divide las filas en grupos para que las funciones de ventana operen por partición en lugar de todo el conjunto de datos.
Ejemplo:
SELECT departamento, salario,
RANK() OVER (PARTITION BY departamento ORDER BY salario DESC) AS ranking
FROM empleados;
10. ¿Qué es una transacción en SQL?
Respuesta: Una serie de operaciones que se ejecutan como una unidad atómica
Explicación:
Una transacción asegura que un conjunto de operaciones se complete en su totalidad o no se realice nada en absoluto, garantizando integridad y consistencia.
Ejemplo:
BEGIN TRANSACTION;
UPDATE cuentas SET saldo = saldo – 100 WHERE id = 1;
UPDATE cuentas SET saldo = saldo + 100 WHERE id = 2;
COMMIT;