Wprowadzenie do SQL TEMAT 4 - Zadania dodatkowe 1. Znaleźć firmy, z którymi nie była przeprowadzona żadna transakcja. (RÓŻNICA) Krok 1: utworzenie tabeli BEZ_TRANSAKCJI będącej kopią tabeli FIRMY i w której będzie wynik zadania (267 rekordów) SELECT FIRMY.* INTO BEZ_TRANSAKCJI FROM FIRMY; Krok 2: usuwanie nabywców (69 rekordów) DELETE DISTINCTROW BEZ_TRANSAKCJI.* FROM BEZ_TRANSAKCJI INNER JOIN DOKUMENTY ON BEZ_TRANSAKCJI.Nr = DOKUMENTY.NrNabywcy; Krok 3: usuwanie sprzedawców (4 rekordy) DELETE DISTINCTROW BEZ_TRANSAKCJI.* FROM BEZ_TRANSAKCJI INNER JOIN DOKUMENTY ON BEZ_TRANSAKCJI.Nr = DOKUMENTY.NrSprzedawcy; Krok 4: prezentacja wyniku SELECT *FROM BEZ_TRANSAKCJI;
2. 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 Wrocław} {towary dolnośląskie, ale nie Wrocław}) KROK 1: towary (94 towary) sprzedawane przez Naszą firmę do tabeli TYLKO_WE_WROCŁAWIU; w tej tabeli będzie wynik zadania SELECT DISTINCT Symbol, TOWARY.Nazwa INTO TYLKO_WE_WROCŁAWIU FROM (((TOWARY INNER JOIN POZYCJEDOKUMENTU ON TOWARY.Symbol = POZYCJEDOKUMENTU.SmbTow) INNER JOIN DOKUMENTY ON POZYCJEDOKUMENTU.NrFaktury = DOKUMENTY.NrFaktury AND (POZYCJEDOKUMENTU.NrSprzedawcy = DOKUMENTY.NrSprzedawcy) INNER JOIN FIRMY ON DOKUMENTY.NrNabywcy = FIRMY.Nr) INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod WHERE MIEJSCOWOŚCI.Nazwa="Wrocław" AND DOKUMENTY.NrSprzedawcy=0; WARIANT A: KROK 2: tworzenie tabeli W_WOJEW_ALE_POZA_WROCŁAWIEM z towarami sprzedawanymi przez Naszą firmę w województwie dolnośląskim, ale w miejscowościach poza Wrocławiem SELECT DISTINCT SmbTow, TOWARY.Nazwa INTO W_WOJEW_ALE_POZA_WROCŁAWIEM FROM (((TOWARY INNER JOIN POZYCJEDOKUMENTU ON TOWARY.Symbol = POZYCJEDOKUMENTU.SmbTow)
INNER JOIN DOKUMENTY ON POZYCJEDOKUMENTU.NrFaktury = DOKUMENTY.NrFaktury AND (POZYCJEDOKUMENTU.NrSprzedawcy = DOKUMENTY.NrSprzedawcy) INNER JOIN FIRMY ON DOKUMENTY.NrNabywcy = FIRMY.Nr) INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod WHERE MIEJSCOWOŚCI.Nazwa<>"Wrocław" AND WOJEWÓDZTWA.Nazwa= dolnośląskie DOKUMENTY.NrSprzedawcy= 0; Uwaga: Tabela TOWARY w złączeniu i TOWARY.Nazwa w schemacie odpowiedzi nie są niezbędne dla potrzeb znalezienia odpowiedzi; tu wprowadzone dla poprawienia czytelności tabeli pomocniczej W_WOJEW_ALE_POZA_WROCŁAWIEM. Towarów sprzedawanych w województwie dolnośląskim lecz poza Wrocławiem jest 10, KROK 3: DELETE DISTINCTROW TYLKO_WE_WROCŁAWIU.* FROM TYLKO_WE_WROCŁAWIU INNER JOIN W_WOJEW_ALE_POZA_WROCŁAWIEM ON TYLKO_WE_WROCŁAWIU.Symbol= W_WOJEW_ALE_POZA_WROCŁAWIEM.Symbol; Rekordów wspólnych z tabelą TYLKO_WE_WROCŁAWIU jest tylko 9 i tyle jest usuwanych (widok arkusza)
232 Uldo-Nova Top jest tym 10-tym nieusuwanym rekordem (zaznaczony w kroku 2 na czerwono) WARIANT B: KROK 2: z tabeli TYLKO_WE_WROCŁAWIU usuwane są towary sprzedawane w województwie dolnośląskim lecz poza Wrocławiem wskazane przez złączenie (FROM) DELETE DISTINCTROW TYLKO_WE_WROCŁAWIU.* FROM (((((TYLKO_WE_WROCŁAWIU INNER JOIN TOWARY ON tylko_we_wrocławiu.symbol=towary.symbol) INNER JOIN POZYCJEDOKUMENTU ON TOWARY.Symbol = POZYCJEDOKUMENTU.SmbTow) INNER JOIN DOKUMENTY ON POZYCJEDOKUMENTU.NrFaktury = DOKUMENTY.NrFaktury AND POZYCJEDOKUMENTU.NrSprzedawcy = DOKUMENTY.NrSprzedawcy) INNER JOIN FIRMY ON DOKUMENTY.NrNabywcy = FIRMY.Nr) INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod) INNER JOIN WOJEWÓDZTWA ON MIEJSCOWOŚCI.Kodwoj=WOJEWÓDZTWA.KOD WHERE MIEJSCOWOŚCI.Nazwa<>"Wrocław" AND DOKUMENTY.NrSprzedawcy=0 AND WOJEWÓDZTWA.NAZWA="dolnośląskie" ;
WARIANT C z podkwerendą: DELETE DISTINCTROW TYLKO_WE_WROCŁAWIU.* FROM ( SELECT SmbTow FROM (((POZYCJEDOKUMENTU INNER JOIN DOKUMENTY ON POZYCJEDOKUMENTU.NrSprzedawcy = DOKUMENTY.NrSprzedawcy AND POZYCJEDOKUMENTU.NrFaktury = DOKUMENTY.NrFaktury) INNER JOIN FIRMY ON DOKUMENTY.NrNabywcy = FIRMY.Nr) \INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod) INNER JOIN WOJEWÓDZTWA ON MIEJSCOWOŚCI.Kodwoj=WOJEWÓDZTWA.KOD WHERE MIEJSCOWOŚCI.Nazwa<>"Wrocław" AND DOKUMENTY.NrSprzedawcy=0 AND WOJEWÓDZTWA.NAZWA="dolnośląskie") AS W_WOJ_POZA_WROCŁAWIEM INNER JOIN TYLKO_WE_WROCŁAWIU ON W_WOJ_POZA_WROCŁAWIEM.SmbTow= TYLKO_WE_WROCŁAWIU.Symbol; WYNIK W KAŻDYM PRZYPADKU: 85 towarów
3. Utworzyć za pomocą kwerendy tabelę "M1" o schemacie {NazwaMjc} miejscowości klientów kupujących w Naszej firmie konserwę albo kawę, oraz tabelę "M2" o schemacie {NazwaMjc} miejscowości klientów kupujących herbatę. Znaleźć miejscowości, które znalazły się w obu tabelach. (M1 M2) Krok 1: tworzenie tabeli M1 SELECT DISTINCT MIEJSCOWOŚCI.Nazwa INTO M1 FROM (((FIRMY INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol) INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod WHERE (TOWARY.Nazwa Like "*konserw*" AND DOKUMENTY.NrSprzedawcy=0) OR (TOWARY.Nazwa Like "*kawa*" AND DOKUMENTY.NrSprzedawcy=0);
Krok 2: tworzenie tabeli M2 SELECT DISTINCT MIEJSCOWOŚCI.Nazwa INTO M2 FROM (((FIRMY INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol) INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod WHERE (TOWARY.Nazwa Like "*herbata*" AND DOKUMENTY.NrSprzedawcy=0) ; Krok 3: SELECT M1.Nazwa FROM M1 INNER JOIN M2 ON M1.Nazwa= M2.Nazwa; WYNIK:
4. Znaleźć poszukiwane w zadaniu 3 miejscowości bez tworzenia tabel, w jednej kwerendzie SQL z podkwerendami. (ILOCZYN) SELECT M1.* FROM ( SELECT DISTINCT MIEJSCOWOŚCI.Nazwa FROM (((FIRMY INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol) INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod WHERE (TOWARY.Nazwa Like "*konserw*" AND DOKUMENTY.NrSprzedawcy=0) OR (TOWARY.Nazwa Like "*kawa*" AND DOKUMENTY.NrSprzedawcy=0) )AS M1 INNER JOIN ( SELECT DISTINCT MIEJSCOWOŚCI.Nazwa FROM (((FIRMY INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol) INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod WHERE (TOWARY.Nazwa Like "*herbata*" AND DOKUMENTY.NrSprzedawcy=0) )AS M2 ON M1.Nazwa=M2.Nazwa ; WYNIK:
5. Utworzyć za pomocą kwerendy tabelę "T1" o schemacie {Symbol,Nazwa} towarów, które były kupowane w Naszej firmie przez klientów z Wrocławia w lipcu 1992 albo przez klientów z Krakowa w sierpniu 1992 i tabelę "T2" o schemacie {Symbol,Nazwa} towarów sprzedawanych klientom z Warszawy kiedykolwiek. Znaleźć towary, które są w tabeli "T1" i nie występują w "T2". (T1 T2) Krok 1: tworzenie T1 SELECT DISTINCT Symbol,TOWARY.Nazwa INTO T1 FROM (((MIEJSCOWOŚCI INNER JOIN FIRMY ON MIEJSCOWOŚCI.Kod = FIRMY.KodMjc) INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol WHERE (Month([Data])=7 AND Year([data])=1992 AND DOKUMENTY.NrSprzedawcy=0 AND MIEJSCOWOŚCI.Nazwa="Wrocław") OR (Month([Data]))=8 AND Year([data])=1992 AND DOKUMENTY.NrSprzedawcy=0 AND MIEJSCOWOŚCI.Nazwa="Kraków"); Krok 2: tworzenie T2 SELECT DISTINCT Symbol,TOWARY.Nazwa INTO T2 FROM (((MIEJSCOWOŚCI INNER JOIN FIRMY ON MIEJSCOWOŚCI.Kod = FIRMY.KodMjc) INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmybTow = TOWARY.Symbol WHERE DOKUMENTY.NrSprzedawcy=0 AND MIEJSCOWOŚCI.Nazwa="Warszawa"; Część wspólną T1 i T2 stanowi 1 rekord (zaznaczony czerwoną ramką)
Krok 3: T1-T2; wynik w T1 DELETE DISTINCTROW T1.* FROM T1 INNER JOIN T2 ON T1.Symbol=T2.Symbol;
6. Utworzyć za pomocą kwerendy tabelę "W1" o schemacie {NazwaWoj} województw firm, którym Nasza firma sprzedawała albo od nich kupowała kawę na kwotę większą niż 30 zł jednorazowo oraz tabelę "W2" nazw województw firm, z którymi przedmiotem transakcji (kupna lub sprzedaży) była konserwa lub ryż. Zsumować zawartość tabel W1 i W2 w tabeli W2. (W1 W2 gdzie W1 =W1_1{woj.firm którym NF sprzedawała kawę za więcej niż 30} W1_2{woj.firm które sprzedawały NF kawę za więcej n iż 30 }, a W2= W2_1{woj.firm którym NF sprzedawała konserwy lub ryż} W2_2{woj.firm które sprzedawały NF konserwy lub ryż }) Krok 1: tworzenie tabeli W1 SELECT NazwaWoj INTO W1 FROM ( SELECT DISTINCT WOJEWÓDZTWA.Nazwa AS NazwaWoj FROM ((((WOJEWÓDZTWA INNER JOIN MIEJSCOWOŚCI ON WOJEWÓDZTWA.Kod = MIEJSCOWOŚCI.KodWoj) INNER JOIN FIRMY ON MIEJSCOWOŚCI.Kod = FIRMY.KodMjc) INNER JOIN POZYCJEDOKUMENTU ON (DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy) AND (DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury)) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol WHERE Ilość*CenaNetto>30 AND TOWARY.Nazwa Like "*kawa*" AND DOKUMENTY.NrSprzedawcy=0 Union SELECT DISTINCT WOJEWÓDZTWA.Nazwa AS NazwaWoj FROM ((((WOJEWÓDZTWA INNER JOIN MIEJSCOWOŚCI ON WOJEWÓDZTWA.Kod = MIEJSCOWOŚCI.KodWoj) INNER JOIN FIRMY ON MIEJSCOWOŚCI.Kod = FIRMY.KodMjc) INNER JOIN DOKUMENTY ON FIRMY.Nr = DOKUMENTY.NrSprzedawcy) INNER JOIN POZYCJEDOKUMENTU ON (DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy) AND (DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury)) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol WHERE Ilość*CenaNetto>30 AND TOWARY.Nazwa Like "*kawa*" AND DOKUMENTY.NrNabywcy=0 ) ; W1
Krok 2: tworzenie tabeli W2 SELECT NazwaWoj INTO W2 FROM ( SELECT DISTINCT WOJEWÓDZTWA.Nazwa AS NazwaWoj FROM ((((WOJEWÓDZTWA INNER JOIN MIEJSCOWOŚCI ON WOJEWÓDZTWA.Kod = MIEJSCOWOŚCI.KodWoj) INNER JOIN FIRMY ON MIEJSCOWOŚCI.Kod = FIRMY.KodMjc) INNER JOIN POZYCJEDOKUMENTU ON (DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy) AND (DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury)) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol WHERE (TOWARY.Nazwa Like "*ryż*" OR TOWARY.Nazwa Like "*konserw*") AND DOKUMENTY.NrSprzedawcy=0 Union SELECT DISTINCT WOJEWÓDZTWA.Nazwa AS NazwaWoj FROM ((((WOJEWÓDZTWA INNER JOIN MIEJSCOWOŚCI ON WOJEWÓDZTWA.Kod = MIEJSCOWOŚCI.KodWoj) INNER JOIN FIRMY ON MIEJSCOWOŚCI.Kod = FIRMY.KodMjc) INNER JOIN DOKUMENTY ON FIRMY.Nr = DOKUMENTY.NrSprzedawcy) INNER JOIN POZYCJEDOKUMENTU ON (DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy) AND (DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury)) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol WHERE (TOWARY.Nazwa Like "*ryż*" OR TOWARY.Nazwa Like "*konserw*") AND DOKUMENTY.NrNabywcy=0 ) ;
Krok 3: wyniki W1 W2 TABLE W1 UNION TABLE W2; 7. Utworzyć za pomocą kwerendy tabelę "K1" o schemacie {Numer, NazwaNabywcy} numerów i nazw firm, które kupowały od Naszej firmy kawę w lipcu 1992 roku albo chrupki kiedykolwiek oraz tabelę "K2" firm kupujących w Naszej firmie towary w puszkach (czyli w nazwie konserwy). Znaleźć firmy występujące w K1 i nie występujące w K2. (K1 K2) KROK 1: tworzenie K1 SELECT DISTINCT Nr AS Numer, FIRMY.Nazwa AS NazwaNabywcy INTO K1 FROM ((FIRMY INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol WHERE (Month([Data])=7 AND Year([data])=1992 AND Towary.Nazwa LIKE "*kawa*" AND NrNabywcy<>0) OR (Towary.Nazwa LIKE "*chrupki*" AND NrNabywcy<>0);
KROK 2: tworzenie K2 SELECT DISTINCT Nr AS Numer, FIRMY.Nazwa AS NazwaNabywcy INTO K2 FROM ((FIRMY INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol WHERE Towary.Nazwa LIKE "*konserwa*" AND NrNabywcy<>0; DELETE DISTINCTROW K1.* FROM K1 INNER JOIN K2 ON K1.Numer=K2.Numer; Usuwana część wspólna K1 I K2 to:: WYNIK w K1:
Uwaga: zad 7 i 8 idealne na kolokwium, a zad zbyt skomplikowane. 8. Znaleźć towary, które były sprzedawane przez Naszą firmę klientom z Wrocławia, ale nigdy nie były sprzedawane klientom z Krakowa. ({towary Wrocław94} {towary Kraków47}) Część wspólna: 43 towary Wynik:51 towarów w tabeli 8_wrocław
9. Znaleźć towary, które były kupione od Naszej firmy (na kwotę > 20 zł jednorazowo) przez klientów z Wrocławia i przez klientów z Krakowa. ({towar20złwrocław} {towary20złkraków}) SELECT M1.* FROM ( SELECT DISTINCT Symbol,Towary.Nazwa FROM (((FIRMY INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol) INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod WHERE (ilość*cenanetto>20 AND DOKUMENTY.NrSprzedawcy=0 And Miejscowości.Nazwa="Wrocław") )AS M1 INNER JOIN ( SELECT DISTINCT Symbol,Towary.Nazwa FROM (((FIRMY INNER JOIN POZYCJEDOKUMENTU ON DOKUMENTY.NrSprzedawcy = POZYCJEDOKUMENTU.NrSprzedawcy AND DOKUMENTY.NrFaktury = POZYCJEDOKUMENTU.NrFaktury) INNER JOIN TOWARY ON POZYCJEDOKUMENTU.SmbTow = TOWARY.Symbol) INNER JOIN MIEJSCOWOŚCI ON FIRMY.KodMjc = MIEJSCOWOŚCI.Kod WHERE (ilość*cenanetto>20 AND DOKUMENTY.NrSprzedawcy=0 And Miejscowości.Nazwa="Kraków") )AS M2 ON M1.Symbol=M2.Symbol ; 10. Do listy klientów, którzy kupili u nas kawy w sumie na kwotę > 100 dołączyć klientów, którzy kawy u nas nigdy nie kupili, ale każdy z nich kupił "pasztet" i "zupy choise". (klienci więcej niż 100 ((klienci pasztet klienci zupy choise) klienci kupujący kawę))