PostgreSQL SQL
Sisukord
- 1 Sissejuhatus
- 2 Andmebaasi klientprogramm
- 3 Select
- 4 Andmebaasi hierarhia
- 5 Andmetüübid
- 6 Numbrijada
- 7 Relatsioonid
- 8 Mõisted
- 9 Misc laused
- 10 Primaarne võti
- 11 Väline võti
- 12 Indeksid
- 13 Vaated
- 14 Transaktsioon
- 15 Jõudlus
- 16 Trigger
- 17 Protseduurilised keeled
- 18 Kursorite kasutamine
- 19 dblink
- 20 pgcrypto
- 21 tsearch2
- 22 Failisüsteemi kasutamine
- 23 Kasulikud lisamaterjalid
Sissejuhatus
TODO
Andmebaasi klientprogramm
Reeglina sisaldab andmebaasitarkvara lisaks andmebaasi serverile ka mingit terminalil kasutatavat nö käsurea klientprogrammi, nt PostgreSQL puhul on selleks programm psql.
- andmebaasi kliendi kasutamine kalkulaatorina
select (5 * 5); ?column? ---------- 25 (1 row)
- andmebaasi klient töötab sõnedega
select 'Hello' || ' World!'; ?column? -------------- Hello World! (1 row)
- Andmebaasi kliendi juures saab määrata esituse formaati, nt (vaikimisi on see aligned)
\pset format html
Select
select lausega saab lihtsamal juhul kasutada andmebaasis kirjeldatud funktsioone, nt
select sqrt(25);
Tabli moodustamine select lause väljundist
select * into pgcrypto.priidutabel from priit.priidutabel;
Andmebaasi hierarhia
- andmekluster
- andmebaas
create database andmebaasinimi;
- skeem
create schema skeeminimi;
- tabel
create table ...
Andmetüübid
TODO
Numbrijada
Numbrijada (ingl. k. sequence) moodustamiseks sobib öelda
CREATE SEQUENCE jadanimi start 1;
Relatsioonid
TODO
Mõisted
- result set - vastus andmebaasile esitatud päringule, või sisaldada mitte midagi, ühte või enamat rida
Misc laused
- tabel ühte tehtud päringu tulemuste lisamine tabel kahte
insert into tabel2 (nimi, aadress) select nimi, aadress from tabel1
- Andmete kopeerimine failisüsteemi
copy customers to '/tmp/customers.txt';
- Andmete kopeerimine failisüsteemist
copy customers from '/tmp/customers.txt';
Primaarne võti
Primaarse võtmega tabeli moodustamine
CREATE TABLE tabelinimi ( id SERIAL PRIMARY KEY, title CHARACTER VARYING(80) );
Olemasolevale tabelile võtme lisamine
ALTER TABLE tabelinimi ADD PRIMARY KEY (valjanimi_id);
Väline võti
Välise võtme kasutamiseks sobib moodustada tabel selliselt
CREATE TABLE rentals ( tape_id CHARACTER(8) REFERENCES tapes, customer_id INTEGER REFERENCES customers, rental_date DATE );
self-refrencing
Self-refrencing puhul viitab välisvõti sama tabeli mõnele unikaalsele väljale, nt
CREATE TABLE vanemadjalapsed ( inimesenimi character varying(50) NOT NULL, lapsenimi character varying(50), vanemanimi character varying(50), CONSTRAINT vanemajalapsed_pkey PRIMARY KEY (inimesenimi), CONSTRAINT vanemadjalapsed_fk FOREIGN KEY (vanemanimi) REFERENCES vanemadjalapsed (inimesenimi) MATCH SIMPLE ON UPDATE CASCADE ON DELETE NO ACTION )
kus
- inimesenimi - ...
- lapsenimi - ...
- vanemanimi - ...
- on update cascade - tagab, et kui mõni inimesenimi väärtus muutub, siis muutub ka vastava nime kasutus kõigis vanemanimi lahtrites kus seda on kasutatud
Indeksid
TODO
Vaated
TODO
Transaktsioon
TODO
Jõudlus
explain verbose select * from teenused where nimi='teenuse nimi_O_13437'; QUERY PLAN ---------------------------------------------------------------------------- Bitmap Heap Scan on teenused2 (cost=6.60..196.17 rows=48 width=48) Output: id, nimi, aadress Recheck Cond: ((nimi)::text = 'teenuse nimi_O_13437'::text) -> Bitmap Index Scan on teenused_idx (cost=0.00..6.59 rows=48 width=0) Index Cond: ((nimi)::text = 'teenuse nimi_O_13437'::text)
Trigger
Triggeriks nimetatakse sellist funktsiooni, mille täitmine kaasneb automaatselt vastavas tabelis toimuva muudatusega. Nt olgu olemas tabel customers
CREATE TABLE customers ( customer_id integer primary key, customer_name character varying(50) not null, phone character(8) , birth_date date, balance decimal(7,2) );
ning tabel customers_archive
CREATE TABLE customer_archive ( customer_id integer, customer_name character varying(50) not null, phone character(8) , birth_date date, balance decimal(7,2) , user_changed varchar, date_changed date, operation varchar );
Eesmärgiks on kõik customers tabelis toimunud muudatused arhiveerida tabelis customers_archive. Selleks sobib kirjeldada funktsioon
CREATE FUNCTION archive_customer() RETURNS TRIGGER AS $$ BEGIN INSERT INTO customer_archive VALUES ( OLD.customer_id, OLD.customer_name, OLD.phone, OLD.birth_date, OLD.balance, CURRENT_USER, now() , TG_OP ); RETURN NULL; END; $$ LANGUAGE 'plpgsql';
Ning lõpuks moodustada trigger archive_customer seostades funktsiooni tabeliga customers
CREATE TRIGGER archive_customer AFTER DELETE OR UPDATE ON customers FOR EACH ROW EXECUTE PROCEDURE archive_customer();
Protseduurilised keeled
Nt PL/pgSQL on üks PostgreSQL andmebaasi protseduuriline keel.
$ createlang -h 127.0.0.1 -U postgres plpgsql movies
Ja tulemuse kontrollimiseks
movies=# select * from pg_language ; lanname | lanowner | lanispl | lanpltrusted | lanplcallfoid | lanvalidator | lanacl ----------+----------+---------+--------------+---------------+--------------+-------- internal | 10 | f | f | 0 | 2246 | c | 10 | f | f | 0 | 2247 | sql | 10 | f | t | 0 | 2248 | plpgsql | 10 | t | t | 16446 | 16447 | (4 rows)
Lihsamal juhul võiks kirjeldada funktsiooni selline järgnevus
CREATE OR REPLACE FUNCTION liitja (INTEGER, INTEGER) RETURNS INTEGER AS $$ BEGIN return $1 + $2; END; $$ LANGUAGE 'plpgsql';
Faktoriaali arvutamise kirjeldab nt selline PL/pgSQL funktsioon, kusjuures tegu on rekursiivse funktsiooniga
CREATE OR REPLACE FUNCTION my_factorial( value INTEGER) RETURNS INTEGER AS $$ DECLARE arg INTEGER; BEGIN arg := value; IF arg IS NULL OR arg < 0 THEN RAISE NOTICE 'Invalid Number' ; RETURN NULL; ELSE IF arg = 1 THEN RETURN 1; ELSE DECLARE next_value INTEGER; BEGIN next_value := my_factorial(arg - 1) * arg; RETURN next_value; END; END IF; END IF; END; $$ LANGUAGE 'plpgsql';
Funktsiooni kasutamiseks sobib öelda
select my_factorial();
Funktsiooni kustutamiseks sobib öelda
drop function liitja(integer, integer);
Kursorite kasutamine
TODO
dblink
dblink tehnika võimaldab ühe andmebaasi päringutes kasutada teise andmebaasi andmeid.
- Näiteks lihtsalt päringut teha
SELECT * FROM dblink.dblink('dbname=test host=192.168.10.205 user=postgres','SELECT nimi, vanus FROM priit.priidutabel') AS tabelinimi(nimi varchar(50), vanus integer);
- Tekitada teise andmebaasi andmetest vaade
create view dblink.dblink_view as select * from dblink.dblink('dbname=test host=192.168.10.205 user=postgres', 'SELECT nimi, vanus FROM priit.priidutabel') as tabelinimi(nimi varchar(50), vanus integer);
ja vaate kasutamiseks öelda nt
select * from dblink_view;
pgcrypto
pgcrypto moodul võimaldab kasutada andmebaasis krüptimise funktsioone. Nt md5 vormingus parooli genereerimiseks sobib öelda
UPDATE pgcrypto.priidutabel SET parool = pgcrypto.crypt('new password', pgcrypto.gen_salt('md5'));
tsearch2
tsearch2 on täisteksti otsingu moodul.
Failisüsteemi kasutamine
Failisüsteemi salvestamine
Andmebaasist päringu tulemuse kopeerimiseks failisüsteemi sobib nt esmalt moodustada ajutine tabel priit.nimed
CREATE TEMP TABLE nimed AS SELECT nimi FROM priit.priidutabel;
ning seejärel tabeli sisu salvestada failisüsteemi öeldes
copy nimed to '/tmp/priit.log';
Failisüsteemist lugemine
Olemasolevasse tabelisse priit.priidutabel failisüsteemi failist /tmp/andmed andmete kopeerimiseks sobib öelda
copy priit.priidutabel (vanus, nimi) from '/tmp/andmed' with delimiter ' ';
Kasulikud lisamaterjalid
- http://www.conjectrix.com/ - PostgreSQL, 2nd edition
- Database Design for Mere Mortals: A Hands-On Guide to Relational Database Design, Second Edition, Michael J. Hernandez
- Logic Data Modeling kursus - http://www.youtube.com/watch?v=IiVq8M5DBkk&feature=related
- UML kursus - http://www.youtube.com/watch?v=RRXe1omEGWQ&feature=PlayList&p=749853D118C90D9C&index=1
- UHCL Graduate Database Course - http://www.youtube.com/watch?v=DjHhZLdPjH0&feature=PlayList&p=7E6294372C9EAF06&index=0&playnext=1
- Designing Effective Database Systems, Rebecca M. Riordan
- PostgreSQL: Introduction and Concepts, Bruce Momjian - http://www.postgresql.org/files/documentation/books/aw_pgsql/
- Practical PostgreSQL - John Worsley, Joshua Drake - http://www.commandprompt.com/ppbook/