<aside>

A1 Čárky na začátek

Čárky pro oddělování sloupců nedávat na konec, ale na začátek. Na první pohled vidím, kde chybí. V níže uvedeném SQL je jedna čárka vynechána. Schválně, kde to najdu rychleji?

Než jsem začal psát čárky na začátek, moje nejčastější chyba byla Incorrect syntax near ‚,‘. Nedělal jsem nic jiného, než hledal čárky.

-------------- Čárky na začátku - OK -------------------
SELECT
	 f.Cislo
	,f.Datum
	 o.NazevOrganizace
	,f.Castka
FROM #Faktura f
LEFT OUTER JOIN #Organizace o on o.ID = f.OrganizaceID

-------------- Čárky na konci - KO -------------------
SELECT
	f.Cislo,
	f.Datum,
	o.NazevOrganizace
	f.Castka
FROM #Faktura f
LEFT OUTER JOIN #Organizace o on o.ID = f.OrganizaceID

Můj oblíbený online formátovač poorsql.com to dělá stejně.

</aside>

<aside>

A2 WHERE 1=1

Dávám na konec vždy WHERE 1=1 a pak teprve podmínky na samostatné řádky. Je to

  1. Přehlednější (AND je pod sebou)
  2. Můžu zakomentovat kteroukoli podmínku, i tu první.
SELECT
	 f.Cislo
	,f.Datum
	,f.Castka
FROM #Faktura f
WHERE 1=1
--AND Castka <> 0	--TOTO JE ZAKOMENTOVÁNO
AND Datum > '2020-01-01'

</aside>

<aside>

A3 OR vždy v závorce

Standardní podmínky za WHERE (nebo při spojování tabulek) jsou AND podmínka. Omezují počet řádků, které mi SELECT vrací.

Ale někdy je potřeba dát i OR. Typicky to bývá když je někde výčet hodnot.

Třeba chci všechny faktury nad 1000 na organizaci A NEBO (=OR) organizaci B.

Bez výjimky, jakmile se vyskytne OR, dávám OR do závorek. A snažím se ho oddělit, abych nenarušil podmínky AND.

SELECT
	 f.Cislo
	,f.Datum
	,f.Castka
FROM #Faktura f
WHERE 1=1
AND Castka <> 0
AND (f.organizaceID = 1 OR f.OrganizaceID = 2) --OR musí být vždy v závorce.
AND Datum > '2020-01-01'

</aside>

<aside>

A4 JOIN bez OUTER nebo INNER

Píšu LEFT JOIN, ****nikoli LEFT OUTER JOIN. Je to zbytečné slovo navíc.

Píšu JOIN, nikoli INNER JOIN. Je to zbytečné slovo navíc.

PS RIGHT JOIN se nepoužívá. Jen se (zbytečně) učí ve škole.

</aside>

<aside>

A5 JOIN do jednoho řádku

Podmínky spojení za ON píšu do jednoho řádku. Pro mě je ten kód přehlednější. Nejprve procházím, jaké tabulky se připojují a pak teprve zkoumám jak.

-- toto se mi nelíbí. Zabírá to hodně místa na výšku a špteně se mi hledá jaké tabulky joinuji
SELECT f.Cislo
	,f.Datum
	,o.NazevOrganizace
	,z.PrijmeniJmeno
	,f.Castka
FROM #Faktura f
LEFT JOIN #Organizace o
	ON o.ID = f.OrganizaceID
LEFT JOIN #Zamestnanci z
	ON z.id = f.VystavilID

--Toto se mě líbí. 
SELECT
	f.Cislo
	,f.Datum
	,o.NazevOrganizace
	,z.PrijmeniJmeno
	,f.Castka
FROM #Faktura f
LEFT OUTER JOIN #Organizace o on o.ID = f.OrganizaceID
LEFT OUTER JOIN #Zamestnanci z on z.id = f.VystavilID

V mém oblíbeném poorsql je to volba “ Break Join ON Sections“ která je implicitně nazaškrtnutá = jako to používám já.

</aside>

<aside>

A6 Keywords klidně malými

Klíčová slova jako SELECT, WHERE, FROM, CASE, atd. by se měla psát velkými písmeny.

Mám to ale vždy barevně zvýrazněné, takže to neřeším a používám klidně malá písmena. Velkými jen když chci něco zdůraznit.

-- Keywords malými podle mě není takový problém
select
	f.Cislo
	,f.Datum
	,o.NazevOrganizace
	,f.Castka
from #Faktura f
left join #Organizace o on o.ID = f.OrganizaceID
where 1=1

-- Keywords velkými
SELECT
	f.Cislo
	,f.Datum
	,o.NazevOrganizace
	,f.Castka
FROM #Faktura f
LEFT JOIN #Organizace o ON o.ID = f.OrganizaceID
WHERE 1=1

</aside>

<aside>

A7 Pomocné select top 100 *

Před from mám dva zakomentované řádky:

— SELECT TOP 100 *

— SELECT count(*)

Když se pak chci podívat třeba na počet záznamů, vyznačím si jen odpovídající část.

U toho count(*) si dávám ještě počet záznamů a informaci a jestli se joiny mění počet řádků

PS Z výsledku selectu si můžu nakopírovat názvy sloupců (pravé tlačítko na záhlaví výsledku/Copy with headers) apod.

SELECT
	f.Cislo
	,f.Datum
	,o.NazevOrganizace
	,f.Castka
-- SELECT TOP 100 *
-- SELECT COUNT(*) -- 2050 počet řádků je joinem NESMI ZMĚNIT!
FROM #Faktura f
LEFT JOIN #Organizace o ON o.ID = f.OrganizaceID
WHERE 1=1

</aside>

<aside>

A8 V proceduře dávám parametry

Uložená procedura s parametry se hůř ladí, protože ty parametry/proměnné jsou deklarované na začátku.

Obvykle ty parametry/proměnné vydeklaruji znovu zakomentované takto:

/*

Declare @parametr Char(1) = ‚A‘

— */

Finta je v tom zakomentování komentáře pomocí –. Prioritu má totiž */ ale jen pokud se najde začátek. Takže když vyznačím kód od toho Declare, krásně to projde.

-- Toto nemá vliv na běh procedury
/*
Declare @parametr1 char(1) = 'A'
-- */

-- a pokud vyznačím jen níže uvedenou část, je to opět korektní.
Declare @parametr1 char(1) = 'A'
-- */

</aside>

<aside>

A9 Update vždy nejprve jako select

Nikdy nepíšu rovnou UPDATE/DELETE. Vždycky píšu nejprve SELECT, podívám se na výsledek a počet záznamů a pak ten select změním na UPDATE/DELETE.

UPDATE f SET
	f.Castka = 5000
-- SELECT f.Cislo,f.Datum,o.NazevOrganizace,f.Castka
FROM #Faktura f
LEFT OUTER JOIN #Organizace o on o.ID = f.OrganizaceID
WHERE 1=1
AND f.Cislo = '2020/01'

DELETE f
-- SELECT f.Cislo,f.Datum,o.NazevOrganizace,f.Castka
FROM #Faktura f
LEFT OUTER JOIN #Organizace o on o.ID = f.OrganizaceID
WHERE 1=1
AND f.VystavilID  = 2

</aside>

<aside>

A10 Seznam sloupců bez mezer za čárkou

Normálně prostě sloupce oddělené čárkou, mezera je tam zbytečná.

Posunování pomocí CTRL + šipka funguje správně, vyznačení doubleclickem taky.

-- Sloupce prostě oddělené čárkami
INSERT INTO #Organizace (ID,IC,NazevOrganizace)
--Toto je zbytečně dlouhé
INSERT INTO #Organizace (ID, IC, NazevOrganizace)

</aside>

<aside>

Ostatní

Hodně komentuji

Opravdu hodně komentuji. Až extrémně hodně.

V proceduře před každým updateme, selectem píšu co vlastně chci. Když potom čtu tu uloženou proceduru, čtu nejprve co ten kód má dělat (komentář) a pak teprve co skutečně dělá. Dost často už tímto objevím chybu.

Používám CamelCase nikoli camel_case

Podtržítka jen pokud je to oddělení něčeho systémového. Třeba nsp_ ale místo faktura_vydana mám raději FakturaVydana

Diskritiku nepoužívám

Sloupce (tabulky) se dají použít, pokud jsou v hranatých závorkách []. Nepoužívám a hranaté závorky mažu kdykoli je vidím (ruší barevné zvýraznění)

</aside>

<aside>

Příkladová data

</aside>

<aside>

Linky

Pro další tipy se snažím googlit na klíčová slova „sql syntax best practices“, „Formátování SQL“

Formátovač kódu:

https://poorsql.com/

</aside>

<aside>

</aside>