Użycie SQL Oracle opiera się na skonfigurowaniu serwera bazodanowego1 to zostało już za nas zrobione przez służby techniczne UŚ. Utworzenia połączenia pomiędzy serwerem, a naszą aplikacją narzędziową 2zagadnienie omówione w temacie: sql-wedlug-oracle. Wysłaniu do serwera sekwencji rozkazów charakteryzujących nasze potrzeby i otrzymaniu odpowiedzi serwera 3zagadnienie omówione w temacie: sql-wedlug-oracle.

Jest rzeczą logiczną, że aby pracować na bazie danych… musimy wpierw ją stworzyć. Ta czynność opiera się na poleceniu należącym do kategorii DDL4Data Definition language czyli CREATE.

Ćwiczenie 1: Utwórz tabelę o nazwie FIRMA zawierającą kolumny: ID_PRACOWNIKA klucz główny typ numeric, IMIE char(30), NAZWISKO char(60), STANOWISKO char(60), ZAROBEK numeric, DZIAL char(30)

CREATE TABLE FIRMA (
 ID_PRACOWNIKA NUMERIC NOT NULL, 
 IMIE CHAR(30), 
 NAZWISKO CHAR(60), 
 STANOWISKO CHAR(60),
 ZAROBEK NUMERIC, 
 DZIAL CHAR(30), 
 CONSTRAINT FIRMA_PK PRIMARY KEY ( ID_PRACOWNIKA ) ENABLE 
);

lub:

CREATE TABLE FIRMA (
 ID_PRACOWNIKA NUMERIC NOT NULL PRIMARY KEY,
 IMIE CHAR(30), 
 NAZWISKO CHAR(60), 
 STANOWISKO CHAR(60),
 ZAROBEK NUMERIC, 
 DZIAL CHAR(30) 
);
Porównanie Constraint dla obu wariantów poleceń DDL

Mając już stworzoną tabelę w naszej bazie danych dodajmy pierwsze wpisy używając polecenia kategorii DML5Data Modification Language

Ćwiczenie 2: Wypełnij pierwszy wiersz tabeli korzystając z danych: id:7369 prezes Stanisław Kowalski 10800 nie wstawiając żadnej wartości w pole DZIAL.

INSERT INTO "FIRMA" VALUES ('7369', 'Stanisław', 'Kowalski', 'prezes', '10800', NULL);

lub:

INSERT INTO "FIRMA" VALUES ('7369', 'Stanisław', 'Kowalski', 'prezes', '10800', '');

lub:

INSERT INTO "FIRMA" (ID_PRACOWNIKA, IMIE, NAZWISKO, STANOWISKO, ZAROBEK) VALUES ('7369', 'Stanisław', 'Kowalski', 'prezes', '10800');

Różnica między pierwszym, drugim czy trzecim sposobem jest symboliczna, ale pomocna. Za pomocą pierwszej i drugiej komendy wprowadziliśmy wszystkie niezbędne dane uszeregowane wg kolejności pól w opisie tabeli. Trzeci sposób podaje listę atrybutów (kolumn) jakie będziemy uzupełniać i w tej kolejności są one wprowadzane do tabeli. Pozwala to na pominięcie tych atrybutów, których nie będziemy ustawiać w danym wpisie. Pozwala to też ustawić inną kolejność wedle której wpiszemy wartości. W zasadzie patrząc literalnie na ćwiczenie to tylko właśnie trzeci sposób spełnia zadanie (pomimo, że w efekcie wszystkie dają ten sam zapis w bazie danych) – bowiem tylko trzeci sposób nie zapisuje niczego do atrybutu STANOWISKO, pozostałe wpisują tam NULL.

Zdając sobie sprawę z faktu, że nie umieściliśmy wszystkich koniecznych kolumn w naszej tabeli wróćmy do jej definicji i ją zmodyfikujmy dodając kolumnę za pomocą polecenia z kategorii DDL.

Ćwiczenie 3: Dodaj do tabeli FIRMA kolumnę MIASTO char(30)

ALTER TABLE "FIRMA" ADD MIASTO char(30);
ALTER TABLE "FIRMA" ADD MIASTO char(30) CONSTRAINT ID_PRACOWNIKA UNIQUE; 

Qracle SQL nie posiada mechanizmu znanego np. z MySQL umożliwiającego wstawienie kolumny na wskazanej pozycji. Dodawana kolumna umieszczana jest na końcu. Drugi zapis ustawia powiązanie (przypisanie) z polem będącym zdefiniowanym identyfikatorem (tu użyto przykładowo: ID_PRACOWNIKA).

Wiedząc, że wpisaliśmy już nasze pierwsze dane do tablicy wyświetlmy je korzystając z polecenia kategorii DQL6Data Query Language.

Ćwiczenie 4: Wyświetl zawartość tabeli FIRMA.

SELECT * FROM "FIRMA";

Ćwiczenie 5: Wypełnij wartość w kolumnie DZIAL wstawiając KADRY dla wiersza w którym ID_PRACOWNIKA=7369

UPDATE "FIRMA" SET DZIAŁ='KADRY' WHERE ID_PRACOWNIKA=7369;

Ćwiczenie 6. Zmień nazwę kolumny MIASTO na LOKALIZACJA

ALTER TABLE "FIRMA" RENAME COLUMN MIASTO TO LOKALIZACJA;

Ćwiczenie 7. Zmień typ danych w kolumnie ZAROBEK z integer na float

ALTER TABLE "FIRMA" MODIFY ZAROBEK float;

lub w zapisie blokowym:

ALTER TABLE "FIRMA" MODIFY ( ZAROBEK float );

Próba zmiany typu nie dającego się konwertować bezpośrednio np. Varchar2 na Number lub z typu liczbowego na typ liczbowy o mniejszej precyzji nie powiedzie się generując błąd jeśli w tabeli na pozycji tej kolumny znajdują się już dane. Konwersji podlegają jedynie zgodne typy danych lub kolumna musi być pusta.

Ćwiczenie 8. Usuń kolumny LOKALIZACJA i DZIAL

ALTER TABLE "FIRMA" DROP COLUMN LOKALIZACJA;
ALTER TABLE "FIRMA" DROP COLUMN DZIAL;

lub jednocześnie:

ALTER TABLE "FIRMA" DROP ( LOKALIZACJA, DZIAL );

Zapis blokowy powyżej umożliwia modyfikację wielu elementów w jednym poleceniu SQL. Należy jednak zwrócić uwagę na delikatną różnicę w składni.

Ćwiczenie 9. Do tabeli FIRMA wstaw kolumnę NR_DZIALU integer

ALTER TABLE "FIRMA" ADD NR_DZIALU integer;

Ćwiczenie 10. Wstaw wartość 20 w kolumnie NR_DZIALU, dla wiersza w którym ID_PRACOWNIKA=7369

UPDATE "FIRMA" SET NR_DZIALU=20 where id_pracownika=7369;

Ćwiczenie 11. Utwórz tabelę DZIAL zawierającą kolumny: NR_DZIALU – klucz główny integer, oraz NAZWA_DZIALU char(50), LOKALIZACJA char(50)

CREATE TABLE DZIAL(
 NR_DZIALU integer NOT NULL, 
 NAZWA_DZIALU CHAR(50), 
 LOKALIZACJA CHAR(60),
 CONSTRAINT DZIAL_PK PRIMARY KEY ( NR_DZIALU ) ENABLE 
);

Ćwiczenie 12. Usuń wszystkie wiersze z tabeli FIRMA

DELETE FROM "FIRMA";

Ćwiczenie 13. Zmień nazwę tabeli FIRMA na PRACOWNICY

RENAME "FIRMA" TO "PRACOWNICY";

Ćwiczenie 14. Dodaj do tabeli Pracownicy powiązanie z tabelą DZIAL w postaci klucza obcego

ALTER TABLE "PRACOWNICY" ADD CONSTRAINT fk_dzial FOREIGN KEY (NR_DZIALU) REFERENCES DZIAL (NR_DZIALU);

Ćwiczenie 15. Wypełnij tabele DZIAL

INSERT INTO "DZIAL" VALUES(10,'KSIEGOWOŚĆ','KATOWICE');
INSERT INTO "DZIAL" VALUES(20,'BADANIA','WARSZAWA');
INSERT INTO "DZIAL" VALUES(30,'SPRZEDAŻ','POZNAŃ');
INSERT INTO "DZIAL" VALUES(40,'OPERACJE','GDAŃSK');

Ćwiczenie 16. Wyświetl zawartość tabeli DZIAL

SELECT * FROM "DZIAL";

Ćwiczenie 17. Wypełnij tabele PRACOWNICY

Z uwagi, gdy nie wypełniamy wartościami wszystkich kolumn tabeli „PRACOWNICY” łatwiej nam będzie skorzystać z poniższej formy polecenia INSERT. Pozwala nam to też zachować własną kolejność wymienianych atrybutów.

INSERT INTO "PRACOWNICY" (ID_PRACOWNIKA,IMIE,NAZWISKO,STANOWISKO,ZAROBEK,NR_DZIALU) VALUES (7369,'MARCIN','SMITKO','URZĘDNIK',800,20);
INSERT INTO "PRACOWNICY" (ID_PRACOWNIKA,IMIE,NAZWISKO,STANOWISKO,ZAROBEK,NR_DZIALU) VALUES (7499,'WOJTEK','ALLEN','SPRZEDAWCA',1600,30);
INSERT INTO "PRACOWNICY" (ID_PRACOWNIKA,IMIE,NAZWISKO,STANOWISKO,ZAROBEK,NR_DZIALU) VALUES (7521,'ŁUKASZ','WARD','SPRZEDAWCA',1250,30);
INSERT INTO "PRACOWNICY" (ID_PRACOWNIKA,IMIE,NAZWISKO,STANOWISKO,ZAROBEK,NR_DZIALU) VALUES (7566,'DAMIAN','JONAS','KIEROWNIK',2975,20);
...

W przeciwnym wypadku musimy użyć listy wartości atrybutów zgodnej z kolejnością kolumn w tabeli. Kolejność tę można zawsze sobie przypomnieć za pomocą poniższego polecenia.

DESCRIBE "PRACOWNICY";

Ćwiczenie 18. Wyświetl zawartość tabeli PRACOWNICY

SELECT * FROM "PRACOWNICY";

Uzupełnienie danych: Po przeprowadzeniu wyżej wymienionych ćwiczeń utrwalmy je realizując zadanie utworzenia struktur analogicznych do przedstawionych poniżej danych.