Facebook Twitter WhatsApp LinkedIn Pinterest

Ahoj přátelé, v tomto příspěvku se podíváme na některé z nejčastějších dotazů SQL kladených při pohovorech. Tyto otázky a odpovědi na pohovory s dotazy SQL jsou určeny pro čerstvé i zkušené.
Ve skutečnosti mi byla většina těchto otázek položena při pohovorech v různých fázích mé kariéry.

Pokud chcete přeskočit základní otázky a začít s některými záludnými dotazy SQL, pak se můžete rovnou přesunout do naší sekce Otázky na pohovory s dotazy SQL pro zkušené.

Při pokusech o vytvoření dotazů na zde položené otázky vezměte jako referenci v úvahu dvě níže uvedené tabulky.

Tabulka – EmployeeDetails

.

EmpId FullName ManagerId DateOfJoining City
121 John Snow 321 31.1.2014 Toronto
321 Walter White 986 30.1.2015 Kalifornie
421 Kuldeep Rana 876 27/11/2016 New Delhi

Tabulka – ZaměstnanecMzda

.

EmpId Projekt Mzda Proměnná
121 P1 8000 500
321 P2 10000 1000
421 P1 12000 0

Pro vaše pohodlí, jsem pro vás sestavil deset nejčastějších otázek. Můžete se pokusit tyto otázky vyřešit a kliknutím na odkazy přejít na příslušné odpovědi.

  1. SQL dotaz na získání záznamů, které jsou přítomny v jedné tabulce, ale nejsou v jiné tabulce.
  2. SQL dotaz na získání všech zaměstnanců, kteří nepracují na žádném projektu.
  3. SQL dotaz na získání všech zaměstnanců ze EmployeeDetails, kteří nastoupili v roce 2020.
  4. Vyhledat všechny zaměstnance z EmployeeDetails, kteří mají záznam o platu v EmployeeSalary.
  5. Napsat SQL dotaz pro získání počtu zaměstnanců podle projektů.
  6. Vyhledat jména zaměstnanců a jejich plat, i když u zaměstnance není uvedena hodnota platu.
  7. Napsat SQL dotaz pro získání všech zaměstnanců, kteří jsou zároveň manažery.
  8. Napsat dotaz SQL pro získání duplicitních záznamů z tabulky EmployeeDetails.
  9. Napsat dotaz SQL pro získání pouze lichých řádků z tabulky.
  10. Napsat dotaz pro zjištění 3. nejvyššího platu z tabulky bez klíčového slova top nebo limit.

Nebo můžete také přejít na naše dvě níže uvedené sekce otázek na pohovor pro čerstvé i zkušené odborníky.

Obsah

Otázky k pohovoru na SQL dotaz pro čerstvé uchazeče

Zde je seznam nejlepších otázek a odpovědí k pohovoru na SQL dotaz pro čerstvé uchazeče, které jim pomohou při pohovoru. V těchto dotazech se zaměříme pouze na základní příkazy jazyka SQL.

Dotazy. 1. Jaké jsou odpovědi na dotazy? Napište dotaz SQL pro získání EmpId a FullName všech zaměstnanců pracujících pod manažerem s id – ‚986‘.
Ans. Pro získání údajů o zaměstnancích můžeme použít tabulku EmployeeDetails s klauzulí where pro manažera-

SELECT EmpId, FullNameFROM EmployeeDetailsWHERE ManagerId = 986;

Ques.2. napište dotaz SQL pro získání různých dostupných projektů z tabulky EmployeeSalary.
Ans. Při odkazu na tabulku EmployeeSalary vidíme, že tato tabulka obsahuje hodnoty projektů odpovídající jednotlivým zaměstnancům, nebo můžeme říci, že při výběru hodnot projektů z této tabulky budeme mít duplicitní hodnoty projektů.
Pro získání unikátních hodnot projektu tedy použijeme klauzuli distinct.

SELECT DISTINCT(Project)FROM EmployeeSalary;

Chyby.3. Napište dotaz SQL pro získání počtu zaměstnanců pracujících v projektu ‚P1‘.
Ans. Zde bychom použili agregační funkci count() s klauzulí SQL where-

SELECT COUNT(*) FROM EmployeeSalary WHERE Project = 'P1';

Chyby.4. Napište dotaz SQL pro získání počtu zaměstnanců pracujících v projektu ‚P1‘.
Ans.. napište dotaz SQL pro zjištění maximálního, minimálního a průměrného platu zaměstnanců.
Ans. Pro získání maximálních, minimálních a průměrných hodnot můžeme použít agregační funkci SQL-

SELECT Max(Salary), Min(Salary), AVG(Salary) FROM EmployeeSalary;

Ques.5. 6. Napište dotaz SQL pro vyhledání id zaměstnanců, jejichž plat leží v rozmezí 9000 a 15000.
Ans. Zde můžeme použít operátor ‚Between‘ s klauzulí where.

SELECT EmpId, SalaryFROM EmployeeSalaryWHERE Salary BETWEEN 9000 AND 15000;

Ques.6. Napište dotaz SQL pro vyhledání těch zaměstnanců, kteří bydlí v Torontu a pracují pod manažerem s ManagerId – 321.
Ans. Protože musíme splnit obě podmínky – zaměstnance bydlící v ‚Torontu‘ a pracující v projektu ‚P2‘. Proto zde použijeme operátor AND-

SELECT EmpId, City, ManagerIdFROM EmployeeDetailsWHERE City='Toronto' AND ManagerId='321';

otázky. 7. Napište dotaz SQL, abychom získali všechny zaměstnance, kteří buď žijí v Kalifornii, nebo pracují pod manažerem s ManagerId – 321.
Ans. Tato otázka v rozhovoru vyžaduje, abychom splnili obě podmínky – zaměstnance žijící v ‚Kalifornii‘ a pracující pod manažerem s ManagerId ‚321‘. Použijeme zde tedy operátor OR-

SELECT EmpId, City, ManagerIdFROM EmployeeDetailsWHERE City='California' OR ManagerId='321';

otázky.8. Napište dotaz SQL pro získání všech zaměstnanců, kteří pracují na jiném projektu než P1.
Ans. Zde můžeme použít operátor NOT pro získání řádků, které nesplňují danou podmínku.

SELECT EmpIdFROM EmployeeSalaryWHERE NOT Project='P1';

Nebo pomocí operátoru not equal to-

SELECT EmpIdFROM EmployeeSalaryWHERE Project <> 'P1';

Rozdíl mezi operátory NOT a <> SQL naleznete na tomto odkazu – Rozdíl mezi operátory NOT a !=.

otázky.9. napište dotaz SQL pro zobrazení celkového platu každého zaměstnance, který sečte Plat s hodnotou Proměnná.
Ans. Zde můžeme jednoduše použít operátor ‚+‘ v SQL.

SELECT EmpId,Salary+Variable as TotalSalary FROM EmployeeSalary;

Ques.10. napište dotaz SQL pro získání zaměstnanců, jejichž jméno začíná libovolnými dvěma znaky, za nimiž následuje text „hn“ a končí libovolnou posloupností znaků.
Ans. Pro tuto otázku můžeme vytvořit dotaz SQL pomocí operátoru like se znaky ‚_‘ a ‚%‘ zástupných znaků, kde ‚_‘ odpovídá jednomu znaku a ‚%‘ odpovídá ‚0 nebo více znakům‘.

SELECT FullNameFROM EmployeeDetailsWHERE FullName LIKE '__hn%';

Ques.11. napište dotaz SQL pro získání všech EmpIds, které jsou přítomny v jedné z tabulek – ‚EmployeeDetails‘ a ‚EmployeeSalary‘.
Ans. Abychom získali unikátní id zaměstnanců z obou tabulek, můžeme použít klauzuli Union, která může spojit výsledky obou dotazů SQL a vrátit unikátní řádky.

SELECT EmpId FROM EmployeeDetailsUNION SELECT EmpId FROM EmployeeSalary;

Ques.12. napište dotaz SQL pro získání společných záznamů mezi dvěma tabulkami.
Ans. SQL Server – použití operátoru INTERSECT-

SELECT * FROM EmployeeSalaryINTERSECTSELECT * FROM ManagerSalary;

MySQL – protože MySQL nemá operátor INTERSECT, tak můžeme použít dílčí dotaz-

SELECT *FROM EmployeeSalaryWHERE EmpId IN (SELECT EmpId from ManagerSalary);

Ques.13. napište dotaz SQL pro získání záznamů, které jsou přítomny v jedné tabulce, ale nejsou v jiné tabulce.
Ans. SQL Server – Použití operátoru MINUS-

SELECT * FROM EmployeeSalaryMINUSSELECT * FROM ManagerSalary;

MySQL – Protože MySQL nemá operátor MINUS, tak můžeme použít LEFT join-

SELECT EmployeeSalary.*FROM EmployeeSalaryLEFT JOINManagerSalary USING (EmpId)WHERE ManagerSalary.EmpId IS NULL;

Ques.14Napište SQL dotaz pro získání EmpIds, které jsou přítomny v obou tabulkách – ‚EmployeeDetails‘ a ‚EmployeeSalary.
Ans. Pomocí dílčího dotazu-

SELECT EmpId FROM EmployeeDetails where EmpId IN (SELECT EmpId FROM EmployeeSalary);

Ques.15. Napište SQL dotaz pro získání EmpIds, které jsou přítomny v EmployeeDetails, ale ne v EmployeeSalary.
Ans. Pomocí dílčího dotazu-

SELECT EmpId FROM EmployeeDetails where EmpId Not IN (SELECT EmpId FROM EmployeeSalary);

Ques.16Napište dotaz SQL pro získání celých jmen zaměstnanců a nahrazení mezery znakem ‚-‚.
Ans. Použití funkce ‚Replace‘-

SELECT REPLACE(FullName, ' ', '-') FROM EmployeeDetails;

Ques.17. Napište dotaz SQL pro získání pozice daného znaku (znaků) v poli.
Ans. Použití funkce ‚Instr‘-

SELECT INSTR(FullName, 'Snow')FROM EmployeeDetails;

Ques.18. Napište dotaz SQL, který zobrazí EmpId i ManagerId dohromady.
Ans. Zde můžeme použít příkaz CONCAT.

SELECT CONCAT(EmpId, ManagerId) as NewIdFROM EmployeeDetails;

Ques.19. Napište dotaz, který získá pouze první jméno(řetězec před mezerou) ze sloupce FullName tabulky EmployeeDetails.
Ans. V této otázce je požadováno, abychom nejprve získali umístění znaku mezera v poli FullName a poté z pole FullName vybrali první jméno.
Pro zjištění umístění použijeme metodu LOCATE v MySQL a CHARINDEX v SQL SERVER a pro načtení řetězce před mezerou použijeme metodu SUBSTRING NEBO MID.
MySQL – pomocí MID

SELECT MID(FullName, 1, LOCATE(' ',FullName)) FROM EmployeeDetails;

SQL Server – pomocí SUBSTRING

SELECT SUBSTRING(FullName, 1, CHARINDEX(' ',FullName)) FROM EmployeeDetails;

otázky.20. napište SQL dotaz, který vytvoří velká písmena u jména zaměstnance a malá písmena u hodnot města.
Ans. k dosažení zamýšlených výsledků můžeme použít SQL funkce Upper a Lower.

SELECT UPPER(FullName), LOWER(City) FROM EmployeeDetails;

Ques.21. Napište SQL dotaz, který vytvoří velká písmena u jména zaměstnance a malá písmena u hodnot města. Napište dotaz SQL pro zjištění počtu všech výskytů určitého znaku – ‚n‘ v poli FullName.
Ans. Zde můžeme použít funkci ‚Length‘. Můžeme odečíst celkovou délku pole FullName s délkou FullName po nahrazení znaku – ‚n‘.

SELECT FullName, LENGTH(FullName) - LENGTH(REPLACE(FullName, 'n', ''))FROM EmployeeDetails;

Chyba.22. Jaký je celkový počet výskytů znaku FullName? Napište dotaz SQL pro aktualizaci jmen zaměstnanců odstraněním počátečních a koncových mezer.
Ans. Pomocí příkazu ‚Update‘ s funkcí ‚LTRIM‘ a ‚RTRIM‘.

UPDATE EmployeeDetails SET FullName = LTRIM(RTRIM(FullName));

Ques.23. Napište dotaz SQL pro aktualizaci jmen zaměstnanců odstraněním počátečních a koncových mezer. Vyhledejte všechny zaměstnance, kteří nepracují na žádném projektu.
Ans. Toto je jedna z velmi základních otázek pohovoru, ve které chce tazatel zjistit, zda osoba zná běžně používaný operátor – Is NULL.

SELECT EmpId FROM EmployeeSalary WHERE Project IS NULL;

Ques.24. napište dotaz SQL pro získání jmen zaměstnanců, kteří mají plat větší nebo roven 5000 a menší nebo roven 10000.
Ans. Zde použijeme BETWEEN v klauzuli ‚where‘ pro vrácení EmpId zaměstnanců s platem splňujícím požadované kritérium a následně jej použijeme jako poddotaz pro zjištění fullName zaměstnance z tabulky EmployeeDetails.

SELECT FullName FROM EmployeeDetails WHERE EmpId IN (SELECT EmpId FROM EmployeeSalary WHERE Salary BETWEEN 5000 AND 10000);

Ques.25. Napište dotaz SQL pro získání jmen zaměstnanců, kteří mají plat větší nebo roven 5000 a menší nebo roven 10000. Napište dotaz SQL pro zjištění aktuálního data-času.
Ans. MySQL-

SELECT NOW();

SQL Server-

SELECT getdate();

Oracle-

SELECT SYSDATE FROM DUAL;

Ques.26. napište SQL dotaz pro získání všech údajů o zaměstnancích z tabulky EmployeeDetails, kteří nastoupili v roce 2020.
Ans. Použijte BETWEEN pro rozsah dat ’01-01-2020′ A ’31-12-2020′-

SELECT * FROM EmployeeDetailsWHERE DateOfJoining BETWEEN '2020/01/01'AND '2020/12/31';

Také můžeme vyjmout část roku z data připojení (pomocí YEAR v mySQL)-

SELECT * FROM EmployeeDetails WHERE YEAR(DateOfJoining) = '2020';

Ques.27. napište SQL dotaz pro získání všech záznamů zaměstnanců z tabulky EmployeeDetails, kteří mají záznam o platu v tabulce EmployeeSalary.
Ans. pomocí ‚Exists‘-

SELECT * FROM EmployeeDetails EWHERE EXISTS(SELECT * FROM EmployeeSalary S WHERE E.EmpId = S.EmpId);

Ques.28. Napište SQL dotaz pro získání všech záznamů zaměstnanců z tabulky EmployeeDetails, kteří mají záznam o platu v tabulce EmployeeSalary. Napište dotaz SQL pro získání počtu zaměstnanců podle projektů seřazených sestupně podle počtu projektů.
Ans. Dotaz má dva požadavky – nejprve získat počet zaměstnanců podle projektů a poté seřadit výsledek podle tohoto počtu.
Pro získání počtu podle projektů použijeme klauzuli GROUP BY a pro seřazení použijeme klauzuli ORDER BY na alias počtu projektů.

SELECT Project, count(EmpId) EmpProjectCountFROM EmployeeSalaryGROUP BY ProjectORDER BY EmpProjectCount DESC;

Dotaz.29: Jaký je počet zaměstnanců? Napište dotaz pro získání jmen zaměstnanců a záznamů o platech. Zobrazte údaje o zaměstnanci i v případě, že záznam o platu není u zaměstnance přítomen.
Ans. Toto je opět jedna z velmi častých otázek u pohovoru, ve které si tazatel chce pouze ověřit základní znalosti SQL JOINS.
Zde můžeme použít levé spojení s tabulkou EmployeeDetail na levé straně tabulky EmployeeSalary.

SELECT E.FullName, S.Salary FROM EmployeeDetails E LEFT JOIN EmployeeSalary SON E.EmpId = S.EmpId;

Dotaz.30. Jaké jsou možnosti spojení? Napište dotaz SQL na spojení 3 tabulek.
Ans. Uvážíme-li 3 tabulky TableA, TableB a TableC, můžeme použít 2 spojovací klauzule, jak je uvedeno níže-

SELECT column1, column2FROM TableAJOIN TableB ON TableA.Column3 = TableB.Column3JOIN TableC ON TableA.Column4 = TableC.Column4;

Pro více otázek na téma spojování SQL se můžete také podívat na naše top otázky na pohovory o spojování SQL.

Otázky k pohovoru na dotaz SQL pro zkušené

Přinášíme seznam nejčastěji kladených otázek k pohovoru na dotaz SQL pro zkušené odborníky. Tyto otázky se týkají dotazů SQL na pokročilé koncepty SQL JOIN, načítání duplicitních řádků, lichých a sudých řádků, n-tého nejvyššího platu atd.

Dotazy. 31. Napište dotaz SQL pro získání všech zaměstnanců, kteří jsou zároveň vedoucími pracovníky, z tabulky EmployeeDetails.
Ans. Zde musíme použít Self-Join, protože požadavek chce, abychom tabulku EmployeeDetails analyzovali jako dvě tabulky. Pro stejnou tabulku EmployeeDetails použijeme různé aliasy ‚E‘ a ‚M‘.

SELECT DISTINCT E.FullNameFROM EmployeeDetails EINNER JOIN EmployeeDetails MON E.EmpID = M.ManagerID;

Chcete-li se dozvědět více o Self Join spolu s několika dalšími dotazy, můžete se podívat na níže uvedené video, které velmi jednoduše vysvětluje koncept Self Join.

Self Join a jeho demonstrace

Dotaz.32. Napište SQL dotaz pro získání duplicitních záznamů z tabulky EmployeeDetails (bez zohlednění primárního klíče – EmpId).
Ans. Pro nalezení duplicitních záznamů z tabulky můžeme použít GROUP BY na všechna pole a následně pomocí klauzule HAVING vrátit pouze ta pole, jejichž počet je větší než 1, tj. řádky s duplicitními záznamy.

SELECT FullName, ManagerId, DateOfJoining, City, COUNT(*)FROM EmployeeDetailsGROUP BY FullName, ManagerId, DateOfJoining, CityHAVING COUNT(*) > 1;

Ques.33 . Napište dotaz SQL na odstranění duplicit z tabulky bez použití dočasné tabulky.
Ans. Zde můžeme použít odstranění s aliasem a vnitřním spojením. Zkontrolujeme rovnost všech odpovídajících záznamů a z nich odstraníme řádek s vyšším EmpId.

DELETE E1 FROM EmployeeDetails E1INNER JOIN EmployeeDetails E2 WHERE E1.EmpId > E2.EmpId AND E1.FullName = E2.FullName AND E1.ManagerId = E2.ManagerIdAND E1.DateOfJoining = E2.DateOfJoiningAND E1.City = E2.City;

Ques.34. V případě, že chcete odstranit řádek s vyšším EmpId, zkontrolujeme rovnost všech odpovídajících záznamů. Napište dotaz SQL, abyste z tabulky získali pouze liché řádky.
Ans. V případě, že máme pole s automatickým nárůstem, např. pole EmpId, pak můžeme jednoduše použít níže uvedený dotaz-

SELECT * FROM EmployeeDetails WHERE MOD (EmpId, 2) <> 0;

V případě, že takové pole nemáme, pak můžeme použít níže uvedené dotazy.
Použití řádku_číslo v SQL serveru a kontrola, že zbytek při dělení dvěma je 1-

SELECT E.EmpId, E.Project, E.SalaryFROM ( SELECT *, Row_Number() OVER(ORDER BY EmpId) AS RowNumber FROM EmployeeSalary) EWHERE E.RowNumber % 2 = 1;

Použití proměnné definované uživatelem v MySQL-

SELECT *FROM ( SELECT *, @rowNumber := @rowNumber+ 1 rn FROM EmployeeSalary JOIN (SELECT @rowNumber:= 0) r ) t WHERE rn % 2 = 1;

Dotazy.35. Napište dotaz SQL, abyste z tabulky získali pouze sudé řádky.
Ans. V případě, že máme pole s automatickým nárůstem, např. pole EmpId, pak můžeme jednoduše použít níže uvedený dotaz-

SELECT * FROM EmployeeDetails WHERE MOD (EmpId, 2) = 0;

V případě, že takové pole nemáme, pak můžeme použít níže uvedené dotazy.
Použití řádku_číslo v SQL serveru a kontrola, že zbytek při dělení dvěma je 1-

SELECT E.EmpId, E.Project, E.SalaryFROM ( SELECT *, Row_Number() OVER(ORDER BY EmpId) AS RowNumber FROM EmployeeSalary) EWHERE E.RowNumber % 2 = 0;

Použití uživatelsky definované proměnné v MySQL-

SELECT *FROM ( SELECT *, @rowNumber := @rowNumber+ 1 rn FROM EmployeeSalary JOIN (SELECT @rowNumber:= 0) r ) t WHERE rn % 2 = 0;

Dotazy.36. Napište dotaz SQL, který vytvoří novou tabulku s daty a strukturou zkopírovanou z jiné tabulky.
Ans.

CREATE TABLE NewTable SELECT * FROM EmployeeSalary;

Ques.37. V případě, že se jedná o tabulku s daty a strukturou zkopírovanou z jiné tabulky, můžete ji vytvořit. Napište dotaz SQL na vytvoření prázdné tabulky se stejnou strukturou jako nějaká jiná tabulka.
Ans. Zde můžeme použít stejný dotaz jako výše s podmínkou False ‚WHERE‘ –

CREATE TABLE NewTable SELECT * FROM EmployeeSalary where 1=0;

Ques.38. Napište dotaz SQL pro získání n nejlepších záznamů?
Ans. V MySQL pomocí LIMIT-

SELECT *FROM EmployeeSalaryORDER BY Salary DESC LIMIT N;

V SQL serveru pomocí příkazu TOP-

SELECT TOP N *FROM EmployeeSalaryORDER BY Salary DESC;

Ques.39. Jaký je váš dotaz? Napište dotaz SQL pro zjištění n-tého nejvyššího platu z tabulky.
Ans, Pomocí klíčového slova Top (SQL server)-

SELECT TOP 1 SalaryFROM ( SELECT DISTINCT TOP N Salary FROM Employee ORDER BY Salary DESC )ORDER BY Salary ASC;

Pomocí klauzule limit(MySQL)-

SELECT SalaryFROM EmployeeORDER BY Salary DESC LIMIT N-1,1;

Ques.40. Napište dotaz SQL pro zjištění n-tého nejvyššího platu z tabulky. Napište dotaz SQL pro zjištění 3. nejvyššího platu z tabulky bez použití klíčového slova TOP/limit.
Ans. Toto je jedna z nejčastěji kladených otázek při pohovoru. Použijeme k tomu korelovaný poddotaz.
Pro nalezení 3. nejvyššího platu budeme hledat hodnotu platu tak dlouho, dokud vnitřní dotaz nevrátí počet 2 řádků, které mají plat větší než ostatní odlišné platy.

SELECT SalaryFROM EmployeeSalary Emp1WHERE 2 = ( SELECT COUNT( DISTINCT ( Emp2.Salary ) ) FROM EmployeeSalary Emp2 WHERE Emp2.Salary > Emp1.Salary )

Pro n-tý nejvyšší plat-

SELECT SalaryFROM EmployeeSalary Emp1WHERE N-1 = ( SELECT COUNT( DISTINCT ( Emp2.Salary ) ) FROM EmployeeSalary Emp2 WHERE Emp2.Salary > Emp1.Salary )

Tímto končíme náš příspěvek o často kladených otázkách a odpovědích na pohovory s dotazem SQL. Doufám, že vám tyto otázky pomohou při vašich databázových pohovorech.
Pokud máte pocit, že jsme některou z častých otázek na pohovoru vynechali, dejte nám vědět v komentářích a my tyto otázky do našeho seznamu doplníme.

Podívejte se na náš článek – Otázky na pohovory o databázích, který se zaměřuje na teoretické otázky na pohovorech vycházející z konceptů DBMS a SQL.

Kuldeep je zakladatel a hlavní autor ArtOfTesting. Má zkušenosti s automatizací testování, výkonnostním testováním, big data a CI-CD. Své desetileté zkušenosti přináší do své současné role, kde se věnuje vzdělávání profesionálů v oblasti QA. Spojit se s ním můžete na síti LinkedIn.

Facebook Twitter WhatsApp LinkedIn Pinterest

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.