Both sides previous revision
Poprzednia wersja
|
|
pl:miw:2009:piw09_des [2009/09/08 21:50] piw09 |
pl:miw:2009:piw09_des [2009/09/10 11:07] piw09 |
| |
{{:pl:miw:2009:4_4_3.png|}} | {{:pl:miw:2009:4_4_3.png|}} |
| |
| === 4.5. Relacje === |
| |
| Zanalizujmy bardziej złożony przykład, pokazujący jak imitować polecenia SQL za pomocą Datalogu. Będzie to |
| |
| przyklad testujący możliwości DES pod kątem współdziałania różnego rodzaju języków, oraz tego, czy faktycznie |
| |
| można je stosować mniej więcej wymiennie. |
| |
| Przedstawmy polecenia SQL razem z analogami w Datalogu: |
| |
| == Tworzenie tabel i wstawianie wartości == |
| |
| <code>% Najpierw tworzymy tabele |
| create or replace table a(a); |
| create or replace table b(b); |
| create or replace table c(a,b); |
| |
| % Listujemy powyższe zależności |
| /dbschema |
| |
| % Dodajemy rekordy do tabeli |
| insert into a values ('a1'); |
| insert into a values ('a2'); |
| insert into a values ('a3'); |
| insert into b values ('b1'); |
| insert into b values ('b2'); |
| insert into b values ('a1'); |
| insert into c values ('a1','b2'); |
| insert into c values ('a1','a1'); |
| insert into c values ('a2','b2');</code> |
| |
| Odpowiednik w Datalogu, łączący tworzenie tabel oraz wstawianie rekordów: |
| |
| <code>a(a1). |
| a(a2). |
| a(a3). |
| |
| b(b1). |
| b(b2). |
| b(a1). |
| |
| c(a1,b2). |
| c(a1,a1). |
| c(a2,b2).</code> |
| |
| == Projekcja == |
| |
| Kod SQL: |
| |
| <code> |
| % Testujemy operację projekcji |
| select a from c;</code> |
| |
| Kod Datalog: |
| |
| <code>projection(X) :- c(X,Y).</code> |
| |
| == Selekcja z kryterium == |
| |
| Kod SQL: |
| |
| <code>% Selekcja z pewnym kryterium |
| select a from a where a='a2';</code> |
| |
| Kod Datalog: |
| |
| <code>selection(X) :- a(X), X=a2.</code> |
| |
| == Iloczyn kartezjański == |
| |
| Kod SQL: |
| |
| <code>% Iloczyn kartezjański |
| select * from a,b;</code> |
| |
| Kod Datalog: |
| |
| <code>cartesian(X,Y) :- a(X), b(Y).</code> |
| |
| == Inner Join == |
| |
| Kod SQL: |
| |
| <code>% złączenie typu inner join |
| select a from a inner join b on a.a=b.b;</code> |
| |
| Kod Datalog: |
| |
| <code>inner_join(X) :- a(X), b(X).</code> |
| |
| == Left Join == |
| |
| Kod SQL: |
| |
| <code>% złączenie typu left join |
| select * from a left join b on a.a=b.b;</code> |
| |
| Kod Datalog: |
| |
| <code>left_join(X,Y) :- lj(a(X), b(Y), X=Y).</code> |
| |
| == Right Join== |
| |
| Kod SQL: |
| |
| <code>% złączenie typu right join |
| select * from a right join b on a.a=b.b;</code> |
| |
| Kod Datalog: |
| |
| <code>right_join(X,Y) :- rj(a(X), b(Y), X=Y).</code> |
| |
| == Full join == |
| |
| Kod SQL: |
| |
| <code>% złączenie typu full foin |
| select * from a full join b on a.a=b.b;</code> |
| |
| Kod Datalog: |
| |
| <code>full_join(X,Y) :- fj(a(X), b(Y), X=Y).</code> |
| |
| == Union == |
| |
| Kod SQL: |
| |
| <code>% złączenie typu unia |
| select * from a union select * from b;</code> |
| |
| Kod Datalog: |
| |
| <code>union(X) :- a(X) ; b(X).</code> |
| |
| == Różnica == |
| |
| Kod SQL: |
| |
| <code>% Testujemy operację select z kryterium różnicy |
| select * from a except select * from b;</code> |
| |
| Kod Datalog: |
| |
| <code>difference(X) :- a(X), not(b(X)).</code> |
| |
| == Relacje w Datalog i SQL == |
| |
| Ważnym aspektem systemu DES jest fakt, iż mimo że polecenia w SQL i Datalog można stosowac wymiennie i przeplatać |
| |
| je ze sobą, to jednak relacji utworzonych w Datalog nie można używać od razu jako tabeli w SQL. |
| |
| Przyjrzyjm się powyższemu kodowi. Załóżmy, że utworzyliśmy w Datalogu relacje: |
| |
| <code>a(a1). |
| a(a2). |
| a(a3)</code> |
| |
| Nie możemy po prostu użyć jej w SQL za pomocą, np., polecenia: |
| |
| <code>/sql select * from a;</code> |
| |
| **Musimy WPIERW utworzyć analogiczną tabelę w SQL:** |
| |
| <code>/sql |
| create table a(a)</code> |
| |
| I dopiero teraz spróbować powyższej operacji. Całość obrazuje poniższy przykład. |
| |
| Zakładamy, że wczytaliśmy już całość powyższego kodu do systemu DES. |
| |
| {{:pl:miw:2009:4_5_1.png|}} |
| |
===== 5. Wnioski końcowe ===== | ===== 5. Wnioski końcowe ===== |