Ústav automatizace a informatiky Fakulta strojního inženýrství Vysoké učení technické v Brně
Přednáška č. 3 z předmětu
Zpracování informací (kombinované studium) © Ing. Radek Poliščuk, Ph.D. Tato publikace vznikla jako součást projektu CZ.04.1.03/3.2.15.2/0285 „Inovace VŠ oborů strojního zaměření“, který je spolufinancován evropským sociálním fondem a státním rozpočtem České republiky
Zpracování informací, přednáška 3.
1/25
Ohlédnutí – přednášky 1 a 2 Abychom získali INFORMACE, potřebujeme DATA. Technická data získáváme měřením a sledováním. Logické a spojité veličiny (signály) měříme pomocí snímačů (senzorů). Pro elektronické zpracování je nutný převod do formy elektrického signálu (U,I...). Pro digitální zpracování se signály vzorkují (v čase) a kvantují (A/D). Data ze senzorů obvykle potřebujeme někam přenést, archivovat a analyzovat. Technickou úroveň přenosu a archivace přizpůsobujeme rozpočtu dané úlohy. Technickou úroveň přenosu a archivace přizpůsobujeme rozpočtu dané úlohy. Souborový formát a rozmístění dat volíme s ohledem na budoucí použití (datové tabulky, jednotlivé binární soubory, datové stromy ve značkovaných souborech). Sekvenčně zracovávané tabulky s pevnou délkou záznamu mají jistá omezení
Rychlost prohledávání datových záznamů je možné optimalizovat použitím indexů. Množství dat v tabulkách je možné zredukovat použitím relací (normalizace DB) Data nemusejí nutně mít jen tvar „pravoúhlých tabulek“, propojených relacemi. (některé druhy informací může být efektivnější/přehlednější držet například ve formě stromu) Zpracování informací, přednáška 3.
2/25
Obsah přednášky Přednáška 3 – Databázové systémy Požadavky na databázové systémy Procedurální a logický přístup k datům Dotazovací jazyky a aplikační rozhraní Co je a co umožňuje SQL SQL jako DDL – Create, Alter, Drop, Grant SQL jako DML – Show, Use, Select, Insert a Update
Realita
DATA
Informační systém
Informace Příjemce
Zpracování informací, přednáška 3.
3/25
Databázové systémy Mostem mezi daty a samotným informačním systémem jsou databázové systémy. Požadavky na funkci DBS (data + systém řízení báze dat = databázový systém, DBS): Spolehlivost transakcí („2 Phase Commit“ - neprojdou-li všechny kroky, následuje Roll-back) Škálovatelnost (bez předem daných omezení na 128sl, 64k, 4G,...) Vícenásobný přístup (vyřešené vzájemné blokování uživatelů) Bezpečnost (individuálně definovatelné zabezpečení úrovní přístupu ke všem elementům) Tyto požadavky NENÍ MOŽNÉ splnit s použitím klasických, souborově orientovaných aplikací (otevřít soubor, načíst a upravit data, uložit zpět na disk...) Vývoj specializovaných DBS (70. léta 20.stol.), na principu klient-server: Komerční (Oracle, Sybase, IBM DB2, Microsoft SQL server) Open Source (MySQL, PostgreSQL, SQLite) Speciální (Google)
Zpracování informací, přednáška 3.
4/25
Databázové systémy E.F.Codd, A Relational Model of Data for Large Shared Data Banks (1970): Informace v DB je uspořádána jednotně (např. v řádcích tabulek). Data musí být dostupná a adresovatelná vždy jednoznačně (jménem tabulky a sloupcem s primárním klíčem) Všechna neklíčová data mohou nabývat hodnoty „nezadáno“ (NULL). Jednotlivé databáze v IS („katalogy“) musí být uživatelům dostupné s použitím stejných rozhraní jako data (SQL). Toto rozhraní (dotazovací jazyk) musí mít: lineární syntax možnost interaktivního (CLI) i programového (API) volání schopnost definovat formu dat (Data Definition Language, DDL) i daty manipulovat (Data Manipulation Lang.), definovat uživatelská práva a řídit transakční operace (begin, commit, rollback). U všech pohledů na data umožňujících editaci je systém schopen ošetřit i fyzickou aktualizaci dat (výsledky dotazů). Vysokoúrovňové příkazy INSERT, UPDATE a DELETE (schopnost manipulovat s více záznamy jediným příkazem). Fyzická datová nezávislost (aplikaci nemusí zajímat fyzické pořadí záznamů). Logická datová nezávislost (aplikaci nemusí zajímat fyzické uspořádání sloupců tabulek). Nezávislost zabezpečení dat (bezpečnostní údaje jsou drženy v „systémovém katalogu“ a ne v tabulce samotné). Distribuční nezávislost (tabulky mohou být fyzicky kdekoliv, pro aplikace vše řeší jediný DB stroj). Ochrana proti obcházení pravidel (ani případnými low-level/řádkovými prostředky není možné obejít zabezpečení). 5/25 Zpracování informací, přednáška 3.
Relační uspořádání dat Zjednodušené zásady správného návrhu relační databáze: Normalizace = Eliminace nadbytečných dat Atomizace polí (informace bychom neměli „dolovat“ dalšími funkcemi, např. jméno/příjmení) Unikátní/primární klíče (jednoznačná identifikace záznamu přes jedno nebo více jeho polí) Funkcionální závislost (záznam popisuje to co se týče daného objektu – přímo nebo relacemi) Nezávislost polí (změna jednoho pole by neměla ovlivňovat jiná – např. sazba a částka DPH) (nesystémové ale praktické) výjimky z normalizačních zásad: Zvýšení výkonnosti u časově kritických úloh Vyhodnocujeme-li často některou náročně počítanou hodnotu, pak může být výhodné pole s jejím výsledkem připojit k záznamu (ale při každé změně ji důsledně přepočítávat !!!). např.: pole typu „Celkem vč. DPH“ v tabulce faktur mohou urychlit tvorbu přehledů.
Zachycení časově proměnlivých dat Vyhýbáme se odkazům na pole v jiných tabulkách, jejichž změna by za čas mohla vadit. Např.: Fakturovanou částku za položky uvádíme vždy přímo (protože změna „katalogové“ ceny, na kterou by se dalo odkazovat, by mohla zpochybnit i již uzavřené obchody...=> finanční úřad =>). Nebo: Dále nevázaná zodpovědnostní pole typu „doklad vystavil“ neodkazovat někam do adresáře, ale při vystavování jej pouze naplnit kopií aktuální hodnoty (Dotyčný pracovník už ve firmě za měsíc pracovat nemusí a jeho záznam může být odstraněn/změněn...)Zpracování informací, přednáška 3.
6/25
Procedurální a logický přístup Uvedené požadavky je programátorsky možné řešit dvěma způsoby: Procedurální přístup: požadavky na data se zadávají jako struktura příkazů (cykly, funkce,...) operace probíhají jen v rámci zadané sekvence příkazů (mnoho kroků) ... Data:=Database.OpenRecordset('Tabulka_Adresy');//výběr Data:=Database.OpenRecordset('Tabulka_Adresy');//výběr tabulky While not Data.EOF do //Dokud nejsme na konci.. begin read(Data ,Zaznam);//načti //načti další záznam read(Data,Zaznam); If Zaznam.PSC='26601' then //pokud splňuje podmínky.. writeln(Zaznam.Jmeno,' ',Zaznam.Prijmeni); End; Data.Close; //Hotovo, zavřít soubor. ...
Neprocedurální přístup: Snaha o oddělení „požadavku na data“ od programového kódu Na data posíláme logicky formulovaný požadavek (co chci, zdroj, podmínky, třídění...) nalezený recordset („pole nalezených záznamů“) se poté zpracovává.
... If Data.Query('Select Data.Query('Select Jmeno, Prijmeni from adresy where PSC='26601') PSC='26601') //logický požadavek For i:=0 to Data.count1-1 do //Procházení nalezených záznamů writeln(Data[i].columns[1],' ',Data[i].columns[2]);//Zpracování ',Data[i].columns[2]);//Zpracování recordsetu End; Data.Close; //Hotovo, zavřít soubor. ...
Výhody: Kratší kód, do aplikace se přenáší už jenom jen platná data. Zpracování informací, přednáška 3.
7/25
Dotazovací jazyky Abychom si o data mohli „logicky“ říct, musíme požadavek(dotaz) vhodně formulovat: SQL (Structured Query Language, více dále) pevně daná struktura čitelných, slovně formulovaných sekcí dotazu: SELECT Store.Name, Sum(Sales.Store) FROM Sales, Stores WHERE Sales.Store=Store.ID and Store.Country='USA' and Store.State='CA' and Sales.datum between '2002-01-01' and '2003-12-31' Group By Sales.Store;
MDX (specializovaná kontingenční/OLAP nadstavba SQL, „Microsoft, '97): SELECT { [Measures].[Store Sales] } ON COLUMNS, { [Date].[2002], [Date].[2003] } ON ROWS FROM Sales WHERE ( [Store].[USA].[CA] );
XQL (XML Query Language, dotazy nad XML stromy)
Funkce dotazovacího jazyka přitom obecně zahrnují: Data Manipulation Language (Select, Insert, Update) Data Definition Language (Create, Set, Drop, Grant...) Zpracování informací, přednáška 3.
8/25
Aplikační rozhraní Pro zadávání DDL/DML požadavků a pro vyzvedávání výsledků potřebujeme vhodné API: je-li server dostupný jako konzolová aplikace, je možné použít CLI (příkazová řádka) pro práci s daty v uživ. aplikacích se tato vrstva „obaluje“ aplikačním rozhraním (API): OLEDB (Object Linking and Embedding Database, Microsoft) obecné lower-level rozhraní pro přístup k obecným „poskytovatelům dat“
ODBC (Open Database Connectivity, Microsoft) univerzální knihovny umožňující instalaci „ovladačů“ (driverů) pro různé DBS rozhraní poskytuje všechny obecné funkce pro dotazování i vyzvedávání dat
JDBC (JDBC-ODBC bridge, Sun Microsystems) objektové zapouzdření ODBC funkcí - JAVA)
ADO (ActiveX Data Objects, objektová mezivrstva mezi OLEDB/ODBC, Microsoft) Třídy: Connection, Recordset, Command, Record (flat file), Stream, Error, Field, Parameter, Property
ADO.NET (přepracované ADO pro .NET) Třídy: Connection, Command, Parameter, DataAdapter, DataReader
Zpracování informací, přednáška 3.
9/25
Databázové aplikace Databázové aplikace uživatelům obvykle poskytují tyto možnosti: Pohled na data v tabulkách („tabulkový editor“) s možností reorganizace DB Zadávání dotazů na data a pohled na výsledné datasety (tabulkové výsledky dotazů) Zadávání, čtení a správu záznamů prostřednictvím formulářů Formátování dat do výstupních formátů (tiskových a www sestav) Možnost aplikace uživatelských programových rutin nad zpracovávanými daty.
Zpracování informací, přednáška 3.
10/25
SQL je: SQL = Structured Query Language, standardní textový počítačový jazyk pro přístup a manipulaci s databází. založeno na jazyku SQL, který vychází ze SEQUEL (Simplified English Query Language, později z copyrightových důvodů zkráceno na SQL), vyvinutého v 70. letech IBM na základě teorie rozsáhlých relačních modelů Edgara F.Codda (1970). První komerční implementace: Relational Software, Inc. (dnes Oracle Corporation) 1979, prakticky všechny komerční SQL jsou dnes jejími dialekty, „Standardní“ (ANSI-1986 a ISO-1987) SQL nalezneme v mnoha DBS (MS Access, DB2, Informix, MS SQL Server, Oracle, Sybase, ...) Všechna tato prostředí obsahují různě zpracované interpretery SQL, základní prvky stanovené ANSI (např. SELECT, UPDATE, DELETE, INSERT, klauzule WHERE, …) však obsahují všechny. Nejčastěji diskutované rozdíly v různých interpretacích SQL spočívají v proprietárních rozšířeních původního standardu.
Další text bude obsahovat ukázky použitelné jak v Accessu, tak např. v MySQL... Zpracování informací, přednáška 3.
11/25
SQL umožňuje: SQL umožňuje jednoduchým a přehledným způsobem: přistupovat k datům v databázi (Use, Select, Union...) vznášet dotazy na data (agregační funkce, poddotazy apod.), vyzvedávat data z databáze (dataset → text, tabulka, XML,...), vkládat nové záznamy do databáze, selektivně aktualizovat záznamy v databázi, selektivně mazat záznamy z databáze, definovat strukturu databáze (struktura záznamů a tabulek, indexy, práva...)
Tímto jsou zajištěny požadavky jak na schopnost manipulace(DML), tak definice dat(DDL).
Zpracování informací, přednáška 3.
12/25
Data ke kterým přistupujeme DBS může obsluhovat více „datových projektů“ (~databází, ~schémat, ~katalogů...) Každá databáze bývá tvořena jednou nebo více tabulkami. Každá tabulka je jednoznačně identifikovaná svým jménem (např. Adresář, Objednávky...). Tabulky obsahují záznamy/struktury s daty, např. tabulka Adresář může obsahovat: ID
Jméno:
Příjmení:
Adresa:
Město:
PSČ:
1
Alois
Vocásek
Severní 10
Brno
606 00
2
Kryšpín
Jelítko
Jižní 11
Praha
116 00
3
Felix
Bůček
Západní 3
Ostrava
825 00
4
Tadeáš
Jelítko
Východní 8
Plzeň
322 00
k identifikaci záznamů v tabulkách se používají indexová pole (nebo skupiny polí) pro jednoznačnou identifikaci je nutný unikátní (tj. neopakující se) klíč (~index); jeden z unikátních klíčů (typicky pořadové číslo) se prohlašuje za primární klíč. k identifikaci jednotlivých polí v rámci záznamů se používají unikátní jména sloupců. Zpracování informací, přednáška 3.
13/25
Databáze Práci na úrovni „databází“ v SQL řeší tyto CLI příkazy (MySQL): SHOW DATABASES; zobrazí jména dostupných databází CREATE DATABASE nazev_databaze; vytvoří DB se jménem "nazev_databaze" (název může mít max. 65 znaků) abychom mohli DB používat, musíme ji vybrat (USE) a vytvořit v ní tabulky (CREATE TABLE...) a přidělit k nim přístupová práva (příkaz GRANT – viz manuál vašeho DBS, není jednotné) USE nazev_databaze; zvolená databáze "nazev_databaze" se nastaví jako aktivní (v Accessu ~ volbě souboru) SELECT DATABASE(); vrací název aktuální databáze SHOW TABLES; SHOW TABLES FROM nazev_databaze; zobrazí seznam tabulek aktuální / zvolené databáze DESCRIBE nazev_tabulky; nebo SHOW COLUMNS FROM nazev_tabulky; zobrazí strukturu vybraných tabulek SOURCE cesta/soubor; vykoná všechny příkazy uvedené v souboru zadaném parametrem DROP DATABASE nazev_databaze; - vymaže celou databázi se jménem "nazev_databaze", včetně všech tabulek a dat v nich.
Zpracování informací, přednáška 3.
14/25
DDL - Tabulky CREATE TEMPORARY TABLE název( NázevSloupce1
, NázevSloupce2 ,...) TYPE=typ_tabulky;
Používané typy sloupců: integer(n), int(n), smallint(n), tinyint(n), bit, bool: Celočíselné, n je max. počet míst decimal(n,d) nebo numeric(n,d): Desetinná čísla, d je počet desetinných míst. double, float: binární formát reálných čísel char(délka): Řetězec s pevně danou délkou (max. 255 znaků). varchar(max_délka): Řetězec s danou maximální délkou (max. 255 znaků). date, datetime, timestamp, time, year: Datumové údaje, pozor na rozsahy! tinytext/tinyblob (<28), text/blob (<216), mediumtext/mediumblob (<224), longtext, longblob (<232) enum('možnost1', 'možnost2',..) : volba jedné ze seznamu možných hodnot set('hodnota1', 'hodnota2',..) : výčet ze seznamu až 64 možných hodnot Modifikátory typu: AUTO_INCREMENT, BINARY, INDEX|PRIMARY KEY, Unique, Null|not null, UNSIGNED, ZEROFILL
Používané typy tabulek (Mysql): MYISAM: standard MySQL, soubory s příponami .myd (data) a .myi (indexy) MERGE: pro spojování MYISAM tabulek se stejně definovanými poli HEAP: tabulka je pouze v paměti (rychlé, řada omezení) INNODB: tabulky zamykané na úrovni řádků, podpora transakcí BEGIN; ... ; COMMIT; (a další... po prostudování originální dokumentace.) 15/25 Zpracování informací, přednáška 3.
DDL - Indexy Smazání dat v tabulce, zachování struktury TRUNCATE TABLE table_name; Změna stávající struktury: ALTER TABLE table_name RENAME nový_název_tabulky ADD jméno_sloupce First|After <sloupec> DROP COLUMN <jména rušených sloupců> CHANGE název_sloupce nový_název nový_typ; MODIFY název_sloupce nový_typ; Vytvoření indexu přes 1 nebo více zadaných sloupců: CREATE UNIQUE INDEX jméno_indexu ON table_name (<seznam sloupců zahrnutých v indexu>) Odstranění stávajících struktur: DROP INDEX table_name.index_name DROP TABLE table_name DROP DATABASE database_name
Zpracování informací, přednáška 3.
16/25
DML - Data Modifikace dat v tabulkách je možná příkazy: Vkládání nových záznamů do existujících tabulek: INSERT INTO (<seznam naplňovaných sloupců>) VALUES (<seznam hodnot v daném pořadí>); Zrušení záznamů splňujících danou podmínku (o podmínkách více viz Select): DELETE FROM WHERE <podmínky pro výběr řádek> Úprava záznamů splňujících danou podmínku: UPDATE SET <sloupce> = WHERE <podmínky pro výběr řádek>; Výpis záznamů splňujících podmínky v zadaných klauzulích: SELECT sloupce FROM tabulky WHERE GROUP BY <sloupce> Having Order By <podminky> UNION ; Zpracování informací, přednáška 3.
17/25
SQL SELECT Základní syntax příkazu SELECT: SELECT column_name(s) FROM table_name; Výběr všech sloupců zvolené tabulky - zástupný symbol „*“ namísto sloupců: SELECT * FROM table_name; Příklad výběru zvolených sloupců: SELECT Příjmení, Jméno →
Příjmení: Vocásek Jelítko Bůček Jelítko
FROM Adresář; Jméno: Alois Kryšpín Felix Tadeáš
Výběr jen unikátních záznamů: Prefix „DISTINCT“ SELECT DISTINCT Příjmení FROM Adresář;
Zpracování informací, přednáška 3.
18/25
SQL - Skalární funkce Skalární funkce = funkce aplikované na úrovni jednotlivých hodnot výpisu: UCASE (c) :
Převod výrazu c na velká písmena
LCASE (c) :
Převod výrazu c na malá písmena
MID (c, první[,poslední]) : Výběr zvoleného počtu znaků z textového výrazu c LEN (c) :
Délka textového výrazu c
INSTR (c) :
Numerická pozice substringu ve výrazu c
LEFT (c, n) :
Výběr prvních n znaků v textovém výrazu c
RIGHT (c, n):
Výběr posledních n znaků v textovém výrazu c
ROUND (c, místa):
Zaokrouhlení na daný počet desetinných míst
MOD (x, y) :
Vrací výsledek x mod y (zbytek po dělení)
NOW () :
Vrací aktuální systémové datum (bez parametru!)
FORMAT (c, format) :
Změna formátu zobrazení pole
DATEDIFF (datum1, datum2) : Rozdíl dvou dat ve dnech
Zpracování informací, přednáška 3.
19/25
SQL Select - aliASy Klauzule aliAS: Aliasy mohou být využity pro tabulky i sloupce: SELECT column AS column_alias FROM table; (typicky pro vlastní pojmenování sloupců na výstupu) SELECT column FROM table AS table_alias; (typicky pro substituci jmen při definici relací uvnitř jedné tabulky) Klauzule OrderBy: Předpis pro třídění řádek výstupu, např.: SELECT Jméno, Příjmení FROM Adresář ORDER BY Příjmení, Jméno; Třídění v opačném pořadí: suffix DESC SELECT Distinct Příjmení FROM Adresář ORDER BY Příjmení DESC;
Zpracování informací, přednáška 3.
20/25
SQL Select – Where Klauzule Where: Definice pravidel pro výběr záznamů: SELECT <sloupce> FROM Where ; (Jednotlivé podmínky je možné logicky spojovat pomocí And/Or) K definici vyhodnocovacích podmínek je možné použít: Porovnávání ordinárního obsahu polí: < , >, =, < > (nebo !=) , > =, < = SELECT ... WHERE PSČ < '600 00'; Test přítomnosti řetězce ve výrazu: LIKE <řetězec> SELECT ... WHERE Jméno Like '%x%'; (zástupné znaky: _ pro 1 libovolný znak, % pro 0 nebo víc libovolných znaků) Test zda hodnota výrazu leží mezi dvěma mezemi: Between .. And .. SELECT ... WHERE Příjmení BETWEEN 'D' AND 'T'; Test zda výraz nabývá některé z hodnot: IN (hodnota1, hodnota2,..) SELECT ... WHERE Příjmení IN ('Vocásek','Buřt');
Zpracování informací, přednáška 3.
21/25
SQL Select - agregace Seskupování výstupních dat z dotazu: Group By: Seskupování (agregace) dat dle určitého kritéria: SELECT Partner, SUM(platba) FROM PenezniDenik GROUP BY Partner; Having: Dodatečné filtrování výstupních (typicky agregovaných) dat SELECT Partner, SUM(platba) FROM PenezniDenik GROUP BY Partner HAVING SUM(platba)>1000000; Agregační funkce (výběr): AVG(sloupec) : Aritmetický průměr agregovaných hodnot COUNT(sloupec) : Počet neprázdných řádek v daném sloupci COUNT(*) : Počet vybraných řádek FIRST(sloupec) : První nalezená hodnota v daném sloupci LAST(sloupec) : Poslední nalezená hodnota v daném sloupci MAX(sloupec) : Nejvyšší nalezená hodnota v daném sloupci MIN(sloupec) : Nejmenší nalezená hodnota v daném sloupci SUM(sloupec) : Součet nalezených hodnot v daném sloupci Zpracování informací, přednáška 3.
22/25
SQL - Relace Relační propojování tabulek je v SQL realizováno pomocí klíčů a konstrukcí: WHERE: (výpis všech řádků na kterých je shoda v „levé“ i „pravé“ tabulce) SELECT Zam.Jmeno, Obj.Produkt FROM Zam, Obj WHERE Zam.ID=Obj.Vystavil_ID INNER JOIN: (dtto) SELECT Zam.Jmeno, Obj.Produkt FROM Zam INNER JOIN Obj ON Zam.ID=Obj.Vystavil_ID LEFT JOIN: (výpis všech záznamů „levé“ tabulky, doplněných o data z Obj)
SELECT Zam.Jmeno, Obj.Produkt FROM Zam LEFT JOIN Obj ON Zam.ID=Obj.Vystavil_ID RIGHT JOIN (výpis všech záznamů „pravé“ tabulky, doplněných o data Zam) SELECT Zam.Name, Obj.Produkt FROM Zam RIGHT JOIN Obj ON Zam.ID=Obj.Vystavil_ID
Zpracování informací, přednáška 3.
23/25
SQL pro pokročilé... Při tvorbě výrazů v SQL dotazech můžeme místo odkazů na hodnoty ve „fyzických“ sloupcích použít i odkazy na „virtuální“ tabulky, vytvářené dynamicky pomocí tzv. „vnořených“ SQL dotazů Příklad:
SELECT jméno, příjmení FROM platy WHERE plat > (SELECT AVG(plat) FROM platy)
Technická Poznámka: V MS Accessu se SQL schovává za vizuální editor – vždy je však možné přejít i do „SQL pohledu“ a dotaz doladit ručně (některé dotazy ani není možné tvořit vizuálně).
Zpracování informací, přednáška 3.
24/25
Shrnutí přednášky K datům IS nepřistupují přímo, ale prostřednictvím databázových systémů (DBS) DBS zajišťují spolehlivost transakcí, škálovatelnost, Vícenás. přístup a zabezpečení Pro práci s daty (DDL/DML) v DBS se obvykle používají neprocedurální logické jazyky Pro použití dat v uživatelských aplikacích se používá vhodné aplikační rozhraní (API). Teprve databázové aplikace uživatelům umožňují vykonávat požadavky na data (vytváření, zápis, aktualizace, čtení výsledků, tvorbu výstupních sestav). K zadávání DDL/DML příkazů se nejčastěji používá jazyk SQL Výstupem funkce SELECT bývá Dataset ve formě tabulky. Dataset může obsahovat vyfiltrovaná, agregovaná i skalárně upravená vstupní data. Teprve takto získané vysledky se používají jako zdroj dat pro následnou analýzu v daném informačním systému.
Zpracování informací, přednáška 3.
25/25