Volver a la lista de artículos Artículos
Lectura de 12 minutos

Preguntas de la entrevista de SQL avanzado (y respuestas)

¿Desea cambiar a un trabajo que utilice SQL? ¿No está seguro de qué esperar durante la entrevista de trabajo o de cómo evaluar sus conocimientos? Este artículo le dará una buena idea de su situación.

Si te sientes atascado en tu trabajo, no eres el único. La división moderna del trabajo empuja a las personas a realizar tareas muy específicas, esperando que no miren lo que hay al otro lado. Los trabajadores sólo deben centrarse en sus responsabilidades (a menudo repetitivas y aburridas) y no deben cuestionar nada más allá de eso. A menudo puede parecer que se trabaja en una cadena de montaje. Sí, una cadena de montaje, incluso en una bonita oficina con grandes ventanales, café gratis y fruta fresca. Pero aún así, una cadena de montaje. O tal vez sólo quiera hacer su trabajo más rápido, sin perder tiempo por el manejo ineficiente de los datos.

Cambiar de trabajo o mejorar su rendimiento puede aumentar considerablemente la sensación de estar haciendo algo útil. En este artículo se enumeran algunas preguntas avanzadas de SQL que podrían hacerte en una entrevista. ¡Y también te diremos las respuestas! De este modo, podrás evaluar tus conocimientos actuales y tal vez aprender algo nuevo.

Si aplicas esto a tu nuevo o actual trabajo, depende de ti. Empecemos nuestra "entrevista de trabajo".

(¿Buscas preguntas de SQL para principiantes? Este artículo es el que necesitas).

10 Ejercicio de SQL Preguntas y respuestas de la entrevista de trabajo

Pregunta 1: ¿Qué es un índice? ¿Cuáles son los dos tipos principales de índices?

Un índice es una estructura en una base de datos que puede ayudar a recuperar datos más rápidamente. Cuando se buscan datos en una tabla con una consulta SQL, se busca en toda la tabla y se devuelve el resultado. Una tabla no indexada se llama montón. Los datos almacenados en este tipo de tablas no suelen estar ordenados de ninguna manera en particular. Se almacenan en el orden en que fueron introducidos. Por lo tanto, la búsqueda de datos puede ser muy lenta y frustrante.

Cuando se consulta una tabla indexada, la base de datos acude primero al índice y recupera directamente los registros correspondientes. Los dos tipos principales de índices son

  • Agrupados
  • No agrupados

Un índice agrupado define el orden exacto de los datos almacenados en la tabla. Sólo puede haber un índice agrupado por tabla, ya que la tabla sólo puede ordenarse de una manera.

Un índice no agrupado simplemente apunta a los datos, sin que el orden de los datos en el índice sea el mismo que el orden físico de los datos reales. Los datos se almacenan en una ubicación, mientras que el índice se almacena en otra ubicación.

Pregunta 2: ¿Cuál es el código para crear un índice?

¡Ahora llegamos a un ejemplo práctico! Supongamos que tenemos la tabla employeeque tiene las siguientes columnas:

  • name - El nombre del empleado.
  • surname - El apellido del empleado.
  • nin - El número de identificación nacional del empleado (por ejemplo, el número de la seguridad social).

Su tarea consiste en crear un índice agrupado en la columna nin y un índice no agrupado en la columna surname. ¿Cómo lo hace?

Para crear el índice agrupado, el código será:

CREATE CLUSTERED INDEX CL_nin
ON employee(nin);

Esto creará el índice agrupado con el nombre CL_nin, en la tabla employee y la columna nin.

Para crear el índice no agrupado, el código será:

CREATE NONCLUSTERED INDEX NCL_surname
ON employee(surname);

Ejecute este código y creará un índice no agrupado con el nombre NCL_surname sobre la columna apellido de la tabla employee.

Importante: Si no se especifica un tipo (agrupado o no agrupado), se creará un índice no agrupado por defecto.

Pregunta 3: ¿Cómo se añade la clasificación a las filas utilizando RANK()?

El control de las cifras de ventas es esencial para cualquier empresa. Tomemos el ejemplo de un concesionario de automóviles. Puede haber muchos vendedores vendiendo coches cada día. Imagine que la dirección del concesionario está interesada en comparar a sus vendedores. Quieren saber quiénes rinden bien y quiénes se quedan por ahí. Usted tiene la tabla salespeople con la siguiente información:

  • first_name - El nombre del empleado.
  • last_name - El apellido del empleado.
  • cars_sold - El número de coches vendidos por este empleado.

¿Cómo se pone un rango en esta tabla, que se muestra a continuación?

first_namelast_namecars_sold
ClarabelleHanmer77
ChristianoOverstall51
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn57
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

El código para este problema es:

SELECT	RANK() OVER(ORDER BY cars_sold DESC) AS rank_sales,
		first_name,
		last_name,
		cars_sold
FROM salespeople;

El código utiliza la función de ventana RANK(). Como no se ha definido ninguna ventana, la función utilizará toda la tabla. Clasificará los datos según la columna cars_sold y el rango se añadirá a la nueva columna rank_sales. Ejecuta el código y obtendrás una bonita tabla - ¡que te dará un punto en tu entrevista!

rank_salesfirst_namelast_namecars_sold
1GlendonKnowlys116
2JolyTschierasche114
3CarlottaDytham106
4ArtemusWoolward100
5EmileeNanetti84
6ClarabelleHanmer77
7RubieDing72
8RainaBedinn57
9ChristianoOverstall51
10WilhelmKopec38

He escrito un artículo más detallado sobre las funciones de ventana y su uso (con ejemplos) si quieres profundizar. También está el práctico libro de cocina LearnSQL.es del que robé este código. También puedes hacerlo. La sección del libro de cocina es básicamente una lista de problemas comunes resueltos mediante el uso de SQL. Puedes encontrar una solución muy rápidamente, leer la explicación y obtener un fragmento de código que puedes utilizar para resolver tus tareas.

Pregunta 4: ¿Cuál es la diferencia entre RANK() y DENSE_RANK()?

La principal diferencia es que RANK() dará a todas las filas con los mismos valores (en los criterios de clasificación) el mismo rango. También omitirá los rangos si más de una fila tiene el mismo rango; el número de rangos omitidos dependerá de cuántas filas comparten el mismo valor. Esto crea rangos no consecutivos.

Con DENSE_RANK(), las filas con los mismos valores también se clasificarán igual. Sin embargo, esta función no omitirá ningún rango, por lo que dará lugar a rangos consecutivos.

He aquí un ejemplo para aclarar la diferencia. Modifiquemos la tabla del ejemplo anterior. La tabla tiene el siguiente aspecto:

first_namelast_namecars_sold
ClarabelleHanmer72
ChristianoOverstall84
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn72
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

Si ejecuta el código del ejemplo anterior, RANK() le dará este resultado:

rank_salesfirst_namelast_namecars_sold
1GlendonKnowlys116
2JolyTschierasche114
3CarlottaDytham106
4ArtemusWoolward100
5EmileeNanetti84
5ChristianoOverstall84
7ClarabelleHanmer72
7RubieDing72
7RainaBedinn72
10WilhelmKopec38

Notará que el rango 5 se asigna dos veces, luego el ranking se salta el 6 y va directamente al 7. El rango 7 se asigna tres veces, tras lo cual la clasificación pasa directamente al 10.

Si quiere ver cómo DENSE_RANK() clasifica las filas, ejecute el siguiente código:

SELECT	RANK() OVER(ORDER BY cars_sold DESC) AS rank_sales,
		DENSE_RANK () OVER (ORDER BY cars_sold DESC) AS dense_rank_sales,
		first_name,
		last_name,
		cars_sold
FROM salespeople;

Le dará un resultado que se parece a esto:

rank_salesdense_rank_salesfirst_namelast_namecars_sold
11GlendonKnowlys116
22JolyTschierasche114
33CarlottaDytham106
44ArtemusWoolward100
55EmileeNanetti84
55ChristianoOverstall84
76ClarabelleHanmer72
76RubieDing72
76RainaBedinn72
107WilhelmKopec38

Conocer las funciones de ventana es esencial para cualquier trabajo que requiera conocimientos avanzados de SQL. Para practicar más SQL y ver cómo las funciones de ventana pueden ayudarte, no dudes en probar el curso de LearnSQL.es's Funciones de ventana.

Pregunta 5: ¿Qué es un autoincremento?

Cualquier tipo de trabajo de base de datos requerirá este conocimiento. El autoincremento es una función SQL que crea automáticamente y de forma secuencial un número único cada vez que se añade un nuevo registro a la tabla.

La palabra clave que te dará esta función es AUTO_INCREMENT.

Este es el ejemplo. El código siguiente creará la tabla names con los valores definidos por INSERT INTO:

create table names (
	id INT NOT NULL AUTO_INCREMENT,
	first_name VARCHAR(50),
	last_name VARCHAR(50)
);
INSERT INTO names(first_name, last_name) VALUES ('Kristen', 'Yukhnev');
INSERT INTO names(first_name, last_name) VALUES ('Angelica', 'Hulson');

La tabla tendrá este aspecto:

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson

Para ver cómo funciona la función de autoincremento, añada un nuevo registro a la tabla anterior:

INSERT INTO names (first_name, last_name)
VALUES ('Rosalia', 'O''Towey');

Esto añadirá un nuevo registro a la tabla. Seleccione todos los datos para ver cómo ha cambiado la tabla:

SELECT *
FROM names;

Ahora la tabla tiene este aspecto:

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson
3RosaliaO'Towey

Cuando añadimos un nuevo registro a la tabla, AUTO_INCREMENT añadió automáticamente un nuevo número secuencial. Como el 1 y el 2 existían previamente en la tabla, con AUTO_INCREMENT la base de datos sabe que el siguiente valor será el 3.

Pregunta 6: ¿Qué es una subconsulta?

Una subconsulta (también llamada consulta interna o consulta anidada) es una consulta situada dentro de otra consulta. Devuelve datos que serán utilizados por la consulta principal. Normalmente se encuentra en la cláusula WHERE.

Pregunta 7: ¿Qué devolverá el siguiente código?

El siguiente código es un ejemplo de subconsulta:

SELECT	first_name,
		last_name,
		cars_sold
FROM cars
WHERE cars_sold >	(SELECT AVG (cars_sold)
					FROM cars);

La ejecución del código devolverá las columnas first_name, last_name, y cars_sold de la tabla carspero sólo cuando cars_sold sea mayor que el número medio de coches vendidos.

Pregunta 8: ¿Hay alguna diferencia entre un valor NULL y cero?

Sí. Un valor NULL es la ausencia de datos/información. Tiene un carácter cuantitativo ya que representa la ausencia de la cantidad. En pocas palabras, NULL en SQL significa que el valor es desconocido o falta; no sabemos cuál es el valor. Por otro lado, cero significa que hay un valor que es igual a, bueno, cero. Por lo tanto, el cero tiene un carácter cualitativo.

Pregunta 8: ¿Cómo filtraría los datos utilizando JOIN?

El significado básico de JOIN es que devolverá los datos de una tabla cuando esos datos sean iguales a los de una segunda tabla. Si se combina con la cláusula WHERE, JOIN puede utilizarse para filtrar datos.

A continuación se muestra un ejemplo de otro concesionario de automóviles. La primera tabla se llama carsy consta de los siguientes datos:

  • model_id - El número de identificación del modelo de coche.
  • model_name - El nombre de ese modelo.
  • brand_id - El ID de la marca del coche.
  • brand_name - El nombre de la marca del coche.
  • year_id - El año en que se produjo el modelo. (Utiliza los datos de la tabla production_year.)

La segunda tabla es production_yearque contiene las siguientes columnas:

  • year_id - Un número de identificación para cada año.
  • year - El año real de producción.

¿Qué harías si te piden que encuentres todos los modelos que se produjeron antes de 2016? Este es el código:

SELECT	model_name,
		brand_name
FROM	cars JOIN production_year ON cars.year_id = production_year.year_id
WHERE	year_id < 2016;

Permíteme explicar el código. Selecciona la columna model_name y brand_name de la tabla cars. Esta tabla se une a la tabla production_year utilizando la columna year_id, que es una conexión entre la tabla cars y la tabla production_year tablas. Debido a la cláusula WHERE, este código devuelve sólo los coches producidos antes de 2016, es decir, WHERE year_id < 2016.

Si estás interesado en aprender más sobre los JOINs o si quieres practicar lo que has aprendido, la pista de práctica de SQL de LearnSQL.es puede ayudarte con eso.

Pregunta 10: ¿Cómo extraerías los últimos cuatro caracteres de una cadena?

Para hacerlo, necesitarías la función RIGHT().

Por ejemplo, existe la tabla products que consta de los siguientes datos:

  • product - El nombre del producto.
  • manufacturer - La empresa que fabrica el producto.

La tabla tiene este aspecto:

productmanufacturer
X278 Hammer 2018Sledge Hammer
M+S Tyres Z348 2020Goodtyre
Paint red pearly 9R458PT12 2019PaintItBlack

Necesitas encontrar el año en que se fabricó cada producto. Pero quien creó la base de datos hizo un pésimo trabajo. No hay ninguna columna con el año de producción. No hay ningún dato disponible, excepto los cuatro últimos caracteres del nombre del producto. Para extraer el año de ese campo, este es el código que se utilizaría:

SELECT	product,
		manufacturer,
		RIGHT(product,4) AS year_produced
FROM products;

Y este es el resultado. Sencillo, ¿verdad?

productmanufactureryear_produced
X278 Hammer 2018Sledge Hammer2018
M+S Tyres Z348 2020Goodtyre2020
Paint red pearly 9R458PT12 2019PaintItBlack2019

Déjeme explicar lo que acabamos de hacer. El código, por supuesto, selecciona las columnas product y manufacturer. Luego, utilizando la función RIGHT(), hemos ordenado a la consulta que tome las cadenas de la columna producto y devuelva los cuatro últimos caracteres empezando por la derecha. Pondremos estos resultados mostrados en la nueva columna year_produced.

Pregunta 11: ¿Qué es una vista? ¿Cómo se crea una?

Una vista es una tabla virtual o una sentencia SQL almacenada que utiliza datos de una o varias tablas existentes. La vista se llama "tabla virtual" porque los datos se utilizan como una tabla, pero se recuperan cada vez que se ejecuta la vista. (El resultado de una vista no se almacena como una tabla. )

Digamos que hay una tabla llamada salary que contiene las siguientes columnas:

  • first_name - El nombre del empleado.
  • last_name - El apellido del empleado.
  • salary - El salario del empleado.
first_namelast_namesalary
MikeHammer2780
JohnJohnson1600
KateWilliams3000

La información sobre el salario de los empleados no está disponible para todos en la empresa. Sin embargo, en esta empresa todo el mundo necesita poder acceder a la lista de empleados. ¿Cómo les permitirías hacer eso y, al mismo tiempo, no romper ninguna regla de confidencialidad?

No les permitiría acceder a toda la tabla, pero podría crear una vista para ellos. De este modo, siempre podrían acceder a los datos más recientes sin ver nada confidencial. Así es como se hace:

CREATE VIEW		employee_list AS
SELECT		first_name,
			last_name
FROM salary;

Al ejecutar este código se creará una vista llamada employee_list, que recuperará la información de first_name y last_name de la tabla salary. Es sencillo, ¿verdad? La creas con el comando CREATE VIEW, y luego sólo tienes que escribir una consulta normal.

Bien, pero esto sólo creó una vista. Al crearla no se recupera ningún dato. Entonces, ¿cómo se ejecuta la vista? Simplemente finge que es una tabla normal. El código siguiente ejecutará la vista:

SELECT *
FROM employee_list;

¡Y la tabla resultante está aquí! Muy bien. No se muestran los salarios, ¡así que no arruinaste nada!

first_namelast_name
MikeHammer
JohnJohnson
KateWilliams

¿Crees que estás preparado para un trabajo en Ejercicio de SQL?

La longitud del artículo no nos permite cubrir todos los temas avanzados de SQL que podrías encontrar en una entrevista de trabajo. Sin embargo, he intentado ofrecerte una buena visión general de lo que puedes esperar al solicitar un trabajo que utilice SQL. Esto debería ser sólo un punto de partida para que empieces a investigar y veas dónde necesitas mejorar tus conocimientos. Si estás interesado en aprender más, hay un curso interactivo de SQL avanzado que puedes utilizar mientras te preparas para la entrevista.

¡No dudes en comentar en la sección de comentarios! Comparte tus opiniones y experiencias en las entrevistas.