18th Apr 2024 Lectura de 22 minutos 15 preguntas engañosas de SQL para usuarios experimentados Tihomir Babic preguntas para entrevista de SQL SQL avanzado Índice Preparación de la entrevista como usuario experimentado de SQL Pregunta 1: Seleccionar autónomos y su información de tareas Pregunta 2: ¿Qué son los OUTER JOINs y cuándo se utilizan? Pregunta 3: Seleccionar Información de Freelancer y Tarea, Parte 2 Pregunta 4: Seleccionar información de autónomos para proyectos que vencen en 2024 Pregunta 5: Mostrar todos los empleados y sus jefes Pregunta 6: Mostrar terapeutas y su primera y segunda lengua Pregunta 7: Mostrar el número de autónomos con tareas asignadas Pregunta 8: Mostrar el Número de Tareas por Tipo y Subtipo de Tarea Pregunta 9: Mostrar el número de tareas activas por tipo y subtipo de tarea Pregunta 10: ¿Qué tiene de malo esta consulta? Pregunta 11: Mostrar todos los autónomos y el número de sus tareas Pregunta 12: Mostrar el número de tareas completadas por fecha de finalización Pregunta 13: Mostrar Empleados con sus Departamentos y Salarios Pregunta 14: ¿Cuál es la diferencia entre UNION y UNION ALL? Pregunta 15: Mostrar los libros seleccionados con su autor y subtítulo Más recursos de entrevistas para usuarios experimentados de SQL Las preguntas de las entrevistas SQL para usuarios experimentados suelen contener algunas preguntas capciosas. Los entrevistadores las utilizan para poner a prueba tus agallas, que suelen ser el resultado de una amplia experiencia y un alto nivel de conocimientos de SQL. En este artículo te mostraré 15 preguntas capciosas para entrevistas SQL (la mayoría de codificación). Eso sí, no son necesariamente preguntas complejas. En realidad, esa es su principal característica: parecen muy fáciles y sencillas, pero es el entrevistador el que intenta engañarte. Pero como usuario experimentado de SQL, deberías ser capaz de reconocer las trampas y evitarlas. Yo te enseñaré cómo hacerlo, pero no puedo preparar la entrevista en tu lugar. Entonces, ¿cómo debe enfocar la preparación de la entrevista? Preparación de la entrevista como usuario experimentado de SQL Unas bases sólidas en temas básicos e intermedios de SQL son requisitos previos para considerarte un usuario experimentado de SQL. Si no sabes en qué punto del espectro de conocimientos de SQL te encuentras, tenemos algo nuevo para ti: nuestra evaluación de habilidades SQL. Puedes hacer la prueba y evaluar tu nivel de SQL. Es una función gratuita; puedes hacer una prueba cada 30 días. Al final de la prueba, obtendrás una puntuación global sobre tus conocimientos de SQL. Hay resultados detallados para seis áreas de competencia: Consultas SQL básicas, Tipos de JOIN en SQL, Funciones SQL estándar, Informes SQL básicos, Informes SQL intermedios e Informes SQL complejos. Después de la evaluación, puede ir a nuestra pista SQL avanzado para practicar más. Consta de tres cursos interactivos principales que cubren detalles de funciones de ventana, extensiones de GROUP BY y consultas recursivas. Los temas se reparten a lo largo de 395 desafíos de codificación, por lo que escribirás mucho código, lo que se ha demostrado que es la forma más eficaz de aprender SQL. Una vez finalizado el curso, se sentirá cómodo con los temas avanzados de SQL. El curso de aprendizaje te aportará conocimientos, de eso no hay duda. Sin embargo, los empleadores confían en que los usuarios experimentados aprovechen SQL para resolver problemas de la vida real. Pero en la vida, las cosas rara vez son sencillas; los problemas reales no suelen ser ejemplos de libros de texto de SQL hechos a medida para el aprendizaje. Por lo tanto, debes ir más allá de los ejemplos del curso. Tienes que trabajar la flexibilidad y la creatividad, ver de antemano los posibles escollos y evitarlos en tu código SQL. Eso es lo que los entrevistadores buscan en los usuarios experimentados. Por eso, no basta con preparar la entrevista con preguntas SQL sencillas. También debes repasar las preguntas difíciles, ya que a los entrevistadores les gusta utilizarlas para intentar pillarte desprevenido. A continuación se presentan algunas de las preguntas difíciles más comunes en las entrevistas SQL para usuarios experimentados. Pregunta 1: Seleccionar autónomos y su información de tareas Escriba una consulta que seleccione todos los freelancers junto con la información de sus tareas: Título de la tarea Tipo y subtipo de tarea Fecha de vencimiento Incluya a los autónomos que no tengan ninguna tarea asignada. Conjunto de datos: El conjunto de datos es de una empresa que emplea autónomos en determinadas tareas. Consta de tres tablas. La primera tabla es freelancer. Puede encontrar el script aquí. idfirst_namelast_name 1BobFranklin 2DionneRavanelli 3MarekLewandowski 4FrancoisCousteau 5EmmaBiesa La segunda tabla es un diccionario de diferentes tipos de tareas denominado task_category. Aquí está el script. idtask_typetask_subtype 1Blog articleSQL 2Blog articlePython 3Blog articleCareer 4Social media postLinkedIn 5Social media postOther social media La tercera tabla muestra los detalles del trabajo asignado que los freelancers están haciendo para nuestra empresa. La tabla se llama taskcon el script aquí. idtask_category_idtitlefreelancer_iddate_assigneddue_datecompleted_date 12Working With Pandas in Python52023-11-302023-12-152023-12-15 24Promote SQL avanzado Learning Track42023-12-182023-12-202023-12-20 31Working With LEFT JOIN in SQL12023-12-082024-03-01NULL 43What Does a Data Analyst Do?22023-12-202024-02-012024-02-10 54Promote Working With Pandas in Python42024-01-152024-01-182024-01-18 62Python Libraries You Should Know12024-01-152024-02-152024-02-15 71Using COUNT in SQL22024-01-202024-02-152024-02-15 81Filtering Data in SQL52024-02-20NULLNULL Respuesta: Esta pregunta pone a prueba sus habilidades para unir tres tablas y elegir el tipo de unión correcto. Aquí está la solución: SELECT f.first_name, f.last_name, t.title, t.due_date, tc.task_type, tc.task_subtype FROM freelancer f JOIN task t ON f.id = t.freelancer_id JOIN task_category tc ON t.task_category_id = tc.id; Explicación: Para obtener toda la información necesaria, debe unir las tres tablas. Primero, una las tablas freelancer y task en el ID del autónomo. Para añadir la tercera tabla, de nuevo necesitas escribir la palabra clave JOIN. A continuación, indique en la cláusula ON que está uniendo tablas en el ID de categoría de tarea. El tipo de unión que utilice debe ser JOIN. Esto se debe a la posibilidad de que haya algunos autónomos que aún no tengan ninguna tarea. Usted sólo necesita los que tienen. Resultado: Esta es la salida de la consulta: first_namelast_nametitledue_datetask_typetask_subtype EmmaBiesaWorking With Pandas in Python2023-12-15Blog articlePython FrancoisCousteauPromote SQL avanzado Learning Track2023-12-20Social media postLinkedIn BobFranklinWorking With LEFT JOIN in SQL2024-03-01Blog articleSQL DionneRavanelliWhat Does a Data Analyst Do?2024-02-01Blog articleCareer FrancoisCousteauPromote Working With Pandas in Python2024-01-18Social media postLinkedIn BobFranklinPython Libraries You Should Know2024-02-15Blog articlePython DionneRavanelliUsing COUNT in SQL2024-02-15Blog articleSQL EmmaBiesaFiltering Data in SQLNULLBlog articleSQL Pregunta 2: ¿Qué son los OUTER JOINs y cuándo se utilizan? Respuesta: Esta pregunta quiere ver si usted realmente entiende cómo funcionan las uniones externas y cómo se diferencian de otras uniones. OUTER JOINs son una de las distintas categorías de join en SQL, junto con INNER JOINs y CROSS JOINs. Las siguientes uniones pertenecen a la familia OUTER JOIN: LEFT (OUTER) JOIN RIGHT (OUTER) JOIN FULL (OUTER) JOIN La característica principal de todos los OUTER JOINs es que unen tablas de forma que una tabla es dominante, por lo que se mostrarán todos sus datos. La segunda tabla está subordinada, de modo que la consulta sólo mostrará las filas coincidentes de esa tabla. Si hay filas no coincidentes, aparecerán como NULL. Por lo tanto, OUTER JOINdebe utilizarse cuando desee mostrar tanto las filas no coincidentes como las coincidentes dentro de las tablas. Cada una de las uniones externas anteriores funciona según este principio, pero se diferencian en lo siguiente: LEFT JOIN muestra todos los datos de la primera tabla (izquierda) y sólo las filas coincidentes de la segunda tabla (derecha). Si hay filas que no coinciden, se muestran como NULL. RIGHT JOIN muestra todos los datos de la segunda tabla (derecha) y sólo las filas coincidentes de la primera tabla (izquierda). Las filas no coincidentes se muestran como NULL. FULL JOIN combina LEFT JOIN y RIGHT JOIN. Muestra todos los datos de ambas tablas. En otras palabras, mostrará todas las filas (coincidentes y no coincidentes) de la tabla izquierda. A continuación, añadirá todas las filas de la tabla derecha que no se encuentren en la tabla izquierda. Donde haya datos no coincidentes, verá NULLs. Pregunta 3: Seleccionar Información de Freelancer y Tarea, Parte 2 Escriba una consulta que devuelva Los nombres y apellidos de los freelancers. Los títulos de sus tareas asignadas. Tipo y subtipo de tarea. Las fechas de vencimiento de las tareas. Incluir a todos los autónomos, incluso a los que no tienen ninguna tarea. Conjunto de datos: Igual que en la pregunta 1. Respuesta: Otra pregunta de entrevista SQL para el usuario experimentado. Aquí necesita demostrar que entiende las relaciones entre las tablas. Debe utilizar LEFT JOIN para unir las tres tablas. Debe utilizar LEFT JOIN como primera unión. Pero debe tener en cuenta que la relación entre las tablas le "obliga" a utilizar LEFT JOIN de nuevo como segunda unión. SELECT f.first_name, f.last_name, t.title, t.due_date, tc.task_type, tc.task_subtype FROM freelancer f LEFT JOIN task t ON f.id = t.freelancer_id LEFT JOIN task_category tc ON t.task_category_id = tc.id; Explicación: La consulta es muy similar a la de la Pregunta 1. Así que su primer join es LEFT JOIN, ya que necesita obtener todos los autónomos, no sólo los que tienen una tarea asignada. En otras palabras, la relación es tal que una tarea debe tener un autónomo asignado, pero un autónomo no necesita tener una tarea asignada. Sin embargo, cuando se une la tercera tabla, se necesita de nuevo LEFT JOIN. ¿Por qué? Porque una tarea tiene que tener un tipo y un subtipo. Al mismo tiempo, cada tipo de tarea disponible no necesita estar entre las tareas asignadas. Si utilizara INNER JOIN en su lugar, "cancelaría" la primera LEFT JOIN y sesgaría su salida. Salida: Este es el resultado: first_namelast_nametitledue_datetask_typetask_subtype EmmaBiesaWorking With Pandas in Python2023-12-15Blog articlePython FrancoisCousteauPromote SQL avanzado Learning Track2023-12-20Social media postLinkedIn BobFranklinWorking With LEFT JOIN in SQL2024-03-01Blog articleSQL DionneRavanelliWhat Does a Data Analyst Do?2024-02-01Blog articleCareer FrancoisCousteauPromote Working With Pandas in Python2024-01-18Social media postLinkedIn BobFranklinPython Libraries You Should Know2024-02-15Blog articlePython DionneRavanelliUsing COUNT in SQL2024-02-15Blog articleSQL EmmaBiesaFiltering Data in SQLNULLBlog articleSQL MarekLewandowskiNULLNULLNULLNULL Utilizando INNER JOIN como segunda unión eliminaría esta última fila, que muestra un autónomo sin tarea asignada. Si no hay tarea, tampoco hay tipo de tarea. Y INNER JOIN no muestra filas no coincidentes. Es por eso que LEFT JOIN es necesario aquí. Pregunta 4: Seleccionar información de autónomos para proyectos que vencen en 2024 Escriba una consulta que seleccione Todos los autónomos Los títulos de sus tareas Las fechas de vencimiento de las tareas Incluya sólo los proyectos con fecha de vencimiento en 2024. Conjunto de datos: El mismo que en la pregunta anterior. Solución: La pregunta quiere inducirle a escribir una consulta que utilice la cláusula WHERE para filtrar los datos, como se muestra a continuación: SELECT f.first_name, f.last_name, t.title, t.due_date FROM freelancer f LEFT JOIN task t ON f.id = t.freelancer_id WHERE t.due_date > '2023-12-31'; Pero esa no es la respuesta correcta. Para obtener el resultado deseado, la condición de filtrado en WHERE debe cambiarse a una condición de unión, como la siguiente: SELECT f.first_name, f.last_name, t.title, t.due_date FROM freelancer f LEFT JOIN task t ON f.id = t.freelancer_id AND t.due_date > '2023-12-31'; Explicación: En la primera consulta, el uso de WHERE devolvería sólo los datos de las tareas con fecha de vencimiento en 2024. Eso excluiría a todos los autónomos que no tienen una tarea asignada, pero también las tareas que no tienen - por varias razones - una fecha de vencimiento. Así que, en su lugar, movemos la condición de filtrado a la cláusula ON. La primera condición une las tablas en el ID del autónomo. La segunda condición se añade utilizando la palabra clave AND. De esta forma, se incluyen todos los autónomos pero se filtran los proyectos que vencían en 2023. Resultado: Aquí está la salida correcta: first_namelast_nametitledue_date BobFranklinWorking With LEFT JOIN in SQL2024-03-01 DionneRavanelliWhat Does a Data Analyst Do?2024-02-01 FrancoisCousteauPromote Working With Pandas in Python2024-01-18 BobFranklinPython Libraries You Should Know2024-02-15 DionneRavanelliUsing COUNT in SQL2024-02-15 EmmaBiesaNULLNULL MarekLewandowskiNULLNULL A pesar de que Emma Biesa tiene un proyecto titulado 'Filtrar datos en SQL', su fecha de vencimiento es NULL, por lo que el valor de la columna title es también NULL. En otras palabras, el proyecto de Emma Biesa no coincide con la condición de unión. Por otra parte, el resultado es el mismo para Marek Lewandowski. Esta vez, es porque Marek no tiene ningún proyecto asignado. Pregunta 5: Mostrar todos los empleados y sus jefes Conjunto de datos: La pregunta le proporciona la tabla employees. Este es el script. La tabla es una lista de empleados. idfirst_namelast_namemanager_id 1JohnBorisov2 2LindaJohnson8 3FrankRanieriNULL 4NinaBowie1 5TamaraFelipeNULL 6SimonFyodorov8 7LanaHopkinsNULL 8TomBonfa1 9MariaFox1 10VictorIvanchich2 Solución: Como sólo hay una tabla, tienes que demostrar que sabes que una tabla se puede unir consigo misma. En otras palabras, resuelve la pregunta aplicando una autounión. Esto se hace de la siguiente manera: SELECT e.first_name AS employee_first_name, e.last_name AS employee_last_name, m.first_name AS manager_first_name, m.last_name AS manager_last_name FROM employees e LEFT JOIN employees m ON e.manager_id = m.id; Explicación: Self-join es simplemente una tabla que se une consigo misma. Básicamente, al dar a una tabla diferentes alias, estás haciendo que SQL piense que has unido dos tablas diferentes. Nuestra 'primera' tabla tiene el alias e. La utilizaremos para mostrar los nombres de los empleados. El alias de la 'segunda' tabla unida es m; servirá para mostrar los nombres de los directivos. En este caso, debe unirlas utilizando LEFT JOIN porque la pregunta requiere que enumere todos los empleados. Esto también incluye a los empleados que no tienen jefes. Si utilizara INNER JOIN, obtendría sólo los empleados que tienen un gerente. La tabla está auto-unida con la condición de que el ID del manager sea igual al ID del empleado. Así se obtienen los nombres de los managers de cada empleado. Resultado: Esta es la lista de empleados y sus superiores: employee_first_nameemployee_last_namemanager_first_namemanager_last_name JohnBorisovLindaJohnson LindaJohnsonTomBonfa FrankRanieriNULLNULL NinaBowieJohnBorisov TamaraFelipeNULLNULL SimonFyodorovTomBonfa LanaHopkinsNULLNULL TomBonfaJohnBorisov MariaFoxJohnBorisov VictorIvanchichLindaJohnson NULLs como nombres de gerente significa que el empleado respectivo no tiene superior. Pregunta 6: Mostrar terapeutas y su primera y segunda lengua Escriba una consulta que devuelva todos los terapeutas con su primer y segundo idioma. Conjunto de datos: Este conjunto de datos procede de una consulta de psicoterapia colectiva destinada a expatriados. Varios terapeutas ofrecen terapia, y cada uno de ellos lo hace en dos idiomas. La lista de los idiomas está en la tabla language. Aquí está el guión. idlanguage_name 1English 2Dutch 3Russian 4Polish 5Croatian La lista de terapeutas figura en el cuadro therapist. Aquí está el script. idfirst_namelast_namefirst_language_idsecond_language_id 1MayaHoekstra21 2LanaMayakovski31 3MarijaAbramović52 4JanNowak41 5FrancisGordon12 Solución: Esta tarea, una de las muchas preguntas de entrevista SQL para usuarios experimentados, requiere que demuestres tus habilidades para unir tres tablas. Sin embargo, aquí una tabla se une dos veces. Debe reconocerlo, ya que la tabla therapist hace referencia a la tabla language en dos columnas: first_language_id y second_language_id. La solución debería tener este aspecto: SELECT t.first_name, t.last_name, fl.language_name AS first_language_name, sl.language_name AS second_language_name FROM therapist t JOIN language fl ON t.first_language_id = fl.id JOIN language sl ON t.second_language_id = sl.id; Explicación: Primero, unimos la tabla therapist con la tabla languagedándole a esta última el alias fl (como en "primera lengua"). Lo utilizaremos para mostrar la primera lengua del terapeuta, es decir, su lengua materna. Por eso la condición join busca donde el ID de la primera lengua es el mismo que el ID de la lengua. De este modo, se mostrará el nombre de la primera lengua. En el siguiente paso, volvemos a unir la tabla language. Esta vez, tiene el alias sl para "segunda lengua". La unión toma el ID de la segunda lengua y lo busca en language. Así obtenemos el nombre de la segunda lengua. Para mostrar el primer y el segundo idioma, seleccionamos la columna language_name - una vez desde la fl tabla' y la segunda vez de la sl y damos a las columnas los nombres apropiados. Resultado: Este es el resultado: first_namelast_namefirst_language_namesecond_language_name JanNowakPolishEnglish LanaMayakovskiRussianEnglish MayaHoekstraDutchEnglish FrancisGordonEnglishDutch MarijaAbramovićCroatianDutch Pregunta 7: Mostrar el número de autónomos con tareas asignadas Conjunto de datos: El conjunto de datos de autónomos utilizado en las preguntas 1, 3 y 4. Solución: Esta complicada pregunta de la entrevista le lleva a utilizar la función agregada COUNT(). Parece muy fácil, con una consulta sencilla que sólo utiliza una tabla. Sin embargo, la pregunta quiere que te precipites y escribas la siguiente consulta: SELECT COUNT(freelancer_id) AS number_of_working_freelancers FROM task; Sin embargo, tienes que demostrar que eres más inteligente que eso y escribir una consulta que utilice COUNT(DISTINCT freelancer_id) en lugar de COUNT(freelancer_id). SELECT COUNT(DISTINCT freelancer_id) AS number_of_working_freelancers FROM task; Explicación: ¿Por qué es incorrecta la primera consulta? Bueno, COUNT(freelancer_id) contará cada instancia del ID de un autónomo. Esto significa que también contará los duplicados como otro autónomo. (Recuerde que cada freelancer puede tener múltiples tareas). Para evitar esto, simplemente añada DISTINCT en esta expresión. Esto eliminará los duplicados - es decir, cada freelancer será contado sólo una vez. Resultado: La primera consulta devolverá esto: number_of_working_freelancers 8 Sabe que es incorrecto porque conoce sus datos. La tabla freelancer tiene sólo cinco autónomos listados, por lo que no puede ser cierto que haya más autónomos trabajando que autónomos. Por lo tanto, la salida correcta es la siguiente. Hay cuatro autónomos porque sabemos que uno está sin asignar, es decir, no está trabajando. number_of_working_freelancers 4 Pregunta 8: Mostrar el Número de Tareas por Tipo y Subtipo de Tarea Conjunto de datos: Igual que el anterior. Solución: Aquí debe reconocer que necesita utilizar una función agregada y agrupar la salida por dos columnas. SELECT task_type, task_subtype, COUNT(*) AS number_of_tasks FROM task_category tc JOIN task t ON tc.id = t.task_category_id GROUP BY task_type, task_subtype; Explicación: Para obtener la salida, necesita unir las tablas task_category y task en el ID del tipo de tarea. A continuación, seleccione el tipo y subtipo de tarea, y utilice COUNT(*), que simplemente contará el número de filas, que es igual al número de tareas. Cada fila es una tarea. A continuación, utilice GROUP BY para agrupar los datos por tipo de tarea. Sin embargo, la pregunta le pide que agregue los datos también en el nivel de subtipo de tarea, por lo que debe agregarlo en GROUP BY. Todas las columnas en GROUP BY deben estar separadas por una coma. Resultado: El tipo de tarea "Publicación en redes sociales" sólo aparece una vez, ya que no hay otros subtipos en las tareas activas. Por otro lado, el tipo de tarea "Artículo de blog" aparece tres veces, cada una con un subtipo de tarea diferente. La columna number_of_tasks representa el número de tareas por subtipo. task_typetask_subtypenumber_of_tasks Social media postLinkedIn2 Blog articleSQL3 Blog articlePython2 Blog articleCareer1 Pregunta 9: Mostrar el número de tareas activas por tipo y subtipo de tarea Escriba una consulta que muestre el número de tareas activas por tipo y subtipo de tarea. Incluya sólo las categorías con más de dos tareas. Conjunto de datos: El mismo que el anterior. Solución: Esta pregunta de entrevista SQL común pondrá a prueba si usted reconoce que es necesario utilizar HAVING en lugar de WHERE para filtrar la salida. Podrías resolver la pregunta así: SELECT task_type, task_subtype, COUNT(*) AS number_of_tasks FROM task_category tc JOIN task t ON tc.id = t.task_category_id WHERE COUNT(*) > 2 GROUP BY task_type, task_subtype; Eso es incorrecto, por lo que necesita reemplazar WHERE con HAVING: SELECT task_type, task_subtype, COUNT(*) AS number_of_tasks FROM task_category tc JOIN task t ON tc.id = t.task_category_id GROUP BY task_type, task_subtype HAVING COUNT(*) > 2; Explicación: Esta consulta es básicamente la misma que la de la pregunta anterior. El requisito adicional es mostrar sólo los tipos y subtipos de tareas con más de dos tareas activas. La primera consulta no devolverá nada excepto un error diciendo que las funciones agregadas no pueden usarse en WHERE. Esto se debe, por supuesto, a que WHERE filtra los datos antes de la agregación. Así que primero hay que agregar los datos utilizando COUNT(*) para encontrar el número de tareas activas por tipo y subtipo. Sólo después podrá buscar las categorías con más de dos tareas. En otras palabras, debe utilizar HAVING, ya que filtra los datos después de la agregación. Sólo tiene que utilizar la agregación de la columna number_of_tasks y establecer la condición de que el recuento debe ser superior a dos. Salida: task_typetask_subtypenumber_of_tasks Blog articleSQL3 Pregunta 10: ¿Qué tiene de malo esta consulta? Conjunto de datos: Igual que el anterior. Solución: La pregunta le da una consulta: SELECT first_name, last_name, task_type, task_subtype, COUNT(task_category_id) AS task_count FROM freelancer f JOIN task t ON f.id = t.freelancer_id JOIN task_category tc ON t.task_category_ID = tc.id GROUP BY first_name, last_name, task_type ORDER BY last_name; Su respuesta debería ser que esta consulta no funciona porque la columna task_subtype no aparece en la cláusula GROUP BY. La consulta corregida debería tener este aspecto: SELECT first_name, last_name, task_type, task_subtype, COUNT(task_category_id) AS task_count FROM freelancer f JOIN task t ON f.id = t.freelancer_id JOIN task_category tc ON t.task_category_ID = tc.id GROUP BY first_name, last_name, task_type, task_subtype ORDER BY last_name; Explicación: ¿Por qué la columna task_subtype debe aparecer en GROUP BY? La regla en SQL es que todas las columnas (excepto las que contienen funciones agregadas) deben aparecer en GROUP BY. Esto es algo que deberías saber y ser capaz de reconocer en la consulta inmediatamente. Salida: La salida corregida ahora funcionará y devolverá el siguiente resultado. Muestra los freelancers y el número de sus tareas por tipo y subtipo. first_namelast_nametask_typetask_subtypetask_count EmmaBiesaBlog articlePython1 EmmaBiesaBlog articleSQL1 FrancoisCousteauSocial media postLinkedIn2 BobFranklinBlog articlePython1 BobFranklinBlog articleSQL1 DionneRavanelliBlog articleCareer1 DionneRavanelliBlog articleSQL1 Pregunta 11: Mostrar todos los autónomos y el número de sus tareas Conjunto de datos: Igual que el anterior. Solución: En esta pregunta, podrías fácilmente escribir una consulta que use COUNT(*) para encontrar el número de tareas, así: SELECT first_name, last_name, COUNT(*) AS task_count FROM freelancer f LEFT JOIN task t ON f.id = t.freelancer_id GROUP BY first_name, last_name; Sí, ha utilizado sabiamente LEFT JOIN para devolver los autónomos sin tarea. Sin embargo, debería utilizar COUNT(task_category_id) en lugar de COUNT(*)... SELECT first_name, last_name, COUNT(task_category_id) AS task_count FROM freelancer f LEFT JOIN task t ON f.id = t.freelancer_id GROUP BY first_name, last_name; ... ¿verdad? Explicación: ¡No caigas en ese truco! Seguro que sabe que COUNT(*) no debe utilizarse en combinación con LEFT JOIN. Utiliza LEFT JOIN para incluir autónomos sin la tarea. Esos autónomos no tendrán valores coincidentes en la tabla de la derecha, por lo que se mostrarán como NULL. Desafortunadamente, COUNT(*) no ignora NULLs, por lo que se contarán como valores regulares. En su lugar, debe utilizar COUNT(task_category_id). De esta forma, sólo contará los valores noNULL. Resultados: Eche un vistazo a la salida de la primera consulta (incorrecta): first_namelast_nametask_count DionneRavanelli2 MarekLewandowski1 EmmaBiesa2 BobFranklin2 FrancoisCousteau2 Marek Lewandowski tiene una tarea. Pero sabemos que esto no puede ser correcto, ya que no tiene ninguna tarea asignada. La salida muestra el recuento de uno porque COUNT(*) contó el valor NULL (fila no coincidente). La salida de la consulta de solución muestra correctamente que el recuento de tareas de Marek es cero: first_namelast_nametask_count DionneRavanelli2 MarekLewandowski0 EmmaBiesa2 BobFranklin2 FrancoisCousteau2 Pregunta 12: Mostrar el número de tareas completadas por fecha de finalización Escriba una consulta que muestre el número de tareas completadas por fecha de finalización. Incluya NULLs como una categoría de fecha independiente. Conjunto de datos: El mismo que el anterior. Solución: Esta pregunta intenta engañarle haciéndole pensar que de alguna manera necesita establecer explícitamente una condición en la que todas las tareas sin fecha de finalización se cuenten juntas bajo la categoría NULL como fecha. Pero la solución es más sencilla de lo que piensa: SELECT completed_date, COUNT(id) AS completed_task_count FROM task GROUP BY completed_date ORDER BY completed_date ASC; Explicación: Como puede ver, la consulta anterior no se refiere a NULLs de ninguna manera. Simplemente selecciona la fecha de finalización y utiliza COUNT() en la columna ID de tarea para contar el número de tareas finalizadas. Por supuesto, la salida debe agruparse por fecha de finalización. También se ordena de la fecha más antigua a la más reciente, lo que no es necesario pero queda mejor. Al escribir una consulta de este tipo, demuestra que entiende que los valores de NULL no se cuentan por separado. Todos los valores de NULL se mostrarán como una categoría - NULL. Resultado: Como puede ver, todas las tareas sin fecha de finalización se muestran en una fila: completed_datecompleted_task_count 2023-12-151 2023-12-201 2024-01-181 2024-02-101 2024-02-152 NULL2 Pregunta 13: Mostrar Empleados con sus Departamentos y Salarios Escriba una consulta que muestre los empleados, sus departamentos y sus salarios. Incluya sólo a los empleados con un salario inferior a la media de su departamento. Conjunto de datos: Esta pregunta de entrevista SQL utiliza la tabla salaries. Puedes encontrar el script aquí. idfirst_namelast_namedepartmentsalary 1BennyGilhespySales5,293.47 2BenettaFeatherstonhaughEngineering2,214.55 3KarlaStiellSales2,070.45 4SissieSeabonAccounting5,077.42 5GennaBecheAccounting7,451.65 6KirstenFernandezEngineering7,533.13 7PenFredySales7,867.54 8TishCalderbankSales4,103.19 9GallardPhilipetAccounting7,220.06 10WalshKleinholzAccounting4,000.18 11CarceWilkensonAccounting3,991.00 12TamiLangrishSales5,588.34 13ShayneDearnEngineering2,785.92 14MerlaIngilsonEngineering2,980.36 15KeelyPatifieldSales2,877.92 Solución: La parte complicada aquí es reconocer que la consulta puede ser muy corta si sabes usar subconsultas correlacionadas. Debería hacerse así: SELECT id, first_name, last_name, department, salary FROM salaries s1 WHERE salary < (SELECT AVG(salary) FROM salaries s2 WHERE s1.department = s2.department); Explicación: Así, la consulta primero lista todas las columnas requeridas de la tabla salarios. Le he dado un alias a la tabla, s1. A continuación, utilizo la cláusula WHERE para comparar el salario de cada empleado con la media departamental. La media departamental se calcula en un tipo especial de subconsulta: una subconsulta correlacionada. ¿Qué tiene de especial? Bueno, esta subconsulta está correlacionada porque hace referencia a los datos de la consulta principal. Esto ocurre en la cláusula WHERE de una subconsulta: el departamento de la tabla s1 (que aparece en la consulta principal) tiene que ser el mismo que el departamento de la tabla s2 que aparece en la subconsulta. Esta condición permitirá a la función agregada AVG() calcular la media departamental del departamento en el que trabaja este empleado en concreto. Resultado: La siguiente tabla muestra sólo los empleados cuyos salarios están por debajo de la media de los salarios de sus respectivos departamentos.: idfirst_namelast_namedepartmentsalary 2BenettaFeatherstonhaughEngineering2,214.55 3KarlaStiellSales2,070.45 4SissieSeabonAccounting5,077.42 8TishCalderbankSales4,103.19 10WalshKleinholzAccounting4,000.18 11CarceWilkensonAccounting3,991.00 13ShayneDearnEngineering2,785.92 14MerlaIngilsonEngineering2,980.36 15KeelyPatifieldSales2,877.92 Pregunta 14: ¿Cuál es la diferencia entre UNION y UNION ALL? Respuesta: Para responder a esta pregunta, obviamente debe conocer la diferencia entre los dos operadores de conjunto más comunes en SQL. Ambos operadores fusionan verticalmente las salidas de dos o más consultas. UNION lo hace excluyendo las filas duplicadas. En otras palabras, si las mismas filas aparecen en ambas consultas, sólo se mostrarán una vez. Puede considerarse como DISTINCT en el mundo de los operadores de conjuntos. Por otro lado, UNION ALL muestra todas las filas de ambas consultas, incluidas las duplicadas. Puedes leer más sobre la diferencia entre UNION y UNION ALL en nuestra guía. Pregunta 15: Mostrar los libros seleccionados con su autor y subtítulo Escriba una consulta que seleccione el autor, el título y el subtítulo de un libro, pero sólo de aquellos libros cuyo subtítulo incluya la palabra "mujer". Incluya los libros sin subtítulos. Conjunto de datos: La tabla utilizada en este ejemplo es booksy el script está aquí. idfirst_namelast_namedepartmentsalary 2BenettaFeatherstonhaughEngineering2,214.55 3KarlaStiellSales2,070.45 4SissieSeabonAccounting5,077.42 8TishCalderbankSales4,103.19 10WalshKleinholzAccounting4,000.18 11CarceWilkensonAccounting3,991.00 13ShayneDearnEngineering2,785.92 14MerlaIngilsonEngineering2,980.36 15KeelyPatifieldSales2,877.92 Solución: Lo más sencillo es buscar la palabra "mujer" en el subtítulo. Sin embargo, ¿cómo incluir también los libros sin subtítulos, es decir, con valores NULL? La respuesta es que necesita manejar explícitamente NULLs para incluirlos en la salida, de esta manera: SELECT author, title, subtitle FROM books WHERE subtitle ILIKE '%woman%' OR subtitle IS NULL; Explicación: Su respuesta incluye dos condiciones en WHERE. La primera condición busca la palabra "mujer" en el subtítulo. Para ello, utilice LIKE (si su base de datos no distingue entre mayúsculas y minúsculas) o ILIKE (si su base de datos distingue entre mayúsculas y minúsculas, como PostgreSQL). Para buscar la palabra en cualquier lugar de una cadena, debe rodearla con '%'. Como estás buscando una cadena, todo eso debe escribirse entre comillas simples. Ahora, puede añadir otra condición de filtrado en la que indique que el subtítulo debe ser NULL utilizando el operador IS NULL. Las dos condiciones se unen mediante la palabra clave OR, ya que no pueden cumplirse al mismo tiempo: si no hay subtítulo, éste no puede contener la palabra 'mujer'. Resultado: Esta es la salida que muestra todos los datos que cumplen cualquiera de las dos condiciones: authortitlesubtitle Miljenko JergovićSarajevo MarlboroNULL Tilar J. MazzeoIrena's ChildrenThe Extraordinary Story of the Woman Who Saved 2,500 Children from the Warsaw Ghetto Olga TokarczukPrimeval and Other TimesNULL Thomas HardyTess of the d' UrbevillesA Pure Woman Faithfully Presented Sylvia PlathArielNULL Toni MorrisonJazzNULL Haben GirmaHabenThe Deafblind Woman Who Conquered Harvard Law Más recursos de entrevistas para usuarios experimentados de SQL Estos 15 ejercicios cubren algunas de las preguntas "trampa" más comunes en las entrevistas SQL para usuarios experimentados. Disponer de todas estas soluciones debería hacerte consciente de las trampas que te tienden y de cómo evitarlas. Pero no debes detenerte ahora. Nunca hay demasiada preparación para una entrevista de trabajo. Así que te recomiendo que veas otros 25 ejemplos de consultas SQL avanzadas u otras 27 preguntas de entrevista SQL avanzadas. También deberías practicar lo que has aprendido aquí. Aquí tienes algunas ideas sobre cómo practicar SQL avanzado con nuestros cursos y algunos ejercicios de práctica de SQL avanzado para empezar. Utiliza esto junto con nuestro curso SQL avanzado y el curso de práctica SQL avanzado , ¡y estarás bien preparado para tu próxima entrevista de trabajo! Tags: preguntas para entrevista de SQL SQL avanzado