Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Podejście relacyjne Podejście relacyjne opiera się na wykorzystaniu do przedstawiania danych modelu relacyjnego i zarządzania nimi matematycznego modelu.

Podobne prezentacje


Prezentacja na temat: "Podejście relacyjne Podejście relacyjne opiera się na wykorzystaniu do przedstawiania danych modelu relacyjnego i zarządzania nimi matematycznego modelu."— Zapis prezentacji:

1 Podejście relacyjne Podejście relacyjne opiera się na wykorzystaniu do przedstawiania danych modelu relacyjnego i zarządzania nimi matematycznego modelu zawierającego algebrę relacyjną i rachunek relacji. Ogólnie system zarządzania relacyjną bazą danych: Reprezentuje całą informację z bazie danych za pomocą tabel. Reprezentuje całą informację z bazie danych za pomocą tabel. Wspiera trzy podstawowe operacje relacyjne: wybór (selekcja, ang. selection), rzutowanie (projekcja, ang. projection) i złączanie (ang. join). Wspiera trzy podstawowe operacje relacyjne: wybór (selekcja, ang. selection), rzutowanie (projekcja, ang. projection) i złączanie (ang. join). Szczegółowe wymagania określa dwanaście tzw. praw Codda.

2 Między innymi system w pełni relacyjny musi: Reprezentować całą informację zawartą w bazie w postaci tabel. Reprezentować całą informację zawartą w bazie w postaci tabel. Utrzymywać niezależność logicznej reprezentacji danych od fizycznego sposobu ich przechowywania. Utrzymywać niezależność logicznej reprezentacji danych od fizycznego sposobu ich przechowywania. Używać języka wysokiego poziomu w celu strukturalizacji, wyszukiwania i zmiany informacji w bazie danych. Używać języka wysokiego poziomu w celu strukturalizacji, wyszukiwania i zmiany informacji w bazie danych. Wspierać podstawowe operacje relacyjne i takie operacje teorii zbiorów, jak suma, przecięcie, różnica i dzielenie. Wspierać podstawowe operacje relacyjne i takie operacje teorii zbiorów, jak suma, przecięcie, różnica i dzielenie. Wspierać perspektywy umożliwiające użytkownikowi określenie alternatywnych sposobów oglądania danych w tabelach. Wspierać perspektywy umożliwiające użytkownikowi określenie alternatywnych sposobów oglądania danych w tabelach. Dostarczać metodę pozwalającą odróżniać wartości nieznane (null) od zera lub miejsca niewypełnionego. Dostarczać metodę pozwalającą odróżniać wartości nieznane (null) od zera lub miejsca niewypełnionego. Wspierać mechanizmy zapewniające spójność, prawa dostępu, transakcje i odzyskiwanie danych. Wspierać mechanizmy zapewniające spójność, prawa dostępu, transakcje i odzyskiwanie danych.

3 Postulaty Codda dla relacyjnej bazy danych (1985 rok) 1. Postulat informacyjny: na poziomie logicznym dane są reprezentowane wyłącznie za pomocą tabel. 2. Postulat dostępu: do każdej pojedynczej danej jest dostęp za pomocą tabel, kolumn i wartości kluczy głównych. 3. Postulat wartości null: w systemie jest dostępna specjalna wartość reprezentująca wartość brakującą, nieokreśloną lub nieznaną; jest to wartość różna od wszystkich konkretnych wartości, jak np. pusty napis lub zero.

4 4. Postulat słownika danych: informacje o obiektach bazy danych tworzących jej schemat są na poziomie logicznym zgrupowane w tabele, które są dostępne w taki sam sposób, jak każde inne dane. 5. Postulat pełnego języka danych: w systemie jest zaimplementowany pełny język obejmujący definiowanie danych, perspektyw, więzów spójności, operowanie danymi (interaktywne lub przez program), nadawanie uprawnień użytkownikom, transakcje. Postulaty Codda dla relacyjnej bazy danych (1985 rok)

5 6. Postulat modyfikowania bazy danych przez perspektywy: system umożliwia modyfikowanie danych za pomocą perspektyw, w przypadku gdy taka modyfikacja jest semantycznie sensowna. 7. Postulat modyfikowania danych na wysokim poziomie abstrakcji: system umożliwia modyfikowanie danych za pomocą operacji, których argumentami są tabele (perspektywy), a więc w szczególności nie tylko w sposób nawigacyjny. 8. Fizyczna niezależność danych: zmiany w metodach przechowywania danych i dostępu do nich nie mają wpływu na aplikacje. Postulaty Codda dla relacyjnej bazy danych (1985 rok)

6 9. Logiczna niezależność danych: zmiany w tabelach zachowujące informacje i dopuszczalne semantycznie nie mają wpływu na aplikacje. 10. Niezależność więzów spójności: więzy spójności są definiowane w języku bazy danych (nie muszą być wyrażane w aplikacji). Postulaty Codda dla relacyjnej bazy danych (1985 rok)

7 11. Niezależność dystrybucyjna: system (i jego język) umożliwiają używanie danych zapisanych w różnych fizycznie miejscach (w różnych węzłach sieci). 12. Zabezpieczenie przed operacjami na niższych poziomach abstrakcji: jeżeli system umożliwia operacje na niższych poziomach abstrakcji, nie mogą one naruszać relacyjnego modelu danych (w tym pomijać ograniczeń określonych przez więzy spójności). Postulaty Codda dla relacyjnej bazy danych (1985 rok)

8 Postulat 1. Model relacyjny - wszystko jest tabelą Tabela podzielona jest na poziome wiersze i pionowe kolumny. Alternatywne pojęcia (niemal synonimy): Tabela – relacja – plik. Tabela – relacja – plik. Wiersz – krotka (wystąpienie encji) – rekord. Wiersz – krotka (wystąpienie encji) – rekord. Kolumna – atrybut (właściwość) – pole. Kolumna – atrybut (właściwość) – pole.

9 Zbiór powiązanych ze sobą tabel to baza danych. Tabela to zbiór wierszy, czyli wystąpień encji. Encje charakteryzują własności, czyli wartości w poszczególnych kolumnach. W relacyjnej bazie danych występują dwa rodzaje tabel: Tabele użytkownika. Tabele użytkownika. Tabele systemowe (katalog, słownik systemu) – czwarte prawo Codda. Tabele systemowe (katalog, słownik systemu) – czwarte prawo Codda. Postulat 1.

10 Postulat 3. Wartość nieokreślona (null) Wartość null (rozwiązanie problemu brakującej informacji) oznacza brak danej (jest ona nieznana lub nie wprowadzona). Stosowanie null zmienia tradycyjną logikę dwuwartościową (tak/nie) na logikę trójwartościową (tak/nie/być może) – stanowi integralną część standardu języka SQL. Stosowanie null zmienia tradycyjną logikę dwuwartościową (tak/nie) na logikę trójwartościową (tak/nie/być może) – stanowi integralną część standardu języka SQL.

11 Postulat 5. Język wysokiego poziomu System relacyjny wymaga pełnego podjęzyka danych (np. SQL). Zakres zastosowań pełnego podjęzyka danych: Operowanie danymi (wyszukiwanie i modyfikowanie). Operowanie danymi (wyszukiwanie i modyfikowanie). Definiowanie danych. Definiowanie danych. Administrowanie danymi. Administrowanie danymi. Każda operacja języka wyrażona jest instrukcją lub poleceniem. Operacje wyszukiwanie nazywane są często zapytaniami.

12 SQL jako podjęzyk danych Język SQL jest językiem nieproceduralnym, tzn. pozwala na określenie warunków, jakie ma spełniać wynik bez podawania szczegółów dotyczących sposobu realizacji. Operacje wyszukiwania powodują utworzenie i wyprowadzenie tabel wynikowych zwanych tabelami wyprowadzanymi na podstawie tabel bazowych zawierających surowe dane. Operacje relacyjne: Rzutowanie – wybór kolumn (określa podzbiór kolumn). Rzutowanie – wybór kolumn (określa podzbiór kolumn). Wybór – wybór wierszy (określa podzbiór wierszy). Wybór – wybór wierszy (określa podzbiór wierszy). Złączanie – utworzenie jednej tabeli wynikowej na podstawie kilku tabel bazowych. Złączanie – utworzenie jednej tabeli wynikowej na podstawie kilku tabel bazowych.

13 Postulat 6. Różne sposoby oglądania danych Perspektywa (tabela wirtualna, tabela pochodna) – tabela utworzona na podstawie jednej lub kilku tabel bazowych, która umożliwia inny, alternatywny sposób przeglądania danych. Dane oglądane w perspektywie nie są zapamiętane w ten sposób w bazie danych (nie jest ona kopią danych). Zmiana danych w perspektywie powoduje (zwykle) ich modyfikację w rzeczywistości (prawo Codda).

14 Postulat 7. Bezpieczeństwo sprowadza się do kontroli kto używa jakich danych i w jakiem celu. Podjęzyk danych powinien umożliwić realizację tej kontroli. Poziom kontroli zależy od SZBD (na poziomie baz danych, tabel, kolumn, wierszy). Rodzaje użytkowników: Zwykły użytkownik (użytkownik) – prawa wynikające z nadanych mu uprawnień. Zwykły użytkownik (użytkownik) – prawa wynikające z nadanych mu uprawnień. Użytkownik uprzywilejowany – właściciel baz danych lub obiektów bazodanowych (osoba tworząca te obiekty). Użytkownik uprzywilejowany – właściciel baz danych lub obiektów bazodanowych (osoba tworząca te obiekty). Administrator systemu (administrator bazy danych). Administrator systemu (administrator bazy danych).

15 Postulat 8. i 9. Niezależność danych Niezależność danych jest celem SZBD w modelu relacyjnym. Poziomy niezależności: Fizyczna niezależność danych (reprezentacja danych widziana przez użytkownika jest całkowicie niezależna od fizycznego sposobu pamiętania danych – wydzielenie metod dostępu). Fizyczna niezależność danych (reprezentacja danych widziana przez użytkownika jest całkowicie niezależna od fizycznego sposobu pamiętania danych – wydzielenie metod dostępu). Logiczna niezależność danych (reprezentacja danych widziana przez użytkownika jest niezależna od programów użytkowych). Logiczna niezależność danych (reprezentacja danych widziana przez użytkownika jest niezależna od programów użytkowych).

16 Postulat 10. Spójność (integralność) to poprawność danych w bazie danych. Ograniczenia (tzw. więzy) dotyczące spójności powinny być definiowane w tym samym podjęzyku danych, co reszta systemu i zapamiętane w słowniku bazy danych (prawo Codda). Metody zapewnienia spójności: Zarządzanie transakcjami – polecenie podjęzyka danych musi być wykonane w całości, albo wcale (żadna jego część). Zarządzanie transakcjami – polecenie podjęzyka danych musi być wykonane w całości, albo wcale (żadna jego część). Spójność encji – ograniczenia dziedziny, ograniczenia na wartości klucza głównego, dodatkowe warunki. Spójność encji – ograniczenia dziedziny, ograniczenia na wartości klucza głównego, dodatkowe warunki. Spójność odwołań – zgodność fragmentów informacji powtarzających się w kilku tabelach. Spójność odwołań – zgodność fragmentów informacji powtarzających się w kilku tabelach. Dodatkowe ograniczenia (np. wyzwalacze). Dodatkowe ograniczenia (np. wyzwalacze).

17 SQL Strukturalny (Standardowy) Język Zapytań

18 Składnia języka SQL Uwagi dotyczące konwencji składniowej SQL: SQL jest językiem o formacie swobodnym (brak wymagań na liczbę wierszy składających się na polecenie i liczby słów w wierszu oraz miejsca rozpoczęcia i zakończenia polecenia). SQL jest językiem o formacie swobodnym (brak wymagań na liczbę wierszy składających się na polecenie i liczby słów w wierszu oraz miejsca rozpoczęcia i zakończenia polecenia). Słowa kluczowe języka można zazwyczaj pisać małymi i dużymi literami (przeważnie są nierozróżnialne w tym przypadku). Słowa kluczowe języka można zazwyczaj pisać małymi i dużymi literami (przeważnie są nierozróżnialne w tym przypadku). Identyfikatory stałych, zmiennych i obiektów bazodanowych nadawane przez użytkownika muszą spełniać zwykle bardzo różne ograniczenia narzucone przez poszczególne SZBD (np. długość, dopuszczalne znaki, rozróżnianie małych i dużych liter – zazwyczaj w tym miejscu są rozróżnialne). Identyfikatory stałych, zmiennych i obiektów bazodanowych nadawane przez użytkownika muszą spełniać zwykle bardzo różne ograniczenia narzucone przez poszczególne SZBD (np. długość, dopuszczalne znaki, rozróżnianie małych i dużych liter – zazwyczaj w tym miejscu są rozróżnialne).

19 Uwagi dotyczące konwencji składniowej SQL (cd): Polecenia mogą posiadać dodatkowe opcje, z których musi być wybrana jedna ({opcja1/opcja2/...}), czy musi być wybrana jedna lub więcej niż jedna ({opcja1, opcja2,..}), ewentualnie może być wybrana jedna lub wcale ([opcja1/opcja2/...]), czy może być wybrana jedna, więcej niż jedna lub wcale ([opcja1, opcja2,...]) –nawiasy klamrowe i kwadratowe nie są częścią składni języka. Polecenia mogą posiadać dodatkowe opcje, z których musi być wybrana jedna ({opcja1/opcja2/...}), czy musi być wybrana jedna lub więcej niż jedna ({opcja1, opcja2,..}), ewentualnie może być wybrana jedna lub wcale ([opcja1/opcja2/...]), czy może być wybrana jedna, więcej niż jedna lub wcale ([opcja1, opcja2,...]) –nawiasy klamrowe i kwadratowe nie są częścią składni języka. Nawiasy okrągłe są częścią składni języka SQL. Nawiasy okrągłe są częścią składni języka SQL. Instrukcja SQL wymaga użycia znaku końca (zazwyczaj średnik). Instrukcja SQL wymaga użycia znaku końca (zazwyczaj średnik). Składnia języka SQL

20 Tworzenie bazy danych Tworzenie bazy danych wymaga najpierw utworzenia schematu bazy danych (zawiera np. szkielet tabel systemowych), który nie jest wypełniony danymi – w niektórych SZBD operacja ta jest zarezerwowana dla administratora. Tworzenie i używanie baz danych wymaga: Utworzenia (inicjalizacji) bazy danych. Utworzenia (inicjalizacji) bazy danych. Utworzenia tabel wewnątrz bazy danych. Utworzenia tabel wewnątrz bazy danych. Wypełnienia tabel (pracy z tabelami). Wypełnienia tabel (pracy z tabelami).

21 Utwórz (schemat) bazę danych (ewentualnie dodatkowe opcje) CREATE DATABASE nazwa_bazy_danych; CREATE DATABASE nazwa_bazy_danych; CREATE SCHEMA nazwa_bazy_danych; CREATE SCHEMA nazwa_bazy_danych;Przykład: CREATE DATABASE Firma; CREATE DATABASE Firma; Tworzenie bazy danych

22 Wybierz (domyślną) bazę danych USE nazwa_bazy_danych; USE nazwa_bazy_danych; DATABASE nazwa_bazy_danych; DATABASE nazwa_bazy_danych;Przykład: USE Firma; USE Firma; Używanie bazy danych

23 Pokaż dostępne bazy danych SHOW DATABASES; SHOW DATABASES; Usuń bazę danych DROP nazwa_bazy_danych; DROP nazwa_bazy_danych;Przykład: DROP Firma; DROP Firma; Używanie bazy danych

24 Praca z konkretną bazą danych wymaga deklaracji jej użycia. Niekiedy w niektórych SZBD praca z bazą danych będzie wymagała połączenia się z nią przy pomocy polecenia CONNECT. Pełne prawa do bazy danych posiada jej właściciel, czyli osoba, która ją utworzyła (dodatkowo także administrator systemu). Używanie bazy danych

25 Tworzenie tabeli Tworzenie tabeli co najmniej obejmuje: Nadanie nazwy tabeli. Nadanie nazwy tabeli. Nadanie nazw kolumnom tworzącym tabelę. Nadanie nazw kolumnom tworzącym tabelę. Określenie typu danych dla każdej kolumny. Określenie typu danych dla każdej kolumny. Określenie statusu NULL (dopuszczenie lub zakazanie wartości nieokreślonej) dla każdej kolumny – w różnych SZBD różnie przyjmuje się wartość domyślą tego statusu (NULL/NOT NULL). Określenie statusu NULL (dopuszczenie lub zakazanie wartości nieokreślonej) dla każdej kolumny – w różnych SZBD różnie przyjmuje się wartość domyślą tego statusu (NULL/NOT NULL). Wprowadzenie danych. Wprowadzenie danych.

26 Tworzenie tabeli Dodatkowe możliwości przy tworzeniu tabeli: Określenie wartości domyślnych (DEFAULT) przyjmowanych automatycznie, gdy nic nie zostanie wprowadzone. Określenie wartości domyślnych (DEFAULT) przyjmowanych automatycznie, gdy nic nie zostanie wprowadzone. Określenie więzów ograniczających dopuszczalne wartości wprowadzane do poszczególnych kolumn. Określenie więzów ograniczających dopuszczalne wartości wprowadzane do poszczególnych kolumn. Określenie więzów definiujących kolumnę jako klucz główny, klucz jednoznaczny, lub oba klucze jednocześnie. Określenie więzów definiujących kolumnę jako klucz główny, klucz jednoznaczny, lub oba klucze jednocześnie. Ustanowienie więzów sprawdzających zależności między kluczami głównymi i obcymi. Ustanowienie więzów sprawdzających zależności między kluczami głównymi i obcymi.

27 Tworzenie tabeli Typ danych określa rodzaj informacji przechowywanej w danej kolumnie (także charakter możliwych do wykonania operacji). Systemy relacyjne mogą obsługiwać wiele (ograniczoną liczbę) typów danych. W różnych SZBD typy danych mogą być różne. SZBD udostępnia funkcje konwersji danych do innego typu (w ograniczonym zakresie). Wybór długości i typu danych jest istotny z punktu widzenia wykonywanych operacji oraz zajmowanej pamięci (preferowane typy danych o zmiennej długości). Wybór precyzji i skali zależy od charakteru wykonywanych operacji.

28 Rodzaje typów danych: Znakowe (napisowe) typy danych – ciąg znaków o stałej lub zmiennej długości, przy odwoływaniu umieszczany w pojedynczych apostrofach. Niektóre SZBD udostępniają znakowe narodowe typy danych oraz osobny typ znakowy do przechowywania dużej ilości tekstu; przykłady identyfikatorów: Znakowe (napisowe) typy danych – ciąg znaków o stałej lub zmiennej długości, przy odwoływaniu umieszczany w pojedynczych apostrofach. Niektóre SZBD udostępniają znakowe narodowe typy danych oraz osobny typ znakowy do przechowywania dużej ilości tekstu; przykłady identyfikatorów: CHAR(N) – łańcuch znaków o stałej długości N. CHAR(N) – łańcuch znaków o stałej długości N. VARCHAR(N) – łańcuch znaków o zmiennej długości N. VARCHAR(N) – łańcuch znaków o zmiennej długości N. TEXT, LONGTEXT – odpowiednio krótki lub długi łańcuch tekstu. TEXT, LONGTEXT – odpowiednio krótki lub długi łańcuch tekstu. Tworzenie tabeli

29 Rodzaje typów danych (cd): Binarne typy danych – przechowujące w postaci binarnej kody np. obrazów o różnej długości; przykłady identyfikatorów: Binarne typy danych – przechowujące w postaci binarnej kody np. obrazów o różnej długości; przykłady identyfikatorów: BIT(N) – ciąg bitów o stałej długości N. BIT(N) – ciąg bitów o stałej długości N. BIT VARYING(N) – ciąg znaków o zmiennej długości. BIT VARYING(N) – ciąg znaków o zmiennej długości. BLOB – mały wielki obiekt binarny. BLOB – mały wielki obiekt binarny. LONGBLOB – wielki wielki obiekt binarny. LONGBLOB – wielki wielki obiekt binarny. Całkowite typy danych – przechowujące tylko liczby całkowite; przykłady identyfikatorów: Całkowite typy danych – przechowujące tylko liczby całkowite; przykłady identyfikatorów: NUMBER, INTEGER. NUMBER, INTEGER. TINYINT, SMALLINT, INT, BIGINT. TINYINT, SMALLINT, INT, BIGINT.

30 Rodzaje typów danych (cd): Dziesiętne typy danych – przechowujące liczby z częściami ułamkowymi; przykłady identyfikatorów: Dziesiętne typy danych – przechowujące liczby z częściami ułamkowymi; przykłady identyfikatorów: DECIMAL, NUMERIC(p,s) – format stałopozycyjny. DECIMAL, NUMERIC(p,s) – format stałopozycyjny. FLOAT, DOUBLE – format zmiennopozycyjny (przybliżony). FLOAT, DOUBLE – format zmiennopozycyjny (przybliżony). Walutowe typy danych – przechowujące wartości walutowe; przykład identyfikatora: Walutowe typy danych – przechowujące wartości walutowe; przykład identyfikatora: MONEY. MONEY. Tworzenie tabeli

31 Rodzaje typów danych (cd): Typy danych daty i czasu – przechowujące datę, czas oraz ich kombinację; przykłady identyfikatorów: Typy danych daty i czasu – przechowujące datę, czas oraz ich kombinację; przykłady identyfikatorów: DATE – data w ustalonym formacie. DATE – data w ustalonym formacie. TIME – czas w ustalonym formacie. TIME – czas w ustalonym formacie. DATETIME – data i czas w ustalonym formacie. DATETIME – data i czas w ustalonym formacie. YEAR – rok w ustalonym formacie. YEAR – rok w ustalonym formacie. Porządkowe typy danych – przechowujące liczby rosnące sekwencyjnie (w niektórych SZBD typ ten stanowi oddzielny typ danych, w innych jest dostępny jako specjalna własność podstawowego typu danych). Porządkowe typy danych – przechowujące liczby rosnące sekwencyjnie (w niektórych SZBD typ ten stanowi oddzielny typ danych, w innych jest dostępny jako specjalna własność podstawowego typu danych). Tworzenie tabeli

32 CREATE TABLE nazwa_tabeli ( CREATE TABLE nazwa_tabeli ( nazwa_kolumny typ_danych [NULL/NOT NULL] [DEFAULT wartość_domyślna] [więzy_spójności_kolumny],... [więzy_spójności_tabeli],...); Tworzenie tabeli

33 Przykład: CREATE TABLE Pracownicy ( CREATE TABLE Pracownicy ( Id_pracownika Number(6) PRIMARY KEY, Nazwisko Varchar2(20) NOT NULL, Stanowisko Varchar2(9), Kierownik Number(6) REFERENCES Pracownicy, Data_zatrudnienia Date, Zarobki Number(8,2), Premia Number(8,2), Id_działu Number(3) REFERENCES Działy, CHECK (Premia < Zarobki)); Tworzenie tabeli

34 CREATE TABLE Działy ( CREATE TABLE Działy ( Id_działu Number(3) PRIMARY KEY, Nazwa_działu Varchar2(20) NOT NULL UNIQUE, Miejsce Varchar2(50)); CREATE TABLE Zaszeregowania ( CREATE TABLE Zaszeregowania ( Grupa Number(2) PRIMARY KEY, Dolne Number(8,2) NOT NULL, Górne Number(8,2) NOT NULL, CHECK (Dolne < Górne));

35 Tworzenie tabeli więzy spójności: PRIMARY KEY – klucz główny PRIMARY KEY – klucz główny REFERENCES nazwa_tabeli (nazwa_kolumny) – związek między kluczem obcym i kluczem głównym REFERENCES nazwa_tabeli (nazwa_kolumny) – związek między kluczem obcym i kluczem głównym FOREIGN KEY – klucz obcy FOREIGN KEY – klucz obcy NULL – dozwolona wartość nieokreślona NULL – dozwolona wartość nieokreślona NOT NULL – niedozwolona wartość nieokreślona NOT NULL – niedozwolona wartość nieokreślona UNIQUE – klucz jednoznaczny (bez powtórzeń) UNIQUE – klucz jednoznaczny (bez powtórzeń) DEFAULT – definiuje wartość domyślną DEFAULT – definiuje wartość domyślną CHECK – sprawdź warunek CHECK – sprawdź warunek

36 Operacje na tabelach Usuwanie tabeli DROP TABLE nazwa_tabeli; DROP TABLE nazwa_tabeli;Przykład: DROP TABLE Pracownicy; DROP TABLE Pracownicy; Zmiana schematu tabeli ALTER TABLE nazwa_tabeli ADD [COLUMN] def_kolumny; ALTER TABLE nazwa_tabeli ADD [COLUMN] def_kolumny;Przykład: ALTER TABLE Pracownicy ADD COLUMN Pesel Char(8); ALTER TABLE Pracownicy ADD COLUMN Pesel Char(8); ALTER TABLE Pracownicy ADD Pesel Char(11); ALTER TABLE Pracownicy ADD Pesel Char(11);

37 Operacje na tabelach Wyświetlanie dostępnych tabel SHOW TABLES; SHOW TABLES; Wyświetlanie struktury tabeli DESCRIBE nazwa_tabeli; DESCRIBE nazwa_tabeli;Przykład: DESCRIBE Pracownicy; DESCRIBE Pracownicy;

38 Operacje na tabelach Zakładanie indeksów CREATE [UNIQUE] INDEX nazwa_indeksu CREATE [UNIQUE] INDEX nazwa_indeksu ON nazwa_tabeli (kolumna [ASC/DESC],...); Przykład: CREATE UNIQUE INDEX Ind_prac_num CREATE UNIQUE INDEX Ind_prac_num ON Pracownicy (Pesel); CREATE INDEX Ind_prac_naz CREATE INDEX Ind_prac_naz ON Pracownicy (Nazwisko DESC); ASC – rosnąco, DESC – malejąco Usuwanie indeksów DROP INDEX nazwa_indeksu (ew. nazwa_tabeli.nazwa_indeksu); DROP INDEX nazwa_indeksu (ew. nazwa_tabeli.nazwa_indeksu);Przykład: DROP INDEX Ind_prac_num; DROP INDEX Ind_prac_num;

39 Operacje na tabelach Wstawianie danych INSERT INTO nazwa_tabeli INSERT INTO nazwa_tabeli VALUES (wartość,...); INSERT INTO nazwa_tabeli (nazwa_kolumny,...) INSERT INTO nazwa_tabeli (nazwa_kolumny,...) VALUES (wartość,...); Przykład: INSERT INTO Pracownicy VALUES (9901, Kowalski, INSERT INTO Pracownicy VALUES (9901, Kowalski, SALESMAN, 9345, , 300, 100, 12); SALESMAN, 9345, , 300, 100, 12); INSERT INTO Pracownicy (Id_pracownika, Nazwisko) INSERT INTO Pracownicy (Id_pracownika, Nazwisko) VALUES (9901, Kowalski);

40 Operacje na tabelach Modyfikowanie danych UPDATE nazwa_tabeli UPDATE nazwa_tabeli SET nazwa_kolumny=wyrażenie,... [WHERE warunek]; Przykład: UPDATE Pracownicy SET Zarobki = Zarobki*1,1 UPDATE Pracownicy SET Zarobki = Zarobki*1,1 WHERE Stanowisko = SALESMAN; Klauzula SET określa kolumny i zmieniane wartości. Klauzula SET określa kolumny i zmieniane wartości. Klauzula WHERE określa wiersze, w których ma dojść do zmiany. Klauzula WHERE określa wiersze, w których ma dojść do zmiany.

41 Operacje na tabelach Usuwanie danych DELETE FROM nazwa_tabeli DELETE FROM nazwa_tabeli [WHERE warunek]; (brak WHERE spowoduje usunięcie wszystkich wierszy) Przykład: DELETE FROM Pracownicy DELETE FROM Pracownicy WHERE Stanowisko IS NULL;

42 Operacje na tabelach Wprowadzanie danych do tabeli z pliku zewnętrznego (np. MySQL) LOAD DATA LOCAL INFILE nazwa_pliku LOAD DATA LOCAL INFILE nazwa_pliku INTO TABLE nazwa_tabeli; Przykład: LOAD DATA LOCAL INFILE Pracownicy.txt LOAD DATA LOCAL INFILE Pracownicy.txt INTO TABLE Pracownicy; UWAGA: Polecenie to nie jest częścią standardu języka SQL.

43 Operacje na tabelach Tworzenie tabeli z innej tabeli CREATE TABLE nazwa_tabeli SELECT... CREATE TABLE nazwa_tabeli SELECT...Przykład: CREATE TABLE Osoby SELECT Nazwisko CREATE TABLE Osoby SELECT Nazwisko FROM Pracownicy; Tworzenie tabeli tymczasowej (np. MySQL) CREATE TEMPORARY TABLE nazwa_tabeli [TYPE = HEAP] CREATE TEMPORARY TABLE nazwa_tabeli [TYPE = HEAP] SELECT … Przykład: CREATE TEMPORARY TABLE nazwa SELECT nazwa CREATE TEMPORARY TABLE nazwa SELECT nazwa FROM c;

44 Operacje na tabelach Każda zmiana zawartości w bazie danych wywołana przez operację podjęzyka danych może zostać odwołana lub zatwierdzona (różne SZBD różnie przyjmują wartość domyślą). Jeżeli wartością domyślną jest automatyczne zatwierdzanie wyników transakcji, to użytkownik może odwołać zmiany w następnym poleceniu. Gdy wartością domyślną jest nie zatwierdzanie wyników transakcji, to użytkownik w kolejnym poleceniu musi je zatwierdzić osobnym poleceniem, by nie stracić zmian. Zatwierdzanie zmian w bazie danych COMMIT [WORK]; COMMIT [WORK]; Rezygnacja ze zmian w bazie danych ROLLBACK [WORK]; ROLLBACK [WORK];

45 Indeksy (indeksowanie) Indeksy przyspieszają wyszukiwanie danych, dlatego powinno się indeksować kolumny często wykorzystywane do przeszukiwania danych. Indeksy są przechowywane w osobnym miejscu pamięci (często w pamięci głównej) i przyspieszają działanie systemu. Nie należy tworzyć indeksów do wszystkich kolumn: Budowanie i przetwarzanie indeksów pochłania czas i pamięć systemu komputerowego. Budowanie i przetwarzanie indeksów pochłania czas i pamięć systemu komputerowego. Wstawianie, modyfikowanie i usuwanie danych w kolumnach indeksowanych trwa dłużej o czas przebudowy indeksu. Wstawianie, modyfikowanie i usuwanie danych w kolumnach indeksowanych trwa dłużej o czas przebudowy indeksu.

46 Indeksy (indeksowanie) Co należy indeksować: Kolumnę (kolumny) klucza głównego (szczególnie, gdy jest ona dołączana do innych tabel jako klucz obcy). Kolumnę (kolumny) klucza głównego (szczególnie, gdy jest ona dołączana do innych tabel jako klucz obcy). Kolumnę często używaną zgodnie z porządkiem sortowania. Kolumnę często używaną zgodnie z porządkiem sortowania. Kolumny regularnie wykorzystywane przy złączeniach. Kolumny regularnie wykorzystywane przy złączeniach. Kolumny często przeszukiwane. Kolumny często przeszukiwane. Czego nie należy indeksować: Kolumny, do których zapytania rzadko się odwołują. Kolumny, do których zapytania rzadko się odwołują. Kolumny o małej liczbie różnych wartości (np. Tak/Nie). Kolumny o małej liczbie różnych wartości (np. Tak/Nie). Kolumny w małych tabelach (np. o kilku wierszach). Kolumny w małych tabelach (np. o kilku wierszach).

47 Indeksy (indeksowanie) Rodzaje indeksów: Indeksy jednokolumnowe – tworzone dla jednej kolumny. Indeksy jednokolumnowe – tworzone dla jednej kolumny. Indeksy zgrupowane – zawierające więcej, niż jedną kolumnę (stosowane, gdy lepiej jest przeszukiwać równocześnie dwie lub więcej kolumn ze względu na ich powiązanie logiczne). Indeksy zgrupowane – zawierające więcej, niż jedną kolumnę (stosowane, gdy lepiej jest przeszukiwać równocześnie dwie lub więcej kolumn ze względu na ich powiązanie logiczne). Indeksy jednoznaczne (UNIQUE) – nie powtarzające się (żadne dwa wiersze nie mają takiej samej wartości indeksu, nawet gdy wartości w kolumnie się powtarzają). Indeksy jednoznaczne (UNIQUE) – nie powtarzające się (żadne dwa wiersze nie mają takiej samej wartości indeksu, nawet gdy wartości w kolumnie się powtarzają). Indeksy zgrupowane (inne znaczenie, oferują niektóre SZBD) – porządek logiczny indeksów jest zgodny z porządkiem fizycznym wierszy (odszukanie danych z pomocą indeksu zgrupowanego jest zawsze szybsze niż dla indeksu niezgrupowanego). Indeksy zgrupowane (inne znaczenie, oferują niektóre SZBD) – porządek logiczny indeksów jest zgodny z porządkiem fizycznym wierszy (odszukanie danych z pomocą indeksu zgrupowanego jest zawsze szybsze niż dla indeksu niezgrupowanego). Indeksy niezgrupowane – indeksy, które nie są zgrupowane. Indeksy niezgrupowane – indeksy, które nie są zgrupowane.

48 Więzy spójności Różne SZBD udostępniają zazwyczaj następujące więzy spójności: PRIMARY KEY – oznacza kolumnę (dodawane przy definicji kolumny) lub grupę kolumn (deklaracja na poziomie tabeli PRIMARY KEY (kol1, kol2,...)) stanowiących klucz główny tabeli. Nie jest wówczas dopuszczalna wartość NULL i każda wartość musi być jednoznaczna. PRIMARY KEY – oznacza kolumnę (dodawane przy definicji kolumny) lub grupę kolumn (deklaracja na poziomie tabeli PRIMARY KEY (kol1, kol2,...)) stanowiących klucz główny tabeli. Nie jest wówczas dopuszczalna wartość NULL i każda wartość musi być jednoznaczna. UNIQUE – gwarantuje jednoznaczność każdej wartości w kolumnie dopuszczając jedną wartość NULL (dodawane przy definicji kolumny). UNIQUE – gwarantuje jednoznaczność każdej wartości w kolumnie dopuszczając jedną wartość NULL (dodawane przy definicji kolumny). DEFAULT – definiuje wartość nadawaną przez system automatyczne, gdy użytkownik nie poda jej jawnie, także NULL (dodawana przy definicji kolumny). DEFAULT – definiuje wartość nadawaną przez system automatyczne, gdy użytkownik nie poda jej jawnie, także NULL (dodawana przy definicji kolumny).

49 Więzy spójności Różne SZBD udostępniają zazwyczaj następujące więzy spójności: CHECK (reguły poprawności CHECK (warunek)) – określa jakie wartości mogą być wprowadzane do określonej kolumny (dodawane przy definicji kolumny) lub grupy kolumn (deklaracja na poziomie tabeli). CHECK (reguły poprawności CHECK (warunek)) – określa jakie wartości mogą być wprowadzane do określonej kolumny (dodawane przy definicji kolumny) lub grupy kolumn (deklaracja na poziomie tabeli). REFERENCES nazwa_tabeli (nazwa_kolumny) - wiąże klucze główne z obcymi, wprowadzona wartość do kolumny klucza obcego musi istnieć w kolumnie tabeli, do której jest odwołanie. REFERENCES nazwa_tabeli (nazwa_kolumny) - wiąże klucze główne z obcymi, wprowadzona wartość do kolumny klucza obcego musi istnieć w kolumnie tabeli, do której jest odwołanie. FOREIGN KEY – wskazuje klucz obcy bez powiązania nadawanego przez opcję REFERENCES (deklaracja na poziomie definicji kolumny). FOREIGN KEY – wskazuje klucz obcy bez powiązania nadawanego przez opcję REFERENCES (deklaracja na poziomie definicji kolumny).

50 Wybieranie danych z bazy danych Do wybierania danych z bazy danych służy instrukcja SELECT. Pozwala ona wybierać dane (kolumny i wiersze) z jednej lub wielu tabel równocześnie (po ich złączeniu), umożliwia porządkowanie wierszy w tabeli wynikowej, grupowanie wierszy oraz stosowanie podzapytań w zapytaniach (zagnieżdżone instrukcje SELECT).

51 SQL – zapytania proste Wybór określonych kolumn i wierszy z tabeli (tabel) SELECT [ALL/DISTINCT] nazwa_kolumny,... SELECT [ALL/DISTINCT] nazwa_kolumny,... FROM nazwa_tabeli (nazwy_tabel) [WHERE warunki wyszukiwania]; Przykłady: SELECT Nazwisko, Zarobki, Stanowisko SELECT Nazwisko, Zarobki, Stanowisko FROM Pracownicy; (wybiera kolumny Nazwisko, Zarobki i Stanowisko z Pracownicy)

52 SQL – zapytania proste Przykłady cd.: SELECT * SELECT * FROM Pracownicy; (wybiera wszystkie kolumny z tabeli Pracownicy – klauzula *) SELECT Nazwisko, Zarobki, Stanowisko SELECT Nazwisko, Zarobki, Stanowisko FROM Pracownicy WHERE Id_działu = 10; (wybiera określone kolumny z tabeli Pracownicy i tylko te wiersze, które spełniają podanych warunek) SELECT DISTINCT Kierownik SELECT DISTINCT Kierownik FROM Pracownicy; (wybiera kolumnę Kierownik z tabeli Pracownicy odrzucając powtarzające się wiersze – klauzula DISTINCT)

53 SQL – zapytania proste Przykłady cd.: SELECT ALL Kierownik SELECT ALL Kierownik FROM Pracownicy; (wybiera kolumnę Kierownik z tabeli Pracownicy nie odrzucając powtarzających się wierszy – klauzula ALL, zazwyczaj domyślna) SELECT Pracownicy.Nazwisko, Adresy.Miasto SELECT Pracownicy.Nazwisko, Adresy.Miasto FROM Pracownicy, Adresy WHERE Pracownicy.Id_Pracownika = Adresy.Id_Pracownika; (wybiera dwie kolumny z połączonych dwóch tabel)

54 SQL – zapytania proste W przypadku wyboru kolumn z różnych tabel (podanych w klauzuli FROM) istnieje niekiedy potrzeba kwalifikowania nazw (w zasadzie tylko, gdy nazwy kolumn w tabelach powtarzają się, czyli w przykładzie powyższym można z kwalifikacji zrezygnować) w następujący sposób: Nazwa_bazy_danych.Nazwa_tabeli.Nazwa_kolumnyNazwa_bazy_danych.Nazwa_perspektywy.Nazwa_kolumny Warunek złączenia tabel podawany jest w klauzuli WHERE.

55 SQL – zapytania proste Przetwarzanie wartości w kolumnach i stosowanie aliasów (synonimów, nazw zastępczych) SELECT [ALL/DISTINCT] wyrażenie [[AS] alias],... SELECT [ALL/DISTINCT] wyrażenie [[AS] alias],... FROM nazwa_tabeli (nazwa_tabel) [WHERE warunek_wyszukiwania] [ORDER BY wyrażenie [ASC/DESC/,...]; Przykłady: SELECT p.Nazwisko, a.Miasto SELECT p.Nazwisko, a.Miasto FROM Pracownicy p, Adresy a WHERE p.Id_Pracownika = a.Id_Pracownika; (nadanie nazwom tabel aliasów dla wygody przy pisaniu) SELECT Id_Pracownika [AS] Numer, Nazwisko SELECT Id_Pracownika [AS] Numer, Nazwisko FROM Pracownicy (identyfikator pracownika będzie posiadał nowy nagłówek)

56 SQL – zapytania proste Przetwarzanie wartości w kolumnach i stosowanie aliasów Przykłady ciąg dalszy: SELECT Id_pracownika, Nazwisko, SELECT Id_pracownika, Nazwisko,Trunc(Months_Between(Sysdate, Data_zatrudnienia)/12) AS Zatrudnienie FROM Pracownicy ORDER BY Zatrudnienie DESC; (oprócz kolumn z identyfikatorem i nazwiskiem wyprowadzona zostanie kolumna z czasem pracy w pełnych latach o nagłówku Zatrudnienie; całość będzie uporządkowana według malejących wartości w kolumnie Zatrudnienie – klauzula ORDER BY) SELECT Pracownik, Id_Pracownika [AS] Numer, Nazwisko SELECT Pracownik, Id_Pracownika [AS] Numer, Nazwisko FROM Pracownicy (w przedstawiony sposób można dodawać napisy w zapytaniach, co niekiedy ułatwia zrozumienie; każdy wiersz tabeli wynikowej zostanie poprzedzony od lewej napisem Pracownik )

57 SQL – zapytania proste Przetwarzanie wartości w kolumnach i stosowanie aliasów Przykłady ciąg dalszy: SELECT Nazwisko, Czas_Pracy * Stawka AS Pensja SELECT Nazwisko, Czas_Pracy * Stawka AS Pensja FROM Pracownicy (w tabeli wynikowej zostanie wyprowadzony wynik mnożenia dwóch kolumn pod nazwą Pensja – nazwy kolumn muszą być bez spacji) SELECT Nazwisko, Czas_Pracy * Stawka AS Pensja SELECT Nazwisko, Czas_Pracy * Stawka AS Pensja FROM Pracownicy (w tabeli wynikowej zostanie wyprowadzony wynik mnożenia dwóch kolumn pod nazwą Pensja – nazwy kolumn muszą być bez spacji)

58 SQL – zapytania proste Operatory arytmetyczne możliwe do stosowania w wyrażeniach: * mnożenie. * mnożenie. / dzielenie. / dzielenie. + dodawanie. + dodawanie. - odejmowanie. - odejmowanie. %dzielenie modulo (dostępne w niektórych SZBD). %dzielenie modulo (dostępne w niektórych SZBD). UWAGA: Wynik operacji arytmetycznej, gdy jeden z argumentów ma wartość NULL jest także równy NULL. Priorytet operatorów: mnożenie/dzielenie, dodawanie/odejmowanie.

59 SQL – zapytania proste Operatory do stosowania w klauzuli WHERE: Operatory porównania – relacji (=,, =, !=, <>). Operatory porównania – relacji (=,, =, !=, <>). Operatory logiczne (AND, OR, NOT) – najniższy priorytet. Operatory logiczne (AND, OR, NOT) – najniższy priorytet. Operatory przedziałów (BETWEEN, NOT BETWEEN). Operatory przedziałów (BETWEEN, NOT BETWEEN). Operatory listy (IN, NOT IN). Operatory listy (IN, NOT IN). Operatory wartości nieznanej (IS NULL, IS NOT NULL). Operatory wartości nieznanej (IS NULL, IS NOT NULL). Operatory zgodności znakowej (LIKE, NOT LIKE, ESCAPE). Operatory zgodności znakowej (LIKE, NOT LIKE, ESCAPE). (nawiasy okrągłe pozwalają zmienić kolejność interpretacji) (nawiasy okrągłe pozwalają zmienić kolejność interpretacji)

60 SQL – zapytania proste przykłady użycia operatorów: WHERE Stawka > 20; WHERE Stawka > 20; WHERE Stawka > 15 AND Stawka 15 AND Stawka < 20; WHERE Stawka BETWEEN 15 AND 20; WHERE Stawka BETWEEN 15 AND 20; WHERE Miasto IN (Krosno, Rzeszów); WHERE Miasto IN (Krosno, Rzeszów); WHERE Stanowisko IS NOT NULL; WHERE Stanowisko IS NOT NULL; WHERE Nazwisko LIKE Ko% OR Kod_Działu LIKE A_; WHERE Nazwisko LIKE Ko% OR Kod_Działu LIKE A_; WHERE Nazwa WHERE Nazwa (% dowolny ciąg znaków lub jego brak, _ dowolny jeden znak) (% dowolny ciąg znaków lub jego brak, _ dowolny jeden znak)

61 SQL – inne metody wyboru Wyszukiwanie z sortowaniem SELECT lista_wyboru,... SELECT lista_wyboru,... FROM nazwa_tabeli (nazwa_tabel) [WHERE warunek_wyszukiwania] [ORDER BY {wyrażenie [ASC/DESC] / pozycja [ASC/DESC],...}]; Przykłady: SELECT Nazwisko, Imię SELECT Nazwisko, Imię FROM Pracownicy ORDER BY Nazwisko [ASC], Imię [ASC]; (sortowanie zagnieżdżone, najpierw według nazwiska, potem imienia; domyślnie sortowanie następuje według kolejności rosnącej, dlatego nie ma potrzeby umieszczać słowa ASC)

62 przykłady SELECT Nazwisko, Imię SELECT Nazwisko, Imię FROM Pracownicy ORDER BY Nazwisko, Imię; SELECT Nazwisko, Imię, Kod_działu SELECT Nazwisko, Imię, Kod_działu FROM Pracownicy ORDER BY Kod_działu DESC, Nazwisko; (sortowanie zagnieżdżone, zewnętrznie malejące według kodu działu i wewnętrznie rosnące według nazwiska) SELECT Nazwisko, Imię, 4*Czas_pracy*Stawka Pensja SELECT Nazwisko, Imię, 4*Czas_pracy*Stawka Pensja FROM Pracownicy ORDER BY 3 DESC, Nazwisko; SQL – inne metody wyboru

63 Przykłady: SELECT Nazwisko, Imię, 4*Czas_pracy*Stawka [AS] Pensja SELECT Nazwisko, Imię, 4*Czas_pracy*Stawka [AS] Pensja FROM Pracownicy ORDER BY Pensja DESC; (sortowanie według pozycji na liście wyboru, ponieważ nie można umieszczać w klauzuli ODER BY wyrażeń) Uwaga: Wartości NULL w jednych SZBD są traktowane jako mniejsze od wszystkich innych, gdzie indziej jest odwrotnie. Eliminacja powtarzających się wierszy SELECT [DISTINCT/ALL] lista_wyboru SELECT [DISTINCT/ALL] lista_wyboru SQL – inne metody wyboru

64 Przykłady: SELECT [ALL] Kod_działu, Imię SELECT [ALL] Kod_działu, Imię FROM Pracownicy; (opcja ALL jest wartością domyślną) SELECT DISTINCT Kod_działu, Imię SELECT DISTINCT Kod_działu, Imię FROM Pracownicy; (opcje dotyczą całego wiersza, a nie wartości w poszczególnych kolumnach kody działów będą się powtarzać dla różnych imion) SELECT [DISTINCT] Imię SELECT [DISTINCT] Imię FROM Pracownicy ORDER BY Nazwisko; (zazwyczaj wyświetlane są te wiersze, gdzie nie powtarza się kombinacja parametrów z klauzul SELECT i ORDER BY, czyli tutaj w tabeli wynikowej imiona będą się mogły powtarzać) SQL – inne metody wyboru

65 Uwaga: Opcja DISTINCT eliminuje powtórzenia w tabeli wynikowej. Dwie wartości NULL w tej samej kolumnie są identyczne. Przykłady: SELECT [ALL] Kod_działu, Imię SELECT [ALL] Kod_działu, Imię FROM Pracownicy; (opcja ALL jest wartością domyślną) SELECT DISTINCT Kod_działu, Imię SELECT DISTINCT Kod_działu, Imię FROM Pracownicy; (opcje dotyczą całego wiersza, a nie wartości w poszczególnych kolumnach – kody działów będą się powtarzać dla różnych imion)

66 SQL – inne metody wyboru Przykłady: SELECT [DISTINCT] Imię SELECT [DISTINCT] Imię FROM Pracownicy ORDER BY Nazwisko; (zazwyczaj wyświetlane są te wiersze, gdzie nie powtarza się kombinacja parametrów z klauzul SELECT i ORDER BY, czyli tutaj w tabeli wynikowej imiona będą się mogły powtarzać) Uwaga: Opcja DISTINCT eliminuje powtórzenia w tabeli wynikowej. Dwie wartości NULL w tej samej kolumnie są identyczne.

67 SQL – inne metody wyboru Funkcje agregujące (dotyczące zbioru wierszy) Funkcja_agregująca ([DISTINCT] wyrażenie) Funkcja_agregująca ([DISTINCT] wyrażenie) Dostępne funkcje agregujące: SUM([DISTINCT] wyrażenie) – suma (różniących się) wartości w wyrażeniu numerycznym. SUM([DISTINCT] wyrażenie) – suma (różniących się) wartości w wyrażeniu numerycznym. AVG([DISTINCT] wyrażenie) – wartość średnia (różniących się) wartości w wyrażeniu numerycznym. AVG([DISTINCT] wyrażenie) – wartość średnia (różniących się) wartości w wyrażeniu numerycznym. COUNT([DISTINCT] wyrażenie) – liczba (różniących się) wartości (różnych od NULL) w wyrażeniu. COUNT([DISTINCT] wyrażenie) – liczba (różniących się) wartości (różnych od NULL) w wyrażeniu.

68 SQL – inne metody wyboru Dostępne funkcje agregujące: COUNT(*) – liczba wybranych wierszy. COUNT(*) – liczba wybranych wierszy. MAX(wyrażenie) – największa wartość wyrażenia. MAX(wyrażenie) – największa wartość wyrażenia. MIN(wyrażenie) – najmniejsza wartość wyrażenia. MIN(wyrażenie) – najmniejsza wartość wyrażenia. Przykłady (funkcje agregujące dla całości tabel – skalarne zapytania agregującei): SELECT SUM(Pensja) AS Total SELECT SUM(Pensja) AS Total FROM Pracownicy; (znajduje sumę pensji pracowników i ją podaje pod nazwą Total)

69 SQL – inne metody wyboru Przykłady: SELECT MIN(Pensja) Min, AVG(Pensja) Śred, SELECT MIN(Pensja) Min, AVG(Pensja) Śred, MAX(Pensja) Max FROM Pracownicy WHERE Kod_działu = AD; (znajduje minimalną, średnią i maksymalną pensję pracowników administracji wypisując je pod Min, Śred i Max) SELECT COUNT(Stanowisko), COUNT(*) SELECT COUNT(Stanowisko), COUNT(*) FROM Pracownicy; (znajduje liczbę wszystkich pracowników mających stanowisko NOT NULL i liczbę wszystkich wierszy, czyli wszystkich pracowników) SELECT COUNT(*) SELECT COUNT(*) FROM Pracownicy WHERE Kod_działu = AD; (znajduje liczbę pracowników administracji)

70 SQL – inne metody wyboru Przykłady: SELECT COUNT(DISTINCT Nazwisko) SELECT COUNT(DISTINCT Nazwisko) FROM Pracownicy; (znajduje liczbę osób o różnych nazwiskach NOT NULL; niektóre SZBD wymagają, by po opcji DISTINCT była tylko nazwa kolumny) Uwaga: Funkcje agregujące ignorują wszystkie wartości NULL w kolumnie, na której wykonują operację (z wyjątkiem COUNT(*)). Jeżeli żaden wiersz nie spełnia warunku zapytania funkcja COUNT zwraca zero, pozostałe wartość NULL.

71 SQL – grupowanie danych Grupowanie danych SELECT lista_wyboru SELECT lista_wyboru FROM lista_tabel [WHERE warunki] [GROUP BY lista_grupowania] [ORDER BY lista_porządkowania]; Przykłady: SELECT Kod_działu, COUNT(Nazwisko) SELECT Kod_działu, COUNT(Nazwisko) FROM Pracownicy GROUP BY Kod_działu; (grupowanie pracowników według działów – w tabeli wynikowej w każdym wierszu jest kod działu i liczba pracowników; zwykle dane można grupować według parametrów wybranych przez SELECT)

72 SQL – grupowanie danych Przykłady: SELECT Kod_działu, Stanowisko, COUNT(Nazwisko) SELECT Kod_działu, Stanowisko, COUNT(Nazwisko) FROM Pracownicy GROUP BY Kod_działu, Stanowisko; (grupowanie wewnątrz grup, tzw. zagnieżdżone – w tabeli wynikowej w każdym wierszu jest kod działu, stanowisko i liczba pracowników) Uwaga: Każdy element listy SELECT musi dawać dla każdego zbioru wierszy powstałego po grupowaniu tylko jedną wartość. SELECT Stanowisko, COUNT(*) SELECT Stanowisko, COUNT(*) FROM Pracownicy GROUP BY Stanowisko; (jeżeli parametr grupujący posiada wartość NULL, to podczas grupowania jest tworzona osobna grupa NULL, której odpowiadać będzie liczba takich wartości lub zero w przykładzie poniżej)

73 SQL – grupowanie danych Przykłady: SELECT Stanowisko, COUNT(Stanowisko) SELECT Stanowisko, COUNT(Stanowisko) FROM Pracownicy GROUP BY Stanowisko; SELECT Kod_działu SELECT Kod_działu FROM Pracownicy GROUP BY Kod_dzialu; (grupowanie bez agregowania – zostanie wyświetlona lista działów bez powtórzeń, co odpowiadałoby wynikowi polecenia poniżej) SELECT DISTINCT Kod_działu SELECT DISTINCT Kod_działu FROM Pracownicy;

74 SQL – grupowanie danych Przykłady: SELECT Kod_działu, COUNT(*) AS Liczba_Pracowników, MIN(Pensja) AS Minimalna_Pensja, AVG(Pensja) AS Średnia_Pensja, MAX(Pensja) AS Maksymalna_Pensja SELECT Kod_działu, COUNT(*) AS Liczba_Pracowników, MIN(Pensja) AS Minimalna_Pensja, AVG(Pensja) AS Średnia_Pensja, MAX(Pensja) AS Maksymalna_Pensja FROM Pracownicy GROUP BY Kod_działu; (w tabeli wynikowej kolumny z wartościami agregującymi będą miały nazwy będące aliasami – poprzednio były bez nazw) SELECT Kod_działu, COUNT(Nazwisko) SELECT Kod_działu, COUNT(Nazwisko) FROM Pracownicy WHERE Plec = K GROUP BY Kod_działu; (na grupy dzielone są tylko te wiersze, które spełniają warunek podany w klauzuli WHERE, czyli dotyczące kobiet)

75 SQL – grupowanie danych Przykłady: SELECT Kod_działu, COUNT(Nazwisko) SELECT Kod_działu, COUNT(Nazwisko) FROM Pracownicy WHERE Plec = K GROUP BY Kod_działu ORDER BY 2; (wyniki grupowania są dodatkowo porządkowane według rosnącej liczby kobiet pracujących w poszczególnych działach) Grupowanie danych z klauzulą HAVING SELECT lista_wyboru SELECT lista_wyboru FROM lista_tabel [WHERE warunki] [GROUP BY lista_grupowania] [HAVING warunek] [ORDER BY lista_porządkowania];

76 SQL – grupowanie danych Przykłady: SELECT Kod_działu, COUNT(*) SELECT Kod_działu, COUNT(*) FROM Pracownicy GROUP BY Kod_działu HAVING COUNT(*) >10; (zostaną wyświetlone tylko te działy, które zatrudniają więcej niż 10 pracowników; klauzula HAVING pozwala na określenie warunków dotyczących zbiorów wierszy wydzielonych w czasie grupowania) Uwaga: klauzula WHERE nie pozwala używać funkcji agregujących, ponadto eliminuje wiersze przed grupowaniem. Zazwyczaj w klauzuli HAVING mogą wystąpić elementy z listy wyboru. SELECT Miasto, COUNT(*) SELECT Miasto, COUNT(*) FROM Pracownicy GROUP BY Miasto HAVING Miasto LIKE W%; (inny przykład warunku w klauzuli HAVING)

77 SQL – grupowanie danych Przykłady: SELECT Kod_działu, COUNT(*) AS Liczba_Pracowników, MIN(Pensja) AS Minimalna_Pensja, AVG(Pensja) AS Średnia_Pensja, MAX(Pensja) AS Maksymalna_Pensja SELECT Kod_działu, COUNT(*) AS Liczba_Pracowników, MIN(Pensja) AS Minimalna_Pensja, AVG(Pensja) AS Średnia_Pensja, MAX(Pensja) AS Maksymalna_Pensja FROM Pracownicy WHERE Plec = K GROUP BY Kod_działu HAVING COUNT(*) > 10 AND AVG(Pensja) > 1000 AND MAX(Pensja) 10 AND AVG(Pensja) > 1000 AND MAX(Pensja) < 3000 ORDER BY Kod_działu; (w klauzuli HAVING można łączyć warunki operatorami logicznymi: AND, OR lub NOT; przykład z porządkowaniem tabeli wynikowej)

78 SQL – złączanie tabel Złączanie tabel jest jedną z podstawowych operacji w relacyjnej bazie danych, ponieważ w trakcie przygotowywania schematu bazy rozprasza się dane pomiędzy wiele tabel (np. normalizacja). Rodzaje złączeń tabel: Złączenie bezpośrednie (z użyciem operatorów złączania, np. CROSS JOIN, NATURAL, INNER, OUTER). Złączenie bezpośrednie (z użyciem operatorów złączania, np. CROSS JOIN, NATURAL, INNER, OUTER). Złączenie niejawne (warunek złączenie określony w instrukcji SELECT w klauzuli WHERE). Złączenie niejawne (warunek złączenie określony w instrukcji SELECT w klauzuli WHERE). Złączanie wyrażane w postaci niejawnej SELECT lista_wyboru SELECT lista_wyboru FROM tabela_1, tabela_2,... WHERE [tabela_1.]kolumna operator_złączenia [tabela_2.]kolumna; (kolumny w klauzuli WHERE muszą być złączeniowo zgodne – np. dane tego samego typu o podobnych wartościach; kwalifikować nazwą tabeli należy kolumny złączeniowe o takich samych nazwach;)

79 SQL – złączanie tabel Przykłady: SELECT Nazwisko, Imię, Miasto SELECT Nazwisko, Imię, Miasto FROM Pracownicy, Adresy WHERE Pracownicy.Id_Pracownika = Adresy.Id_Pracownika; (złączanie na podstawie identycznych wartości identyfikatora – złączenie równościowe lub równozłączenia) SELECT Nazwisko, Imię, Miasto SELECT Nazwisko, Imię, Miasto FROM Pracownicy, Adresy WHERE Pracownicy.Id_Pracownika = Adresy.Id_Pracownika AND Miasto = Warszawa; (dodatkowo wybór pracowników tylko z Warszawy) Uwaga: W praktyce złączanie polega na utworzeniu iloczynu kartezjańskiego (zbiór wszystkich możliwych kombinacji wierszy z obu tabel), a następnie wyborze kolumn (SELECT) i eliminacji wierszy (WHERE).

80 SQL – złączanie tabel Przykłady: SELECT * SELECT * FROM tabela1, tabela2; (zapytanie dające w wyniku iloczyn kartezjański dwóch tabel, czyli wszystkie możliwe kombinacje wierszy z obu tabel) Najlepsze złączenia otrzymuje się wykorzystując układ wartości klucz główny – klucz obcy. Wartości NULL w kolumnach łączących są pomijane. Źle sformułowany warunek złączenia daje w wyniku mylące informacje (niewłaściwie połączone wiersze obu tabel). SELECT * SELECT * FROM Pracownicy, Adresy WHERE Pracownicy.Id_Pracownika = Adresy.Id_Pracownika; (w połączonej tabeli znajdą się wszystkie kolumny obu tabel w kolejności podanej w klauzuli FROM) SELECT Nazwisko, Imię, Miasto SELECT Nazwisko, Imię, Miasto FROM Pracownicy p, Adresy a WHERE p.Id_Pracownika = a.Id_Pracownika; (stosowanie aliasów ułatwia pisanie i zwiększa przejrzystość)

81 SQL – złączanie tabel Przykłady: SELECT p.Id_Pracownika, a.Id_Pracownika, Nazwisko, Imię, Miasto SELECT p.Id_Pracownika, a.Id_Pracownika, Nazwisko, Imię, Miasto FROM Pracownicy p, Adresy a WHERE p.Id_Pracownika = a.Id_Pracownika; (równozłączenie wyświetlające kolumny łączące obu tabel) SELECT p.Id_Pracownika, Nazwisko, Imię, Miasto SELECT p.Id_Pracownika, Nazwisko, Imię, Miasto FROM Pracownicy p, Adresy a WHERE p.Id_Pracownika = a.Id_Pracownika; (złączeniem naturalnym bez powtarzania kolumn łączących)

82 SQL – złączanie tabel Przykłady: SELECT DISTINCT p1.Nazwisko, p1.Imię SELECT DISTINCT p1.Nazwisko, p1.Imię FROM Pracownicy p1, Pracownicy P2 WHERE p1.Kod_działu = AD AND p1.Stanowisko = p2.Stanowisko AND p1.Id_Pracownika <> p2.Id_Pracownika; (samozłączenie – złączenie tabeli z samą sobą; wyświetla nazwiska i imiona osób, które w dziale Administracji zajmują takie same stanowiska; przykład złączenia nierównościowego, opartego na różności parametrów) SELECT... SELECT... WHERE... AND NOT p1.Id_Pracownika = p2.Id_Pracownika; (równoważne zapisanie warunku z poprzedniego przykładu)

83 SQL – złączanie tabel Przykłady: SELECT p.Nazwisko, p.Imię, a.Miasto, k.Nazwisko SELECT p.Nazwisko, p.Imię, a.Miasto, k.Nazwisko FROM Pracownicy p, Adresy a, Kierownicy_działów k WHERE p.Id_Pracownika = a.Id_Pracownika AND p.Kod_działu = k.Kod_działu AND p.Id_Pracownika <> k.Id_Pracownika; (złączenie trzech tabel – wyświetlenie nazwiska, imienia, miejsca zamieszkania i nazwiska kierownika poszczególnych pracowników, pod warunkiem, że pracownik nie jest kierownikiem działu) SELECT Id_Pracownika, Nazwisko, Nazwa_działu SELECT Id_Pracownika, Nazwisko, Nazwa_działu FROM Pracownicy, Działy WHERE Pracownicy.Kod_działu = Działy.Kod_działu; (połączenie tabel w celu uzyskania nazwy działu)

84 SQL – złączanie tabel Przykłady: SELECT Prac.Nazwisko, Kier.Nazwisko AS Kierownik SELECT Prac.Nazwisko, Kier.Nazwisko AS Kierownik FROM Pracownicy Prac, Kierownicy Kier WHERE Prac.Kierownik = Kier.Id_Pracownika; (połączenie tabel w celu uzyskania nazwiska kierownika) SELECT Id_Pracownika, Nazwisko, Grupa SELECT Id_Pracownika, Nazwisko, Grupa FROM Pracownicy, Zaszeregowania WHERE Zarobki BETWEEN Dolne AND Górne; (przy łączeniu można użyć dowolny operator porównania)

85 SQL – złączanie tabel Przykłady: SELECT Działy.Kod_działu, Nazwa_działu, COUNT(*) AS Liczba, SUM(Zarobki) AS Suma SELECT Działy.Kod_działu, Nazwa_działu, COUNT(*) AS Liczba, SUM(Zarobki) AS Suma FROM Działy, Pracownicy WHERE Działy.Kod_działu = Pracownicy.Kod_działu GROUP BY Działy.Kod_działu; (grupowanie wierszy w tabeli będącej wynikiem złączenia) SELECT Działy.Kod_działu, Nazwa_działu, COUNT(*) AS Liczba, SUM(Zarobki) AS Suma SELECT Działy.Kod_działu, Nazwa_działu, COUNT(*) AS Liczba, SUM(Zarobki) AS Suma FROM Działy, Pracownicy WHERE Działy.Kod_działu = Pracownicy.Kod_działu GROUP BY Działy.Kod_działu HAVING COUNT(*) >= 5; (grupowanie wierszy w połączonej tabeli z klauzulą HAVING)

86 SQL – złączanie tabel Złączanie zewnętrzne (ukazanie tła złączenia) Złączenie zewnętrzne polega na wyświetleniu wszystkich wierszy zakwalifikowanych przez warunek złączenia (złączenie wewnętrzne) plus wierszy jednej i/lub drugiej tabeli, które nie zostały zakwalifikowane. Operatory złączenia zewnętrznego (zależy od SZBD): *= włącz wszystkie wiersze z pierwszej (lewej) tabeli. *= włącz wszystkie wiersze z pierwszej (lewej) tabeli. =* włącz wszystkie wiersze z drugiej (prawej) tabeli. =* włącz wszystkie wiersze z drugiej (prawej) tabeli.

87 SQL – złączanie tabel Przykłady: SELECT Nazwisko, Imię, Miasto FROM Pracownicy, Adresy WHERE Pracownicy.Id_Pracownika *= Adresy.Id_Pracownika; (zostaną wyświetleni pracownicy bez wprowadzonego adresu – na pozycji Miasto w tabeli wynikowej pojawi się wówczas NULL) SELECT Nazwisko, Imię, Stanowisko SELECT Nazwisko, Imię, Stanowisko FROM Pracownicy p, Stanowisko s WHERE p.Id_Pracownika =* s.Id_Pracownika; (zostaną również wyświetlone nie obsadzone stanowiska – NULL na pozycji Nazwisko i Imię w tabeli wynikowej)

88 SQL – operacje na wynikach zapytań Możliwe operacje na zbiorach z wynikami zapytań: UNION, UNION ALL – sumowanie zbiorów UNION, UNION ALL – sumowanie zbiorów INTERSECT – przecięcie (część wspólna) zbiorów INTERSECT – przecięcie (część wspólna) zbiorów EXCEPT, MINUS – różnica zbiorów EXCEPT, MINUS – różnica zbiorów Składnia operacji na wynikach zapytań: Instrukcja_SELECT operator Instrukcja_SELECT; Instrukcja_SELECT operator Instrukcja_SELECT; Łączenie wyników zapytań (operator UNION) Operator UNION nie służy do łączenia tabel, zapewnia tylko połączenie danych pochodzących z wielu zapytań w jeden wynik.

89 SQL – operacje na wynikach zapytań Instrukcja_SELECT UNION Instrukcja_SELECT Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = AD UNION SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = KW; (tabela wynikowa będzie sumą obu tabel)

90 SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = AD UNION SELECT Imię, Nazwisko FROM Pracownicy WHERE Kod_działu = KW; (nagłówek tabeli wynikowej określa pierwsze zapytanie; liczba wyprowadzanych elementów i ich typy muszą być zgodne)

91 SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = AD UNION SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = KW ORDER BY Nazwisko, Imię; (cała tabela wynikowa może być porządkowana przy pomocy klauzuli ORDER BY, która musi się znaleźć na swoim normalnym miejscu tylko w ostatnim zapytaniu)

92 SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = AD UNION ALL SELECT Nazwisko, Imię FROM Filia WHERE Kod_działu = AD; (operator UNION domyślnie oznacza eliminację powtarzających się wierszy; opcja ALL pozostawia powtórzenia wierszy)

93 SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko, Imię, Pensja, Pensja*1,2 Nowa_Pensja FROM Pracownicy WHERE Kod_działu = AD UNION SELECT Nazwisko, Imię, Pensja, Pensja*1,1 FROM Pracownicy WHERE Kod_działu <> AD; (zapytań tych nie dałoby się zapisać inaczej w jednym zapytaniu)

94 SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko II * FROM Pracownicy WHERE Kod_działu = AD UNION SELECT Nazwisko FROM Pracownicy WHERE Kod_działu <> AD ORDER BY 1; (gwiazdka pozwala na rozpoznanie pracowników działu AD) SELECT Kod_działu FROM Działy EXCEPT SELECT Kod_działu FROM Pracownicy; (wyświetli działy nie zatrudniające żadnych pracowników)

95 SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = AD INTERSECT SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = KW; (wyświetli pracowników zatrudnionych równocześnie w obu działach) Uwaga: Niektóre SZBD wymagają umieszczenia każdej składowej instrukcji SELECT w osobnym nawiasie okrągłym.

96 SQL – podzapytania Podzapytania (zapytania zagnieżdżone) to zapytania w zapytaniach. Instrukcja SELECT może być zagnieżdżona w: Klauzulach WHERE, HAVING lub SELECT innej instrukcji SELECT. Klauzulach WHERE, HAVING lub SELECT innej instrukcji SELECT. W instrukcjach INSERT, UPDATE lub DELETE. W instrukcjach INSERT, UPDATE lub DELETE. W innym podzapytaniu. W innym podzapytaniu. Podzapytania mogą być: Skorelowane (podzapytanie wewnętrzne pobiera wartości z zapytania zewnętrznego, wykonuje swoje operacje i zwraca wyniki do zapytania zewnętrznego). Skorelowane (podzapytanie wewnętrzne pobiera wartości z zapytania zewnętrznego, wykonuje swoje operacje i zwraca wyniki do zapytania zewnętrznego). Nieskorelowane (podzapytanie wewnętrzne wykonuje niezależnie swoje operacje i zwraca wynik do zapytania zewnętrznego). Nieskorelowane (podzapytanie wewnętrzne wykonuje niezależnie swoje operacje i zwraca wynik do zapytania zewnętrznego).

97 SQL – podzapytania Podzapytania i złączenia: W większości przypadków zapytanie może być sformułowane w sposób równorzędny jako podzapytanie i jako złączenie. W większości przypadków zapytanie może być sformułowane w sposób równorzędny jako podzapytanie i jako złączenie. Wybór metody zależy zazwyczaj od gustu użytkownika. Wybór metody zależy zazwyczaj od gustu użytkownika. Niekiedy złączenia dają więcej możliwości (mogą dostarczyć wyniki pochodzące z wielu tabel, podczas gdy podzapytanie daje dostęp tylko do tabeli zewnętrznej). Niekiedy złączenia dają więcej możliwości (mogą dostarczyć wyniki pochodzące z wielu tabel, podczas gdy podzapytanie daje dostęp tylko do tabeli zewnętrznej). Podzapytania są lepsze, gdy należy porównywać wartości. Podzapytania są lepsze, gdy należy porównywać wartości. W przypadku samozłączenia obie metody mogą być stosowane alternatywnie. W przypadku samozłączenia obie metody mogą być stosowane alternatywnie.

98 SQL – podzapytania Typy podzapytań: Podzapytania zwracające zero lub więcej pozycji (wprowadzone za pomocą IN (NOT IN) lub operatora porównania zmodyfikowanego przez ANY bądź ALL). Podzapytania zwracające zero lub więcej pozycji (wprowadzone za pomocą IN (NOT IN) lub operatora porównania zmodyfikowanego przez ANY bądź ALL). Podzapytania zwracające pojedynczą wartość (wprowadzone za pomocą niezmodyfikowanego operatora porównania). Podzapytania zwracające pojedynczą wartość (wprowadzone za pomocą niezmodyfikowanego operatora porównania). Podzapytania będące testem na istnienie (wprowadzone za pomocą EXISTS (NOT EXISTS)). Podzapytania będące testem na istnienie (wprowadzone za pomocą EXISTS (NOT EXISTS)).

99 SQL – podzapytania Przykład podzapytania zagnieżdżonego: SELECT [ALL/DISTINCT] lista_wyboru SELECT [ALL/DISTINCT] lista_wyboru FROM lista_tabel WHERE {wyrażenie {[NOT] IN/operator_porównania [ANY/ALL]} /[NOT] EXISTS} (SELECT lista_wyboru_podzapytania FROM lista_tabel WHERE warunki) [GROUP BY lista_grupowania [HAVING warunki]] [ORDER BY lista_porządkowania]

100 SQL – podzapytania Kwalifikowanie nazw kolumn: W podzapytaniach nazwy kolumn są kwalifikowane niejawnie przez klauzulę FROM na tym samym poziomie (nie ma potrzeby jawnego kwalifikowania identycznie nazwanych kolumn w takich samych lub różnych tabelach użytych na różnych poziomach). W podzapytaniach nazwy kolumn są kwalifikowane niejawnie przez klauzulę FROM na tym samym poziomie (nie ma potrzeby jawnego kwalifikowania identycznie nazwanych kolumn w takich samych lub różnych tabelach użytych na różnych poziomach). W podzapytaniach skorelowanych nazwy kolumn podzapytania wewnętrznego mogą być kwalifikowane niejawnie, natomiast nazwy kolumn podzapytania zewnętrznego muszą być kwalifikowane jawnie (przy wykorzystywaniu identycznych tabel należy dodatkowo korzystać z aliasów). W podzapytaniach skorelowanych nazwy kolumn podzapytania wewnętrznego mogą być kwalifikowane niejawnie, natomiast nazwy kolumn podzapytania zewnętrznego muszą być kwalifikowane jawnie (przy wykorzystywaniu identycznych tabel należy dodatkowo korzystać z aliasów). Niekiedy, podczas wykorzystywania na różnych poziomach tych samych tabel wymagane jest kwalifikowanie nazw kolumn przy pomocy nadanych aliasów. Niekiedy, podczas wykorzystywania na różnych poziomach tych samych tabel wymagane jest kwalifikowanie nazw kolumn przy pomocy nadanych aliasów.

101 SQL – podzapytania Reguły rządzące podzapytaniami: Lista wyboru podzapytania wewnętrznego wprowadzana przez operator porównania lub IN może zawierać tylko jedno wyrażenie lub jedną nazwę kolumny, która musi być złączeniowo zgodna z nazwą kolumny w klauzuli WHERE zapytania zewnetrznego. Lista wyboru podzapytania wewnętrznego wprowadzana przez operator porównania lub IN może zawierać tylko jedno wyrażenie lub jedną nazwę kolumny, która musi być złączeniowo zgodna z nazwą kolumny w klauzuli WHERE zapytania zewnetrznego. Lista wyboru podzapytania wprowadzonego przez EXISTS prawie zawsze składa się z (*) i nie ma potrzeby określania nazw kolumn, ponieważ sprawdzane jest istnienie (lub nieistnienie) wierszy spełniających nałożone kryteria. Lista wyboru podzapytania wprowadzonego przez EXISTS prawie zawsze składa się z (*) i nie ma potrzeby określania nazw kolumn, ponieważ sprawdzane jest istnienie (lub nieistnienie) wierszy spełniających nałożone kryteria.

102 SQL – podzapytania Reguły rządzące podzapytaniami: Podzapytania wprowadzone przez niezmodyfikowany operator porównania (nie następuje po operatorze porównania słowo ANY lub ALL) nie mogą zawierać klauzul GROUP BY i HAVING). Podzapytania wprowadzone przez niezmodyfikowany operator porównania (nie następuje po operatorze porównania słowo ANY lub ALL) nie mogą zawierać klauzul GROUP BY i HAVING). Podzapytania nie mogą wewnętrznie operować na swoich wynikach, np. nie mogą zawierać klauzuli ORDER BY (można jedynie umieścić słowo DISTINCT, chociaż w wielu systemach relacyjnych jest to niepotrzebne, ponieważ automatycznie eliminują one powtórzenia w wynikach podzapytań). Podzapytania nie mogą wewnętrznie operować na swoich wynikach, np. nie mogą zawierać klauzuli ORDER BY (można jedynie umieścić słowo DISTINCT, chociaż w wielu systemach relacyjnych jest to niepotrzebne, ponieważ automatycznie eliminują one powtórzenia w wynikach podzapytań).

103 SQL – podzapytania Podzapytania zwracające zero lub więcej wartości (IN, NOT IN, ANY, ALL) Podzapytania wprowadzone za pomocą Podzapytania wprowadzone za pomocą IN (NOT IN): Początek_instrukcji SELECT, INSERT, UPDATE, DELETE WHERE wyrażenie [NOT] IN (podzapytanie) [Koniec_instrukcji SELECT, INSERT, UPDATE, DELETE]

104 SQL – podzapytania Przykłady: SELECT nazwisko FROM d WHERE status IN (SELECT status FROM d WHERE miasto = Londyn); SELECT nazwisko FROM d WHERE status IN (SELECT status FROM d WHERE miasto = Londyn); (zostaną podane nazwiska dostawców o takim samym statusie, jaki mają dostawcy z Londynu, łącznie z dostawcami z Londynu) SELECT nazwisko FROM d d1, d d2 WHERE d2.miasto = Londyn AND d1.status = d2.status; SELECT nazwisko FROM d d1, d d2 WHERE d2.miasto = Londyn AND d1.status = d2.status; (taki sam efekt otrzyma się wydając zapytanie złączające) SELECT DISTINCT nazwisko FROM d, dc WHERE d.id_d = dc.id_d AND id_c IN SELECT DISTINCT nazwisko FROM d, dc WHERE d.id_d = dc.id_d AND id_c IN (SELECT id_c FROM dc WHERE id_d = D2) ORDER BY nazwisko; (wybiera uporządkowane alfabetycznie nazwiska dostawców co najmniej jednej takiej części, jak dostarczane przez dostawcę D2)

105 SQL – podzapytania Przykłady: SELECT DISTINCT nazwisko FROM d WHERE id_d NOT IN SELECT DISTINCT nazwisko FROM d WHERE id_d NOT IN (SELECT DISTINCT id_d FROM dc); ( wybiera nazwiska dostawców nie dostarczających żadnych części) SELECT DISTINCT nazwisko FROM d, dc WHERE d.id_d = dc.id_d AND id_c NOT IN SELECT DISTINCT nazwisko FROM d, dc WHERE d.id_d = dc.id_d AND id_c NOT IN (SELECT id_c FROM dc WHERE id_d = D2); (wybiera nazwiska dostawców dostarczających także inne części, niż dostarczane przez dostawcę D2) SELECT DISTINCT nazwisko FROM d WHERE miasto IN SELECT DISTINCT nazwisko FROM d WHERE miasto IN (SELECT miasto FROM dc, c WHERE dc.id_c = c.id_c AND id_d = d.id_d); (zapytanie skorelowane – wybiera nazwiska dostawców, którzy mają siedzibę identyczną z miejscem wytwarzania jednej z dostarczanych części)

106 SQL – podzapytania Przykłady: SELECT DISTINCT p1.stanowisko FROM Pracownicy p1 WHERE p1.kod_działu = AD AND p1.stanowisko IN (SELECT p2.stanowisko FROM Pracownicy p2 WHERE p1.stanowisko = p2.stanowisko AND SELECT DISTINCT p1.stanowisko FROM Pracownicy p1 WHERE p1.kod_działu = AD AND p1.stanowisko IN (SELECT p2.stanowisko FROM Pracownicy p2 WHERE p1.stanowisko = p2.stanowisko AND p2.kod_działu = AD AND p1.Id_pracownika <> p2.Id_pracownika) ORDER BY 1 DESC; (zapytanie skorelowane – wybiera w kolejności alfabetycznej malejącej stanowiska w dziale Administracji obsadzone przez co najmniej dwie osoby)

107 SQL – podzapytania Podzapytania wprowadzone za pomocą operatorów porównania zmodyfikowanych przez ANY lub ALL: Początek_instrukcji SELECT, INSERT, UPDATE, DELETE WHERE wyrażenie operator_porównania [ALL/ANY] (podzapytanie) [Koniec_instrukcji SELECT, INSERT, UPDATE, DELETE] ALL (podzapytanie) – oznacza, że relacja porównania musi być równocześnie spełniona dla wszystkich wyników podzapytania. ANY (podzapytanie) – oznacza, że relacja porównania musi być spełniona dla co najmniej jednego wyniku podzapytania. ANY (podzapytanie) – oznacza, że relacja porównania musi być spełniona dla co najmniej jednego wyniku podzapytania.

108 SQL – podzapytania Przykłady: SELECT DISTINCT id_c FROM dc WHERE ilość > ALL (SELECT ilość FROM dc WHERE id_c = C1); SELECT DISTINCT id_c FROM dc WHERE ilość > ALL (SELECT ilość FROM dc WHERE id_c = C1); (wyprowadzi numery części dostarczonych w większej ilości, niż ilość każdej dostawy części o numerze C1) SELECT DISTINCT nazwa FROM c WHERE masa < ALL SELECT DISTINCT nazwa FROM c WHERE masa < ALL (SELECT masa FROM c WHERE kolor = czerwony); (wyprowadzi nazwy wszystkich części, które mają masę mniejszą od najlżejszej części o kolorze czerwonym) SELECT nazwisko FROM d WHERE status <> ALL SELECT nazwisko FROM d WHERE status <> ALL (SELECT status FROM d WHERE miasto = Paryż); (wyprowadzi nazwiska wszystkich dostawców o statusie różnym od statusów wszystkich dostawców z siedzibą w Paryżu)

109 SQL – podzapytania Przykłady: SELECT nazwisko FROM d WHERE status = ALL SELECT nazwisko FROM d WHERE status = ALL (SELECT status FROM d WHERE miasto = Paryż); (wyprowadzi nazwiska wszystkich dostawców o statusie równym statusowi wszystkich dostawców z siedzibą w Paryżu, co w tym przypadku oznacza sprzeczność, gdy statusy te są różne) SELECT DISTINCT id_c FROM dc WHERE ilość > ANY (SELECT ilość FROM dc WHERE id_c = C1); SELECT DISTINCT id_c FROM dc WHERE ilość > ANY (SELECT ilość FROM dc WHERE id_c = C1); (wyprowadzi numery części dostarczonych w większej ilości, niż ilość którejś (najmniejszej) dostawy części o numerze C1) SELECT DISTINCT nazwa FROM c WHERE masa < ANY SELECT DISTINCT nazwa FROM c WHERE masa < ANY (SELECT masa FROM c WHERE kolor = czerwony); (wyprowadzi nazwy wszystkich części, które mają masę mniejszą od którejś (najcięższej) części o kolorze czerwonym)

110 SQL – podzapytania Przykłady: SELECT nazwisko FROM d WHERE status <> ANY SELECT nazwisko FROM d WHERE status <> ANY (SELECT status FROM d WHERE miasto = Paryż); (wyprowadzi nazwiska wszystkich dostawców o statusie różnym od statusu któregoś z dostawców z siedzibą w Paryżu) SELECT nazwisko FROM d WHERE status = ANY SELECT nazwisko FROM d WHERE status = ANY (SELECT status FROM d WHERE miasto = Paryż); (wyprowadzi nazwiska wszystkich dostawców o statusie równym statusowi któregoś z dostawców z siedzibą w Paryżu)

111 SQL – podzapytania Uwaga: Operator = ANY jest równoważny operatorowi IN, natomiast operator <> ALL jest równoważny NOT IN. Uwaga: Jeżeli jednym z wyników podzapytania jest wartość NULL, to system (zazwyczaj) nie udzieli odpowiedzi na zapytanie, ponieważ nie jest w stanie porównywać NULL z czymkolwiek. Uwaga: Poszczególne systemy relacyjnych baz danych mogą różnie reagować na sytuację, gdy lista wyników podzapytania jest pusta.

112 SQL – podzapytania Podzapytania zwracające jedną wartość Uwaga: Podzapytania wprowadzone za pomocą niezmodyfikowanego operatora porównania (bez następującego po nim ALL lub ANY) muszą zwracać jedną wartość; w przeciwnym razie system nie wykona zapytania zgłaszając błąd. Początek_instrukcji SELECT, INSERT, UPDATE, DELETE WHERE wyrażenie operator_porównania (podzapytanie) [Koniec_instrukcji SELECT, INSERT, UPDATE, DELETE]

113 SQL – podzapytania Przykłady: SELECT nazwisko FROM d WHERE status = SELECT nazwisko FROM d WHERE status = (SELECT status FROM d WHERE miasto = Londyn); (wyprowadzi nazwiska wszystkich dostawców o statusie równym statusowi dostawców z siedzibą w Londynie pod warunkiem, że będzie on dla każdego z nich identyczny; w przeciwnym razie błąd) SELECT nazwisko FROM d WHERE status > SELECT nazwisko FROM d WHERE status > (SELECT MAX(status) FROM d WHERE miasto = Londyn); (zostaną wyprowadzone nazwiska dostawców o statusie większym od największego statusu dostawcy z Londynu) Uwaga: funkcje agregujące w podzapytaniu gwarantują jedną wartość na liście wyników zapytania wewnętrznego.

114 SQL – podzapytania Przykłady: SELECT nazwisko FROM d WHERE status > SELECT nazwisko FROM d WHERE status > (SELECT MAX(status) FROM d GROUP BY miasto HAVING miasto = Londyn); (jak poprzednio z użyciem klauzuli GROUP BY i HAVING) Uwaga: Podzapytania z operatorami porównania nie mogą zawierać klauzul GROUP BY i HAVING, chyba że wiadomo iż zwrócą jedną wartość. SELECT * FROM dc dc1 WHERE ilosc > SELECT * FROM dc dc1 WHERE ilosc > (SELECT AVG(ilosc) FROM dc dc2 WHERE dc1.id_c = dc2.id_c); (podzapytanie skorelowane – wyszukuje dla każdej części dostawy większe od dostawy średniej)

115 SQL – podzapytania Podzapytania sprawdzające istnienie Początek_instrukcji SELECT, INSERT, UPDATE, DELETE WHERE [NOT] EXISTS (podzapytanie) [Koniec_instrukcji SELECT, INSERT, UPDATE, DELETE] Uwaga: Słowo kluczowe EXISTS sprawdza istnienie lub nieistnienie danych spełniających kryteria podane w podzapytaniu. Dla słowa EXISTS wynik podzapytania jest prawdziwy, gdy zwraca ono co najmniej jeden wiersz i fałszywy, gdy zbiór jest pusty. Dla słowa NOT EXISTS sytuacja jest odwrotna. Zasada tego typu zapytań polega na dostarczaniu przez zapytanie zewnętrzne wartości, na których zapytanie wewnętrzne sprawdza warunki.

116 SQL – podzapytania Składnia zapytań ze słowem EXISTS (NOT EXISTS) jest nieco inna: Słowo kluczowe EXISTS nie jest poprzedzone nazwą kolumny, stałą lub innym wyrażeniem. Słowo kluczowe EXISTS nie jest poprzedzone nazwą kolumny, stałą lub innym wyrażeniem. Lista wyboru podzapytania prawie zawsze jest gwiazdką. Lista wyboru podzapytania prawie zawsze jest gwiazdką. Warunki podzapytania są wyrażone w klauzuli WHERE. Warunki podzapytania są wyrażone w klauzuli WHERE.

117 SQL – podzapytania Przykłady: SELECT nazwisko FROM d WHERE EXISTS SELECT nazwisko FROM d WHERE EXISTS (SELECT * FROM dc WHERE d.id_d = dc.id_d); (wyszukuje dostawców dostarczających części, sprawdzając po kolei, czy istnieje w tabeli dc dostawa pochodząca od danego dostawcy) SELECT nazwisko FROM d WHERE id_d IN SELECT nazwisko FROM d WHERE id_d IN (SELECT id_d FROM dc); (wynik jak poprzednio przy użyciu innego operatora)

118 SQL – podzapytania Przykłady: SELECT nazwisko FROM d WHERE NOT EXISTS SELECT nazwisko FROM d WHERE NOT EXISTS (SELECT * FROM dc WHERE d.id_d = dc.id_d); (wyszukuje dostawców nie dostarczających części) Uwaga: Podzapytania z EXISTS i NOT EXISTS mogą być stosowane do operacji na zbiorach. EXISTS pozwala znaleźć część wspólną (wiersze występujące w obu tabelach), natomiast NOT EXISTS różnicę (wiersze należące do pierwszej i nie należące do drugiej).

119 SQL – podzapytania Podzapytania zagnieżdżone na wielu poziomach Uwaga: Zagnieżdżać można dowolna liczbę zapytań. Przykład: SELECT DISTINCT nazwisko FROM d WHERE id_d IN SELECT DISTINCT nazwisko FROM d WHERE id_d IN (SELECT id_d FROM dc WHERE id_c IN (SELECT id_c FROM c WHERE kolor = czerwony)); (wyszukuje nazwiska dostawców części czerwonych; to samo można osiągnąć przy pomocy złączenia)

120 SQL – podzapytania Podzapytania w instrukcjach UPDATE, DELETE i INSERT Przykłady: UPDATE Pracownicy SET pensja = pensja * 1,2 WHERE Id_pracownika IN (SELECT Id_pracownika FROM Adresy WHERE Miasto = Warszawa); UPDATE Pracownicy SET pensja = pensja * 1,2 WHERE Id_pracownika IN (SELECT Id_pracownika FROM Adresy WHERE Miasto = Warszawa); (zwiększa o 20% pensję wszystkich pracowników z Warszawy) DELETE Pracownicy WHERE Id_pracownika IN (SELECT Id_pracownika FROM Adresy WHERE Miasto = Warszawa); DELETE Pracownicy WHERE Id_pracownika IN (SELECT Id_pracownika FROM Adresy WHERE Miasto = Warszawa); (usuwa pracowników zamieszkałych w Warszawie)

121 SQL – podzapytania Przykłady: INSERT INTO Osoby SELECT Id_pracownika, Nazwisko, Imię INSERT INTO Osoby SELECT Id_pracownika, Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = AD; (wstawienie do tabeli Osoby wartości z wybranych kolumn tabeli Pracownicy) Uwaga: Zazwyczaj w poleceniach UPDATE, DELETE i INSERT nie można stosować klauzuli FROM, dlatego nie można zrealizować tej operacji poprzez zwykłe złączenie.

122 SQL – perspektywy Perspektywa – tabela wirtualna (nie pamiętana samodzielnie) pozwalająca na alternatywne oglądanie i manipulowanie danymi. Tworzenie perspektywy: CREATE VIEW nazwa_perspektywy [(nazwa_kolumny [, nazwa_kolumny])] AS instrukcja_SELECT; CREATE VIEW nazwa_perspektywy [(nazwa_kolumny [, nazwa_kolumny])] AS instrukcja_SELECT;

123 SQL – perspektywy Przykłady definicji perspektyw: CREATE VIEW Pracownicy_administracji AS CREATE VIEW Pracownicy_administracji AS SELECT Id_pracownika, Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = AD; (utworzy perspektywę z danymi osób w dziale administracji) CREATE VIEW Adresy_pracowników AS CREATE VIEW Adresy_pracowników AS SELECT Nazwisko, Imię, Adres FROM Pracownicy p, Adresy a WHERE p.Id_pracownika = a.Id_pracownika; (utworzy perspektywę z adresami pracowników, będącą połączeniem dwóch tabel bazowych)

124 SQL – perspektywy Przykłady użycia perspektyw: CREATE VIEW Urzędnicy (Id_pracownika, Nazwisko, Zarobki) CREATE VIEW Urzędnicy (Id_pracownika, Nazwisko, Zarobki) AS SELECT Id_pracownika, Nazwisko, Zarobki FROM Pracownicy WHERE Stanowisko = CLERK; SELECT Nazwisko FROM Urzędnicy WHERE Zarobki > 2000; SELECT Nazwisko FROM Urzędnicy WHERE Zarobki > 2000; (wybiera określonych urzędników) CREATE VIEW Prac_sprzedaży CREATE VIEW Prac_sprzedaży AS SELECT * FROM Pracownicy WHERE Id_działu = 20; UPDATE Prac_sprzedaży UPDATE Prac_sprzedaży SET Zarobki = Zarobki * 1,1; (zmienia zarobki pracownikom sprzedaży)

125 SQL – perspektywy Przykłady użycia perspektyw: CREATE VIEW ed CREATE VIEW ed AS SELECT Id_pracownika, Nazwisko, p.Id_działu, Miejsce FROM Pracownicy p, Działy d WHERE p.Id_działu = d.Id_działu; INSERT INTO ed (Id_pracownika, Nazwisko, Id_działu) INSERT INTO ed (Id_pracownika, Nazwisko, Id_działu) VALUES (5600, Nowiński, 20); (dodaje nowego pracownika)

126 SQL – perspektywy Usuwanie perspektywy: DROP VIEW nazwa_perspektywy; DROP VIEW nazwa_perspektywy;Przykłady: DROP VIEW Pracownicy_administracji; DROP VIEW Pracownicy_administracji; DROP VIEW Adresy_pracowników; DROP VIEW Adresy_pracowników; Uwaga: Nie można używać danej perspektywy po usunięciu tabeli lub perspektywy na podstawie której jest ona tworzona.

127 SQL – perspektywy Zalety perspektyw Umożliwiają alternatywne spojrzenie na dane (ułatwiają pracę). Przykład. Niech baza danych zawiera tabele: Pracownicy (numery, nazwiska i imiona pracowników, kody działów) Pracownicy (numery, nazwiska i imiona pracowników, kody działów) Adresy (numery pracowników i adresy). Adresy (numery pracowników i adresy). Działy (kody i nazwy działów oraz numery kierowników). Działy (kody i nazwy działów oraz numery kierowników).

128 SQL – perspektywy Pracując często z adresami nie jest wygodne dokonywanie złączenia tabel Pracownicy i Adresy, lepiej posłużyć się perspektywą: CREATE VIEW Adresy_domowe AS CREATE VIEW Adresy_domowe AS SELECT Nazwisko, Imię, Adres FROM Pracownicy p, Adresy a WHERE p.Id_pracownika = a.Id_pracownika ORDER BY Nazwisko; Odwołując się często do kierowników działów zamiast wielokrotnego złączania tabel lepiej posłużyć się perspektywą: CREATE VIEW Kierownicy_działów AS CREATE VIEW Kierownicy_działów AS SELECT Nazwisko, Imię, Nazwa FROM Pracownicy p, Działy d WHERE p.Id_pracownika = d.Id_pracownika ORDER BY Nazwa; Perspektywa może być używana jako normalna tabela z dowolnym sposobem uporządkowania wierszy (gdy system na to pozwala).

129 SQL – perspektywy Perspektywa może stanowić: Proste ograniczenie tabeli (wybór kolumn i wierszy z jednej tabeli). Proste ograniczenie tabeli (wybór kolumn i wierszy z jednej tabeli). Tabelę z kolumnami obliczanymi (np. funkcje agregujące). Tabelę z kolumnami obliczanymi (np. funkcje agregujące). Tabelę będącą wynikiem złączenia tabel. Tabelę będącą wynikiem złączenia tabel. Tabelę będącą wynikiem zapytań zagnieżdżonych. Tabelę będącą wynikiem zapytań zagnieżdżonych. Połączenie wymienionych przypadków. Połączenie wymienionych przypadków. Perspektywę można utworzyć na podstawie tabel bazowych lub innych perspektyw. Perspektywę można utworzyć na podstawie tabel bazowych lub innych perspektyw. Zalety perspektyw: Uproszczenie pracy. Uproszczenie pracy. Dostosowanie danych. Dostosowanie danych. Skupienie uwagi. Skupienie uwagi. Bezpieczeństwo. Bezpieczeństwo. Niezależność danych (od modyfikacji struktury bazy danych). Niezależność danych (od modyfikacji struktury bazy danych).

130 SQL – perspektywy Zasada działania perspektyw: Zdefiniowanie perspektywy powoduje zapisanie jej definicji w słowniku bazy danych (i nic poza tym). Zdefiniowanie perspektywy powoduje zapisanie jej definicji w słowniku bazy danych (i nic poza tym). Wydanie dowolnego polecenia odwołującego się do perspektywy powoduje automatyczne rozszerzenie polecenia o definicję perspektywy pobraną ze słownika i wykonanie go. Wydanie dowolnego polecenia odwołującego się do perspektywy powoduje automatyczne rozszerzenie polecenia o definicję perspektywy pobraną ze słownika i wykonanie go. Polecenia odwołujące się do perspektyw są faktycznie wykonywane bezpośrednio na tabelach bazowych (dlatego zmiana informacji przechowywanej w tabelach bazowych jest od razu widoczna w perspektywach i modyfikacja danych w perspektywach jest faktycznie modyfikacją tabel bazowych). Polecenia odwołujące się do perspektyw są faktycznie wykonywane bezpośrednio na tabelach bazowych (dlatego zmiana informacji przechowywanej w tabelach bazowych jest od razu widoczna w perspektywach i modyfikacja danych w perspektywach jest faktycznie modyfikacją tabel bazowych). Perspektywa nie jest przechowywana w osobnej tabeli. Perspektywa nie jest przechowywana w osobnej tabeli.

131 SQL – perspektywy Nazewnictwo kolumn w perspektywie: Nazwy kolumn perspektywy (aliasy) można nadać w definicji w nawiasie okrągłym, co zazwyczaj nie jest konieczne. Nazwy kolumn perspektywy (aliasy) można nadać w definicji w nawiasie okrągłym, co zazwyczaj nie jest konieczne. Nie zdefiniowanie alisów nazw kolumn powoduje ich odziedziczenie po tabelach bazowych. Nie zdefiniowanie alisów nazw kolumn powoduje ich odziedziczenie po tabelach bazowych. Definiując nazwę jednej kolumny w perspektywie należy zdefiniować wszystkie pozostałe nazwy. Definiując nazwę jednej kolumny w perspektywie należy zdefiniować wszystkie pozostałe nazwy. Liczba nazw kolumn wewnątrz nawiasu musi być równa liczbie kolumn na liście wyboru instrukcji SELECT. Liczba nazw kolumn wewnątrz nawiasu musi być równa liczbie kolumn na liście wyboru instrukcji SELECT. Typ i status kolumny w perspektywie jest zawsze dziedziczony z tabeli bazowej. Typ i status kolumny w perspektywie jest zawsze dziedziczony z tabeli bazowej. Nazwę kolumny należy zdefiniować, gdy jest ona otrzymywana jako wyrażenie arytmetyczne, funkcja wbudowana lub stała. Nazwę kolumny należy zdefiniować, gdy jest ona otrzymywana jako wyrażenie arytmetyczne, funkcja wbudowana lub stała. Nazwę kolumny należy zdefiniować, gdy mogą się pojawić dwie różne kolumny o takich samych nazwach dziedziczonych. Nazwę kolumny należy zdefiniować, gdy mogą się pojawić dwie różne kolumny o takich samych nazwach dziedziczonych.

132 SQL – perspektywy Przykłady: CREATE VIEW Zarobki (Nr, Nazwisko, Imię, Pensja) AS CREATE VIEW Zarobki (Nr, Nazwisko, Imię, Pensja) AS SELECT Id_pracownika, Nazwisko, Imię, 4*Stawka*Czas_pracy FROM Pracownicy WHERE Kod_działu = AD; (tworzy perspektywę z miesięczną pensją wyliczoną na podstawie tygodniowego czasu pracy i stawki) CREATE VIEW dcm (Dostawca, Miasto_d, Część, Miasto_c) AS CREATE VIEW dcm (Dostawca, Miasto_d, Część, Miasto_c) AS SELECT d.Nazwa, d.Miasto, c.Nazwa, c.Miasto FROM d, c, dc WHERE d.Id_d = dc.Id_d AND c.Id_c = dc.Id_c; (powtarzającym się kolumnom Nazwa i Miasto należy nadać aliasy)

133 SQL – perspektywy Perspektywa z opcją sprawdzania CHECK Opcja sprawdzania może występować tylko, gdy definiowana perspektywa pozwala na modyfikowanie (sprawdzanie określa zasady modyfikowania danych przy pomocy perspektywy). CREATE VIEW nazwa_perspektywy [(nazwa_kolumny [, nazwa_kolumny]...)] AS CREATE VIEW nazwa_perspektywy [(nazwa_kolumny [, nazwa_kolumny]...)] AS instrukcja SELECT [WITH CHECK OPTION] (każda modyfikacja perspektywy, faktycznie tabeli bazowej, instrukcją UPDATE, INSERT lub DELETE zostanie odrzucona, gdy nie będzie spełniony warunek narzucony na perspektywę)

134 SQL – perspektywy Przykłady: CREATE VIEW doststat AS CREATE VIEW doststat AS SELECT nazwa, miasto, status FROM d WHERE status < 50 WITH CHECK OPTION; UPDATE dosstat SET status = 60HERE miasto = Londyn; (modyfikacja zostanie odrzucona, ponieważ nie spełnia warunku) CREATE VIEW Pracownicy_na_urlopie_bezpłatnym CREATE VIEW Pracownicy_na_urlopie_bezpłatnym AS SELECT * FROM Pracownicy WHERE Zarobki = 0 OR Zarobki IS NULL WITH CHECK OPTION; UPDATE Pracownicy_na_urlopie_bezpłatnym SET Zarobki = WHERE Nazwisko = Kowalski; (modyfikacja odrzucona, ponieważ warunek nie jest spełniony)

135 SQL – perspektywy Rozwiązanie perspektywy – proces zastąpienia w aktualnie wykonywanym zapytaniu odwołań do perspektyw przez ich zapamiętane definicje; jeżeli w jakiejś definicji perspektywy występują odwołania do innych perspektyw proces ten jest kontynuowany tak długo, aż zapytanie będzie korzystało tylko z tabel bazowych. Zwykle systemy relacyjne nie uaktualniają rozwiązania perspektywy po zmianie struktury wykorzystywanych tabel lub perspektyw. Przedefiniowanie perspektywy może doprowadzić (zazwyczaj prowadzi) do zerwania łańcucha i perspektywy zależne utracą sens. Inna metoda rozwiązania perspektywy w systemach relacyjnych polega na zastąpieniu w zapytaniu ją definiującym odwołań do innych perspektyw przez ich zapamiętane definicje do momentu, aż zapytanie będzie korzystało tylko z tabel bazowych i zapisanie tak otrzymanej definicji perspektywy w słowniku bazy danych (operacja ta ma miejsce tylko raz podczas definiowania perspektywy i późniejsze przedefiniowanie perspektyw od których zależy nie ma znaczenia).

136 SQL – perspektywy Problemy (błędy) rozwiązania perspektywy: Brak odpowiednich tabel lub perspektyw, lub ich niewłaściwa struktura. Brak odpowiednich tabel lub perspektyw, lub ich niewłaściwa struktura. Brak odpowiednich kolumn. Brak odpowiednich kolumn. Pojawienie się nowozdefiniowanych kolumn w tabelach bazowych (gdy w definicji perspektywy lub podzapytaniu występuje *). Pojawienie się nowozdefiniowanych kolumn w tabelach bazowych (gdy w definicji perspektywy lub podzapytaniu występuje *). Niezgodności typu danych. Niezgodności typu danych. W opisanych sytuacjach należałoby usunąć daną perspektywę i zdefiniować ją na nowo. Modyfikowanie danych za pomocą perspektyw Perspektywa może służyć do modyfikowania danych tylko wtedy, gdy modyfikację tą jest w stanie SQL zinterpretować jednoznacznie (ogólnie obowiązująca zasada). Niektóre perspektywy ze swojej natury (logicznej niejednoznaczności) nie nadają się do modyfikowania danych.

137 SQL – perspektywy Według standardu ANSI perspektywy są typu tylko do odczytu (niemodyfikowalne), gdy definicja CREATE VIEW zawiera jakiś element z listy: DISTINCT na liście wyboru. DISTINCT na liście wyboru. Wyrażenia (kolumny obliczane, agregaty, funkcje itp.) na liście wyboru. Wyrażenia (kolumny obliczane, agregaty, funkcje itp.) na liście wyboru. Odwołania do więcej niż jednej tabeli w klauzuli FROM. Odwołania do więcej niż jednej tabeli w klauzuli FROM. Odwołania do perspektyw nie podlegających modyfikacji, występujące w klauzuli FROM albo w podzapytaniu. Odwołania do perspektyw nie podlegających modyfikacji, występujące w klauzuli FROM albo w podzapytaniu. Klauzulę GROUP BY plus ewentualnie HAVING. Klauzulę GROUP BY plus ewentualnie HAVING. Implementacja tego problemu w różnych systemach relacyjnych może być różna. Ograniczenia dotyczące modyfikacji danych mogą być bardziej lub mniej restrykcyjne, chociaż w tym ostatnim przypadku trzeba uważać, by nie dopuścić do sytuacji, gdy użytkownik w sposób niezamierzony wprowadzi dane w stan niespójny.

138 SQL – perspektywy Przykłady: CREATE VIEW Zarobki (Nr, Nazwisko, Imię, Pensja) AS CREATE VIEW Zarobki (Nr, Nazwisko, Imię, Pensja) AS SELECT Id_pracownika, Nazwisko, Imię, 4*Stawka*Czas_pracy FROM Pracownicy WHERE Kod_działu = AD; (modyfikacja kolumny Pensja w perspektywie nie może być jednoznacznie przetłumaczona na modyfikację kolumn tabeli Pracownicy) CREATE VIEW Zarobki_średnie (Kod_działu, Średnia) AS CREATE VIEW Zarobki_średnie (Kod_działu, Średnia) AS SELECT Kod_działu, AVG(4*Stawka*Czas_pracy) FROM Pracownicy GROUP BY Kod_działu; (modyfikacja kolumny Średnia w perspektywie nie może być jednoznacznie przetłumaczona na modyfikację kolumn tabeli Pracownicy – przykład perspektywy zgrupowanej)

139 SQL – perspektywy Przykłady: CREATE VIEW ddcc AS CREATE VIEW ddcc AS SELECT * FROM d, dc, c WHERE d.Id_d = dc.Id_d AND c.Id_c = dc.Id_c; CREATE VIEW ddcc AS CREATE VIEW ddcc AS SELECT * FROM d, dc, c WHERE d.miasto = c.miasto; CREATE VIEW ddcc AS CREATE VIEW ddcc AS SELECT * FROM d, dc, c; (Uwaga: dla uproszczenia pominięto problem powtarzania się nazw kolumn w różnych tabelach; równoczesna modyfikacja kolumn w kilku tabelach przy pomocy perspektywy jest niedopuszczalna, ponieważ warunek złączenia nie musi oddawać struktury danych; zazwyczaj dopuszczalne są modyfikacje kolumn jednej z tabel)

140 SQL – tworzenie tabeli Tworzenie tabeli z kopią danych Definiowanie i wypełnianie tabeli w poleceniu SELECT za pomocą klauzuli INTO występuje tylko w niektórych systemach SQL (jest to kopia danych nie powiązana z tabelami bazowymi). SELECT lista_wyboru INTO nazwa_nowej_tabeli SELECT lista_wyboru INTO nazwa_nowej_tabeli FROM lista_tabel [WHERE warunek]; (nowa tabela jest definiowana i wypełniania danymi według listy wyboru, pochodzących z wierszy spełniających warunek) Przykłady: SELECT * INTO Administracja FROM Pracownicy WHERE Kod_działu = AD; SELECT * INTO Administracja FROM Pracownicy WHERE Kod_działu = AD; (utworzy tabelę z informacjami o pracownikach Administracji) SELECT * INTO Dane_osobowe FROM Pracownicy WHERE 1 > 1; SELECT * INTO Dane_osobowe FROM Pracownicy WHERE 1 > 1; (zdefiniuje strukturę tabeli z informacjami o pracownikach – bez danych, ponieważ warunek jest zawsze fałszywy)

141 SQL – zarządzanie BD Zarządzanie bazą danych w świecie rzeczywistym obejmuje: Nadawanie użytkownikom uprawnień (przywilejów). Nadawanie użytkownikom uprawnień (przywilejów). Zarządzanie transakcjami (sterowanie współbieżnością i odzyskiwaniem danych w razie awarii sprzętu i/lub oprogramowania). Zarządzanie transakcjami (sterowanie współbieżnością i odzyskiwaniem danych w razie awarii sprzętu i/lub oprogramowania). Zapewnienie spójności danych. Zapewnienie spójności danych. Zapewnienie wydajności przetwarzania. Zapewnienie wydajności przetwarzania.

142 SQL – bezpieczeństwo danych Bezpieczeństwo danych – ochrona przed nieuprawnionym dostępem. Elementy zapewnienia bezpieczeństwa danych: Zapewnienie bezpieczeństwa danych w komputerze na poziomie systemu operacyjnego (np. hasło przy włączaniu komputera, profile użytkowników, uprawnienia dostępu do dysków, katalogów i plików) – komputery używane przez wielu użytkowników lub podłączone do sieci. Zapewnienie bezpieczeństwa danych w komputerze na poziomie systemu operacyjnego (np. hasło przy włączaniu komputera, profile użytkowników, uprawnienia dostępu do dysków, katalogów i plików) – komputery używane przez wielu użytkowników lub podłączone do sieci. Kontrola przywilejów, uprawnień użytkowników baz danych (określenie jacy użytkownicy jakie polecenia mogą wykonywać na tabelach, perspektywach, kolumnach, wierszach) – baza danych współdzielona przez wielu użytkowników. Kontrola przywilejów, uprawnień użytkowników baz danych (określenie jacy użytkownicy jakie polecenia mogą wykonywać na tabelach, perspektywach, kolumnach, wierszach) – baza danych współdzielona przez wielu użytkowników. Zapewnienie selektywnego dostępu do podzbiorów danych (stosowanie perspektyw) – baza danych współdzielona przez wielu użytkowników. Zapewnienie selektywnego dostępu do podzbiorów danych (stosowanie perspektyw) – baza danych współdzielona przez wielu użytkowników. Dwa ostatnie elementy bezpieczeństwa zakładają, że system bazodanowy ma sposoby na przetestowanie użytkownika, czyli rozpoznanie i sprawdzenie jego tożsamości.

143 SQL – bezpieczeństwo danych Metody identyfikacji użytkowników w różnych systemach baz danych: Identyfikacja przez system operacyjny (uprawnionym jest każdy, kto zalogował się do komputera). Identyfikacja przez system operacyjny (uprawnionym jest każdy, kto zalogował się do komputera). Własne mechanizmy identyfikacji i autoryzacji systemów zarządzania bazami danych (np. nazwa i hasło użytkownika). Własne mechanizmy identyfikacji i autoryzacji systemów zarządzania bazami danych (np. nazwa i hasło użytkownika). Dodatkowe poziomy ochrony w programach aplikacyjnych. Dodatkowe poziomy ochrony w programach aplikacyjnych. Rodzaje użytkowników systemów baz danych: Nadzorca systemu, administrator systemu, baz danych (specjalnie uprzywilejowany użytkownik). Nadzorca systemu, administrator systemu, baz danych (specjalnie uprzywilejowany użytkownik). Właściciel obiektów bazodanowych (specjalnie uprzywilejowany użytkownik). Właściciel obiektów bazodanowych (specjalnie uprzywilejowany użytkownik). Zwykły użytkownik (użytkownik nieuprzywilejowany). Zwykły użytkownik (użytkownik nieuprzywilejowany). Informacja o użytkownikach i ich uprawnieniach jest przechowywana w słowniku bazy danych.

144 SQL – bezpieczeństwo danych Perspektywy jako narzędzie bezpieczeństwa: Ograniczenie dostępu do podzbioru wierszy tabeli bazowej. Ograniczenie dostępu do podzbioru wierszy tabeli bazowej. Ograniczenie dostępu do podzbioru kolumn tabeli bazowej. Ograniczenie dostępu do podzbioru kolumn tabeli bazowej. Ograniczenie dostępu do podzbioru wierszy i kolumn tabeli bazowej. Ograniczenie dostępu do podzbioru wierszy i kolumn tabeli bazowej. Ograniczenie dostępu do wierszy zakwalifikowanych do złączenia z jedną lub więcej niż jedną tabelą bazową. Ograniczenie dostępu do wierszy zakwalifikowanych do złączenia z jedną lub więcej niż jedną tabelą bazową. Ograniczenie dostępu do statystycznego podsumowania danych z tabeli bazowej. Ograniczenie dostępu do statystycznego podsumowania danych z tabeli bazowej. Ograniczenie dostępu do podzbioru innej perspektywy lub kombinacji perspektyw i tabel bazowych. Ograniczenie dostępu do podzbioru innej perspektywy lub kombinacji perspektyw i tabel bazowych.

145 SQL – nadawanie uprawnień Nadawanie uprawnień określa którzy użytkownicy mogą wykonywać jakie operacje na jakich obiektach (tabele, perspektywy, kolumny, ewentualnie wiersze). Nadawanie uprawnień (w różnych systemach różna postać): GRANT {ALL/lista_uprawnień} GRANT {ALL/lista_uprawnień} ON {nazwa_tabeli [(lista_kolumn)]/ nazwa_perspektywy [(lista_kolumn)]} TO {PUBLIC/lista_użytkowników} [WITH GRANT OPTION] GRANT {ALL/lista_uprawnień [(lista_kolumn)]} GRANT {ALL/lista_uprawnień [(lista_kolumn)]} ON {nazwa_tabeli/nazwa_perspektywy} TO {PUBLIC/lista_użytkowników} [WITH GRANT OPTION]

146 SQL – odbieranie uprawnień Odbieranie uprawnień (w różnych systemach różna postać): REVOKE {ALL/lista_uprawnień} REVOKE {ALL/lista_uprawnień} ON {nazwa_tabeli [(lista_kolumn)]/ nazwa_perspektywy [(lista_kolumn)]} FROM {PUBLIC/lista_użytkowników} REVOKE {ALL/lista_uprawnień [(lista_kolumn)]} REVOKE {ALL/lista_uprawnień [(lista_kolumn)]} ON {nazwa_tabeli/nazwa_perspektywy} FROM {PUBLIC/lista_użytkowników} Uwaga: Polecenie GRANT poza nadawaniem uprawnień tworzy równocześnie danego użytkownika (w większości systemów baz danych), gdy jeszcze nie istnieje. Tylko niektóre systemy rezerwują osobne polecenie do tworzenia użytkowników. Polecenie REVOKE odbiera jedynie uprawnienia danemu użytkownikowi. Jeżeli są to jego wszystkie uprawnienia użytkownik nie zostanie mimo to usunięty i trzeba to zrobić innym poleceniem. Uwaga: Polecenie GRANT poza nadawaniem uprawnień tworzy równocześnie danego użytkownika (w większości systemów baz danych), gdy jeszcze nie istnieje. Tylko niektóre systemy rezerwują osobne polecenie do tworzenia użytkowników. Polecenie REVOKE odbiera jedynie uprawnienia danemu użytkownikowi. Jeżeli są to jego wszystkie uprawnienia użytkownik nie zostanie mimo to usunięty i trzeba to zrobić innym poleceniem.

147 SQL – uprawnienia Lista nadawanych uprawnień: ALL (ALL PRIVILEGES) – wszystkie możliwe uprawnienia dotyczące danego obiektu bazodanowego (występuje zawsze). ALL (ALL PRIVILEGES) – wszystkie możliwe uprawnienia dotyczące danego obiektu bazodanowego (występuje zawsze). SELECT – wybieranie informacji (występuje zawsze). SELECT – wybieranie informacji (występuje zawsze). UPDATE – aktualizacja informacji (występuje zawsze). UPDATE – aktualizacja informacji (występuje zawsze). DELETE – usuwanie informacji (występuje zawsze). DELETE – usuwanie informacji (występuje zawsze). INSERT – dodawanie informacji (występuje zawsze). INSERT – dodawanie informacji (występuje zawsze). REFERENCES – prawo do podania odwołania do tabeli w instrukcji CREATE TABLE innej tabeli, by pojawił się klucz obcy (występuje zazwyczaj, w standardzie od wersji SQL-92). REFERENCES – prawo do podania odwołania do tabeli w instrukcji CREATE TABLE innej tabeli, by pojawił się klucz obcy (występuje zazwyczaj, w standardzie od wersji SQL-92). ALTER – prawo do modyfikowania struktury (rzadziej obecne). ALTER – prawo do modyfikowania struktury (rzadziej obecne). INDEX – prawo do indeksowania (rzadziej obecne). INDEX – prawo do indeksowania (rzadziej obecne). EXECUTE – prawo do uruchamiania aplikacji (rzadziej obecne). EXECUTE – prawo do uruchamiania aplikacji (rzadziej obecne). Uwaga: Różne systemy cechuje różna granulacja poszczególnych uprawnień (poziom nadawania: baza danych, tabela, kolumna, czy wiersz). Jeżeli nie jest podana lista kolumn w poleceniu GRANT lub REVOKE, to dane uprawnienia są nadawane lub odbierane w stosunku do wszystkich kolumn wymienionej tabeli, perspektywy.

148 SQL – uprawnienia Lista użytkowników (klauzula TO): PUBLIC – wszyscy użytkownicy danego systemu baz danych. PUBLIC – wszyscy użytkownicy danego systemu baz danych. Konkretne nazwy użytkowników. Konkretne nazwy użytkowników. Nazwa grupy użytkowników (zezwalają niektóre systemy). Nazwa grupy użytkowników (zezwalają niektóre systemy). Nazwa roli użytkowników (zezwalają niektóre systemy). Nazwa roli użytkowników (zezwalają niektóre systemy). Klauzula WITH GRANT OPTION – prawo do przekazywania dalej swoich uprawnień. Uwaga: Wydanie polecenia GRANT lub REVOKE zmienia w zdefiniowanym zakresie uprawnienia określone przez wszystkie polecenia tego typu wydane wcześniej. Uwaga: Definiowanie uprawnień użytkowników w stosunku do perspektyw pozwala na określenie przywilejów w stosunku do grup wierszy (perspektywy mechanizmem bezpieczeństwa).

149 SQL – nadawanie uprawnień Przykłady: GRANT INSERT, UPDATE ON Pracownicy TO Basia; GRANT INSERT, UPDATE ON Pracownicy TO Basia; (użytkownik Basia ma prawo do wstawiania i aktualizacji danych w tabeli Pracownicy we wszystkich kolumnach) REVOKE UPDATE (Nazwisko, Imię) ON Pracownicy FROM Basia; REVOKE UPDATE (Nazwisko, Imię) ON Pracownicy FROM Basia; (odbieramy Basi uprawnienia do aktualizacji kolumn Nazwisko i Imię w tabeli Pracownicy) GRANT SELECT, UPDATE, INSERT, DELETE GRANT SELECT, UPDATE, INSERT, DELETE ON Pracownicy TO Maria, Basia; GRANT SELECT, UPDATE, INSERT, DELETE GRANT SELECT, UPDATE, INSERT, DELETE ON Pracownicy (Nr, Nazwisko, Imię, Stanowisko, Dział) TO Tomek, Jurek, Krzysiek; GRANT SELECT GRANT SELECT ON Pracownicy (Stawka, Czas, Pensja) TO Tomek, Jurek, Krzysiek;

150 SQL – nadawanie uprawnień Przykłady: lub alternatywnie GRANT SELECT, UPDATE, INSERT, DELETE (ew. ALL) GRANT SELECT, UPDATE, INSERT, DELETE (ew. ALL) ON Pracownicy TO Maria, Basia, Tomek, Jurek, Krzysiek; REVOKE UPDATE, INSERT, DELETE REVOKE UPDATE, INSERT, DELETE ON Pracownicy (Stawka, Czas, Pensja) TO Tomek, Jurek, Krzysiek; (zwykle uprawnienia użytkowników można określać w sposób alternatywny na wiele sposobów; często stosuje się równocześnie instrukcje GRANT i REVOKE – jak np. pokazano wyżej)

151 SQL – nadawanie uprawnień Przykłady: CREATE VIEW Prac_ad AS CREATE VIEW Prac_ad AS SELECT * FROM Pracownicy WHERE Kod_działu = AD; GRANT SELECT, UPDATE, INSERT, DELETE (ew. ALL) GRANT SELECT, UPDATE, INSERT, DELETE (ew. ALL) ON Prac_ad TO Maria, Basia, Tomek, Jurek, Krzysiek; REVOKE UPDATE, INSERT, DELETE REVOKE UPDATE, INSERT, DELETE ON Prac_ad (Stawka, Czas, Pensja) TO Tomek, Jurek, Krzysiek; GRANT ALL GRANT ALL ON Pracownicy TO Maciek; (Maciek ma prawo do operowania w zakresie ALL całą tabelą Pracownicy, natomiast Tomek, Jurek, Krzysiek, Maria, i Basia tylko jej częścią, dotyczącą administracji w ramach swoich uprawnień)

152 SQL – nadawanie uprawnień Dostęp poprzez sieć Definiowanie użytkownika i nadawanie mu uprawnień (GRANT) przy możliwości dostępu do bazy danych poprzez sieć wymaga także określenia akceptowanego adresu sieciowego i hasła. Polecenie przyjmie wówczas postać (zazwyczaj w różnych systemach): GRANT {ALL/lista_uprawnień} GRANT {ALL/lista_uprawnień} ON {nazwa_tabeli [(lista_kolumn)]/ nazwa_perspektywy [(lista_kolumn)]} TO IDENTIFIED BY hasło [WITH GRANT OPTION]

153 SQL – nadawanie uprawnień Przykłady: GRANT ALL ON Pracownicy GRANT ALL ON Pracownicy TO IDENTIFIED BY Księgowa; (logowanie z określonego hosta) GRANT ALL ON Pracownicy GRANT ALL ON Pracownicy TO Basia IDENTIFIED BY Księgowa; (logowanie z dowolnego hosta)

154 SQL – nadawanie uprawnień Tworzenie i usuwanie użytkowników Tworzenie użytkowników (w niektórych systemach): CREATE USER nazwa_użytkownika IDENTIFIED BY hasło; CREATE USER nazwa_użytkownika IDENTIFIED BY hasło; Usuwanie użytkowników: DROP USER nazwa_użytkownika; DROP USER nazwa_użytkownika; Przykłady: CREATE USER Basia IDENTIFIED BY Księgowa; CREATE USER Basia IDENTIFIED BY Księgowa; (utworzy użytkownika o nazwie Basia i przypisze mu hasło) DROP USER Basia; DROP USER Basia; (usunie użytkownika Basia)

155 SQL – nadawanie uprawnień Tworzenie i usuwanie ról Rola określa zbiór uprawnień, które potem w sposób wygodniejszy mogą być przydzielane poszczególnym użytkownikom. Standardowe role (ROLE): CONNECT (uprawnienia do łączenia się z bazą danych). CONNECT (uprawnienia do łączenia się z bazą danych). RESOURCE (uprawnienia do ładowania bazy danych). RESOURCE (uprawnienia do ładowania bazy danych). DBA (uprawnienia administratora bazy danych). DBA (uprawnienia administratora bazy danych). Tworzenie ról (np. ORACLE): CREATE ROLE nazwa_roli; CREATE ROLE nazwa_roli;

156 SQL – nadawanie uprawnień Przykłady tworzenia i wykorzystania ról: CREATE ROLE Dyrektor; CREATE ROLE Dyrektor; CREATE ROLE Urzędnik; CREATE ROLE Urzędnik; (utworzenie roli Dyrektor i Urzędnik) GRANT SELECT ON Pracownicy TO Dyrektor; GRANT SELECT ON Pracownicy TO Dyrektor; GRANT SELECT, UPDATE ON Pracownicy TO Urzędnik; GRANT SELECT, UPDATE ON Pracownicy TO Urzędnik; (nadanie uprawnień roli Dyrektor i Urzędnik) GRANT Dyrektor TO King, Leon; GRANT Dyrektor TO King, Leon; GRANT Urzędnik TO Liza, Ewa, Marta; GRANT Urzędnik TO Liza, Ewa, Marta; (nadanie uprawnień poszczególnych ról konkretnym użytkownikom)

157 Zarządzanie transakcjami Zarządzanie transakcjami w systemach wielodostępnych polega na takiej organizacji pracy, by dane przetwarzane (na pewno zmieniane) przez jednego użytkownika nie były dostępne dla innych dopóty, dopóki zmiana nie ostanie zakończona. Brak odpowiedniej organizacji pracy może doprowadzić do szeregu problemów, np. problemu utraconej aktualizacji – przy równoczesnej aktualizacji tej samej informacji w tym samym czasie jedna z aktualizacji zostanie zapisana na drugiej i pierwsza zostanie utracona. Najczęściej problem współbieżności jest rozwiązywany przy pomocy mechanizmu zwanego blokowaniem. W momencie, gdy użytkownik wybiera jakieś dane w bazie danych system zarządzania automatycznie zakłada blokadę na te dane, która jest automatycznie zwalniana po zakończeniu operacji. Transakcja stanowi jednostkę pracy systemu zarządzania bazą danych z punktu widzenia użytkownika, ale zarazem jest to jednostka odzyskiwania danych w razie awarii systemu. Przez transakcję rozumie się też polecenie użytkownika zmieniające stan bazy danych, w przeciwieństwie do zapytania, które tylko wyszukuje informację.

158 Zarządzanie transakcjami Rodzaje blokad: Blokada wyłączności – zakładana w czasie modyfikowania danych, w wyniku czego żadna inna transakcja (bez względu na rodzaj operacji) nie uzyska dostępu do zablokowanych danych, aż modyfikacja nie zostanie zakończona. Blokada wyłączności – zakładana w czasie modyfikowania danych, w wyniku czego żadna inna transakcja (bez względu na rodzaj operacji) nie uzyska dostępu do zablokowanych danych, aż modyfikacja nie zostanie zakończona. Blokada dzielona (wspólna) – zakładana podczas operacji nie aktualizujących danych (odczytu) i zezwala na wykonywanie operacji odczytu zablokowanych danych przez innych użytkowników, ale nie pozwala na ich modyfikację, aż operacja odczytu nie zostanie zakończona i blokada zdjęta. Blokada dzielona (wspólna) – zakładana podczas operacji nie aktualizujących danych (odczytu) i zezwala na wykonywanie operacji odczytu zablokowanych danych przez innych użytkowników, ale nie pozwala na ich modyfikację, aż operacja odczytu nie zostanie zakończona i blokada zdjęta. Blokady są zakładane zazwyczaj automatycznie przez system zarządzania bazą danych. Niektóre systemy bazodanowe umożliwiają użytkownikom sterowanie niektórymi elementami blokowania (np. wybór poziomu, od którego blokady są zakładane automatycznie – poziom tabeli, poziom wiersza, lub sterowanie przedziałem czasu, przez który blokady są utrzymywane). Blokady są zakładane zazwyczaj automatycznie przez system zarządzania bazą danych. Niektóre systemy bazodanowe umożliwiają użytkownikom sterowanie niektórymi elementami blokowania (np. wybór poziomu, od którego blokady są zakładane automatycznie – poziom tabeli, poziom wiersza, lub sterowanie przedziałem czasu, przez który blokady są utrzymywane).

159 Zarządzanie transakcjami Awarie systemu zarządzania bazą danych lub systemu operacyjnego komputera to rodzaj awarii wpływających na wykonywane transakcje (w odróżnieniu od awarii sprzętu). W przypadku awarii systemu zarządzania bazą danych lub systemu operacyjnego muszą istnieć mechanizmy odzyskiwania danych, mianowicie: Niedokończone transakcje w chwili awarii powinny zostać zaniechane. Niedokończone transakcje w chwili awarii powinny zostać zaniechane. Zakończone transakcje, ale nie przepisane z bufora systemu do fizycznej bazy danych powinny zostać zaniechane. Zakończone transakcje, ale nie przepisane z bufora systemu do fizycznej bazy danych powinny zostać zaniechane.

160 Zarządzanie transakcjami Transakcje definiowane przez użytkownika Transakcje definiowane przez użytkownika pozwalają zdefiniować ciąg instrukcji SQL, które będą traktowane przez system zarządzania jak jedna instrukcja (przydatne w sytuacji, gdy ciąg instrukcji SQL stanowi logiczną jednostkę operacji z punktu widzenia użytkownika – np. realizacja przelewu pieniędzy między kontami bankowymi, wypłata pieniędzy z bankomatu). Składnia transakcji definiowanej przez użytkownika: BEGIN instrukcja transakcji BEGIN instrukcja transakcji instrukcja SQL COMMIT/ROLLBACK instrukcja transakcji

161 Zarządzanie transakcjami Instrukcją rozpoczynającą transakcję może być: BEGIN TRANSACTION BEGIN TRANSACTION BEGIN WORK BEGIN WORK Instrukcją kończącą transakcję może być: COMMIT TRANSACTION/WORK – zatwierdzenie transakcji. COMMIT TRANSACTION/WORK – zatwierdzenie transakcji. ROLLBACK TRANSACTION/WORK – wycofanie transakcji. ROLLBACK TRANSACTION/WORK – wycofanie transakcji. Odwołać można całą transakcję lub jej część, jeżeli system oferuje mechanizm częściowego zapamiętywania etapów transakcji. Nie można odwołać transakcji już zatwierdzonej.

162 Odzyskiwanie danych Tworzenie kopii zapasowych i odzyskiwanie danych Każdy system zarządzania bazami danych oferuje procedury odzyskiwania danych na wypadek awarii systemu. Jest to możliwe dzięki automatycznej, równoległej rejestracji wydanych poleceń SQL w dzienniku (rejestrze) transakcji, będącym częścią słownika danych. Najlepsze rezultaty oferują systemy rejestrowania z wyprzedzeniem, czyli rejestrujące transakcje zanim dokonana zostanie zmiana w samej bazie danych. Odzyskiwanie danych opiera się na tworzeniu kopii danych: DUMP DATABASE – kopia zapasowa bazy danych. DUMP DATABASE – kopia zapasowa bazy danych. DUMP TRANSACTION – kopia zapasowa dziennika transakcji. DUMP TRANSACTION – kopia zapasowa dziennika transakcji. Odtwarzania bazy na podstawie kopii zapasowych: LOAD DATABASE – odtwarzanie bazy danych. LOAD DATABASE – odtwarzanie bazy danych. LOAD TRANSACTION – odtwarzanie dziennika transakcji. LOAD TRANSACTION – odtwarzanie dziennika transakcji. Po uruchomieniu instrukcji LOAD system automatycznie uruchamia proces odtwarzania danych.

163 Wydajność systemu W wielodostępowych aplikacjach przemysłowych wydajność systemu baz danych jest jednym z najistotniejszych (krytycznych) czynników. Fakt ten wynika z: Rozrastania się bazy danych. Rozrastania się bazy danych. Obsługi dużej liczby użytkowników. Obsługi dużej liczby użytkowników. Realizacji coraz bardziej złożonych instrukcji. Realizacji coraz bardziej złożonych instrukcji. Zadania muszą być realizowane w czasie rzeczywistym Na wydajność największy wpływ mają czynniki: Dobry projekt logiczny bazy danych. Dobry projekt logiczny bazy danych. Odpowiedni sposób formułowania zapytań. Odpowiedni sposób formułowania zapytań. Narzędzia systemu do monitorowania i dostrajania wydajności. Narzędzia systemu do monitorowania i dostrajania wydajności. Do określania porównawczej wydajności różnych systemów służy testowanie wzorcowe w oparciu o standardowe testy wzorcowe.

164 Wydajność systemu Wpływ projektu logicznego bazy danych na wydajność: Normalizacja bazy danych pozwala zwiększyć szybkość modyfikacji danych. Normalizacja bazy danych pozwala zwiększyć szybkość modyfikacji danych. Zbyt duża liczba tabel w bazie danych i konieczność ich łączenia przy operacjach wyszukiwania obniża wydajność. Zbyt duża liczba tabel w bazie danych i konieczność ich łączenia przy operacjach wyszukiwania obniża wydajność. Indeksowanie przyspiesza wyszukiwanie danych. Indeksowanie przyspiesza wyszukiwanie danych. Zbyt duża liczba obsługiwanych indeksów spowalnia pracę. Zbyt duża liczba obsługiwanych indeksów spowalnia pracę. WNIOSEK: Wymagany kompromis i odpowiednio opracowany projekt. Wpływ formułowania zapytań na wydajność: Instrukcje języka nieproceduralnego (np. SQL) muszą być przez system przetłumaczone na ciąg akcji systemu, co jest robione z wykorzystaniem optymalizatora zapytań – użytkownik ma zwykle znikomy wpływ na wydajność w tym względzie. Instrukcje języka nieproceduralnego (np. SQL) muszą być przez system przetłumaczone na ciąg akcji systemu, co jest robione z wykorzystaniem optymalizatora zapytań – użytkownik ma zwykle znikomy wpływ na wydajność w tym względzie. Określanie strategii wyszukiwania w optymalizatorze i dostosowanie jej do logicznego projektu bazy danych. Określanie strategii wyszukiwania w optymalizatorze i dostosowanie jej do logicznego projektu bazy danych. Zawartość biblioteki strategii wyszukiwania (w przeciwnym razie strategia domyślna). Zawartość biblioteki strategii wyszukiwania (w przeciwnym razie strategia domyślna).

165 Wydajność systemu Inne narzędzia do monitorowania i polepszania wydajności (zwykle wykraczające poza zasięg SQL i korzystające z możliwości systemu operacyjnego): Pamięć podręczna – przechowywanie stron indeksów i ostatnio używanych stron danych może zwiększyć wydajność (przy dużej liczbie użytkowników wydajność rośnie ze zmniejszeniem rozmiaru strony). Pamięć podręczna – przechowywanie stron indeksów i ostatnio używanych stron danych może zwiększyć wydajność (przy dużej liczbie użytkowników wydajność rośnie ze zmniejszeniem rozmiaru strony). Dziennik – rezygnacja lub czasowe zawieszenie równoległego zapisywania realizowanych transakcji w dzienniku przyspiesza modyfikowanie danych zwiększając wydatnie wydajność (ryzykowna gra). Dziennik – rezygnacja lub czasowe zawieszenie równoległego zapisywania realizowanych transakcji w dzienniku przyspiesza modyfikowanie danych zwiększając wydatnie wydajność (ryzykowna gra). Monitorowanie planu wykonania – pozwala na podglądnięcie sposobu wykonywania zapytań z wyświetlaniem wartości statystyk kontrolnych (kontrola strategii wykonania, pozwalająca na jej modyfikację lub zmianę projektu logicznego bazy danych). Monitorowanie planu wykonania – pozwala na podglądnięcie sposobu wykonywania zapytań z wyświetlaniem wartości statystyk kontrolnych (kontrola strategii wykonania, pozwalająca na jej modyfikację lub zmianę projektu logicznego bazy danych). Statystyka indeksów – narzędzie do określania wydajności indeksów (wartość minimalna i maksymalna, liczba różnych wartości, częstość wykorzystania, czas przeszukiwania) w celu ich ewentualnej przebudowy lub porządkowania. Statystyka indeksów – narzędzie do określania wydajności indeksów (wartość minimalna i maksymalna, liczba różnych wartości, częstość wykorzystania, czas przeszukiwania) w celu ich ewentualnej przebudowy lub porządkowania. Analiza blokad – stosowanie małych grup danych przez podział tabel na większą liczbę stron (stosowanie mniejszych stron – blokada zakładana jest na poziomie strony) i zmniejszenie w ten sposób rywalizacji blokad. Analiza blokad – stosowanie małych grup danych przez podział tabel na większą liczbę stron (stosowanie mniejszych stron – blokada zakładana jest na poziomie strony) i zmniejszenie w ten sposób rywalizacji blokad.

166 Spójność danych Spójność danych oznacza dokładność i zgodność (poprawność) danych w bazie danych. Wymagania dotyczące spójności są zazwyczaj realizowane różnymi metodami, poprzez: Uniwersalne więzy spójności systemu relacyjnego. Uniwersalne więzy spójności systemu relacyjnego. Dodatkowe więzy spójności systemu relacyjnego. Dodatkowe więzy spójności systemu relacyjnego. Spójność kontrolowana specjalnymi aplikacjami poza systemem zarządzania bazą danych. Spójność kontrolowana specjalnymi aplikacjami poza systemem zarządzania bazą danych. Uniwersalne więzy spójności systemu relacyjnego: Więzy dziedziny. Więzy dziedziny. Spójność encji. Spójność encji. Spójność odwołań. Spójność odwołań.

167 Spójność danych Więzy dziedziny: Określony typ wartości – dziedzina (liczba, ciąg znaków, itp.) – zadawany na poziomie definicji kolumny. Określony typ wartości – dziedzina (liczba, ciąg znaków, itp.) – zadawany na poziomie definicji kolumny. Określona długość łańcucha znaków lub format liczbowy wynikający z definicji na poziomie kolumny. Określona długość łańcucha znaków lub format liczbowy wynikający z definicji na poziomie kolumny. Określony zakres wartości wynikający z definicji dziedziny lub ustalany na poziomie definicji tabeli w klauzuli CHECK. Określony zakres wartości wynikający z definicji dziedziny lub ustalany na poziomie definicji tabeli w klauzuli CHECK. Wartość nieokreślona NULL/NOT NULL (definicja kolumny). Wartość nieokreślona NULL/NOT NULL (definicja kolumny). Jednoznaczność wartości np. UNIQUE (definicja kolumny). Jednoznaczność wartości np. UNIQUE (definicja kolumny). Wartość zgodna z ustalonym wzorcem (np. DEFAULT). Wartość zgodna z ustalonym wzorcem (np. DEFAULT). Spójność encji (więzy klucza głównego): Deklaracja PRIMARY KEY na poziomie definicji kolumny. Deklaracja PRIMARY KEY na poziomie definicji kolumny. Wartości klucza głównego określone NOT NULL. Wartości klucza głównego określone NOT NULL. Wartości klucza głównego jednoznaczne (DISTINCT). Wartości klucza głównego jednoznaczne (DISTINCT).

168 Spójność danych Spójność odwołań – integralność referencyjna (więzy kluczy obcych): Deklaracja FOREIGN KEY – definicja klucza obcego. Deklaracja FOREIGN KEY – definicja klucza obcego. Deklaracja REFERENCES – powiązanie wartości w kolumnie z wartościami w innej kolumnie (tej samej lub innej tabeli) zadawane na poziomie definicji kolumny. Deklaracja REFERENCES – powiązanie wartości w kolumnie z wartościami w innej kolumnie (tej samej lub innej tabeli) zadawane na poziomie definicji kolumny. Wartości klucza obcego są NULL lub występują jako wartości klucza głównego, z którym dany klucz obcy jest powiązany. Wartości klucza obcego są NULL lub występują jako wartości klucza głównego, z którym dany klucz obcy jest powiązany. Kontrolowana aktualizacja lub usuwanie wartości klucza głównego, gdy stanowią one zarazem wartości odpowiadającego mu klucza obcego. Kontrolowana aktualizacja lub usuwanie wartości klucza głównego, gdy stanowią one zarazem wartości odpowiadającego mu klucza obcego. Możliwe odpowiedzi na próbę aktualizacji lub usuwania wartości klucza głównego powiązanej z wartością klucza obcego: Modyfikacja ograniczona – operacja usunięcia lub aktualizacji wartości klucza głównego jest dopuszczana pod warunkiem, że nie istnieją dopasowane wartości klucza obcego. Modyfikacja ograniczona – operacja usunięcia lub aktualizacji wartości klucza głównego jest dopuszczana pod warunkiem, że nie istnieją dopasowane wartości klucza obcego. Modyfikacja kaskadowa – operacja usunięcia lub aktualizacji wartości klucza głównego jest wykonywana automatyczna pociągając modyfikację powiązanych wartości klucza obcego. Modyfikacja kaskadowa – operacja usunięcia lub aktualizacji wartości klucza głównego jest wykonywana automatyczna pociągając modyfikację powiązanych wartości klucza obcego. Ustawienie wartości NULL – przed wykonaniem operacji usunięcia lub aktualizacji wartości klucza głównego pasujące wartości klucza obcego są ustawiane na NULL. Ustawienie wartości NULL – przed wykonaniem operacji usunięcia lub aktualizacji wartości klucza głównego pasujące wartości klucza obcego są ustawiane na NULL.

169 Spójność danych Dodatkowe więzy spójności systemu relacyjnego: Specjalne procedury (procedury, funkcje i pakiety). Specjalne procedury (procedury, funkcje i pakiety). Wyzwalacze bazy danych – zbiór instrukcji SQL opisujących akcję, jaka ma być podjęta w razie modyfikacji danej kolumny, tabeli lub perspektywy (wyzwalacze są przypisane określonej operacji modyfikacji danych i są uruchamiane automatycznie). Wyzwalacze bazy danych – zbiór instrukcji SQL opisujących akcję, jaka ma być podjęta w razie modyfikacji danej kolumny, tabeli lub perspektywy (wyzwalacze są przypisane określonej operacji modyfikacji danych i są uruchamiane automatycznie). Asercje – dodatkowe reguły poprawności. Asercje – dodatkowe reguły poprawności.

170 Spójność danych Składnia instrukcji wyzwalacza: CREATE TRIGGER nazwa_wyzwalacza CREATE TRIGGER nazwa_wyzwalacza ON nazwa_tabeli FOR {INSERT/UPDATE/DELETE} [,{INSERT/UPDATE/DELETE}] … AS instrukcje_SQL [IF UPDATE (nazwa_kolumny) [{AND/OR} UPDATE (nazwa_kolumny)]...] Klauzula ON – określa nazwę tabeli uaktywniającej wyzwalacz (tabela wyzwalacza). Klauzula FOR – określa polecenie modyfikacji tabeli uruchamiające wyzwalacz. Klauzula AS – określa akcje wyzwalacza i warunki wyzwalacza. Instrukcje SQL – określają akcję wyzwalacza. Klauzula IF – określa dodatkowe warunki podjęcia akcji przez wyzwalacz. Składnia wyzwalaczy bardzo różni się w poszczególnych systemach.

171 Spójność danych Wyzwalacz zastępuje właściwe polecenia i jest uruchamiany w celu sprawdzenia jego poprawności. W trakcie wykonywania poleceń wyzwalacza zmieniane dane są przenoszone do dwóch utworzonych w tym celu tabel logicznych, w szczególności: Operacja DELETED – usuwane wiersze z tabeli wyzwalacza są przenoszone do logicznej tabeli o nazwie deleted, której wiersze następnie wyzwalacz bada, by dopuścić lub anulować zmianę. Operacja DELETED – usuwane wiersze z tabeli wyzwalacza są przenoszone do logicznej tabeli o nazwie deleted, której wiersze następnie wyzwalacz bada, by dopuścić lub anulować zmianę. Operacja INSERT i UPDATE – wstawiane lub modyfikowane wiersze z tabeli wyzwalacza są przenoszone do logicznej tabeli o nazwie inserted, której wiersze następnie wyzwalacz bada, by dopuścić lub anulować zmianę. Operacja INSERT i UPDATE – wstawiane lub modyfikowane wiersze z tabeli wyzwalacza są przenoszone do logicznej tabeli o nazwie inserted, której wiersze następnie wyzwalacz bada, by dopuścić lub anulować zmianę.

172 Spójność danych Przykład wyzwalacza: CREATE TRIGGER usun_kaskadowo CREATE TRIGGER usun_kaskadowo ON Pracownicy FOR DELETE AS DELETE Adresy FROM Adresy, delete WHERE Adresy.ID_Prac = delete.ID_Prac DELETE Parking FROM Parking, delete DELETE Parking FROM Parking, delete WHERE Parking.ID_Prac = delete.ID_Prac (wyzwalacz usun_kaskadowo usuwa kaskadowo wartości klucza obcego w tabelach Adresy i Parking identyczne z usuwanymi wartościami klucza głównego w tabeli Pracownicy) Poza wyzwalaczami tabelowymi (programującymi więzy spójności) istnieją też wyzwalacze związane z określonym kontem użytkownika, określoną bazą danych programujące stałe czynności, jakie powinny być wykonane.

173 Spójność danych Asercje – ogólne reguły poprawności Przykłady: Tworzenie asercji: CREATE ASSERTATION maxempl CREATE ASSERTATION maxempl CHECK (1000 <= SELECT COUNT (*) FROM Pracownicy); Usuwanie asercji: DROP ASSERTATION nazwa_asercji; DROP ASSERTATION nazwa_asercji;


Pobierz ppt "Podejście relacyjne Podejście relacyjne opiera się na wykorzystaniu do przedstawiania danych modelu relacyjnego i zarządzania nimi matematycznego modelu."

Podobne prezentacje


Reklamy Google