SQL Dotazy – Nejčastější chyby začátečníků v SQL příkazech při dotazování

Poslední aktualizace:

Články pro začátečníky zde na webu mají docela velký úspěch a návštěvnost a proto jsem se rozhodl na ně navázat. I ten nejlepší profík v jakémkoliv oboru někdy začínal a ze začátku dělal chyby. S úplnými základy SQL (není potřeba mít předchozí znalosti) se můžete seznámit v článcích:

U psaní prvních SQL skriptů budete na 100 % dělat chyby, než se naučíte ty správné automatismy. Chyby jsou přirozenou součástí učení. Často uděláte chybu z nepozornosti a ztratíte nějaký čas a nervy zjišťováním co vlastně máte blbě. Někdy vás na chybu nasměruje chybová hláška v SQL klientovi, někdy ne.

Proto jsem se rozhodl udělat seznam nejčastějších chyb na které časem určitě narazíte. Doporučuju si tyto chyby zapamatovat a až ji někdy uděláte, budete vědět odkud vítr vane 🙂

Některých chyb se dá do budoucnu vyvarovat správnými návyky při psaní kódu – SQL Přehledně zformátovaný kód – Chováme se ke kolegům zodpovědně!

1) SQL Skript pouštíme nad špatnou databází – Invalid object name

Častou chybou je to, že se pokoušíme přes SQL skript dotazovat do neexistujícího objektu. Totiž dotazujeme se nad databází , kde se daný objekt nenachází.

V našem případě bychom chtěli provést dotaz do tabulky “Priklad”, která se nachází v databázi [Temp]. My však stojíme nad jinou databází a proto výsledkem skriptu bude chyba.

Msg 208, Level 16, State 1, Line 3
Invalid object name ‘dbo.Priklad’.

Této chyby se do budoucna zcela vyvarujeme tím, že si zvykneme používat ve skriptech kompletní cestu na objekt v klauzuli FROM. To znamená [Databáze].[schéma].[objekt]. 

2) Překlepy v SQL klauzulích nebo názvech objektů – Invalid object name/syntax

To se stává docela často a nejen u začátečníků. Chyba u názvu objektu se dá lehce objevit, protože z chybové hlášky se dá lehce pochopit co se stalo, např.

Msg 208, Level 16, State 1, Line 3
Invalid object name ‘Temp.dbo.Prikla’.

Překlep můžeme udělat i jinak, třeba v klauzuli nebo se nám podaří do skriptu vepsat omylem nějaký znak.

Msg 102, Level 15, State 1, Line 6
Incorrect syntax near ‘Temp’.

Každy dělá překlepy různě často. Úplně se jich vyvarovat nemůžeme. Důležité je ale být schopen chybu brzy najít a opravit. Ve skriptu viz výše je to jednoduché – je krátký. U delších skriptů je klíčová přehlednost, pak se chyby daleko lépe hledají.

3) Čárka navíc – Incorrect syntax near the keyword

Možná jste si všimli, že jednotlivé sloupce vždy odděluji čárkami na dalším řádku. Má to svůj důvod a jedná se o správný návyk při psaní kódu. SQL skripty se často musí ladit nebo v budoucnu revidovat/opravovat – často některé sloupce chceme zakomentovat.

Pokud budeme jednotlivé sloupce oddělovat čárkou tímto způsobem a následně budem chtít sloupec zakomentovat, tak budeme muset vložit komentovací znak 2x (před čárku a před sloupec na dalším řádku). To je u velkých skriptů otravné a způsobuje to riziko chyb.

Msg 156, Level 15, State 1, Line 6
Incorrect syntax near the keyword ‘FROM’.

Správný návyk:

Správně se jednotlivé sloupce oddělují před názvem slupce na dalším řádku. Pokud pak chceme sloupec zakomentovat, tak je to mnohem snažší.

4) Chyby v logických operátorech AND a OR – (ne)používání závorek

Tyto chyby jsou nebezpečné neboť nezpůsobí error, ale jiný výsledek skriptu než očekáváme. Jedná se o kombinaci různých podmínek “a současně” (AND), “nebo” (OR) a jejich různých kombinací. Výsledkem skriptu je pak naprosto jiná množina záznamů než chceme.

Při složitějších podmínkách je potřeba být obezřetný a několikrát si skript zkontrolovat a v případě potřeby doplnit závorky – je rozdíl

  • [podmínka_1] AND [podmínka_2] OR [podmínka_3] AND [podmínka_4] AND [podmínka_5]
  • (([podmínka_1] AND [podmínka_2]) OR ([podmínka_3] AND[podmínka_4])) AND [podmínka_5]

5) Nepoužívání aliasů při joinech vede k chybě Ambiguous column name

Použivání aliasů jednotlivých joinů je opět správný návyk, který eliminuje spoustu potenciálních chyb. Častou chybou, která vzniká ve skriptech s joiny je to, že se například sloupec přes který tabulky spojujeme jmenuje stejně.

SELECT
  *
FROM [Temp].[dbo].[Priklad]
     JOIN [Temp].[dbo].[Priklad_2]
       ON [Datum] = [Datum];

výsledkem je pak chyba, protože SQL Server vlastně neví co má s čím spojit => neví ke které tabulce má sloupce Datum přiřadit

Msg 209, Level 16, State 1, Line 7
Ambiguous column name ‘Datum’.
Msg 209, Level 16, State 1, Line 7
Ambiguous column name ‘Datum’.

Jiná situace vzniká pokud použijeme alias

SELECT
 *
FROM [Temp].[dbo].[Priklad] [tab_1]
     JOIN [Temp].[dbo].[Priklad_2] [tab_2]
       ON [tab_1].[Datum] = [tab_2].[Datum]

Podobná chyba vznikne, pokud se pokusíme vyjmenovat do SELECT klauzule sloupce, jejich název je stejný v obou tabulkách. V select klauzuli je tedy potřeba alias používat také.

 

SQL Dotazy – Nejčastější chyby začátečníků v SQL příkazech při dotazování
5 (100%) 1 vote[s]

Jmenuji se Honza Zedníček a nejčastěji se se mnou v civilu můžete potkat v kancelářích Kentico Software v Brně, kde působím jako BI Developer. Částečně pracuji také jako freelancer. Tuto práci dělám pro různé firmy již přes 5 let, ale Kentico je moje srdcovka ♡. Před tím jsem pracoval jako finanční controller třeba v Aero Vodochody a Sberbank nebo jako manažer dluhopisového programu v investiční skupině Unicapital. Po práci si rád zahraju tenis, volejbal, šachy, zajdu do posilovny a rád ochutnávám dobré rumy. Svoje znalosti se snažím zapisovat na tento web - abych je nezapomněl (působením rumu ^^) a sloužily i někomu dalšímu. Nebojte se položit dotaz nebo reagovat do komentáře. Přihlašte se do naší nové Excel facebook skupiny Excel CZ/SK diskuse »

Category: SQL příkazy Základy SQL

About Ing. Jan Zedníček - BI Developer, Finance controller

Jmenuji se Honza Zedníček a nejčastěji se se mnou v civilu můžete potkat v kancelářích Kentico Software v Brně, kde působím jako BI Developer. Částečně pracuji také jako freelancer. Tuto práci dělám pro různé firmy již přes 5 let, ale Kentico je moje srdcovka ♡. Před tím jsem pracoval jako finanční controller třeba v Aero Vodochody a Sberbank nebo jako manažer dluhopisového programu v investiční skupině Unicapital. Po práci si rád zahraju tenis, volejbal, šachy, zajdu do posilovny a rád ochutnávám dobré rumy. Svoje znalosti se snažím zapisovat na tento web - abych je nezapomněl (působením rumu ^^) a sloužily i někomu dalšímu. Nebojte se položit dotaz nebo reagovat do komentáře. Přihlašte se do naší nové Excel facebook skupiny Excel CZ/SK diskuse »

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.