.
asdf: Bazy danych
Jest może jakaś ogarnięta osoba z zapytań SQL

(nie tych najprostszych, chodzi o złożone
selecty oraz joiny)
Podpinam, kto moglby wiedziec:
Trivial − jesteś?
14 cze 18:21
Hajtowy: asdf napisz dokładnie o co chodzi

może będę w stanie pomóc
14 cze 19:28
asdf: ok
14 cze 20:20
asdf: Polecenie:
OCENY(idoceny,idproduktu, idankiety, ocena,)
PRODUKTY(idproduktu, idkilenta, nazwaproduktu)
ZAMÓWIENIA (idzamowienia, idproduktu, idkilenta, datazamowienia)
KLIENCI(idklienta, imie, nazwisko)
ANKIETY(idankiety, nazwiskoankietujacego, imieankietujacego)
Ile razy produkty zakupione przez KOWALSKIEGO JANA były oceniane przez
NOWAKA ADAMA.

moja odp to:
SELECT COUNT(o.id)
FROM oceny o
JOIN ankiety a ON a.imie = "ADAM" AND a.nazwisko = "NOWAK"
WHERE
o.produktID IN (
SELECT z.produktNR
FROM zamowienia z
JOIN klienci k ON k.imie = "JAN" AND k.nazwisko = "KOWALSKI"
WHERE
z.klientNR = k.ID
)
AND o.ankietaNR = a.ID
ok?
14 cze 20:20
asdf: moze nazwy do konca sie nie zgadzaja, ale sens jest taki:
klucz obcy, w tabeli jakos dziwnie nazwany, tutaj przyjalem taka konwencje:nazwa+"NR"
klucz glowny: ID lub nazwa+ID (by czytanie zapytania bylo latwiejsze)
14 cze 20:23
asdf:
14 cze 21:30
Trivial:
Cześć
Nie podoba mi się to Twoje zapytanie.

Jakieś takie rozlazłe, ma bardzo dziwny warunek
złączenia i prawdopodobnie nie działa (nie wykorzystana tabela ankiety). Nie mam na czym go
przetestować. Napiszę swoje:
http://pastebin.com/nhEYidm8
Ponadto, jest coś dziwnego: tabela produkty ma id_klienta.
14 cze 22:04
asdf: Cześć, tez sie zastanawialem nad tym po co to jest

Dzieki

, tylko dziwie sie, czemu moje
zapytanie mialo by nie zadziałać, przeciez:
FROM oceny o
JOIN ankiety a ON a.imie = "ADAM" AND a.nazwisko = "NOWAK"
na tym etapie mam wszystkie oceny, ktore wystawil ADAM NOWAK
WHERE o.produktID IN ( // ktorych produkty maja te same ID co zamowione przez kowalskiego
SELECT z.produktNR
FROM zamowienia z
JOIN klienci k ON k.imie = "JAN" AND k.nazwisko = "KOWALSKI"
WHERE
z.klientNR = k.ID
)
AND o.ankietyNR = a.ID // nie wiem nawet czy to trzeba...przeciez juz zlaczenie bylo.
14 cze 23:18
asdf: na tym etapie mam wszystkie oceny, ktore byly w ankiecie nowaka*
14 cze 23:19
asdf: dobrze rozumiem moje zapytanie:
z tabeli
oceny pobierz wszystkie te, ktore
ocenil adam nowak, nastepnie sposrod
tych
ocen wybierz te, ktore byly
zamawiane przez
klienta JAN NOWAK
14 cze 23:36
asdf: ...
z tabeli oceny pobierz wszystkie te, ktore ocenil adam nowak, nastepnie sposrod
tych ocen wybierz te, ktorych produktID byl rowny temu produktowi, który byl
zamawiany przez klienta jan kowalski
14 cze 23:37
asdf: Jeszcze mam takie zadanie:
Są tabele:
BYWA (piwosz, bar)
PODAJA (bar, piwo)
LUBI (piwosz, piwo)
musze pobrac:
piwoszy bywajacych w barze, w ktorym podaja piwo, ktore lubia ci piwosze
zrobilem w 2 formach (zagniezdzony select oraz join)
http://pastebin.com/B31a4cCp
jest ok?:
14 cze 23:53
Trivial: Wygląda w miarę OK. W drugim będziesz miał duplikaty.
14 cze 23:57
asdf: tylko tu sie jeszcze zastanawiam, bo:
SELECT piwosz
FROM bywa b
JOIN podaja p ON p.bar = b.bar
JOIN lubi l ON l.piwo = p.piwo
mozna to skrocic do takiego zapytania, czy musi byc takie jak w pastebin.com/(...)
i czy w ogole te odp sa ok
14 cze 23:57
asdf: jak w drugim duplikaty, to i w pierwszym, a co do postu z 23:37 − tez jest ok?
14 cze 23:58
Trivial: W pierwszym nie będzie duplikatów. Co do 23:37 to zapytanie zwróci co innego niż moje. Znowu
zależy od tego co konkretnie chcemy wybrać.
15 cze 00:00
asdf: ilosc ocenionych produktow przez nowaka, ktore wystawil kowalski..
15 cze 00:03
Trivial: Czy każda indywidualna ocena danego produktu liczona jest jako jedna czy kilka?
15 cze 00:04
asdf:
15 cze 00:05
Trivial: Nowak mógł ocenić dany produkt np. 3 razy. Czy to 3 oceny, czy jedna?...
15 cze 00:07
asdf: tego nie wiem
15 cze 00:10
asdf: jeszcze mam takie zadanie (tabele takie same jak bywa, podaja, lubi):
wybrac piwoszy, w tym samym barze co piwosz lubiacy podawany w tym samym barze gatunek piwa,
ktore lubi kowalski:
http://pastebin.com/cGaVrhGg
ok?
15 cze 00:13
Trivial: Twoja wersja zlicza jako jedną, moja uwzględnia krotność. Poza tym w JOINIE powinien być tylko
klucz obcy − reszta w WHERE.
15 cze 00:13
Trivial: Weź zrób sqlfiddle to sobie potestujemy. Dodaj przykładowe dane.
15 cze 00:15
asdf: ok, z tym bywa, lubi i podaja ok?
15 cze 00:20
Trivial: Raczej nie, chyba że nie rozumiem treści polecenia (jest trochę zamotane).
15 cze 00:23
asdf: no jest..mi tez to ciezko zrozumiec
15 cze 00:24
15 cze 00:24
Trivial: Coś takiego chyba:
PiwoszeW(BarachSerwujących(Piwa(Kowalskiego)))
15 cze 00:26
Trivial: asdf, za dużo tych x IN y.

Lepiej zrobić kilka JOINów.
15 cze 00:29
asdf:
piwoszy w tych samych barach, gdzie sprzedaja piwa kowalskiego?
15 cze 00:29
Trivial:
Coś takiego da radę (chyba):
SELECT DISTINCT b.piwosz
FROM lubi l
JOIN podaja p ON (p.piwo = l.piwo)
JOIN bywa b ON (b.bar = p.bar)
WHERE l.piwosz = 'Kowalski'
15 cze 00:34
asdf: SELECT piwosz
FROM lubi l
JOIN podaja p ON p.piwo = l.piwo
JOIN bywa b ON b.bar = p.bar
WHERE l.piwosz = 'kowalski'
15 cze 00:34
asdf: znaleźć piwoszy lubiących pić piwo podawane w barze „POD LIPĄ”.
15 cze 00:35
Trivial: Musi być SELECT DISTINCT b.piwosz.
15 cze 00:36
asdf:
SELECT piwosz
FROM lubi l
JOIN podaja p ON p.piwo = l.lubi
WHERE p.bar = 'POD LIPA'
ok?
15 cze 00:37
asdf: ok
15 cze 00:37
asdf: znaleźć piwoszy pijących w tym samym barze co piwosz lubiący piwo „LECH”.
15 cze 00:38
Trivial:
SELECT piwosz
FROM bywa
WHERE bar = 'Pod Lipą'
15 cze 00:38
Trivial:
SELECT DISTINCT b2.piwosz
FROM lubi l
JOIN bywa b ON (b.piwosz = l.piwosz)
JOIN bywa b2 ON (b2.bar = b.bar)
WHERE l.piwo = 'LECH'
15 cze 00:41
asdf: a no tak
15 cze 00:42
Trivial: Coś jeszcze? (:
15 cze 00:46
asdf: nom, sekunda, to ogarne pierw
15 cze 00:46
asdf:
SELECT piwosz
FROM bywa b
WHERE bar IN (
SELECT bb.bar
FROM bywa bb
JOIN lubi ON l.piwosz = bb.piwosz
WHERE l.piwosz = 'KOWALSKI'
)
15 cze 00:51
asdf:
SELECT piwosz
FROM bywa b
WHERE bar IN (
SELECT bb.bar
FROM bywa bb
JOIN lubi ON l.piwosz = bb.piwosz
WHERE l.piwo = 'LECH'
)
15 cze 00:52
asdf: w zagniezdzonym jest ID baru, w ktorym pije ten co lubi lecha, a glowny to po prostu piwosze,
ktorzy pija w tym samym barze tak?
15 cze 00:52
asdf: juz bez detali (distinct oraz b.piwosz)
15 cze 00:53
Trivial: Jest chyba OK, ale nie rozumiem potrzeby nadmiernego zagnieżdżania.
15 cze 00:55
asdf: nie mam tej wprawy co Ty
15 cze 00:56
asdf: Spółdzielnia „Szczęśliwa Dolina” utrzymuje bazę danych, w której przechowuje informacje o
saldach swoich członków,
ich zamówieniach, potencjalnych dostawcach i cenach dostawczych w następujących tabelach, w
których atrybuty podano w
nawiasach okrągłych:
CZŁONKOWIE(NAZWISKO, ADRES, SALDO)
ZAMÓWIENIA(NRZAMÓWIENIA, NAZWISKO, TOWAR, ILOŚĆ)
DOSTAWCY(NAZWADOSTAWCY, ADRESDOSTAWCY, TOWAR, CENA).
Podaj wyrażenie algebry relacji lub zapytanie w SQL by znaleźć tych członków spółdzielni,
którzy mają ujemne saldo i
zamówili towar u dostawcy „FRICO”.
15 cze 00:56
Trivial:
SELECT DISTINCT cz.nazwisko
FROM zamówienia z
JOIN członkowie cz ON (cz.nazwisko = z.nazwisko)
JOIN dostawcy d ON (d.towar = z.towar)
WHERE d.nazwa_dostawcy = 'FRICO'
AND cz.saldo < 0
15 cze 01:00
asdf: jeszcze co do tego:
piwoszy w tych samych barach, gdzie sprzedaja piwa kowalskiego?
nie powinno byc tak:
SELECT piwosz
FROM bywa b
JOIN podaja p ON p.bar = b.bar
JOIN lubi l ON l.piwo = p.piwo
WHERE l.piwosz = 'kowalski'
?
15 cze 01:01
zawodus: Przynajmniej masz "ciekawą" bazę danych

Dobrze, że ja już bazy danych mam za sobą
15 cze 01:01
Trivial: asdf, to bez znaczenia.
15 cze 01:03
Trivial: Tylko musi być DISTINCT, bo dostaniesz wiele duplikatów.
15 cze 01:03
asdf: oj tam oj tam
15 cze 01:04
asdf: Spółdzielnia „Szczęśliwa Dolina” utrzymuje bazę danych, w której przechowuje informacje o
saldach swoich członków,
ich zamówieniach, potencjalnych dostawcach i cenach dostawczych w następujących tabelach, w
których atrybuty podano w
nawiasach okrągłych:
CZŁONKOWIE(NAZWISKO, ADRES, SALDO)
ZAMÓWIENIA(NRZAMÓWIENIA, NAZWISKO, TOWAR, ILOŚĆ)
DOSTAWCY(NAZWADOSTAWCY, ADRESDOSTAWCY, TOWAR, CENA).
Podaj wyrażenie algebry relacji lub zapytanie w SQL by znaleźć tych dostawców, towary i ceny
dla wszystkich dostawców
dostarczających co najmniej jeden towar zamawiany przez „NOWAKA”
15 cze 01:07
asdf: czyli tu chodzi o to by:
znalezc tych dostawcow, ktorych towar zostal co najmniej raz zamowiony przez nowaka tak?
15 cze 01:09
Trivial: Tak.
15 cze 01:11
asdf:
SELECT
FROM dostawcy d
JOIN zamowienia z ON z.towar = d.towar
WHERE z.towar IN (
SELECT zz.towar
FROM zamowienia zz
GROUP BY zz.towar
HAVING COUNT(zz.towar) > 1
WHERE zz.nazwisko = 'NOWAK'
)
15 cze 01:15
asdf: eh...zle doczytalem, "co najmniej", a nie "wiecej niz"

moje bedzie dobre dla "co najmniej" 2?
15 cze 01:16
Trivial:
SELECT DISTINCT d.nazwa_dostawcy, d.towar, d.cena
FROM zamowienia z
JOIN dostawcy d1 ON (d1.towar = z.towar)
JOIN dostawcy d ON (d.nazwa_dostawcy = d1.nazwa_dostawcy)
WHERE z.nazwisko = 'NOWAKA'
15 cze 01:17
asdf: takie cos tez przejdzie?:
SELECT
FROM dostawcy d
WHERE d.towar IN (
SELECT zz.towar
FROM zamowienia zz
GROUP BY zz.towar
HAVING COUNT(zz.towar) > 1
WHERE zz.nazwisko = 'NOWAK'
)
15 cze 01:19
Trivial: HAVING chyba nie można tak użyć.
15 cze 01:19
15 cze 01:21
asdf: przejdzie to? (dla co najmniej 2)
15 cze 01:23
Trivial:
Chodziło mi o to, czy brak COUNT(zz.towar) w select nie jest czasem błędem.
Samo zapytanie nie przejdzie jeśli dobrze rozumiem strukturę bazy danych. Trzeba wybrać nazwy
tych dostawców, a potem jeszcze raz zagnieździć i wybrać ich cały asortyment.
15 cze 01:27
Trivial: Dobra
asdf, lecę spać. Na razie.
15 cze 01:29
asdf: czesc, dzieki bardzo
15 cze 01:29
asdf: aha...czyli zle zrozumialem pytanie, powinno brzmiec:
pokazac wszystkie towary i ceny dostawcy, u ktorego co najmniej raz zamawial nowak.
tak?
15 cze 01:47
asdf: a takie zadanie:
pokazac wszystkie produkty dostawcy, u ktorego zamawial co najmniej 2 razy NOWAK:
http://pastebin.com/rF3tQpYA
select 3: pobiera wszystkie towary nowaka
select 2: pobiera nazwy dostawcow, u ktorych nowak zamowil co najmniej 2 razy
select 1: wyswietla wszystkie produkty danych dostawcow
ok?
15 cze 02:10
asdf:
jezeli tak, to jak takie cos zrobic na joinach?
15 cze 02:11
asdf: jeszcze takie cos:
Podaj wyrażenie algebry relacji lub zapytanie w SQL by znaleźć tych dostawców, którzy
dostarczają towar zamówiony przez
członków spółdzielni, którzy mają ujemne salda.
SELECT d.nazwadostawcy
FROM czlonkowie cz
JOIN zamowienia z ON z.nazwisko = cz.nazwisko
JOIN dostawcy d ON d.towar = z.towar
WHERE cz.saldo < 0
ok?
15 cze 02:54
Trivial: W ogóle to nie podoba mi się ta baza z towarami. Towary dostarczane przez danego dostawcę
powinny być rozdzielone od innych danych dostawcy. Są zależności funkcyjne (np. NazwaDostawcy
→ AdresDostawcy), chyba że każdy dostawca dostarcza jeden towar. Skąd bierzesz te zadanka?
15 cze 12:48
Trivial: 02:54 wygląda OK.
15 cze 13:05
asdf: Z forum uczelnianego

mniej wiecej takie sa na egzaminie.
15 cze 13:24
Trivial:
Co do 2:10 to nie znowu nie jestem pewny czy można sobie tak używać HAVING bez podawania
COUNT(d.towar) na liście pól select. Później to sprawdzę. Poza tym masz złą składnię.
Kolejność jest taka:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
15 cze 13:25
asdf: No tak

juz pisalem po nocach i mi sie troche mylilo (ale to nie zadne usprawiedliwienie)

Da sie to jakos bez zagniezdzenia zrobic? (chyba nie..)
15 cze 13:35
15 cze 13:45
Trivial:
Sprawdziłem czy można używać HAVING bez pola w select. W SQL Server 2012 działa. Przykład:
SELECT 1
FROM owoce
GROUP BY id
HAVING Count(*) > 4
15 cze 13:53
Trivial: A ten twój nowy przykład na pewno nie zadziała, bo nawet nie masz nigdzie count.
15 cze 13:54
asdf: oj...count (d.nazwadostawcy) >= 2, teraz ok?
15 cze 13:57
Trivial:
Chyba OK. Tak się tylko zastanawiam się po co piszesz te nazwy pól w count? To ma znacznie
tylko przy nullach, a chybe nie oczekujesz żadnych?
15 cze 13:59
asdf: tak

przy joinach nie ma znaczenia, przy left joinach juz tak
15 cze 14:01
asdf: bedziesz miec chwile (jak nie teraz to pozniej, kolo 20?), bo normalizacje chcialem ogarnac
15 cze 14:03
Trivial: Tutaj bez podzapytania chyba nie przejdzie.
15 cze 14:03
Trivial: Hmm może chwilkę znajdę.
15 cze 14:07
asdf: teraz, czy pozniej?
15 cze 14:09
Trivial: Koło 20−21.
15 cze 14:09
asdf: Ok,

to milego dnia, do wieczoru.
15 cze 14:11
Trivial: Cześć.
15 cze 14:12
asdf: Ja bede kolo 20:30.
15 cze 16:31
asdf: będziesz to daj znac (co 15 min sprawdzam)
15 cze 20:27
Trivial: Jestem, ale robię sprawko.
15 cze 20:56
asdf: ok, o ktorej bedziesz dostepny?
15 cze 20:57
Trivial: w zasadzie i tak nie wiem jak coś zrobić. mogę teraz.
15 cze 21:03
asdf: ok, za 5 min podesle linka. zjem
15 cze 21:07
15 cze 21:14
asdf:
Trivial
mam kolejne zadanko:
Wypisz w SQL osoby z działu ZABAWKI, które zarabiają więcej niż osoby zaszeregowane do piątej
grupy zaszeregowania
Pracownik: pracownikID, działNR, imie, nazwisko, grupazaszeregowanNR, kierownikNR,
stanowiskoNR, zarobek
Kierownik: kierownikID, działNR, imie, nazwisko
Dział: działID, nazwa, miasto
Zaszeregowanie:grupazaszeregowanID, nazwa, zarobekmin, zarobekmax
SELECT p.imie, p.nazwisko
FROM dzial d
JOIN pracownik p ON p.dzialNR = d.dzialID
WHERE d.nazwa = 'ZABAWKI'
AND p.zarobek > (
SELECT zarobekmax
FROM zarobek z
WHERE z.nazwa ='5'
)
jest ok?
17 cze 02:26
asdf: jeszcze mam coś takiego:
KATEGORIA: kategoriaID, nazwa
PRODUKT: produktID, kategoriaNR, nazwa, cena
KLIENT: klientID, imie, nazwisko
ZAMOWIENIE: zamowienieID, klientNR, produktNR, ilosc, uwagi
ANKIETA: ankietaID, imie, nazwisko, adres
OCENA: ocenaID, produktNR, ankietaNR, ocenawaga, uwagi, data
17 cze 02:47
asdf: Jakiej kateogrii produkt zamawiany przez kowalskiego najwyzej ocenil nowak?
17 cze 02:47
17 cze 02:50
Trivial: Oj nie chce mi się asdf...
17 cze 17:03
asdf: :(
17 cze 18:36
26 cze 13:41
asdf: ?
26 cze 22:53
zawodus: a sprawdziłeś czy działa ci to?
26 cze 23:44
asdf: a czemu mialoby nie działać?

Juz nie chodzi nawet o to, czy nie ma glupiej pierdolki
gdzies...ale o sam sposob rozwiazania (relacja, sortowanie −> wynik, czy ok?)
26 cze 23:56
asdf: :(
27 cze 12:06
Trivial: A nie możesz sobie tego odpalić po prostu dla jakiegoś małego zbiorku danych?
27 cze 16:19
asdf: no ok
28 cze 03:22