Sloupec je v relačních databázích vertikální část databázové tabulky. Seznam sloupců jsou hlavní (ne však jedinou) složkou definice tabulky v databázi. Každý sloupec je v tabulce jednoznačně definován svým identifikátorem, datovým typem, rozsahem a dalšími atributy.
Definice sloupce Definice sloupců v tabulce může být v každém systému řízení báze dat trochu odlišná, přesto u nejpoužívanějších databázových systémů lze najít několik věcí společných.
Identifikátor Též jméno či název sloupce. To je používáno k výběrovým dotazům (SQL konstrukci SELECT…). Databázoví návrháři se jak použití diakritiky, tak např. mezer, pomlček a dalších znaků vyhýbají, přestože téměř všechny současné databázové systémy užití diakritiky v názvech sloupců povolují. Aby v takovém případě dokázal parsovač SQL rozpoznat, co je ještě identifikátor sloupce a co aritmetický výraz, jsou sloupce s diakritikou (nebo jejich aliasy) escapovány.
Příklad pro MS SQL: SELECT [telefon do zaměstnání] FROM [zaměstnanci]; Příklad pro MySQL: SELECT `telefon do zaměstnání` FROM `zaměstnanci`;
Je doporučeno, aby názvy sloupců byly výstižné a nezavádějící a přitom pokud možno krátké. U víceslovných názvů se pro oddělení jednotlivých dílčích slov používá buď podtržítko (např. Telefon_do_zamestnani) nebo jedna z konstrukcí camelCase (telefonDoZamestnani) či PascalCase (TelefonDoZamestnani).
U primárního klíče se silně doporučuje označení id (popř. podle konvence Id nebo ID), u cizích klíčů se doporučuje, aby „ID“ bylo součástí jejich identifikátoru (a to buď na začátku nebo na konci).
Typ Typ sloupce určuje, jak bude sloupec interpretovat svůj obsah. Názvy typů se mohou výrazně lišit podle použitého databázového stroje – většina databází má nicméně zavedený systém pojmenování základních typů. Část názvu tvoří skupina typů, a to pro uchování: textových řetězců a binárních dat, celých nebo racionálních čísel, dat/časů speciálních typů. Současně s tím se vžila konvence předpon, napovídající, jaký bude mít sloupec tohoto typu rozsah: tiny – 28, small – 216, medium – 224, (bez přípony) – 232, big – 264.
Řetězcové typy Tyto typy jsou schopny uložit běžný text nebo binární data. Lze je dělit podle následujících čtyřech aspektů: textové versus binární – některé databázové systémy mohou mít při manipulaci s textovými sloupci tendenci ořezat bílé místo na začátku a na konci, nebo automaticky text převádět podle implicitní znakové sady, popřípadě tyto operace mít nastaveny pro hledání či jiná pravidla. Pokud je nezbytné, aby byla data zpracovávána bez těchto úprav (např. uložení hesel, kódů, klíčů, i binárních souborů), volí se binární řetězcové typy. uložené přímo v řádku versus ve speciálním souboru – na rozdíl od ostatních datových typů mohou textové a binární typy zabírat proměnlivé a především i docela velké množství dat, jejichž uložení přímo v záznamech každého řádku může být nepraktické (a též nevhodné pro procházení záznamy, které je v SŘBD optimalizováno především na rychlost). Jednotlivé SŘBD proto oddělují řetězcové typy, které vzhledem k jejich maximální délce (řádově stovky až pár tisíc znaků) mohou být uloženy přímo v řádku, a typy, jejichž hodnoty je lepší uložit do souborů extra pro ně. Hodnoty v těchto souborech poté zpravidla indexují granulují po určité velikosti (třeba 512 nebo 4096 bajtů) a tyto jednotlivé atomární bloky indexují a stránkují (podobně jako stránkování operační paměti). To, jakým způsobem si databázový systém ukládání dlouhých řetězcových hodnot řeší, nicméně je věcí ryze jeho – designér databáze natož uživatel databázové aplikace se tím nemusí zabývat. Například MySQL volí kombinovaný přístup — je-li řetězec kratší nebo roven 256 bajtů, uloží jej do řádku, delší řetězce pak do ad hoc souboru, čímž současně optimalizuje přístup k takto uloženým hodnotám na rychlost. se statickou versus dynamickou velikostí – některá řetězcová pole v sobě mohou uchovávat hodnoty pouze do určité ne příliš velké délky (typickým příkladem jsou všemožné kódy, poté telefonní čísla, rodná čísla nebo hesla). Může mít proto smysl zvolit pro ně statickou velikost. Ta pak bude pro každý záznam alokována, ať už ji hodnota naplní ze 100, 50 či 0 %. Pokud se v řádku nevyskytují jiné řetězcové sloupce s dynamickou velikostí, pak bude mít řádek statickou (fixní) velikost, což může výrazně zvýšit rychlost, s kterou SŘBD prochází a vyhledává jednotlivé záznamy (u záznamů s dynamickou velikostí musí projít záznam po záznamu a zjistit jeho velikost, aby jej v případě neshody mohl přeskočit na další záznam; u záznamů se statickou velikostí SŘBD ví, že n-tý záznam začíná na pozici n*<velikost jednoho záznamu>. Toto lze s výhodou zkombinovat s vyhledáváním podle indexů, které jsou řešeny aproximací nějakou z numerických metod a rapidně menší počet přístupů k jednotlivým záznamům během hledání a spolu s tím vyšší rychlost a menší zátěž pro databázový server). ascii versus national – toto rozdělení mají pouze některé databázové enginy, které mohou dát uživateli možnost ukládat jedno- nebo vícebajtové znaky (typicky národní znaky (odtud název national), méně používané matematické symboly, grafické znaky a další) – prakticky odpovídá kódování Unicode. Takové typy se většinou označují s předponou n (nchar, nvarchar, ntext, v kontrastu s char, varchar, text). Vícebajtové znaky mají i o trochu větší režii pro SŘBD, protože ty musejí hlídat konzistenci mezi rozšířeným znakem a jeho druhým (popř. dalšími) bajty, které za ním následují; správně implementovat funkce pro operaci s řetězci (protože počet znaků nemusí odpovídat počtu bajtů jako u řetězců s jednobajtovým kódováním), a tak dále. Jiným (a obecnějším) přístupem je nezávislé nastavení znakové sady a COLLATION (viz dále).
Jednotlivé typy pro binární a textové řetězce: textové char – textový typ pevně stanovené šířky (počtu znaků), které zabírá nezávisle na tom, je-li vyplněna nebo ne (v takovém případě je v datovém souboru databáze doplněna na tuto šířku). Výhodou je rychlejší manipulace a přepisování hodnot, nevýhodou je toto nadbytečné místo. varchar (zkratka z variant char nebo char varying) – na rozdíl od typu char se ukládané hodnoty nedoplňují na zadanou šířku, ale v datovém souboru se uloží délka a za ní data; délka je tedy pohyblivá (odtud označení variant). Výhodou je úspornější uložení bez zbytečného, nevyužitého místa, nevýhodou je problematičtější přeukládání kratšího řetězce delším (kdy databázový stroj musí realokovat dostupné místo v datovém souboru). V takových případech vznikají bloky nevyužitého místa, které se nicméně dají „optimalizovat“ nebo opravit příkazy OPTIMIZE TABLE nebo REPAIR TABLE. Typ varchar může být u některých starších databázových strojů omezen na 255 (28-1) bajtů, u novějších toto omezení většinou není. V MySQL platí omezení 65536 bajtů na celou databázovou řádku, do které se počítají všechny typy kromě blob a text, proto je nutno při návrhu tabulek s více textovými sloupc s tímto omezením počítat a případně zvolit, hodnoty kterých sloupců se budou ukládat do ad hoc souborů. text (původně clob, řidčeji smalltext, u starších databází memo) – textový typ, který se na rozdíl od typů char a varchar ukládá do oddělených souborů (závisí na implementaci). Typ text je omezen na 65536 bajtů. tinytext – jako text s omezením na 256 bajtů mediumtext – jako text s omezením na 16777216 bajtů longtext – jako text s omezením (podle implementace) na 2 nebo 4 GB nchar, nvarchar, ntext – řetězcový typ používaný např. v MSSQL a Oracle (kde n je akronym pro national) pro uložení znaků Unicode; MySQL toto řeší přes znakové sady a tzv. collation, které lze nastavit každému textovému sloupci binární binary – binárně citlivá obdoba typu char (tj. pevná šířka pro uložení dat) varbinary – binárně citlivá obdoba typu varchar (tj. proměnlivá šířka při ukládání dat) blob – binárně citlivá obdoba text; v MSSQL se též vyskytuje typ image a v Oracle typ LONG RAW a v PostgreSQL bytea se srovnatelnou funkcionalitou tinyblob – binárně citlivá obdoba tinytext mediumblob – binárně citlivá obdoba mediumtext longblob – binárně citlivá obdoba longtext
Číselné typy celočíselné tinyint – celé číslo, rozsah –128 až +127 (8 bitů) smallint – rozsah až 32767 (16 bitů) mediumint – rozsah až (24 bitů) int (též integer) – rozsah až (32 bitů) bigint – rozsah až (64 bitů) s desetinnou čárkou float (někdy též real) – plovoucí desetinná čárka podle IEEE 754, rozsah 32 (u real též 48) bitů double (v PostgreSQL double precision) – jako float ale s dvojitou přesností, rozsah (64 bitů) decimal (někde též numeric) – pevná desetinná čárka, vhodné pro ukládání měny nebo racionálních čísel s omezeným rozsahem a přesností money (s variantou smallmoney) – datový typ s pevnou desetinnou čárkou, používaný v MSSQL speciálně pro ukládání měny
Booleovské typy bit, bool nebo boolean – dokáže uložit pouze jeden bit informace; je použit jen v některých databázích, např. Microsoft Access a MSSQL. Prakticky odpovídá typu enum s hodnotami false a true (resp. 0 a 1).
Datum a čas Databázové systémy věnují též pozornost uchovávat datum a čas, pro něž vyhrazují několik datových typů ale i funkcí pro manipulaci s nimi nebo konverzi mezi nimi. Hodnoty data a času se uzavírají v MySQL do (jednoduchých nebo zdvojených) uvozovek stejně jako řetězce, u MSSQL a MS Access do mřířek (#); a jsou uloženy buď jako tzv. časový otisk (time stamp) nebo ve formě čitelné pro člověka (většinou ve formátu: rok, měsíc, den, hodina, minuta, sekunda, a to bez znaků, které je oddělují – např. sekunda před rokem 2000 by byla uložena jako 19991231235959). Nevýhodou data uloženého ve formě čitelné pro člověka tkví v jeho nesourodosti (existenci „mezer“, které neodpovídají platnému datu a času – 13.–99. měsíc, 24.–99. hodina, 60.–99. minuta či sekunda), což komplikuje např. přičítání nebo odečítání dvou časů od sebe. Formát time stamp tyto neduhy nemá, na druhou stranu se pro jeho prezentaci do formy srozumitelné pro člověka musí pokaždé spustit poměrně netriviální procedura, který z tohoto čísla separuje rok, měsíc, den, popř. i hodiny, minuty a sekundy. Oba případy umožňují takto uložené hodnoty porovnávat, protože významnější jednotky (roky před měsíci, měsíce před dny, …) se nacházejí na významnějších pozicích takto uloženého čísla.
date – pouze pro datum bez času, rozsah je většinou od roku 0000 do roku 9999. datetime (s variantou smalldatetime) – datum včetně času (přesnost na sekundy) timestamp – formát odpovídající UNIX_TIMESTAMP (počet sekund od „věku Unixu“, 1. 1. 1970) time – pouze pro uložení denní doby year – pouze pro uložení roku interval – pro uložení časového intervalu (tedy většinou rozdílu dvou dat), v PostgreSQL
MySQL od verze 4.1 podporuje i časové zóny.
Výčty a sady enum – odpovídá konstrukci enum v jazyku C (pro uložení jedné pojmenovaných hodnot, nelze uložit jinou hodnotu než tu z daného seznamu). Jednotlivé hodnoty se v SQL příkazech uvádějí v uvozovkách jako řetězce, ale do databáze se ukládají pouze jako index z definovaných hodnot. Jejich počet je omezen (podle implementace) buďto na 256 nebo 65536 hodnot. set – pro uložení více příznaků (atributů, „flagů“) současně (kdy nastavení nebo smazání jednoho neovlivní ostatní). Příznaky jsou definovány spolu s typem (obdobně jako u enum), většinou lze uložit maximálně 32 nebo 64 různých hodnot (podle implementace) – do 32- resp. 64bitového slova. Hodnoty odpovídají jednotlivým bitům, které se interně dají nastavit na logickou 0 nebo 1 ve stejném duchu jako slovně pojmenované příznaky daného setu.
Příklad v MySQL: CREATE TABLE mobilni_telefony( tvar enum('klasicky','vecko','vysunovaci'), frekvence set('800MHz','900MHz','1800MHz','1900MHz') ); INSERT INTO mobilni_telefony VALUES ('vysunovaci', '900MHz,1800MHz,1900MHz'); SELECT * FROM mobilni_telefony WHERE FIND_IN_SET('1800MHz',frekvence);