SELECT * bei Auslesen aus einer Datenbank
Gustav Gans
- datenbank
Hi!
Ich bilde mir ein, schon öfetrs gelesen zu haben, daß bei der Zusammenstellung eines Querys für das Auslesen von Datensätzen aus einer Datenbank ein
$query = "SELECT * WHERE ... FROM ...
_nicht_ gut ist und man besser direkt die Tabellenteile angibt, die man ausgegeben haben möchte. Also zB
$query = "SELECT vorname, familienneme, wohnort WHERE ... FROM ...
Wieso ist das so? Gibt es dazu gute Seiten im Internet, wo das verständlich erklärt wird?
Und was ist, wenn die Datensätze zB nur aus der ID, Vornamen, Familiennamen und Wohnort besteht? Wenn ich also (abgesehen von der ID) soweiso _alles_ ausgeben will. Soll ich dann auch nicht mit SELECT * arbeiten und wieso nicht?
Danke im Voraus
Gustav Gans
Hi Gustav!
Ich klatsch dir einfach mal einen Link vor die Haube:
http://forum.de.selfhtml.org/archiv/2008/2/t167441/#m1092110
Der gesamte Thread könnte für dich interessant sein. =)
MfG H☼psel
Hallo!
Ich klatsch dir einfach mal einen Link vor die Haube:
http://forum.de.selfhtml.org/archiv/2008/2/t167441/#m1092110Der gesamte Thread könnte für dich interessant sein. =)
Danke für den Link! Bin schon am Lesen! :-)
Gustav Gans
$query = "SELECT * WHERE ... FROM ...
_nicht_ gut ist und man besser direkt die Tabellenteile angibt, die man ausgegeben haben möchte. Also zB
$query = "SELECT vorname, familienneme, wohnort WHERE ... FROM ...
Wieso ist das so? Gibt es dazu gute Seiten im Internet, wo das verständlich erklärt wird?
Da liegst du richtig.
Da gibt es viele Seiten dazu. Die passende Suche wäre unter anderem die Performance der MySQL Funktionen unter PHP.
Mit einem STERNCHEN (SELECT * FROM ...) werden ALLE Spalten in einer Tabelle abgerufen. Meist ist es jedoch so dass man nur bestimmte Spalten einer Tabelle benötigt. Dabei ist es natürlich sinnvoller und schneller diese exakt (SELECT id, name FROM ...) abzufragen.
Sicherlich merkst du keine direkte Geschwindigkeitsverbesserung, aber es kommt doch immer darauf an wieviele Benutzer aktiv sind und das Skript aufrufen. Je mehr das sind, umso mehr natürlich auch der Traffic der durch geht und umso mehr wird die Datenbank belastet (vor allem bei riesigen Datenmengen und einer "STERNCHEN-Abfrage").
Ich hoffe ich konnte etwas Licht ins Dunkle schalten.
Hi,
Meist ist es jedoch so dass man nur bestimmte Spalten einer Tabelle benötigt.
wobei "meist" zu lesen ist als "immer, bis auf eine einzige Ausnahme", die da lautet: Wenn man einfach jede verdammte Spalte haben möchte, *egal welche es gibt*, dann kann(!) "SELECT *" sinnvoll sein. Ein Anwendungsfall ist beispielsweise etwas wie PhpMyAdmin. Selbst dort wird jedoch AFAIK eine komplette Spaltenliste angegeben.
Sicherlich merkst du keine direkte Geschwindigkeitsverbesserung,
Doch. Wenn es eine benötigte Spalte nicht mehr gibt, wird viel schneller ein Fehler gemeldet.
Cheatah
Hi Cheatah!
<matrix>
War es die selbe Katze?
</matrix>
MfG H☼psel
Hallo,
wobei "meist" zu lesen ist als "immer, bis auf eine einzige Ausnahme", die da lautet: Wenn man einfach jede verdammte Spalte haben möchte, *egal welche es gibt*, dann kann(!) "SELECT *" sinnvoll sein.
Also bei Datensätzen, die aus ID, Vorname, Familienname, Hobby, Auto, Weltanschauung und Wohnort bestehen und ich alles bis auf die ID ausgeben will, ist
SELECT vorname, familienname, hobby, auto,weltanschauung, wohnort FROM ...
besser als
SELECT * FROM ... und dann eine Ausgabe ohne der IDs?
Gustav Gans
Moin!
Hallo,
wobei "meist" zu lesen ist als "immer, bis auf eine einzige Ausnahme", die da lautet: Wenn man einfach jede verdammte Spalte haben möchte, *egal welche es gibt*, dann kann(!) "SELECT *" sinnvoll sein.
Also bei Datensätzen, die aus ID, Vorname, Familienname, Hobby, Auto, Weltanschauung und Wohnort bestehen und ich alles bis auf die ID ausgeben will, ist
SELECT vorname, familienname, hobby, auto,weltanschauung, wohnort FROM ...
besser als
SELECT * FROM ... und dann eine Ausgabe ohne der IDs?
Eindeutig. Einer der Gründe:
Wenn sich später mal die Tabelle um die zwei Felder "Einkommen" und "HD_Biometriebild" erweitert, würde ein SELECT * sowohl die sensitive Information "Einkommen" als auch die Megabytes des Biometriebildes aus der Datenbank abfragen.
Bei den Megabytes des Bildes dürfte es auf den ersten Blick verständlich sein, dass nicht benötigte Daten nicht abgefragt gehören, denn die werden, obwohl du sie hinterher wegwirfst, trotzdem in Datenpuffern zwischengespeichert und verbrauchen RAM.
Das Einkommen als Beispiel soll veranschaulichen, dass diese vertrauliche Information natürlich ebenfalls abgefragt wird, und parallel zu den restlichen Daten z.B. in einem Array landet. Nicht immer wird die Situation aber so sein, dass du die Datenbankabfrage gleich in Ausgabe von HTML wandelst und den Datenrest wirklich vergißt. Üblich dürfte eher sein, dass das Abfrageergebnis an andere Programmteile weitergereicht wird. Und wenn du diesen Programmteilen evtl. nicht vertrauen kannst, oder sie vielleicht dynamisch steuerbar sind hinsichtlich der Anzeige der gelieferten Spalten, so würde die Information "Einkommen" vielleicht wo angezeigt, wo sie nie hätte auftauchen sollen. Sowas vermeidet man dadurch, dass man immer nur genau die Daten abfragt, die man konkret wissen möchte.
Du sparst dir damit übrigens auch kaum Tipparbeit. So ein SQL-Statement schreibt man (als Geübter) im Prinzip genau einmal hin, wenn man das entsprechende Abfragemodul schreibt, und ändert es danach nur, wenn sich tatsächlich die abzufragenden Daten verändern. Es wird aber im Laufe der Softwareentwicklung viel häufiger vorkommen, dass man nochmal nachschaut, welche Spalten denn genau abgefragt werden - und da ist eine explizite Liste, die genau aufführt, was an Daten kommt, viel besser als ein nichtssagendes "*", bei dem man dann wieder die Datenbank kontaktieren muß, um nachzugucken, welche Spalten denn mittlerweile alle existieren.
Auf die Nützlichkeit, dass die DB mit einer Fehlermeldung reagiert, wenn irgendwer dir eine erwartete Spalte ohne Hinweis gelöscht oder umbenannt hat, wurde bereits hingewiesen.
- Sven Rautenberg
Danke, habe verstanden!
Und danke nochmals an ALLE Antworter!