Datenbank mit SQL Abfragen, schwere Aufgabe?

Evelyn_M

Benutzer
Beiträge
7
Hallo,

gegeben ist folgende Datenbank:

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

Ich habe mich mit dem Thema nun beschäftigt und folgende Aufgabe gelöst, siehe Anhang.
Ich habe folgenden Code verwendet:

SELECT pr.ProductName,
pr.Price,
ca.CategoryName,
su.SupplierName
FROM Products pr,
Suppliers su,
Categories ca
WHERE pr.Price > 30
AND pr.Price < 40
AND pr.CategoryID = ca.CategoryID
AND pr.SupplierID = su.SupplierID;


Ich wollte fragen, ob ich diese Aufgabe so richtig gelöst habe. Benötige dies für die Uni und bin auf eure Hilfe sehr angewiesen, ich habe mir viel mühe gegeben und bei der hitze heute stundenlang die Aufgabe gemacht.

Vielen Dank.

Evelyn
 

Anhänge

  • Aufgabe 4.JPG
    Aufgabe 4.JPG
    52,8 KB · Aufrufe: 2
Werbung:
Prinzipiell richtig.

Verbessern kann man die Schreibweise. Statt "from table1, table2, table3 where ... and table1.id=table2.id ..." ist es übersichtlicher, den JOIN (nichts anderes ist das) expliziet zu definieren:
"select ... from table1 inner join table2 on table1.id=table2.id inner join table3 on ... where ...". Damit sieht man auf einen Blick, wie die Tabellen verbunden sind und trennt dies von der eigentlichen Where-Bedingung.

Wie gesagt, ist nur übersichtlicher. Die DB macht intern in beiden Varianten dasselbe.
 
Vielen Dank. Jetzt habe ich es irgendwie verstanden, war schon am verzweifeln, dass ich es schaffe, aber eigentlich, wenn man das Buch nimmt, kann man alle aufgaben lösen. Aber es ist gut, dass jemand noch drüber schaut und einfach mal bessere lösung präsentiert, es gibt ja viele varianten. den Join zu nutzen macht hier sinn, finde ich.
 
Damit sieht man auf einen Blick, wie die Tabellen verbunden sind und trennt dies von der eigentlichen Where-Bedingung.

Bei einem Inner Join ist das so, bei einem Outer Join kann man leicht Fehler machen.
Der Unterschied zwischen dem Komma Join und der Ansi Join Syntax ist nämlich, dass die WHERE Bedingung als Filter nach dem Join ausgeführt wird.
Beispiel:
Code:
select * from tabelle1 tab1 left join tabelle2 tab2 on 
              (tab1.spalteA = tab2.spalteX and tab2.spalteY='abc')
where  tab1.spalteB = '12345'
Diese Abfrage ist nicht identisch mit dieser:
Code:
select * from tabelle1 tab1 left join tabelle2 tab2 on 
              (tab1.spalteA = tab2.spalteX )
where  tab1.spalteB = '12345'
and (tab2.spalteY= 'abc' or tab2.spalteY IS NULL)

Die erste Abfrage liefert auch ein Ergebnis, wenn in tab2.spalteY der Wert 'abc' nicht vorhanden ist. Die Bedingung ist also Teil des Outer Joins.
Die zweite Abfrage führt den Outer Join aus und prüft danach (also Filter) ob die Spalte tab2.spalteY den Wert 'abc' oder NULL hat. Wenn das nicht der Fall ist, wird kein Ergebnis geliefert.

Ist ein oft gemachter Fehler bei der Umstellung von alter auf die neue Syntax.
 
Werbung:
Zurück
Oben