1
Modyfikacje danych
●
Do modyfikacji danych służą trzy polecenia
●
INSERT
●
Dodawanie danych do tabeli
●
UPDATE
●
Modyfikacja istniejących danych w tabeli
●
DELETE
●
Usunięcie danych z tabeli
●
Podczas dodawania i modyfikacji dane muszą
być zgodne z dziedzinami atrybutów
2
Dodawanie danych INSERT
INSERT INTO
NazwaTabeli
(
lista_kolumn
)
VALUES (
lista_wartości_danych
);
●
NazwaTabeli
– oznacza tabelę bazową lub
modyfikowalną perspektywę
●
lista_kolumn
– lista kolumn tabeli oddzielonych
przecinakami (kilka lub jedna kolumna)
●
lista_wartości_danych
– lista wartości danych
odpowiadających kolejnym atrybutom wymienionym
w liście kolumn
3
Zasady tworzenia użycia INSERT
●
Parametr
lista_kolumn
jest opcjonalny
●
Brak parametru oznacza, że polecenie dotyczy wszystkich
kolumn tabeli
–
Kolejność kolumn określona jest przez kolejność
tworzenia atrybutów
●
Pojawienie się tego parametru oznacza konieczność
podania wartości dla wszystkich wymienionych kolumn
–
Wartości domyślne dla kolumn nie wymienionych na
liście lub wartość nieokreślona (NULL)
●
Liczba parametrów na obu listach musi być identyczna
●
Zgodność dziedzin kolejnych elementów
●
Polecenie nie dokonuje automatycznej konwersji typów
4
Przykłady
INSERT INTO Personel
VALUES ('SG16','Alan','Brown','asystent','M',
DATE '25.05.1957',8300,'B003');
●
Wypisujemy wartości dla wszystkich kolumn
●
Kolejność kolumn zgodna z kolejnością kolumn w
definicji tabeli
INSERT INTO Personel (pracownikNr, imie,
nazwisko, stanowisko, pensja, biuroNr)
VALUES
('SG44','Anne','Jones','asystent',8100,'B003');
5
INSERT - SELECT
●
Kopiowanie wybranych wierszy z innych tabel
●
INSERT INTO NazwaTabeli(
lista_kolumn
)
●
SELECT ....
●
Zapytanie SELECT musi zwracać wynik zgodny
ze schematem wskazanej tabeli
●
Podzapytanie może być złożone
●
Po klauzuli SELECT może pojawić się kilka nazw
●
lista_kolumn oraz wynik działania podzapytania SELECT
podlegają tym identycznym regułom ja k w poleceniu
INSERT
6
SELECT nieruchomoscNr, typ, pokoje, czynsz FROM
Nieruchomosc ORDER BY typ DESC, czynsz DESC;
nieruchomoscNr
typ
pokoje
czynsz
PG16
mieszkanie
4
450
PL94
mieszkanie
4
400
PG36
mieszkanie
3
375
PG4
mieszkanie
3
350
PA14
dom
6
650
PG21
dom
5
600
NieruchomoscCzynsz(
nieruchomoscNr
,
typ
,
pokoje
,
czynsz
);
INSERT INTO NieruchomoscCzynsz
SELECT nieruchomoscNr, typ pokoje, czynsz FROM
Nieruchomosc ORDER BY typ DESC, czynsz DESC;
7
Modyfikacja danych
UPDATE NazwaTabeli
SET nazwa_kolumny=wartosc, ...
[WHERE warunek];
●
Parametr NazwaTabeli może być nazwą tabeli
bazowej lub perspektywy modyfikowalnej
●
Klauzula SET wskazuje kolumny których wartości
muszą być zmienione
●
Klauzula WHERE wybiera wiersze, które mają być
zmodyfikowane
●
Pominięcie klauzuli powoduje modyfikację wszystkich
rekordów
8
Przykłady
●
UPDATE Personel SET pensja = pensja *1.03;
●
Modyfikacja dotyczy wszystkich wierszy, pominięta
została klauzula WHERE
●
UPDATE Personel SET pensja = pensja*1.05
WHERE stanowisko = 'dyrektor';
●
Modyfikacja będzie dotyczyć tylko tych wybranych
rekordów
●
UPDATE Personel SET stanowisko = 'dyrektor',
pensja = 18000 WHERE praconskiNr = 'SG14';
●
Modyfikacja wybranego rekordu
9
Usuwanie danych z tabeli
DELETE FROM
nazwa_tabeli
[WHERE warunek];
●
nazwa_tabeli
oznacza nazwę tabeli bazowej lub
nazwę perspektywy modyfikowalnej
●
Pominięcie klauzuli WHERE oznaczać będzie
usunięcie wszystkich rekordów z tabeli
●
Polecenie bez warunku selekcji nie usuwa samej
tabeli a jedynie zawarte w niej rekordy
●
Umieszczenie warunku selekcji powoduje usunięcie
tylko wybranych rekordów
10
Przykłady
●
DELETE FROM Wizyta;
●
Usuwa wszystkie rekordy z tabeli Wizyta
●
DELETE FROM Wizyta WHERE
nieruchomoscNr = 'PG4';
●
Usuwa tylko rekordy odpowiadające określonej
nieruchomości
●
Klauzula DELETE może zawierać podzapytania
jedynie w sekcji WHERE
●
Podzapytania skalarne
11
Łączenie tabel wynikowych
●
Operacje na zbiorach
●
Suma - UNION, przekrój - INTERSECT, różnica – EXCEPT
(MINUS)
●
Zachowanie schematów
●
Operacje na zbiorach mogą być wykonane w oparciu
o wskazane kolumny lub wszystkie wspólne kolumny
●
CORRESPONDING BY
●
CORRESPONDING
●
Dodanie klauzuli ALL powoduje uwzględnienie
wszystkich wierszy
●
Duplikaty nie są usuwane
12
Suma zbiorów
●
Podaj listę wszystkich miast, w których znajduje się
biuro lub nieruchomość
●
Dane znajdują się w dwóch tabelach Biuro oraz
Nieruchomosc
( SELECT miasto FROM Biuro WHERE Miasto IS NOT NULL )
UNION
( SELECT miasto FROM Nieruchomosc WHERE miasto IS NOT
NULL);
●
Wynik końcowy jest sumą wszystkich wierszy z
pierwszego i drugiego zapytania
●
Duplikaty wierszy są usuwane z wyniku
13
( SELECT * FROM Biuro WHERE miasto IS NOT NULL )
UNION CORRESPONDING BY miasto
( SELECT * FROM Nieruchomość WHERE miasto IS NOT
NULL);
●
Jawne wskazanie kolumny po której odbywać się będzie
sumowanie
●
Wskazane kolumny muszą mieć identyczne dziedziny oraz
nazwy
●
Zmiana nazwy kolumny może być dokonana przez operator AS
●
CORRESPONDING BY miasto
●
Użyte będą wszystkie kolumny posiadające te same nazwy i
schematy
●
Kolejność wyników określona jest przez pierwsze zapytanie
14
Przekrój zbiorów - INTERSECT
●
Wynikiem działania operatora jest tabela zawierająca
wspólne wiersza dwóch tabel
●
Podaj listę wszystkich miast w których znajduje się i
biuro i nieruchomość
( SELECT miasto FROM Biuro)
INTERSECT
( SELECT miasto FROM Nieruchomosc);
●
Obliczenie tabeli pośredniej pierwszego zapytania
●
Obliczenie tabeli pośredniej trzeciego zapytania
●
Utworzenie jednej tabeli wynikowej składającej się z wierszy
występujących w obu wyliczonych tabelach pośrednich
15
(SELECT * FROM Biuro )
INTERSECT CORRESPONDING BY miasto
(SELECT * FROM Nieruchomosc);
●
Powyższe zapytanie może być wykonane również w inny
sposób
SELECT DISTINCT
b.miasto
FROM
Biuro b
,
Nieruchomosc d
WHERE
b.miasto
=
d.miasto
;
SELECT DISTINCT
miasto
FROM
Biuro b
WHERE EXIST
( SELECT * FROM
Nieruchomosc d
WHERE
b.miasto
=
d.miasto
);
16
Różnica zbiorów – EXCEPT (MINUS)
●
Podaj listę wszystkich zbiorów, w których znajduje się
biuro, ale nie ma żadnej nieruchomości
( SELECT miasto FROM Biuro )
EXCEPT
( SELECT miasto FROM Nieruchomosc );
●
Obliczenie tabeli pośredniej za pomocą pierwszego
zapytania
●
Obliczenie drugiej tabeli pośredniej za pomocą
drugiego zapytania
●
Utworzenie tabeli końcowej z wierszy należących do
pierwszej tabeli pośredniej ale nie występuje w drugiej
17
( SELECT * FROM Biuro )
EXCEPT CORRESPONDING BY miasto
( SELECT * FROM Nieruchomosc);
SELECT DISTINCT miasto FROM Biuro
WHERE miasto NOT IN
( SELECT miasto FROM
Nieruchomosc);
SELECT DISTINCT
miasto
FROM
Biuro b
WHERE NOT EXIST
( SELECT * FROM
Nieruchomosc d
WHERE
b.miasto
=
d.miasto
)
;
18
Zapytania dotyczące wielu tabel
●
Podstawą zapytania dla wielu tabel jest
złączenie
●
Operacja złączenia
łączy informacje z dwu (lub kilku)
tabel
, wybierając z nich takie, które w kolumnach
złączenia mają takie
same wartości
●
Złączenia są stosowane, gdy tabela wynikowa
zawierać będzie kolumny z różnych tabel
●
Poszczególne tabele pojawiające się na liście FROM
oddzielamy przecinkami
●
Jeżeli nazwy kolumn w tabelach mogą się powtarzać
stosujemy
aliasy nazw dla tabel
19
Złączenia proste
●
Podaj nazwy klientów, którzy odwiedzili nieruchomości.
Wraz z danymi klienta podaj zgłoszone uwagi
●
Zapytanie dotyczy dwóch tabel
Klient
oraz
Wizyta
●
Obydwie tabele zawierają kolumnę
klientNr
więc
muszą być zastosowane aliasy
●
Jednoznaczne określenie pochodzenia kolumny
SELECT
k.klientNr
,
imie
,
nazwisko
,
nieruchomoscNr
,
uwagi
FROM
Klient k
,
Wizyta w
WHERE
k.klientNr
=
w.klientNr
;
20
●
Jeżeli nazwa kolumny nie jest poprzedzona nazwą tabeli
lub nazwą zastępczą SZBD automatycznie wybierze
odpowiednią tabelę
●
Błędy mogą się pojawić dla identycznych nazw kolumn
●
Wynikiem działania tego zapytania są wiersze obu tabel,
które w kolumnach
klientNr
mają takie same wartości
●
Kolumny te nazywane są
kolumnami złączenia
●
Kolumny złączenia muszą mieć zgodne schematy
21
Złączenie wewnętrzne
●
Złączenie wewnętrzne tworzy kombinację dwóch tabel i
wiąże je na podstawie wartości ich kolumn
●
Kolumny muszą mieć identyczne schematy
tabela_1
INNER JOIN
tabela_2
ON
kolumna_z_tabeli_1
=
kolumna_z_tabeli_2
●
Słowa kluczowe INNER JOIN może być zastąpione
słowem JOIN
●
Zastosowanie klauzuli WHERE dotyczyć będzie całego
złączenia
●
Obliczany jest po dokonaniu złączenia
22
SELECT
klientNr
,
imie
,
nazwisko
,
nieruchomoscNr
,
uwagi
FROM
Klient
INNER JOIN
Wizyta
ON
Klient.klientNr = Wizyta.KlientNr;
●
Do złączenia kolumn można zastosować dowolny
operator
●
<, >, <=, >=, <>,
LIKE
●
Złączenie uzyskane za pomocą operatora = nazywamy
równozłączeniem
●
Operacja złączenia może dotyczyć
kilku tabel
●
Niektóre SZBD wymagają zastosowania nawiasów
ograniczających kolejne złączenie
23
Alternatywne sposoby zapisu
SELECT
klientNr
,
imie
,
nazwisko
,
nieruchomoscNr
,
uwagi
FROM
Klient
INNER JOIN
Wizyta
ON
Klient.klientNr = Wizyta.KlientNr;
SELECT
klientNr, imie, nazwisko, nieruchomoscNr, uwagi
FROM
Klient
INNER JOIN
Wizyta
USNIG
klientNr;
SELECT
klientNr, imie, nazwisko, nieruchomoscNr, uwagi
FROM
Klient
NATURAL JOIN
Wizyta;
24
Wielozłączenia
●
Podaj nazwy klientów, którzy odwiedzili nieruchomości.
Wraz z danymi klienta podaj zgłoszone uwagi oraz datę
rejestracji klienta
SELECT
klientNr
,
imie
,
nazwisko
,
nieruchomoscNr
,
uwagi,
dataRejestracji, biuroNr
FROM
Klient
INNER JOIN
Wizyta
ON
Klient.klientNr
=
Wizyta.KlientNr
INNER JOIN
Rejestracja
ON
Wizyta.klientNr
=
Rejestracja.klientNr
;
25
Złączenie trzech tabel
●
Dla każdego biura podaj numery i nazwiska pracowników,
którzy nadzorują nieruchomości. W wyniku podaj także
miasto, w którym znajduje się biuro, oraz nieruchomości
nadzorowane przez pracownika
●
Tabele: Biuro, Personel, Nieruchomosc
●
Informacje z tabel Biuro i Personel złączone są za pomocą
warunku
Biuro.biuroNr = Personel.biuroNr
●
Połączenie pracownika z biurem w którym pracuje
●
Tabele Personel oraz Nieruchomosc związane są za
pomocą
warunku
Personel.PracownikNr
=
Nieruchomośc.PracownikNr
●
Połączenie pracowników z nadzorowanymi przez nich
nieruchomościami
26
SELECT
b.biuro
,
b.miasto
,
p.pracownikNr
, imie, nazwisko,
nieruchomoscNr
FROM
Biuro b
,
Personel p
,
Nieruchomosc d
WHERE
b.biuroNr
=
p.biuroNr
AND
p.pracownikNr
=
d.pracownikNr
ORDER BY
b.biuroNr
,
p.pracownikNr
,
nieruchomoscNr
;
SELECT
bp.biuro
,
bp.miasto
,
bp.pracownikNr
, imie,
nazwisko, nieruchomoscNr
FROM (
Biuro b
JOIN
Personel p
USING
biuroNr
) AS
bp
JOIN
Nieruchomosc
USING
pracownikNr
;
27
Obliczanie złączenia
●
Każde
złączenie
jest
podzbiorem
iloczynu
kartezjańskiego
dwóch tabel
●
Iloczyn kartezjański
dwóch tabel jest tabelą, która
składa się ze wszystkich możliwych par wierszy z
dwóch tabel składowych
●
Tabela wynikowa zawiera
wszystkie
kolumny
pierwszej i drugiej tabeli iloczynu kartezjańskiego
SELECT [ DISTINCT | ALL ] {
* | lista_kolumn
)
FROM
NazwaTabeli1
CROSS JOIN
NazwaTabeli2
;
28
1.
Utwórz iloczyn kartezjański tabel wymieninych po
klauzuli FROM
2.
Jeżeli istnieje klauzula WHERE, to zastosuj warunek
selekcji dla każdego wiersza iloczynu (pozostają
tylko te wiersze, które spełniają warunek)
3.
Dla pozostałych wierszy ustal wartość każdego
elementu z listy SELECT i wygeneruj jeden wiersz
wyniku
4.
Jeżeli
zastosowano
słowo
DISTINCT,
usuń
powtarzające się wiersze z tabeli wynikowej
5.
Jeżeli występuje klauzula ORDER BY, uporządkuj
tabelę wynikową według podanych kryteriów
29
Złączenia zewnętrzne
●
Złączenia wewnętrzne łączy w pary wiersze z dwóch
tabel jeżeli mają takie same wartości w wybranej
kolumnie
●
Jeżeli wiersz tabeli nie zostanie połączony w parę to nie
trafia do tabeli wynikowej
●
Złączenie zewnętrzne pozwala zachować wiersze nie
spełniające tego warunku
Biuro
biuroNr
miasto
B003
Glasgow
B004
Bristol
B002
Londyn
Nieruchomosc
nieruchomoscNr miasto
PA14
Aberdeen
PL94
Londyn
PG4
Glasgow
30
●
SELECT
b.*
,
d.*
FROM
Biuro b
,
Nieruchomosc d
WHERE
b.miasto
=
d.miasto
;
●
SELECT
b.*
d.*
FROM
Biuro b
INNER JOIN
Nieruchomosc d
ON
b.miasto
=
d.miasto
;
●
Tabela wynikowa ma dwa wiersze, w których występują
takie same miasta
●
Nie istnieje wiersz z miastem Bristol i Aberdeen
●
W celu włączenia tych wierszy należy zastosować
złączenia zewnętrzne
–
Lewostronne, prawostronne, pełne
biuroNr
miasto
nieruchomoscNr miasto
B003
Glasgow
PG4
Glasgow
B002
Londyn
PL94
Londyn
31
Lewostronne złączenie zewnętrzne
●
Złączenie lewostronne pozwala uwzględnić w wyniku
również te wiersze, które nie mają swojego
odpowiednika w drugiej tabeli
●
Zawsze uwzględnione zostaną wiersze z lewej tabeli
●
SELECT
b.*
,
d.*
FROM
Biuro b
LEFT JOIN
Nieruchomosc d
ON
b.miasto
=
d.miasto
;
biuroNr
miasto
nieruchomoscNr miasto
B003
Glasgow
PG4
Glasgow
B002
Londyn
PL94
Londyn
B004
Bristol
NULL
NULL
32
Prawostronne złączenie zewnętrzne
●
W wyniku uwzględniane są wszystkie wiersze
znajdujące się w prawej tabeli złączenia
●
SELECT
b.*
,
d.*
FROM
Biuro b
RIGHT JOIN
Nieruchomosc d
ON
b.miasto
=
d.miasto
;
biuroNr
miasto
nieruchomoscNr miasto
B003
Glasgow
PG4
Glasgow
B002
Londyn
PL94
Londyn
NULL
NULL
PA14
Abredeen
Biuro
biuroNr
miasto
B003
Glasgow
B004
Bristol
B002
Londyn
Nieruchomosc
nieruchomoscNr miasto
PA14
Aberdeen
PL94
Londyn
PG4
Glasgow
33
Pełne złączenie zewnętrzne
●
Pełne złączenie wewnętrzne umożliwia uwzględnienie
wszystkich niedopasowanych wierszy, zarówno z
lewej
jak i
prawej
tabeli złączenia
●
SELECT
b.*
,
d.*
FROM
Biuro b
FULL JOIN
Nieruchomosc d
ON
b.miasto
=
d.miasto
;
biuroNr
miasto
nieruchomoscNr miasto
B003
Glasgow
PG4
Glasgow
B002
Londyn
PL94
Londyn
NULL
NULL
PA14
Abredeen
B004
Bristol
NULL
NULL