Rozdział 1

Wprowadzenie

W czasie zajęć w laboratorium będziemy używać publicznie dostępnego DBMS Postgres.

1.1  Logowanie do Postgresa

Należy zalogować się do Linuxa na jakąś maszynę w laboratorium.

Chcąc pracować interakcyjnie logujemy się do Postgresa pisząc:

psql -h nasz-serwer nasza-baza nasz-login

psql to program do doraźnego dostępu i administrowania bazami danych w Postgresie używający SQL. nasz-login oznacza login w systemie Linux.

Zostaniemy poproszeni o hasło. Początkowym hasłem jest ,,x'' i musi być zmienione jak najszybciej. Proszę nie używać swoich haseł z Linuxa, ponieważ w pewnych okolicznościach mogą być one widoczne (wprawdzie tylko dla administratorów, ale zawsze to już coś). Po wprowadzeniu poprawnego hasła powinniśmy zobaczyć prompt

bd=>

1.2  Zmienianie hasła

W odpowiedzi na prompt wpisujemy

ALTER USER nasz-login WITH PASSWORD 'nowe-hasło';

Każde polecenie SQL należy kończyć średnikiem.

Przypominam, że SQL nie rozróżnia (poza napisami) dużych i małych liter. Konwencjonalnie będę używał dużych liter do wyróżniania słów kluczowych SQL.

1.3  Polecenia psql

Oprócz instrukcji SQL możemy wpisywać polecenia psql. Polecenia psql rozpoczynają się lewym ukośnikiem (backslashem). Polecenie \q służy do kończenia pracy.

Inne przydatne polecenia dają dostęp do interakcyjnej pomocy. \h z nazwą instrukcji SQL (np. \h select lub \h create table) podaje krótki opis składni. Aby dostać listę poleceń psql, nalezy napisać \?.

Podczas pracy działa ,,historia'' -- poprzednie polecenia można przywoływać strzałkami pionowymi i edytować.

1.4  Tworzenie tabeli

W psql mozna wykonywać dowolne instrukcje SQL. Można załozyć tabelę używając instrukcji

CREATE TABLE nazwa-tabeli (
  lista-atrybutów-i-ich-typów
);

Tekst instrukcji można wprowadzać w jednej lub kilku liniach (prompt w kolejnych zmieni się wtedy na bd), dopóki nie wpiszemy średnika kończącego instrukcję.

Przykład tworzenia tabeli:

CREATE TABLE Zwierz (
  waga int,
  imie char(10)
);

1.5  Klucz pierwotny

Każda tabela powinna mieć zadeklarowany klucz pierwotny:

CREATE TABLE nazwa-tabeli (
  ...,
  id typ PRIMARY KEY,
  ...
);

Klucz może składać się z kilku kolumn:

CREATE TABLE nazwa-tabeli (
  atrybuty i ich typy,
  PRIMARY KEY (a,b,c)
);

1.6  Wstawianie wierszy

Po utworzeniu tabeli można wstawiać do niej wiersze. Najprościej robi się to instrukcją INSERT:

INSERT INTO nazwa-tabeli
  VALUES(wartość, ...);

Kolejność wartości powinna odpowiadać kolejności kolumn w deklaracji tabeli, np. aby wstawić wiersz (10, 'Kropka') do tabeli Zwierz piszemy

INSERT INTO Zwierz VALUES(10, 'Kropka');

1.7  Przeszukiwanie tabeli

Wiersze tabeli można obejrzeć instrukcją:

SELECT *
FROM nazwa-tabeli;

Program psql wyświetla wyszukane wiersze w postaci tabelki:

SELECT * FROM test;

 waga  | imie
-------+------------
 10    | Kropka
(1 row)

1.8  Usuwanie tabeli

Tabelę usuwamy instrukcją

DROP TABLE nazwa-tabeli;

Czasami trzeba użyć modyfikatora CASCADE

DROP TABLE test CASCADE;

Jeżeli chcemy zmienić definicję tabeli, przed wczytaniem zmienionej definicji nalezy usunąć tabelę.

1.9  Informacje o tabelach w bazie danych

Informacje o utworzonych tabelach są trzymane w słownikowych tabelach systemowych, przede wszystkim w tabeli pg_tables. Można wyszukać nazwy wszystkich swoich tabel podając zapytanie:

SELECT tablename
FROM pg_tables
WHERE tableowner = nasz-login;

Listę kolumn tabeli można też obejrzeć używając polecenia psql:

\d nazwa-tabeli

1.10  Wczytywanie instrukcji SQL z pliku

Zamiast wpisywać instrukcje SQL interakcyjnie można umieścić je w pliku i następnie załadować ten plik poleceniem

\i nazwa-pliku

na przykład

bd=> \i foo.sql

1.11  Wczytywanie obcych danych

PostgreSQL pozwala wczytywać i wypisywać dane z tabeli używając plików separowanych. Służy do tego instrukcja COPY:

COPY tabela TO 'plik';

Domyślnym separatorem jest znak tabulacji, ale można to zmienić:

COPY tabela FROM 'plik' USING DELIMITERS '|';

Ponieważ jednak w instrukcji COPY plik musi znajdować się w katalogu dostępnym dla procesów serwera bazy danych, zwykły użytkownik na ogół nie będzie mógł z niego skorzystać. Zamiast nazwy pliku można jednak podać stdin lub stdout, co spowoduje czytanie ze standardowego wejścia i pisanie na standardowe wyjście (w środowisku użytkownika)

COPY tabela TO stdout;

COPY tabela FROM stdin USING DELIMITERS '|';

Można wtedy przekierować wejście lub wyjście programu takiego jak psql.