3 Bazy danych SQL cz 2 wykład

background image

1

Język SQL – cz.2

konspekt wykładu


1. Złączenia tabel


Złączenie „klasyczne”:

SELECT Nr_bud, L_kondygnacji, Nr_lokalu, Powierzchnia_lokalu

FROM Budynki, Lokale
WHERE Budynki.ID = Lokale.ID_budynku AND L_kondygnacji > 4;



Wykorzystanie kwalifikatorów i aliasów:

SELECT B.Nr_bud, B.L_kondygnacji, L.Nr, L.Powierzchnia_lokalu

FROM Budynki B, Lokale L
WHERE B.ID = L.ID_budynku AND L_kondygnacji > 4;



Złączenie w SQL-92:

SELECT Nr_bud, L_kondygnacji, Nr_lokalu, Powierzchnia_lokalu

FROM Budynki JOIN Lokale
WHERE L_kondygnacji > 4;


SELECT Nr_bud, L_kondygnacji, Nr_lokalu, Powierzchnia_lokalu

FROM Budynki JOIN Lokale USING ID_bud
WHERE L_kondygnacji > 4;


SELECT Nr_bud, L_kondygnacji, Nr_lokalu, Powierzchnia_lokalu

FROM Budynki JOIN Lokale ON Budynki.ID = Lokale.ID_bud
WHERE L_kondygnacji > 4;


SELECT Nr, Powierzchnia, Nazwisko, Imie

FROM Dzialki JOIN Dzial_Wlasc_int JOIN Wlasciciele
WHERE nazwisko=’Kowalski’;



Złączenie tabeli samej ze sobą.

W operacji złączenia języka SQL ta sama tabela może występować wielokrotnie w klauzuli FROM.
Tabela może więc być łączona sama ze sobą. Konieczne jest użycie aliasów, które pozwalają na
rozróżnienie pomiędzy odwołaniem do tabeli jako źródła informacji o jednostce podrzędnej, a później
nadrzędnej. Najczęściej wykorzystuje się tego typu złączenie w przypadku tabeli w której zapisana
jest zależność hierarchiczna np. w przypadku tabeli z danymi o jednostkach administracyjnych
Przykładowa struktura tabeli Jedn_adm (jednostki administracyjne)




background image

2



Jedn_adm

ID

Rodzaj

Nazwa

ID_j_nadrzednej

1

g

Dąbrowa

41

2

g

Stara Wieś

41

3

g

Nowa Wieś

47

41

p

Wąchocki

112

112

w

Mazowieckie

0



SELECT A.ID, A.Rodzaj, A.Nazwa, B.Nazwa

FROM jedn_adm A, jedn_adm B
WHERE A.ID = B.Id_j_nadrzednej;


Wynik zapytania:

A.ID

A.Rodzaj

A.Nazwa

A.ID_j_nadrzednej B.ID

B.Rodzaj

B.Nazwa

.ID_j_nadrzednej

1

g

Dąbrowa

41

41

p

wąchocki

112



Zapytania zewnętrzne:

- W prostym złączeniu tabel otrzymujemy na wyjściu tylko odpowiadające sobie wiersze z

łączonych tabel.

- Jeżeli chcemy w odpowiedzi uwzględnić również te wiersze, które nie mają odpowiadających

wierszy w pozostałych tabelach złączenia, należy użyć operatora złączenia zewnętrznego „(+)”

- Symbol „(+)” stawia się po nazwie kolumny z tej strony operatora relacyjnego, z której może

wystąpić brak informacji

- Operator „(+)” może stać tylko przy jednej tabeli w ramach jednego zapytania

SELECT dzialki.nr, baseny.powierzchnia FROM dzialki, baseny

WHERE dzialki.nr = baseny.id_dzialki (+);


Składnia SQL-92:

Budynki LEFT OUTER JOIN Lokale
Budynki RIGHT OUTER JOIN Lokale
Budynki FULL OUTER JOIN Lokale



2. Wybrane funkcje systemowe (z systemu Oracle)

- funkcje agregujące: SUM, MAX, MIN, AVG, COUNT, STDDEV, VARIANCE
- funkcje znakowe: CHR, ASCII, LOWER, UPPER, INITCAP, LPAD, RPAD, LTRIM, RTRIM,

REPLACE, SUBSTR, INSTR, LENGHT

- funkcje związane z datą i czasem: SYSDATE, ROUND, TRUNC
- funkcje matematyczne: ABS, EXP, LN, LOG, POWER, ROUND, TRUNC, MOD, SIN, COS,

TAN, SQRT

- funkcje do konwersji typów danych: TO_CHAR, TO_DATE, TO_NUMBER, NVL

background image

3





3. Funkcje grupowe

Umożliwiają obliczenie liczności oraz parametrów statystycznych (minimum, maksimum, wartość
średnia, odchylenie standardowe, wariancja) grup danych złożonych z wielu wierszy

Do określenia liczby wierszy służy funkcja grupowa COUNT.
Jeżeli w zapytaniu nie ma klauzuli GROUP BY zliczanie dotyczy całej tabeli jako jednej grupy

Zliczenie wszystkich wierszy w tabeli:
SELECT Count (*) FROM Drogi;

Obliczenie liczby budynków posiadających nazwę własną (np. „Pałac Kultury i Nauki”, „Spodek”)
SELECT Count(nazwa) FROM Budynki
- wyszukiwanie wszystkich wierszy, w których w kolumnie "nazwa" występuje wartość różna od

NULL


Aby ignorować duplikaty wierszy podczas zliczania należy dodać klauzulę DISTINCT
SELECT Count(Distinct Nazwa) FROM Ulice;


Zliczenie liczby odcinków dróg o tym samym rodzaju nawierzchni
SELECT Nawierzchnia, Count(*) FROM Odcinki_jezdni GROUP BY Nawierzchnia;

Mb, 234
Kk, 23
Bt, 45
Gr, 567


Obliczenie parametrów statystycznych odcinków jezdni dla poszczególnych rodzajów nawierzchni:

SELECT nawierzchnia, MIN (długosc) minimum,

MAX (dlugosc) maksimum,

AVG (dlugosc) średnia

FROM Odcinki_jezdni GROUP BY nawierzchnia;


Nawierzchnia MIN (długosc) MAX (dlugosc) AVG (dlugosc)
Mb 3 5 3.8
Kk 0.5 2 1.2



SELECT nawierzchnia, MIN (długosc),

MAX (dlugosc),

AVG (dlugosc)

FROM Odcinki_jezdni GROUP BY nawierzchnia;



Nawierzchnia minimum maksimum średnia
Mb 3 5 3.8
Kk

0.5

2

1.2

background image

4


4. Podzapytania

W języku SQL można oprócz prostych zapytań formułować zapytania zagnieżdżone. Podzapytania nie
przekazują wyniku na ekran, ale wynik przekazywany jest do zapytania wyższego poziomu.

Tabele: DZIALKI, DZIAL_WLAS, WLASICIELE
Pytanie: Znajdź numery działek należących do Kowalskiego


SELECT nr FROM Dzialki WHERE Id = ANY (SELECT ID_dzialki FROM Dzial_Wlas WHERE
Id_wlasciciela = ANY (SELECT Id FROM Wlasciciele WHERE nazwisko = ‘Kowalski’));


Zapytania zagnieżdżone w warunkach zawierających operatory porównania są jednowierszowe.
Jeżeli podzapytanie może wyszukać więcej niż jeden wiersz, należy użyć innych operatorów:
= ALL (dla każdego wiersza)
= ANY (dla któregokolwiek wiersza) – to samo co IN
.....WHERE id_teryt IN (SELECT nr FROM gminy WHERE nazwa IN (‘Koluszki’, ‘Wąchock’))


Wyszukanie gmin leżących w powiatach o powierzchni większej od 1000 km2
Select * from gminy where id_powiatu=ANY (SELECT id FROM powiaty WHERE powierzchnia >
1000);


WADY:
- Przy wielu poziomach zagnieżdżenia mała czytelność
- Możliwość uzyskania w odpowiedzi tylko kolumn z tabeli występującej w zapytaniu najbardziej

zewnętrznym



5. Stosowanie operatorów teoriomnogościowych

W SQL oprócz operatorów projekcji, selekcji i złączenia mogą być używane klasyczne operatory
teoriomnogościowe – suma (UNION) , przecięcia (INTERSECT) i różnica zbiorów (MINUS)
- wyniki zapytań mogą być traktowane jako zbiory i mogą być argumentami operacji

teoriomnogościowych

- aby 2 zapytania mogły być połączone muszą mieć identyczną strukturę (istotna jest liczba,

kolejność i typy kolumn, nieistotne są nazwy)

- klauzula ORDER BY może wystąpić tylko raz, po ostatnim zapytaniu; kryteria sortowania mogą

być wyłącznie numerami kolumn (zgodnie z pozycją kolumny)


Przykład:
Wypisanie danych o gminach i powiatach na jednej liście posortowanej po powierzchni:
SELECT Nazwa, Powierzchnia FROM Gminy

UNION

SELECT Nazwa_pow, Area FROM Powiaty

ORDER BY 2;



Wypisanie nazw miast o statusie gminy:
SELECT Nazwa, Powierzchnia FROM Gminy

background image

5

INTERSECT

SELECT Nazwa, Powierzchnia FROM Miasta;


6. Wstawianie danych

INSERT Into Odcinki_jezdni (ID, Szerokosc, Stan, Kategoria_ruchu, Data_wprowadzenia_info)

VALUES (1, 5.5 , null, ’1’ , sysdate() );








7. Aktualizacja danych

UPDATE Szlaki_drogowe

SET KolejnoscOdsniezania = 1

WHERE Lenght(Nr)<3;


UPDATE Budynki

SET Uwagi = 'Brak danych o wysokości’


WHERE Wysokosc IS NULL;



UPDATE Odcinki_rzek

SET Klasa_czystosci = Klasa_czystosci+1

WHERE id=245;


UPDATE Sprzet

SET GwarancjaStart = Sysdate()

GwarancjaStop=Sysdate()+364;



8. Usuwanie danych

DELETE FROM Odc_drogi

WHERE Dlugosc IS NULL;


9. Modyfikacja struktury danych

Struktury danych mogą być łatwo powiększane. Zmniejszanie (np. usunięcie kolumny) jest zwykle
niedopuszczalne lub ograniczone pewnymi warunkami

Przykład z systemu Oracle:

SQL> ALTER TABLE powiaty MODIFY nr_stat number(4);
SQL> ALTER TABLE powiaty MODIFY nr_stat number(2);
ERROR at line 1
ORA-01440: column to be modified must be empty to decrease precision or scale

Zmiana typu kolumny możliwa jest tylko jeżeli w tabeli nie ma danych:

background image

6

SQL> ALTER TABLE Powiaty MODIFY nr_stat VARCHAR2(4);

Dodanie nowej kolumny:
SQL> ALTER TABLE Powiaty ADD powierzchnia number(10);


10. Definiowanie perspektyw

SQL> Create View DzialkiBudyn (Nr_działki, Rodzaj_budynku, Liczba_pięter) As

SELECT dzialki.nr, budynki.rodzaj, budynki.liczba_kondygnacji
FROM dzialki, dzialki_bud_int, budynki

WHERE dzialki.ID = dzialki_bud_int.ID_dzialki AND

dzialki_bud_int.ID_bud= budynki.ID;


Select * From DzialkiBudyn;

12/1, m, 2
134, m, 1
12/2, g, 1
12/2, m, 2
231, p, 3

- Typy kolumn w perspektywie dziedziczone są po elementach listy SELECT
- Należy unikać używania w tworzeniu perspektywy po klauzuli SELECT znaku (*)
- Dodanie klauzuli WITH CHECK OPTION powoduje nałożenie ograniczenia na operacje

modyfikacji danych; nie pozwoli na wprowadzenie danych które nie będą widoczne w
perspektywie


SQL> Create View WysokieBudynki As

SELECT ID, Nr_ew, Funkcja, Liczba_kondyg, Wysokosc FROM Budynki

WHERE Liczba_kondyg>4 WITH CHECK OPTION;



11. Definiowanie indeksów

SQL> Create Unique Index On Wlasciciele (nazwisko,imie, data_ur,imie_ojca);

SQL> Create Index On Wlasciciele (nazwisko,imie);


12. Definiowanie synonimów


SQL> Create Synonym DK for DKowalski.DaneOsobiste;
SQL> SELECT * FROM DKowalski.DaneOsobiste;
SQL> SELECT * FROM DK;


13. Definiowanie sekwencji

Sekwencje umożliwiają pobieranie unikalnych liczb całkowitych, przez różnych użytkowników w
sposób współbieżny

SQL> Create Sequence AutoNr1;

background image

7


SQL> Create Sequence AutoNr2

increment By 10

minvalue 100

maxvalue 10000

cycle;


Wprowadzanie danych z użyciem sekwencji:
SQL> INSERT Into Pracownicy (Identyfikator, Imie, Nazwisko)

Values (AutoNr1.nextval, ‘Piotr’, ‘Krawczyk’);


SQL> Alter Sequence AutoNr2 Increment By 1

Operatory dotyczące sekwencji (nextval, currval) nie mogą być użyte w następujących miejscach:
- we frazie WHERE
- w zapytaniach z ORDER BY, CONNECT BY, GROUP BY, DISTINCT
- w perspektywach
- definiowanie, modyfikacja więzów integralności i ograniczeń


14. Ustanawianie więzów integralności

Integralność kolumny i wiersza

SQL> ALTER TABLE Szlaki_drogow MODIFY Nr NOT NULL;
SQL> ALTER TABLE Jezdnie MODIFY Kategoria_ruchu DEFAULT ‘A’;
SQL> ALTER TABLE Jezdnie ADD CONSTRAINT jezdnie_chk CHECK (klasa_techniczna
BETWEEN 1 AND 6);
SQL> ALTER TABLE Jezdnie ADD CONSTRAINT jezdnie_chk CHECK (klasa_techniczna>=1
AND klasa_techniczna<=6);

Klucz główny:
SQL>ALTER TABLE Gminy ADD CONSTRAINT gminy_pk PRIMARY KEY (Nr_TERYT);

Klucz unikalny:
SQL> ALTER TABLE Własciciele ADD CONSTRAINT wlas_uk UNIQUE (imie, nazwisko);

Klucz obcy:
SQL> ALTER TABLE Gminy ADD CONSTRAINT gminy_pow_fk FOREIGN KEY
(Nr_TERYT_pow) REFERENCES Powiaty (Nr_TERYT) ON DELETE CASCADE;






Wyszukiwarka

Podobne podstrony:
3 Bazy danych SQL cz 1 wykład
3 Bazy danych SQL cz 2 wykład
3 Bazy danych SQL cz 2 wykład
3 Bazy danych SQL cz 1 wykład
Bazy danych SQL Wyszukiwanie pełnotekstowe wyklad12
BAZY DANYCH SQL (2)
nadpisywanie bazy danych SQL
sciaga - bazy danych, SQL bazy danych
bazy danych sql id 81694 Nieznany
Bazy danych SQL Teoria i praktyka bdsql
sciaga na egzamin (1), Informatyka i Ekonometria SGGW, Semestr 4, Bazy danych SQL, EGZAMiN
Bazy danych [ skrypty na wykłady u prof. Z. Królikowski], Bazy danych 2 WSKiZ, TRANSFORMACJA DO SCHE
BAZY DANYCH SQL (2)
nadpisywanie bazy danych SQL
Bazy danych SQL Teoria i praktyka bdsql
Bazy danych SQL Teoria i praktyka bdsql
Bazy danych SQL Teoria i praktyka 2

więcej podobnych podstron