Podstawy języka SQL

Transkrypt

Podstawy języka SQL
20.11.2015
Projektowanie Baz Danych
Ćw. 5
GiG-2-KG
Podstawy języka SQL
Język SQL (ang. Structured Query Language) jest strukturalnym językiem zapewniającym możliwość
wydawania poleceń do systemu zarządzania bazą danych (SZBD).
Język SQL jest językiem deklaratywnym. Charakterystyczną cechą języków deklaratywnych
jest to, że opisują „co” ma być zrobione, ale nie „jak”. W praktyce oznacza to, że użytkownik
opisuje w języku SQL efekt jaki chce uzyskać (odczytanie telefonów wszystkich pracowników
o nazwisku zaczynającym się na literę ‘A’, podniesienie pensji wszystkim profesorom itp.), ale
nie sposób w jaki ma to być zrobione (sekwencja operacji dyskowych, które prowadzą do
wykonania polecenia). Sposób wykonania polecenia jest automatycznie dobierany przez
SZBD i zależy od fizycznego sposobu składowania danych.
Język SQL jest zorientowany na przetwarzanie zbiorów. Ponieważ dane są przechowywane w
relacjach, które są zbiorami krotek, konstrukcje języka SQL dotyczą przetwarzania zbiorów i
nie zawierają poleceń uwzględniających jakiś porządek na krotkach.
W języku SQL można wyróżnić trzy grupy poleceń:
a) DML – język manipulacji danymi pozwalający na odczytywanie danych z relacji
(polecenie SELECT) oraz na wstawianie, modyfikację i usuwanie danych z relacji
(polecenia: INSERT, UPDATE, MERGE i DELETE).
b) DDL – język definicji danych pozwalający na tworzenie, modyfikację i usuwanie relacji
(polecenia CREATE, ALTER i DROP).
c) DCL – język kontroli danych pozwalający na zapewnienie autoryzacji dostępu do
danych oraz zarządzanie transakcjami. Najważniejsze polecenia to GRANT i REVOKE
(czasem zaliczane do DDLa) oraz COMMIT, ROLLBACK i SAVEPOINT.
W języku SQL nie rozróżnia się dużych i małych liter. Wszystkie słowa kluczowe i nazwy (np.
relacji i atrybutów) w języku SQL można pisać zarówno dużymi jak i małymi literami.
Przykładowo, wyrażenia: nazwisko, Nazwisko i NAZWISKO są identyczne.
20.11.2015
Projektowanie Baz Danych
Ćw. 5
GiG-2-KG
W poleceniach SQL ignorowane są znaki końca linii. Wszystkie słowa kluczowe i wyrażenia w
języku SQL można rozdzielać zarówno spacjami jak i znakami końca linii. W rezultacie
dowolne polecenie SQL można sformatować w dowolny sposób (może ono zajmować jeden
długi wiersz, lub kilka krótszych wierszy).
Każde polecenie SQL powinno być zakończone średnikiem. Próba wykonania polecenia nie
zakończonego w ten sposób może zakończyć się błędem, chociaż istnieją sytuacje, gdy
pominięcie średnika jest dozwolone.
1. Tworzenie relacji
CREATE TABLE nazwa_relacji
(nazwa_atr typ (rozmiar) [DEFAULT wart_domyślna],
nazwa_atr typ (rozmiar) [DEFAULT wart_domyślna], ..);
np. Stworzyć tabelę do przechowywania informacji o pracownikach ‘naszej’ księgarni.
Chcemy zapamiętać: imię nazwisko, datę zatrudnienia, etat oraz płacę naszych pracowników,
także ich identyfikator.
CREATE TABLE Pracownicy (
PracID INT,
Imię VARCHAR(10),
Nazwisko VARCHAR(20),
Zatrudniony DATE,
Etat VARCHAR(20),
Płaca DECIMAL(7,2)
);
2. Typy danych:
Nazwa
Alias
bigint
int8
bigserial
serial8
bit [ (n) ]
bit varying [ (n) ]
boolean
box
bytea
character [ (n) ]
character varying [ (n) ]
cidr
circle
date
varbit
bool
char [ (n) ]
varchar [ (n) ]
Opis
signed eight-byte integer
autoincrementing eight-byte
integer
fixed-length bit string
variable-length bit string
logical Boolean (true/false)
rectangular box on a plane
binary data ("byte array")
fixed-length character string
variable-length character
string
IPv4 or IPv6 network address
circle on a plane
calendar date (year, month,
day)
20.11.2015
Projektowanie Baz Danych
Ćw. 5
double precision
inet
integer
interval [ fields ] [ (p) ]
json
jsonb
line
lseg
float8
int, int4
macaddr
money
numeric [ (p, s) ]
decimal [ (p, s) ]
path
pg_lsn
point
polygon
real
float4
smallint
int2
smallserial
serial2
serial
serial4
text
time [ (p) ] [ without
time zone ]
time [ (p) ] with time
zone
timestamp [ (p) ] [
without time zone ]
timestamp [ (p) ] with
time zone
tsquery
tsvector
txid_snapshot
uuid
xml
GiG-2-KG
double precision floating-point
number (8 bytes)
IPv4 or IPv6 host address
signed four-byte integer
time span
textual JSON data
binary JSON data, decomposed
infinite line on a plane
line segment on a plane
MAC (Media Access Control)
address
currency amount
exact numeric of selectable
precision
geometric path on a plane
PostgreSQL Log Sequence
Number
geometric point on a plane
closed geometric path on a
plane
single precision floating-point
number (4 bytes)
signed two-byte integer
autoincrementing two-byte
integer
autoincrementing four-byte
integer
variable-length character
string
time of day (no time zone)
timetz
time of day, including time
zone
date and time (no time zone)
timestamptz
date and time, including time
zone
text search query
text search document
user-level transaction ID
snapshot
universally unique identifier
XML data
20.11.2015
Projektowanie Baz Danych
Ćw. 5
GiG-2-KG
Np. Podaj składnie SQL, która stworzy tabelę o poniższym schemacie:
CREATE TABLE Podania(
PodID SERIAL ,
Imię VARCHAR(20),
Nazwisko VARCHAR,
Dnia DATE,
Czas TIME,
IdDziekana NUMERIC(2),
Decyzja BOOL,
Opłata DECIMAL(7,2)
);
3. Ograniczenia integralościowe
Dane składowane w relacjach opisują jakiś wybrany fragment rzeczywistości. Niestety, łatwo jest
wprowadzić do relacji dane, które rzeczywistości nie mogą odpowiadać w żaden sposób.
Przykładowo, można wprowadzić do bazy danych pracowników zatrudnionych tysiąc lat temu, albo
samochód o ujemnej maksymalnej prędkości. W celu zapobiegania takim sytuacjom stosuje się tzw.
ograniczenia integralnościowe. Jest to zbiór warunków, które muszą być spełnione przez dane
składowane w bazie danych, aby można je było uznać za poprawne. Każde polecenie SQL, które
spowodowałoby naruszenie warunków integralnościowych jest wycofywane.
Istnieją dwa rodzaje ograniczeń integralnościowych:


ograniczenia atrybutu - dotyczą jedynie pojedynczego atrybutu relacji. Definiuje się je na
liście atrybutów po podaniu wartości domyślnej atrybutu.
ograniczenia relacji - dotyczą więcej niż jednego atrybutu relacji i definiuje się je jako osobny
wpis na liście atrybutów.
Definicja ograniczenia integralnościowego rozpoczyna się od opcjonalnego podania jego nazwy po
słowie kluczowym CONSTRAINT, po którym podaje się właściwą definicję. Poszczególne typy
ograniczeń wraz ze sposobem definiowania zostaną opisane na kolejnych slajdach.
CREATE TABLE nazwa_relacji(
nazwa_atr typ (rozmiar) [DEFAULT wartość_domyślna]
[ [CONSTRAINT nazwa_ogr] ogr_atr]..,
nazwa_atr typ (rozmiar) [DEFAULT wartość_domyślna]
[ [CONSTRAINT nazwa_ogr] ogr_atr]...,
....
[ [CONSTRAINT nazwa_ogr] ograniczenie_rel, ...] );
20.11.2015
Projektowanie Baz Danych
Ćw. 5
Np.
CREATE TABLE Podania(
PodID SERIAL PRIMARY KEY,
Imię VARCHAR(20),
Nazwisko VARCHAR ,
Dnia DATE CONSTRAINT niepusty_termin NOT NULL,
Czas TIME,
IdDziekana NUMERIC(2) DEFAULT 11,
Decyzja BOOL,
Opłata DECIMAL(7,2),
CHECK (Opłata>=0) );
3.1. Klucz podstawowy
 Ograniczenie atrybutu
CREATE TABLE Podania(
PodID INT CONSTRAINT podid_pk PRIMARY KEY,
Index VARCHAR(15),
IdDziekana NUMERIC(2) DEFAULT 11,
Decyzja BOOL,
);
 Ograniczenie relacji
CREATE TABLE Podania(
PodID INT,
Index VARCHAR(15),
IdDziekana NUMERIC(2) DEFAULT 11,
Decyzja BOOL,
CONSTRAINT podid_pk PRIMARY KEY PodID
);
3.2. Wartość unikalna
 Ograniczenie atrybutu
CREATE TABLE Projekty (
Numer NUMERIC(6) PRIMARY KEY,
Nazwa CHARACTER VARYING (100) UNIQUE,
Budżet NUMERIC(10,2),
Termin_zak DATE
);

Ograniczenie relacji
CREATE TABLE Projekty (
Numer NUMERIC(6),
Nazwa CHARACTER VARYING (100),
Budżet NUMERIC(10,2),
Termin_zak DATE,
CONSTRAINT un_nazwa UNIQUE (Numer,Nazwa)
);
GiG-2-KG
20.11.2015
Projektowanie Baz Danych
Ćw. 5
GiG-2-KG
3.3. Wartość obowiązkowa
CREATE TABLE Projekty (
Numer NUMERIC(6) PRIMARY KEY,
Nazwa CHARACTER VARYING (100) UNIQUE NOT NULL,
Budżet NUMERIC(10,2)CONSTRAINT nn_budz NOT NULL,
Termin_zak DATE NOT NULL
);
3.4. Klucz obcy
CREATE TABLE Książki(
ISBN VARCHAR(20) PRIMARY KEY,
Tytuł VARCHAR(40),
WydID INT REFERENCES Wydawnictwa(WydID),
Cena DECIMAL(6,2)
);
Lub
CREATE TABLE Książki(
ISBN VARCHAR(20) PRIMARY KEY,
Tytuł VARCHAR(40),
WydID INT,
Cena DECIMAL(6,2),
FOREIGN KEY WydID REFERENCES Wydawnictwa(WydID)
);
Metodę utrzymywania spójności bazy danych ze względu na ograniczenie integralnościowe
„klucz obcy” można zmienić, dodając do definicji ograniczenia słowa kluczowe:






ON DELETE SET NULL – usunięcie krotki z relacji z kluczem głównym/wartością unikalną
spowoduje zapisanie do wskazujących na nią atrybutów tworzących klucz obcy wartości
NULL,
ON DELETE CASCADE – usunięcie krotki z relacji z kluczem głównym/wartością unikalną
spowoduje usunięcie wszystkich krotek, które zawierają klucz obcy wskazujący na
usuwaną krotkę,
ON DELETE SET DEFAULT – usunięcie krotki z relacji z kluczem głównym/wartością
unikalną spowoduje zapisanie do wskazujących na nią atrybutów tworzących klucz obcy
ich wartości domyślnych,
ON UPDATE SET NULL – modyfikacja wartości klucza podstawowego/wartości unikalnej
w krotce spowoduje zapisanie do wskazujących na nią atrybutów tworzących klucz obcy
wartości NULL,
ON UPDATE CASCADE – modyfikacja wartości klucza podstawowego/wartości unikalnej
w krotce spowoduje zapisanie do wskazujących na nią atrybutów tworzących klucz obcy
nowej wartości klucza podstawowego/wartości unikalnej,
ON UPDATE SET DEFAULT - modyfikacja wartości klucza podstawowego/wartości
unikalnej w krotce spowoduje zapisanie do wskazujących na nią atrybutów tworzących
klucz obcy ich wartości domyślnych.
20.11.2015
Projektowanie Baz Danych
Ćw. 5
3.5. Ograniczenie domeny atrybutu
 Ograniczenie atrybutu
CREATE TABLE Projekty (
Numer NUMERIC(6) PRIMARY KEY,
Nazwa CHARACTER VARYING (100) UNIQUE,
Budżet NUMERIC(10,2) CHECK (budzet < 1000000),
Termin_zak DATE
);

Ograniczenie relacji
CREATE TABLE Projekty (
Numer NUMERIC(6) PRIMARY KEY,
Nazwa CHARACTER VARYING (100) UNIQUE,
Budżet NUMERIC(10,2) NOT NULL,
Termin_rozp DATE NOT NULL,
Termin_zak DATE NOT NULL,
CHECK (Termin_rozp<Termin_zak)
);
4. Modyfikowanie relacji
4.1. Kolumny
 Dodanie kolumny
ALTER TABLE tabela ADD COLUMN atrybut typ;

Usunięcie kolumny
ALTER TABLE tabela DROP COLUMN atrybut;

Zmiana nazwy kolumny
ALTER TABLE tabela RENAME COLUMN atrybut1 TO arybut2;
4.2. Relacje
 Usunięcie relacji
DROP TABLE nazwa_tabeli;

Zmiana nazwy relacji
ALTER TABLE tabela RENAME TO tabela2;

Wyczyszczenie tabeli
TRUNCATE TABLE tabela;
GiG-2-KG
20.11.2015
Projektowanie Baz Danych
Ćw. 5
GiG-2-KG
4.3. Ograniczenia integralnościowe
ALTER TABLE tabela:
 ADD CHECK (atrybut <> '');
 ADD CONSTRAINT nazwa_ogr UNIQUE (atrybut);
 ADD FOREIGN KEY (atrybut) REFERENCES tab_inna(atrybut_inny);
 ALTER COLUMN atrybut SET NOT NULL;
 DROP CONSTRAINT nazwa_ogr;
 ALTER COLUMN atrybut DROP NOT NULL;
4.4. Zmiana wartości domyślnej
ALTER TABLE tabela ALTER COLUMN atr SET DEFAULT 7.77;
ALTER TABLE tabela ALTER COLUMN atr DROP DEFAULT;
4.5. Krotki
 Wstawianie
a) INSERT INTO nazwa_relacji VALUES (wartość1 [ DEFAULT ] [ NULL
], ..., wartośćN);
Np. Dodać informację o kolejnym wydawnictwie ‘Gamma Press’ – nic jeszcze
nie wiadomo o jego nr telefonu:
INSERT INTO Wydawnictwa VALUES (6,NULL,'Gamma Press');
b) INSERT INTO nazwa_relacji (atrybut1, ..., atrybutN) VALUES(wartość1 [
DEFAULT ][ NULL ], ..., wartośćN);
Np. Dodać informację o kolejnym wydawnictwie znany jest numer telefonu
tego wydawnictwa, nie wiadomo jak ono się nazywa:
INSERT INTO Wydawnictwa(WydID, Telefon) VALUES(7, '666-6666');

Usuwanie
DELETE [ FROM ] nazwa_relacji [ WHERE warunek ];

Modyfikowanie
a) UPDATE nazwa_relacji SET atr1 = wartość [ DEFAULT ] [ NULL ],
atr2 = wartość [, ...] [ WHERE warunek ];
Np. Dodać informację o telefonie (123-45-67) wydawnictwa ‘Gamma Press’ i
poprawić jego nazwę – prawidłowa nazwa to ‘Game Press’:
UPDATE Wydawnictwa SET Nazwa='Game Press', Telefon ='123-45-67'
WHERE Nazwa='Gamma Press';
b) UPDATE relacja_A SET atrybutA1 = (SELECT atrybutB1 FROM
relacja_B[ WHERE ... ] ) [ WHERE ... ];
20.11.2015
Projektowanie Baz Danych
Ćw. 5
GiG-2-KG
Np. Ze względu na inflację należy podwyższyć cenę książek o 10% średniej
wartości wszystkich książek zaokrągloną do pełnych złotych:
UPDATE Książki SET Cena=Cena+(SELECT CAST( 0.1* AVG(CENA) AS
INT) FROM Książki);
5. Zapytania proste
5.1. Zapytanie proste
a. Wszystkie rekordy ze wskazanej tabeli
SELECT * FROM nazwa_tabeli
b. Wybrane kolumny ze wskazanej tabeli
SELECT nazwa_kol1, nazwa_kol2, … FROM nazwa_tabi
c. Wybrane kolumny ze wskazanych tabel
SELECT nazwa_kol1, nazwa_kol2, … FROM nazwa_tab1, nazwa_tab2
Jeżeli w obrębie kilku tabel, atrybuty mają takie same nazwy, to należy to
zaznaczyć:
SELECT nazwa_tab1.nazwa_kol, nazwa_tab2.nazwa_kol, … FROM
nazwa_tab1, nazwa_tab2
DISTINCT – eliminowanie duplikatów
ORDER BY (ASC|DSC) – sortowanie wyników (rosnąco, malejąco)
WHERE – selekcja wyników
SELECT [DISTINCT] {wyrażenie1 [AS alias1], wyrażenie2 [AS
alias2],.....} FROM {nazwa relacji} WHERE warunek_elementarny
ORDER BY {wyrażenie5 [ASC|DESC], wyrażenie6 [ASC|DESC], alias1
[ASC|DESC]…};
5.2. Wykorzystanie

Operatorów arytmetycznych – np. oblicz przychód księgarni od sprzedaży każdej
książki po uwzględnieniu zysku odprowadzanego do wydawnictwa:
SELECT Tytuł, Cena-0.1*Cena FROM Książki;

Operatorów logicznych
o Proste (=, !=, <>, >, >=, <, <=)
o
o
SELECT Tytuł FROM Książki WHERE Cena>50;
SELECT ISBN FROM Książki WHERE Tytuł='c++';
SELECT ISBN FROM Książki WHERE Tytuł='C++';
BETWEEN … AND …
SELECT Tytuł, Cena FROM Książki WHERE Cena BETWEEN 25 AND
29 ORDER BY Cena;
IN
SELECT Tytuł, Cena FROM Książki WHERE CENA IN(20, 51, 29)
ORDER BY Cena;
20.11.2015
Projektowanie Baz Danych
Ćw. 5
o
GiG-2-KG
LIKE – tylko tekst
SELECT Tytuł FROM Książki WHERE ISBN LIKE '0-999-9999-99';
np. Podać tytuły książek, zaczynających się na literę E lub T:
SELECT Tytuł FROM Książki WHERE Tytuł LIKE 'E%' OR Tytuł
LIKE 'T%';
o
o
o
o
o

IS NULL
IS NOT NULL
NOT BETWEEN … AND …
NOT IN
NOT LIKE
Aliasów - dla każdej książki skonstruuj następujące zdanie:
Książka pt. ”XXX” o numerze: YYY sprzedawana jest w cenie ZZZ zł, gdzie: XXX –
tytuł książki, YYY -numer ISBN, ZZZ – cena. Zdanie zatytułuj „Zestawienie”.
SELECT 'Książka pt. "'||Tytuł||'" o numerze: '||'ISBN'||'
sprzedawana jest w cenie '||Cena||' zł. ' AS Zestawienie FROM
Książki;
20.11.2015
Projektowanie Baz Danych
Ćw. 5
GiG-2-KG
Zadania
1. Utwórz poniższe tabele:
a. Studenci
i. Imię (pole tekstowe do 15 znaków)
ii. Nazwisko (pole tekstowe do 15 znaków)
iii. Nr_indeksu (liczba całkowita, klucz gł.)
iv. Kierunek (pole tekstowe do 30 znaków)
b. Oceny
i. Nr_wpisu (liczba całkowita generowana automatycznie, klucz gł.)
ii. Ocena (liczba stałoprzecinkowa, z 1 miejscem po przecinku)
iii. ID_przedmiotu (liczba całkowita)
iv. Nr_indeksu (liczba całkowita)
c. Przedmioty
i. ID_przedmiotu (liczba całkowita generowana automatycznie, klucz gł.)
ii. Przedmiot (tekst do 55 znaków)
2. Wprowadź:
a. dla atrybutu Ocena relacji Oceny, wartość domyślną 2.0,
b. wartości wymagane w relacji Przedmioty (Przedmiot), Studenci (Imię,
Nazwisko), Oceny (),
c. ograniczenie, aby można było wprowadzać jedynie oceny z przedziału od 2 do
5,
d. odpowiednie klucze obce dla relacji Oceny,
e. 5 rekordów w relacji Studenci,
f. 6 rekordów w relacji Przedmioty,
g. po 2-3 oceny dla każdego studenta.
3. Wyświetl:
a. dane wszystkich studentów,
b. numery indeksów wszystkich studentów, którzy otrzymali co najmniej 1 ocenę
wyższą niż 3.5,
c. numery indeksów studentów, których nazwisko bądź imię zaczyna się na A lub
M,
d. nazwiska studentów, których średnia ocen jest większa od 4.0.
4. Zmodyfikuj co najmniej 3 wpisy w relacji Oceny i sprawdź, czy zmiany zostały
wprowadzone.
5. Utwórz nową tabelę Projekty o atrybutach:
a. ID_projektu (liczba całkowita generowana automatycznie, klucz gł.),
b. Nr_indeksu (liczba całkowita, klucz obcy z relacji Studenci),
c. ID_przedmiotu(liczba całkowita, klucz obcy z relacji Przedmioty),
d. Termin (data).
6. Wprowadź 5 różnych projektów.
20.11.2015
Projektowanie Baz Danych
Ćw. 5
GiG-2-KG
7. W relacji Oceny wprowadź nową kolumnę ID_projektu (liczba całkowita, klucz obcy z
relacji Projekty, wartość opcjonalna).
8. Zaktualizuj dla części rekordów z relacji Oceny, tak aby każdy ze studentów miał
ocenę z co najmniej 1 projektu.
9. Wypisz wszystkich studentów, którzy otrzymali oceny z przynajmniej 2 projektów.