Bazy danych Podstawy języka SQL Dr inż. Paweł Kasprowski pawel@kasprowski.pl
Plan wykładu Relacyjne bazy danych Język SQL Zapytania SQL (polecenie select) Bezpieczeństwo danych Integralność danych Współbieżność dostępu do danych Projektowanie schematu bazy danych (ERD)
Literatura Jeffrey D. Ullman, J. Widom Podstawowy wykład z systemów baz danych WNT 2001 Ramez Elmasri, Shamkant B. Navathe Wprowadzenie do systemów baz danych Helion 2004 Marcin Szeliga ABC języka SQL Helion 2002
Sposób przechowywania danych Plik zawiera rekordy (dane pracowników) Rekord składa się z pól (pracownik Kowalski) Pole zawiera pojedynczą wartość (nazwisko, imie, data urodzenia) Pola mogą być różnych typów: tekstowe numeryczne daty i czasu
Nomenklatura Plik > tablica Rekord > wiersz Pole > kolumna
Przykład Pracownicy nazwisko imie adres dataur pensja
Dodanie nazwy zespołu Pracownicy nazwisko imie adres dataur pensja nazwa Problemy: redundancja danych problem ze zmianą nazwy zespołu zespół bez pracowników nie istnieje co jeśli chcemy przechować więcej informacji o zespołach?
Przykład Pracownicy nazwisko imie adres dataur pensja nazwa
Rozwiązanie druga tabela Pracownicy nazwisko imie adres dataur pensja Zespoły nazwa budynek telefon kierownik
Problem jak połączyć dwie tablice? Konieczna jest reguła mówiąca który wiersz "pasuje" do którego Każdy wiersz musi więc mieć identyfikator klucz Klucz to zbiór atrybutów unikalnych (różnych) dla każdego wiersza Możemy przechowywać pary kluczy z dwóch tablic w osobnej strukturze (model sieciowy)
Model relacyjny 1971 E.F. Codd laboratoria IBM Tylko dane brak innych struktur Nie ma specjalnych połączeń Połączenia wynikają z podobnych wartości atrybutów w różnych tabelach W przypadku związku 1-N wystarczy przechować klucz jednej tabeli w drugiej
Realizacja Dodajemy kolumnę nazwa zespołu do tablicy pracowników (czy można odwrotnie?) Co jeśli nazwa zespołu nie jest unikalna? Odpowiedź: należy w tablicy pracownicy umieścić klucz a więc zbiór kolumn zapewniający jednoznaczną identyfikację zespołu (np. nazwa, budynek, telefon) Jest to niewygodne znowu redundancja dlatego często tworzy się specjalną kolumnę kluczową (np. numer zespołu: idz)
Przykład Pracownicy nazwisko imie adres dataur pensja idz Zespoły idz nazwa budynek telefon kierownik
Przykład Pracownicy nazwisko imie adres dataur pensja idz Zespoły idz nazwa budynek telefon kierownik
Zalety rozwiązania Nie ma redundancji Łatwo znaleźć zespół w którym pracuje pracownik Łatwo znaleźć wszystkich pracowników zespołu Zmiana atrybutów zespołu (nie licząc idz!) jest bezproblemowa Baza składa się tylko z tablic żadnych dodatkowych struktur
Język SQL 1972 - Codd, model relacyjny 1974 - baza SYSTEM/R i język SEQUEL 1979 - Relational Software Inc. tworzy system Oracle 1986 - Ingres RDBMS język QUEL 1989 - standard ANSI SQL (SQL-89) 1992 - ANSI SQL-92 podstawowy standard stał się także standardem ISO 1999 - ANSI SQL-99 (6 części)
Język SQL Język deklaratywny składa się poleceń Elementy języka: DDL Data Definition Language CREATE, ALTER, DROP DML Data Manipulation Language INSERT, UPDATE, DELETE DQL Data Query Language SELECT DCL Data Control Language GRANT, REVOKE, DENY
Tworzenie tabeli CREATE TABLE <nazwa> (<kolumna> <typ> [<ograniczenia>] [,...]) Typy kolumn: - tekstowe - numeryczne - datowe Pomimo istnienia standardu istnieją różnice w dostępnych typach dla różnych serwerów
Najważniejsze typy danych Typy tekstowe CHAR(n) VARCHAR(n) Typy numeryczne INT, SMALLINT, BIGINT DECIMAL(m, n) FLOAT, DOUBLE Typy datowe DATE, DATETIME, TIME, INTERVAL Inne typy BIT, BYTE, BOOLEAN SERIAL, AUTOINCREMENT BLOB, TEXT
Rodzaje ograniczeń [ NOT ] NULL DEFAULT <wartość> UNIQUE CHECK (warunek) PRIMARY KEY FOREIGN KEY
Tworzenie tabeli CREATE TABLE prac ( idp int primary key, nazw varchar(20) not null, dataur date, pensja decimal(7,2) default 2000 );
Modyfikacja tabeli ALTER TABLE <nazwa> <opis_zmiany> Przykłady: ALTER TABLE prac ADD COLUMN idz INT ALTER TABLE prac MODIFY COLUMN nazw varchar(50) Składnia może się różnić dla różnych serwerów!
Usunięcie tabeli DROP TABLE <nazwa_tabeli> Usuwa tabelę ze wszystkimi danymi
Praca z danymi INSERT wstawienie wiersza/wierszy INSERT INTO <tabela>[(<kolumny>)] VALUES (<wartości>) UPDATE modyfikacja wiersza/wierszy UPDATE <tabela> SET <kolumna>=<wartość>[, <kolumna>=<wartość>...] WHERE <warunek> DELETE usunięcie wiersza/wierszy DELETE FROM <tabela> WHERE <warunek>
Wstawianie wierszy CREATE TABLE prac (idp int unique, nazw varchar(20) not null, dataur date, pensja decimal(7,2) default 2000 ); INSERT INTO prac VALUES(1,'Kowalski','1-1-1980',3000); INSERT INTO prac(idp,nazw) VALUES(1,'Nowak'); -- Błąd: idp nie jest unikalny! INSERT INTO prac(idp,nazw) VALUES(2,'Nowak'); -- OK: pola dataur=null, pensja=2000 INSERT INTO prac(idp,pensja) VALUES(3,5000); -- Błąd: nazw nie może być null! INSERT INTO prac(idp,nazw) <polecenie SELECT>
Modyfikacja wierszy UPDATE prac SET nazw='nowak' WHERE nazw='kowalski' -- Uwaga! Zmieni nazwiska WSZYSTKICH Kowalskich! UPDATE prac SET nazw='nowak' WHERE idp=8 UPDATE prac SET nazw='nowak, dataur='1-1-1975' WHERE pensja > 2000 Warunek WHERE nie jest obowiązkowy można zmodyfikować wszystkie wiersze. Można także używać wyrażeń: UPDATE prac SET pensja=pensja+100 -- globalna podwyżka! bardzo użyteczne
Usuwanie wierszy Usuń najlepiej zarabiających: DELETE FROM prac WHERE pensja>3000 Usuń najstarszych: DELETE FROM prac WHERE dataur<'1950' Usuń starych dobrze zarabiających: DELETE FROM prac WHERE dataur<'1950' AND pensja>3000 Warunek WHERE nie jest obowiązkowy DELETE FROM prac -- usuwa wszystkie rekordy z tablicy prac
Wyszukiwanie danych Najczęściej wykonywana operacja (wyrocznia!) Polecenie: SELECT Możliwości sporej rozbudowy tego polecenia Podstawowa składnia: SELECT <kolumny> FROM <tablice> WHERE <warunki>
Przykłady SELECT Podaj nazwiska i pensje pracowników zakładu nr 5 SELECT nazw,pensja FROM prac WHERE idz=5 -- wynik: tablica w dwóch kolumnach Podaj nazwisko pracownika nr 8 SELECT nazw FROM prac WHERE idp=8 -- wynik: jeden wiersz, jedna kolumna Zamiast listy kolumn można podać *, WHERE jest nieobowiązkowe: SELECT * FROM prac -- wynik: zawartość całej tablicy prac
Warunki Porównania: =,<>,<,>,>=,<= [NOT] BETWEEN a AND b [NOT] IN (<lista wartości>) [NOT] LIKE 'tekst' % - dowolny ciąg znaków _ - dowolny znak Warunki logiczne: AND, OR AND ma wyższy priorytet! Wyrażenia algebraiczne (pensja*2>1000)
Przykłady warunków select * from prac where idp between 2 and 5 select * from prac where nazw in ('Wolski','Niemczyk') select * from prac where nazw like 'Kro%' select * from prac where nazw like 'Kowalsk_' select * from prac where pensja/1000>2 select * from prac where nazw='wolski' OR nazwisko='niemczyk' select * from prac where nazw like 'A%' and pensja=1000 or pensja=3000
Złączenia w select Podaj nazwiska pracowników zespołu 'Oprogramowanie' Filtr na nazwę Zespoły idz nazwa kierownik Pracownicy idp nazw dataur idz wypisanie nazwisk Złączenie
Złączenia w select Podaj nazwiska pracowników zespołu 'Oprogramowanie' select nazwiska from prac join zesp on prac.idz = zesp.idz where nazwa= 'Oprogramowanie'
Złączenia w select Podaj nazwiska pracowników zespołu 'Oprogramowanie' select nazwiska from prac p join zesp z on p.idz = z.idz where nazwa= 'Oprogramowanie' warunek połączenia Jeśli nie ma warunku połączenia iloczyn kartezjański (każdy wiersz z każdym)
Dziękuję za uwagę Do zobaczenia... materiały dostępne pod adresem: www.kasprowski.pl