Dr inż. Witold Rekuć p. 57 B4 www.ioz.pwr.wroc.pl, witold.rekuc@pwr.wroc.pl Wykład kończy się zaliczeniem na ocenę na podstawie kolokwium, które zostanie przeprowadzone na przedostatnim wykładzie Literatura. C. Date. Wprowadzenie do systemów baz danych. WNT, 2000. 2. Ullman J., Widom J.. Podstawowy wykład z systemów baz danych. WNT, 2000. 3. Gruber M., SQL, Helion, 996. 4. Celko J., SQL zaawansowane techniki programowania. Mikom, 999. 5. Materiały do wykładu Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL
. Pojęcia relacyjnych baz danych 2. Operacje relacyjne 3. Operacje teoriomnogościowe 4. Operacja dzielenia 5. Operacja teta-złączenia 6. Projektowanie tabel Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 2
. Pojęcia relacyjnych baz danych Laboratorium IBM San Jose (California) A relational model for large shared data banks Communication of the ACM, 3:6,970. System R - prototyp oprogramowania SEQUEL2 prototyp języka Dziś: Oprogramowanie MS ACCESS, SQL Server, PostgreSQL, INGRES, ORACLE, DB2, Informix, Progres, Język SQL Edgar F. Codd Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 3
Baza danych jest zbiorem tabel (relacji) pamiętanych w jednym lub wielu plikach Firmy Nr Nazwa 0 Nasza Firma Abeja 2 Audi 3 Pafawag Ulica Nasza Abejowska Audiego Wagonowa KodMjc 3 2 2 Telefon 234 23 234 55 Miejscowości Kod Nazwa KodWoj Wrocław DL 2 Opole OP 3 Wałbrzych DL Firm2000.mdb Wojewodztwa Kod Nazwa DL Dolnośląskie OP Opolskie 4 Iase Energetyczna 3 256 2 5 Dolmed Dokumenty Medyczna PozycjeDokumentu Nr NrSprzerdawcy Np SmbTow CenaNetto Ilość Nr NrSprzerdawcy NrNabywcy Data /02 0 00 2,00 20 /02 0 2 3.02.02 /02 0 2 003 4,50 200 2/02 0 3 2.03.02 2/02 0 004 7,00 50 /02 0 03.0.02 /02 002 3,00 300 3/02 0 3.04.02 /02 2 00 2,00 20 2/02 3 0 7.02.02 /02 3 004 7,50 220 4/02 0 4 3.05.02 3/02 0 00,00 45 Towary Smb Nazwa 00 Pasztet 002 Mortadela 003 Chipsy 004 Kawa Jakobs Jm kg kg paczka 400g paczka 00g StawkaVat 7% 7% 7% 7% 3/02 3/02 3/02 2/02 2/02 4/02 0 0 0 3 3 0 2 3 4 2 003 004 005 00 003 005 4,50 7,80 3,20 2,00 4,60 3,60 25 35 200 30 50 90 005 Makrela kons. puszka 250g 7% Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 4
System zarządzania bazą danych Baza danych System zarządzania bazą danych Język użytkowników bazy danych Język administratora bazy danych... Użytkownicy bazy danych Administrator bazy danych Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 5
Tabela (relacja) Nazwa tabeli (relacji) nazwa kolumny (atrybutu, pola) Firmy Nr Nazwa Ulica KodMjc Telefon nagłówek (schemat) 0 Nasza Firma Nasza 234 23 Abeja Abejowska 3 234 55 2 3 4 Audi Pafawag Iase Audiego Wagonowa Energetyczna 2 2 3 256 2 Wiersz (rekord, krotka) 5 Dolmed Medyczna kolumna (atrybut, pole) Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 6
Wartości w kolumnach (wartości atrybutów) Firmy Nr Nazwa Ulica KodMjc Telefon 0 Nasza Firma Nasza 234 23 Abeja Abejowska 3 234 55 2 Audi Audiego 2 3 Pafawag Wagonowa 2 4 Iase Energetyczna 3 256 2 5 Dolmed Medyczna 6 Dolmel Elektryczna 3 452 34 6 Zbiór dopuszczalnych numerów firm Dolme l Zbiór dopuszczalnych nazw firm Elektryczn a Zbiór dopuszczalnych nazw ulic 3 Zbiór dopuszczalnych kodów miejscowości 452 34 Zbiór dopuszczalnych numerów telefonów Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 7
Dziedzina Dziedzina wartości jest to zbiór wartości, które potencjalnie mogą pojawić się w kolumnie tabeli (które może przyjmować atrybut). Wartości w kolumnach musza być traktowane jako atomowe - niepodzielne na mniejsze części Różne dziedziny wartości nie muszą być rozłączne Dziedzinę określa się przez podanie typu danych oraz dodatkowych ograniczeń (więzów) lub właściwości Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 8
Określoność wartości w kolumnach (wartości atrybutów) Firmy Nr Nazwa Ulica KodMjc Telefon 0 Nasza Firma Nasza 234 23 Abeja Abejowska 3 234 55 2 Audi Audiego 2 3 Pafawag Wagonowa 2 4 5 Iase Dolmed Energetyczna Medyczna 3 256 2 Wartość nieokreślona 6 Dolmel Elektryczna 3 6 Zbiór dopuszczalnych numerów firm Dolme l Zbiór dopuszczalnych nazw firm Elektrycz na 3 Zbiór dopuszczalnych nazw ulic Zbiór dopuszczalnych kodów miejscowości 452 34 Zbiór dopuszczalnych numerów telefonów Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 9
Projektując tabelę dla pewnego zastosowania możemy rozstrzygnąć dla każdej kolumny: - czy wartość w kolumnie musi być zawsze określona, - czy wartość w kolumnie może być nieokreślona. Do oznaczenia wartości nieokreślonych stosuje się słowo NULL: Telefon is NULL Telefon is not NULL telefon jest nieokreślony telefon jest określony Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 0
Nieokreśloność wartości w kolumnach i logika trójwartościowa 6 Dolmel Elektryczna 3 452 34 Telefon = Telefon is Telefon is 452 34? NULL? not NULL? TRUE FALSE TRUE 6 Dolmel Elektryczna 3 234 09 FALSE FALSE TRUE 6 Dolmel Elektryczna 3 UNKNOWN TRUE FALSE NULL Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL
Klucze tabeli Kluczem tabeli nazywamy niepusty zbiór atrybutów tabeli, które identyfikują wiersz tabeli i żaden jego podzbiór właściwy tej własności nie ma Dokumenty Nr NrSprzerdawcy NrNabywcy Data /02 0 2 3.02.02 2/02 /02 0 3 0 2.03.02 03.0.02 Kluczem w tabeli Dokumenty jest zbiór 3/02 0 3.04.02 K = {Nr, NrSprzedawcy} 2/02 3 0 7.02.02 4/02 0 4 3.05.02 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 2
Inne przykłady: Osoba(Pesel, Nip, Nazwisko, Imię, DataUrodzenia) K={Pesel}, K2={Nip} Egzamin(NrStudenta, KodPrzedmiotu, Data, Ocena) K={NrStudenta, KodPrzedmiotu, Data} PozycjeDokumentu(Nr, NrSprzedawcy, Np,SmbTow, CenaNetto, Ilość) K={Nr, NrSprzedawcy, Np}, K2={Nr, NrSprzedawcy, SmbTow} ObrotyMiesięczne(Rok, Mc, Wartość) K={Rok, Mc} Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 3
Wszystkie klucze zdefiniowane dla danej tabeli sa zwane kluczami kandydującymi Kluczem podstawowym tabeli nazywamy klucz, który ze względu na pewne cechy praktyczne zostaje arbitralnie wybrany spośród kluczy tabeli Przykład: Przedmiot (Kod, Nazwa, Opis) K={Kod}, K2={Nazwa} Kluczem podstawowy: K Określoność wartości kluczy Każdy klucz tabeli musi mieć wartość określoną (NULL jest niedopuszczalne) Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 4
Definiowanie tabel bazy danych w języku SQL Notacja dla opisu składni: [wyrażenie] wyrażenie wyrażenie2 wyrażenie [,...] oznacza, że wyrażenie nie jest obowiązkowe oznacza albo wyrażenie albo wyrażenie2 oznacza możliwość powtarzania wyrażenia pewną liczbę razy {wyrażenie wyrażenie2 } nawiasy klamrowe służą do oznaczenia grupy ::= czytaj jest to wyrażeń (jak nawiasy w matematyce) UPDATE słowo kluczowe (symbol terminalny), ; ( ) znaki pojawiające się w wyrażeniach SQL (symbole terminalne) Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 5
CREATE TABLE nazwa_tabeli ( {nazwa_kolumny typ_kolumny[(rozmiar)]} [,...] )[;] Przykład definicji tabeli w języku SQL create table Firmy ( Nr Nazwa Ulica KodMjc Telefon DatZał Kapitał CzySpółka ); integer, char(30), char(30), char(5), char(20), datetime, real, bit Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 6
Podstawowe typy danych Typ danych Wielkość pamięci Opis BIT bajt Wartości Yes i No oraz pola zawierające tylko jedną z dwóch wartości. BYTE bajt Liczba całkowita z przedziału od 0 do 255. MONEY 8 bajtów Liczba całkowita z przedziału [ 922 337 203 685 477,5808; 922 337 203 685 477,5807] DATETIME 8 bajtów Wartość daty lub godziny z przedziału lat od 00 do 9999. REAL 4 bajty Wartość rzeczywista o pojedynczej precyzji mieszcząca się w przedziale [ 3,402823E38;,40298E-45] dla wartości ujemnych i [,40298E-45; 3,402823E38] dla wartości dodatnich oraz 0. FLOAT 8 bajtów Wartość rzeczywista o podwójnej precyzji należąca do zakresu [,7976933486232E308; 4,9406564584247E-324] dla wartości ujemnych i [ 4,9406564584247E-324;,7976933486232E308] dla wartości dodatnich oraz 0. SMALLINT 2 bajty Liczba całkowita z przedziału [ 32 768; 32 767]. INTEGER 4 bajty Liczba całkowita z przedziału [ 2 47 483 648; 2 47 483 647]. TEXT 2 bajty na znak Od zera do maksymalnie 2,4 gigabajta. CHARACTER 2 bajty na znak Od zera do 255 znaków. Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 7
CREATE TABLE nazwa_tabeli ( {nazwa_kolumny typ_kolumny[(rozmiar)] [ograniczenie_kolumnowe ]} [,...] )[;] ograniczenie_kolumnowe::= [ CONSTRAINT nazwa_ograniczenia] { PRIMARY KEY UNIQUE NOT NULL REFERENCES nazwa_tabeli_decelowej (nazwa_kolumny_w_tabeli_docelowej)]} PRIMARY KEY UNIQUE NOT NULL - wskazanie, że kolumna tworzy klucz główny - wskazanie, że kolumna tworzy klucz inny - wskazanie, że w kolumnie wszystkie wartości muszą być określone REFERENCES... - o tym dalej Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 8
Przykład definicji tabeli w języku SQL create table Firmy ( Nr integer constraint c primary key, Nazwa char(30) constraint c2 unique not null, Ulica char(30) constraint c3 unique not null, KodMjc integer, Telefon char(20), DatZał datetime, Kapitał real constraint c4 not null, CzySpółka bit constraint c5 not null ); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 9
Modyfikowanie definicji tabel bazy danych w języku SQL Usuń tabelę z bazy danych DROP TABLE nazwa_tabeli [;] Modyfikuj definicję tabeli ALTER TABLE nazwa_tabeli { ADD COLUMN nazwa_kolumny typ [(rozmiar)] [NOT NULL] [ograniczenie_kolumnowe] ADD CONSTRAINT ograniczenie_tabelowe ALTER COLUMN nazwa_kolumny typ [(rozmiar)] DROP COLUMN nazwa_kolumny DROP CONSTRAINT nazwa_ograniczenia } [;] Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 20
Przyklady alter table firmy add column liczba_prac byte constraint c6 not null; alter table firmy add column liczba_prac byte not null; alter table firmy alter column liczba_prac integer; alter table firmy drop constraint c2; alter table firmy drop column liczba_prac; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 2
Modyfikowanie zawartości tabel bazy danych w języku SQL INSERT INTO nazwa_tabeli [(nazwa_kolumny [,...])] VALUES (wartość [,...])[;] wartość musi być wartością dziedziny (typu) okreslonej dla kolumny w definicji tabeli Przyklady insert into firmy values (, "Dolmel", "Chorobowa 3", 4, NULL, #202-02-3#, 2000, yes, 20); insert into firmy (Nr, Nazwa, Ulica, KodMjc, Telefon, DatZał, Kapitał, CzySpółka, liczba_prac) values (2, "Famag", "Krakowska 3", 2, NULL, #2000-06-23#, 20000, no, 200); insert into firmy (Telefon, DatZał, Kapitał, Nr, Nazwa, Ulica, KodMjc, CzySpółka, liczba_prac) values ("34-23", #2000-2-23#, 20, 3, "Miki", "Mikowska 3", 4, no, 2); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 22
INSERT INTO nazwa_tabeli [(nazwa_kolumny [,...])] SELECT [nazwa_tabeli.]nazwa_kolumny [,...] FROM wyrażenie_tabelowe [WHERE warunek] [;] wyrażenie_tabelowe nazwa tabeli (lub wyrażenie, którego wartością jest tabela - patrz wykład dalej) Przyklady create table r2(c integer, D integer); insert into r2 values (,2); insert into r2 values (3,4); insert into r2 values (5,3); r2 C D 2 3 4 5 3 create table r(a integer, B integer); insert into r(a, B) select C, D from r2; insert into r(a, B) select D, C from r2 where D>2; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 23
UPDATE nazwa_tabeli SET nazwa_kolumny = nowa_wartość [, ] [WHERE warunek] [;] Przyklady r A B 2 update r set A = 0, B = 20; r A B 0 20 0 20 0 20 3 4 5 3 update r set A = 0, B = 20 where A>2; r A B 2 0 20 0 20 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 24
DELETE nazwa_tabeli.* * FROM nazwa_tabeli [WHERE warunek][;] Przyklady r A B 2 3 4 delete r.* from r; delete * from r; r r A A B B 5 3 delete * from r where A>3; r A B 2 3 4 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 25
Operatory porównania Operator Znaczenie < dla x<y zwraca wartość TRUE, gdy x jest mniejsze od y <= dla x<=y zwraca wartość TRUE, gdy x jest mniejsze lub równe y > dla x>y zwraca wartość TRUE, gdy x jest większe od y >= dla x>=y zwraca wartość TRUE, gdy x jest większe lub równe y = dla x=y zwraca wartość TRUE, gdy x jest równe y <> dla x<>y zwraca wartość TRUE, gdy x nie jest równe y Operatory logiczne Operator And Or Eqv Not Xor Znaczenie p And q zwraca TRUE gdy p i q są prawdziwe p Or q zwraca TRUE gdy p lub q jest prawdziwe p Eqv q zwraca TRUE gdy oba p iq są prawdziwe lub oba p i q są nieprawdziwe Not p zwraca TRUE gdy p nie jest prawdziwe p Xor q zwraca TRUE gdy albo p albo q jest prawdziwe Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 26
Problem poprawności bazy danych W aktualizacji bazy danych musimy zapewnić poprawność bazy danych: Poprawność formalna zgodność bazy danych z regułami formalnymi Poprawność merytoryczna zgodność bazy danych z rzeczywistością Poprawność formalna więzy integralnościowe: więzy dziedziny wartość atrybutu w tabeli musi należeć do dziedziny tego atrybutu lub jeżeli jest to dopuszczalne może być nieokreślona (NULL) więzy klucza w tabeli nie mogą występować dwa lub więcej wierszy o tej samej wartości klucza; klucz musi mieć wartość określoną więzy integralności referencyjnej patrz niżej inne więzy patrz niżej Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 27
Więzy dziedziny i klucza Firmy Nr 0 Nazwa Nasza Firma Ulica Nasza KodMjc Telefon 234 23 Abeja Abejowska 3 234 55 2 Audi Audiego 2 3 Pafawag Wagonowa 2 4 Iase Energetyczna 3 256 2 5 Dolmed Medyczna Dodaj wiersz -3 Makrosoft Informatyczna A NULL Naruszenie więzów dziedziny Dodaj wiersz NULL Makrosoft Informatyczna NULL Naruszenie więzów klucza Dodaj wiersz 2 Makrosoft Informatyczna NULL Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 28
Więzy integralności referencyjnej Firmy Miejscowości Nr Nazwa Ulica KodMjc Telefon Kod Nazwa KodWoj 0 Nasza Firma Nasza 234 23 Wrocław DL 2 3 Abeja Audi Pafawag Abejowska Audiego Wagonowa 3 2 2 234 55 2 3 Opole Wałbrzych OP DL 4 Iase Energetyczna 3 256 2 5 Dolmed Medyczna Dodaj do tabeli Firmy wiersz: 6 TP SA Telewizyjna 4 345 90 Usuń z tabeli Miejscowości wiersz: 2 Opole DL Pytanie do bazy danych: w jakich województwach mają siedziby firmy, z którymi handlujemy? Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 29
Firmy Miejscowości Nr Nazwa Ulica KodMjc Telefon Kod Nazwa KodWoj 0 Nasza Firma Nasza 234 23 Wrocław DL Abeja Abejowska 3 234 55 2 Opole OP 2 Audi Audiego 2 3 Wałbrzych DL 3 Pafawag Wagonowa 2 4 Iase Energetyczna 3 256 2 5 Dolmed Medyczna Dla każdego wiersza tabeli Firmy musi występować wiersz w tabeli Miejscowości taki, że: Firmy.KodMjc=Miejscowości.Kod Dla każdego wiersza tabeli Miejscowości może występować wiersz w tabeli Firmy taki, że: Firmy.KodMjc=Miejscowości.Kod Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 30
Firmy Miejscowości Nr Nazwa Ulica KodMjc Telefon Kod Nazwa KodWoj 0 Nasza Firma Nasza 234 23 Wrocław DL Abeja Abejowska 3 234 55 2 Opole OP 2 Audi Audiego 2 3 Wałbrzych DL 3 4 Pafawag Iase Wagonowa Energetyczna 2 3 256 2 Klucz = {Kod} 5 Dolmed Medyczna Klucz = {Nr} Klucz obcy = {KodMjc} Dane są dwie tabele: To zwana tabelą odwołania Td zwana tabelą docelową Kluczem obcym tabeli To do tabeli Td nazywamy taki niepusty zbiór atrybutów To, którego wartości są wartościami klucza tabeli Td Więzy integralności referencyjnej Dla każdej wartości klucza obcego w tabeli odwołania w tabeli docelowej musi istnieć unikalny wiersz zawierający wartość tego klucza. Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 3
Przykład: Student (Nr, Nazwisko, Adres) Klucz={Nr} Egzamin (NrStudenta, KodPrzedmiotu, Data, Ocena) Klucz={NrStudenta, KodPrzedmiotu, Data} KluczObcy do tabeli Student KO={NrStudenta} KluczObcy do tabeli Przedmiot KO2={KodPrzedmiotu} Przedmiot (Kod, Nazwa) Klucz={Kod} Przykład: Dostawca (Kod, Nazwa, Ulica, KodMjc) Miejscowość (Kod, Nazwa) Dostawa (KodDostawcy, SmbTowaru, Data, Ilość) Towar (Symbol, Nazwa, Cena, Jm) Wskazać klucze i klucze obce! Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 32
CREATE TABLE nazwa_tabeli ( nazwa_kolumny typ_kolumny[(rozmiar)] [ograniczenie_kolumnowe ] [,...] )[;] ograniczenie_kolumnowe::= [ CONSTRAINT nazwa_ograniczenia] { PRIMARY KEY UNIQUE NOT NULL REFERENCES nazwa_tabeli_decelowej (nazwa_kolumny_w_tabeli_docelowej)]} PRIMARY KEY UNIQUE NOT NULL REFERENCES klucz podstawowy klucz dodatkowy wymagane klucz obcy Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 33
Przykład create table Miejscowosci ( Kod Byte primary key, Nazwa char(30) not null ); create table Firmy ( Nr Byte primary key, Nazwa char(30) not null, Ulica char(30) not null, KodMjc Byte not null references Miejscowosci (Kod), Telefon char(20) ); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 34
Ograniczenia tablicowe CREATE TABLE nazwa_tabeli ( nazwa_kolumny typ_kolumny[(rozmiar)] [ograniczenie_kolumnowe ] [,...] [,ograniczenie_tablicowe [,...]] )[;] ograniczenie_tablicowe ::= [ CONSTRAINT nazwa_ograniczenia] { PRIMARY KEY (nazwa_kolumny_klucza_głównego[,...]) UNIQUE (nazwa_kolumny_klucza_dodatkowego[,...]) FOREIGN KEY (nazwa_kolumny_w_tabeli [, ]) REFERENCES nazwa_tabeli_docelowej (nazwa_kolumny_w_tabeli_docelowej[,...]) } PRIMARY KEY UNIQUE FOREIGN KEY REFERENCES klucz podstawowy klucz dodatkowy klucz obcy Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 35
Przykład create table FAKTURY ( NrFaktury char(2), NrSprzedawcy integer, NrNabywcy integer not null, Data datetime not null, constraint pk_d primary key (NrFaktury, NrSprzedawcy) ) create table POZYCJEFAKTURY ( NrFaktury char(2), NrSprzedawcy integer, NrPozycji byte, SmbTow char(4), Ilość float, CenaNetto float, constraint pk_pd primary key (NrFaktury, NrSprzedawcy, NrPozycji), constraint uq_pd unique (NrFaktury, NrSprzedawcy, SmbTow), constraint fk_pd foreign key (NrFaktury, NrSprzedawcy) references FAKTURY(NrFaktury, NrSprzedawcy) ) Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 36
Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 37
Inne więzy integralnościowe Więzy inne są specyficzne dla dziedziny zastosowań. Są one określone przez warunki, których niespełnienie byłoby świadectwem błędu w danych lub świadectwem naruszenia reguł organizacji, w której baza danych jest użytkowana. Przykłady:. Data dostawy nie może być wcześniejsza od daty zamówienia tej dostawy. 2. Dla każdego promotora liczba dyplomatów nie może być większa od 5. 3. Nie może być wykonane wypożyczenie książki czytelnikowi, który zalega ze zwrotem innych książek. Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 38
2. Operacje relacyjne Operacje na tabelach Operacje relacyjne Projekcja Operacje teoriomnogościowe Suma Selekcja Złączenie Dzielenie Iloczyn Różnica niesymetryczna Dopełnienie Przemianowanie Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 39
Operacja projekcji Wyznacza tabelę o schemacie ograniczonym do zbioru zadanych nazw r(r) - tabela r o schemacie R poddawana projekcji X schemat nowej tabeli - zbiór zadanych nazw (X R) q(x) - tabela q o schemacie X - wynik projekcji q(x) = X ( r (R) ) = { t[x] : t r } gdzie t[x] oznacza wiersz powstały przez zredukowanie t do wartości atrybutów z X R X Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 40
Przykład r A B C D a5 b2 c d a6 b4 c5 d2 a6 b4 c d3 a6 b4 c d2 a b2 c2 d {C,D} ( r ({A,B,C,D}) ) = q({c,d}) C D c d c5 d2 c d3 c d2 c2 d {A,B} ( r ({A,B,C,D}) ) = q({a,b}) A a5 a6 a B b2 b4 b2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 4
Przykład Podaj nazwy i numery telefonów firm q({nazwa, Telefon}) = {Nazwa, Telefon} ( Firmy ({Nr, Nazwa, Ulica,KodMjc, Telefon})) q Firmy Nazwa Telefon Nr Nazwa Ulica KodMjc Telefon Nasza Firma 234 23 0 Nasza Firma Nasza 234 23 Abeja 234 55 Abeja Abejowska 3 234 55 Audi Pafawag {Nazwa, Telefon} 2 3 Audi Pafawag Audiego Wagonowa 2 2 Iase 256 2 4 Iase Energetyczna 3 256 2 Dolmed 5 Dolmed Medyczna wiersze zredukowane do X={Nazwa, Telefon} Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 42
Realizacja w SQL (SELECT FROM) SELECT [ ALL DISTINCT] DISTINCTROW [TOP n [PERCENT]] { * nazwa_tabeli.* {[nazwa_tabeli.] nazwa_kolumny [AS alias]}[,...] } [ INTO nazwa_nowej_tabeli ] [FROM wyrażenie_tabelowe [,...]] SELECT ALL DISTINCT DISTINCTROW TOP n TOP n PERCENT wybierz wszystkie (także duplikaty) unikalne wartości (bez duplikatów) unikalne wiersze (o tym potem) od góry n wierszy od góry n procent wierszy Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 43
r A B 2 3 4 2 2 5 2 3 3 3 4 2 select * from r; select r.* from r; select A, B from r; select r.a, r.b from r; select A as X, B as Y from r; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 44 A B 2 3 4 2 2 5 2 3 3 3 4 2 X Y 2 3 4 2 2 5 2 3 3 3 4 2
A B 2 3 4 2 2 5 2 3 3 3 4 2 select A from r; select r.a from r; select all A from r; select distinct A from r; select top 3 * from r; select top 5 percent * from r; A 3 2 5 3 3 A 2 3 5 A B 2 3 4 2 2 A B 2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 45
Przykład create table Miejscowosci ( Kod Byte primary key, Nazwa char(30) not null ); create table Firmy ( Nr Byte primary key, Nazwa char(30) not null, Ulica char(30) not null, KodMjc Byte not null references Miejscowosci (Kod), Telefon char(20) ); select nazwa, telefon from Firmy; select distinct nazwa, telefon from Firmy; select * from Firmy; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 46
Przykład: Podaj kody miejscowości siedzib firm q({kodmjc}) = {KodMjc} ( Firmy ({Nr,Nazwa,Ulica,KodMjc,Telefon})) q KodMjc 3 {KodMjc} Firmy 2 2 3 select kodmjc from Firmy; Nr 0 Nazwa Nasza Firma Abeja Ulica Nasza Abejowska KodMjc 3 Telefon 234 23 234 55 2 Audi Audiego 2 3 Pafawag Wagonowa 2 q KodMjc {KodMjc} 4 5 Iase Dolmed Energetyczna Medyczna 3 256 2 3 2 select distinct kodmjc from Firmy; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 47
Przykład Chcemy obliczyć wartość średnią obrotu miesięcznego w roku q({obrót}) = {Obrót} ( Obroty ({Miesiąc,Obrót}) ) q Obroty Obrót Miesiąc Obrót 00 00 200 200 300 00 {Obrót} Styczeń Luty Marzec Kwiecień Maj czerwiec 00 00 200 200 300 00 Zostaw duplikaty w tabeli wynikowej select distinct Obrót from Obroty; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 48
Operacja selekcji Wyznacza tabelę o schemacie identycznym schematowi tabeli zadanej ale o wierszach spełniających pewien warunek selekcji r(r) tabela r o schemacie R poddawana selekcji F warunek selekcji (formuła logiczna) q(r) tabela q o schemacie R - wynik selekcji q(r) = F ( r (R) ) = { t : t r i F(t) = prawda } wiersze spełniające warunek selekcji Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 49
Przykład r A B C D a5 2 a a6 4 a5 2 a6 4 a a6 4 a 2 a 2 a r ({A,B,C,D}) ) = q ({A,B,C,D}) B A B C D r ({A,B,C,D}) ) = q ({A,B,C,D}) B A B C D and D<2 a6 4 a5 2 a6 4 a a6 4 a 2 a6 4 a r ({A,B,C,D}) ) = q ({A,B,C,D}) B=4 A B C D or D<2 a5 2 a a6 4 a5 2 a6 4 a a6 4 a 2 a 2 a Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 50
Realizacja w SQL (SELECT...FROM...WHERE) SELECT [ ALL DISTINCT DISTINCTROW [TOP n [PERCENT]] { * nazwa_tabeli.* {[nazwa_tabeli.] nazwa_kolumny [AS alias]}[,...] } [ INTO nazwa_nowej_tabeli ] [FROM wyrażenie_tabelowe [,...]] [WHERE warunek ] warunek stałe wyrażenie logiczne składające się z nazw kolumn (zmiennych), wartości stałych, symboli funkcji i operacji, operatorów porównania, operatorów logicznych, operatorów specjalnych, nawiasów okrągłych liczby całkowite ze znakiem lub bez liczby rzeczywiste ze znakiem lub bez daty #rrrr-mm-dd# czas #gg-mm# stałe napisowe o postaci ciąg znaków Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 5
Wybrane funkcje Funkcja Date() Now() Year(data) Month(data) Right(arg,arg2) Left(arg,arg2) Mid(arg,arg2,arg3) Len(napis) Znaczenie zwraca bieżącą datę z kalendarza komputera. zwraca bieżącą datę i czas z kalendarza/zegara komputera wymaga argumentu typu Data i zwraca rok jako 4-cyfrową liczbę. wymaga argumentu typu Data i zwraca miesiąc jako liczbę z zakresu -2. zwraca prawą część napisu (arg), licząc tyle znaków od prawej na ile wskazuje arg2. zwraca lewą część napisu (arg), licząc tyle znaków od lewej na ile wskazuje arg2. zwraca podnapis napisu arg od znaku w pozycji arg2 i długości arg3. zwraca liczbę znaków w napisie (długość napisu). Avg(kol) średnia wartości z kolumny 'kol'. Count(kol) First i Last(kol) Min i Max(kol) Sum(kol) liczba wartości w kolumnie 'kol'. pierwsza i ostatnia wartość w kolumnie 'kol'. najmniejsza i największa wartość w kolumnie 'kol'. suma wartości z kolumny 'kol'. Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 52
Operatory arytmetyczne Operator Znaczenie + Suma dwóch liczb. różnica miedzy dwiema liczbami i oznaczenie liczby ujemnej. * iloczyn dwóch liczb. / iloraz dwóch liczb. \ zaokrąglij do całkowitych dzielną i dzielnik, oblicz iloraz oraz z ilorazu odrzuć część ułamkową. Mod ^ oblicz resztę dzielenia dwóch liczb. podnieś do potęgi. Operatory porównania Operator < <= > >= = <> Operatory logiczne Operator And Or Eqv Not Xor Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 53
Operatory napisowe Operator & Znaczenie dla napis&napis2 wynikiem jest napis, po którym następuje bezpośrednio napis2. + jak dla &, ale gdy jeden lub oba napisy są NULL to wynik jest NULL. Operatory specjalne Operator Is Null lub Is Not Null Like "wzorzec" Between wartość And wartość2 In (wartość, wartość2,...) Znaczenie dla x Is Null zwraca wartość TRUE, gdy x jest nieokreśone. dla x Is Not Null zwraca wartość TRUE, gdy x jest okreśone. dla x like wzorzec zwraca TRUE, gdy x pasuje do wzorca. We wzorcu znak? reprezentuje dowolną pozycję znakową a * - reprezentuje dowolny ciąg znaków. dla x Between a And b zwraca TRUE a <= x <= b. dla x IN (wartość, wartość2,...) zwraca TRUE gdy x {wartość, wartość2,...}. Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 54
Przykład Podaj dane miejscowości z województwa dolnośląskiego q({kod,nazwa,kodwoj}) = KodWoj=DL ( Miejscowości ({Kod,Nazwa,KodWoj}) ) Miejscowości q Kod Nazwa Wrocław KodWoj DL Wrocław DL 3 Wałbrzych DL Kod Nazwa KodWoj KodWoj=DL 2 Opole OP 3 Wałbrzych DL 4 Warszawa MZ 5 6 Katowice Kraków SL MP select Kod, Nazwa, KodWoj from Miejscowości where KodWoj = "DL"; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 55
q({... })= (KodMjc=2) and (Telefon is NULL) (Firmy({Nr,Nazwa,Ulica,KodMjc,Telefon})) select * from Firmy where (KodMjc = 2) and (Telefon IS NULL); q({... })= (KodMjc=2) or (Telefon is NULL) (Firmy({Nr,Nazwa,Ulica,KodMjc,Telefon})) select * from Firmy where (KodMjc = 2) or (Telefon IS NULL); q({... })= (KodMjc=2) or (KodMjc=3) (Firmy({Nr,Nazwa,Ulica,KodMjc,Telefon})) select * from Firmy where (KodMjc = 2) or (KodMjc = 3); q({... })= (KodMjc=2) and (KodMjc=3) (Firmy({Nr,Nazwa,Ulica,KodMjc,Telefon}))! select * from Firmy where (KodMjc = 2) and (KodMjc = 3); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 56
Złożenie operacji projekcji i selekcji (SELECT...FROM...WHERE) q(x) = X ( F ( r (R) ) Przykład Podaj nazwy firm z Opola, które nie mają określonego numeru telefonu q({nazwa})= (KodMjc=2) and (Telefon is NULL) (Firmy({Nr,Nazwa,Ulica,KodMjc,Telefon})) Firmy q Nazwa Audi Pafawag {Nazwa} ( (KodMjc=2) and (Telefon is NULL) Nr 0 2 3 Nazwa Nasza Firma Abeja Audi Pafawag Ulica Nasza Abejowska Audiego Wagonowa KodMjc 3 2 2 Telefon 234 23 234 55 4 Iase Energetyczna 3 256 2 5 Dolmed Medyczna select Nazwa from Firmy where (KodMjc = 2) and (Telefon IS NULL); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 57
Porządkowanie wierszy w tabeli wynikowej (ORDER BY) SELECT [ ALL DISTINCT DISTINCTROW [TOP n [PERCENT]] { * nazwa_tabeli.* {[nazwa_tabeli.] nazwa_kolumny [AS alias]}[,...] } [FROM wyrażenie_tabelowe [,...]] [WHERE warunek ] [ORDER BY {nazwa_kolumny [ASC DESC]} [, ] ][;] ORDER BY ASC DESC - uporządkuj według - rosnąco - malejąco Przykład select KodMjc, Nazwa, Ulica from Firmy where (KodMjc = 2) or (KodMjc = 3) order by KodMjc asc, Nazwa asc; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 58
Wyrażenia po SELECT SELECT [ ALL DISTINCT DISTINCTROW [TOP n [PERCENT]] { * nazwa_tabeli.* {[nazwa_tabeli.] nazwa_kolumny [AS alias] wyrażenie [AS alias]}[,...] } [ INTO nazwa_nowej_tabeli ] [FROM wyrażenie_tabelowe [,...]] [WHERE warunek ] [GROUP BY nazwa_kolumny [, ]] [HAVING warunek ] [ORDER BY {nazwa_kolumny [ASC DESC]} [, ] ][;] Przykład select 2+2 as czwórka; select sin() as Sinus; select sin() + 5 as Sinus, 20 as Dwadzieścia; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 59
Agragowanie wartości w kolumnach (GROUP BY HAVING) SELECT [ ALL DISTINCT DISTINCTROW [TOP n [PERCENT]] { * nazwa_tabeli.* {[nazwa_tabeli.] nazwa_kolumny [AS alias] wyrażenie [AS alias]}[,...] } [ INTO nazwa_nowej_tabeli ] [FROM wyrażenie_tabelowe [,...]] [WHERE warunek ] [GROUP BY nazwa_kolumny [, ]] [HAVING warunek ] [ORDER BY {nazwa_kolumny [ASC DESC]} [, ] ][;] GROUP BY HAVING - grupuj według - mając spełnione Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 60
Przykład r A B 2 4 8 2 7 2 3 2 4 2 2 select A, sum(b) as Suma from r group by A; select A, Count(B) as Liczność from r group by A; A Suma 4 2 6 A Liczność 3 2 4 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 6
Przykład 2 r3 r A B C I a 2 I a 4 I b 8 I b 7 I b 3 I b 2 I c 4 I c 2 II a 5 II a II a 4 II a 7 II c 5 II c 3 II c 8 select A, B, sum(c) as [Razem C] from r3 group by A, B; A B Razem C I a 6 I b 20 I c 6 II a 7 II c 6 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 62
Przykład 3 r3 r A B C I a 2 I a 4 I b 8 I b 7 I b 3 I c 4 I c 2 I b 2 II c 5 II c 3 II c 8 II a 5 II a II a 4 II a 7 A B C I a 2 I a 4 II a 5 II a II a 4 II a 7 I b 8 I b 7 I b 3 I b 2 I c 4 I c 2 II c 5 II c 3 II c 8 select B, A, sum(c) as [Razem C] from r3 group by B, A; B A Razem C a I 6 a II 7 b I 20 c I 6 c II 6 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 63
Operacja równozłączenia Problem: chcemy uzyskać zestawienie firm z nazwami miejscowości. Firmy Nr Nazwa Ulica KodMjc Telefon 0 Nasza Firma Nasza 234 23 Abeja Abejowska 3 234 55 2 Audi Audiego 2 3 Pafawag Wagonowa 2 Miejscowości Kod Nazwa KodWoj Wrocław DL 2 Opole OP 3 Wałbrzych DL Wojewodztwa Kod Nazwa DL Dolnośląskie OP Opolskie 4 Iase Energetyczna 3 256 2 5 Dolmed Dokumenty Medyczna PozycjeDokumentu Nr NrSprzerdawcy Np SmbTow CenaNetto Ilość Nr NrSprzerdawcy NrNabywcy Data /02 0 00 2,00 20 /02 0 2 3.02.02 /02 0 2 003 4,50 200 2/02 0 3 2.03.02 2/02 0 004 7,00 50 /02 0 03.0.02 /02 002 3,00 300 3/02 0 3.04.02 /02 2 00 2,00 20 2/02 3 0 7.02.02 /02 3 004 7,50 220 4/02 0 4 3.05.02 3/02 0 00,00 45 Towary 3/02 3/02 0 0 2 3 003 004 4,50 7,80 25 35 Smb Nazwa Jm StawkaVat 3/02 0 4 005 3,20 200 00 Pasztet kg 7% 2/02 3 00 2,00 30 002 Mortadela kg 7% 2/02 3 2 003 4,60 50 003 Chipsy paczka 400g 7% 4/02 0 005 3,60 90 004 Kawa Jakobs paczka 00g 7% 005 Makrela kons. puszka 250g 7% Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 64
Firmy Nr 0 2 3 4 Nazwa Nasza Firma Abeja Audi Pafawag Iase Ulica Nasza Abejowska Audiego Wagonowa Energetyczna KodMjc 3 2 2 3 Telefon 234 23 234 55 256 2 Miejscowości Kod Nazwa KodWoj Wrocław DL 2 Opole OP 3 Wałbrzych DL 5 Dolmed Medyczna Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 65
Definicja operacji równozłączenia Dane są: r(r) s(s) q(r S) tabela r o schemacie R, A R tabela s o schemacie S, B S tabela s o schemacie R S wynik złączenia Uwaga: R i S nie zawierają tych samych nazw (R S = Ø) q(r S) = r [ A=B ] s = { t : t[r] r, t[s] s i t[a] = t[b] } r R A s S B v v t v v Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 66
Przykład r s r [ B=C ] s A B C D A B C D a5 d a5 d a6 5 2 d2 a7 2 2 d2 a7 2 3 d3 a 2 2 d2 a8 4 a 2 r s s [ C=B ] r A B C D C D A B a5 d d a5 a6 5 2 d2 2 d2 a7 2 a7 2 3 d3 2 d2 a 2 a8 4 a 2 Uwaga: przemienność równozłączenia Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 67
Iloczyn kartezjański tabel Brak warunku złączenia r s r [ ] s A B C D A B C D a5 d a5 d a6 5 2 d2 a5 2 d2 3 d3 a5 3 d3 a6 5 d a5 2 d2 a6 5 3 d3 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 68
Przykład r A B a5 a6 5 a7 2 s C D d 2 d2 3 d3 q E d d3 d7 F f f2 f3 a8 4 a 2 r [ B=C ] s A B C D a5 d a7 2 2 d2 a 2 2 d2 q E d d3 d7 F f f2 f3 ( r [ B=C ] s ) [ D=E ] q A B C D E F a5 d d f Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 69
r A B a5 a6 5 a7 2 s C D d 2 d2 3 d3 q E d d3 d7 F f f2 f3 a8 4 a 2 r A B a5 a6 5 a7 2 a8 4 a 2 s [ D=E ] q C D E F d d f 3 d3 d3 f2 r [ B=C ] ( s [ D=E ] q ) A B C D E F a5 d d f Uwaga: operacja złączenia jest łączna Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 70
Firmy Nr Nazwa 0 Nasza Firma Abeja 2 Audi 3 Pafawag Ulica Nasza Abejowska Audiego Wagonowa KodMjc 3 2 2 Telefon 234 23 234 55 Miejscowości Kod Nazwa KodWoj Wrocław DL 2 Opole OP 3 Wałbrzych DL 4 Iase Energetyczna 3 256 2 5 Dolmed Medyczna Firmy [ KodMjc = Kod ] Miejscowości Zestawienie firm Nr Nazwa Ulica KodMjc Telefon Kod Nazwa (Mjc) KodWoj 0 Nasza Firma Nasza 234 23 Wrocław DL Abeja Abejowska 3 234 55 3 Wałbrzych DL 2 Audi Audiego 2 2 Opole OP 3 Pafawag Wagonowa 2 2 Opole OP 4 Iase Energetyczna 3 256 2 3 Wałbrzych DL 5 Dolmed Medyczna Wrocław DL Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 7
Realizacja w SQL (SELECT...FROM...WHERE) SELECT [ ALL DISTINCT DISTINCTROW [TOP n [PERCENT]] { * nazwa_tabeli.* {[nazwa_tabeli.] nazwa_kolumny [AS alias]}[,...] } [ INTO nazwa_nowej_tabeli ] FROM wyrażenie_tabelowe [,...] [WHERE warunek ] [GROUP BY nazwa_kolumny [, ]] [HAVING warunek ] [ORDER BY {nazwa_kolumny [ASC DESC]} [, ] ][;] wyrażenie_tabelowe ::= nazwa_tabeli nazwa_kwerendy_wybierającej {nazwa_tabeli INNER JOIN nazwa_tabeli2 ON nazwa_tabeli.nazwa_kolumny operator_porównania nazwa_tabeli2.nazwa_kolumny2} Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 72
Przykłady r s r [ B=C ] s A B C D A B C D a5 a6 5 a7 2 a8 4 a 2 d 2 d2 3 d3 a5 d a7 2 2 d2 a 2 2 d2 select r.*, s.* from s inner join r on r.b=s.c; select r.a, r.b, s.c, s.d from s inner join r on r.b=s.c; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 73
r s r [ ] s A B C D A B C D a5 d a5 d a6 5 2 d2 a5 2 d2 3 d3 a5 3 d3 a6 5 d a5 2 d2 a6 5 3 d3 select r.*, s.* from r, s; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 74
Złożenie operacji projekcji, selekcji i równozłączenia q(x) = X ( F ( r [A=B] s ) r s {A,D} ( B=2 ( r [B=C] s ) A B C D A D a5 d a7 d2 a6 5 2 d2 a d2 a7 2 3 d3 a8 4 a 2 select r.a, s.d from r inner join s on r.b=s.c where r.b = 2; select r.a, s.d from r, s where r.b = 2 and r.b=s.c; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 75
Równozłączenie wielu tabel Kategorie Kasety Rewersy Wypożyczający Kk Nk T Kk T Wp Dt Wp Aw Kk Nk T Kk T Wp d Wp Aw Kk2 Nk2 T2 Kk2 T2 Wp d2 Wp2 Aw2 Kk3 Nk3 T3 Kk3 T3 Wp3 d3 Wp3 Aw3 T4 Kk3 T4 Wp3 d4 T5 Kk2 T5 Wp2 d5 Zadanie: znajdź Wp i Aw dla Nk = Nk3 select Wypożyczający.Wp, Aw from Wypożyczający inner join (Rewersy inner join (Kasety inner join Kategorie on Kasety.Kk=Kategorie.Kk) on Kasety.T=Rewersy.T) on Rewersy.Wp=Wypożyczający.Wp where Nk="Nk3"; Kk-kod kategorii, Nk-nazwa kategorii, T-tytuł, Wp-pesel, Dt-data, Aw-adres Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 76
Kategorie Kk Kk Kk2 Kk3 Nk Nk Nk2 Nk3 Kasety T T T2 T3 T4 T5 Kk Kk Kk2 Kk3 Kk3 Kk2 Zadanie: znajdź Wp i Aw dla Nk = Nk3 Pesele_Nk3 Kk-kod kategorii, Nk-nazwa kategorii, T-tytuł, Wp-pesel, Dt-data, Aw-adres Rewersy T Wp Dt T Wp d T3 Wp d2 T3 Wp3 d3 T4 Wp3 d4 T5 Wp2 d5 Wypożyczający Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 77 Wp Wp Wp2 Wp3 Wypożyczający_Nk3 select Wypożyczający.Wp, Aw from Wypożyczający inner join Pesele_Nk3 on Pesele_Nk3.Wp=Wypożyczający.Wp; Aw Aw Aw2 Aw3 Tytuły_Nk3 select Kasety.T from Kasety inner join Kategorie on Kasety.Kk=Kategorie.Kk where Nk="Nk3"; select Rewersy.Wp from Rewersy inner join Tytuły_Nk3 on Tytuły_Nk3.T=Rewersy.T;
Kategorie Kasety Rewersy Wypożyczający Kk Nk T Kk T Wp Dt Wp Aw Kk Nk T Kk T Wp d Wp Aw Kk2 Nk2 T2 Kk2 T2 Wp d2 Wp2 Aw2 Kk3 Nk3 T3 Kk3 T3 Wp3 d3 Wp3 Aw3 T4 Kk3 T4 Wp3 d4 T5 Kk2 T5 Wp2 d5 Zadanie: znajdź Wp i Aw dla Nk = Nk3 select Wypożyczający.Wp, Aw from Wypożyczający, Rewersy, Kasety, Kategorie where Nk="Nk3" and Kasety.Kk=Kategorie.Kk and Kasety.T=Rewersy.T and Rewersy.Wp=Wypożyczający.Wp; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 78
Zadania F( Nr, Nazwa ) T ( Smb, Nazwa ) n a na 2 n2 b nb 3 n3 c nc 4 n4 D (NrD, NrS, NrN,Data) P ( NrD, NrS, Np, Smb, Ilosc, Cena) 2 d a 0 2 2 3 d 2 b 5 3 2 2 d2 2 a 20 2 3 4 d2 2 2 a 5 3 4 4 d3 2 2 2 b 7 2 2 2 3 c 4 5 3 a 5 2 3 2 c 0 5 4 4 b 22 2 4 4 2 c 0 5 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 79
Oblicz: ) {Data}(D) 2) NrS= and NrN=2(D), NrS= or NrN=2(D) 3) {NrD,NrS}( Smb=a(P)) ) D [NrS=Nr] F, D [NrN=Nr] F, D [Nrd=Nrd,NrS=NrS] P Napisz wyrażenie algebraiczne dla żądań: ) Podaj nazwy firm, które coś kupiły w dniu 'd'. 2) Podaj nazwy towarów kupionych przez firmę o nazwie 'n3'. 3) Podaj dni, w których kupiono towar o nazwie 'na'. 4) Podaj nazwy towarów sprzedanych po cenie > 2. Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 80
3. Operacje teoriomnogościowe Operacje na tabelach Operacje relacyjne Projekcja Operacje teoriomnogościowe Suma Selekcja Iloczyn Złączenie Dzielenie Różnica niesymetryczna Dopełnienie Przemianowanie Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 8
Suma tabel Dane są tabele o jednakowych schematach: r(r) s(r) r(r) s(r) = q(r) = { t : t r lub t s } Przykład r A B s A B q A B a2 b a5 b2 a2 b a5 b2 a b a5 b2 a b a6 b4 a b a6 b4 a b2 a6 b4 a3 b2 a3 b2 a b2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 82
Operator UNION [TABLE] zapytanie_ UNION [ALL] [TABLE] zapytanie_2 [UNION [ALL] [TABLE] zapytanie_n [ ]] gdzie zapytanie_... n - zdanie SELECT albo nazwa zapytania zapamiętanego albo nazwa zapamiętanej tabeli poprzedzona słowem TABLE. Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 83
rab r2ab select * from rab union all select * from r2ab; select * from rab union select * from r2ab; table rab union all table r2ab; {z duplikatami} {bez duplikatów} table rab union table r2ab; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 84
rab r2ab r3ab select * from rab union all select * from r2ab union select * from r3ab; table rab union table r2ab union all table r3ab Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 85
NumeryKlientów select NrNabywcy as Nr from Dokumenty where NrNabywcy<>0 union select NrSprzedawcy as Nr from Dokumenty where NrSprzedawcy<>0; select Firmy.Nr, Firmy.Nazwa from NumeryKlientów inner join Firmy on NumeryKlientów.Nr=Firmy.Nr; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 86
Wstawmy zapytanie pierwsze do drugiego w miejsce wywołania tabeli NumeryKlientów: select Firmy.Nr, Firmy.Nazwa from (select NrNabywcy as Nr from Dokumenty where NrNabywcy<>0 union select NrSprzedawcy as Nr from Dokumenty where NrSprzedawcy<>0) as NumeryKlientów inner join Firmy on NumeryKlientów.Nr=Firmy.Nr; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 87
Kwerenda dołączająca INSERT INTO nazwa_tabeli [(nazwa_kolumny [,...])] SELECT [nazwa_tabeli.]nazwa_kolumny [,...] FROM wyrażenie_tabelowe [WHERE warunek ][;] Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 88
Realizacja operacji sumy tabel jako kwerendy dołączającej wariant a) wariant b) r s r s kwerenda tworząca tabelę kwerenda dołączająca q r kwerenda dołączająca q Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 89
wariant a) r s dołącz s do r : insert into r(a,b) select s.a, s.b from s; kwerenda dołączająca r usuń duplikaty z r : select distinct r.* from r; kwerenda usuwająca duplikaty Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 90
wariant b) r s uwtórz q jako kopię r: select r.a, r.b into q(a,b) from r; kwerenda tworząca tabelę q dołącz s do q: insert into q(a,b) select s.a, s.b from s; q kwerenda dołączająca usuń duplikaty z q select distinct q.* from q; kwerenda usuwająca duplikaty Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 9
Iloczyn tabel Dane są tabele o jednakowych schematach: r(r) s(r) Przykład r(r) s(r) = q(r) = { t : t r i t s } r A B s A B a2 b a5 b2 a5 b2 a b a b a6 b4 a6 b4 a b2 q A a5 a a6 B b2 b b4 a3 b2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 92
Realizacja za pomocą kwerendy wybierającej q(r) := r(r) s(r) {r.*} (r [ r.a =s.a,..., r.a n =s.a n ] s) r A B s A B q A B a2 b a5 b2 a5 b2 {r.a,r.b} (r [ r.a = s.a, r.b = s.b ] s) a5 b2 a b a b a b a6 b4 a6 b4 a6 b4 a b2 a3 b2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 93
Realizacja operacji iloczynu tabel w SQL wariant a) select r.* from r inner join s on (r.a=s.a) and r.b=s.b); r s wariant b) select * into q from r where exists (select a,b from s where r.a=s.a and r.b=s.b) select * into q from s where exists (select a,b from r where r.a=s.a and r.b=s.b) kwerenda tworząca tabelę kwerenda wybierająca exists Interpretacja: wstaw do q wszystkie te wiersze z r, dla których istnieją w s wiersze identyczne z nimi q Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 94
Nie realizowane w MS ACCESS: select r.* from r intersect select s.* from s; table r intersect table s; select r.* from r intersect all select s.* from s; table r intersect all table s; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 95
Różnica niesymetryczna tabel Dane są tabele o jednakowych schematach: r(r) s(r) r(r) s(r) = q(r) = { t : t r i t s } Przykład r A B s A B a2 b a5 b2 a5 b2 a b a b a6 b4 q A a2 a3 B b b2 a6 b4 a b2 a3 b2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 96
Realizacja operacji różnicy tabel w MS ACCESS wariant a) wariant b) wariant c) r s r s r s kwerenda usuwająca kwerenda tworząca tabelę kwerenda tworząca tabelę r q kwerenda wybierająca kwerenda usuwająca q q Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 97
wariant a) r s z r usuń wiersze wspólne z s: delete distinctrow r.* from r inner join s on (r.a=s.a) and ( r.b=s.b); kwerenda usuwająca r Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 98
wariant b) r s uwtórz q jako kopię r: select r.a, r.b into q(a,b) from r; kwerenda tworząca tabelę q z q usuń wiersze wspólne z s: delete distinctrow q.* from q inner join s on (q.a=s.a) and ( q.b=s.b); kwerenda usuwająca q Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 99
wariant c) r s select * into q from r where not exists (select a,b from s where r.a=s.a and r.b=s.b) kwerenda tworząca tabelę kwerenda wybierająca not exists Interpretacja: wstaw do q wszystkie te wiersze z r, dla których NIE istnieją w s wiersze identyczne z nimi q Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 00
Nie realizowane w MS ACCESS: select r.* from r except select s.* from s; select r.* from r except all select s.* from s; table r except table s; table r except all table s; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 0
Różnica symetryczna tabel Dane są tabele o jednakowych schematach: r(r) s(r) Przykład q(r) = { t : (t r lub t s) i t s r } r A B s A B q A B a2 b a5 b2 a2 b a5 b2 a b a3 b2 a b a6 b4 a b2 a6 b4 a b2 a3 b2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 02
r s (r - s) (s - r) select * from r where not exists (select a,b from s where r.a=s.a and r.b=s.b) union select * from s where not exists (select a,b from r where r.a=s.a and r.b=s.b) Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 03
Operacje teoriomnogościowe dopełnienie Dana jest tabela r(r), w której R={A,A 2,...,A n } Każdej nazwie A,A 2,...,A n przyporządkowano zbiór dopuszczalnych wartości D,D 2,...,D n dop(r(r)) = D D 2... D n r(r) Przykła d D D 2 A A 2 R={A,A 2 } a D = {,2} D 2 = {a,b} b 2 a r A A 2 2 a b dop(r) A A 2 a 2 b 2 b Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 04
Przykład Obiekt Nazwa Adres Grupa Numer Liczność Zwiedziła Nazwa Numer Muzeum Muzealna 0 Muzeum Park zdrojowy Parkowa 2 50 Park zdrojowy Zamek Zapora Zamkowa Wodna 3 55 Zamek Zapora 2 3 Podać, która grupa i który obiekt ma jeszcze zwiedzić, jeżeli już odbyły się wizyty podane w tabeli Zwiedziła {Nazwa} (Obiekt) {Numer} (Grupa) Zwiedziła select Obiekt.Nazwa, Grupa.Numer from Obiekt, Grupa except select Zwiedziala.Nazwa, Zwiedzila.Numer from Zwiedzila; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 05
Grupa Obiekt select from Numer as [Numer grupy], Nazwa as [Nazwa obiektu] into Plan Grupa, Obiekt Plan Zwiedziła delete distinctrow Plan.* from Zwiedziła inner join Plan on (Plan.[Nazwa obiektu]=zwiedziła.[nazwa obiektu]) and (Plan.[Numer grupy]=zwiedziła.[numer grupy]); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 06
Grupa Obiekt select Numer as [Numer grupy], Nazwa as [Nazwa obiektu] into Plan from Grupa, Obiekt Plan Zwiedziła SELECT * FROM Plan WHERE not exists (select Zwiedziła.[Nazwa obiektu], Zwiedziła.[Numer grupy] from Zwiedziła where (Plan.[Nazwa obiektu] =Zwiedziła.[Nazwa obiektu]) and (Plan.[Numer grupy]=zwiedziła.[numer grupy])); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 07
Grupa Obiekt Zwiedziła SELECT * FROM (select Numer as [Numer grupy], Nazwa as [Nazwa obiektu] from Grupa, Obiekt) as Plan WHERE not exists (select Zwiedziła.[Nazwa obiektu], Zwiedziła.[Numer grupy] from Zwiedziła where (Plan.[Nazwa obiektu]=zwiedziła.[nazwa obiektu]) and (Plan.[Numer grupy]=zwiedziła.[numer grupy])); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 08
Przemianowanie atrybutów Przykład Nr /02 NrSprzerdawcy 0 Dokumenty NrNabywcy Data 2 3.02.02 2/02 0 3 2.03.02 /02 0 03.0.02 3/02 0 3.04.02 2/02 3 0 7.02.02 4/02 0 4 3.05.02 {NrSprzedawcy} (Dokumenty) {NrNabywcy} (Dokumenty) ) ta nazwa powinna być wspólna select NrNabywcy as Nr from Dokumenty where NrNabywcy<>0 union select NrSprzedawcy as Nr from Dokumenty where NrSprzedawcy<>0; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 09
Przykład 2 SELECT DISTINCT Osoba.Imię AS Osoba, Osoba_.Imię AS Rodzic, Osoba_2.Imię AS Dziadek, Osoba_2.ImięRodzica AS Pradziadek FROM (Osoba INNER JOIN Osoba AS Osoba_ ON Osoba.ImięRodzica = Osoba_.Imię) INNER JOIN Osoba AS Osoba_2 ON Osoba_.ImięRodzica = Osoba_2.Imię; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 0
Przykłady Znaleźć towary, które były przez Naszą firmę sprzedawane klientom z Wrocławia i nie były sprzedawane klientom z województwa dolnośląskiego (spoza Wrocławia). Towary sprzedane we Wrocławiu: select distinct PozycjeDokumentu.SmbTow from (((PozycjeDokumentu inner join Dokumenty on PozycjeDokumentu.NrFaktury = Dokumenty.NrFaktury and PozycjeDokumentu.NrSprzedawcy = Dokumenty.NrSprzedawcy) inner join Firmy on Firmy.Nr=Dokumenty.NrNabywcy) inner join Miejscowości on Firmy.KodMjc=Miejscowości.Kod) where Dokumenty.NrSprzedawcy = 0 and Miejscowości.Nazwa="Wrocław" Towary sprzedane na Dolnym Śląsku, ale nie we Wrocławiu: select distinct PozycjeDokumentu.SmbTow from (((PozycjeDokumentu inner join Dokumenty on PozycjeDokumentu.NrFaktury = Dokumenty.NrFaktury and PozycjeDokumentu.NrSprzedawcy = Dokumenty.NrSprzedawcy) inner join Firmy on Firmy.Nr=Dokumenty.NrNabywcy) inner join Miejscowości on Firmy.KodMjc=Miejscowości.Kod) where Dokumenty.NrSprzedawcy = 0 and Miejscowości.Nazwa<>"Wrocław" and Miejscowości.KodWoj="DL" Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL
select TTT.* from (select distinct PozycjeDokumentu.SmbTow from (((PozycjeDokumentu inner join Dokumenty on PozycjeDokumentu.NrFaktury = Dokumenty.NrFaktury and PozycjeDokumentu.NrSprzedawcy = Dokumenty.NrSprzedawcy) inner join Firmy on Firmy.Nr=Dokumenty.NrNabywcy) inner join Miejscowości on Firmy.KodMjc=Miejscowości.Kod) where Dokumenty.NrSprzedawcy = 0 and Miejscowości.Nazwa="Wrocław") as TTT where not exists (select distinct PozycjeDokumentu.SmbTow from (((PozycjeDokumentu inner join Dokumenty on PozycjeDokumentu.NrFaktury = Dokumenty.NrFaktury and PozycjeDokumentu.NrSprzedawcy = Dokumenty.NrSprzedawcy) inner join Firmy on Firmy.Nr=Dokumenty.NrNabywcy) inner join Miejscowości on Firmy.KodMjc=Miejscowości.Kod) where Dokumenty.NrSprzedawcy = 0 and Miejscowości.Nazwa<>"Wrocław" and Miejscowości.KodWoj="DL" and TTT.SmbTow= PozycjeDokumentu.SmbTow); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 2
Dopełnienie (różnica) a selekcja z zaprzeczeniem Przypadek wiele do jeden (n:) Przypadek wiele do wielu (n:m) Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 3
Przypadek wiele do jeden (n:) Miejscowości 2 3 4 5 6 7 8 9 0 2 Województwa WP Miejscowości KodWoj= DL (Miejscowości) KodWoj<> DL (Miejscowości) DL SL PM Znajdź miejscowości z województw innych niż DL {,2,3,7,8,9,0,,2} odpowiedź prawidłowa {,2,3,7,8,9,0,,2} odpowiedź prawidłowa Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 4
Przypadek wiele do wielu (n:m) 2 3 4 5 6 7 8 9 0 2 Firmy Towary Śledzie Zupa Pasztet Chipsy Znajdź firmy które nie kupiły Pasztet Firmy Nazwa= Pasztet (Kupowały) Nazwa<> Pasztet (Kupowały) {,2,3,4,5,6, 0, 2} odpowiedź prawidłowa {,2,3,4,5,6,8,9,0,,2} odpowiedź błędna Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 5
Przypadek wiele do wielu (n:m) 2 3 4 5 6 7 8 9 0 2 Firmy Towary Śledzie Zupa Pasztet Chipsy Nazwa= Pasztet (Kupowały) Nazwa= Zupa (Kupowały) {7,8,9,} {2,4,5,6,8} = {7,9,} odpowiedź prawidłowa Nazwa= Pasztet and Nazwa<> Zupa (Kupowały) {7, 8, 9, } odpowiedź błędna Znajdź firmy, które kupiły Pasztet, ale nigdy nie kupiły Zupy Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 6
4. Operacja dzielenia Dane są tabele: r(r), która będzie dzielną, s(s), która będzie dzielnikiem. Utworzymy tabelę: q(t), która będzie ilorazem. przy czym T = R S q(t) = r(r) s(s) = { t: dla każdej t s s, istnieje t r r taka, że t r [R-S]= t i t r [S] = t s } Nieformalnie: operacja dzielenia znajduje te wiersze dzielnej, które łączą się z każdym wierszem dzielnika Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 7
Przykład Obiekt Nazwa Adres Grupa Numer Liczność Zwiedziła Nazwa Muzeum Numer Muzeum Muzealna 0 Park zdrojowy Park zdrojowy Parkowa 2 50 Muzeum 2 3 55 Muzeum 3 Podać, które grupy zwiedziły już każdy obiekt: Zwiedziła Obiekt Zwiedziła Nazwa Muzeum Park zdrojowy Muzeum Numer 2 Obiekt Nazwa Muzeum Park zdrojowy Adres Muzealna Parkowa Muzeum 3 {Nazwa,Numer} {Nazwa, Adres} Grupy Numer Numery grup, które w tabeli Zwiedziła łączą się z każdym obiektem Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 8
Przykład Obiekt Nazwa Adres Grupa Numer Liczność Zwiedziła Nazwa Muzeum Numer Muzeum Muzealna 0 Park zdrojowy Park zdrojowy Parkowa 2 50 Muzeum 2 3 55 Muzeum 3 Podać obiekty zwiedzone już przez każdą grupę: Zwiedziła Grupa Zwiedziła Nazwa Muzeum Park zdrojowy Muzeum Muzeum Numer 2 3 Grupa Numer 2 3 Liczność 0 50 55 {Nazwa,Numer} {Numer, Liczność} Obiekty Nazwa Muzeum Nazwy obiektów, które w tabeli Zwiedziła łączą się z każdą grupą Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 9
Realizacja operacji dzielenia za pomocą kwerend graficznych q = r s R-S ( r ) R-S (( R-S ( r ) s) r) r s R-S ( r ) rob ( rob s ) kwerenda tworząca tabelę rob2 kwerenda tworząca tabelę rob rob2 r rob2 r kwerenda usuwająca rob2 rob R-S (rob2) rob kwerenda usuwająca Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 20
SELECT symbol INTO [Tab Dzielnik] FROM Towary WHERE (Symbol='007') OR (Symbol = '009') OR (Symbol = '059'); SELECT DISTINCT NrNabywcy, SmbTow INTO [Tab Dzielna] FROM Dokumenty INNER JOIN (PozycjeDokumentu INNER JOIN [Kw Dzielnik] ON ([Tab Dzielnik].Symbol=PozycjeDokumentu.SmbTow)) ON (PozycjeDokumentu.NrSprzedawcy = Dokumenty.Nrsprzedawcy) AND (Dokumenty.NrFaktury=PozycjeDokumentu.NrFaktury); Tab Dzielnik Tab Dzielna SELECT DISTINCT NrNabywcy, Symbol INTO [Tab Iloczyn] FROM [Tab Dzielnik],[Tab Dzielna]; Tab Iloczyn DELETE DISTINCTROW [Tab Iloczyn].* FROM [Tab Dzielna] INNER JOIN [Tab Iloczyn] ON ([Tab Dzielna].NrNabywcy=[Tab Iloczyn].NrNabywcy) and ([Tab Dzielna].SmbTow=[Tab Iloczyn].Symbol); Tab Iloczyn DELETE DISTINCTROW [Tab Dzielna].* FROM [Tab Dzielna] INNER JOIN [Tab Iloczyn] ON ([Tab Dzielna].NrNabywcy=[Tab Iloczyn].NrNabywcy); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 2
Realizacja operacji dzielenia w SQL select Nazwa from Zwiedziła as r where not exists (select * from Grupa where not exists ( select * from Zwiedziła as r2 where (r.nazwa=r2.nazwa) and (r2.numer=grupa.numer ))); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 22
select NrNabywcy from r as r where not exists (select * from s where not exists ( select * from r as r2 where (r.nrnabywcy=r2.nrnabywcy) and (r2.smbtow=s.smbtow ))); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 23
5. Operacja teta-złączenia Dane są: r(r) tabela r o schemacie R, A R s(s) tabela s o schemacie S, B S R i S nie zawierają tych samych nazw (R S = Ø) Θ {>, <, >=, <=, =, <> } - operator Teta q(r S) = r [ AΘB ] s = { t : t[r] r, t[s] s i t[a] Θ t[b] } r R A s S B v v2 t v v2 v Θ v2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 24
Przykład r A B r2 C D a2 a5 2 a5 2 a a a6 4 a6 4 a 2 a 2 r [ B > D ] r2 = A B C D a5 2 a a6 4 a5 2 a6 4 a a6 4 a 2 a 2 a Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 25
Przykład Grupa Nazwa Pielgrzymka Studenci Emeryci Szkoła Urząd Miejski Pafawag Liczność 0 50 55 20 30 20 Autokar Numer rej WRU 3492 DW 6582 WCX 238 WWX 6745 WRA 22 DW 67892 Pojemność 5 45 60 25 30 0 Podać autokary, które mogą obsłużyc poszczególne grupy turystyczne Grupa [ Liczność <= Pojemność ] Autokar select Autokar.Numer rej, Grupa.Nazwa from Autokar, Grupa where Autokar.Pojemność >= Grupa.Liczność; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 26
Znaleźć firmy, które kupiły od Naszej Firmy jakikolwiek pasztet przed firmą o numerze 698. a. Wariant z dwiema kwerendami Odniesienie SELECT TOP Data FROM (Dokumenty INNER JOIN PozycjeDokumentu ON (Dokumenty.NrSprzedawcy=PozycjeDokumentu.NrSprzedawcy) AND (Dokumenty.NrFaktury=PozycjeDokumentu.NrFaktury)) INNER JOIN Towary ON PozycjeDokumentu.SmbTow=Towary.Symbol WHERE (Dokumenty.NrNabywcy=698) and Towary.Nazwa like "*Pasztet*" ORDER BY Data; SELECT DISTINCT Firmy.Nr, Firmy.Nazwa FROM Odniesienie, (Firmy INNER JOIN Dokumenty ON Firmy.Nr = Dokumenty.NrNabywcy) INNER JOIN (Towary INNER JOIN PozycjeDokumentu ON Towary.Symbol = PozycjeDokumentu.SmbTow) ON (Dokumenty.NrSprzedawcy = PozycjeDokumentu.NrSprzedawcy) AND (Dokumenty.NrFaktury = PozycjeDokumentu.NrFaktury) WHERE (((Dokumenty.NrSprzedawcy)=0) AND ((Towary.Nazwa) Like "*Pasztet*") AND ((Dokumenty.[Data])<[Odniesienie].[Data])); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 27
b. Wariant z jedną kwerendą (podzapytaniem) SELECT distinct Firmy.Nr, Firmy.Nazwa FROM ((Dokumenty INNER JOIN PozycjeDokumentu ON (Dokumenty.NrSprzedawcy=PozycjeDokumentu.NrSprzedawcy) AND (Dokumenty.NrFaktury=PozycjeDokumentu.NrFaktury)) INNER JOIN Towary ON PozycjeDokumentu.SmbTow=Towary.Symbol) inner join Firmy on Dokumenty.NrNabywcy=Firmy.Nr WHERE Dokumenty.NrSprzedawcy=0 and Towary.Nazwa like "*Pasztet*" and Data <(SELECT TOP Data FROM (Dokumenty INNER JOIN PozycjeDokumentu ON (Dokumenty.NrSprzedawcy=PozycjeDokumentu.NrSprzedawcy) AND (Dokumenty.NrFaktury=PozycjeDokumentu.NrFaktury)) INNER JOIN Towary ON PozycjeDokumentu.SmbTow=Towary.Symbol WHERE (Dokumenty.NrNabywcy=698) and Towary.Nazwa like "*Pasztet*" ORDER BY Data) Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 28
c. Wariant z dwiema tabelami SELECT TOP Data INTO Odniesienie FROM (Dokumenty INNER JOIN PozycjeDokumentu ON (Dokumenty.NrSprzedawcy=PozycjeDokumentu.NrSprzedawcy) AND (Dokumenty.NrFaktury=PozycjeDokumentu.NrFaktury)) INNER JOIN Towary ON PozycjeDokumentu.SmbTow=Towary.Symbol WHERE (Dokumenty.NrNabywcy=698) and Towary.Nazwa like "*Pasztet*" ORDER BY Data; SELECT distinct Firmy.Nr, Firmy.Nazwa, Data INTO Wszystkie FROM ((Dokumenty INNER JOIN PozycjeDokumentu ON (Dokumenty.NrSprzedawcy=PozycjeDokumentu.NrSprzedawcy) AND (Dokumenty.NrFaktury=PozycjeDokumentu.NrFaktury)) INNER JOIN Towary ON PozycjeDokumentu.SmbTow=Towary.Symbol) inner join Firmy on Dokumenty.NrNabywcy=Firmy.Nr WHERE Dokumenty.NrSprzedawcy=0 and Towary.Nazwa like "*Pasztet*" SELECT distinct Wszystkie.Nr, Wszystkie.Nazwa FROM Odniesienie, Wszystkie WHERE Wszystkie.Data < Odniesienie.Data Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 29
Znaleźć firmy, które kupiły od Naszej Firmy wartościowo więcej niż firma o numerze X zadanym parametrem (seperacja obliczenia sumy). Odniesienie SELECT sum(ilość*cenanetto) AS Obrót FROM Dokumenty INNER JOIN PozycjeDokumentu ON (Dokumenty.NrFaktury=PozycjeDokumentu.NrFaktury) AND (Dokumenty.NrSprzedawcy=PozycjeDokumentu.NrSprzedawcy) WHERE Dokumenty.NrNabywcy=[Podaj numer firmy odniesienia]; Wszystkie SELECT Firmy.Nr, Firmy.Nazwa, sum(ilość*cenanetto) AS Obrót FROM (Firmy INNER JOIN Dokumenty ON Firmy.Nr=Dokumenty.NrNabywcy) INNER JOIN PozycjeDokumentu ON (Dokumenty.NrSprzedawcy=PozycjeDokumentu.NrSprzedawcy) AND (Dokumenty.NrFaktury=PozycjeDokumentu.NrFaktury) WHERE Dokumenty.NrSprzedawcy=0 GROUP BY Firmy.Nr, Firmy.Nazwa; Wynik SELECT Wszystkie.Nr, Wszystkie.Nazwa, Wszystkie.Obrót FROM Odniesienie, Wszystkie WHERE (((Wszystkie.Obrót)>[Odniesienie].[Obrót])); Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 30
Znaleźć firmy, których sumaryczna kwota zakupów w Naszej Firmie w sierpniu 992r. była większa niż w lipcu 992. Lipiec SELECT Firmy.Nr, Firmy.Nazwa, Sum(Ilość*CenaNetto) AS Obrót FROM (Firmy INNER JOIN Dokumenty ON Firmy.Nr = Dokumenty.NrNabywcy) INNER JOIN PozycjeDokumentu ON (Dokumenty.NrSprzedawcy = PozycjeDokumentu.NrSprzedawcy) AND (Dokumenty.NrFaktury = PozycjeDokumentu.NrFaktury) WHERE Dokumenty.NrSprzedawcy=0 AND Data Like "992-07*" GROUP BY Firmy.Nr, Firmy.Nazwa; Sierpień SELECT Firmy.Nr, Firmy.Nazwa, sum(ilość*cenanetto) AS Obrót FROM (Firmy INNER JOIN Dokumenty ON Firmy.Nr=Dokumenty.NrNabywcy) INNER JOIN PozycjeDokumentu ON (Dokumenty.NrFaktury = PozycjeDokumentu.NrFaktury) AND (Dokumenty.NrSprzedawcy =PozycjeDokumentu.NrSprzedawcy) WHERE Dokumenty.NrSprzedawcy=0 and Data Like "992-08*" GROUP BY Firmy.Nr, Firmy.Nazwa; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 3
Nabywcy SELECT DISTINCT FIRMY.Nr, FIRMY.Nazwa FROM FIRMY INNER JOIN DOKUMENTY ON FIRMY.Nr = DOKUMENTY.NrNabywcy WHERE NrSprzedawcy=0; ObrotyLipca SELECT Nabywcy.Nr, Nabywcy.Nazwa, NZ(Lipiec.Obrót) AS Obroty FROM Nabywcy LEFT JOIN Lipiec ON (Nabywcy.Nazwa = Lipiec.Nazwa) AND (Nabywcy.Nr = Lipiec.Nr); ObrotySierpnia SELECT Nabywcy.Nr, Nabywcy.Nazwa, Nz(Sierpień.Obrót) AS Obroty FROM Nabywcy LEFT JOIN Sierpień ON (Nabywcy.Nr = Sierpień.Nr) AND (Nabywcy.Nazwa = Sierpień.Nazwa); Wynik SELECT ObrotyLipca.Nr, ObrotyLipca.Nazwa, ObrotyLipca.Obroty, [ObrotySierpnia].[Obroty] FROM ObrotyLipca INNER JOIN ObrotySierpnia ON (ObrotyLipca.Nr = ObrotySierpnia.Nr) AND (ObrotyLipca.Nazwa = ObrotySierpnia.Nazwa) WHERE ObrotyLipca.Obroty<[ObrotySierpnia].[Obroty]; Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 32
PROJEKTOWANIE TABEL Anomalie aktualizacji Dodaj towar : < 004, Mentos, 300 > Dodaj sklep : <2, Marketowa 23> Usuń towar : <003> Usuń sklep : <3> Usuń sprzedaż : <3,003,2003--*> Zmień adres sklepu : <3, Supermarketowa 3> Zmień stan towaru w magazynie : <002,220> Klucz = {NumerSklepu, SymbolTowaru, Data} Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 33
Anomalie aktualizacji: - niemożność wykonania operacji aktualizacji bazy danych zapewniającej utrzymanie bazy danych w stanie aktualnym; - dopuszczanie do sprzecznych aktualizacji danych, powielonych (zduplikowanych) w tabelach. Nadmiar: - nadmiar danych - wielokrotne zapisanie tych samych danych w różnych wierszach tej samej tabeli, - nadmiar czynności - wielokrotne wykonywanie tej samej czynności przy aktualizacji tabeli bazy danych. Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 34
Sklep {NumerSklepu,AdresSklepu} Tabela Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 35
Towar {SymbolTowaru,NazwaTowaru,StanMagaz} Tabela) Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 36
SprzedażTowaruWSklepie {NumerSklepu, SymbolTowaru,Data,IlośćSprzedana} Tabela) Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 37
Klucz={NumerSklepu} Klucz={SymbolTowaru} Klucz={NumerSklepu,SymbolTowaru,Data} Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 38
Dodaj towar : < 004, Mentos, 300 > Dodaj sklep : <2, Marketowa 23> Usuń towar : <003> Usuń sklep : <3> Usun sprzedaż : <3,003,2003--*> Zmień adres sklepu : <3, Supermarketowa 3> Zmień stan towaru w magazynie : <002,220> Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 39
Rozkład (dekompozycja) tabeli Dane są: - tabela r(r) - podzbiory schematu R, R2,...,Rp takie, że R R2... Rp = R Rozkładem (dekompozycją) tabeli r(r) na R, R2,...,Rp nazywamy zestaw: Przykład R (r), R2 (r),..., Rp (r) r R (r) = q A B C a b c A B C D a2 b3 c2 a b c d a3 b2 c a2 b3 c2 d2 a4 b c3 R ={A,B,C) i a3 b2 c d R2 ={C,D} R2 (r) = q2 C D a4 b c3 d3 c d c2 d2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 40 c3 d3
Operacja złączenia naturalnego Dane są: r(r) tabela r o schemacie R, s(s) tabela s o schemacie S, R i S nie muszą być rozłączne q(r S) = r s = { t : t[r] r, t[s] s } Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 4
Przykład r A B r2 B C a2 b a5 c2 a5 b2 a c a b a6 c4 a6 b5 a c2 a b2 r r2 = A B C a2 b c a2 b c2 a b c a b2 c2 a6 b5 c2 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 42
Przykład ( iloczyn kartezjański!!! ) r A B r2 C D a2 b c5 d2 a5 b2 c d a b r r2 = A B C D a2 b c5 d2 a2 b c d a5 b2 c5 d2 a5 b2 c d a b c5 d2 a b c d Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 43
Rozkład tabel bez straty danych Rozkład tabeli r(r) na R, R2,...,Rp nazywamy rozkładem bez straty danych jeżeli: R (r) R2 (r)... Rp (r) = r(r) Przykład r A B C D a b c d a2 b3 c2 d2 a3 b2 c d a4 b c3 d3 R = {A,B,C) i R2 = {C,D} R (r) = q R2 (r) = q2 A B C a b c a2 b3 c2 a3 b2 c a4 b c3 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 44 C c c2 c3 D d d2 d3
Przykład 2 r A B C D a b c d a2 b3 c2 d2 a3 b2 c d a4 b c3 d3 R = {A,B) i R2 = {C,D} R (r) = q A a a2 a3 a4 B b b3 b2 b R2 (r) = q2 C c D d c2 d2 R (r) R2 (r)? r(r) c3 d3 Przykład 3 R={A,C) i R2={B,C,D} Przykład 4 R={A,B) i R2={A,C,D} Przykład 5 R={A,B,C,D) i R2={D} Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 45
Przykład 6 tab( NrSklepu, AdresSklepu, KodTowaru, NazwaTowaru, Sprzedaż ) klucz={nrsklepu, KodTowaru} a) R={NrSklepu, AdresSklepu}, R2={NrSklepu,KodTowaru, NazwaTowaru, Sprzedaż} b) R={KodTowaru, NazwaTowaru}, R2={NrSklepu,AdresSklepu,KodTowaru, Sprzedaż} c) R={NrSklepu, KodTowaru, AdresSklepu}, R2={NrSklepu, KodTowaru, NazwaTowaru} R3={NrSklepu, KodTowaru, Sprzedaż} d) R={NrSklepu, AdresSklepu}, R2={NrSklepu, NazwaTowaru} R3={NrSklepu, Sprzedaż} R4={KodTowaru,Sprzedaż} Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 46
Zależności funkcyjne między danymi Dane są: - tabela r(r), R={A,A 2,...,A n } - zbiory X, Y R W tabeli r jest spełniona zależność funkcyjna X Y wtedy i tylko wtedy, gdy dla każdej wartości x X (r) liczba wierszy w X Y (r) jest równa Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 47
Przykład r A B C D a b c d a2 b3 c2 d2 a3 b2 c d a4 b c3 d3 Czy {C} {D}? {C,D} (r) = q C c c2 c3 D d d2 d3 Czy {C,D} {A,B}? R (r) = q A B C D a b c d a2 b3 c2 d2 a3 b2 c d a4 b c3 d3 Czy {B,C} {C,D}? {B,C,D} (r) = q B C D b c d b3 c2 d2 b2 c d b c3 d3 Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 48
Przykład 2 tab( NrSklepu, AdresSklepu, KodTowaru, NazwaTowaru, Sprzedaż ) klucz={nrsklepu,kodtowaru} a) czy {NrSklepu, KodTowaru} {AdresSklepu, NazwaTowaru, Sprzedaż}? b) czy {NrSklepu, KodTowaru} {NrSklepu, KodTowaru}? c) czy {NrSklepu} {AdresSklepu}? d) czy {KodTowaru} {NazwaTowaru}? e) czy {KodTowaru} {Sprzedaż}? Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 49
NumerSklepu AdresSklepu SymbolTowaru NazwaTowaru,StanMagaz NumerSklepu,SymbolTowaru,Data IlośćSprzedana Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 50
NumerSklepu,SymbolTowaru,Data AdresSklepu NumerSklepu,SymbolTowaru,Data NazwaTowaru NumerSklepu,SymbolTowaru,Data StanMagaz Ludmiła Rekuć, Witold Rekuć Wprowadzenie do SQL 5