Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - SELECT Klausel und FROM Klausel in SQL


Kossy - Di 01.05.12 17:57
Titel: SELECT Klausel und FROM Klausel in SQL
Hallo !

Ich hab nochmal eine Frage zum Thema SQL.

Innerhalb der FROM Klausel kann ich sämtliche Tabellen meiner Datenbank miteinander "Joinen" und somit eine neue Tabellenstruktur aufbauen, die quasi meine Datenbasis unter eben den "JOIN Bedingungen" darstellt.

Ich bin mir jetzt nicht sicher, ob ich alles richtig verstanden habe, aber kann ich in der SELECT Klausel dann frei bestimmen, welche Felder ich aus den jetzt neu geformten Inhalten der FROM Klausel ausgeben möchte? Und können selbst die Felder, die ich nicht in der SELECT Klausel ausgeben möchte, dann innerhlab der WHERE- oder einer möglichen HAVING Klausel ohne Probleme weitergenutzt werden?

Viele Grüße
--Kossy--


Horschdware - Mi 02.05.12 10:18

Hallo,
du kannst die projezierten Felder aus dem Verbund frei wählen.

SQL-Anweisung
1:
2:
3:
SELECT A.Artikelnummer A.Beschreibung B.Preis
FROM A INNER JOIN B ON A.Artikelnummer = B.Artikelnummer 
WHERE B.Farbe = 'rot'


In der WHERE-Bedingung können dabei auch Felder genutzt werden, die nicht in der Projektion landen.

Für eine HAVING Klasuel müssen jedoch die betroffenen Felder per Aggregatsfunktion in der Auswahl landen, sonst gibt es ja nichts, auf das sich das HAVING beziehen könnte.


SQL-Anweisung
1:
2:
3:
SELECT Artikel.Artikelnummer SUM( Lager.Bestand ) 
FROM Artikel LEFT OUTER JOIN Lager ON Artikel.Artikelnummer = Lager.Artikelnummer
HAVING Lager.Bestand > 100


Moderiert von user profile iconTh69: Code- durch SQL-Tags ersetzt


Kossy - Mi 02.05.12 10:34

Vielen Dank für die Erläuterung !!

Moderiert von user profile iconTh69: Full-Quote entfernt.


Kossy - Do 03.05.12 12:49

Hallo nochmal !

Ich habe nochmal eine Frage zu diesem Thema, genauergesagt geht es um die GroupBy Klausel. Wenn ich in der GroupBy Klausel Felder aus der datenbasis der FROM Klausel angebe, nach denen ich gruppieren möchte und vielleicht 2 Aggregatfunktionen einbaue, die auf diese Gruppierungen angewendet werden sollen, MUSS ich immer zwingend alle Felder, auf die die diese Gruppierungen die Aggregatfunktionen angewandt werden, immer vollständig innerhlab der SELECT Klausel ausgeben, oder kann ich da auch nach Bedarf welche auslassen?

Aber wenn ich es jetzt richtig verstanden habe, dann muss ich diejenigen Felder, die dann in der SELECT Klausel auftauchen, auch innerhalb einer möglichen HAVING Klausel verwenden, richtig?

Viele Grüße
--Kossy--


Kossy - Fr 04.05.12 06:54

Hallo nochmal !

Mag wirklich niemand auf meine letzte Frage antworten?


Horschdware - Fr 04.05.12 09:06

Hallo,
zu deinen Fragen:

Zitat:
(muss man alle Felder) immer vollständig innerhlab der SELECT Klausel ausgeben, oder kann ich da auch nach Bedarf welche auslassen?



SQL-Anweisung
1:
2:
3:
4:
SELECT COUNT(Vorlesung.PersNr) AS Anzahl, Professor.Name
FROM Professor LEFT OUTER JOIN Vorlesung
ON Professor.PersNr = Vorlesung.PersNr
GROUP BY Professor.PersNr;
->geht

Zitat:
Aber wenn ich es jetzt richtig verstanden habe, dann muss ich diejenigen Felder, die dann in der SELECT Klausel auftauchen, auch innerhalb einer möglichen HAVING Klausel verwenden, richtig?
HAVING ist eine weitere optionale Einschränkung, die sich auf die verdichteten Werte aus der GROUP BY Klausel bezieht.

Moderiert von user profile iconTh69: Code- durch SQL-Tags ersetzt


Ralf Jansen - Fr 04.05.12 11:09

Zitat:
->geht


In welcher DB? Nach meinem dafür halten ist das unzulässig und sollte knallen auch wenn Professor.Name eindeutig einer PersNr zuzuordnen ist.


Th69 - Fr 04.05.12 11:27

Hallo Ralf,

ich stimme dir hier zu - sollte so direkt nicht funktionieren (zumindestens bei den üblichen Datenbanksystemen).
Als Trick nutze ich dann immer

SQL-Anweisung
1:
2:
3:
SELECT ..., Professor.Name
...
GROUP BY Professor.PersNr, Professor.Name;