# Frage zu SQL Syntax



## DennisXX (1. Aug 2011)

Hi Folks !

Auf Seite 219 des Buches "Einführung in SQL" vom O´Reilly Verlag habe ich ein SQL Beispiel gefunden, dass für mich nicht ganz plausibel ist. Ich habe dieses Beispiel mal in den Anhang dieses Posts gestellt.

Dort befinden sich in der SELECT Klausel selbst komplexere SQL Befehle. Ich versteht nicht ganz, weshalb das zulässig sein kann, denn eigentlich sind solche komplexere Befehle doch nur in der FROM-, WHERE- oder HAVING-Klausel zulässig oder? 

In der SELECT Klausel selbst sollen doch nur Felder auftauchen, die eine gewisse Ergebnissmenge zurückliefern oder (entweder durch umfangreichere FROM Klausel WHERE Klausel oder GROUP BY in Kombination mit einer HAVING Klausel)?

Greetz
Dennis


----------



## turtle (1. Aug 2011)

Verschachtelte Select


----------



## DennisXX (1. Aug 2011)

Also das hilft mir überhaupt nicht weiter.

Es geht auch eher um die komplexeren Befehle in der SELECT Klausel selbst und nicht AB der FROM oder WHERE Klausel !!!


----------



## SlaterB (1. Aug 2011)

was soll man sagen, es geht halt mehr oder weniger, vielleicht auch nicht in allen Datenbanken,

habe jetzt eben paar SQL-Tutorials angeschaut,
ist nicht wirklich direkt genannt oder weiter hinten gut zu finden, speziell nicht in
MySQL :: MySQL 5.1 Referenzhandbuch :: 13.2.7 SELECT

nach CASE gesucht dann führt zu
SQL Server Update: "Using CASE Expressions"


> A More Complicated Example
> 
> Using searched CASE expressions and nested subqueries in SELECT statements very complex processing can be accomplished with a single SQL statement.
> [..]


subqueries ist auch ein guter Suchbegriff,

in einem 500 Seiten-Buch zu SQL wird wohl alles drinstehen, 
ansonsten ausprobieren und eben akzeptieren was einem so begegnet


----------



## turtle (1. Aug 2011)

select cust_id, fed_id, cust_type_cd from customer c sollte verständlich sein.

Nun möchte ich noch wissen, ob ein Kunde überhaupt Giro/Sparkonten hat.

Daher ergänze ich das SQL um zwei Spalten, die zur Laufzeit ermitteln, ob überhapt Einträge des betreffenden Typs vorliegen und gebe ein Zeichen für die entsprechende Spalte zurück.

Das Beispiel verbindet also dynamische Spalten über das case-Konstrukt mit einer select_Anweisung um die Bedingung zu bestimmen, welche Anzeige in der Spalte stehen soll.

Nun klarer?


----------



## SlaterB (1. Aug 2011)

@turtle
der konkrete Inhalt dieser Query war weniger die Frage sondern doch allein die mögliche neue Syntax


> Nun klarer? 
du solltest mit deiner Formulierung ein wenig aufpassen wenn dein erster Link doch ziemlich unnötig unklar war


----------



## DennisXX (1. Aug 2011)

SlaterB hat gesagt.:


> in einem 500 Seiten-Buch zu SQL wird wohl alles drinstehen,
> ansonsten ausprobieren und eben akzeptieren was einem so begegnet



Naja, man muss es auch verstehen, warum so etwas akzeptiert wird. Nur dann kann es ja auch in den entsprechenden Situationen anwenden bzw. auch richtig anwenden.

Daru geht es ja und deshalb auch meine Frage hier in dem entsprechenden Fachforum.

Greetz
Dennis


----------



## maki (1. Aug 2011)

> Naja, man muss es auch verstehen, warum so etwas akzeptiert wird. Nur dann kann es ja auch in den entsprechenden Situationen anwenden bzw. auch richtig anwenden.
> 
> Daru geht es ja und deshalb auch meine Frage hier in dem entsprechenden Fachforum.


Nun ja, wenn die Fragen mit einer Googlesuche zu der Doku beantwortet werden kann, dann war die Frage es nicht wirklich Wert in einem Forum gestellt zu werden.

Mal ehrlich, nach "sql case" oder gar "sql case syntax" zu googeln darf ja man wohl noch erwarten, oder sollen wir dir das hier wirklich abnehmen?


----------



## SlaterB (1. Aug 2011)

ob eine Subquery im SELECT erlaubt und vielleicht gut oder ungünstig ist, ist schon bisschen interessanter (habe ich nicht unbedingt beantwortet),
die meisten CASE-Suchergebnisse haben auch nur einfache Werte-Paare, nicht gleichzeitig auch noch Subqueries,

also gibt schlimmere Fragen


----------



## Evil-Devil (1. Aug 2011)

Du kannst bei MySQL nahezu beliebig viele Subqueries schreiben

Dabei ist es fast egal wo sich der Subquerie befindet. Der kann direkt im Select stehen, innerhalb des Case Blockes der wiederum im Select steht. Es ginge auch den in die FROM Bedingung zu intergrieren oder ins Where. Wichtig ist das der Subquery als selbst funktioniert und keine Funktionalität nutzt die dort nicht erlaubt ist. Zb. ging es meine ich bis vor Mysql5 nicht ein Limit im Subquery zu nutzen.

Um deine Frage noch zu beantworten: Das ist in sofern zulässig, weil Werte nicht zwingend aus der FROM kommen müssen. Select kann sowohl mit statischen als auch dynamischen Werten arbeiten.

Zb. funktioniert auch folgendes:
select date_format(now(), '%m.%d.%Y'), 'Aktuelles Datum';

Ist zwar relativ sinnfrei dieses Select, aber wie man sieht hat es keine FROM Anweisung und wird trotzdem ausgeführt. Ähnlich ist es mit dem CASE. Das liefert entsprechend den Wert zurück und das SELECT ergänzt dafür dann eine zusätzliche Spalte in der Ausgabe.


----------



## DennisXX (1. Aug 2011)

maki hat gesagt.:


> Mal ehrlich, nach "sql case" oder gar "sql case syntax" zu googeln darf ja man wohl noch erwarten, oder sollen wir dir das hier wirklich abnehmen?



Also ich finde Deine Art von Antwort schon ziemlich daneben und großkotzig. Du bist hier nicht der Fachmann für sämtliche Einschätzungen und Expertisen ok?

Was ein CASE in SQL ist und wie seine Syntax aussieht, ist mir bereits geläufig, allerdings ist mir nicht verständlich, und genau das war der eigentliche Tenor dieser Frage, WARUM es direkt aus Ausdruck in einem Feld eines SELECT auftauchen kann, welcher eigentlich nur eine Ergebnismenge zurückliefert, die bereit durch andere Codesegmente bestimmt und zurückgeliefert werden sollte.

Ich hoffe mein Anliegen ist nun verständlich, als zuvor.

Greetz
Dennis


----------



## turtle (1. Aug 2011)

DU wolltest von uns eine Antwort auf eine Frage haben, oder?

Nun haben wir in mehreren Beiträgen versucht, nahe zu bringen, worin der "Clou" des Select-Statements liegt. Aber stattdessen mal sich damit zu beschäftigen, beleidigst Du nur Andere. Das finde ich schon ein starkes Stück


----------



## DennisXX (1. Aug 2011)

turtle hat gesagt.:


> Aber stattdessen mal sich damit zu beschäftigen, beleidigst Du nur Andere. Das finde ich schon ein starkes Stück



Ich denke das Maki hier derjenige ist, der hier ausfällig geworden ist und ich mich in Bezug auf sein mir entgegengebrachtes Niveau noch recht eloquent und morderat geäußert habe.

Nun ist aber gut diesbezüglich ok?


----------



## maki (1. Aug 2011)

> Also ich finde Deine Art von Antwort schon ziemlich daneben und großkotzig. Du bist hier nicht der Fachmann für sämtliche Einschätzungen und Expertisen ok?


Dir steht es frei meine Antworten ggf. zu ignorieren, aber der Hinweis dass du auch Google nutzen könntest ist ja nicht allzuweit hergeholt.



> Ich denke das Maki hier derjenige ist, der hier ausfällig geworden ist und ich mich in Bezug auf sein mir entgegengebrachtes Niveau noch recht eloquent und morderat geäußert habe.


Wirklich?
Wo bin ich "ausfällig" (?) geworden?
Und wo willst du mit Eloquenz und Niveau geantwortet haben? *g*
Bist doch nur persönlich geworden, für mich klingt das eher nach einem 4 Jährigen in der Trotzphase.


----------



## Evil-Devil (1. Aug 2011)

DennisXX hat gesagt.:


> WARUM es direkt aus Ausdruck in einem Feld eines SELECT auftauchen kann, welcher eigentlich nur eine Ergebnismenge zurückliefert, die bereit durch andere Codesegmente bestimmt und zurückgeliefert werden sollte.


Weil es möglich ist die Ergebnismenge zu ergänzen. Jedes CASE, jedes IF, jeder Subquery der eine Menge zurückliefert erweitert die eigentliche Menge um n Spalten.


----------



## DennisXX (2. Aug 2011)

Evil-Devil hat gesagt.:


> Weil es möglich ist die Ergebnismenge zu ergänzen. Jedes CASE, jedes IF, jeder Subquery der eine Menge zurückliefert erweitert die eigentliche Menge um n Spalten.



Perfekt, vielen Dank und genau darauf wollte ich hinaus !

@maki
Bitte ein Beispiel an dieser seriösen und prägnanten Ausdrucksweise nehmen und bei der nächsten Forendiskussion entsprechend antizipieren ok?

Greetz
Dennis


----------



## maki (2. Aug 2011)

DennisXX hat gesagt.:


> @maki
> Bitte ein Beispiel an dieser seriösen und prägnanten Ausdrucksweise nehmen und bei der nächsten Forendiskussion entsprechend antizipieren ok?


DenisXX, du solltest dir deine persönlichen Anfeindungen jetzt sparen, genauso wie deine geheuchelten "Danke", sonst gibt es wirklich Ärger und du wirst hier nicht mehr partizipieren, alles klar?


----------



## DennisXX (2. Aug 2011)

@maki

Stimmt ich habe auch gerade gesehen, dass Du ein Moderator hier im Forum bist. Dann bin ich ab jetzt mal lieber devot...


----------

