Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pytanie SQL
Forum PHP.pl > Forum > Bazy danych > MySQL
dawbog
witam, mógłby ktoś pomóc, i napisać dlaczego wybrał tą odpowiedź. Ponieważ zadanie niby proste a zdania są podzielone.
dzięki z góry.

Dane osobowe studenta znajdują się w tablicy student, przy czym w polu id_wojew znajduje się klucz obcy odwołujący się do klucza głównego o tej samej nazwie w tablicy wojew. Tablica wojew jest typowym słownikiem przy czym w polu nazwa_wojew znajduje się nazwa województwa. Które z poniższych zapytań SQL zwróci dane studenta z nazwą (nie numerem) województwa?

SELECT imie, nazwisko, wojew.nazwa_wojew FROM student, wojew WHERE student.id_wojew=id_wojew.wojew;

SELECT imie, nazwisko FROM student (SELECT wojew FROM wojew);

SELECT imie, nazwisko, wojew.nazwa_wojew FROM student RIGHT JOIN wojew USING(id_wojew);

SELECT imie, nazwisko, wojew.nazwa_wojew FROM student LEFT JOIN wojew USING (id_wojew);
ucho
AFAIK ostatnie. A skąd się wzięły wątpliwości?
http://www.postgresql.org/docs/8.3/interac...ml#QUERIES-JOIN
dawbog
dziękuję za odpowiedź, na teście też zaznaczyłem tą odpowiedź, a wykładowca poinformował, że C jest dobra
ucho
Kod
$ cat test.sql

  1. CREATE TABLE student( imie text , nazwisko text , id_wojew int);
  2. CREATE TABLE wojew(id_wojew int,nazwa_wojew text);
  3. INSERT INTO student (imie, nazwisko, id_wojew) VALUES ('Jan', 'Kowalski', 2);
  4. INSERT INTO wojew (id_wojew, nazwa_wojew) VALUES (1, 'Pomorskie');
  5. INSERT INTO wojew (id_wojew, nazwa_wojew) VALUES (2, 'Mazowieckie');
  6. SELECT imie, nazwisko, wojew.nazwa_wojew FROM student RIGHT JOIN wojew USING (id_wojew);
  7. SELECT imie, nazwisko, wojew.nazwa_wojew FROM student LEFT JOIN wojew USING (id_wojew);
  8. DROP TABLE student;
  9. DROP TABLE wojew;

Kod
$ psql test < test.sql
CREATE TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
INSERT 0 1
imie | nazwisko | nazwa_wojew
------+----------+-------------
      |          | Pomorskie
Jan  | Kowalski | Mazowieckie
(2 rows)

imie | nazwisko | nazwa_wojew
------+----------+-------------
Jan  | Kowalski | Mazowieckie
(1 row)

DROP TABLE
DROP TABLE

To powiedz nam jeszcze na jakiej to uczelni pierwsze zapytanie lepiej pasuje do "zapytanie zwracające dane studenta" tongue.gif
dawbog
POLITECHNIKA GDAŃSKA ; wydział: Fizyki Technicznej i Matematyki Stosowanej ; Podyplomowe studium Programowania i Baz Danych
maly_swd
1. SELECT imie, nazwisko, wojew.nazwa_wojew FROM student, wojew WHERE student.id_wojew=id_wojew.wojew;
niestety na koncu ma blad, powinno byc student.id_wojew=wojew.id_wojew;

4. ma LEFT . A jak wiadomo LEFT laczy wyniki nawet jak nie ma w drugiej tabeli ID...
a jak wiadomo kazdy student MUSI byc przypisany do WOJEWODZTWA

3. Jest poprawne poniewaz na uczelni moze nie byc studenta z wojewodztwa X

2. to bledne zapytanie (skladnia)
dawbog
maly_swd czyli uwazasz ze 3 jest ok. tylko ze tak jak napisał ucho dostaniemy wtedy wszystkie województwa, a pytanie brzmi: Które z poniższych zapytań SQL zwróci dane studenta z nazwą (nie numerem) województwa?
Czyli priorytetem jest otrzymanie wszystkich studentów i przypisanych do nich województw.
maly_swd
Ale z logicznego (projekt bazy).
To nie mozemy miec studenta ktory nie jest przypisany do miasta/wojewodztwa. Wiec Left Join odpada.
Ale mozemy miec wojewodztwa a nie miec akurat w nich studentow.

Najbardziej pasujace byloby samo JOIN, ale nie ma:)
dawbog
No właśnie, zgadzam się z Tobą.
Skoro, wszyscy studenci mają przypisane województwa, oraz mamy województwa do których nie są przypisani studenci, to patrząc na przykład który podał ucho należy użyć LEFT JOIN.
Może mógłbyś podać jakiś konkretny kontrprzykład.
Dzięki za zainteresowanie.
maly_swd
Obydwa zapytanie sa poprawe pod wzgledem skladni i wyswietlenia wyniku z zalozenia... ALE... z logicznego powiazania juz tylko RIGHT JOIN... (przynajmniej na moja logike).

Kolega ucho podal wynik RIGHT join

imie | nazwisko | nazwa_wojew
------+----------+-------------
| | Pomorskie
Jan | Kowalski | Mazowieckie
(2 rows)

A left JOIN jak by mial wpisanego studenta bez wojewodztwa

imie | nazwisko | nazwa_wojew
------+----------+-------------
Jan | Kowalski | Mazowieckie
Jan | Nowak | NULL


Ogolnie powinno byc w tych odpowiedziach samo JOIN. Jak by przyklad 1. nie mial bledu to on by byl najbardziej poprawny
(2 rows)
dawbog
Masz racje, ale z drugiej strony mając wpisanego studenta "Jan Nowak", który nie ma podanego województwa i użyjemy RIGHT JOIN to nie otrzymamy go w wyniku zapytania.
Dzięki za pomoc, myślę, że już chyba czas zostawić tą sporną kwestię w spokoju.
A ja chyba muszę wyjaśnić tą sprawę, bo wygląda na to, że oba zapytania są poprawne na swój sposób.
maly_swd
masz racje:) z punktu widzenia SQL obydwa sa pioprawne. Z logicznego juz nie:) tak jak podales nie moze byc Jan Nowak bez wojewodztwa:D

pozdrawiam
luckboy
A województwo bez Jana Kowalskiego może być?
W treści pytania jest że trzeba podać dane studenta z nazwa województwa.
Co się stanie gdy będzie istniało województwo w którym nie mieszka żaden student?

W przypadku "SELECT imie, nazwisko, wojew.nazwa_wojew FROM student RIGHT JOIN wojew USING(id_wojew);" zostanie wyswietlone nazwa województwa bez danych studenta.

Jeśli chodzi o "SELECT imie, nazwisko, wojew.nazwa_wojew FROM student LEFT JOIN wojew USING (id_wojew);" jak sami powiedzieliście nie może być studenta który nie mieszka w żadnym województwie. A wiec jeśli dane w tabelach są poprawne to zapytanie z LEFT JOIN powinno dać poprawny wynik. W innym przypadku dane w tabelach są nie poprawne. Zaś nam chodzi o to by zapytanie dawało poprawny wynik gdy są poprawne dane.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.