Budovanie informačných systémov I. – Letmé pohladenie SQL 1

Libor Bešenyi  /  10. 08. 2006, 00:00

V tejto časti sa naučíme základné operácie s databázami, vytváranie tabuliek a ich napĺňanie údajmi.

V tejto časti sa naučíme základné operácie s databázami, vytváranie tabuliek a ich napĺňanie údajmi.

Príloha k článku

SQL syntax

Uvažoval som, či nebudem pokračovať v teórii databáz, ale rozhodol som sa, že to radšej podám postupne „za chodu“. Predošlá časť bola pomerne teoretická, tak sa pozrime na veci z praktickej stránky.

 

Rozprávali sme sa o nejakých tabuľkách a vzťahoch. Aby sme vytvorili tabuľku, potrebujeme najprv vytvoriť databázu. Každý databázový systém môže obsahovať niekoľko databáz a databáza je vlastne množina tabuliek (a iných, zatiaľ pre nás nepotrebných objektov).

 

Obrázok 1 Štruktúra databázového systému

 

Ak chceme pristupovať ku jednotlivým dátam (tie obsahujú tabuľky), musíme začať „od konca“. Teda postupne „rozbaľovať“ schému z obrázka (podobne ako pri integrovaní).

 

Databázový systém sme už nainštalovali v jednej z predošlých častí, teraz si vytvorme databázu. Spusťme si konzolový režim na MySQL, ktorým sme už skúšali úspešnosť inštalácie (C:\MySQL\bin\MySQL.exe). Privíta nás obrazovka v ktorej sa budeme postupne učiť pracovať s programom. Keď budeme neskôr programovať aplikáciu, bude nesmierne dôležité ovládať tieto príkazy a v druhej časti zistíme, že návrh databázy na tejto úrovni je 75% celého programu. Takže privíta nás nasledujúci text v okne:

 

Welcom to the MySQL monitor.  Commandsend with ; or \g.

Your MySQL connection id is 1 to server version: 3.23.54-nt

 

Type ‘help;’ or ‘\h’ for help. Tyoe ‘\c’ to clear the buffer.

 

mysql>_

Základné príkazy

Operácie s databázami

Tak, po spustení konzoly sa nachádzame v „zelenej“ úrovní. Tu máme prehľad nad databázami a tak si môžeme vyskúšať príkaz show databases; (všimnime si, že príkaz sa končí bodkočiarkou, jedná sa o takzvaný oddeľovač príkazu – ten neraz budeme písať na viacej riadkov a MySQL čaká na tento znak, aby vedelo, kedy má začať príkaz vyhodnocovať).

 

Z názvu (show databases) je zrejmé, že sa bude jednať o vypísanie „žltých“ databáz. Implicitne má MySQL v3 dve: mysql test. Testovacia databáza je prázdna a prvá menovaná je systémová, tak ju nebudeme ani mazať a zatiaľ si ju ani všímať.

 

Aby sme mohli pracovať v databáze, musíme si ju buď vytvoriť, alebo vstúpiť už do existujúcej. Na vytvorenie databázy použijeme príkaz create database [názov]; (napríklad create table test2;). Ak si znova dáme vypísať databázy, vidíme, že tam pribudla nová s názvom, ktorý sme jej pridelili.

 

V prípade, že chceme vymazať nejakú databázu, použijeme príkaz drop database [názov]. Pozor, vymažeme celý obsah! Ak sa v databáze nachádzajú tabuľky a v nich nejaké dáta, vymaže sa všetko. Takto vymažme jednu z nepotrebných databáz (napríklad drop database test;)

 

Pozor: Všimnite si, že jazyk je veľmi podobný s angličtinou (ako takmer všetky ostatné „IT jazyky“) textu a tak nezabúdajte na počty. Ak chceme výpis databáz, jedná sa o množné číslo „databases“ a v prípade mazania, mažeme jednu – konkrétnu a tak použijeme „database“. Možno je to smiešne, ale veľa začiatočníkov si to nevšimne a pri „rýchlopise“ naťuká zlý príkaz.

 

Ešte sme si nepovedali, ako vyberieme konkrétnu databázu, aby sme vedeli práve v nej vytvárať a pracovať s tabuľkami. Na to slúži príkaz use [názov].

 

Pozor: Pri každom vstupe do konzoly musíme vstupovať aj do databázy, ak s ňou chceme pracovať!

 

Obrázok 2 Základné operácii s databázami

Operácie s tabuľkami

Keď sme si už vybrali databázu, teraz v nej môžeme analogicky pracovať s tabuľkami. Vypisovať ich, vytvárať, mazať a ešte aj upravovať. Najjednoduchší príkaz je výpis tabuliek a to: show tables;. Ak je databáza prázdna, vypíše sa o tom informácia.

 

Vytvorenie tabuľky už je komplikovanejšia záležitosť. Tu musíme mať jasnú predstavu o tom, ako tabuľka vyzerá (teda po analýze z predchádzajúcich častí), pretože pri vytvorení tabuľky definujeme aj jej parametre:

 

CREATE TABLE [názov tabuľky] (

  [názov stĺpca] [dátový typ],

  [názov stĺpca] [dátový typ],

  …

);

 

Zoznam dátových typov sa nachádza v tabuľke dole a každý si ho dokáže nájsť v manuáli pre konkrétny databázový systém. My budeme najčastejšie používať celé číslo (int), desatine číslo (float), reťazec (varchar) a časový typ (datetime).

 

Dátový typ

Typ

Popis

Decimal

Čísla

Číslo (-1038 až 1038)

Float

Desatiné číslo <-1,79x10308 až 1,79x10308>

Double

Desatiné číslo s dvojnásobnou presnosťou

Real

Desatiné číslo <-3,40x1038 až 3,40x1038>

Money

Nepodporuje MySQL v3 – jedná sa o peňažný typ, ktorý má pevne stanovený počet desatiných miest (dve, štiry apod.) s gigantickým intervalom

Smallmoney

Nepodporuje MySQL v3 – jedná sa o peňažný typ, ktorý má pevne stanovený počet desatiných miest (dve, štiry apod.) s gigantickým intervalom

Bit

Celé čísla

Boolovský výraz => 0 alebo 1: pravda / nepravda

Int

Obrovské celé číslo <-231 až 231)

Smallint

Číslo <-215 až 215)

Tinyint

Jednobajtové číslo <0 až 255>

Char(dĺžka)

Znaky

Uloženie reťazca pevnej dĺžky

Nchar(dĺžka)

Uloženie reťazca pevnej dĺžky v národnej sade

Varchar(dĺžka)

Uloženie reťazca premenlivej dĺžky (0..max)

Nvarchar(dĺžka)

Uloženie reťazca premenlivej dĺžky (0..max) v národnej sade

Datetime

Dátumovo – časové

 

Timestamp

 

Tabuľka 1 Zoznam a popis dátových typov

 

Niečo sme si ale spomínali o primárnych kľúčoch. Ak chcem tabuľku, ktorá by obsahovala takýto kľúč, môžeme ako posledný riadok uviesť primary key (názov stĺpca). Taktiež by bolo vhodné zabezpečiť inkrementáciu (zvyšovanie o jedna) číselného indexu, o ktorom sme tiež už rozprávali. MySQL to zabezpečuje príkazom za definíciou dátového typu príkazom auto_increment.

 

Nesmieme ešte zabúdať na prázdnu hodnotu a lá null. Ak by sme vytvorili aplikáciu v ktorej by program rátal napríklad priemer vložených peňazí z nejakej tabuľky a tá tabuľka by slúžila na celkový pohyb rôznych operácii (nielen vloženia, ale aj vybrania, informovaní sa apod. v prípade, ak napríklad banka sleduje jednotlivých zákazníkov a vedie si evidenciu operácii, ktoré mu poskytla), mohol by program vydávať nekorektné hodnoty, ak by neexistovala hodnota null.

 

Jedná sa totiž o to, že null nie je nula, ale „prázdno“. Ak sa do takejto tabuľky vloží riadok, pričom sa nejednalo o pohyb peňazí a tam my zadáme nulu (veď sa ani nevložilo ani nevybralo) v prípade priemeru by to mohlo znamenať katastrofu, lebo ak sa robí priemer z čísel 10 a 2 je to 6. Ak by to bolo z čísel 10, 2 a 0, už to činí 4. Preto vznikla tzv. „prázdna“ hodnota null, ktorá sa vyskytuje tam, kde nebola hodnota pridaná. Null môže byť aj na miestach, kde sa očakáva číslo, reťazec – proste všade. Null je bez typový.

 

Ak nechceme, aby hodnoty v stĺpcoch byť  vyplnené, zadáme za dátovým typom not null (tzv. mandatory pole). Takto dostávame trošku komplikovanejšiu štruktúru príkazu create table:

 

CREATE TABLE  [príkazy][názov databázy].[názov tabuľky] (

  [názov stĺpca 1] [dátový typ] [príkazy],

  [názov stĺpca 2] [dátový typ] [príkazy],

  …,

  PRIMARY KEY (názov konkrétneho stĺpca)

);

 

Všimnime si, že sme ešte pridali aj prefix k názvu tabuľky separovaný bodkou. Je to dobré na to nezabúdať. Síce na začiatku sme definovali príkazom use, že chceme pracovať s touto databázou, ale písať to, je dobrý zvyk pri väčších projektoch a iných databázových systémoch.

 

Taktiež pribudli nejaké príkazy pred názvom tabuľky, tie slúžia napríklad na overenie, či už tabuľka v databáze neexistuje a v prípade existencie, ju nedovolia potom vytvoriť (if not exists), teda aplikácia nezhavaruje – o tom všetkom neskôr.

 

Na vloženie údajov do tabuľky slúži príkaz insert into s parametrami kde definujeme do ktorých stĺpcov chceme pridať riadok a potom ich hodnoty v tvare:

 

INSERT INTO [názov tabuľky]

  ([názov stĺpca 1],[názov stĺpca 2]…)

VALUES

  (“[hodnota stĺpca 1]”,”[hodnota stĺpca 2]”, …);

 

No a poďme sa troška pohrať s tým, čo sme sa už dozvedeli. Vytvoríme si tabuľku „retazec“ s dvoma stĺpcami „a“ a „b“ dátových typov reťazec, pričom jeden bude môcť obsahovať prázdne hodnoty a druhý nie:

 

CREATE TABLE  retazec (

  a VARCHAR(20),

  b VARCHAR(20) NOT NULL

);

 

Dátový typ varchar je reťazec, ako bolo spomínané, pričom v zátvorke definujeme jeho maximálnu dĺžku. Teraz vložíme do tabuľky jeden riadok – „kuko“ do stĺpca „a“, „migrific“ do stĺpca „b“:

 

INSERT INTO retazec

  (a, b)

VALUES

  (“kuko”, “migrific”);

 

Ešte sme si nespomínali príkaz na výpis obsahu tabuliek. Bolo to zámerné, pretože sa jedná o „kapitolu samú“. Zatiaľ si vystačíme s najjednoduchšou formou výpisu – výpisu celého obsahu, ktorý má tvar:

 

SELECT

  *

FROM [názov tabuľky];

 

Tak a teda pokračujeme v príklade. Keď sme vložili riadok do tabuľky, vypíšme si jej obsah:

 

SELECT * FROM retazec;

 

Vidíme, že tabuľka už obsahuje nejaké dáta. Teraz sa pozrime na to, čo znamená null. Skúsme vložiť prázdne hodnoty. Tak isto, ako null nie je nula pri číslach, nie je ani “prázdnym znakom“ pri reťazcoch:

 

INSERT INTO retazec

  (a, b)

VALUES

  (“”, “”);

 

Pri výpise vidíme, že pribudol ďalší riadok – prázdny pre obe hodnoty. Teraz pridajme hodnotu „a“ a stĺpec „b“ nechajme prázdny:

 

INSERT INTO retazec

  (a)

VALUES

  (“”);

 

Ako vidíme, má to rovnaký efekt. Stĺpec „b“ sme síce nevyplnili, ale databázový systém vie, že „b“ nesmie byť prázdne (null) a tak automaticky doplnil prázdny znak. Ak ale vyskúšame doplniť len hodnotu do stĺpca „b“, pričom stĺpec „a“ môže byť prázdny, po výpise vidíme, že obsahuje hodnotu NULL:

 

INSERT INTO retazec

  (b)

VALUES

  (“nieco”);

 

Celý príklad môžeme vidieť na tomto obrázku:

Obrázok 3 Príklad práce s tabuľkou a hodnotami null

Zhrnutie príkazov

CREATE TABLE [názov]

Vytvorenie databázy.

 

CREATE TABLE [príkazy] [názov databázy].[názov tabuľky] (

  [názov stĺpca 1] [dátový typ] [príkazy],

  [názov stĺpca 2] [dátový typ] [príkazy],

  …,

  PRIMARY KEY (názov konkrétneho stĺpca)

)

Vytvorenie tabuľky. Príkaz za názvom môže byt (if not exists) a tak sa tabuľka vytvorí akk, ak už neexistuje. Názov databázy nie je povinný, ale používať ho ako prefix je dobrý zvyk. Príkazy pri definícii dátových typov taktiež nie sú povinné a môžu byt napríklad not null či auto_increment, pri ktorých nastavuje, že stĺpec nemôže obsahovať prázdne hodnoty (nezadané) a automatické pripočítavanie o jedna v prípade indexu.

 

DROP DATABASE [názov]

Vymazanie databázy.

 

INSERT INTO [názov tabuľky]

  ([názov stĺpca 1],[názov stĺpca 2]…)

VALUES

  ([hodnota stĺpca 1],[hodnota stĺpca 2]…)

Vloženie riadka do tabuľky pre presne definované stĺpce.

 

SELECT

  *

FROM [názov tabuľky];

Vypísanie celého obsahu tabuľky.

 

SHOW DATABASES

Vypísanie zoznamu databáz.

 

SHOW TABLES

Vypísanie zoznamu tabuliek v aktuálnej databáze.

 

USE [názov]

Vstúpenie do konkrétnej databázy (nastaviť aktuálny index).

 

 

Neprehliadnite: