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. 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”.
Między innymi system w pełni relacyjny musi: Reprezentować całą informację zawartą w bazie w postaci tabel. 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. 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. 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.
Postulaty Codda dla relacyjnej bazy danych (1985 rok) Postulat informacyjny: na poziomie logicznym dane są reprezentowane wyłącznie za pomocą tabel. Postulat dostępu: do każdej pojedynczej danej jest dostęp za pomocą tabel, kolumn i wartości kluczy głównych. 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.
Postulaty Codda dla relacyjnej bazy danych (1985 rok) 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. 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) Postulat modyfikowania bazy danych przez perspektywy: system umożliwia modyfikowanie danych za pomocą perspektyw, w przypadku gdy taka modyfikacja jest semantycznie sensowna. 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. 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) Logiczna niezależność danych: zmiany w tabelach zachowujące informacje i dopuszczalne semantycznie nie mają wpływu na aplikacje. 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) 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). 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).
Model relacyjny - wszystko jest tabelą Postulat 1. Model relacyjny - wszystko jest tabelą Tabela podzielona jest na poziome wiersze i pionowe kolumny. Alternatywne pojęcia (niemal synonimy): Tabela – relacja – plik. Wiersz – krotka (wystąpienie encji) – rekord. Kolumna – atrybut (właściwość) – pole.
Postulat 1. 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 systemowe (katalog, słownik systemu) – czwarte prawo Codda.
Wartość nieokreślona (null) 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.
Język wysokiego poziomu 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). Definiowanie danych. Administrowanie danymi. Każda operacja języka wyrażona jest instrukcją lub poleceniem. Operacje wyszukiwanie nazywane są często zapytaniami.
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). Wybór – wybór wierszy (określa podzbiór wierszy). Złączanie – utworzenie jednej tabeli wynikowej na podstawie kilku tabel bazowych.
Różne sposoby oglądania danych 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).
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ń. Użytkownik uprzywilejowany – właściciel baz danych lub obiektów bazodanowych (osoba tworząca te obiekty). Administrator systemu (administrator bazy danych).
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). Logiczna niezależność danych (reprezentacja danych widziana przez użytkownika jest niezależna od programów użytkowych).
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ęść). 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. Dodatkowe ograniczenia (np. wyzwalacze).
Strukturalny (Standardowy) Język Zapytań SQL Strukturalny (Standardowy) Język Zapytań
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). 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).
Składnia języka SQL 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. Nawiasy okrągłe są częścią składni języka SQL. Instrukcja SQL wymaga użycia znaku końca (zazwyczaj średnik).
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 tabel wewnątrz bazy danych. Wypełnienia tabel (pracy z tabelami).
Utwórz (schemat) bazę danych (ewentualnie dodatkowe opcje) Tworzenie bazy danych Utwórz (schemat) bazę danych (ewentualnie dodatkowe opcje) CREATE DATABASE nazwa_bazy_danych; CREATE SCHEMA nazwa_bazy_danych; Przykład: CREATE DATABASE Firma;
Wybierz (domyślną) bazę danych Używanie bazy danych Wybierz (domyślną) bazę danych USE nazwa_bazy_danych; DATABASE nazwa_bazy_danych; Przykład: USE Firma;
Pokaż dostępne bazy danych Używanie bazy danych Pokaż dostępne bazy danych SHOW DATABASES; Usuń bazę danych DROP nazwa_bazy_danych; Przykład: DROP Firma;
Używanie bazy danych 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).
Tworzenie tabeli Tworzenie tabeli co najmniej obejmuje: Nadanie nazwy tabeli. Nadanie nazw kolumnom tworzącym tabelę. 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). Wprowadzenie danych.
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 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. Ustanowienie więzów sprawdzających zależności między kluczami głównymi i obcymi.
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.
Tworzenie tabeli 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: 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. TEXT, LONGTEXT – odpowiednio krótki lub długi łańcuch tekstu.
Tworzenie tabeli 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: 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. BLOB – mały „wielki obiekt binarny”. LONGBLOB – wielki „wielki obiekt binarny”. Całkowite typy danych – przechowujące tylko liczby całkowite; przykłady identyfikatorów: NUMBER, INTEGER. TINYINT, SMALLINT, INT, BIGINT.
Tworzenie tabeli Rodzaje typów danych (cd): Dziesiętne typy danych – przechowujące liczby z częściami ułamkowymi; przykłady identyfikatorów: DECIMAL, NUMERIC(p,s) – format stałopozycyjny. FLOAT, DOUBLE – format zmiennopozycyjny (przybliżony). Walutowe typy danych – przechowujące wartości walutowe; przykład identyfikatora: MONEY.
Tworzenie tabeli Rodzaje typów danych (cd): Typy danych daty i czasu – przechowujące datę, czas oraz ich kombinację; przykłady identyfikatorów: DATE – data w ustalonym formacie. TIME – czas w ustalonym formacie. DATETIME – data i czas 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).
Tworzenie tabeli Tworzenie 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 Przykład: 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 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 ( Grupa Number(2) PRIMARY KEY, Dolne Number(8,2) NOT NULL, Górne Number(8,2) NOT NULL, CHECK (Dolne < Górne));
Tworzenie tabeli więzy spójności: PRIMARY KEY – klucz główny REFERENCES nazwa_tabeli (nazwa_kolumny) – związek między kluczem obcym i kluczem głównym FOREIGN KEY – klucz obcy NULL – dozwolona wartość nieokreślona NOT NULL – niedozwolona wartość nieokreślona UNIQUE – klucz jednoznaczny (bez powtórzeń) DEFAULT – definiuje wartość domyślną CHECK – sprawdź warunek
Zmiana schematu tabeli Operacje na tabelach Usuwanie tabeli DROP TABLE nazwa_tabeli; Przykład: DROP TABLE Pracownicy; Zmiana schematu tabeli ALTER TABLE nazwa_tabeli ADD [COLUMN] def_kolumny; ALTER TABLE Pracownicy ADD COLUMN Pesel Char(8); ALTER TABLE Pracownicy ADD Pesel Char(11);
Operacje na tabelach Wyświetlanie dostępnych tabel SHOW TABLES; Wyświetlanie struktury tabeli DESCRIBE nazwa_tabeli; Przykład: DESCRIBE Pracownicy;
Operacje na tabelach Zakładanie indeksów CREATE [UNIQUE] INDEX nazwa_indeksu ON nazwa_tabeli (kolumna [ASC/DESC],...); Przykład: CREATE UNIQUE INDEX Ind_prac_num ON Pracownicy (Pesel); 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 Ind_prac_num;
Operacje na tabelach Wstawianie danych INSERT INTO nazwa_tabeli VALUES (wartość,...); INSERT INTO nazwa_tabeli (nazwa_kolumny,...) Przykład: INSERT INTO Pracownicy VALUES (9901, ’Kowalski’, ‘SALESMAN’, 9345, ’23-01-90’, 300, 100, 12); INSERT INTO Pracownicy (Id_pracownika, Nazwisko) VALUES (9901, ’Kowalski’);
Operacje na tabelach Modyfikowanie danych UPDATE nazwa_tabeli SET nazwa_kolumny=wyrażenie,... [WHERE warunek]; Przykład: UPDATE Pracownicy SET Zarobki = Zarobki*1,1 WHERE Stanowisko = ‘SALESMAN’; Klauzula SET określa kolumny i zmieniane wartości. Klauzula WHERE określa wiersze, w których ma dojść do zmiany.
(brak WHERE spowoduje usunięcie wszystkich wierszy) Operacje na tabelach Usuwanie danych DELETE FROM nazwa_tabeli [WHERE warunek]; (brak WHERE spowoduje usunięcie wszystkich wierszy) Przykład: DELETE FROM Pracownicy WHERE Stanowisko IS NULL;
Wprowadzanie danych do tabeli z pliku zewnętrznego (np. MySQL) Operacje na tabelach Wprowadzanie danych do tabeli z pliku zewnętrznego (np. MySQL) LOAD DATA LOCAL INFILE ”nazwa_pliku” INTO TABLE nazwa_tabeli; Przykład: LOAD DATA LOCAL INFILE “Pracownicy.txt” INTO TABLE Pracownicy; UWAGA: Polecenie to nie jest częścią standardu języka SQL.
Operacje na tabelach Tworzenie tabeli z innej tabeli CREATE TABLE nazwa_tabeli SELECT ... Przykład: CREATE TABLE Osoby SELECT Nazwisko FROM Pracownicy; Tworzenie tabeli tymczasowej (np. MySQL) CREATE TEMPORARY TABLE nazwa_tabeli [TYPE = HEAP] SELECT … CREATE TEMPORARY TABLE nazwa SELECT nazwa FROM c;
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]; Rezygnacja ze zmian w bazie danych ROLLBACK [WORK];
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. Wstawianie, modyfikowanie i usuwanie danych w kolumnach indeksowanych trwa dłużej o czas przebudowy indeksu.
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ę często używaną zgodnie z porządkiem sortowania. Kolumny regularnie wykorzystywane przy złączeniach. Kolumny często przeszukiwane. Czego nie należy indeksować: Kolumny, do których zapytania rzadko się odwołują. Kolumny o małej liczbie różnych wartości (np. Tak/Nie). Kolumny w małych tabelach (np. o kilku wierszach).
Indeksy (indeksowanie) Rodzaje indeksów: 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 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 niezgrupowane – indeksy, które nie są zgrupowane.
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. 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).
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). 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).
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).
(wybiera kolumny Nazwisko, Zarobki i Stanowisko z Pracownicy) SQL – zapytania proste Wybór określonych kolumn i wierszy z tabeli (tabel) SELECT [ALL/DISTINCT] nazwa_kolumny,... FROM nazwa_tabeli (nazwy_tabel) [WHERE warunki wyszukiwania]; Przykłady: SELECT Nazwisko, Zarobki, Stanowisko FROM Pracownicy; (wybiera kolumny Nazwisko, Zarobki i Stanowisko z Pracownicy)
(wybiera wszystkie kolumny z tabeli Pracownicy – klauzula *) SQL – zapytania proste Przykłady cd.: SELECT * FROM Pracownicy; (wybiera wszystkie kolumny z tabeli Pracownicy – klauzula *) 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 (wybiera kolumnę Kierownik z tabeli Pracownicy odrzucając powtarzające się wiersze – klauzula DISTINCT)
(wybiera dwie kolumny z połączonych dwóch tabel) SQL – zapytania proste Przykłady cd.: 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 FROM Pracownicy, Adresy WHERE Pracownicy.Id_Pracownika = Adresy.Id_Pracownika; (wybiera dwie kolumny z połączonych dwóch tabel)
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_kolumny Nazwa_bazy_danych.Nazwa_perspektywy.Nazwa_kolumny Warunek złączenia tabel podawany jest w klauzuli WHERE.
SQL – zapytania proste Przetwarzanie wartości w kolumnach i stosowanie aliasów (synonimów, nazw zastępczych) 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 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 FROM Pracownicy (identyfikator pracownika będzie posiadał nowy nagłówek)
Przetwarzanie wartości w kolumnach i stosowanie aliasów SQL – zapytania proste Przetwarzanie wartości w kolumnach i stosowanie aliasów Przykłady ciąg dalszy: 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 (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 ”)
Przetwarzanie wartości w kolumnach i stosowanie aliasów SQL – zapytania proste Przetwarzanie wartości w kolumnach i stosowanie aliasów Przykłady ciąg dalszy: 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)
SQL – zapytania proste Operatory arytmetyczne możliwe do stosowania w wyrażeniach: * mnożenie. / dzielenie. + dodawanie. - odejmowanie. % 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.
Operatory do stosowania w klauzuli WHERE: SQL – zapytania proste Operatory do stosowania w klauzuli WHERE: Operatory porównania – relacji (=, <, >, <=, >=, !=, <>). Operatory logiczne (AND, OR, NOT) – najniższy priorytet. Operatory przedziałów (BETWEEN, NOT BETWEEN). Operatory listy (IN, NOT IN). Operatory wartości nieznanej (IS NULL, IS NOT NULL). Operatory zgodności znakowej (LIKE, NOT LIKE, ESCAPE). (nawiasy okrągłe pozwalają zmienić kolejność interpretacji)
przykłady użycia operatorów: SQL – zapytania proste przykłady użycia operatorów: WHERE Stawka > 20; WHERE Stawka > 15 AND Stawka < 20; WHERE Stawka BETWEEN 15 AND 20; WHERE Miasto IN (‘Krosno’, ‘Rzeszów’); WHERE Stanowisko IS NOT NULL; WHERE Nazwisko LIKE ‘Ko%’ OR Kod_Działu LIKE ‘A_’; WHERE Nazwa LIKE ‘@_A%’ ESCAPE @; (% dowolny ciąg znaków lub jego brak, _ dowolny jeden znak)
SQL – inne metody wyboru Wyszukiwanie z sortowaniem 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ę 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)
SQL – inne metody wyboru przykłady SELECT Nazwisko, Imię FROM Pracownicy ORDER BY Nazwisko, Imię; SELECT Nazwisko, Imię, Kod_działu 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 ORDER BY 3 DESC, Nazwisko;
SQL – inne metody wyboru Przykłady: 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
SQL – inne metody wyboru Przykłady: SELECT [ALL] Kod_działu, Imię FROM Pracownicy; (opcja ALL jest wartością domyślną) SELECT DISTINCT Kod_działu, Imię (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ę 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 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ę FROM Pracownicy; (opcja ALL jest wartością domyślną) SELECT DISTINCT Kod_działu, Imię (opcje dotyczą całego wiersza, a nie wartości w poszczególnych kolumnach – kody działów będą się powtarzać dla różnych imion)
SQL – inne metody wyboru Przykłady: 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.
SQL – inne metody wyboru Funkcje agregujące (dotyczące zbioru wierszy) 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. 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.
SQL – inne metody wyboru Dostępne funkcje agregujące: COUNT(*) – liczba wybranych wierszy. MAX(wyrażenie) – największa 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 FROM Pracownicy; (znajduje sumę pensji pracowników i ją podaje pod nazwą Total)
SQL – inne metody wyboru Przykłady: 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(*) FROM Pracownicy; (znajduje liczbę wszystkich pracowników mających stanowisko NOT NULL i liczbę wszystkich wierszy, czyli wszystkich pracowników) SELECT COUNT(*) WHERE Kod_działu = ‘AD’; (znajduje liczbę pracowników administracji)
SQL – inne metody wyboru Przykłady: 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.
SQL – grupowanie danych 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) 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)
SQL – grupowanie danych Przykłady: 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(*) 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)
SQL – grupowanie danych Przykłady: SELECT Stanowisko, COUNT(Stanowisko) FROM Pracownicy GROUP BY Stanowisko; SELECT Kod_działu 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 FROM Pracownicy;
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 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) WHERE Plec = ‘K’ (na grupy dzielone są tylko te wiersze, które spełniają warunek podany w klauzuli WHERE, czyli dotyczące kobiet)
SQL – grupowanie danych Przykłady: 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 FROM lista_tabel [WHERE warunki] [GROUP BY lista_grupowania] [HAVING warunek] [ORDER BY lista_porządkowania];
SQL – grupowanie danych Przykłady: 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(*) GROUP BY Miasto HAVING Miasto LIKE ‘W%’; (inny przykład warunku w klauzuli HAVING)
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 FROM Pracownicy WHERE Plec = ‘K’ GROUP BY Kod_działu HAVING COUNT(*) > 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)
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 niejawne (warunek złączenie określony w instrukcji SELECT w klauzuli WHERE). Złączanie wyrażane w postaci niejawnej 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;)
SQL – złączanie tabel Przykłady: 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) 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).
SQL – złączanie tabel Przykłady: 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). 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 FROM Pracownicy p, Adresy a WHERE p.Id_Pracownika = a.Id_Pracownika; (stosowanie aliasów ułatwia pisanie i zwiększa przejrzystość)
SQL – złączanie tabel Przykłady: 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 (złączeniem naturalnym bez powtarzania kolumn łączących)
SQL – złączanie tabel Przykłady: 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 ... WHERE ... AND NOT p1.Id_Pracownika = p2.Id_Pracownika; (równoważne zapisanie warunku z poprzedniego przykładu)
SQL – złączanie tabel Przykłady: 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 FROM Pracownicy, Działy WHERE Pracownicy.Kod_działu = Działy.Kod_działu; (połączenie tabel w celu uzyskania nazwy działu)
SQL – złączanie tabel Przykłady: 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 FROM Pracownicy, Zaszeregowania WHERE Zarobki BETWEEN Dolne AND Górne; (przy łączeniu można użyć dowolny operator porównania)
SQL – złączanie tabel Przykłady: 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) GROUP BY Działy.Kod_działu HAVING COUNT(*) >= 5; (grupowanie wierszy w połączonej tabeli z klauzulą HAVING)
Złączanie zewnętrzne (ukazanie tła złączenia) 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 drugiej (prawej) tabeli.
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 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)
SQL – operacje na wynikach zapytań Możliwe operacje na zbiorach z wynikami zapytań: UNION, UNION ALL – sumowanie zbiorów INTERSECT – przecięcie (część wspólna) zbiorów EXCEPT, MINUS – różnica zbiorów Składnia operacji na wynikach zapytań: 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.
SQL – operacje na wynikach zapytań Instrukcja_SELECT UNION Instrukcja_SELECT Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = ‘AD’ UNION WHERE Kod_działu = ‘KW’; (tabela wynikowa będzie sumą obu tabel)
SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = ‘AD’ UNION SELECT Imię, Nazwisko WHERE Kod_działu = ‘KW’; (nagłówek tabeli wynikowej określa pierwsze zapytanie; liczba wyprowadzanych elementów i ich typy muszą być zgodne)
SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = ‘AD’ UNION 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)
SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = ‘AD’ UNION ALL FROM Filia WHERE Kod_działu = ‘AD’; (operator UNION domyślnie oznacza eliminację powtarzających się wierszy; opcja ALL pozostawia powtórzenia wierszy)
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 WHERE Kod_działu <> ‘AD’; (zapytań tych nie dałoby się zapisać inaczej w jednym zapytaniu)
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)
SQL – operacje na wynikach zapytań Przykłady: SELECT Nazwisko, Imię FROM Pracownicy WHERE Kod_działu = ‘AD’ INTERSECT 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.
Podzapytania (zapytania zagnieżdżone) to zapytania w zapytaniach. 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. W instrukcjach INSERT, UPDATE lub DELETE. 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). Nieskorelowane (podzapytanie wewnętrzne wykonuje niezależnie swoje operacje i zwraca wynik do zapytania zewnętrznego).
Podzapytania i złączenia: 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. 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). Podzapytania są lepsze, gdy należy porównywać wartości. W przypadku samozłączenia obie metody mogą być stosowane alternatywnie.
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 pojedynczą wartość (wprowadzone za pomocą niezmodyfikowanego operatora porównania). Podzapytania będące testem na istnienie (wprowadzone za pomocą EXISTS (NOT EXISTS)).
SQL – podzapytania Przykład podzapytania zagnieżdżonego: SELECT [ALL/DISTINCT] lista_wyboru FROM lista_tabel WHERE {wyrażenie {[NOT] IN/operator_porównania [ANY/ALL]} /[NOT] EXISTS} (SELECT lista_wyboru_podzapytania WHERE warunki) [GROUP BY lista_grupowania [HAVING warunki]] [ORDER BY lista_porządkowania]
Kwalifikowanie nazw kolumn: 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 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.
Reguły rządzące podzapytaniami: 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 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.
Reguły rządzące podzapytaniami: 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 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ń).
SQL – podzapytania Podzapytania zwracające zero lub więcej wartości (IN, NOT IN, ANY, ALL) 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]
SQL – podzapytania Przykłady: 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; (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 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)
SQL – podzapytania Przykłady: 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 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 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)
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 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)
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.
SQL – podzapytania Przykłady: 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 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 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)
SQL – podzapytania Przykłady: 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’); (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 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)
SQL – podzapytania Przykłady: 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 (wyprowadzi nazwiska wszystkich dostawców o statusie równym statusowi któregoś z dostawców z siedzibą w Paryżu)
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.
Podzapytania zwracające jedną wartość 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]
SQL – podzapytania Przykłady: 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 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.
SQL – podzapytania Przykłady: 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 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)
Podzapytania sprawdzające istnienie 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.
Składnia zapytań ze słowem EXISTS (NOT EXISTS) 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. Lista wyboru podzapytania prawie zawsze jest gwiazdką. Warunki podzapytania są wyrażone w klauzuli WHERE.
SQL – podzapytania Przykłady: 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 id_d FROM dc); (wynik jak poprzednio przy użyciu innego operatora)
SQL – podzapytania Przykłady: 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).
Podzapytania zagnieżdżone na wielu poziomach 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 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)
Podzapytania w instrukcjach UPDATE, DELETE i INSERT 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’); (zwiększa o 20% pensję wszystkich pracowników z Warszawy) DELETE Pracownicy WHERE Id_pracownika IN (SELECT Id_pracownika FROM Adresy WHERE Miasto = ‘Warszawa’); (usuwa pracowników zamieszkałych w Warszawie)
SQL – podzapytania Przykłady: 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.
Tworzenie perspektywy: 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;
SQL – perspektywy Przykłady definicji perspektyw: 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 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)
SQL – perspektywy Przykłady użycia perspektyw: 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; (wybiera określonych urzędników) CREATE VIEW Prac_sprzedaży AS SELECT * WHERE Id_działu = 20; UPDATE Prac_sprzedaży SET Zarobki = Zarobki * 1,1; (zmienia zarobki pracownikom sprzedaży)
SQL – perspektywy Przykłady użycia perspektyw: 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) VALUES (5600, ‘Nowiński’, 20); (dodaje nowego pracownika)
Usuwanie perspektywy: SQL – perspektywy Usuwanie perspektywy: DROP VIEW nazwa_perspektywy; Przykłady: DROP VIEW Pracownicy_administracji; 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.
Umożliwiają alternatywne spojrzenie na dane (ułatwiają pracę). 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) Adresy (numery pracowników i adresy). Działy (kody i nazwy działów oraz numery kierowników).
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 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 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).
SQL – perspektywy Perspektywa może stanowić: Proste ograniczenie tabeli (wybór kolumn i wierszy z jednej tabeli). Tabelę z kolumnami obliczanymi (np. funkcje agregujące). Tabelę będącą wynikiem złączenia tabel. Tabelę będącą wynikiem zapytań zagnieżdżonych. Połączenie wymienionych przypadków. Perspektywę można utworzyć na podstawie tabel bazowych lub innych perspektyw. Zalety perspektyw: Uproszczenie pracy. Dostosowanie danych. Skupienie uwagi. Bezpieczeństwo. Niezależność danych (od modyfikacji struktury bazy danych).
Zasada działania perspektyw: SQL – perspektywy Zasada działania perspektyw: 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. 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.
Nazewnictwo kolumn w perspektywie: 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. 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. 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. 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.
SQL – perspektywy Przykłady: 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 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)
Perspektywa z opcją sprawdzania CHECK 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 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ę)
SQL – perspektywy Przykłady: 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 AS SELECT * FROM Pracownicy WHERE Zarobki = 0 OR Zarobki IS NULL UPDATE Pracownicy_na_urlopie_bezpłatnym SET Zarobki = 10000 WHERE Nazwisko = ‘Kowalski’; (modyfikacja odrzucona, ponieważ warunek nie jest spełniony)
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).
SQL – perspektywy Problemy (błędy) rozwiązania perspektywy: Brak odpowiednich tabel lub perspektyw, lub ich niewłaściwa struktura. Brak odpowiednich kolumn. Pojawienie się nowozdefiniowanych kolumn w tabelach bazowych (gdy w definicji perspektywy lub podzapytaniu występuje *). 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.
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. 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 perspektyw nie podlegających modyfikacji, występujące w klauzuli FROM albo w podzapytaniu. 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.
SQL – perspektywy Przykłady: 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 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)
SQL – perspektywy Przykłady: CREATE VIEW ddcc AS SELECT * FROM d, dc, c WHERE d.Id_d = dc.Id_d AND c.Id_c = dc.Id_c; WHERE d.miasto = c.miasto; 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)
Tworzenie tabeli z kopią danych 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 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’; (utworzy tabelę z informacjami o pracownikach Administracji) SELECT * INTO Dane_osobowe FROM Pracownicy WHERE 1 > 1; (zdefiniuje strukturę tabeli z informacjami o pracownikach – bez danych, ponieważ warunek jest zawsze fałszywy)
Zarządzanie bazą danych w świecie rzeczywistym obejmuje: SQL – zarządzanie BD Zarządzanie bazą danych w świecie rzeczywistym obejmuje: 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). Zapewnienie spójności danych. Zapewnienie wydajności przetwarzania.
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. 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. Dwa ostatnie elementy bezpieczeństwa zakładają, że system bazodanowy ma sposoby na przetestowanie użytkownika, czyli rozpoznanie i sprawdzenie jego tożsamości.
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). 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. Rodzaje użytkowników systemów baz danych: Nadzorca systemu, administrator systemu, baz danych (specjalnie uprzywilejowany użytkownik). Właściciel obiektów bazodanowych (specjalnie uprzywilejowany użytkownik). Zwykły użytkownik (użytkownik nieuprzywilejowany). Informacja o użytkownikach i ich uprawnieniach jest przechowywana w słowniku bazy danych.
SQL – bezpieczeństwo danych Perspektywy jako narzędzie bezpieczeństwa: Ograniczenie dostępu do podzbioru wierszy tabeli bazowej. Ograniczenie dostępu do podzbioru 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 statystycznego podsumowania danych z tabeli bazowej. Ograniczenie dostępu do podzbioru innej perspektywy lub kombinacji perspektyw i tabel bazowych.
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ń} ON {nazwa_tabeli [(lista_kolumn)]/ nazwa_perspektywy [(lista_kolumn)]} TO {PUBLIC/lista_użytkowników} [WITH GRANT OPTION] GRANT {ALL/lista_uprawnień [(lista_kolumn)]} ON {nazwa_tabeli/nazwa_perspektywy}
SQL – odbieranie uprawnień Odbieranie uprawnień (w różnych systemach różna postać): 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)]} ON {nazwa_tabeli/nazwa_perspektywy} 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.
Lista nadawanych uprawnień: SQL – uprawnienia Lista nadawanych uprawnień: ALL (ALL PRIVILEGES) – wszystkie możliwe uprawnienia dotyczące danego obiektu bazodanowego (występuje zawsze). SELECT – wybieranie informacji (występuje zawsze). UPDATE – aktualizacja informacji (występuje zawsze). DELETE – usuwanie 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). ALTER – prawo do modyfikowania struktury (rzadziej obecne). INDEX – prawo do indeksowania (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.
Lista użytkowników (klauzula TO): SQL – uprawnienia Lista użytkowników (klauzula TO): PUBLIC – wszyscy użytkownicy danego systemu baz danych. Konkretne nazwy użytkowników. Nazwa grupy 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).
SQL – nadawanie uprawnień Przykłady: 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; (odbieramy Basi uprawnienia do aktualizacji kolumn Nazwisko i Imię w tabeli Pracownicy) GRANT SELECT, UPDATE, INSERT, DELETE ON Pracownicy TO Maria, Basia; ON Pracownicy (Nr, Nazwisko, Imię, Stanowisko, Dział) TO Tomek, Jurek, Krzysiek; GRANT SELECT ON Pracownicy (Stawka, Czas, Pensja)
SQL – nadawanie uprawnień Przykłady: -------------------lub alternatywnie--------------------- GRANT SELECT, UPDATE, INSERT, DELETE (ew. ALL) ON Pracownicy TO Maria, Basia, Tomek, Jurek, Krzysiek; 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)
SQL – nadawanie uprawnień Przykłady: CREATE VIEW Prac_ad AS SELECT * FROM Pracownicy WHERE Kod_działu = ‘AD’; GRANT SELECT, UPDATE, INSERT, DELETE (ew. ALL) ON Prac_ad TO Maria, Basia, Tomek, Jurek, Krzysiek; REVOKE UPDATE, INSERT, DELETE ON Prac_ad (Stawka, Czas, Pensja) TO Tomek, Jurek, Krzysiek; 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ń)
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ń} ON {nazwa_tabeli [(lista_kolumn)]/ nazwa_perspektywy [(lista_kolumn)]} TO nazwa_użytkownika@adres_sieciowy IDENTIFIED BY hasło [WITH GRANT OPTION]
SQL – nadawanie uprawnień Przykłady: GRANT ALL ON Pracownicy TO Basia@ks.firma.com IDENTIFIED BY “Księgowa”; (logowanie z określonego hosta) TO Basia IDENTIFIED BY “Księgowa”; (logowanie z dowolnego hosta)
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; Usuwanie użytkowników: DROP USER nazwa_użytkownika; Przykłady: CREATE USER Basia IDENTIFIED BY „Księgowa”; (utworzy użytkownika o nazwie Basia i przypisze mu hasło) DROP USER Basia; (usunie użytkownika Basia)
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). RESOURCE (uprawnienia do ładowania bazy danych). DBA (uprawnienia administratora bazy danych). Tworzenie ról (np. ORACLE): CREATE ROLE nazwa_roli;
SQL – nadawanie uprawnień Przykłady tworzenia i wykorzystania ról: CREATE ROLE Dyrektor; CREATE ROLE Urzędnik; (utworzenie roli Dyrektor i Urzędnik) GRANT SELECT ON Pracownicy TO Dyrektor; GRANT SELECT, UPDATE ON Pracownicy TO Urzędnik; (nadanie uprawnień roli Dyrektor i Urzędnik) GRANT Dyrektor TO King, Leon; GRANT Urzędnik TO Liza, Ewa, Marta; (nadanie uprawnień poszczególnych ról konkretnym użytkownikom)
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ę.
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 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).
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. Zakończone transakcje, ale nie przepisane z bufora systemu do fizycznej bazy danych powinny zostać zaniechane.
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 instrukcja SQL COMMIT/ROLLBACK instrukcja transakcji
Zarządzanie transakcjami Instrukcją rozpoczynającą transakcję może być: BEGIN TRANSACTION BEGIN WORK Instrukcją kończącą transakcję może być: COMMIT TRANSACTION/WORK – zatwierdzenie 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.
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 TRANSACTION – kopia zapasowa dziennika transakcji. Odtwarzania bazy na podstawie kopii zapasowych: LOAD DATABASE – odtwarzanie bazy danych. LOAD TRANSACTION – odtwarzanie dziennika transakcji. Po uruchomieniu instrukcji LOAD system automatycznie uruchamia proces odtwarzania danych.
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. Obsługi dużej liczby użytkowników. 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. Odpowiedni sposób formułowania zapytań. 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.
Wydajność systemu Wpływ projektu logicznego bazy danych na wydajność: 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ść. Indeksowanie przyspiesza wyszukiwanie danych. 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. Określanie strategii wyszukiwania w optymalizatorze i dostosowanie jej do logicznego projektu bazy danych. Zawartość biblioteki strategii wyszukiwania (w przeciwnym razie strategia domyślna).
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). 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). 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.
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. Dodatkowe więzy spójności systemu relacyjnego. Spójność kontrolowana specjalnymi aplikacjami poza systemem zarządzania bazą danych. Uniwersalne więzy spójności systemu relacyjnego: Więzy dziedziny. Spójność encji. Spójność odwołań.
Spójność danych Więzy dziedziny: 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ś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). Jednoznaczność wartości np. UNIQUE (definicja kolumny). Wartość zgodna z ustalonym wzorcem (np. DEFAULT). Spójność encji (więzy klucza głównego): Deklaracja PRIMARY KEY na poziomie definicji kolumny. Wartości klucza głównego określone NOT NULL. Wartości klucza głównego jednoznaczne (DISTINCT).
Spójność danych Spójność odwołań – integralność referencyjna (więzy kluczy obcych): 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. 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. 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 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.
Spójność danych Dodatkowe więzy spójności systemu relacyjnego: 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). Asercje – dodatkowe reguły poprawności.
Spójność danych Składnia instrukcji 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.
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 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ę.
Spójność danych Przykład wyzwalacza: 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 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.
Asercje – ogólne reguły poprawności Spójność danych Asercje – ogólne reguły poprawności Przykłady: Tworzenie asercji: CREATE ASSERTATION maxempl CHECK (1000 <= SELECT COUNT (*) FROM Pracownicy); Usuwanie asercji: DROP ASSERTATION nazwa_asercji;