<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mussswiki.idb.edu/iv1wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ReinhardJoechtl</id>
	<title>IV1 - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://mussswiki.idb.edu/iv1wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ReinhardJoechtl"/>
	<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1/Spezial:Beitr%C3%A4ge/ReinhardJoechtl"/>
	<updated>2026-06-03T01:29:40Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=398</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=398"/>
		<updated>2009-03-03T20:51:19Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Die SELECT Anweisung==&lt;br /&gt;
&lt;br /&gt;
Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Vornamen aus der Tabelle &#039;&#039;Kunde&#039;&#039; kann noch über einen sehr einfachen Befehl erstellt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden. Folgend werden nur die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; ausgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
Die folgende Anweisung gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Anführungszeichen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden. Die Abfrage unterhalb gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt. Folglich gibt die nächste Abfrage die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll (im Beispiel zuerst nach dem Nachnamen und danach nach dem Vornamen). Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;GROUP BY&#039;&#039;&#039;-Klausel bewirkt, dass die aus einer Abfrage resultierende Tabelle in &#039;&#039;&#039;Gruppen&#039;&#039;&#039; gegliedert wird. Dazu muss in der GROUP BY-Klausel angegeben werden, nach welchem Kriterium die Gruppierung erfolgen soll. Dieses Kriterium, der &#039;&#039;&#039;Gruppierungsschlüssel&#039;&#039;&#039;, ist im einfachsten Fall ein Attribut der Ausgangstabelle. Alle Zeilen mit demselben Wert des Gruppierungsschlüssels fallen in dieselbe Gruppe. Eine Gruppe ist also nichts anderes als eine Teiltabelle. Im Ergebnis wird jede Gruppe durch die Anwendung von Gruppierungsfunktionen auf eine einzelne Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Als typische Gruppenfunktionen gelten:&lt;br /&gt;
* COUNT&lt;br /&gt;
* SUM&lt;br /&gt;
* AVG&lt;br /&gt;
* MAX&lt;br /&gt;
* MIN&lt;br /&gt;
&lt;br /&gt;
Die Gruppenfunktionen werden analog zu gängigen Funktionen in Tabellenkalkulationsprogrammen angewandt und notiert, z.B. SUM(Auftragspos.Menge * Buch.Preis).&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage gibt das gruppierte Feld &#039;&#039;Region&#039;&#039; und die Anzahl der Orte, die &amp;quot;kirche&amp;quot; enthalten, aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus und sortiert diese neue Tabelle absteigend anhand der zweiten Spalte.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Region, COUNT(*)&lt;br /&gt;
FROM PLZ&lt;br /&gt;
WHERE Ort LIKE &#039;%kirche%&#039;&lt;br /&gt;
GROUP BY Region&lt;br /&gt;
ORDER BY 2 DESC&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Region, COUNT(*) FROM PLZ WHERE Ort LIKE &#039;%kirche%&#039; GROUP BY Region ORDER BY 2 DESC&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Gruppenfunktion generierte Spalten können mit &#039;&#039;&#039;AS&#039;&#039;&#039; benannt und dadurch auch für weitere Aktionen (z.B. ORDER BY) innerhalb der selben Abfrage verwendet werden. Die folgende Abfrage stellt bereits eine eher komplexe Abfrage mit einigen Joins dar. Sie gibt die Spalten &#039;&#039;Kunde.Nr&#039;&#039;, &#039;&#039;Kunde.Nachname&#039;&#039;, &#039;&#039;PLZ.Ort&#039;&#039; und den errechneten Umsatz aus den Tabellen &#039;&#039;PLZ&#039;&#039;, &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Auftragspos&#039;&#039; und &#039;&#039;Buch&#039;&#039; aus, gruppiert das Ergebnis nach der Kundennummer und sortiert es am Nachnamen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz&lt;br /&gt;
FROM PLZ, Kunde, Auftrag, Auftragspos, Buch&lt;br /&gt;
WHERE PLZ.Plz=Kunde.Plz&lt;br /&gt;
AND Kunde.Nr=Auftrag.Kundennummer&lt;br /&gt;
AND Auftrag.Nr=Auftragspos.Auftragsnummer&lt;br /&gt;
AND Auftragspos.Buchnummer=Buch.Nr&lt;br /&gt;
GROUP BY Kunde.Nr&lt;br /&gt;
ORDER BY Kunde.Nachname&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz FROM PLZ, Kunde, Auftrag, Auftragspos, Buch WHERE PLZ.Plz=Kunde.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr GROUP BY Kunde.Nr ORDER BY Kunde.Nachname&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2=Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz=PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz=PLZ.Plz)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=397</id>
		<title>SQL-Beispiele</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=397"/>
		<updated>2009-03-03T20:48:46Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient dazu, die erlernte Theorie anhand von praktischen Beispielen anzuwenden bzw. zu vertiefen. Die Beispiele sollen - soweit wie möglich - selbständig gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Klick auf den &amp;quot;Probieren&amp;quot;-Button öffnet sich das Fenster zur Eingabe der interaktiven Abfrage. Kann das Beispiel nicht richtig gelöst werden, dient der &amp;quot;Tipp&amp;quot;-Button als weitere Hilfestellung.&lt;br /&gt;
&lt;br /&gt;
Nach Eingabe des SQL-Befehls wird durch Anklicken des &amp;quot;Lösungs&amp;quot;-Buttons die korrekte Lösung angezeigt!&lt;br /&gt;
&lt;br /&gt;
Viel Spaß und Erfolg!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Ermitteln Sie den Wert des Auftrages Nr. 7, sortiert nach der Buchnummer.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel1.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
2. Geben Sie alle Auftragsnummern mit deren Gesamtumsätzen an, wobei absteigend nach €-Beträgen gereiht werden soll.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel2.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
3. Geben Sie alle Auftragsnummern samt dazugehörigen Vor- und Nachnamen des Kunden und jeweiligen Gesamtumsätzen an und reihen Sie diese Daten absteigend nach den €-Beträgen.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel3.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
4. Finden Sie heraus, wie viele Chemiebücher die einzelnen in der Buchhandelsdatenbank aufscheinenden Verlage anbieten und reihen Sie die beiden Spalten Verlag und Menge absteigend nach der Bücheranzahl.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel4.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
5. Suchen Sie in allen Orten der Buchhandelsdatenbank nach dem Wortteil „kirche“ und geben Sie an, wie oft pro Region ein dementsprechender Ortsname aufscheint. Ordnen Sie die Tabelle zahlenmäßig absteigend.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel5.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
6. Bilden Sie die passende Abfrage, die im Vorfeld zu der unterhalb abgebildeten Tabelle geführt hat.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Nr&lt;br /&gt;
! Auftragsnummer&lt;br /&gt;
! Buchnummer&lt;br /&gt;
! Menge&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 1&lt;br /&gt;
| 2492&lt;br /&gt;
| 243&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| 1&lt;br /&gt;
| 2769&lt;br /&gt;
| 83&lt;br /&gt;
|-&lt;br /&gt;
| 599&lt;br /&gt;
| 1&lt;br /&gt;
| 2152&lt;br /&gt;
| 105&lt;br /&gt;
|-&lt;br /&gt;
| 1608&lt;br /&gt;
| 1&lt;br /&gt;
| 3316&lt;br /&gt;
| 97&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 1&lt;br /&gt;
| 3646&lt;br /&gt;
| 173&lt;br /&gt;
|-&lt;br /&gt;
| 2816&lt;br /&gt;
| 1&lt;br /&gt;
| 329&lt;br /&gt;
| 91&lt;br /&gt;
|-&lt;br /&gt;
| 2905&lt;br /&gt;
| 1&lt;br /&gt;
| 3229&lt;br /&gt;
| 63&lt;br /&gt;
|-&lt;br /&gt;
| 2944&lt;br /&gt;
| 1&lt;br /&gt;
| 843&lt;br /&gt;
| 113&lt;br /&gt;
|-&lt;br /&gt;
| 3215&lt;br /&gt;
| 1&lt;br /&gt;
| 2587&lt;br /&gt;
| 55&lt;br /&gt;
|-&lt;br /&gt;
| 4234&lt;br /&gt;
| 1&lt;br /&gt;
| 3492&lt;br /&gt;
| 39&lt;br /&gt;
|-&lt;br /&gt;
| 4427&lt;br /&gt;
| 1&lt;br /&gt;
| 3912&lt;br /&gt;
| 35&lt;br /&gt;
|-&lt;br /&gt;
| 4620&lt;br /&gt;
| 1&lt;br /&gt;
| 3278&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| 4813&lt;br /&gt;
| 1&lt;br /&gt;
| 3259&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 5198&lt;br /&gt;
| 1&lt;br /&gt;
| 3341&lt;br /&gt;
| 18&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel6.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
7. Listen Sie alle Kunden auf, deren Region mit W beginnt, die also aus Wien sind.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel7.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
8. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden liefert.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel8.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
9. Erstellen Sie eine Abfrage, welche eine Kundenliste mit Datum des zuletzt vergebenen Auftrags liefert.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel9.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
10. Erstellen Sie eine Abfrage der Umsätze eines Jahres nach Jahren gegliedert.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel10.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
11. Erstellen Sie eine Abfrage aller Orte, denen mehr als 3 Postleitzahlen zugeordnet sind.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel11.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
12. Vergleichen Sie die Umsätze der Monate des Jahres 2001.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel12.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
13. Vergleichen Sie die Umsätze der Jahre 2001 - 2003.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel13.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
14. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden der jeweiligen Bundesländer miteinander vergleicht.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel14.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
15. Erstellen Sie eine Abfrage, welche die Umsatzentwicklung des Bundeslandes Wien im Jahr 2001 darstellt.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel15.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=396</id>
		<title>SQL-Beispiele</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=396"/>
		<updated>2009-03-03T20:46:46Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient dazu, die erlernte Theorie anhand von praktischen Beispielen anzuwenden bzw. zu vertiefen. Die Beispiele sollen - soweit wie möglich - selbständig gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Klick auf den &amp;quot;Probieren&amp;quot;-Button öffnet sich das Fenster zur Eingabe der interaktiven Abfrage. Kann das Beispiel nicht richtig gelöst werden, dient der &amp;quot;Tipp&amp;quot;-Button als weitere Hilfestellung.&lt;br /&gt;
&lt;br /&gt;
Nach Eingabe des SQL-Befehls wird durch Anklicken des &amp;quot;Lösungs&amp;quot;-Buttons die korrekte Lösung angezeigt!&lt;br /&gt;
&lt;br /&gt;
Viel Spaß und Erfolg!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Ermitteln Sie den Wert des Auftrages Nr. 7, sortiert nach der Buchnummer.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel1.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
2. Geben Sie alle Auftragsnummern mit deren Gesamtumsätzen an, wobei absteigend nach €-Beträgen gereiht werden soll.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel2.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
3. Geben Sie alle Auftragsnummern samt dazugehörigen Vor- und Nachnamen des Kunden und jeweiligen Gesamtumsätzen an und reihen Sie diese Daten absteigend nach den €-Beträgen.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel3.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
4. Finden Sie heraus, wie viele Chemiebücher die einzelnen in der Buchhandelsdatenbank aufscheinenden Verlage anbieten und reihen Sie die beiden Spalten Verlag und Menge absteigend nach der Bücheranzahl.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel4.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
5. Suchen Sie in allen Orten der Buchhandelsdatenbank nach dem Wortteil „kirche“ und geben Sie an, wie oft pro Region ein dementsprechender Ortsname aufscheint. Ordnen Sie die Tabelle zahlenmäßig absteigend.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel5.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
6. Bilden Sie die passende Abfrage, die im Vorfeld zu der unterhalb abgebildeten Tabelle geführt hat.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Nr&lt;br /&gt;
! Auftragsnummer&lt;br /&gt;
! Buchnummer&lt;br /&gt;
! Menge&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 1&lt;br /&gt;
| 2492&lt;br /&gt;
| 243&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| 1&lt;br /&gt;
| 2769&lt;br /&gt;
| 83&lt;br /&gt;
|-&lt;br /&gt;
| 599&lt;br /&gt;
| 1&lt;br /&gt;
| 2152&lt;br /&gt;
| 105&lt;br /&gt;
|-&lt;br /&gt;
| 1608&lt;br /&gt;
| 1&lt;br /&gt;
| 3316&lt;br /&gt;
| 97&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 1&lt;br /&gt;
| 3646&lt;br /&gt;
| 173&lt;br /&gt;
|-&lt;br /&gt;
| 2816&lt;br /&gt;
| 1&lt;br /&gt;
| 329&lt;br /&gt;
| 91&lt;br /&gt;
|-&lt;br /&gt;
| 2905&lt;br /&gt;
| 1&lt;br /&gt;
| 3229&lt;br /&gt;
| 63&lt;br /&gt;
|-&lt;br /&gt;
| 2944&lt;br /&gt;
| 1&lt;br /&gt;
| 843&lt;br /&gt;
| 113&lt;br /&gt;
|-&lt;br /&gt;
| 3215&lt;br /&gt;
| 1&lt;br /&gt;
| 2587&lt;br /&gt;
| 55&lt;br /&gt;
|-&lt;br /&gt;
| 4234&lt;br /&gt;
| 1&lt;br /&gt;
| 3492&lt;br /&gt;
| 39&lt;br /&gt;
|-&lt;br /&gt;
| 4427&lt;br /&gt;
| 1&lt;br /&gt;
| 3912&lt;br /&gt;
| 35&lt;br /&gt;
|-&lt;br /&gt;
| 4620&lt;br /&gt;
| 1&lt;br /&gt;
| 3278&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| 4813&lt;br /&gt;
| 1&lt;br /&gt;
| 3259&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 5198&lt;br /&gt;
| 1&lt;br /&gt;
| 3341&lt;br /&gt;
| 18&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel6.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
7. Listen Sie alle Kunden auf, deren Region mit W beginnt, die also aus Wien sind.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel7.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
8. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden liefert.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel8.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
9. Erstellen Sie eine Abfrage, welche eine Kundenliste mit Datum des zuletzt vergebenen Auftrags liefert.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel9.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example9&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
10. Erstellen Sie eine Abfrage der Umsätze eines Jahres nach Jahren gegliedert.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel10.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example10&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
11. Erstellen Sie eine Abfrage aller Orte, denen mehr als 3 Postleitzahlen zugeordnet sind.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel11.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example11&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
12. Vergleichen Sie die Umsätze der Monate des Jahres 2001.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel12.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example12&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
13. Vergleichen Sie die Umsätze der Jahre 2001 - 2003.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel13.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example13&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
14. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden der jeweiligen Bundesländer miteinander vergleicht.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel14.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example14&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
15. Erstellen Sie eine Abfrage, welche die Umsatzentwicklung des Bundeslandes Wien im Jahr 2001 darstellt.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel15.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example15&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=395</id>
		<title>SQL-Beispiele</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=395"/>
		<updated>2009-03-03T20:44:26Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient dazu, die erlernte Theorie anhand von praktischen Beispielen anzuwenden bzw. zu vertiefen. Die Beispiele sollen - soweit wie möglich - selbständig gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Klick auf den &amp;quot;Probieren&amp;quot;-Button öffnet sich das Fenster zur Eingabe der interaktiven Abfrage. Kann das Beispiel nicht richtig gelöst werden, dient der &amp;quot;Tipp&amp;quot;-Button als weitere Hilfestellung.&lt;br /&gt;
&lt;br /&gt;
Nach Eingabe des SQL-Befehls wird durch Anklicken des &amp;quot;Lösungs&amp;quot;-Buttons die korrekte Lösung angezeigt!&lt;br /&gt;
&lt;br /&gt;
Viel Spaß und Erfolg!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Ermitteln Sie den Wert des Auftrages Nr. 7, sortiert nach der Buchnummer.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel1.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
2. Geben Sie alle Auftragsnummern mit deren Gesamtumsätzen an, wobei absteigend nach €-Beträgen gereiht werden soll.&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel2.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
3. Geben Sie alle Auftragsnummern samt dazugehörigen Vor- und Nachnamen des Kunden und jeweiligen Gesamtumsätzen an und reihen Sie diese Daten absteigend nach den €-Beträgen.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel3.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example3&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
4. Finden Sie heraus, wie viele Chemiebücher die einzelnen in der Buchhandelsdatenbank aufscheinenden Verlage anbieten und reihen Sie die beiden Spalten Verlag und Menge absteigend nach der Bücheranzahl.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel4.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example4&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
5. Suchen Sie in allen Orten der Buchhandelsdatenbank nach dem Wortteil „kirche“ und geben Sie an, wie oft pro Region ein dementsprechender Ortsname aufscheint. Ordnen Sie die Tabelle zahlenmäßig absteigend.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel5.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example5&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
6. Bilden Sie die passende Abfrage, die im Vorfeld zu der unterhalb abgebildeten Tabelle geführt hat.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Nr&lt;br /&gt;
! Auftragsnummer&lt;br /&gt;
! Buchnummer&lt;br /&gt;
! Menge&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 1&lt;br /&gt;
| 2492&lt;br /&gt;
| 243&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| 1&lt;br /&gt;
| 2769&lt;br /&gt;
| 83&lt;br /&gt;
|-&lt;br /&gt;
| 599&lt;br /&gt;
| 1&lt;br /&gt;
| 2152&lt;br /&gt;
| 105&lt;br /&gt;
|-&lt;br /&gt;
| 1608&lt;br /&gt;
| 1&lt;br /&gt;
| 3316&lt;br /&gt;
| 97&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 1&lt;br /&gt;
| 3646&lt;br /&gt;
| 173&lt;br /&gt;
|-&lt;br /&gt;
| 2816&lt;br /&gt;
| 1&lt;br /&gt;
| 329&lt;br /&gt;
| 91&lt;br /&gt;
|-&lt;br /&gt;
| 2905&lt;br /&gt;
| 1&lt;br /&gt;
| 3229&lt;br /&gt;
| 63&lt;br /&gt;
|-&lt;br /&gt;
| 2944&lt;br /&gt;
| 1&lt;br /&gt;
| 843&lt;br /&gt;
| 113&lt;br /&gt;
|-&lt;br /&gt;
| 3215&lt;br /&gt;
| 1&lt;br /&gt;
| 2587&lt;br /&gt;
| 55&lt;br /&gt;
|-&lt;br /&gt;
| 4234&lt;br /&gt;
| 1&lt;br /&gt;
| 3492&lt;br /&gt;
| 39&lt;br /&gt;
|-&lt;br /&gt;
| 4427&lt;br /&gt;
| 1&lt;br /&gt;
| 3912&lt;br /&gt;
| 35&lt;br /&gt;
|-&lt;br /&gt;
| 4620&lt;br /&gt;
| 1&lt;br /&gt;
| 3278&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| 4813&lt;br /&gt;
| 1&lt;br /&gt;
| 3259&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 5198&lt;br /&gt;
| 1&lt;br /&gt;
| 3341&lt;br /&gt;
| 18&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel6.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example6&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
7. Listen Sie alle Kunden auf, deren Region mit W beginnt, die also aus Wien sind.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel7.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example7&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
8. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden liefert.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel8.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example8&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
9. Erstellen Sie eine Abfrage, welche eine Kundenliste mit Datum des zuletzt vergebenen Auftrags liefert.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel9.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example9&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
10. Erstellen Sie eine Abfrage der Umsätze eines Jahres nach Jahren gegliedert.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel10.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example10&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
11. Erstellen Sie eine Abfrage aller Orte, denen mehr als 3 Postleitzahlen zugeordnet sind.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel11.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example11&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
12. Vergleichen Sie die Umsätze der Monate des Jahres 2001.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel12.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example12&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
13. Vergleichen Sie die Umsätze der Jahre 2001 - 2003.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel13.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example13&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
14. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden der jeweiligen Bundesländer miteinander vergleicht.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel14.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example14&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
15. Erstellen Sie eine Abfrage, welche die Umsatzentwicklung des Bundeslandes Wien im Jahr 2001 darstellt.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel15.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example15&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=394</id>
		<title>Einbinden von SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=394"/>
		<updated>2009-03-03T20:43:11Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Einbinden über HTML-Formulare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie bereits zu Beginn erwähnt macht SQL für sich selbst kaum Sinn. Es wird meist von anderen Programmiersprachen als &amp;quot;Transportmittel&amp;quot; verwendet, um Daten aus Datenbanken zu erhalten und dann weiterzuverarbeiten oder zu manipulieren.&lt;br /&gt;
&lt;br /&gt;
== Einbinden über HTML-Formulare ==&lt;br /&gt;
&lt;br /&gt;
Für die Aufgaben, die an StudentInnen der SOWI-Fakultät gestellt werden, sind für SQL-Abfragen im Regelfall HTML-Formulare vorgesehen. Wie das PHP-Beispiel weiter unten schon zeigt, wären für die Einbindung via PHP grundlegende Kenntnisse dieser Scriptsprache nötig. Dank vorgefertigter PHP-Seiten können erstellte SQL-Abfragen aber auch einfach über HTML-Formulare an diese Seiten übergeben werden. Dazu ist lediglich der Umgang mit einem Formular zu erlernen.&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM Auftrag WHERE Nr=2&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Auftrag WHERE Nr=2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Code sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT * FROM Auftrag WHERE Nr=2&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Auftrag WHERE Nr=2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailierte Beschreibung des Formulars:&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tag &#039;&#039;&amp;lt;form&amp;gt;&#039;&#039; wird ein Formular geöffnet. Dabei muss die Methode und die Datei (action), mit der beim Ausführen weitergearbeitet werden soll, angegeben werden.&lt;br /&gt;
* Im ersten &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag wird in der Option &#039;&#039;value&#039;&#039; der SQL-String (die SQL-Abfrage), der übergeben werden soll, gespeichert. Erst dieser String wird der Datenbank übermittelt.&lt;br /&gt;
* Mit dem zweiten &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag wird ein &amp;quot;Eingabefeld&amp;quot; - hier ein Ausführknopf - erstellt. Die Option, ob es sich um einen Ausführknopf oder ein Eingabefeld handelt, basiert auf der Einstellung, welchen &#039;&#039;type&#039;&#039; man dem &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag übergibt. Bei diesem Beispiel handelt es sich um einen Submit-Button daher &#039;&#039;type=&amp;quot;submit&amp;quot;&#039;&#039;. Mit der Option &#039;&#039;value&#039;&#039; kann man den Button beschriften. Hier im Beispiel wurde dies mit der Aufschrift &amp;quot;Ausführen&amp;quot; gemacht.&lt;br /&gt;
* Mit dem &#039;&#039;&amp;lt;/form&amp;gt;&#039;&#039;-Tag wird das Formular wieder geschlossen.&lt;br /&gt;
&lt;br /&gt;
== Einbinden über PHP ==&lt;br /&gt;
&lt;br /&gt;
SQL-Abfragen lassen sich mit PHP direkt in den Quelltext einer Website einpflegen, so dass der Inhalt dieser Sites dynamisch anhand des Datenbankinhaltes generiert werden kann. Sehr viele moderne Websites setzen auf diese effiziente Vorgehensweise, weshalb zumindest kurz ein Beispiel gezeigt werden soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;de-at&amp;quot; lang=&amp;quot;de-at&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Ausgabe&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Ausgabe von Vorname, Nachname und Plz&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Vorname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Nachname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Plz&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;?php&lt;br /&gt;
      /* Datenbankverbindung wird hergestellt&lt;br /&gt;
      und Datenbank wird ausgewählt */&lt;br /&gt;
      $conn = mysql_connect($servername,$benutzername,$password)&lt;br /&gt;
     or die (&amp;quot;Keine DB Verbindung hergestellt&amp;quot;);&lt;br /&gt;
      mysql_select_db($datenbankname, $conn);&lt;br /&gt;
      &lt;br /&gt;
      $sql = &amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde ORDER BY Plz&amp;quot;;    &lt;br /&gt;
      &lt;br /&gt;
      /* Variable wird mit einem SQL Ergebnis gefüllt */&lt;br /&gt;
      $rs_liste = mysql_query($sql, $conn); &lt;br /&gt;
      &lt;br /&gt;
      $pointer = 0; // Hilfsvariable wird initialisiert&lt;br /&gt;
      &lt;br /&gt;
      /* Ergebnisausgabe nur falls die Anzahl der Datensätze &amp;gt; 0 ist */&lt;br /&gt;
      if (mysql_num_rows($rs_liste) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
        &lt;br /&gt;
        /* In einer Schleife werden die Datensätze Reihe&lt;br /&gt;
        für Reihe ausgegeben */&lt;br /&gt;
        while (mysql_fetch_row($rs_liste)) &lt;br /&gt;
          { &lt;br /&gt;
          $vorname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Vorname&amp;quot;);&lt;br /&gt;
          $nachname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Nachname&amp;quot;);&lt;br /&gt;
          $plz = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Plz&amp;quot;);&lt;br /&gt;
          &lt;br /&gt;
          /* Erzeugung von HTML Tabellenzeilen die&lt;br /&gt;
          mit den Ergebnisdatensätzen gefüllt sind */&lt;br /&gt;
          echo &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;; &lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $vorname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $nachname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $plz . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;;                &lt;br /&gt;
          &lt;br /&gt;
          /* Hilfsvariable wird um 1 erhöht um beim nächsten&lt;br /&gt;
          Durchlauf der Schleife zum nächsten Datensatz des&lt;br /&gt;
          Ergebnisses zu kommen */&lt;br /&gt;
          $pointer++; &lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      else&lt;br /&gt;
        {&lt;br /&gt;
        /* Ausgabe eines Hinweises falls Anzahl&lt;br /&gt;
        der gefundenen Datensätze = 0 ist */&lt;br /&gt;
        echo &amp;quot;Es wurden keine Datensätze gefunden&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
      mysql_free_result($rs_liste); // SQL Abfrage wird geschlossen&lt;br /&gt;
      mysql_close($conn); // Datenbankverbindung wird geschlossen&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=393</id>
		<title>Einbinden von SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=393"/>
		<updated>2009-03-03T20:42:49Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Einbinden über HTML-Formulare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie bereits zu Beginn erwähnt macht SQL für sich selbst kaum Sinn. Es wird meist von anderen Programmiersprachen als &amp;quot;Transportmittel&amp;quot; verwendet, um Daten aus Datenbanken zu erhalten und dann weiterzuverarbeiten oder zu manipulieren.&lt;br /&gt;
&lt;br /&gt;
== Einbinden über HTML-Formulare ==&lt;br /&gt;
&lt;br /&gt;
Für die Aufgaben, die an StudentInnen der SOWI-Fakultät gestellt werden, sind für SQL-Abfragen im Regelfall HTML-Formulare vorgesehen. Wie das PHP-Beispiel weiter unten schon zeigt, wären für die Einbindung via PHP grundlegende Kenntnisse dieser Scriptsprache nötig. Dank vorgefertigter PHP-Seiten können erstellte SQL-Abfragen aber auch einfach über HTML-Formulare an diese Seiten übergeben werden. Dazu ist lediglich der Umgang mit einem Formular zu erlernen.&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM Auftrag WHERE Nr=2&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Auftrag WHERE Nr=2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Code sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT * FROM Auftrag WHERE Nr=2&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Auftrag WHERE Nr=2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailierte Beschreibung des Formulars:&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tag &#039;&#039;&amp;lt;form&amp;gt;&#039;&#039; wird ein Formular geöffnet. Dabei muss die Methode und die Datei (action), mit der beim Ausführen weitergearbeitet werden soll, angegeben werden.&lt;br /&gt;
* Im ersten &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag wird in der Option &#039;&#039;value&#039;&#039; der SQL-String (die SQL-Abfrage), der übergeben werden soll, gespeichert. Erst dieser String wird der Datenbank übermittelt.&lt;br /&gt;
* Mit dem zweiten &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag wird ein &amp;quot;Eingabefeld&amp;quot; - hier ein Ausführknopf - erstellt. Die Option, ob es sich um einen Ausführknopf oder ein Eingabefeld handelt, basiert auf der Einstellung, welchen &#039;&#039;type&#039;&#039; man dem &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag übergibt. Bei diesem Beispiel handelt es sich um einen Submit-Button daher &#039;&#039;type=&amp;quot;submit&amp;quot;&#039;&#039;. Mit der Option &#039;&#039;value&#039;&#039; kann man den Button beschriften. Hier im Beispiel wurde dies mit der Aufschrift &amp;quot;Ausführen&amp;quot; gemacht.&lt;br /&gt;
* Mit dem &#039;&#039;&amp;lt;/form&amp;gt;&#039;&#039;-Tag wird das Formular wieder geschlossen.&lt;br /&gt;
&lt;br /&gt;
== Einbinden über PHP ==&lt;br /&gt;
&lt;br /&gt;
SQL-Abfragen lassen sich mit PHP direkt in den Quelltext einer Website einpflegen, so dass der Inhalt dieser Sites dynamisch anhand des Datenbankinhaltes generiert werden kann. Sehr viele moderne Websites setzen auf diese effiziente Vorgehensweise, weshalb zumindest kurz ein Beispiel gezeigt werden soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;de-at&amp;quot; lang=&amp;quot;de-at&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Ausgabe&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Ausgabe von Vorname, Nachname und Plz&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Vorname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Nachname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Plz&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;?php&lt;br /&gt;
      /* Datenbankverbindung wird hergestellt&lt;br /&gt;
      und Datenbank wird ausgewählt */&lt;br /&gt;
      $conn = mysql_connect($servername,$benutzername,$password)&lt;br /&gt;
     or die (&amp;quot;Keine DB Verbindung hergestellt&amp;quot;);&lt;br /&gt;
      mysql_select_db($datenbankname, $conn);&lt;br /&gt;
      &lt;br /&gt;
      $sql = &amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde ORDER BY Plz&amp;quot;;    &lt;br /&gt;
      &lt;br /&gt;
      /* Variable wird mit einem SQL Ergebnis gefüllt */&lt;br /&gt;
      $rs_liste = mysql_query($sql, $conn); &lt;br /&gt;
      &lt;br /&gt;
      $pointer = 0; // Hilfsvariable wird initialisiert&lt;br /&gt;
      &lt;br /&gt;
      /* Ergebnisausgabe nur falls die Anzahl der Datensätze &amp;gt; 0 ist */&lt;br /&gt;
      if (mysql_num_rows($rs_liste) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
        &lt;br /&gt;
        /* In einer Schleife werden die Datensätze Reihe&lt;br /&gt;
        für Reihe ausgegeben */&lt;br /&gt;
        while (mysql_fetch_row($rs_liste)) &lt;br /&gt;
          { &lt;br /&gt;
          $vorname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Vorname&amp;quot;);&lt;br /&gt;
          $nachname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Nachname&amp;quot;);&lt;br /&gt;
          $plz = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Plz&amp;quot;);&lt;br /&gt;
          &lt;br /&gt;
          /* Erzeugung von HTML Tabellenzeilen die&lt;br /&gt;
          mit den Ergebnisdatensätzen gefüllt sind */&lt;br /&gt;
          echo &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;; &lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $vorname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $nachname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $plz . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;;                &lt;br /&gt;
          &lt;br /&gt;
          /* Hilfsvariable wird um 1 erhöht um beim nächsten&lt;br /&gt;
          Durchlauf der Schleife zum nächsten Datensatz des&lt;br /&gt;
          Ergebnisses zu kommen */&lt;br /&gt;
          $pointer++; &lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      else&lt;br /&gt;
        {&lt;br /&gt;
        /* Ausgabe eines Hinweises falls Anzahl&lt;br /&gt;
        der gefundenen Datensätze = 0 ist */&lt;br /&gt;
        echo &amp;quot;Es wurden keine Datensätze gefunden&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
      mysql_free_result($rs_liste); // SQL Abfrage wird geschlossen&lt;br /&gt;
      mysql_close($conn); // Datenbankverbindung wird geschlossen&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=392</id>
		<title>Einbinden von SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=392"/>
		<updated>2009-03-03T20:41:26Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Einbinden über HTML-Formulare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie bereits zu Beginn erwähnt macht SQL für sich selbst kaum Sinn. Es wird meist von anderen Programmiersprachen als &amp;quot;Transportmittel&amp;quot; verwendet, um Daten aus Datenbanken zu erhalten und dann weiterzuverarbeiten oder zu manipulieren.&lt;br /&gt;
&lt;br /&gt;
== Einbinden über HTML-Formulare ==&lt;br /&gt;
&lt;br /&gt;
Für die Aufgaben, die an StudentInnen der SOWI-Fakultät gestellt werden, sind für SQL-Abfragen im Regelfall HTML-Formulare vorgesehen. Wie das PHP-Beispiel weiter unten schon zeigt, wären für die Einbindung via PHP grundlegende Kenntnisse dieser Scriptsprache nötig. Dank vorgefertigter PHP-Seiten können erstellte SQL-Abfragen aber auch einfach über HTML-Formulare an diese Seiten übergeben werden. Dazu ist lediglich der Umgang mit einem Formular zu erlernen.&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM Auftrag WHERE Nr=2&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Auftrag WHERE Nr=2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Code sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT * FROM Auftrag WHERE Nr=2&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Auftrag WHERE Nr=2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailierte Beschreibung des Formulars:&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tag &#039;&#039;&amp;lt;form&amp;gt;&#039;&#039; wird ein Formular geöffnet. Dabei muss die Methode und die Datei (action), mit der beim Ausführen weitergearbeitet werden soll, angegeben werden.&lt;br /&gt;
* Im ersten &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag wird in der Option &#039;&#039;value&#039;&#039; der SQL-String (die SQL-Abfrage), der übergeben werden soll, gespeichert. Erst dieser String wird der Datenbank übermittelt.&lt;br /&gt;
* Mit dem zweiten &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag wird ein &amp;quot;Eingabefeld&amp;quot; - hier ein Ausführknopf - erstellt. Die Option, ob es sich um einen Ausführknopf oder ein Eingabefeld handelt, basiert auf der Einstellung, welchen &#039;&#039;type&#039;&#039; man dem &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag übergibt. Bei diesem Beispiel handelt es sich um einen Submit-Button daher &#039;&#039;type=&amp;quot;submit&amp;quot;&#039;&#039;. Mit der Option &#039;&#039;value&#039;&#039; kann man den Button beschriften. Hier im Beispiel wurde dies mit der Aufschrift &amp;quot;Ausführen&amp;quot; gemacht.&lt;br /&gt;
* Mit dem &#039;&#039;&amp;lt;/form&amp;gt;&#039;&#039;-Tag wird das Formular wieder geschlossen.&lt;br /&gt;
&lt;br /&gt;
== Einbinden über PHP ==&lt;br /&gt;
&lt;br /&gt;
SQL-Abfragen lassen sich mit PHP direkt in den Quelltext einer Website einpflegen, so dass der Inhalt dieser Sites dynamisch anhand des Datenbankinhaltes generiert werden kann. Sehr viele moderne Websites setzen auf diese effiziente Vorgehensweise, weshalb zumindest kurz ein Beispiel gezeigt werden soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;de-at&amp;quot; lang=&amp;quot;de-at&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Ausgabe&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Ausgabe von Vorname, Nachname und Plz&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Vorname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Nachname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Plz&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;?php&lt;br /&gt;
      /* Datenbankverbindung wird hergestellt&lt;br /&gt;
      und Datenbank wird ausgewählt */&lt;br /&gt;
      $conn = mysql_connect($servername,$benutzername,$password)&lt;br /&gt;
     or die (&amp;quot;Keine DB Verbindung hergestellt&amp;quot;);&lt;br /&gt;
      mysql_select_db($datenbankname, $conn);&lt;br /&gt;
      &lt;br /&gt;
      $sql = &amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde ORDER BY Plz&amp;quot;;    &lt;br /&gt;
      &lt;br /&gt;
      /* Variable wird mit einem SQL Ergebnis gefüllt */&lt;br /&gt;
      $rs_liste = mysql_query($sql, $conn); &lt;br /&gt;
      &lt;br /&gt;
      $pointer = 0; // Hilfsvariable wird initialisiert&lt;br /&gt;
      &lt;br /&gt;
      /* Ergebnisausgabe nur falls die Anzahl der Datensätze &amp;gt; 0 ist */&lt;br /&gt;
      if (mysql_num_rows($rs_liste) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
        &lt;br /&gt;
        /* In einer Schleife werden die Datensätze Reihe&lt;br /&gt;
        für Reihe ausgegeben */&lt;br /&gt;
        while (mysql_fetch_row($rs_liste)) &lt;br /&gt;
          { &lt;br /&gt;
          $vorname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Vorname&amp;quot;);&lt;br /&gt;
          $nachname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Nachname&amp;quot;);&lt;br /&gt;
          $plz = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Plz&amp;quot;);&lt;br /&gt;
          &lt;br /&gt;
          /* Erzeugung von HTML Tabellenzeilen die&lt;br /&gt;
          mit den Ergebnisdatensätzen gefüllt sind */&lt;br /&gt;
          echo &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;; &lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $vorname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $nachname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $plz . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;;                &lt;br /&gt;
          &lt;br /&gt;
          /* Hilfsvariable wird um 1 erhöht um beim nächsten&lt;br /&gt;
          Durchlauf der Schleife zum nächsten Datensatz des&lt;br /&gt;
          Ergebnisses zu kommen */&lt;br /&gt;
          $pointer++; &lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      else&lt;br /&gt;
        {&lt;br /&gt;
        /* Ausgabe eines Hinweises falls Anzahl&lt;br /&gt;
        der gefundenen Datensätze = 0 ist */&lt;br /&gt;
        echo &amp;quot;Es wurden keine Datensätze gefunden&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
      mysql_free_result($rs_liste); // SQL Abfrage wird geschlossen&lt;br /&gt;
      mysql_close($conn); // Datenbankverbindung wird geschlossen&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Normalformen&amp;diff=372</id>
		<title>Normalformen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Normalformen&amp;diff=372"/>
		<updated>2009-03-02T16:15:00Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Dritte Normalform: Vermeidung von transitiven Abhängigkeiten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Der Sinn der Normalisierung==&lt;br /&gt;
&lt;br /&gt;
Bei der Aufgabe, eine Datenbank anzulegen, wird man mit mehreren Fragen konfrontiert.&lt;br /&gt;
* Wie viele Tabellen sind sinnvoll?&lt;br /&gt;
* Was soll darin dargestellt werden?&lt;br /&gt;
* Wie viele Spalten sollen in welcher Tabelle angelegt werden?&lt;br /&gt;
&lt;br /&gt;
Die Antwort auf diese Fragen gibt mitunter die sogenannte &#039;&#039;&#039;Normalisierung&#039;&#039;&#039;. Mit Hilfe der Regeln der Normalisierung wird es möglich, die Datenbank ideal zu strukturieren. Dadurch werden &#039;&#039;&#039;Redundanzen&#039;&#039;&#039; vermieden: Diese erfordern nämlich nicht nur einen größeren Speicherbedarf, sondern führen auch zu einer erhöhten Fehleranfälligkeit, beispielsweise bei Wartungstätigkeiten. Sollen Daten, die an mehr als einem Speicherort vorhanden sind, geändert werden, müssen diese Änderungen an allen Speicherorten auf exakt die gleiche Art und Weise vorgenommen werden. So ist beispielsweise die Änderung einer Studentenadresse wesentlich einfacher, wenn die betreffenden Daten nur in der Tabelle &#039;&#039;Student&#039;&#039; gespeichert sind und nicht auch noch an anderen Orten innerhalb der Datenbank.&lt;br /&gt;
&lt;br /&gt;
== Normalisieren der Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Bei der Überführung der Objektklassen in Tabellen sind diese daraufhin zu prüfen, ob sie Abhängigkeiten der Felder untereinander bzw. Redundanzen aufweisen, die meist zu Disintegritäten führen. Normalisiert wird, indem man schrittweise überprüft, ob die gebildeten Tabellen den Bedingungen der Normalformen entsprechen. Im Verlaufe dieses Normalisierungsprozesses kommt es zu einer Reduzierung der Redundanzen, parallel dazu jedoch auch zu einer Vermehrung der Anzahl der Tabellen. Immer dann, wenn Redundanzen entdeckt werden, führt dies zur Bildung neuer Tabellen, die über die Schlüsselfelder miteinander verbunden werden (siehe [[Beziehungen in Datenbanken]]). Die Anpassung der Tabellen an die Normalformen dient auch der mengentheoretischen Grundlage von SQL. Die Anwendung von drei Normalformen wird aus Gründen des Antwortzeitverhaltens der Datenbank empfohlen. Es gibt zwar insgesamt fünf Normalformen, aber die vierte Normalform, die auch als Boyce Codd-Normalform (BCNF) bezeichnet wird, sowie die fünfte Normalform werden in der Praxis nur selten angewendet.&lt;br /&gt;
&lt;br /&gt;
== Erste Normalform: Entfernen von Wiederholgruppen ==&lt;br /&gt;
&lt;br /&gt;
Jedes Feld darf im Datensatz &#039;&#039;&#039;nur einmal&#039;&#039;&#039; vorkommen. Gibt es mehrere Felder vom &#039;&#039;&#039;gleichen Typ&#039;&#039;&#039;, so müssen diese in einer &#039;&#039;&#039;eigenen Relation&#039;&#039;&#039; gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Die Überführung der Objektklasse &#039;&#039;Auftrag&#039;&#039; in eine Tabelle (Relation) könnte der verbalen Beschreibung des Geschäftsmodells entsprechend „Jeder Auftrag kann mehrere Bücher enthalten, die jeweils in beliebiger Menge geordert werden können“ bzw. in Anlehnung an das ER-Diagramm folgende Struktur aufweisen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Auftrag&#039;&#039; (Nr, Kundennummer, Datum, Positionsnummer, Buchnummer, Menge, Positionsnummer, Buchnummer, Menge, ...)&lt;br /&gt;
&lt;br /&gt;
Da ein Auftrag in der Regel mehrere unterschiedliche Bücher in unterschiedlichen Mengen enthält, kommen die Felder &#039;&#039;Positionsnummer&#039;&#039;, &#039;&#039;Buchnummer&#039;&#039; und &#039;&#039;Menge&#039;&#039; mehrfach vor, was der 1. Normalform widerspricht.&lt;br /&gt;
Die Konsequenz ist demnach die Auslagerung der Wiederholgruppen in eine eigene Tabelle &#039;&#039;Auftragspos&#039;&#039; (abgeleitet von Auftragsposition) und die Verbindung der Tabellen über die Schlüsselfelder.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Datenmodell_3.gif]]&lt;br /&gt;
&lt;br /&gt;
Das Feld &#039;&#039;Nr&#039;&#039; in der Tabelle &#039;&#039;Auftrag&#039;&#039; (&#039;&#039;Auftrag.Nr&#039;&#039;) ist Schlüsselfeld der Tabelle &#039;&#039;Auftrag&#039;&#039; und wird daher mit dem Feld &#039;&#039;Auftragspos.Auftragsnummer&#039;&#039; verbunden. Die Namen der beiden Felder unterscheiden sich zwar, aber der Inhalt ist in beiden Fällen ident. Hier zeigt sich eine unvermeidbare Redundanz in relationalen Datenbanken, weshalb man auch von &#039;&#039;&#039;kontrollierter Redundanz&#039;&#039;&#039; und nicht von redundanzfrei spricht.&lt;br /&gt;
&lt;br /&gt;
Für die Erfüllung der im (detaillierten) Geschäftsmodell beschriebenen Aufgaben (z.B. Rechnungslegung) sind detaillierte Daten über die Bücher (z.B. der Preis) erforderlich. Wie auch aus dem ER-Diagramm ersichtlich ist, gibt es eine Verbindung zwischen der Tabelle &#039;&#039;Auftrag&#039;&#039; und der Tabelle &#039;&#039;Buch&#039;&#039; über die neu gebildete Tabelle &#039;&#039;Auftragspos&#039;&#039;. Die Notwendigkeit zur Neubildung einer Tabelle zwischen &#039;&#039;Auftrag&#039;&#039; und &#039;&#039;Buch&#039;&#039; ist auch aus ihrer m:n-Beziehung ableitbar.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Datenmodell_4.gif]]&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Auftragspos.Nr&#039;&#039; der Tabelle &#039;&#039;Auftragspos&#039;&#039; ist als Primärschlüssel nicht zu gebrauchen, sie dient lediglich der Kennzeichnung der einzelnen Auftragspositionen eines Auftrages, z.B. zum Zwecke der Reihung auf Lieferscheinen oder Rechnungen. Der Primärschlüssel der Tabelle &#039;&#039;Auftragspos&#039;&#039; setzt sich vielmehr aus den Feldern &#039;&#039;Auftragspos.Auftragsnummer&#039;&#039; und &#039;&#039;Auftragspos.Buchnummer&#039;&#039; zusammen. Es handelt sich um einen Kombinationsschlüssel. Auch dieses Auftreten von Kombinationsschlüsseln ist für die normalformengerechte Auflösung von m:n-Beziehungen typisch.&lt;br /&gt;
&lt;br /&gt;
== Zweite Normalform: Entfernen von Attributen, die nur von einigen der identifizierenden Attribute abhängen ==&lt;br /&gt;
&lt;br /&gt;
Zu den Bedingungen der ersten Normalform gilt zusätzlich: In Relationen mit einem Kombinationsschlüssel muß jedes Feld vom gesamten Kombinationsschlüssel abhängen. Felder, die nur von einem Teil des Schlüssels abhängen, werden mit diesem als Schlüssel in einer eigenen Relation gespeichert.&lt;br /&gt;
&lt;br /&gt;
Die Tabelle &#039;&#039;Auftragspos&#039;&#039; besitzt einen Kombinationsschlüssel, wie in der Abbildung zuvor ersichtlich ist. Da aber der Entwurf der vorliegenden Datenbank mit der (korrekten?) Erstellung eines ER-Diagramms begonnen hat, befinden sich in dieser Tabelle keine Felder, die der 2. Normalform widersprechen. Es können jedoch in Frage kommende Erweiterungen der gegenständlichen Tabelle als Erläuterung am Beispiel herangezogen werden.&lt;br /&gt;
&lt;br /&gt;
Geht man z.B. davon aus, dass nicht alle Positionen eines Auftrags sofort geliefert werden können und sind Teillieferungen geplant, so wäre das Datum der Auslieferung (wohlgemerkt der gesamten bestellten Menge, keine Teilmengen) ein Feld, welches die Bedingung der 2. Normalform erfüllte.&lt;br /&gt;
&lt;br /&gt;
Für den Fall, dass Preisnachlässe in Form von Rabatten gewährt werden, könnte ein weiteres Feld mit der Bezeichnung &#039;&#039;Rabatt&#039;&#039; angefügt werden. Diese Art der Gewährung von Rabatten bedeutet, dass der Preisnachlass einmalig und nur für ein bestimmtes Produkt gewährt wird. Ebenso könnte ein Feld &#039;&#039;Rabatt&#039;&#039; der Tabelle &#039;&#039;Buch&#039;&#039;, der Tabelle &#039;&#039;Kunde&#039;&#039; oder der Tabelle &#039;&#039;Auftrag&#039;&#039; angefügt werden, ohne die Normalformen zu verletzen. Die Bedeutung der alternativen Platzierung ist jedoch sehr unterschiedlich. Das Feld &#039;&#039;Rabatt&#039;&#039; in der Tabelle &#039;&#039;Kunde&#039;&#039; bewirkt, dass alle Einkäufe des jeweiligen Kunden mit einem Preisnachlass versehen werden, während das besagte Feld in der Tabelle &#039;&#039;Buch&#039;&#039; Preisnachlässe für alle Kunden nach sich zieht.&lt;br /&gt;
&lt;br /&gt;
Diese Variationsmöglichkeiten zeigen deutlich, dass die formale Korrektheit einer relationalen Datenbank nicht ohne das zu Grunde liegende Geschäftsmodell überprüft werden kann.&lt;br /&gt;
&lt;br /&gt;
== Dritte Normalform: Vermeidung von transitiven Abhängigkeiten ==&lt;br /&gt;
&lt;br /&gt;
Zu den Bedingungen der 2. Normalform gilt zusätzlich: Felder, die nicht Teil des Schlüssels sind, dürfen nicht untereinander abhängig sein; ist dies der Fall, so müssen diese in einer eigenen Relation gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Gemäß dem angestellten ER-Diagramm fehlen dem Datenmodell noch die entsprechenden Tabellen für die Kunden und Verlage. Beide enthalten Felder für die Adresse, nämlich &#039;&#039;Plz&#039;&#039;, &#039;&#039;Ort&#039;&#039; und &#039;&#039;Straße&#039;&#039; (letzteres enthält auch die Hausnummer).&lt;br /&gt;
&lt;br /&gt;
Berücksichtigt man die Zustellbezirke der Post, so kann festgestellt werden, dass jeder Postleitzahl eindeutig ein Zustellbezirk (zur zeitweiligen Verwirrung auch &amp;quot;Ort&amp;quot; genannt) zugeordnet werden kann. Das Feld &#039;&#039;Ort&#039;&#039; hängt demnach vom Feld &#039;&#039;Plz&#039;&#039; ab und muss ausgelagert werden.&lt;br /&gt;
Die ohne Berücksichtigung der 3. Normalform also falsch abgeleitete Tabellen wären:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Verlag&#039;&#039; (Kurzbezeichnung, Name, Kundennummer, Strasse, Plz, Ort)&lt;br /&gt;
* &#039;&#039;Kunde&#039;&#039; (Nr, Vorname, Nachname, Strasse, Plz, Ort)&lt;br /&gt;
&lt;br /&gt;
Sie werden des Feldes &#039;&#039;Ort&#039;&#039; entledigt und es entsteht eine neue Tabelle mit der Bezeichnung &#039;&#039;PLZ&#039;&#039;, die – wie soll es anders sein – über das Schlüsselfeld &#039;&#039;Plz&#039;&#039; mit ihrer ursprünglichen Heimat verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Das endgültige, den Normalformen 1 bis 3 unterworfene Datenmodell zeigt folgende Struktur:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Datenmodell beispieldatenbank.gif]]&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Normalformen&amp;diff=371</id>
		<title>Normalformen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Normalformen&amp;diff=371"/>
		<updated>2009-03-02T16:12:11Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Erste Normalform: Entfernen von Wiederholgruppen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Der Sinn der Normalisierung==&lt;br /&gt;
&lt;br /&gt;
Bei der Aufgabe, eine Datenbank anzulegen, wird man mit mehreren Fragen konfrontiert.&lt;br /&gt;
* Wie viele Tabellen sind sinnvoll?&lt;br /&gt;
* Was soll darin dargestellt werden?&lt;br /&gt;
* Wie viele Spalten sollen in welcher Tabelle angelegt werden?&lt;br /&gt;
&lt;br /&gt;
Die Antwort auf diese Fragen gibt mitunter die sogenannte &#039;&#039;&#039;Normalisierung&#039;&#039;&#039;. Mit Hilfe der Regeln der Normalisierung wird es möglich, die Datenbank ideal zu strukturieren. Dadurch werden &#039;&#039;&#039;Redundanzen&#039;&#039;&#039; vermieden: Diese erfordern nämlich nicht nur einen größeren Speicherbedarf, sondern führen auch zu einer erhöhten Fehleranfälligkeit, beispielsweise bei Wartungstätigkeiten. Sollen Daten, die an mehr als einem Speicherort vorhanden sind, geändert werden, müssen diese Änderungen an allen Speicherorten auf exakt die gleiche Art und Weise vorgenommen werden. So ist beispielsweise die Änderung einer Studentenadresse wesentlich einfacher, wenn die betreffenden Daten nur in der Tabelle &#039;&#039;Student&#039;&#039; gespeichert sind und nicht auch noch an anderen Orten innerhalb der Datenbank.&lt;br /&gt;
&lt;br /&gt;
== Normalisieren der Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Bei der Überführung der Objektklassen in Tabellen sind diese daraufhin zu prüfen, ob sie Abhängigkeiten der Felder untereinander bzw. Redundanzen aufweisen, die meist zu Disintegritäten führen. Normalisiert wird, indem man schrittweise überprüft, ob die gebildeten Tabellen den Bedingungen der Normalformen entsprechen. Im Verlaufe dieses Normalisierungsprozesses kommt es zu einer Reduzierung der Redundanzen, parallel dazu jedoch auch zu einer Vermehrung der Anzahl der Tabellen. Immer dann, wenn Redundanzen entdeckt werden, führt dies zur Bildung neuer Tabellen, die über die Schlüsselfelder miteinander verbunden werden (siehe [[Beziehungen in Datenbanken]]). Die Anpassung der Tabellen an die Normalformen dient auch der mengentheoretischen Grundlage von SQL. Die Anwendung von drei Normalformen wird aus Gründen des Antwortzeitverhaltens der Datenbank empfohlen. Es gibt zwar insgesamt fünf Normalformen, aber die vierte Normalform, die auch als Boyce Codd-Normalform (BCNF) bezeichnet wird, sowie die fünfte Normalform werden in der Praxis nur selten angewendet.&lt;br /&gt;
&lt;br /&gt;
== Erste Normalform: Entfernen von Wiederholgruppen ==&lt;br /&gt;
&lt;br /&gt;
Jedes Feld darf im Datensatz &#039;&#039;&#039;nur einmal&#039;&#039;&#039; vorkommen. Gibt es mehrere Felder vom &#039;&#039;&#039;gleichen Typ&#039;&#039;&#039;, so müssen diese in einer &#039;&#039;&#039;eigenen Relation&#039;&#039;&#039; gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Die Überführung der Objektklasse &#039;&#039;Auftrag&#039;&#039; in eine Tabelle (Relation) könnte der verbalen Beschreibung des Geschäftsmodells entsprechend „Jeder Auftrag kann mehrere Bücher enthalten, die jeweils in beliebiger Menge geordert werden können“ bzw. in Anlehnung an das ER-Diagramm folgende Struktur aufweisen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Auftrag&#039;&#039; (Nr, Kundennummer, Datum, Positionsnummer, Buchnummer, Menge, Positionsnummer, Buchnummer, Menge, ...)&lt;br /&gt;
&lt;br /&gt;
Da ein Auftrag in der Regel mehrere unterschiedliche Bücher in unterschiedlichen Mengen enthält, kommen die Felder &#039;&#039;Positionsnummer&#039;&#039;, &#039;&#039;Buchnummer&#039;&#039; und &#039;&#039;Menge&#039;&#039; mehrfach vor, was der 1. Normalform widerspricht.&lt;br /&gt;
Die Konsequenz ist demnach die Auslagerung der Wiederholgruppen in eine eigene Tabelle &#039;&#039;Auftragspos&#039;&#039; (abgeleitet von Auftragsposition) und die Verbindung der Tabellen über die Schlüsselfelder.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Datenmodell_3.gif]]&lt;br /&gt;
&lt;br /&gt;
Das Feld &#039;&#039;Nr&#039;&#039; in der Tabelle &#039;&#039;Auftrag&#039;&#039; (&#039;&#039;Auftrag.Nr&#039;&#039;) ist Schlüsselfeld der Tabelle &#039;&#039;Auftrag&#039;&#039; und wird daher mit dem Feld &#039;&#039;Auftragspos.Auftragsnummer&#039;&#039; verbunden. Die Namen der beiden Felder unterscheiden sich zwar, aber der Inhalt ist in beiden Fällen ident. Hier zeigt sich eine unvermeidbare Redundanz in relationalen Datenbanken, weshalb man auch von &#039;&#039;&#039;kontrollierter Redundanz&#039;&#039;&#039; und nicht von redundanzfrei spricht.&lt;br /&gt;
&lt;br /&gt;
Für die Erfüllung der im (detaillierten) Geschäftsmodell beschriebenen Aufgaben (z.B. Rechnungslegung) sind detaillierte Daten über die Bücher (z.B. der Preis) erforderlich. Wie auch aus dem ER-Diagramm ersichtlich ist, gibt es eine Verbindung zwischen der Tabelle &#039;&#039;Auftrag&#039;&#039; und der Tabelle &#039;&#039;Buch&#039;&#039; über die neu gebildete Tabelle &#039;&#039;Auftragspos&#039;&#039;. Die Notwendigkeit zur Neubildung einer Tabelle zwischen &#039;&#039;Auftrag&#039;&#039; und &#039;&#039;Buch&#039;&#039; ist auch aus ihrer m:n-Beziehung ableitbar.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Datenmodell_4.gif]]&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Auftragspos.Nr&#039;&#039; der Tabelle &#039;&#039;Auftragspos&#039;&#039; ist als Primärschlüssel nicht zu gebrauchen, sie dient lediglich der Kennzeichnung der einzelnen Auftragspositionen eines Auftrages, z.B. zum Zwecke der Reihung auf Lieferscheinen oder Rechnungen. Der Primärschlüssel der Tabelle &#039;&#039;Auftragspos&#039;&#039; setzt sich vielmehr aus den Feldern &#039;&#039;Auftragspos.Auftragsnummer&#039;&#039; und &#039;&#039;Auftragspos.Buchnummer&#039;&#039; zusammen. Es handelt sich um einen Kombinationsschlüssel. Auch dieses Auftreten von Kombinationsschlüsseln ist für die normalformengerechte Auflösung von m:n-Beziehungen typisch.&lt;br /&gt;
&lt;br /&gt;
== Zweite Normalform: Entfernen von Attributen, die nur von einigen der identifizierenden Attribute abhängen ==&lt;br /&gt;
&lt;br /&gt;
Zu den Bedingungen der ersten Normalform gilt zusätzlich: In Relationen mit einem Kombinationsschlüssel muß jedes Feld vom gesamten Kombinationsschlüssel abhängen. Felder, die nur von einem Teil des Schlüssels abhängen, werden mit diesem als Schlüssel in einer eigenen Relation gespeichert.&lt;br /&gt;
&lt;br /&gt;
Die Tabelle &#039;&#039;Auftragspos&#039;&#039; besitzt einen Kombinationsschlüssel, wie in der Abbildung zuvor ersichtlich ist. Da aber der Entwurf der vorliegenden Datenbank mit der (korrekten?) Erstellung eines ER-Diagramms begonnen hat, befinden sich in dieser Tabelle keine Felder, die der 2. Normalform widersprechen. Es können jedoch in Frage kommende Erweiterungen der gegenständlichen Tabelle als Erläuterung am Beispiel herangezogen werden.&lt;br /&gt;
&lt;br /&gt;
Geht man z.B. davon aus, dass nicht alle Positionen eines Auftrags sofort geliefert werden können und sind Teillieferungen geplant, so wäre das Datum der Auslieferung (wohlgemerkt der gesamten bestellten Menge, keine Teilmengen) ein Feld, welches die Bedingung der 2. Normalform erfüllte.&lt;br /&gt;
&lt;br /&gt;
Für den Fall, dass Preisnachlässe in Form von Rabatten gewährt werden, könnte ein weiteres Feld mit der Bezeichnung &#039;&#039;Rabatt&#039;&#039; angefügt werden. Diese Art der Gewährung von Rabatten bedeutet, dass der Preisnachlass einmalig und nur für ein bestimmtes Produkt gewährt wird. Ebenso könnte ein Feld &#039;&#039;Rabatt&#039;&#039; der Tabelle &#039;&#039;Buch&#039;&#039;, der Tabelle &#039;&#039;Kunde&#039;&#039; oder der Tabelle &#039;&#039;Auftrag&#039;&#039; angefügt werden, ohne die Normalformen zu verletzen. Die Bedeutung der alternativen Platzierung ist jedoch sehr unterschiedlich. Das Feld &#039;&#039;Rabatt&#039;&#039; in der Tabelle &#039;&#039;Kunde&#039;&#039; bewirkt, dass alle Einkäufe des jeweiligen Kunden mit einem Preisnachlass versehen werden, während das besagte Feld in der Tabelle &#039;&#039;Buch&#039;&#039; Preisnachlässe für alle Kunden nach sich zieht.&lt;br /&gt;
&lt;br /&gt;
Diese Variationsmöglichkeiten zeigen deutlich, dass die formale Korrektheit einer relationalen Datenbank nicht ohne das zu Grunde liegende Geschäftsmodell überprüft werden kann.&lt;br /&gt;
&lt;br /&gt;
== Dritte Normalform: Vermeidung von transitiven Abhängigkeiten ==&lt;br /&gt;
&lt;br /&gt;
Zu den Bedingungen der 2. Normalform gilt zusätzlich: Felder, die nicht Teil des Schlüssels sind, dürfen nicht untereinander abhängig sein; ist dies der Fall, so müssen diese in einer eigenen Relation gespeichert werden.&lt;br /&gt;
&lt;br /&gt;
Gemäß dem angestellten ER-Diagramm fehlen dem Datenmodell noch die entsprechenden Tabellen für die Kunden und Verlage. Beide enthalten Felder für die Adresse, nämlich &#039;&#039;Plz&#039;&#039;, &#039;&#039;Ort&#039;&#039; und &#039;&#039;Straße&#039;&#039; (letzteres enthält auch die Hausnummer).&lt;br /&gt;
&lt;br /&gt;
Berücksichtigt man die Zustellbezirke der Post, so kann festgestellt werden, dass jeder Postleitzahl eindeutig ein Zustellbezirk (zur zeitweiligen Verwirrung auch &amp;quot;Ort&amp;quot; genannt) zugeordnet werden kann. Das Feld &#039;&#039;Ort&#039;&#039; hängt demnach vom Feld &#039;&#039;Plz&#039;&#039; ab und muss ausgelagert werden.&lt;br /&gt;
Die ohne Berücksichtigung der 3. Normalform also falsch abgeleitete Tabellen wären:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;Verlag&#039;&#039; (Kurzbezeichnung, Name, Kundennummer, Strasse, Plz, Ort)&lt;br /&gt;
* &#039;&#039;Kunde&#039;&#039; (Nr, Vorname, Nachname, Strasse, Plz, Ort)&lt;br /&gt;
&lt;br /&gt;
Sie werden des Feldes &#039;&#039;Ort&#039;&#039; entledigt und es entsteht eine neue Tabelle mit der Bezeichnung &#039;&#039;PLZ&#039;&#039;, die – wie soll es anders sein – über das Schlüsselfeld &#039;&#039;Plz&#039;&#039; mit ihrer ursprünglichen Heimat verbunden werden.&lt;br /&gt;
&lt;br /&gt;
Das endgültige, den Normalformen 1 bis 3 unterworfene Datenmodell zeigt folgende Struktur:&lt;br /&gt;
&lt;br /&gt;
[GRAFIK]&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Datenmodell_4.gif&amp;diff=370</id>
		<title>Datei:Datenmodell 4.gif</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Datenmodell_4.gif&amp;diff=370"/>
		<updated>2009-03-02T16:11:57Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Datenmodell_3.gif&amp;diff=369</id>
		<title>Datei:Datenmodell 3.gif</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Datenmodell_3.gif&amp;diff=369"/>
		<updated>2009-03-02T16:10:58Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Entity-Relationshop-Modell&amp;diff=368</id>
		<title>Entity-Relationshop-Modell</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Entity-Relationshop-Modell&amp;diff=368"/>
		<updated>2009-03-02T16:07:28Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Soll eine relationale Datenbank aufgebaut werden, so wird zunächst ein konzeptionelles Modell, das die von den Benutzern bzw. Anwendungsprogrammen benötigten Daten beschreibt, erarbeitet. Eine häufig verwendete Datenmodellierungsmethode ist hierbei das &#039;&#039;&#039;Entity-Relationship-Modell&#039;&#039;&#039; (ERM).&lt;br /&gt;
Mittels Entity-Relationship-Diagramm (ER-Diagramm) werden die &#039;&#039;&#039;Objektklassen&#039;&#039;&#039; durch Rechtecke, die &#039;&#039;&#039;Beziehungen&#039;&#039;&#039; zwischen den Objekttypen durch Rauten, die &#039;&#039;&#039;Attribute&#039;&#039;&#039; gegebenenfalls durch Ovale gekennzeichnet. &#039;&#039;&#039;Primärschlüssel&#039;&#039;&#039; werden unterstrichen. In Abhängigkeit davon, wie viele Objekte zueinander in Beziehung stehen, gibt es 1:1-, 1:n- oder m:n-Beziehungen, siehe [[Beziehungen in Datenbanken]]. Beziehungen können dabei ebenfalls Attribute aufweisen.&lt;br /&gt;
&lt;br /&gt;
Die nachfolgende Abbildung zeigt beispielhaft ein ER-Diagramm für einen Lehrbuchhandel. Die jeweiligen betrieblichen Aufgaben prägen entscheidend die Struktur des Diagramms.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ER_Modell_Buchhandel.gif]]&lt;br /&gt;
&lt;br /&gt;
Dem Diagramm liegt ein einfaches Geschäftsmodell eines Lehrbuchhandels zugrunde. Die &#039;&#039;&#039;Kunden&#039;&#039;&#039; erteilen wiederholt &#039;&#039;&#039;Aufträge&#039;&#039;&#039; an den Lehrbuchhandel. Jeder Auftrag kann mehrere &#039;&#039;&#039;Bücher&#039;&#039;&#039; enthalten, die jeweils in beliebiger Menge geordert werden können. Mehrere &#039;&#039;&#039;Verlage&#039;&#039;&#039; verlegen die Bücher, wobei ein Buch mit bestimmter Nummer und Titel nur von einem Verlag stammen kann, ebenso wie ein bestimmter Auftrag genau einem Kunden zugewiesen wird.&lt;br /&gt;
&lt;br /&gt;
Das Entity-Relationship-Modell ist demnach das Ergebnis der verbalen Beschreibung des Geschäftsmodells, aus dem bei etwas ausführlichen Darstellungen, auch die Attribute der Objektklassen ableitbar sind. Das ERM ist das bekannteste und meistverwendete grafische Hilfsmittel für den Datenbankentwurf. Es ermöglicht die konzeptionellen Entwürfe einer Datenbank auf leicht verständliche Art grafisch darzustellen.&lt;br /&gt;
&lt;br /&gt;
== ER-Elemente ==&lt;br /&gt;
&lt;br /&gt;
Zur grafischen Darstellung des ER-Modells gibt es folgende Darstellungselemente:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Er_entitaet.gif]]&lt;br /&gt;
Eine &#039;&#039;&#039;Entitätsmenge&#039;&#039;&#039; wird als &#039;&#039;&#039;Rechteck&#039;&#039;&#039; dargestellt. Im Buchhandlungs-Beispiel gibt es die Entitätsmengen &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Buch&#039;&#039; und &#039;&#039;Verlag&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Als Entität werden unterscheidbare (identifizierbare) Objekte aus der realen Welt bezeichnet. Diese können gegenständlicher (z.B. Personen, Bücher) oder abstrakter (z.B. Aufträge) Natur sein.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Er_attribut.gif]]&lt;br /&gt;
Ein &#039;&#039;&#039;Attribut&#039;&#039;&#039; wird als &#039;&#039;&#039;Ellipse&#039;&#039;&#039; oder &#039;&#039;&#039;Kreis&#039;&#039;&#039; dargestellt. Im Buchhandlungs-Beispiel besitzt etwa die Entität &#039;&#039;Auftrag&#039;&#039; die Attribute (Auftrags-)&#039;&#039;Nr&#039;&#039;, &#039;&#039;Datum&#039;&#039; und &#039;&#039;Kundennummer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Attribute (Eigenschaften) charakterisieren eine Entität oder eine Beziehung wie z.B. die Beziehung zwischen &#039;&#039;Auftrag&#039;&#039; und &#039;&#039;Buch&#039;&#039;, die die Eigenschaft &#039;&#039;Menge&#039;&#039; mitführt. Damit wird ausgesagt, wie viele Exemplare eines Buches in einem Auftrag bestellt werden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Er_schluessel.gif]]&lt;br /&gt;
Ein &#039;&#039;&#039;Schlüssel&#039;&#039;&#039; oder &#039;&#039;&#039;Primärschlüssel&#039;&#039;&#039; wird in &#039;&#039;&#039;roter Schrift&#039;&#039;&#039; dargestellt (siehe &#039;&#039;Nr&#039;&#039; bei &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039; und &#039;&#039;Buch&#039;&#039; und &#039;&#039;Kurzbezeichnung&#039;&#039; bei &#039;&#039;Verlag&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Schlüssel dienen zur Sortierung, zum Suchen und Auffinden in Datenbanken. Besitzt eine Entität keinen geeigneten Schlüssel, können künstliche Schlüssel hinzugefügt werden, etwa als Nummer. Ein Primärschlüssel ermöglicht die eindeutige Identifizierung einer Entität. Er muss eindeutig sein; so dürfen etwa nicht zwei verschiedene Kunden die selbe Kundennummer besitzen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Er_beziehung1zu1.gif]]&lt;br /&gt;
&#039;&#039;&#039;Beziehungen zwischen Entitäten&#039;&#039;&#039; werden als &#039;&#039;&#039;Rauten&#039;&#039;&#039; gezeichnet. In der Raute kann der Name der Beziehung stehen. Dazu empfiehlt es sich, aus der Realität abgeleitete Begriffe zu wählen (der Kunde &#039;&#039;erteilt&#039;&#039; einen Auftrag). Eine Beziehungsmenge ist eine Sammlung von Beziehungen gleicher Art zur Verknüpfung von Entitätsmengen.&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Er_beziehung1zu1.gif&amp;diff=367</id>
		<title>Datei:Er beziehung1zu1.gif</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Er_beziehung1zu1.gif&amp;diff=367"/>
		<updated>2009-03-02T16:07:14Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Er_schluessel.gif&amp;diff=366</id>
		<title>Datei:Er schluessel.gif</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Er_schluessel.gif&amp;diff=366"/>
		<updated>2009-03-02T16:06:39Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Er_attribut.gif&amp;diff=365</id>
		<title>Datei:Er attribut.gif</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Er_attribut.gif&amp;diff=365"/>
		<updated>2009-03-02T16:06:11Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Er_entitaet.gif&amp;diff=364</id>
		<title>Datei:Er entitaet.gif</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:Er_entitaet.gif&amp;diff=364"/>
		<updated>2009-03-02T16:04:54Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:ER_Modell_Buchhandel.gif&amp;diff=363</id>
		<title>Datei:ER Modell Buchhandel.gif</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:ER_Modell_Buchhandel.gif&amp;diff=363"/>
		<updated>2009-03-02T15:59:32Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:ER_Modell_Buchhandel.jpg&amp;diff=362</id>
		<title>Datei:ER Modell Buchhandel.jpg</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Datei:ER_Modell_Buchhandel.jpg&amp;diff=362"/>
		<updated>2009-03-02T15:57:25Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Beziehungen_in_Datenbanken&amp;diff=361</id>
		<title>Beziehungen in Datenbanken</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Beziehungen_in_Datenbanken&amp;diff=361"/>
		<updated>2009-03-02T15:54:55Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* grafische Darstellung von Beziehungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Beziehungen zwischen Tabellen==&lt;br /&gt;
&lt;br /&gt;
Nachdem verschiedene Tabellen zu den einzelnen Themen angelegt wurden (siehe [[Tabellen in Datenbanken]]), muss festgelegt werden, wie diese Informationen wieder zusammengeführt werden können. Der erste Schritt in diesem Prozess besteht darin, Beziehungen zwischen den Tabellen zu definieren. Anschließend können Abfragen, Formulare und Berichte erstellt werden, um die Informationen aus verschiedenen Tabellen gleichzeitig anzuzeigen. &lt;br /&gt;
&lt;br /&gt;
==Funktionsweise von Schlüsseln==&lt;br /&gt;
&lt;br /&gt;
Aus gleichartigen Objekten und deren Attributen werden &#039;&#039;&#039;Objektklassen&#039;&#039;&#039; (Objekttypen, Entityklassen) gebildet. Eine &#039;&#039;&#039;Datei&#039;&#039;&#039; bildet eine Objektklasse ab; sie besteht aus einem oder mehreren Datensätzen. Jenes Feld oder jene Felder, mit denen Objekte einer Objektklasse identifiziert werden können, werden &#039;&#039;&#039;Schlüssel&#039;&#039;&#039; (Schlüsselfeld/er) genannt. Sind Schlüssel aus mehreren Feldern zusammengesetzt, werden sie als &#039;&#039;&#039;Kombinationsschlüssel&#039;&#039;&#039; bezeichnet. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Attribute_und_schluessel.gif]]&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Primärschlüssel&#039;&#039;&#039; vermag genau einen und nur einen Datensatz zu identifizieren. In unserem Beispiel ist dies die, pro Buch vergebene Buchnummer &#039;&#039;Nr&#039;&#039;. Bisweilen werden auch &#039;&#039;&#039;Sekundärschlüssel&#039;&#039;&#039; definiert, die allerdings dadurch charakterisiert sind, dass sie sich nicht zur Identifizierung genau eines Satzes eignen, sondern Datensätze mit gleichen Teil-Eigenschaften in eine Klasse zusammenfassen. Im vorliegenden Beispiel ist das Feld &#039;&#039;Verlag&#039;&#039; ein Sekundärschlüssel, der bei Anwendung alle Bücher eines bestimmten Verlages zu einer Klasse zusammenfasst.&lt;br /&gt;
&lt;br /&gt;
Welche Objektklassen im konkreten Fall zu bilden sind, welche Eigenschaften und deren Datentypen in den Feldern (Spalten)  gewählt werden, hängt ausschließlich von den Erfordernissen der zu gestellten Aufgaben ab.&lt;br /&gt;
&lt;br /&gt;
==Funktionsweise von Beziehungen==&lt;br /&gt;
&lt;br /&gt;
Angenommen es müssen Felder aus fünf Tabellen so koordiniert werden, dass Informationen zu ein und derselben Bestellung angezeigt werden - diese Koordination wird durch Beziehungen zwischen den Tabellen erreicht. Eine Beziehung funktioniert durch übereinstimmende Daten in Schlüsselfeldern; normalerweise ein Feld, das in beiden Tabellen denselben Namen besitzt.&lt;br /&gt;
&lt;br /&gt;
In den meisten Fällen stellen diese übereinstimmenden Felder den Primärschlüssel in der einen Tabelle dar, der einen eindeutigen Bezeichner für jeden Datensatz angibt, und einen Fremdschlüssel in der anderen Tabelle.&lt;br /&gt;
&lt;br /&gt;
Einzelnen Kunden können z.B. Aufträge zugeordnet werden, indem eine Beziehung zwischen den Tabellen &#039;&#039;Kunde&#039;&#039; und &#039;&#039;Auftrag&#039;&#039; über das in beiden Tabellen vorhandene Feld &#039;&#039;Kundennummer&#039;&#039; hergestellt wird. So geht aus dem Beispiel unten hervor, dass Frau Elisabeth Erlach mit der Kundennummer 37 am 21.12.2002 den Auftrag mit der Nr. 1223445 ausgelöst hat.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ Auszug aus der Tabelle &#039;&#039;Kunde&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Kundennummer&lt;br /&gt;
! Vorname&lt;br /&gt;
! Nachname&lt;br /&gt;
! Straße&lt;br /&gt;
! PLZ&lt;br /&gt;
|-&lt;br /&gt;
| 37&lt;br /&gt;
| Elisabeth&lt;br /&gt;
| Erlach&lt;br /&gt;
| Glimpflinger Str. 13&lt;br /&gt;
| 5020&lt;br /&gt;
|-&lt;br /&gt;
| 38&lt;br /&gt;
| Hans&lt;br /&gt;
| Hinterholzer&lt;br /&gt;
| Franziskanerweg 9&lt;br /&gt;
| 1040&lt;br /&gt;
|-&lt;br /&gt;
| 39&lt;br /&gt;
| Hans-Peter&lt;br /&gt;
| Wesp&lt;br /&gt;
| Wüstenrotstraße 23&lt;br /&gt;
| 5201&lt;br /&gt;
|-&lt;br /&gt;
| 40&lt;br /&gt;
| Konrad&lt;br /&gt;
| Gampe&lt;br /&gt;
| Berggasse 25&lt;br /&gt;
| 1010&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ Auszug aus der Tabelle &#039;&#039;Auftrag&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Auftragsdatum&lt;br /&gt;
! Kundennummer&lt;br /&gt;
! Auftragsnummer&lt;br /&gt;
|-&lt;br /&gt;
| 21.12.2002&lt;br /&gt;
| 37&lt;br /&gt;
| 1223445&lt;br /&gt;
|-&lt;br /&gt;
| 29.12.2002&lt;br /&gt;
| 40&lt;br /&gt;
| 23847&lt;br /&gt;
|-&lt;br /&gt;
| 13.01.2003&lt;br /&gt;
| 34&lt;br /&gt;
| 12743&lt;br /&gt;
|-&lt;br /&gt;
| 15.02.2003&lt;br /&gt;
| 20&lt;br /&gt;
| 3612873&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Es gibt drei Grundtypen von Beziehungen mit denen wir arbeiten werden: Die 1:1-, 1:n- und n:m-Beziehung.&lt;br /&gt;
&lt;br /&gt;
==1:1-Beziehung==&lt;br /&gt;
&lt;br /&gt;
In einer 1:1-Beziehung ist &#039;&#039;&#039;jedem Datensatz&#039;&#039;&#039; in Tabelle &#039;&#039;A&#039;&#039; nur &#039;&#039;&#039;ein passender Datensatz&#039;&#039;&#039; in Tabelle &#039;&#039;B&#039;&#039; zugeordnet und umgekehrt. Diese Art von Beziehung ist &#039;&#039;&#039;nicht sehr häufig&#039;&#039;&#039;, weil die meisten Informationen, die auf diese Weise in Beziehung stehen, sich in einer Tabelle befinden. Man kann eine 1:1-Beziehung z.B. verwenden, um eine Tabelle mit vielen Feldern zu teilen, um einen Teil der Tabelle aus Gründen der Zugriffsrechte abzutrennen oder um Informationen zu speichern, die sich nur auf eine Untergruppe der Haupttabelle beziehen.&lt;br /&gt;
&lt;br /&gt;
==1:n-Beziehung==&lt;br /&gt;
&lt;br /&gt;
Eine 1:n-Beziehung ist der &#039;&#039;&#039;häufigste Beziehungstyp&#039;&#039;&#039;. In einer 1:n-Beziehung können &#039;&#039;&#039;einem Datensatz&#039;&#039;&#039; in Tabelle &#039;&#039;A&#039;&#039; &#039;&#039;&#039;mehrere passende Datensätze&#039;&#039;&#039; in Tabelle &#039;&#039;B&#039;&#039; zugeordnet sein, aber einem Datensatz in Tabelle &#039;&#039;B&#039;&#039; ist nie mehr als ein Datensatz in Tabelle &#039;&#039;A&#039;&#039; zugeordnet. Bsp: Ein Kunde kann mehrere Aufträge erteilen, jedoch kann auf einem Auftrag nur ein Kunde stehen.&lt;br /&gt;
&lt;br /&gt;
==m:n-Beziehung==&lt;br /&gt;
&lt;br /&gt;
In einer m:n-Beziehung können &#039;&#039;&#039;jedem Datensatz&#039;&#039;&#039; in Tabelle &#039;&#039;A&#039;&#039; &#039;&#039;&#039;mehrere passende Datensätze&#039;&#039;&#039; in Tabelle &#039;&#039;B&#039;&#039; zugeordnet sein &#039;&#039;&#039;und umgekehrt&#039;&#039;&#039;. Dies ist nur möglich, indem eine dritte Tabelle definiert wird (die als Verbindungstabelle bezeichnet wird), deren Primärschlüssel aus zwei Feldern besteht: den Fremdschlüsseln aus den Tabellen &#039;&#039;A&#039;&#039; und &#039;&#039;B&#039;&#039;. Eine m:n-Beziehung besteht eigentlich aus zwei 1:n-Beziehungen mit einer dritten Tabelle, deren Primärschlüssel aus zwei Feldern besteht, und zwar den Fremdschlüsseln aus den beiden anderen Tabellen. Bsp: Ein Auftrag kann über mehrere Bücher gehen, jedes Buch kann auch in verschiedenen Aufträgen stehen.&lt;br /&gt;
&lt;br /&gt;
==Grafische Darstellung von Beziehungen==&lt;br /&gt;
&lt;br /&gt;
Den vorliegenden Ausführungen liegt eine Beispieldatenbank zugrunde, die einerseits als Modell für Beispiele zu den behandelten Themen dient, andererseits als interaktive Trainingsdatenbank dort eingesetzt wird, wo SQL-Anweisungen nicht nur erklärt, sondern auch zur praktischen Übung angeboten werden.&lt;br /&gt;
&lt;br /&gt;
Zur Darstellung von Tabellen in einer relationalen Datenbank und deren Beziehungen untereinander gibt es zahlreiche praktizierte Formen. Manche wurden im Laufe der Zeit standardisiert, manche frei erfunden. Bei der nachfolgenden Darstellung handelt es sich um eine frei erfundene, vereinfachte Form, die zum Ziel hat, Beziehungen zwischen Tabellen in allgemein verständlicher Form zu visualisieren. Die Namen der Tabellen sind durch Fettschrift hervorgehoben, die Attribute (Felder) der Tabellen sind eingerückt unter der Bezeichnung der Tabelle angeführt. Primärschlüsselfelder sind unterstrichen. Die einfache Pfeilspitze an den Kanten zwischen den Tabellen deuten auf die &amp;quot;1&amp;quot; von &amp;quot;1:n&amp;quot; Beziehungen hin, die doppelten Pfeilspitzen auf das &amp;quot;n&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Das Zustandekommen der dargestellten Tabellen und ihrer Beziehungen ist Gegenstand des Datenbank-Entwurfsprozesses, der an dieser Stelle nicht zum Gegenstand gemacht wird. Wie diesem Beispiel zu entnehmen ist, werden Tabellen, nach erfolgtem Entwurfsprozess, in der Regel mit 1:n Beziehungen verbunden.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Datenmodell_beispieldatenbank.gif]]&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=360</id>
		<title>SQL-Beispiele</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=360"/>
		<updated>2009-03-02T15:49:45Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient dazu, die erlernte Theorie anhand von praktischen Beispielen anzuwenden bzw. zu vertiefen. Die Beispiele sollen - soweit wie möglich - selbständig gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Klick auf den &amp;quot;Probieren&amp;quot;-Button öffnet sich das Fenster zur Eingabe der interaktiven Abfrage. Kann das Beispiel nicht richtig gelöst werden, dient der &amp;quot;Tipp&amp;quot;-Button als weitere Hilfestellung.&lt;br /&gt;
&lt;br /&gt;
Nach Eingabe des SQL-Befehls wird durch Anklicken des &amp;quot;Lösungs&amp;quot;-Buttons die korrekte Lösung angezeigt!&lt;br /&gt;
&lt;br /&gt;
Viel Spaß und Erfolg!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Ermitteln Sie den Wert des Auftrages Nr. 7, sortiert nach der Buchnummer.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel1.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example1&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
2. Geben Sie alle Auftragsnummern mit deren Gesamtumsätzen an, wobei absteigend nach €-Beträgen gereiht werden soll.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel2.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example2&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
3. Geben Sie alle Auftragsnummern samt dazugehörigen Vor- und Nachnamen des Kunden und jeweiligen Gesamtumsätzen an und reihen Sie diese Daten absteigend nach den €-Beträgen.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel3.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example3&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
4. Finden Sie heraus, wie viele Chemiebücher die einzelnen in der Buchhandelsdatenbank aufscheinenden Verlage anbieten und reihen Sie die beiden Spalten Verlag und Menge absteigend nach der Bücheranzahl.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel4.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example4&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
5. Suchen Sie in allen Orten der Buchhandelsdatenbank nach dem Wortteil „kirche“ und geben Sie an, wie oft pro Region ein dementsprechender Ortsname aufscheint. Ordnen Sie die Tabelle zahlenmäßig absteigend.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel5.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example5&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
6. Bilden Sie die passende Abfrage, die im Vorfeld zu der unterhalb abgebildeten Tabelle geführt hat.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Nr&lt;br /&gt;
! Auftragsnummer&lt;br /&gt;
! Buchnummer&lt;br /&gt;
! Menge&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 1&lt;br /&gt;
| 2492&lt;br /&gt;
| 243&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| 1&lt;br /&gt;
| 2769&lt;br /&gt;
| 83&lt;br /&gt;
|-&lt;br /&gt;
| 599&lt;br /&gt;
| 1&lt;br /&gt;
| 2152&lt;br /&gt;
| 105&lt;br /&gt;
|-&lt;br /&gt;
| 1608&lt;br /&gt;
| 1&lt;br /&gt;
| 3316&lt;br /&gt;
| 97&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 1&lt;br /&gt;
| 3646&lt;br /&gt;
| 173&lt;br /&gt;
|-&lt;br /&gt;
| 2816&lt;br /&gt;
| 1&lt;br /&gt;
| 329&lt;br /&gt;
| 91&lt;br /&gt;
|-&lt;br /&gt;
| 2905&lt;br /&gt;
| 1&lt;br /&gt;
| 3229&lt;br /&gt;
| 63&lt;br /&gt;
|-&lt;br /&gt;
| 2944&lt;br /&gt;
| 1&lt;br /&gt;
| 843&lt;br /&gt;
| 113&lt;br /&gt;
|-&lt;br /&gt;
| 3215&lt;br /&gt;
| 1&lt;br /&gt;
| 2587&lt;br /&gt;
| 55&lt;br /&gt;
|-&lt;br /&gt;
| 4234&lt;br /&gt;
| 1&lt;br /&gt;
| 3492&lt;br /&gt;
| 39&lt;br /&gt;
|-&lt;br /&gt;
| 4427&lt;br /&gt;
| 1&lt;br /&gt;
| 3912&lt;br /&gt;
| 35&lt;br /&gt;
|-&lt;br /&gt;
| 4620&lt;br /&gt;
| 1&lt;br /&gt;
| 3278&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| 4813&lt;br /&gt;
| 1&lt;br /&gt;
| 3259&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 5198&lt;br /&gt;
| 1&lt;br /&gt;
| 3341&lt;br /&gt;
| 18&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel6.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example6&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
7. Listen Sie alle Kunden auf, deren Region mit W beginnt, die also aus Wien sind.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel7.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example7&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
8. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden liefert.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel8.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example8&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
9. Erstellen Sie eine Abfrage, welche eine Kundenliste mit Datum des zuletzt vergebenen Auftrags liefert.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel9.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example9&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
10. Erstellen Sie eine Abfrage der Umsätze eines Jahres nach Jahren gegliedert.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel10.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example10&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
11. Erstellen Sie eine Abfrage aller Orte, denen mehr als 3 Postleitzahlen zugeordnet sind.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel11.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example11&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
12. Vergleichen Sie die Umsätze der Monate des Jahres 2001.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel12.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example12&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
13. Vergleichen Sie die Umsätze der Jahre 2001 - 2003.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel13.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example13&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
14. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden der jeweiligen Bundesländer miteinander vergleicht.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel14.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example14&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
15. Erstellen Sie eine Abfrage, welche die Umsatzentwicklung des Bundeslandes Wien im Jahr 2001 darstellt.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel15.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example15&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=359</id>
		<title>SQL-Beispiele</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=359"/>
		<updated>2009-03-02T15:49:18Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient dazu, die erlernte Theorie anhand von praktischen Beispielen anzuwenden bzw. zu vertiefen. Die Beispiele sollen - soweit wie möglich - selbständig gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Klick auf den &amp;quot;Probieren&amp;quot;-Button öffnet sich das Fenster zur Eingabe der interaktiven Abfrage. Kann das Beispiel nicht richtig gelöst werden, dient der &amp;quot;Tipp&amp;quot;-Button als weitere Hilfestellung.&lt;br /&gt;
&lt;br /&gt;
Nach Eingabe des SQL-Befehls wird durch Anklicken des &amp;quot;Lösungs&amp;quot;-Buttons die korrekte Lösung angezeigt!&lt;br /&gt;
&lt;br /&gt;
Viel Spass und Erfolg!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Ermitteln Sie den Wert des Auftrages Nr. 7, sortiert nach der Buchnummer.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel1.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example1&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
2. Geben Sie alle Auftragsnummern mit deren Gesamtumsätzen an, wobei absteigend nach €-Beträgen gereiht werden soll.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel2.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example2&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
3. Geben Sie alle Auftragsnummern samt dazugehörigen Vor- und Nachnamen des Kunden und jeweiligen Gesamtumsätzen an und reihen Sie diese Daten absteigend nach den €-Beträgen.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel3.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example3&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
4. Finden Sie heraus, wie viele Chemiebücher die einzelnen in der Buchhandelsdatenbank aufscheinenden Verlage anbieten und reihen Sie die beiden Spalten Verlag und Menge absteigend nach der Bücheranzahl.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel4.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example4&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
5. Suchen Sie in allen Orten der Buchhandelsdatenbank nach dem Wortteil „kirche“ und geben Sie an, wie oft pro Region ein dementsprechender Ortsname aufscheint. Ordnen Sie die Tabelle zahlenmäßig absteigend.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel5.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example5&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
6. Bilden Sie die passende Abfrage, die im Vorfeld zu der unterhalb abgebildeten Tabelle geführt hat.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Nr&lt;br /&gt;
! Auftragsnummer&lt;br /&gt;
! Buchnummer&lt;br /&gt;
! Menge&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 1&lt;br /&gt;
| 2492&lt;br /&gt;
| 243&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| 1&lt;br /&gt;
| 2769&lt;br /&gt;
| 83&lt;br /&gt;
|-&lt;br /&gt;
| 599&lt;br /&gt;
| 1&lt;br /&gt;
| 2152&lt;br /&gt;
| 105&lt;br /&gt;
|-&lt;br /&gt;
| 1608&lt;br /&gt;
| 1&lt;br /&gt;
| 3316&lt;br /&gt;
| 97&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 1&lt;br /&gt;
| 3646&lt;br /&gt;
| 173&lt;br /&gt;
|-&lt;br /&gt;
| 2816&lt;br /&gt;
| 1&lt;br /&gt;
| 329&lt;br /&gt;
| 91&lt;br /&gt;
|-&lt;br /&gt;
| 2905&lt;br /&gt;
| 1&lt;br /&gt;
| 3229&lt;br /&gt;
| 63&lt;br /&gt;
|-&lt;br /&gt;
| 2944&lt;br /&gt;
| 1&lt;br /&gt;
| 843&lt;br /&gt;
| 113&lt;br /&gt;
|-&lt;br /&gt;
| 3215&lt;br /&gt;
| 1&lt;br /&gt;
| 2587&lt;br /&gt;
| 55&lt;br /&gt;
|-&lt;br /&gt;
| 4234&lt;br /&gt;
| 1&lt;br /&gt;
| 3492&lt;br /&gt;
| 39&lt;br /&gt;
|-&lt;br /&gt;
| 4427&lt;br /&gt;
| 1&lt;br /&gt;
| 3912&lt;br /&gt;
| 35&lt;br /&gt;
|-&lt;br /&gt;
| 4620&lt;br /&gt;
| 1&lt;br /&gt;
| 3278&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| 4813&lt;br /&gt;
| 1&lt;br /&gt;
| 3259&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 5198&lt;br /&gt;
| 1&lt;br /&gt;
| 3341&lt;br /&gt;
| 18&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel6.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example6&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
7. Listen Sie alle Kunden auf, deren Region mit W beginnt, die also aus Wien sind.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel7.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example7&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
8. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden liefert.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel8.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example8&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
9. Erstellen Sie eine Abfrage, welche eine Kundenliste mit Datum des zuletzt vergebenen Auftrags liefert.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel9.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example9&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
10. Erstellen Sie eine Abfrage der Umsätze eines Jahres nach Jahren gegliedert.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel10.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example10&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
11. Erstellen Sie eine Abfrage aller Orte, denen mehr als 3 Postleitzahlen zugeordnet sind.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel11.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example11&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
12. Vergleichen Sie die Umsätze der Monate des Jahres 2001.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel12.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example12&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
13. Vergleichen Sie die Umsätze der Jahre 2001 - 2003.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel13.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example13&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
14. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden der jeweiligen Bundesländer miteinander vergleicht.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel14.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example14&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
15. Erstellen Sie eine Abfrage, welche die Umsatzentwicklung des Bundeslandes Wien im Jahr 2001 darstellt.&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/sqltutorial/insertbeispiel15.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;example15&amp;quot; value=&amp;quot;Probieren&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=358</id>
		<title>SQL-Beispiele</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=358"/>
		<updated>2009-03-02T15:39:08Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient dazu, die erlernte Theorie anhand von praktischen Beispielen anzuwenden bzw. zu vertiefen. Die Beispiele sollen - soweit wie möglich - selbständig gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Klick auf den &amp;quot;Probieren&amp;quot;-Button öffnet sich das Fenster zur Eingabe der interaktiven Abfrage. Kann das Beispiel nicht richtig gelöst werden, dient der &amp;quot;Tipp&amp;quot;-Button als weitere Hilfestellung.&lt;br /&gt;
&lt;br /&gt;
Nach Eingabe des SQL-Befehls wird durch Anklicken des &amp;quot;Lösungs&amp;quot;-Buttons die korrekte Lösung angezeigt!&lt;br /&gt;
&lt;br /&gt;
Viel Spass und Erfolg!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Ermitteln Sie den Wert des Auftrages Nr. 7, sortiert nach der Buchnummer.&lt;br /&gt;
----&lt;br /&gt;
2. Geben Sie alle Auftragsnummern mit deren Gesamtumsätzen an, wobei absteigend nach €-Beträgen gereiht werden soll.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
3. Geben Sie alle Auftragsnummern samt dazugehörigen Vor- und Nachnamen des Kunden und jeweiligen Gesamtumsätzen an und reihen Sie diese Daten absteigend nach den €-Beträgen.&lt;br /&gt;
----&lt;br /&gt;
4. Finden Sie heraus, wie viele Chemiebücher die einzelnen in der Buchhandelsdatenbank aufscheinenden Verlage anbieten und reihen Sie die beiden Spalten Verlag und Menge absteigend nach der Bücheranzahl.&lt;br /&gt;
----&lt;br /&gt;
5. Suchen Sie in allen Orten der Buchhandelsdatenbank nach dem Wortteil „kirche“ und geben Sie an, wie oft pro Region ein dementsprechender Ortsname aufscheint. Ordnen Sie die Tabelle zahlenmäßig absteigend.&lt;br /&gt;
----&lt;br /&gt;
6. Bilden Sie die passende Abfrage, die im Vorfeld zu der unterhalb abgebildeten Tabelle geführt hat.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Nr&lt;br /&gt;
! Auftragsnummer&lt;br /&gt;
! Buchnummer&lt;br /&gt;
! Menge&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 1&lt;br /&gt;
| 2492&lt;br /&gt;
| 243&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| 1&lt;br /&gt;
| 2769&lt;br /&gt;
| 83&lt;br /&gt;
|-&lt;br /&gt;
| 599&lt;br /&gt;
| 1&lt;br /&gt;
| 2152&lt;br /&gt;
| 105&lt;br /&gt;
|-&lt;br /&gt;
| 1608&lt;br /&gt;
| 1&lt;br /&gt;
| 3316&lt;br /&gt;
| 97&lt;br /&gt;
|-&lt;br /&gt;
| 2100&lt;br /&gt;
| 1&lt;br /&gt;
| 3646&lt;br /&gt;
| 173&lt;br /&gt;
|-&lt;br /&gt;
| 2816&lt;br /&gt;
| 1&lt;br /&gt;
| 329&lt;br /&gt;
| 91&lt;br /&gt;
|-&lt;br /&gt;
| 2905&lt;br /&gt;
| 1&lt;br /&gt;
| 3229&lt;br /&gt;
| 63&lt;br /&gt;
|-&lt;br /&gt;
| 2944&lt;br /&gt;
| 1&lt;br /&gt;
| 843&lt;br /&gt;
| 113&lt;br /&gt;
|-&lt;br /&gt;
| 3215&lt;br /&gt;
| 1&lt;br /&gt;
| 2587&lt;br /&gt;
| 55&lt;br /&gt;
|-&lt;br /&gt;
| 4234&lt;br /&gt;
| 1&lt;br /&gt;
| 3492&lt;br /&gt;
| 39&lt;br /&gt;
|-&lt;br /&gt;
| 4427&lt;br /&gt;
| 1&lt;br /&gt;
| 3912&lt;br /&gt;
| 35&lt;br /&gt;
|-&lt;br /&gt;
| 4620&lt;br /&gt;
| 1&lt;br /&gt;
| 3278&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| 4813&lt;br /&gt;
| 1&lt;br /&gt;
| 3259&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| 5198&lt;br /&gt;
| 1&lt;br /&gt;
| 3341&lt;br /&gt;
| 18&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
7. Listen Sie alle Kunden auf, deren Region mit W beginnt, die also aus Wien sind.&lt;br /&gt;
----&lt;br /&gt;
8. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden liefert.&lt;br /&gt;
----&lt;br /&gt;
9. Erstellen Sie eine Abfrage, welche eine Kundenliste mit Datum des zuletzt vergebenen Auftrags liefert.&lt;br /&gt;
----&lt;br /&gt;
10. Erstellen Sie eine Abfrage der Umsätze eines Jahres nach Jahren gegliedert.&lt;br /&gt;
----&lt;br /&gt;
11. Erstellen Sie eine Abfrage aller Orte, denen mehr als 3 Postleitzahlen zugeordnet sind.&lt;br /&gt;
----&lt;br /&gt;
12. Vergleichen Sie die Umsätze der Monate des Jahres 2001.&lt;br /&gt;
----&lt;br /&gt;
13. Vergleichen Sie die Umsätze der Jahre 2001 - 2003.&lt;br /&gt;
----&lt;br /&gt;
14. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden der jeweiligen Bundesländer miteinander vergleicht.&lt;br /&gt;
----&lt;br /&gt;
15. Erstellen Sie eine Abfrage, welche die Umsatzentwicklung des Bundeslandes Wien im Jahr 2001 darstellt.&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Tabellen_in_Datenbanken&amp;diff=357</id>
		<title>Tabellen in Datenbanken</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Tabellen_in_Datenbanken&amp;diff=357"/>
		<updated>2009-03-02T15:35:13Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Tabellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Tabellen==&lt;br /&gt;
Eine Tabelle ist eine Sammlung von Daten zu einem bestimmten Thema, wie z.B. Bücher oder Lieferanten. Wenn Sie für jedes Thema eine separate Tabelle verwenden, vermeiden Sie doppelte Daten. Die Datensicherung wird dadurch effizienter und Fehler bei der Eingabe werden reduziert.&lt;br /&gt;
&lt;br /&gt;
In Tabellen sind Daten in &#039;&#039;&#039;Spalten (Feldern)&#039;&#039;&#039; und &#039;&#039;&#039;Zeilen (Datensätzen)&#039;&#039;&#039; organisiert. Jedes &#039;&#039;&#039;Feld&#039;&#039;&#039; in der Tabelle &#039;&#039;Buch&#039;&#039; enthält den &#039;&#039;&#039;selben Informationstyp&#039;&#039;&#039; für jedes Buch, wie z.B. den &#039;&#039;Buchpreis&#039;&#039;. Jeder &#039;&#039;&#039;Datensatz&#039;&#039;&#039; in der Tabelle Buch enthält &#039;&#039;&#039;alle Informationen&#039;&#039;&#039; zu einem Buch, wie z.B. &#039;&#039;Buchnummer&#039;&#039;, &#039;&#039;Verlagskurzbezeichnung&#039;&#039;, &#039;&#039;Preis&#039;&#039;...&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ Auszug aus der Tabelle &#039;&#039;Buch&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Buchnummer&lt;br /&gt;
! Autor&lt;br /&gt;
! Buchtitel&lt;br /&gt;
! Buchpreis&lt;br /&gt;
! Verlagskürzel&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| Hronicek u.a.&lt;br /&gt;
| Elektrotechnik-Fachkunde&lt;br /&gt;
| 30,86&lt;br /&gt;
| oev&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| Arge&lt;br /&gt;
| Metalltechnik-Grundband&lt;br /&gt;
| 27,07&lt;br /&gt;
| oev&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| Arge&lt;br /&gt;
| Fachkunde für Tischler 2&lt;br /&gt;
| 27,07&lt;br /&gt;
| oev&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| Oberleitner&lt;br /&gt;
| Gitarrenschule Band 2&lt;br /&gt;
| 9,00&lt;br /&gt;
| hoe&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Attribute: Die Spalten der Tabelle ==&lt;br /&gt;
&lt;br /&gt;
Hier werden die für die Datenbank entscheidenden Eigenschaften eines Buches des Sortiments festgelegt.&lt;br /&gt;
&lt;br /&gt;
== Domäne: Wertebereich eines Attributs ==&lt;br /&gt;
&lt;br /&gt;
Elemente von Domänen müssen atomar sein, d.h. sie lassen sich nicht weiter in Dateneinheiten zerlegen. Eine Adresse ist nicht atomar, denn sie lässt sich in Ort, Postleitzahl, Straße und Hausnummer zerlegen - eine Zahl hingegen ist atomar.&lt;br /&gt;
Zwei verschiedene Attribute können zur gleichen Domäne gehören.&lt;br /&gt;
&lt;br /&gt;
== Geforderte Eigenschaften einer Tabelle ==&lt;br /&gt;
&lt;br /&gt;
* Eine Tabelle muss eindeutig sein. Das bedeutet, dass zu keinem Zeitpunkt zwei identische Datensätze in der Tabelle existieren dürfen. Sie enthält also nur einen Datensatz.&lt;br /&gt;
* Eine Tabelle muss atomare Attribute und Domänen aufweisen. &lt;br /&gt;
* Die Datensätze sind zu jedem Zeitpunkt als unsortiert anzusehen.&lt;br /&gt;
* Die Attributreihenfolge ist zu keinem Zeitpunkt fest definiert.&lt;br /&gt;
&lt;br /&gt;
== Operationen auf Tabellen ==&lt;br /&gt;
&lt;br /&gt;
* einen (leeren) Datensatz hinzufügen &lt;br /&gt;
* einen Datensatz suchen &lt;br /&gt;
* Datenfelder ändern &lt;br /&gt;
* einen Datensatz löschen&lt;br /&gt;
* Attribute hinzufügen/löschen&lt;br /&gt;
&lt;br /&gt;
Die im Rahmen der vorliegenden Dokumentation eingebetteten Operationen auf eine real existierende Datenbank zu Übungszwecken sind auf die Operation Suchen begrenzt.&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=356</id>
		<title>SQL-Beispiele</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=356"/>
		<updated>2009-03-02T15:35:03Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient dazu, die erlernte Theorie anhand von praktischen Beispielen anzuwenden bzw. zu vertiefen. Die Beispiele sollen - soweit wie möglich - selbständig gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Klick auf den &amp;quot;Probieren&amp;quot;-Button öffnet sich das Fenster zur Eingabe der interaktiven Abfrage. Kann das Beispiel nicht richtig gelöst werden, dient der &amp;quot;Tipp&amp;quot;-Button als weitere Hilfestellung.&lt;br /&gt;
&lt;br /&gt;
Nach Eingabe des SQL-Befehls wird durch Anklicken des &amp;quot;Lösungs&amp;quot;-Buttons die korrekte Lösung angezeigt!&lt;br /&gt;
&lt;br /&gt;
Viel Spass und Erfolg!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Ermitteln Sie den Wert des Auftrages Nr. 7, sortiert nach der Buchnummer.&lt;br /&gt;
----&lt;br /&gt;
2. Geben Sie alle Auftragsnummern mit deren Gesamtumsätzen an, wobei absteigend nach €-Beträgen gereiht werden soll.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
3. Geben Sie alle Auftragsnummern samt dazugehörigen Vor- und Nachnamen des Kunden und jeweiligen Gesamtumsätzen an und reihen Sie diese Daten absteigend nach den €-Beträgen.&lt;br /&gt;
----&lt;br /&gt;
4. Finden Sie heraus, wie viele Chemiebücher die einzelnen in der Buchhandelsdatenbank aufscheinenden Verlage anbieten und reihen Sie die beiden Spalten Verlag und Menge absteigend nach der Bücheranzahl.&lt;br /&gt;
----&lt;br /&gt;
5. Suchen Sie in allen Orten der Buchhandelsdatenbank nach dem Wortteil „kirche“ und geben Sie an, wie oft pro Region ein dementsprechender Ortsname aufscheint. Ordnen Sie die Tabelle zahlenmäßig absteigend.&lt;br /&gt;
----&lt;br /&gt;
6. Bilden Sie die passende Abfrage, die im Vorfeld zu der unterhalb abgebildeten Tabelle geführt hat.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Nr&lt;br /&gt;
! Auftragsnummer&lt;br /&gt;
! Buchnummer&lt;br /&gt;
! Menge&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 1&lt;br /&gt;
| 2492&lt;br /&gt;
| 243&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| 1&lt;br /&gt;
| 2769&lt;br /&gt;
| 83&lt;br /&gt;
|-&lt;br /&gt;
| 599&lt;br /&gt;
| 1&lt;br /&gt;
| 2152&lt;br /&gt;
| 105&lt;br /&gt;
|-&lt;br /&gt;
| 1608&lt;br /&gt;
| 1&lt;br /&gt;
| 3316&lt;br /&gt;
| 97&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
7. Listen Sie alle Kunden auf, deren Region mit W beginnt, die also aus Wien sind.&lt;br /&gt;
----&lt;br /&gt;
8. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden liefert.&lt;br /&gt;
----&lt;br /&gt;
9. Erstellen Sie eine Abfrage, welche eine Kundenliste mit Datum des zuletzt vergebenen Auftrags liefert.&lt;br /&gt;
----&lt;br /&gt;
10. Erstellen Sie eine Abfrage der Umsätze eines Jahres nach Jahren gegliedert.&lt;br /&gt;
----&lt;br /&gt;
11. Erstellen Sie eine Abfrage aller Orte, denen mehr als 3 Postleitzahlen zugeordnet sind.&lt;br /&gt;
----&lt;br /&gt;
12. Vergleichen Sie die Umsätze der Monate des Jahres 2001.&lt;br /&gt;
----&lt;br /&gt;
13. Vergleichen Sie die Umsätze der Jahre 2001 - 2003.&lt;br /&gt;
----&lt;br /&gt;
14. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden der jeweiligen Bundesländer miteinander vergleicht.&lt;br /&gt;
----&lt;br /&gt;
15. Erstellen Sie eine Abfrage, welche die Umsatzentwicklung des Bundeslandes Wien im Jahr 2001 darstellt.&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=355</id>
		<title>SQL-Beispiele</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Beispiele&amp;diff=355"/>
		<updated>2009-03-02T15:34:33Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Seite dient dazu, die erlernte Theorie anhand von praktischen Beispielen anzuwenden bzw. zu vertiefen. Die Beispiele sollen - soweit wie möglich - selbständig gelöst werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Klick auf den &amp;quot;Probieren&amp;quot;-Button öffnet sich das Fenster zur Eingabe der interaktiven Abfrage. Kann das Beispiel nicht richtig gelöst werden, dient der &amp;quot;Tipp&amp;quot;-Button als weitere Hilfestellung.&lt;br /&gt;
&lt;br /&gt;
Nach Eingabe des SQL-Befehls wird durch Anklicken des &amp;quot;Lösungs&amp;quot;-Buttons die korrekte Lösung angezeigt!&lt;br /&gt;
&lt;br /&gt;
Viel Spass und Erfolg!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Ermitteln Sie den Wert des Auftrages Nr. 7, sortiert nach der Buchnummer.&lt;br /&gt;
----&lt;br /&gt;
2. Geben Sie alle Auftragsnummern mit deren Gesamtumsätzen an, wobei absteigend nach €-Beträgen gereiht werden soll.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
3. Geben Sie alle Auftragsnummern samt dazugehörigen Vor- und Nachnamen des Kunden und jeweiligen Gesamtumsätzen an und reihen Sie diese Daten absteigend nach den €-Beträgen.&lt;br /&gt;
----&lt;br /&gt;
4. Finden Sie heraus, wie viele Chemiebücher die einzelnen in der Buchhandelsdatenbank aufscheinenden Verlage anbieten und reihen Sie die beiden Spalten Verlag und Menge absteigend nach der Bücheranzahl.&lt;br /&gt;
----&lt;br /&gt;
5. Suchen Sie in allen Orten der Buchhandelsdatenbank nach dem Wortteil „kirche“ und geben Sie an, wie oft pro Region ein dementsprechender Ortsname aufscheint. Ordnen Sie die Tabelle zahlenmäßig absteigend.&lt;br /&gt;
----&lt;br /&gt;
6. Bilden Sie die passende Abfrage, die im Vorfeld zu der unterhalb abgebildeten Tabelle geführt hat.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Nr&lt;br /&gt;
! Auftragsnummer&lt;br /&gt;
! Buchnummer&lt;br /&gt;
! Menge&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 1&lt;br /&gt;
| 2492&lt;br /&gt;
| 243&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| 1&lt;br /&gt;
| 2769&lt;br /&gt;
| 83&lt;br /&gt;
|-&lt;br /&gt;
| 599&lt;br /&gt;
| 1&lt;br /&gt;
| 2152&lt;br /&gt;
| 105&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| 1608&lt;br /&gt;
| 1&lt;br /&gt;
| 3316&lt;br /&gt;
| 97&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
7. Listen Sie alle Kunden auf, deren Region mit W beginnt, die also aus Wien sind.&lt;br /&gt;
----&lt;br /&gt;
8. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden liefert.&lt;br /&gt;
----&lt;br /&gt;
9. Erstellen Sie eine Abfrage, welche eine Kundenliste mit Datum des zuletzt vergebenen Auftrags liefert.&lt;br /&gt;
----&lt;br /&gt;
10. Erstellen Sie eine Abfrage der Umsätze eines Jahres nach Jahren gegliedert.&lt;br /&gt;
----&lt;br /&gt;
11. Erstellen Sie eine Abfrage aller Orte, denen mehr als 3 Postleitzahlen zugeordnet sind.&lt;br /&gt;
----&lt;br /&gt;
12. Vergleichen Sie die Umsätze der Monate des Jahres 2001.&lt;br /&gt;
----&lt;br /&gt;
13. Vergleichen Sie die Umsätze der Jahre 2001 - 2003.&lt;br /&gt;
----&lt;br /&gt;
14. Erstellen Sie eine Abfrage, welche die Umsätze aller Kunden der jeweiligen Bundesländer miteinander vergleicht.&lt;br /&gt;
----&lt;br /&gt;
15. Erstellen Sie eine Abfrage, welche die Umsatzentwicklung des Bundeslandes Wien im Jahr 2001 darstellt.&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=354</id>
		<title>Einbinden von SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=354"/>
		<updated>2009-03-02T15:06:26Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie bereits zu Beginn erwähnt macht SQL für sich selbst kaum Sinn. Es wird meist von anderen Programmiersprachen als &amp;quot;Transportmittel&amp;quot; verwendet, um Daten aus Datenbanken zu erhalten und dann weiterzuverarbeiten oder zu manipulieren.&lt;br /&gt;
&lt;br /&gt;
== Einbinden über HTML-Formulare ==&lt;br /&gt;
&lt;br /&gt;
Für die Aufgaben, die an StudentInnen der SOWI-Fakultät gestellt werden, sind für SQL-Abfragen im Regelfall HTML-Formulare vorgesehen. Wie das PHP-Beispiel weiter unten schon zeigt, wären für die Einbindung via PHP grundlegende Kenntnisse dieser Scriptsprache nötig. Dank vorgefertigter PHP-Seiten können erstellte SQL-Abfragen aber auch einfach über HTML-Formulare an diese Seiten übergeben werden. Dazu ist lediglich der Umgang mit einem Formular zu erlernen.&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM Auftrag WHERE Nr=2&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Auftrag WHERE Nr=2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;selectbsp1&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der eigentliche Code sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT * FROM Auftrag WHERE Nr=2&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Auftrag WHERE Nr=2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;selectbsp1&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailierte Beschreibung des Formulars:&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tag &#039;&#039;&amp;lt;form&amp;gt;&#039;&#039; wird ein Formular geöffnet. Dabei muss die Methode und die Datei (action), mit der beim Ausführen weitergearbeitet werden soll, angegeben werden.&lt;br /&gt;
* Im ersten &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag wird in der Option &#039;&#039;value&#039;&#039; der SQL-String (die SQL-Abfrage), der übergeben werden soll, gespeichert. Erst dieser String wird der Datenbank übermittelt.&lt;br /&gt;
* Mit dem zweiten &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag wird ein &amp;quot;Eingabefeld&amp;quot; - hier ein Ausführknopf - erstellt. Die Option, ob es sich um einen Ausführknopf oder ein Eingabefeld handelt, basiert auf der Einstellung, welchen &#039;&#039;type&#039;&#039; man dem &#039;&#039;&amp;lt;input&amp;gt;&#039;&#039;-Tag übergibt. Bei diesem Beispiel handelt es sich um einen Submit-Button daher &#039;&#039;type=&amp;quot;submit&amp;quot;&#039;&#039;. Mit der Option &#039;&#039;value&#039;&#039; kann man den Button beschriften. Hier im Beispiel wurde dies mit der Aufschrift &amp;quot;Ausführen&amp;quot; gemacht.&lt;br /&gt;
* Mit dem &#039;&#039;&amp;lt;/form&amp;gt;&#039;&#039;-Tag wird das Formular wieder geschlossen.&lt;br /&gt;
&lt;br /&gt;
== Einbinden über PHP ==&lt;br /&gt;
&lt;br /&gt;
SQL-Abfragen lassen sich mit PHP direkt in den Quelltext einer Website einpflegen, so dass der Inhalt dieser Sites dynamisch anhand des Datenbankinhaltes generiert werden kann. Sehr viele moderne Websites setzen auf diese effiziente Vorgehensweise, weshalb zumindest kurz ein Beispiel gezeigt werden soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;de-at&amp;quot; lang=&amp;quot;de-at&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Ausgabe&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Ausgabe von Vorname, Nachname und Plz&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Vorname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Nachname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Plz&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;?php&lt;br /&gt;
      /* Datenbankverbindung wird hergestellt&lt;br /&gt;
      und Datenbank wird ausgewählt */&lt;br /&gt;
      $conn = mysql_connect($servername,$benutzername,$password)&lt;br /&gt;
     or die (&amp;quot;Keine DB Verbindung hergestellt&amp;quot;);&lt;br /&gt;
      mysql_select_db($datenbankname, $conn);&lt;br /&gt;
      &lt;br /&gt;
      $sql = &amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde ORDER BY Plz&amp;quot;;    &lt;br /&gt;
      &lt;br /&gt;
      /* Variable wird mit einem SQL Ergebnis gefüllt */&lt;br /&gt;
      $rs_liste = mysql_query($sql, $conn); &lt;br /&gt;
      &lt;br /&gt;
      $pointer = 0; // Hilfsvariable wird initialisiert&lt;br /&gt;
      &lt;br /&gt;
      /* Ergebnisausgabe nur falls die Anzahl der Datensätze &amp;gt; 0 ist */&lt;br /&gt;
      if (mysql_num_rows($rs_liste) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
        &lt;br /&gt;
        /* In einer Schleife werden die Datensätze Reihe&lt;br /&gt;
        für Reihe ausgegeben */&lt;br /&gt;
        while (mysql_fetch_row($rs_liste)) &lt;br /&gt;
          { &lt;br /&gt;
          $vorname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Vorname&amp;quot;);&lt;br /&gt;
          $nachname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Nachname&amp;quot;);&lt;br /&gt;
          $plz = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Plz&amp;quot;);&lt;br /&gt;
          &lt;br /&gt;
          /* Erzeugung von HTML Tabellenzeilen die&lt;br /&gt;
          mit den Ergebnisdatensätzen gefüllt sind */&lt;br /&gt;
          echo &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;; &lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $vorname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $nachname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $plz . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;;                &lt;br /&gt;
          &lt;br /&gt;
          /* Hilfsvariable wird um 1 erhöht um beim nächsten&lt;br /&gt;
          Durchlauf der Schleife zum nächsten Datensatz des&lt;br /&gt;
          Ergebnisses zu kommen */&lt;br /&gt;
          $pointer++; &lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      else&lt;br /&gt;
        {&lt;br /&gt;
        /* Ausgabe eines Hinweises falls Anzahl&lt;br /&gt;
        der gefundenen Datensätze = 0 ist */&lt;br /&gt;
        echo &amp;quot;Es wurden keine Datensätze gefunden&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
      mysql_free_result($rs_liste); // SQL Abfrage wird geschlossen&lt;br /&gt;
      mysql_close($conn); // Datenbankverbindung wird geschlossen&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=353</id>
		<title>Einbinden von SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=Einbinden_von_SQL-Abfragen&amp;diff=353"/>
		<updated>2009-03-02T14:07:35Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie bereits zu Beginn erwähnt macht SQL für sich selbst kaum Sinn. Es wird meist von anderen Programmiersprachen als &amp;quot;Transportmittel&amp;quot; verwendet, um Daten aus Datenbanken zu erhalten und dann weiterzuverarbeiten oder zu manipulieren.&lt;br /&gt;
&lt;br /&gt;
== Einbinden über PHP ==&lt;br /&gt;
&lt;br /&gt;
SQL-Abfragen lassen sich mit PHP direkt in den Quelltext einer Website einpflegen, so dass der Inhalt dieser Sites dynamisch anhand des Datenbankinhaltes generiert werden kann. Sehr viele moderne Websites setzen auf diese effiziente Vorgehensweise, weshalb hier kurz ein Beispiel gezeigt werden soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;br /&gt;
       &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;de-at&amp;quot; lang=&amp;quot;de-at&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Ausgabe&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Ausgabe von Vorname, Nachname und Plz&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Vorname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Nachname&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Plz&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;?php&lt;br /&gt;
      /* Datenbankverbindung wird hergestellt&lt;br /&gt;
      und Datenbank wird ausgewählt */&lt;br /&gt;
      $conn = mysql_connect($servername,$benutzername,$password)&lt;br /&gt;
     or die (&amp;quot;Keine DB Verbindung hergestellt&amp;quot;);&lt;br /&gt;
      mysql_select_db($datenbankname, $conn);&lt;br /&gt;
      &lt;br /&gt;
      $sql = &amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde ORDER BY Plz&amp;quot;;    &lt;br /&gt;
      &lt;br /&gt;
      /* Variable wird mit einem SQL Ergebnis gefüllt */&lt;br /&gt;
      $rs_liste = mysql_query($sql, $conn); &lt;br /&gt;
      &lt;br /&gt;
      $pointer = 0; // Hilfsvariable wird initialisiert&lt;br /&gt;
      &lt;br /&gt;
      /* Ergebnisausgabe nur falls die Anzahl der Datensätze &amp;gt; 0 ist */&lt;br /&gt;
      if (mysql_num_rows($rs_liste) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
        &lt;br /&gt;
        /* In einer Schleife werden die Datensätze Reihe&lt;br /&gt;
        für Reihe ausgegeben */&lt;br /&gt;
        while (mysql_fetch_row($rs_liste)) &lt;br /&gt;
          { &lt;br /&gt;
          $vorname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Vorname&amp;quot;);&lt;br /&gt;
          $nachname = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Nachname&amp;quot;);&lt;br /&gt;
          $plz = mysql_result($rs_liste, $pointer, &amp;quot;Kunde.Plz&amp;quot;);&lt;br /&gt;
          &lt;br /&gt;
          /* Erzeugung von HTML Tabellenzeilen die&lt;br /&gt;
          mit den Ergebnisdatensätzen gefüllt sind */&lt;br /&gt;
          echo &amp;quot;&amp;lt;tr&amp;gt;&amp;quot;; &lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $vorname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $nachname . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;td&amp;gt;&amp;quot; . $plz . &amp;quot;&amp;lt;/td&amp;gt;&amp;quot;;&lt;br /&gt;
          echo &amp;quot;&amp;lt;/tr&amp;gt;&amp;quot;;                &lt;br /&gt;
          &lt;br /&gt;
          /* Hilfsvariable wird um 1 erhöht um beim nächsten&lt;br /&gt;
          Durchlauf der Schleife zum nächsten Datensatz des&lt;br /&gt;
          Ergebnisses zu kommen */&lt;br /&gt;
          $pointer++; &lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      else&lt;br /&gt;
        {&lt;br /&gt;
        /* Ausgabe eines Hinweises falls Anzahl&lt;br /&gt;
        der gefundenen Datensätze = 0 ist */&lt;br /&gt;
        echo &amp;quot;Es wurden keine Datensätze gefunden&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
      mysql_free_result($rs_liste); // SQL Abfrage wird geschlossen&lt;br /&gt;
      mysql_close($conn); // Datenbankverbindung wird geschlossen&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=352</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=352"/>
		<updated>2009-03-02T13:59:20Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Verbinden von Tabellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Die SELECT Anweisung==&lt;br /&gt;
&lt;br /&gt;
Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Vornamen aus der Tabelle &#039;&#039;Kunde&#039;&#039; kann noch über einen sehr einfachen Befehl erstellt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden. Folgend werden nur die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; ausgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
Die folgende Anweisung gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Anführungszeichen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden. Die Abfrage unterhalb gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt. Folglich gibt die nächste Abfrage die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll (im Beispiel zuerst nach dem Nachnamen und danach nach dem Vornamen). Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;GROUP BY&#039;&#039;&#039;-Klausel bewirkt, dass die aus einer Abfrage resultierende Tabelle in &#039;&#039;&#039;Gruppen&#039;&#039;&#039; gegliedert wird. Dazu muss in der GROUP BY-Klausel angegeben werden, nach welchem Kriterium die Gruppierung erfolgen soll. Dieses Kriterium, der &#039;&#039;&#039;Gruppierungsschlüssel&#039;&#039;&#039;, ist im einfachsten Fall ein Attribut der Ausgangstabelle. Alle Zeilen mit demselben Wert des Gruppierungsschlüssels fallen in dieselbe Gruppe. Eine Gruppe ist also nichts anderes als eine Teiltabelle. Im Ergebnis wird jede Gruppe durch die Anwendung von Gruppierungsfunktionen auf eine einzelne Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Als typische Gruppenfunktionen gelten:&lt;br /&gt;
* COUNT&lt;br /&gt;
* SUM&lt;br /&gt;
* AVG&lt;br /&gt;
* MAX&lt;br /&gt;
* MIN&lt;br /&gt;
&lt;br /&gt;
Die Gruppenfunktionen werden analog zu gängigen Funktionen in Tabellenkalkulationsprogrammen angewandt und notiert, z.B. SUM(Auftragspos.Menge * Buch.Preis).&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage gibt das gruppierte Feld &#039;&#039;Region&#039;&#039; und die Anzahl der Orte, die &amp;quot;kirche&amp;quot; enthalten, aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus und sortiert diese neue Tabelle absteigend anhand der zweiten Spalte.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Region, COUNT(*)&lt;br /&gt;
FROM PLZ&lt;br /&gt;
WHERE Ort LIKE &#039;%kirche%&#039;&lt;br /&gt;
GROUP BY Region&lt;br /&gt;
ORDER BY 2 DESC&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select10a&amp;quot; value=&amp;quot;SELECT Region, COUNT(*) FROM PLZ WHERE Ort LIKE &#039;%kirche%&#039; GROUP BY Region ORDER BY 2 DESC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select10b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Gruppenfunktion generierte Spalten können mit &#039;&#039;&#039;AS&#039;&#039;&#039; benannt und dadurch auch für weitere Aktionen (z.B. ORDER BY) innerhalb der selben Abfrage verwendet werden. Die folgende Abfrage stellt bereits eine eher komplexe Abfrage mit einigen Joins dar. Sie gibt die Spalten &#039;&#039;Kunde.Nr&#039;&#039;, &#039;&#039;Kunde.Nachname&#039;&#039;, &#039;&#039;PLZ.Ort&#039;&#039; und den errechneten Umsatz aus den Tabellen &#039;&#039;PLZ&#039;&#039;, &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Auftragspos&#039;&#039; und &#039;&#039;Buch&#039;&#039; aus, gruppiert das Ergebnis nach der Kundennummer und sortiert es am Nachnamen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz&lt;br /&gt;
FROM PLZ, Kunde, Auftrag, Auftragspos, Buch&lt;br /&gt;
WHERE PLZ.Plz=Kunde.Plz&lt;br /&gt;
AND Kunde.Nr=Auftrag.Kundennummer&lt;br /&gt;
AND Auftrag.Nr=Auftragspos.Auftragsnummer&lt;br /&gt;
AND Auftragspos.Buchnummer=Buch.Nr&lt;br /&gt;
GROUP BY Kunde.Nr&lt;br /&gt;
ORDER BY Kunde.Nachname&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz FROM PLZ, Kunde, Auftrag, Auftragspos, Buch WHERE PLZ.Plz=Kunde.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr GROUP BY Kunde.Nr ORDER BY Kunde.Nachname&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2=Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz=PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select12a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz=PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select12b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=351</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=351"/>
		<updated>2009-03-02T13:58:35Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Gruppieren von Datensätzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Die SELECT Anweisung==&lt;br /&gt;
&lt;br /&gt;
Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Vornamen aus der Tabelle &#039;&#039;Kunde&#039;&#039; kann noch über einen sehr einfachen Befehl erstellt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden. Folgend werden nur die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; ausgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
Die folgende Anweisung gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Anführungszeichen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden. Die Abfrage unterhalb gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt. Folglich gibt die nächste Abfrage die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll (im Beispiel zuerst nach dem Nachnamen und danach nach dem Vornamen). Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;GROUP BY&#039;&#039;&#039;-Klausel bewirkt, dass die aus einer Abfrage resultierende Tabelle in &#039;&#039;&#039;Gruppen&#039;&#039;&#039; gegliedert wird. Dazu muss in der GROUP BY-Klausel angegeben werden, nach welchem Kriterium die Gruppierung erfolgen soll. Dieses Kriterium, der &#039;&#039;&#039;Gruppierungsschlüssel&#039;&#039;&#039;, ist im einfachsten Fall ein Attribut der Ausgangstabelle. Alle Zeilen mit demselben Wert des Gruppierungsschlüssels fallen in dieselbe Gruppe. Eine Gruppe ist also nichts anderes als eine Teiltabelle. Im Ergebnis wird jede Gruppe durch die Anwendung von Gruppierungsfunktionen auf eine einzelne Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Als typische Gruppenfunktionen gelten:&lt;br /&gt;
* COUNT&lt;br /&gt;
* SUM&lt;br /&gt;
* AVG&lt;br /&gt;
* MAX&lt;br /&gt;
* MIN&lt;br /&gt;
&lt;br /&gt;
Die Gruppenfunktionen werden analog zu gängigen Funktionen in Tabellenkalkulationsprogrammen angewandt und notiert, z.B. SUM(Auftragspos.Menge * Buch.Preis).&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage gibt das gruppierte Feld &#039;&#039;Region&#039;&#039; und die Anzahl der Orte, die &amp;quot;kirche&amp;quot; enthalten, aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus und sortiert diese neue Tabelle absteigend anhand der zweiten Spalte.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Region, COUNT(*)&lt;br /&gt;
FROM PLZ&lt;br /&gt;
WHERE Ort LIKE &#039;%kirche%&#039;&lt;br /&gt;
GROUP BY Region&lt;br /&gt;
ORDER BY 2 DESC&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select10a&amp;quot; value=&amp;quot;SELECT Region, COUNT(*) FROM PLZ WHERE Ort LIKE &#039;%kirche%&#039; GROUP BY Region ORDER BY 2 DESC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select10b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Gruppenfunktion generierte Spalten können mit &#039;&#039;&#039;AS&#039;&#039;&#039; benannt und dadurch auch für weitere Aktionen (z.B. ORDER BY) innerhalb der selben Abfrage verwendet werden. Die folgende Abfrage stellt bereits eine eher komplexe Abfrage mit einigen Joins dar. Sie gibt die Spalten &#039;&#039;Kunde.Nr&#039;&#039;, &#039;&#039;Kunde.Nachname&#039;&#039;, &#039;&#039;PLZ.Ort&#039;&#039; und den errechneten Umsatz aus den Tabellen &#039;&#039;PLZ&#039;&#039;, &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Auftragspos&#039;&#039; und &#039;&#039;Buch&#039;&#039; aus, gruppiert das Ergebnis nach der Kundennummer und sortiert es am Nachnamen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz&lt;br /&gt;
FROM PLZ, Kunde, Auftrag, Auftragspos, Buch&lt;br /&gt;
WHERE PLZ.Plz=Kunde.Plz&lt;br /&gt;
AND Kunde.Nr=Auftrag.Kundennummer&lt;br /&gt;
AND Auftrag.Nr=Auftragspos.Auftragsnummer&lt;br /&gt;
AND Auftragspos.Buchnummer=Buch.Nr&lt;br /&gt;
GROUP BY Kunde.Nr&lt;br /&gt;
ORDER BY Kunde.Nachname&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz FROM PLZ, Kunde, Auftrag, Auftragspos, Buch WHERE PLZ.Plz=Kunde.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr GROUP BY Kunde.Nr ORDER BY Kunde.Nachname&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2=Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz=PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select12a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz=PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select12b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=350</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=350"/>
		<updated>2009-03-02T13:56:40Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Sortieren von Datensätzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Die SELECT Anweisung==&lt;br /&gt;
&lt;br /&gt;
Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Vornamen aus der Tabelle &#039;&#039;Kunde&#039;&#039; kann noch über einen sehr einfachen Befehl erstellt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden. Folgend werden nur die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; ausgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
Die folgende Anweisung gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Anführungszeichen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden. Die Abfrage unterhalb gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt. Folglich gibt die nächste Abfrage die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll (im Beispiel zuerst nach dem Nachnamen und danach nach dem Vornamen). Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;GROUP BY&#039;&#039;&#039;-Klausel bewirkt, dass die aus einer Abfrage resultierende Tabelle in &#039;&#039;&#039;Gruppen&#039;&#039;&#039; gegliedert wird. Dazu muss in der GROUP BY-Klausel angegeben werden, nach welchem Kriterium die Gruppierung erfolgen soll. Dieses Kriterium, der &#039;&#039;&#039;Gruppierungsschlüssel&#039;&#039;&#039;, ist im einfachsten Fall ein Attribut der Ausgangstabelle. Alle Zeilen mit demselben Wert des Gruppierungsschlüssels fallen in dieselbe Gruppe. Eine Gruppe ist also nichts anderes als eine Teiltabelle. Im Ergebnis wird jede Gruppe durch die Anwendung von Gruppierungsfunktionen auf eine einzelne Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Als typische Gruppenfunktionen gelten:&lt;br /&gt;
* COUNT&lt;br /&gt;
* SUM&lt;br /&gt;
* AVG&lt;br /&gt;
* MAX&lt;br /&gt;
* MIN&lt;br /&gt;
&lt;br /&gt;
Die Gruppenfunktionen werden analog zu gängigen Funktionen in Tabellenkalkulationsprogrammen angewandt und notiert, z.B. SUM(Auftragspos.Menge * Buch.Preis).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Region, COUNT(*)&lt;br /&gt;
FROM PLZ&lt;br /&gt;
WHERE Ort LIKE &#039;%kirche%&#039;&lt;br /&gt;
GROUP BY Region&lt;br /&gt;
ORDER BY 2 DESC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das gruppierte Feld &#039;&#039;Region&#039;&#039; und die Anzahl der Orte, die &amp;quot;kirche&amp;quot; enthalten, aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus, absteigend sortiert anhand der zweiten Spalte)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select10a&amp;quot; value=&amp;quot;SELECT Region, COUNT(*) FROM PLZ WHERE Ort LIKE &#039;%kirche%&#039; GROUP BY Region ORDER BY 2 DESC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select10b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Gruppenfunktion generierte Spalten können mit &#039;&#039;&#039;AS&#039;&#039;&#039; benannt und dadurch auch für weitere Aktionen (z.B. ORDER BY) innerhalb der selben Abfrage verwendet werden. Die folgende Abfrage stellt bereits eine eher komplexe Abfrage mit einigen Joins dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz&lt;br /&gt;
FROM PLZ, Kunde, Auftrag, Auftragspos, Buch&lt;br /&gt;
WHERE PLZ.Plz=Kunde.Plz&lt;br /&gt;
AND Kunde.Nr=Auftrag.Kundennummer&lt;br /&gt;
AND Auftrag.Nr=Auftragspos.Auftragsnummer&lt;br /&gt;
AND Auftragspos.Buchnummer=Buch.Nr&lt;br /&gt;
GROUP BY Kunde.Nr&lt;br /&gt;
ORDER BY Kunde.Nachname&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Kunde.Nr&#039;&#039;, &#039;&#039;Kunde.Nachname&#039;&#039;, &#039;&#039;PLZ.Ort&#039;&#039; und den errechneten Umsatz aus den Tabellen &#039;&#039;PLZ&#039;&#039;, &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Auftragspos&#039;&#039; und &#039;&#039;Buch&#039;&#039; aus, gruppiert das Ergebnis nach der Kundennummer und sortiert es am Nachnamen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz FROM PLZ, Kunde, Auftrag, Auftragspos, Buch WHERE PLZ.Plz=Kunde.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr GROUP BY Kunde.Nr ORDER BY Kunde.Nachname&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2=Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz=PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select12a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz=PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select12b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=349</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=349"/>
		<updated>2009-03-02T13:55:23Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Auswählen von Datensätzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Die SELECT Anweisung==&lt;br /&gt;
&lt;br /&gt;
Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Vornamen aus der Tabelle &#039;&#039;Kunde&#039;&#039; kann noch über einen sehr einfachen Befehl erstellt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden. Folgend werden nur die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; ausgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
Die folgende Anweisung gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Anführungszeichen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden. Die Abfrage unterhalb gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt. Folglich gibt die nächste Abfrage die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll. Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; jeder Zeile in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, aufsteigend sortiert anhand der Spalten &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Vorname&#039;&#039;)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;GROUP BY&#039;&#039;&#039;-Klausel bewirkt, dass die aus einer Abfrage resultierende Tabelle in &#039;&#039;&#039;Gruppen&#039;&#039;&#039; gegliedert wird. Dazu muss in der GROUP BY-Klausel angegeben werden, nach welchem Kriterium die Gruppierung erfolgen soll. Dieses Kriterium, der &#039;&#039;&#039;Gruppierungsschlüssel&#039;&#039;&#039;, ist im einfachsten Fall ein Attribut der Ausgangstabelle. Alle Zeilen mit demselben Wert des Gruppierungsschlüssels fallen in dieselbe Gruppe. Eine Gruppe ist also nichts anderes als eine Teiltabelle. Im Ergebnis wird jede Gruppe durch die Anwendung von Gruppierungsfunktionen auf eine einzelne Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Als typische Gruppenfunktionen gelten:&lt;br /&gt;
* COUNT&lt;br /&gt;
* SUM&lt;br /&gt;
* AVG&lt;br /&gt;
* MAX&lt;br /&gt;
* MIN&lt;br /&gt;
&lt;br /&gt;
Die Gruppenfunktionen werden analog zu gängigen Funktionen in Tabellenkalkulationsprogrammen angewandt und notiert, z.B. SUM(Auftragspos.Menge * Buch.Preis).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Region, COUNT(*)&lt;br /&gt;
FROM PLZ&lt;br /&gt;
WHERE Ort LIKE &#039;%kirche%&#039;&lt;br /&gt;
GROUP BY Region&lt;br /&gt;
ORDER BY 2 DESC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das gruppierte Feld &#039;&#039;Region&#039;&#039; und die Anzahl der Orte, die &amp;quot;kirche&amp;quot; enthalten, aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus, absteigend sortiert anhand der zweiten Spalte)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select10a&amp;quot; value=&amp;quot;SELECT Region, COUNT(*) FROM PLZ WHERE Ort LIKE &#039;%kirche%&#039; GROUP BY Region ORDER BY 2 DESC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select10b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Gruppenfunktion generierte Spalten können mit &#039;&#039;&#039;AS&#039;&#039;&#039; benannt und dadurch auch für weitere Aktionen (z.B. ORDER BY) innerhalb der selben Abfrage verwendet werden. Die folgende Abfrage stellt bereits eine eher komplexe Abfrage mit einigen Joins dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz&lt;br /&gt;
FROM PLZ, Kunde, Auftrag, Auftragspos, Buch&lt;br /&gt;
WHERE PLZ.Plz=Kunde.Plz&lt;br /&gt;
AND Kunde.Nr=Auftrag.Kundennummer&lt;br /&gt;
AND Auftrag.Nr=Auftragspos.Auftragsnummer&lt;br /&gt;
AND Auftragspos.Buchnummer=Buch.Nr&lt;br /&gt;
GROUP BY Kunde.Nr&lt;br /&gt;
ORDER BY Kunde.Nachname&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Kunde.Nr&#039;&#039;, &#039;&#039;Kunde.Nachname&#039;&#039;, &#039;&#039;PLZ.Ort&#039;&#039; und den errechneten Umsatz aus den Tabellen &#039;&#039;PLZ&#039;&#039;, &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Auftragspos&#039;&#039; und &#039;&#039;Buch&#039;&#039; aus, gruppiert das Ergebnis nach der Kundennummer und sortiert es am Nachnamen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz FROM PLZ, Kunde, Auftrag, Auftragspos, Buch WHERE PLZ.Plz=Kunde.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr GROUP BY Kunde.Nr ORDER BY Kunde.Nachname&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2=Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz=PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select12a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz=PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select12b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=348</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=348"/>
		<updated>2009-03-02T13:51:23Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Ausschließen von Wiederholungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Die SELECT Anweisung==&lt;br /&gt;
&lt;br /&gt;
Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Vornamen aus der Tabelle &#039;&#039;Kunde&#039;&#039; kann noch über einen sehr einfachen Befehl erstellt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden. Folgend werden nur die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; ausgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Anführungszeichen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll. Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; jeder Zeile in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, aufsteigend sortiert anhand der Spalten &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Vorname&#039;&#039;)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;GROUP BY&#039;&#039;&#039;-Klausel bewirkt, dass die aus einer Abfrage resultierende Tabelle in &#039;&#039;&#039;Gruppen&#039;&#039;&#039; gegliedert wird. Dazu muss in der GROUP BY-Klausel angegeben werden, nach welchem Kriterium die Gruppierung erfolgen soll. Dieses Kriterium, der &#039;&#039;&#039;Gruppierungsschlüssel&#039;&#039;&#039;, ist im einfachsten Fall ein Attribut der Ausgangstabelle. Alle Zeilen mit demselben Wert des Gruppierungsschlüssels fallen in dieselbe Gruppe. Eine Gruppe ist also nichts anderes als eine Teiltabelle. Im Ergebnis wird jede Gruppe durch die Anwendung von Gruppierungsfunktionen auf eine einzelne Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Als typische Gruppenfunktionen gelten:&lt;br /&gt;
* COUNT&lt;br /&gt;
* SUM&lt;br /&gt;
* AVG&lt;br /&gt;
* MAX&lt;br /&gt;
* MIN&lt;br /&gt;
&lt;br /&gt;
Die Gruppenfunktionen werden analog zu gängigen Funktionen in Tabellenkalkulationsprogrammen angewandt und notiert, z.B. SUM(Auftragspos.Menge * Buch.Preis).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Region, COUNT(*)&lt;br /&gt;
FROM PLZ&lt;br /&gt;
WHERE Ort LIKE &#039;%kirche%&#039;&lt;br /&gt;
GROUP BY Region&lt;br /&gt;
ORDER BY 2 DESC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das gruppierte Feld &#039;&#039;Region&#039;&#039; und die Anzahl der Orte, die &amp;quot;kirche&amp;quot; enthalten, aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus, absteigend sortiert anhand der zweiten Spalte)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select10a&amp;quot; value=&amp;quot;SELECT Region, COUNT(*) FROM PLZ WHERE Ort LIKE &#039;%kirche%&#039; GROUP BY Region ORDER BY 2 DESC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select10b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Gruppenfunktion generierte Spalten können mit &#039;&#039;&#039;AS&#039;&#039;&#039; benannt und dadurch auch für weitere Aktionen (z.B. ORDER BY) innerhalb der selben Abfrage verwendet werden. Die folgende Abfrage stellt bereits eine eher komplexe Abfrage mit einigen Joins dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz&lt;br /&gt;
FROM PLZ, Kunde, Auftrag, Auftragspos, Buch&lt;br /&gt;
WHERE PLZ.Plz=Kunde.Plz&lt;br /&gt;
AND Kunde.Nr=Auftrag.Kundennummer&lt;br /&gt;
AND Auftrag.Nr=Auftragspos.Auftragsnummer&lt;br /&gt;
AND Auftragspos.Buchnummer=Buch.Nr&lt;br /&gt;
GROUP BY Kunde.Nr&lt;br /&gt;
ORDER BY Kunde.Nachname&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Kunde.Nr&#039;&#039;, &#039;&#039;Kunde.Nachname&#039;&#039;, &#039;&#039;PLZ.Ort&#039;&#039; und den errechneten Umsatz aus den Tabellen &#039;&#039;PLZ&#039;&#039;, &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Auftragspos&#039;&#039; und &#039;&#039;Buch&#039;&#039; aus, gruppiert das Ergebnis nach der Kundennummer und sortiert es am Nachnamen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz FROM PLZ, Kunde, Auftrag, Auftragspos, Buch WHERE PLZ.Plz=Kunde.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr GROUP BY Kunde.Nr ORDER BY Kunde.Nachname&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2=Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz=PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select12a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz=PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select12b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=347</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=347"/>
		<updated>2009-03-02T13:50:42Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Ausgeben von Datensätzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Die SELECT Anweisung==&lt;br /&gt;
&lt;br /&gt;
Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Vornamen aus der Tabelle &#039;&#039;Kunde&#039;&#039; kann noch über einen sehr einfachen Befehl erstellt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden. Folgend werden nur die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; ausgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Anführungszeichen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll. Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; jeder Zeile in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, aufsteigend sortiert anhand der Spalten &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Vorname&#039;&#039;)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;GROUP BY&#039;&#039;&#039;-Klausel bewirkt, dass die aus einer Abfrage resultierende Tabelle in &#039;&#039;&#039;Gruppen&#039;&#039;&#039; gegliedert wird. Dazu muss in der GROUP BY-Klausel angegeben werden, nach welchem Kriterium die Gruppierung erfolgen soll. Dieses Kriterium, der &#039;&#039;&#039;Gruppierungsschlüssel&#039;&#039;&#039;, ist im einfachsten Fall ein Attribut der Ausgangstabelle. Alle Zeilen mit demselben Wert des Gruppierungsschlüssels fallen in dieselbe Gruppe. Eine Gruppe ist also nichts anderes als eine Teiltabelle. Im Ergebnis wird jede Gruppe durch die Anwendung von Gruppierungsfunktionen auf eine einzelne Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Als typische Gruppenfunktionen gelten:&lt;br /&gt;
* COUNT&lt;br /&gt;
* SUM&lt;br /&gt;
* AVG&lt;br /&gt;
* MAX&lt;br /&gt;
* MIN&lt;br /&gt;
&lt;br /&gt;
Die Gruppenfunktionen werden analog zu gängigen Funktionen in Tabellenkalkulationsprogrammen angewandt und notiert, z.B. SUM(Auftragspos.Menge * Buch.Preis).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Region, COUNT(*)&lt;br /&gt;
FROM PLZ&lt;br /&gt;
WHERE Ort LIKE &#039;%kirche%&#039;&lt;br /&gt;
GROUP BY Region&lt;br /&gt;
ORDER BY 2 DESC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das gruppierte Feld &#039;&#039;Region&#039;&#039; und die Anzahl der Orte, die &amp;quot;kirche&amp;quot; enthalten, aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus, absteigend sortiert anhand der zweiten Spalte)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select10a&amp;quot; value=&amp;quot;SELECT Region, COUNT(*) FROM PLZ WHERE Ort LIKE &#039;%kirche%&#039; GROUP BY Region ORDER BY 2 DESC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select10b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Gruppenfunktion generierte Spalten können mit &#039;&#039;&#039;AS&#039;&#039;&#039; benannt und dadurch auch für weitere Aktionen (z.B. ORDER BY) innerhalb der selben Abfrage verwendet werden. Die folgende Abfrage stellt bereits eine eher komplexe Abfrage mit einigen Joins dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz&lt;br /&gt;
FROM PLZ, Kunde, Auftrag, Auftragspos, Buch&lt;br /&gt;
WHERE PLZ.Plz=Kunde.Plz&lt;br /&gt;
AND Kunde.Nr=Auftrag.Kundennummer&lt;br /&gt;
AND Auftrag.Nr=Auftragspos.Auftragsnummer&lt;br /&gt;
AND Auftragspos.Buchnummer=Buch.Nr&lt;br /&gt;
GROUP BY Kunde.Nr&lt;br /&gt;
ORDER BY Kunde.Nachname&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Kunde.Nr&#039;&#039;, &#039;&#039;Kunde.Nachname&#039;&#039;, &#039;&#039;PLZ.Ort&#039;&#039; und den errechneten Umsatz aus den Tabellen &#039;&#039;PLZ&#039;&#039;, &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Auftragspos&#039;&#039; und &#039;&#039;Buch&#039;&#039; aus, gruppiert das Ergebnis nach der Kundennummer und sortiert es am Nachnamen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz FROM PLZ, Kunde, Auftrag, Auftragspos, Buch WHERE PLZ.Plz=Kunde.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr GROUP BY Kunde.Nr ORDER BY Kunde.Nachname&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2=Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz=PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select12a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz=PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select12b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=346</id>
		<title>SQL-Grundbefehle</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=346"/>
		<updated>2009-03-02T13:46:35Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Löschen von Datensätzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Erstellen von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Die angeführten Beispiele beziehen sich auf das Modell der hinterlegten Übungsdatenbank. Manipulierende SQL-Anweisungen (solche, die den Inhalt oder die Struktur der Datenbank verändern) sind in der hinterlegten Übungs-Datenbank über den eigerichteten Web-Zugang nicht ausführbar. Die Syntax der dargestellten Beispiele orientiert sich an der SQL-Implementierung der Datenbankimplementierung [http://www.mysql.com/ MySQL].&lt;br /&gt;
&lt;br /&gt;
Eine neue Tabelle wird mit der Anweisung &#039;&#039;&#039;CREATE TABLE&#039;&#039;&#039; einer bestehenden Datenbank hinzugefügt. Im nachfolgenden Beispiel wird die Tabelle mit der Bezeichnung &amp;quot;Buch&amp;quot; erstellt, welche die Spalten (Datenbankfelder) &#039;&#039;Nr&#039;&#039;, &#039;&#039;Autor&#039;&#039;, &#039;&#039;Titel&#039;&#039;, &#039;&#039;Preis&#039;&#039;, &#039;&#039;Verlag&#039;&#039;, &#039;&#039;Auslaufend&#039;&#039; und &#039;&#039;Bestand&#039;&#039; enthält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE TABLE Buch&lt;br /&gt;
(Nr SMALLINT (2) PRIMARY KEY,&lt;br /&gt;
Autor VARCHAR (20) NOT NULL,&lt;br /&gt;
Titel VARCHAR (30) NOT NULL,&lt;br /&gt;
Preis DECIMAL (3.2) NOT NULL,&lt;br /&gt;
Verlag CHAR (3) NOT NULL,&lt;br /&gt;
Auslaufend CHAR (1) NOT NULL,&lt;br /&gt;
Bestand SMALLINT (4) NOT NULL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angaben nach der Bezeichnung der Spalte (des Datenbankfeldes) definieren den Datentyp. So erzeugt der Ausdruck &amp;quot;Nr SMALLINT (2) PRIMARY KEY,&amp;quot; ein Datenbankfeld mit der Bezeichnung &amp;quot;Nr&amp;quot;, welches nur ganzzahlige Werte aufnehmen kann, die einen Speicherplatz von 4 Byte nicht überschreiten. Es handelt sich um den Wertebereich (eine Domäne) von 0 bis 65535 aufnehmen kann. Die Komponente &amp;quot;PRIMARY KEY&amp;quot; weist darauf hin, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld Verwendung findet. Das Schlüsselfeld dient der eindeutigen Kennzeichnung eines Datensatzes.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;NOT NULL&amp;quot; bedeutet, dass dem betreffenden Feld ein Wert zugewiesen werden muss (Muss-Feld). Fehlt diese Komponente, kann das Feld auch &amp;quot;leer&amp;quot; bleiben (Kann-Feld), wie dies im Datenbankfeld &amp;quot;Bestand&amp;quot; der Fall ist. Leer belassene Felder haben einen undefinierten Inhalt. Man kann z.B. nicht davon ausgehen, dass ein undefiniertes Feld mit numerischen Datenformat, den Wert &amp;quot;0&amp;quot; aufweist.&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen: http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html&lt;br /&gt;
&lt;br /&gt;
Gängige Datenformate sind:&lt;br /&gt;
&lt;br /&gt;
* für Zahlen (z.B. SMALLINT, FLOAT, DECIMAL)&lt;br /&gt;
* für Datum und Uhrzeit (z.B. DATE, DATETIME, TIME)&lt;br /&gt;
* für Zeichenketten (z.B. CHAR, VARCHAR, BLOB)&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen:  http://dev.mysql.com/doc/refman/5.1/de/data-types.html&lt;br /&gt;
&lt;br /&gt;
Moderne RDBMS und Desktop-Datenbanken bieten benutzerfreundliche Werkzeuge zur Erstellung der Tabellen an. Diese generieren die erforderliche CREATE TABLE-Anweisung aus dem vorliegenden Datenmodell automatisch.&lt;br /&gt;
&lt;br /&gt;
==Die Domäne==&lt;br /&gt;
&lt;br /&gt;
Unter der &#039;&#039;&#039;Domäne&#039;&#039;&#039; (Domain) eines Feldes wird der gewählte Datentyp für sowie auch die erlaubten Inhalte verstanden. Die Domäne beschreibt den erlaubten Lösungsraum eines Feldes. Durch die, der Datenbank-Anwendung entsprechenden Zuweisung von Datenformaten, wird die Domäne eines Datenbankfeldes formal beschrieben. Aufgrund der formalen Beschreibung der Domäne durch eine Formatzuweisung, wird auch verhindert, dass unzulässige Werte (z.B. Texte in Spalten, die nur Zahlen enthalten dürfen) erfasst werden.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;SMALLINT (2) würde z.B. ausreichen um die 4-stelligen, österreichischen Postleitzahlen aufzunehmen (Wertebereich von 0 bis 65535). Um zu verhindern, dass trotzdem ungültige Postleitzahlen (z.B. 4711 oder 12345) erfasst werden, wäre es aber nötig, die zulässigen Werte neben der Zuweisung des Datenformates noch taxativ aufzuzählen. &lt;br /&gt;
&lt;br /&gt;
==Hinzufügen eines Feldes==&lt;br /&gt;
&lt;br /&gt;
Das nachträgliche Hinzufügen einer Spalte wird mit der Anweisung &#039;&#039;&#039;ALTER TABLE&#039;&#039;&#039; bewirkt. Nachfolgende Anweisung fügt der Tabelle &#039;&#039;Buch&#039;&#039; die Spalte (das Datenbankfeld) &#039;&#039;Rabatt&#039;&#039; hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ALTER TABLE Buch&lt;br /&gt;
ADD Rabatt INT (2) NOT NULL &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfügen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Das Eintragen von Daten funktioniert mit &#039;&#039;&#039;INSERT&#039;&#039;&#039;. Nach INTO wird wieder die Tabelle angegeben und diesesmal zusätzlich in Klammer auch die Felder, in die Daten eingefügt werden sollen. Die einzufügenden Werte stehen dann nach VALUES in der zweiten Klammer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;INSERT INTO Kunde (Nr, Vorname, Nachname, Strasse, Plz)&lt;br /&gt;
VALUES (345,&#039;Maria&#039;, &#039;Huber&#039;, &#039;Columbusstrasse 1492&#039;, 2034)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sind Werte für alle Felder angegeben, so müssen die Feldbezeichnungen (in der ersten Klammer) nicht explizit angeführt werden.&lt;br /&gt;
&lt;br /&gt;
Die manuelle Eingabe eignet sich nicht für Massendaten, weshalb DBMS (Datenbank Management Systeme) formularorientierte Anwendungen zur direkten Eingabe der Datensätze bieten. Software für betriebliche Anwendungen nutzt eingebettete Datenbankschnittstellen, um Massendaten - die z.B. aus Tabellenkalkulations-Anwendungen stammen - automatisiert zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
== Löschen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Wie auch bei der SELECT-Anweisung (siehe [[SQL-Abfragen]]) wird bei &#039;&#039;&#039;DELETE&#039;&#039;&#039; die Bedingung WHERE zur Auswahl des zu löschenden Datensatzes bestimmt. Normalerweise erfolgt dies durch die Angabe des Schlüsselfeldes des betreffenden Datensatzes. Nachfolgende Anweisung löscht den Datensatz mir der Nr &amp;quot;4&amp;quot;, wobei angenommen wird, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld dient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergibt die Bedingung eine Übereinstimmung in mehreren Datensätzen, so werden alle selektierten gelöscht. Nachfolgende Anweisung löscht alle Datensätze mit dem Vornamen &amp;quot;Michael&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ändern von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um Daten in einem Datensatz zu erneuern ist es nicht zwangsweise notwendig, diesen zuerst zu löschen und dann neu anzulegen. Hierfür bietet SQL die Möglichkeit, dies mit &#039;&#039;&#039;UPDATE&#039;&#039;&#039; zu tun. Auch hier wird die Bedingung WHERE benötigt, um den passenden Datensatz zu finden. Mit SET wird dann die Änderung der Inhalte der Datenbankfelder vorgenommen. Nachfolgend dargestellte Anweisung ändert im Datensatz mit der Nr &amp;quot;4&amp;quot; den Nachnamen auf &amp;quot;Mayer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Mayer&#039;&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Datensätze gleichzeitig mit der UPDATE Anweisung geändert werden. Nachfolgende Anweisung ändert in jedem Datensatz, welcher den Nachnamen &amp;quot;Mayer&amp;quot; vorweist, selbigen auf &amp;quot;Neumayer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Neumayer&#039;&lt;br /&gt;
WHERE Nachname=&#039;Mayer&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht nur eine Spalte lässt sich in mehreren Datensätzen auf einmal ändern, sondern auch mehrere Felder in einem Datensatz. Nachfolgende Anweisung ändert im Datensatz mit der ID &amp;quot;1&amp;quot; die PLZ auf &amp;quot;4055&amp;quot; und die Straße auf &amp;quot;Pinselweg 12&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Plz=4055, Strasse=&#039;Pinselweg 12&#039;&lt;br /&gt;
WHERE ID=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sonstige Anweisungen und Datenbank-Werkzeuge ==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen INSERT, DELETE und UPDATE gehören zu den wichtigsten und gehören zur Gruppe der &#039;&#039;&#039;Data Manipulation Language&#039;&#039;&#039; (&#039;&#039;&#039;DML&#039;&#039;&#039;). Daneben gibt es noch eine Vielzahl Aufgaben, Datenbanken einzurichten oder zu pflegen, die mit entsprechenden Funktionen oder Programmen unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
*Datenbankinstallation [http://dev.mysql.com/doc/refman/5.1/de/installing.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankoptimierung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankverwaltung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=345</id>
		<title>SQL-Grundbefehle</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=345"/>
		<updated>2009-03-02T13:46:22Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Ändern von Datensätzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Erstellen von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Die angeführten Beispiele beziehen sich auf das Modell der hinterlegten Übungsdatenbank. Manipulierende SQL-Anweisungen (solche, die den Inhalt oder die Struktur der Datenbank verändern) sind in der hinterlegten Übungs-Datenbank über den eigerichteten Web-Zugang nicht ausführbar. Die Syntax der dargestellten Beispiele orientiert sich an der SQL-Implementierung der Datenbankimplementierung [http://www.mysql.com/ MySQL].&lt;br /&gt;
&lt;br /&gt;
Eine neue Tabelle wird mit der Anweisung &#039;&#039;&#039;CREATE TABLE&#039;&#039;&#039; einer bestehenden Datenbank hinzugefügt. Im nachfolgenden Beispiel wird die Tabelle mit der Bezeichnung &amp;quot;Buch&amp;quot; erstellt, welche die Spalten (Datenbankfelder) &#039;&#039;Nr&#039;&#039;, &#039;&#039;Autor&#039;&#039;, &#039;&#039;Titel&#039;&#039;, &#039;&#039;Preis&#039;&#039;, &#039;&#039;Verlag&#039;&#039;, &#039;&#039;Auslaufend&#039;&#039; und &#039;&#039;Bestand&#039;&#039; enthält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE TABLE Buch&lt;br /&gt;
(Nr SMALLINT (2) PRIMARY KEY,&lt;br /&gt;
Autor VARCHAR (20) NOT NULL,&lt;br /&gt;
Titel VARCHAR (30) NOT NULL,&lt;br /&gt;
Preis DECIMAL (3.2) NOT NULL,&lt;br /&gt;
Verlag CHAR (3) NOT NULL,&lt;br /&gt;
Auslaufend CHAR (1) NOT NULL,&lt;br /&gt;
Bestand SMALLINT (4) NOT NULL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angaben nach der Bezeichnung der Spalte (des Datenbankfeldes) definieren den Datentyp. So erzeugt der Ausdruck &amp;quot;Nr SMALLINT (2) PRIMARY KEY,&amp;quot; ein Datenbankfeld mit der Bezeichnung &amp;quot;Nr&amp;quot;, welches nur ganzzahlige Werte aufnehmen kann, die einen Speicherplatz von 4 Byte nicht überschreiten. Es handelt sich um den Wertebereich (eine Domäne) von 0 bis 65535 aufnehmen kann. Die Komponente &amp;quot;PRIMARY KEY&amp;quot; weist darauf hin, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld Verwendung findet. Das Schlüsselfeld dient der eindeutigen Kennzeichnung eines Datensatzes.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;NOT NULL&amp;quot; bedeutet, dass dem betreffenden Feld ein Wert zugewiesen werden muss (Muss-Feld). Fehlt diese Komponente, kann das Feld auch &amp;quot;leer&amp;quot; bleiben (Kann-Feld), wie dies im Datenbankfeld &amp;quot;Bestand&amp;quot; der Fall ist. Leer belassene Felder haben einen undefinierten Inhalt. Man kann z.B. nicht davon ausgehen, dass ein undefiniertes Feld mit numerischen Datenformat, den Wert &amp;quot;0&amp;quot; aufweist.&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen: http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html&lt;br /&gt;
&lt;br /&gt;
Gängige Datenformate sind:&lt;br /&gt;
&lt;br /&gt;
* für Zahlen (z.B. SMALLINT, FLOAT, DECIMAL)&lt;br /&gt;
* für Datum und Uhrzeit (z.B. DATE, DATETIME, TIME)&lt;br /&gt;
* für Zeichenketten (z.B. CHAR, VARCHAR, BLOB)&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen:  http://dev.mysql.com/doc/refman/5.1/de/data-types.html&lt;br /&gt;
&lt;br /&gt;
Moderne RDBMS und Desktop-Datenbanken bieten benutzerfreundliche Werkzeuge zur Erstellung der Tabellen an. Diese generieren die erforderliche CREATE TABLE-Anweisung aus dem vorliegenden Datenmodell automatisch.&lt;br /&gt;
&lt;br /&gt;
==Die Domäne==&lt;br /&gt;
&lt;br /&gt;
Unter der &#039;&#039;&#039;Domäne&#039;&#039;&#039; (Domain) eines Feldes wird der gewählte Datentyp für sowie auch die erlaubten Inhalte verstanden. Die Domäne beschreibt den erlaubten Lösungsraum eines Feldes. Durch die, der Datenbank-Anwendung entsprechenden Zuweisung von Datenformaten, wird die Domäne eines Datenbankfeldes formal beschrieben. Aufgrund der formalen Beschreibung der Domäne durch eine Formatzuweisung, wird auch verhindert, dass unzulässige Werte (z.B. Texte in Spalten, die nur Zahlen enthalten dürfen) erfasst werden.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;SMALLINT (2) würde z.B. ausreichen um die 4-stelligen, österreichischen Postleitzahlen aufzunehmen (Wertebereich von 0 bis 65535). Um zu verhindern, dass trotzdem ungültige Postleitzahlen (z.B. 4711 oder 12345) erfasst werden, wäre es aber nötig, die zulässigen Werte neben der Zuweisung des Datenformates noch taxativ aufzuzählen. &lt;br /&gt;
&lt;br /&gt;
==Hinzufügen eines Feldes==&lt;br /&gt;
&lt;br /&gt;
Das nachträgliche Hinzufügen einer Spalte wird mit der Anweisung &#039;&#039;&#039;ALTER TABLE&#039;&#039;&#039; bewirkt. Nachfolgende Anweisung fügt der Tabelle &#039;&#039;Buch&#039;&#039; die Spalte (das Datenbankfeld) &#039;&#039;Rabatt&#039;&#039; hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ALTER TABLE Buch&lt;br /&gt;
ADD Rabatt INT (2) NOT NULL &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfügen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Das Eintragen von Daten funktioniert mit &#039;&#039;&#039;INSERT&#039;&#039;&#039;. Nach INTO wird wieder die Tabelle angegeben und diesesmal zusätzlich in Klammer auch die Felder, in die Daten eingefügt werden sollen. Die einzufügenden Werte stehen dann nach VALUES in der zweiten Klammer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;INSERT INTO Kunde (Nr, Vorname, Nachname, Strasse, Plz)&lt;br /&gt;
VALUES (345,&#039;Maria&#039;, &#039;Huber&#039;, &#039;Columbusstrasse 1492&#039;, 2034)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sind Werte für alle Felder angegeben, so müssen die Feldbezeichnungen (in der ersten Klammer) nicht explizit angeführt werden.&lt;br /&gt;
&lt;br /&gt;
Die manuelle Eingabe eignet sich nicht für Massendaten, weshalb DBMS (Datenbank Management Systeme) formularorientierte Anwendungen zur direkten Eingabe der Datensätze bieten. Software für betriebliche Anwendungen nutzt eingebettete Datenbankschnittstellen, um Massendaten - die z.B. aus Tabellenkalkulations-Anwendungen stammen - automatisiert zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
== Löschen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Wie auch bei der SELECT-Anweisung (siehe [[SQL-Abfragen]]) wird bei &#039;&#039;&#039;DELETE&#039;&#039;&#039; die Bedingung WHERE zur Auswahl des zu löschenden Datensatzes bestimmt. Normalerweise erfolgt dies durch die Angabe des Schlüsselfeldes des betreffenden Datensatzes. Nachfolgende Anweisung löscht den Datensatz mir der Nr &amp;quot;4&amp;quot;, wobei angenommen wird, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld dient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergibt die Bedingung eine Übereinstimmung in mehreren Datensätzen, so werden alle selektierten gelöscht. Nachfolgende Anweisung löscht alle Datensätze mit dem Vornamen &amp;quot;Michael&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ändern von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um Daten in einem Datensatz zu erneuern ist es nicht zwangsweise notwendig, diesen zuerst zu löschen und dann neu anzulegen. Hierfür bietet SQL die Möglichkeit, dies mit &#039;&#039;&#039;UPDATE&#039;&#039;&#039; zu tun. Auch hier wird die Bedingung WHERE benötigt, um den passenden Datensatz zu finden. Mit SET wird dann die Änderung der Inhalte der Datenbankfelder vorgenommen. Nachfolgend dargestellte Anweisung ändert im Datensatz mit der Nr &amp;quot;4&amp;quot; den Nachnamen auf &amp;quot;Mayer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Mayer&#039;&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Datensätze gleichzeitig mit der UPDATE Anweisung geändert werden. Nachfolgende Anweisung ändert in jedem Datensatz, welcher den Nachnamen &amp;quot;Mayer&amp;quot; vorweist, selbigen auf &amp;quot;Neumayer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Neumayer&#039;&lt;br /&gt;
WHERE Nachname=&#039;Mayer&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht nur eine Spalte lässt sich in mehreren Datensätzen auf einmal ändern, sondern auch mehrere Felder in einem Datensatz. Nachfolgende Anweisung ändert im Datensatz mit der ID &amp;quot;1&amp;quot; die PLZ auf &amp;quot;4055&amp;quot; und die Straße auf &amp;quot;Pinselweg 12&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Plz=4055, Strasse=&#039;Pinselweg 12&#039;&lt;br /&gt;
WHERE ID=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sonstige Anweisungen und Datenbank-Werkzeuge ==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen INSERT, DELETE und UPDATE gehören zu den wichtigsten und gehören zur Gruppe der &#039;&#039;&#039;Data Manipulation Language&#039;&#039;&#039; (&#039;&#039;&#039;DML&#039;&#039;&#039;). Daneben gibt es noch eine Vielzahl Aufgaben, Datenbanken einzurichten oder zu pflegen, die mit entsprechenden Funktionen oder Programmen unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
*Datenbankinstallation [http://dev.mysql.com/doc/refman/5.1/de/installing.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankoptimierung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankverwaltung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=344</id>
		<title>SQL-Grundbefehle</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=344"/>
		<updated>2009-03-02T13:45:37Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Einfügen von Datensätzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Erstellen von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Die angeführten Beispiele beziehen sich auf das Modell der hinterlegten Übungsdatenbank. Manipulierende SQL-Anweisungen (solche, die den Inhalt oder die Struktur der Datenbank verändern) sind in der hinterlegten Übungs-Datenbank über den eigerichteten Web-Zugang nicht ausführbar. Die Syntax der dargestellten Beispiele orientiert sich an der SQL-Implementierung der Datenbankimplementierung [http://www.mysql.com/ MySQL].&lt;br /&gt;
&lt;br /&gt;
Eine neue Tabelle wird mit der Anweisung &#039;&#039;&#039;CREATE TABLE&#039;&#039;&#039; einer bestehenden Datenbank hinzugefügt. Im nachfolgenden Beispiel wird die Tabelle mit der Bezeichnung &amp;quot;Buch&amp;quot; erstellt, welche die Spalten (Datenbankfelder) &#039;&#039;Nr&#039;&#039;, &#039;&#039;Autor&#039;&#039;, &#039;&#039;Titel&#039;&#039;, &#039;&#039;Preis&#039;&#039;, &#039;&#039;Verlag&#039;&#039;, &#039;&#039;Auslaufend&#039;&#039; und &#039;&#039;Bestand&#039;&#039; enthält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE TABLE Buch&lt;br /&gt;
(Nr SMALLINT (2) PRIMARY KEY,&lt;br /&gt;
Autor VARCHAR (20) NOT NULL,&lt;br /&gt;
Titel VARCHAR (30) NOT NULL,&lt;br /&gt;
Preis DECIMAL (3.2) NOT NULL,&lt;br /&gt;
Verlag CHAR (3) NOT NULL,&lt;br /&gt;
Auslaufend CHAR (1) NOT NULL,&lt;br /&gt;
Bestand SMALLINT (4) NOT NULL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angaben nach der Bezeichnung der Spalte (des Datenbankfeldes) definieren den Datentyp. So erzeugt der Ausdruck &amp;quot;Nr SMALLINT (2) PRIMARY KEY,&amp;quot; ein Datenbankfeld mit der Bezeichnung &amp;quot;Nr&amp;quot;, welches nur ganzzahlige Werte aufnehmen kann, die einen Speicherplatz von 4 Byte nicht überschreiten. Es handelt sich um den Wertebereich (eine Domäne) von 0 bis 65535 aufnehmen kann. Die Komponente &amp;quot;PRIMARY KEY&amp;quot; weist darauf hin, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld Verwendung findet. Das Schlüsselfeld dient der eindeutigen Kennzeichnung eines Datensatzes.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;NOT NULL&amp;quot; bedeutet, dass dem betreffenden Feld ein Wert zugewiesen werden muss (Muss-Feld). Fehlt diese Komponente, kann das Feld auch &amp;quot;leer&amp;quot; bleiben (Kann-Feld), wie dies im Datenbankfeld &amp;quot;Bestand&amp;quot; der Fall ist. Leer belassene Felder haben einen undefinierten Inhalt. Man kann z.B. nicht davon ausgehen, dass ein undefiniertes Feld mit numerischen Datenformat, den Wert &amp;quot;0&amp;quot; aufweist.&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen: http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html&lt;br /&gt;
&lt;br /&gt;
Gängige Datenformate sind:&lt;br /&gt;
&lt;br /&gt;
* für Zahlen (z.B. SMALLINT, FLOAT, DECIMAL)&lt;br /&gt;
* für Datum und Uhrzeit (z.B. DATE, DATETIME, TIME)&lt;br /&gt;
* für Zeichenketten (z.B. CHAR, VARCHAR, BLOB)&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen:  http://dev.mysql.com/doc/refman/5.1/de/data-types.html&lt;br /&gt;
&lt;br /&gt;
Moderne RDBMS und Desktop-Datenbanken bieten benutzerfreundliche Werkzeuge zur Erstellung der Tabellen an. Diese generieren die erforderliche CREATE TABLE-Anweisung aus dem vorliegenden Datenmodell automatisch.&lt;br /&gt;
&lt;br /&gt;
==Die Domäne==&lt;br /&gt;
&lt;br /&gt;
Unter der &#039;&#039;&#039;Domäne&#039;&#039;&#039; (Domain) eines Feldes wird der gewählte Datentyp für sowie auch die erlaubten Inhalte verstanden. Die Domäne beschreibt den erlaubten Lösungsraum eines Feldes. Durch die, der Datenbank-Anwendung entsprechenden Zuweisung von Datenformaten, wird die Domäne eines Datenbankfeldes formal beschrieben. Aufgrund der formalen Beschreibung der Domäne durch eine Formatzuweisung, wird auch verhindert, dass unzulässige Werte (z.B. Texte in Spalten, die nur Zahlen enthalten dürfen) erfasst werden.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;SMALLINT (2) würde z.B. ausreichen um die 4-stelligen, österreichischen Postleitzahlen aufzunehmen (Wertebereich von 0 bis 65535). Um zu verhindern, dass trotzdem ungültige Postleitzahlen (z.B. 4711 oder 12345) erfasst werden, wäre es aber nötig, die zulässigen Werte neben der Zuweisung des Datenformates noch taxativ aufzuzählen. &lt;br /&gt;
&lt;br /&gt;
==Hinzufügen eines Feldes==&lt;br /&gt;
&lt;br /&gt;
Das nachträgliche Hinzufügen einer Spalte wird mit der Anweisung &#039;&#039;&#039;ALTER TABLE&#039;&#039;&#039; bewirkt. Nachfolgende Anweisung fügt der Tabelle &#039;&#039;Buch&#039;&#039; die Spalte (das Datenbankfeld) &#039;&#039;Rabatt&#039;&#039; hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ALTER TABLE Buch&lt;br /&gt;
ADD Rabatt INT (2) NOT NULL &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfügen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Das Eintragen von Daten funktioniert mit &#039;&#039;&#039;INSERT&#039;&#039;&#039;. Nach INTO wird wieder die Tabelle angegeben und diesesmal zusätzlich in Klammer auch die Felder, in die Daten eingefügt werden sollen. Die einzufügenden Werte stehen dann nach VALUES in der zweiten Klammer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;INSERT INTO Kunde (Nr, Vorname, Nachname, Strasse, Plz)&lt;br /&gt;
VALUES (345,&#039;Maria&#039;, &#039;Huber&#039;, &#039;Columbusstrasse 1492&#039;, 2034)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sind Werte für alle Felder angegeben, so müssen die Feldbezeichnungen (in der ersten Klammer) nicht explizit angeführt werden.&lt;br /&gt;
&lt;br /&gt;
Die manuelle Eingabe eignet sich nicht für Massendaten, weshalb DBMS (Datenbank Management Systeme) formularorientierte Anwendungen zur direkten Eingabe der Datensätze bieten. Software für betriebliche Anwendungen nutzt eingebettete Datenbankschnittstellen, um Massendaten - die z.B. aus Tabellenkalkulations-Anwendungen stammen - automatisiert zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
== Löschen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Wie auch bei der SELECT-Anweisung (siehe [[SQL-Abfragen]]) wird bei &#039;&#039;&#039;DELETE&#039;&#039;&#039; die Bedingung WHERE zur Auswahl des zu löschenden Datensatzes bestimmt. Normalerweise erfolgt dies durch die Angabe des Schlüsselfeldes des betreffenden Datensatzes. Nachfolgende Anweisung löscht den Datensatz mir der Nr &amp;quot;4&amp;quot;, wobei angenommen wird, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld dient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergibt die Bedingung eine Übereinstimmung in mehreren Datensätzen, so werden alle selektierten gelöscht. Nachfolgende Anweisung löscht alle Datensätze mit dem Vornamen &amp;quot;Michael&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ändern von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um Daten in einem Datensatz zu erneuern ist es nicht zwangsweise notwendig, diesen zuerst zu löschen und dann neu anzulegen. Hierfür bietet SQL die Möglichkeit, dies mit &#039;&#039;&#039;UPDATE&#039;&#039;&#039; zu tun. Auch hier wird die Bedingung WHERE benötigt, um den passenden Datensatz zu finden. Mit SET wird dann die Änderung der Inhalte der Datenbankfelder vorgenommen. Nachfolgend dargestellte Anweisung ändert im Datensatz mit der Nr &amp;quot;4&amp;quot; den Nachnamen auf &amp;quot;Mayer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Mayer&#039;&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Datensätze gleichzeitig mit der UPDATE Anweisung geändert werden. Nachfolgende Anweisung ändert in jedem Datensatz, welcher den Nachnamen &amp;quot;Mayer&amp;quot; vorweist, selbigen auf &amp;quot;Neumayer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Neumayer&#039;&lt;br /&gt;
WHERE Nachname=&#039;Mayer&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht nur eine Spalte lässt sich in mehreren Datensätzen auf einmal ändern, sondern auch mehrere Felder in einem Datensatz. Nachfolgende Anweisung ändert im Datensatz mit der ID &amp;quot;1&amp;quot; die PLZ auf &amp;quot;4055&amp;quot; und die Straße auf &amp;quot;Pinselweg 12&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Plz=4055, Strasse=&#039;Pinselweg 12&#039;&lt;br /&gt;
WHERE ID=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sonstige Anweisungen und Datenbank-Werkzeuge ==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen INSERT, DELETE und UPDATE gehören zu den wichtigsten und gehören zur Gruppe der &#039;&#039;&#039;Data Manipulation Language&#039;&#039;&#039; (&#039;&#039;&#039;DML&#039;&#039;&#039;). Daneben gibt es noch eine Vielzahl Aufgaben, Datenbanken einzurichten oder zu pflegen, die mit entsprechenden Funktionen oder Programmen unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
*Datenbankinstallation [http://dev.mysql.com/doc/refman/5.1/de/installing.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankoptimierung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankverwaltung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=343</id>
		<title>SQL-Grundbefehle</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=343"/>
		<updated>2009-03-02T13:45:20Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Hinzufügen eines Feldes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Erstellen von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Die angeführten Beispiele beziehen sich auf das Modell der hinterlegten Übungsdatenbank. Manipulierende SQL-Anweisungen (solche, die den Inhalt oder die Struktur der Datenbank verändern) sind in der hinterlegten Übungs-Datenbank über den eigerichteten Web-Zugang nicht ausführbar. Die Syntax der dargestellten Beispiele orientiert sich an der SQL-Implementierung der Datenbankimplementierung [http://www.mysql.com/ MySQL].&lt;br /&gt;
&lt;br /&gt;
Eine neue Tabelle wird mit der Anweisung &#039;&#039;&#039;CREATE TABLE&#039;&#039;&#039; einer bestehenden Datenbank hinzugefügt. Im nachfolgenden Beispiel wird die Tabelle mit der Bezeichnung &amp;quot;Buch&amp;quot; erstellt, welche die Spalten (Datenbankfelder) &#039;&#039;Nr&#039;&#039;, &#039;&#039;Autor&#039;&#039;, &#039;&#039;Titel&#039;&#039;, &#039;&#039;Preis&#039;&#039;, &#039;&#039;Verlag&#039;&#039;, &#039;&#039;Auslaufend&#039;&#039; und &#039;&#039;Bestand&#039;&#039; enthält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE TABLE Buch&lt;br /&gt;
(Nr SMALLINT (2) PRIMARY KEY,&lt;br /&gt;
Autor VARCHAR (20) NOT NULL,&lt;br /&gt;
Titel VARCHAR (30) NOT NULL,&lt;br /&gt;
Preis DECIMAL (3.2) NOT NULL,&lt;br /&gt;
Verlag CHAR (3) NOT NULL,&lt;br /&gt;
Auslaufend CHAR (1) NOT NULL,&lt;br /&gt;
Bestand SMALLINT (4) NOT NULL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angaben nach der Bezeichnung der Spalte (des Datenbankfeldes) definieren den Datentyp. So erzeugt der Ausdruck &amp;quot;Nr SMALLINT (2) PRIMARY KEY,&amp;quot; ein Datenbankfeld mit der Bezeichnung &amp;quot;Nr&amp;quot;, welches nur ganzzahlige Werte aufnehmen kann, die einen Speicherplatz von 4 Byte nicht überschreiten. Es handelt sich um den Wertebereich (eine Domäne) von 0 bis 65535 aufnehmen kann. Die Komponente &amp;quot;PRIMARY KEY&amp;quot; weist darauf hin, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld Verwendung findet. Das Schlüsselfeld dient der eindeutigen Kennzeichnung eines Datensatzes.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;NOT NULL&amp;quot; bedeutet, dass dem betreffenden Feld ein Wert zugewiesen werden muss (Muss-Feld). Fehlt diese Komponente, kann das Feld auch &amp;quot;leer&amp;quot; bleiben (Kann-Feld), wie dies im Datenbankfeld &amp;quot;Bestand&amp;quot; der Fall ist. Leer belassene Felder haben einen undefinierten Inhalt. Man kann z.B. nicht davon ausgehen, dass ein undefiniertes Feld mit numerischen Datenformat, den Wert &amp;quot;0&amp;quot; aufweist.&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen: http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html&lt;br /&gt;
&lt;br /&gt;
Gängige Datenformate sind:&lt;br /&gt;
&lt;br /&gt;
* für Zahlen (z.B. SMALLINT, FLOAT, DECIMAL)&lt;br /&gt;
* für Datum und Uhrzeit (z.B. DATE, DATETIME, TIME)&lt;br /&gt;
* für Zeichenketten (z.B. CHAR, VARCHAR, BLOB)&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen:  http://dev.mysql.com/doc/refman/5.1/de/data-types.html&lt;br /&gt;
&lt;br /&gt;
Moderne RDBMS und Desktop-Datenbanken bieten benutzerfreundliche Werkzeuge zur Erstellung der Tabellen an. Diese generieren die erforderliche CREATE TABLE-Anweisung aus dem vorliegenden Datenmodell automatisch.&lt;br /&gt;
&lt;br /&gt;
==Die Domäne==&lt;br /&gt;
&lt;br /&gt;
Unter der &#039;&#039;&#039;Domäne&#039;&#039;&#039; (Domain) eines Feldes wird der gewählte Datentyp für sowie auch die erlaubten Inhalte verstanden. Die Domäne beschreibt den erlaubten Lösungsraum eines Feldes. Durch die, der Datenbank-Anwendung entsprechenden Zuweisung von Datenformaten, wird die Domäne eines Datenbankfeldes formal beschrieben. Aufgrund der formalen Beschreibung der Domäne durch eine Formatzuweisung, wird auch verhindert, dass unzulässige Werte (z.B. Texte in Spalten, die nur Zahlen enthalten dürfen) erfasst werden.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;SMALLINT (2) würde z.B. ausreichen um die 4-stelligen, österreichischen Postleitzahlen aufzunehmen (Wertebereich von 0 bis 65535). Um zu verhindern, dass trotzdem ungültige Postleitzahlen (z.B. 4711 oder 12345) erfasst werden, wäre es aber nötig, die zulässigen Werte neben der Zuweisung des Datenformates noch taxativ aufzuzählen. &lt;br /&gt;
&lt;br /&gt;
==Hinzufügen eines Feldes==&lt;br /&gt;
&lt;br /&gt;
Das nachträgliche Hinzufügen einer Spalte wird mit der Anweisung &#039;&#039;&#039;ALTER TABLE&#039;&#039;&#039; bewirkt. Nachfolgende Anweisung fügt der Tabelle &#039;&#039;Buch&#039;&#039; die Spalte (das Datenbankfeld) &#039;&#039;Rabatt&#039;&#039; hinzu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ALTER TABLE Buch&lt;br /&gt;
ADD Rabatt INT (2) NOT NULL &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfügen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Das Eintragen von Daten funktioniert mit &#039;&#039;&#039;INSERT&#039;&#039;&#039;. Nach INTO wird wieder die Tabelle angegeben und diesesmal zusätzlich in Klammer auch die Felder, in die Daten eingefügt werden sollen. Die einzufügenden Werte stehen dann nach VALUES in der zweiten Klammer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;INSERT INTO Kunde (Nr, Vorname, Nachname, Strasse, Plz)&lt;br /&gt;
VALUES (345,&#039;Maria&#039;, &#039;Huber&#039;, &#039;Columbusstrasse 1492&#039;, 2034)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sind Werte für alle Felder angegeben, so müssen die Feldbezeichnungen (in der ersten Klammer) nicht explizit angeführt werden.&lt;br /&gt;
&lt;br /&gt;
Die manuelle Eingabe eignet sich nicht für Massendaten, weshalb DBMS (Datenbank Management Systeme) formularorientierte Anwendungen zur direkten Eingabe der Datensätze bieten. Software für betriebliche Anwendungen nutzt eingebettete Datenbankschnittstellen, um Massendaten - die z.B. aus Tabellenkalkulations-Anwendungen stammen - automatisiert zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
== Löschen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Wie auch bei der SELECT-Anweisung (siehe [[SQL-Abfragen]]) wird bei &#039;&#039;&#039;DELETE&#039;&#039;&#039; die Bedingung WHERE zur Auswahl des zu löschenden Datensatzes bestimmt. Normalerweise erfolgt dies durch die Angabe des Schlüsselfeldes des betreffenden Datensatzes. Nachfolgende Anweisung löscht den Datensatz mir der Nr &amp;quot;4&amp;quot;, wobei angenommen wird, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld dient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergibt die Bedingung eine Übereinstimmung in mehreren Datensätzen, so werden alle selektierten gelöscht. Nachfolgende Anweisung löscht alle Datensätze mit dem Vornamen &amp;quot;Michael&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ändern von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um Daten in einem Datensatz zu erneuern ist es nicht zwangsweise notwendig, diesen zuerst zu löschen und dann neu anzulegen. Hierfür bietet SQL die Möglichkeit, dies mit &#039;&#039;&#039;UPDATE&#039;&#039;&#039; zu tun. Auch hier wird die Bedingung WHERE benötigt, um den passenden Datensatz zu finden. Mit SET wird dann die Änderung der Inhalte der Datenbankfelder vorgenommen. Nachfolgend dargestellte Anweisung ändert im Datensatz mit der Nr &amp;quot;4&amp;quot; den Nachnamen auf &amp;quot;Mayer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Mayer&#039;&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Datensätze gleichzeitig mit der UPDATE Anweisung geändert werden. Nachfolgende Anweisung ändert in jedem Datensatz, welcher den Nachnamen &amp;quot;Mayer&amp;quot; vorweist, selbigen auf &amp;quot;Neumayer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Neumayer&#039;&lt;br /&gt;
WHERE Nachname=&#039;Mayer&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht nur eine Spalte lässt sich in mehreren Datensätzen auf einmal ändern, sondern auch mehrere Felder in einem Datensatz. Nachfolgende Anweisung ändert im Datensatz mit der ID &amp;quot;1&amp;quot; die PLZ auf &amp;quot;4055&amp;quot; und die Straße auf &amp;quot;Pinselweg 12&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Plz=4055, Strasse=&#039;Pinselweg 12&#039;&lt;br /&gt;
WHERE ID=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sonstige Anweisungen und Datenbank-Werkzeuge ==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen INSERT, DELETE und UPDATE gehören zu den wichtigsten und gehören zur Gruppe der &#039;&#039;&#039;Data Manipulation Language&#039;&#039;&#039; (&#039;&#039;&#039;DML&#039;&#039;&#039;). Daneben gibt es noch eine Vielzahl Aufgaben, Datenbanken einzurichten oder zu pflegen, die mit entsprechenden Funktionen oder Programmen unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
*Datenbankinstallation [http://dev.mysql.com/doc/refman/5.1/de/installing.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankoptimierung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankverwaltung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=342</id>
		<title>SQL-Grundbefehle</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=342"/>
		<updated>2009-03-02T13:41:48Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Erstellen von Tabellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Erstellen von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Die angeführten Beispiele beziehen sich auf das Modell der hinterlegten Übungsdatenbank. Manipulierende SQL-Anweisungen (solche, die den Inhalt oder die Struktur der Datenbank verändern) sind in der hinterlegten Übungs-Datenbank über den eigerichteten Web-Zugang nicht ausführbar. Die Syntax der dargestellten Beispiele orientiert sich an der SQL-Implementierung der Datenbankimplementierung [http://www.mysql.com/ MySQL].&lt;br /&gt;
&lt;br /&gt;
Eine neue Tabelle wird mit der Anweisung &#039;&#039;&#039;CREATE TABLE&#039;&#039;&#039; einer bestehenden Datenbank hinzugefügt. Im nachfolgenden Beispiel wird die Tabelle mit der Bezeichnung &amp;quot;Buch&amp;quot; erstellt, welche die Spalten (Datenbankfelder) &#039;&#039;Nr&#039;&#039;, &#039;&#039;Autor&#039;&#039;, &#039;&#039;Titel&#039;&#039;, &#039;&#039;Preis&#039;&#039;, &#039;&#039;Verlag&#039;&#039;, &#039;&#039;Auslaufend&#039;&#039; und &#039;&#039;Bestand&#039;&#039; enthält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE TABLE Buch&lt;br /&gt;
(Nr SMALLINT (2) PRIMARY KEY,&lt;br /&gt;
Autor VARCHAR (20) NOT NULL,&lt;br /&gt;
Titel VARCHAR (30) NOT NULL,&lt;br /&gt;
Preis DECIMAL (3.2) NOT NULL,&lt;br /&gt;
Verlag CHAR (3) NOT NULL,&lt;br /&gt;
Auslaufend CHAR (1) NOT NULL,&lt;br /&gt;
Bestand SMALLINT (4) NOT NULL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Angaben nach der Bezeichnung der Spalte (des Datenbankfeldes) definieren den Datentyp. So erzeugt der Ausdruck &amp;quot;Nr SMALLINT (2) PRIMARY KEY,&amp;quot; ein Datenbankfeld mit der Bezeichnung &amp;quot;Nr&amp;quot;, welches nur ganzzahlige Werte aufnehmen kann, die einen Speicherplatz von 4 Byte nicht überschreiten. Es handelt sich um den Wertebereich (eine Domäne) von 0 bis 65535 aufnehmen kann. Die Komponente &amp;quot;PRIMARY KEY&amp;quot; weist darauf hin, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld Verwendung findet. Das Schlüsselfeld dient der eindeutigen Kennzeichnung eines Datensatzes.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;NOT NULL&amp;quot; bedeutet, dass dem betreffenden Feld ein Wert zugewiesen werden muss (Muss-Feld). Fehlt diese Komponente, kann das Feld auch &amp;quot;leer&amp;quot; bleiben (Kann-Feld), wie dies im Datenbankfeld &amp;quot;Bestand&amp;quot; der Fall ist. Leer belassene Felder haben einen undefinierten Inhalt. Man kann z.B. nicht davon ausgehen, dass ein undefiniertes Feld mit numerischen Datenformat, den Wert &amp;quot;0&amp;quot; aufweist.&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen: http://dev.mysql.com/doc/refman/5.1/de/numeric-types.html&lt;br /&gt;
&lt;br /&gt;
Gängige Datenformate sind:&lt;br /&gt;
&lt;br /&gt;
* für Zahlen (z.B. SMALLINT, FLOAT, DECIMAL)&lt;br /&gt;
* für Datum und Uhrzeit (z.B. DATE, DATETIME, TIME)&lt;br /&gt;
* für Zeichenketten (z.B. CHAR, VARCHAR, BLOB)&lt;br /&gt;
&lt;br /&gt;
Vertiefende Informationen:  http://dev.mysql.com/doc/refman/5.1/de/data-types.html&lt;br /&gt;
&lt;br /&gt;
Moderne RDBMS und Desktop-Datenbanken bieten benutzerfreundliche Werkzeuge zur Erstellung der Tabellen an. Diese generieren die erforderliche CREATE TABLE-Anweisung aus dem vorliegenden Datenmodell automatisch.&lt;br /&gt;
&lt;br /&gt;
==Die Domäne==&lt;br /&gt;
&lt;br /&gt;
Unter der &#039;&#039;&#039;Domäne&#039;&#039;&#039; (Domain) eines Feldes wird der gewählte Datentyp für sowie auch die erlaubten Inhalte verstanden. Die Domäne beschreibt den erlaubten Lösungsraum eines Feldes. Durch die, der Datenbank-Anwendung entsprechenden Zuweisung von Datenformaten, wird die Domäne eines Datenbankfeldes formal beschrieben. Aufgrund der formalen Beschreibung der Domäne durch eine Formatzuweisung, wird auch verhindert, dass unzulässige Werte (z.B. Texte in Spalten, die nur Zahlen enthalten dürfen) erfasst werden.&lt;br /&gt;
&lt;br /&gt;
Die Komponente &amp;quot;SMALLINT (2) würde z.B. ausreichen um die 4-stelligen, österreichischen Postleitzahlen aufzunehmen (Wertebereich von 0 bis 65535). Um zu verhindern, dass trotzdem ungültige Postleitzahlen (z.B. 4711 oder 12345) erfasst werden, wäre es aber nötig, die zulässigen Werte neben der Zuweisung des Datenformates noch taxativ aufzuzählen. &lt;br /&gt;
&lt;br /&gt;
==Hinzufügen eines Feldes==&lt;br /&gt;
&lt;br /&gt;
Das nachträgliche Hinzufügen einer Spalte wird mit der Anweisung &#039;&#039;&#039;ALTER TABLE&#039;&#039;&#039; bewirkt. Nachfolgende Anweisung fügt der Tabelle &#039;&#039;Buch&#039;&#039; die Spalte (das Datenbankfeld) &#039;&#039;Rabatt&#039;&#039; hinzu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ALTER TABLE Buch&lt;br /&gt;
ADD Rabatt INT (2) NOT NULL &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einfügen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Das Eintragen von Daten funktioniert mit &#039;&#039;&#039;INSERT&#039;&#039;&#039;. Nach INTO wird wieder die Tabelle angegeben und diesesmal zusätzlich in Klammer auch die Felder, in die Daten eingefügt werden sollen. Die einzufügenden Werte stehen dann nach VALUES in der zweiten Klammer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;INSERT INTO Kunde (Nr, Vorname, Nachname, Strasse, Plz)&lt;br /&gt;
VALUES (345,&#039;Maria&#039;, &#039;Huber&#039;, &#039;Columbusstrasse 1492&#039;, 2034)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sind Werte für alle Felder angegeben, so müssen die Feldbezeichnungen (in der ersten Klammer) nicht explizit angeführt werden.&lt;br /&gt;
&lt;br /&gt;
Die manuelle Eingabe eignet sich nicht für Massendaten, weshalb DBMS (Datenbank Management Systeme) formularorientierte Anwendungen zur direkten Eingabe der Datensätze bieten. Software für betriebliche Anwendungen nutzt eingebettete Datenbankschnittstellen, um Massendaten - die z.B. aus Tabellenkalkulations-Anwendungen stammen - automatisiert zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
== Löschen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Wie auch bei der SELECT-Anweisung (siehe [[SQL-Abfragen]]) wird bei &#039;&#039;&#039;DELETE&#039;&#039;&#039; die Bedingung WHERE zur Auswahl des zu löschenden Datensatzes bestimmt. Normalerweise erfolgt dies durch die Angabe des Schlüsselfeldes des betreffenden Datensatzes. Nachfolgende Anweisung löscht den Datensatz mir der Nr &amp;quot;4&amp;quot;, wobei angenommen wird, dass das Feld &amp;quot;Nr&amp;quot; als Schlüsselfeld dient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergibt die Bedingung eine Übereinstimmung in mehreren Datensätzen, so werden alle selektierten gelöscht. Nachfolgende Anweisung löscht alle Datensätze mit dem Vornamen &amp;quot;Michael&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ändern von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um Daten in einem Datensatz zu erneuern ist es nicht zwangsweise notwendig, diesen zuerst zu löschen und dann neu anzulegen. Hierfür bietet SQL die Möglichkeit, dies mit &#039;&#039;&#039;UPDATE&#039;&#039;&#039; zu tun. Auch hier wird die Bedingung WHERE benötigt, um den passenden Datensatz zu finden. Mit SET wird dann die Änderung der Inhalte der Datenbankfelder vorgenommen. Nachfolgend dargestellte Anweisung ändert im Datensatz mit der Nr &amp;quot;4&amp;quot; den Nachnamen auf &amp;quot;Mayer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Mayer&#039;&lt;br /&gt;
WHERE Nr=4&amp;lt;/pre&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Es können auch mehrere Datensätze gleichzeitig mit der UPDATE Anweisung geändert werden. Nachfolgende Anweisung ändert in jedem Datensatz, welcher den Nachnamen &amp;quot;Mayer&amp;quot; vorweist, selbigen auf &amp;quot;Neumayer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Neumayer&#039;&lt;br /&gt;
WHERE Nachname=&#039;Mayer&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nicht nur eine Spalte lässt sich in mehreren Datensätzen auf einmal ändern, sondern auch mehrere Felder in einem Datensatz. Nachfolgende Anweisung ändert im Datensatz mit der ID &amp;quot;1&amp;quot; die PLZ auf &amp;quot;4055&amp;quot; und die Straße auf &amp;quot;Pinselweg 12&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Plz=4055, Strasse=&#039;Pinselweg 12&#039;&lt;br /&gt;
WHERE ID=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sonstige Anweisungen und Datenbank-Werkzeuge ==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen INSERT, DELETE und UPDATE gehören zu den wichtigsten und gehören zur Gruppe der &#039;&#039;&#039;Data Manipulation Language&#039;&#039;&#039; (&#039;&#039;&#039;DML&#039;&#039;&#039;). Daneben gibt es noch eine Vielzahl Aufgaben, Datenbanken einzurichten oder zu pflegen, die mit entsprechenden Funktionen oder Programmen unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
*Datenbankinstallation [http://dev.mysql.com/doc/refman/5.1/de/installing.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankoptimierung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;br /&gt;
*Datenbankverwaltung [http://dev.mysql.com/doc/refman/5.1/de/optimization.html Vertiefende Quelle]&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=223</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=223"/>
		<updated>2009-02-22T21:43:03Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Gruppieren von Datensätzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll. Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; jeder Zeile in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, aufsteigend sortiert anhand der Spalten &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Vorname&#039;&#039;)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;GROUP BY&#039;&#039;&#039;-Klausel bewirkt, dass die aus einer Abfrage resultierende Tabelle in &#039;&#039;&#039;Gruppen&#039;&#039;&#039; gegliedert wird. Dazu muss in der GROUP BY-Klausel angegeben werden, nach welchem Kriterium die Gruppierung erfolgen soll. Dieses Kriterium, der &#039;&#039;&#039;Gruppierungsschlüssel&#039;&#039;&#039;, ist im einfachsten Fall ein Attribut der Ausgangstabelle. Alle Zeilen mit demselben Wert des Gruppierungsschlüssels fallen in dieselbe Gruppe. Eine Gruppe ist also nichts anderes als eine Teiltabelle. Im Ergebnis wird jede Gruppe durch die Anwendung von Gruppierungsfunktionen auf eine einzelne Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Als typische Gruppenfunktionen gelten:&lt;br /&gt;
* COUNT&lt;br /&gt;
* SUM&lt;br /&gt;
* AVG&lt;br /&gt;
* MAX&lt;br /&gt;
* MIN&lt;br /&gt;
&lt;br /&gt;
Die Gruppenfunktionen werden analog zu gängigen Funktionen in Tabellenkalkulationsprogrammen angewandt und notiert, z.B. SUM(Auftragspos.Menge * Buch.Preis).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Region, COUNT(*)&lt;br /&gt;
FROM PLZ&lt;br /&gt;
WHERE Ort LIKE &#039;%kirche%&#039;&lt;br /&gt;
GROUP BY Region&lt;br /&gt;
ORDER BY 2 DESC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das gruppierte Feld &#039;&#039;Region&#039;&#039; und die Anzahl der Orte, die &amp;quot;kirche&amp;quot; enthalten, aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus, absteigend sortiert anhand der zweiten Spalte)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select10a&amp;quot; value=&amp;quot;SELECT Region, COUNT(*) FROM PLZ WHERE Ort LIKE &#039;%kirche%&#039; GROUP BY Region ORDER BY 2 DESC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select10b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Gruppenfunktion generierte Spalten können mit &#039;&#039;&#039;AS&#039;&#039;&#039; benannt und dadurch auch für weitere Aktionen (z.B. ORDER BY) innerhalb der selben Abfrage verwendet werden. Die folgende Abfrage stellt bereits eine eher komplexe Abfrage mit einigen Joins dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz&lt;br /&gt;
FROM PLZ, Kunde, Auftrag, Auftragspos, Buch&lt;br /&gt;
WHERE PLZ.Plz=Kunde.Plz&lt;br /&gt;
AND Kunde.Nr=Auftrag.Kundennummer&lt;br /&gt;
AND Auftrag.Nr=Auftragspos.Auftragsnummer&lt;br /&gt;
AND Auftragspos.Buchnummer=Buch.Nr&lt;br /&gt;
GROUP BY Kunde.Nr&lt;br /&gt;
ORDER BY Kunde.Nachname&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Kunde.Nr&#039;&#039;, &#039;&#039;Kunde.Nachname&#039;&#039;, &#039;&#039;PLZ.Ort&#039;&#039; und den errechneten Umsatz aus den Tabellen &#039;&#039;PLZ&#039;&#039;, &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Auftragspos&#039;&#039; und &#039;&#039;Buch&#039;&#039; aus, gruppiert das Ergebnis nach der Kundennummer und sortiert es am Nachnamen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz FROM PLZ, Kunde, Auftrag, Auftragspos, Buch WHERE PLZ.Plz=Kunde.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr GROUP BY Kunde.Nr ORDER BY Kunde.Nachname&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2=Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz=PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select12a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz=PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select12b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=222</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=222"/>
		<updated>2009-02-22T21:41:12Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll. Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; jeder Zeile in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, aufsteigend sortiert anhand der Spalten &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Vorname&#039;&#039;)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;GROUP BY&#039;&#039;&#039;-Klausel bewirkt, dass die aus einer Abfrage resultierende Tabelle in &#039;&#039;&#039;Gruppen&#039;&#039;&#039; gegliedert wird. Dazu muss in der GROUP BY-Klausel angegeben werden, nach welchem Kriterium die Gruppierung erfolgen soll. Dieses Kriterium, der &#039;&#039;&#039;Gruppierungsschlüssel&#039;&#039;&#039;, ist im einfachsten Fall ein Attribut der Ausgangstabelle. Alle Zeilen mit demselben Wert des Gruppierungsschlüssels fallen in dieselbe Gruppe. Eine Gruppe ist also nichts anderes als eine Teiltabelle. Im Ergebnis wird jede Gruppe durch die Anwendung von Gruppierungsfunktionen auf eine einzelne Zeile zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
Als typische Gruppenfunktionen gelten:&lt;br /&gt;
* COUNT&lt;br /&gt;
* SUM&lt;br /&gt;
* AVG&lt;br /&gt;
* MAX&lt;br /&gt;
* MIN&lt;br /&gt;
&lt;br /&gt;
Die Gruppenfunktionen werden analog zu gängigen Funktionen in Tabellenkalkulationsprogrammen angewandt und notiert, z.B. SUM(Auftragspos.Menge * Buch.Preis).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Region, COUNT(*)&lt;br /&gt;
FROM PLZ&lt;br /&gt;
WHERE Ort LIKE &#039;%kirche%&#039;&lt;br /&gt;
GROUP BY Region&lt;br /&gt;
ORDER BY 2 DESC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das gruppierte Feld &#039;&#039;Region&#039;&#039; und die Anzahl der Orte, die &amp;quot;kirche&amp;quot; enthalten, aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus, absteigend sortiert anhand der zweiten Spalte)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select10a&amp;quot; value=&amp;quot;SELECT Region, COUNT(*) FROM PLZ WHERE Ort LIKE &#039;%kirche%&#039; GROUP BY Region ORDER BY 2 DESC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select10b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Gruppenfunktion generierte Spalten können mit &#039;&#039;&#039;AS&#039;&#039;&#039; benannt und dadurch auch für weitere Aktionen (z.B. ORDER BY) verwendet werden. Die folgende Abfrage stellt bereits eine eher komplexe Abfrage mit einigen Joins dar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz&lt;br /&gt;
FROM PLZ, Kunde, Auftrag, Auftragspos, Buch&lt;br /&gt;
WHERE PLZ.Plz=Kunde.Plz&lt;br /&gt;
AND Kunde.Nr=Auftrag.Kundennummer&lt;br /&gt;
AND Auftrag.Nr=Auftragspos.Auftragsnummer&lt;br /&gt;
AND Auftragspos.Buchnummer=Buch.Nr&lt;br /&gt;
GROUP BY Kunde.Nr&lt;br /&gt;
ORDER BY Kunde.Nachname&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Kunde.Nr&#039;&#039;, &#039;&#039;Kunde.Nachname&#039;&#039;, &#039;&#039;PLZ.Ort&#039;&#039; und den errechneten Umsatz aus den Tabellen &#039;&#039;PLZ&#039;&#039;, &#039;&#039;Kunde&#039;&#039;, &#039;&#039;Auftrag&#039;&#039;, &#039;&#039;Auftragspos&#039;&#039; und &#039;&#039;Buch&#039;&#039; aus, gruppiert das Ergebnis nach der Kundennummer und sortiert es am Nachnamen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Nr, Kunde.Nachname, PLZ.Ort, SUM(Auftragspos.Menge*Buch.Preis) AS Umsatz FROM PLZ, Kunde, Auftrag, Auftragspos, Buch WHERE PLZ.Plz=Kunde.Plz AND Kunde.Nr=Auftrag.Kundennummer AND Auftrag.Nr=Auftragspos.Auftragsnummer AND Auftragspos.Buchnummer=Buch.Nr GROUP BY Kunde.Nr ORDER BY Kunde.Nachname&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2=Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz=PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select12a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz=PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select12b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=221</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=221"/>
		<updated>2009-02-22T19:58:39Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll. Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; jeder Zeile in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, aufsteigend sortiert anhand der Spalten &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Vorname&#039;&#039;)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde ORDER BY Nachname, Vorname ASC&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2 = Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz = PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz = PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=220</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=220"/>
		<updated>2009-02-22T19:52:12Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sortieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Selbstverständlich können die auszugebenden Datensätze im Ergebnis auch nach bestimmten Kriterien gereiht werden. Diese Sortierung geschieht durch den Zusatz &#039;&#039;&#039;ORDER BY&#039;&#039;&#039;, gefolgt von den Feldern, nach denen sortiert werden soll. Weiters kann noch bestimmt werden, ob dies aufsteigend (&#039;&#039;&#039;ASC&#039;&#039;&#039;) oder absteigend (&#039;&#039;&#039;DESC&#039;&#039;&#039;) geschehen soll.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
ORDER BY Nachname, Vorname ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gruppieren von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2 = Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz = PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select11a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz = PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select11b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=219</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=219"/>
		<updated>2009-02-22T19:38:23Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2 = Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden. Achtung: Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname &#039;&#039;PLZ&#039;&#039; genauso lautet wie das Feld &#039;&#039;Plz&#039;&#039;!&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz = PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz = PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=218</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=218"/>
		<updated>2009-02-22T15:56:33Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verbinden von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Zur Unterstützung zahlreicher Aufgaben aus dem betrieblichen Alltag werden Daten benötigt, die über mehrere Tabellen hinweg verteilt sind. Das Zusammenführen von Feldern aus mehreren Tabellen heißt auch &#039;&#039;&#039;Join&#039;&#039;&#039; und wird ebenfalls in der WHERE Komponente definiert.&lt;br /&gt;
&lt;br /&gt;
Bei Abfragen, die über mehrere Tabellen gehen, ist es ratsam, die Feldnamen in Verbindung mit dem Tabellennamen anzuführen. Aus &#039;&#039;Vorname&#039;&#039; wird &#039;&#039;Kunde.Vorname&#039;&#039;. Diese Maßnahme ist dann notwendig, wenn in ein und derselben Abfrage idente Feldbezeichnungen auftauchen. Die &#039;&#039;Kunde.Nr&#039;&#039; muss z.B. von der &#039;&#039;Artikel.Nr&#039;&#039; und diese von der &#039;&#039;Buch.Nr&#039;&#039; unterschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Die Verbindung der benötigten Tabellen erfolgt über die Schlüsselfelder. In der Regel wird ein Primärschlüssel einer Tabelle mit einem Fremdschlüssel einer weiteren Tabelle verbunden. Dazu ist es hilfreich, das normalisierte Datenmodell zu verwenden. Die gerichteten Kanten weisen den Weg der Verbindungen (Joins).&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Tabelle1.Feld1, Tabelle2.Feld1, Tabelle2.Feld2&lt;br /&gt;
FROM Tabelle1, Tabelle2&lt;br /&gt;
WHERE (Tabelle1.Feld2 = Tabelle2.Feld2)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Art der Abfrage wird dazu verwendet, um Daten aus zwei verschiedenen Tabellen zu einem Datensatz zu kombinieren. Somit wird das WHERE hier nicht mehr zur Selektion verwendet (so wie in den vorangegangenen Beispielen), sondern zur &#039;&#039;&#039;Projektion&#039;&#039;&#039; von Daten. Sobald also mit einer etwas komplexeren Datenbank mit mehreren verbundenen Tabellen gearbeitet wird, ergibt sich die Notwendigkeit, auf diese Art und Weise an die benötigten Daten zu kommen.&lt;br /&gt;
&lt;br /&gt;
Für das Beispiel wir nun eine zweite Tabelle (die Tabelle &#039;&#039;PLZ&#039;&#039;) benötigt. Die Informationen, die zu einer Postleitzahl gehören, wurden in diese ausgelagert. Die beiden Tabellen &#039;&#039;PLZ&#039;&#039; und &#039;&#039;Kunde&#039;&#039; sind über das Feld &#039;&#039;Plz&#039;&#039; verbunden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort&lt;br /&gt;
FROM Kunde, PLZ&lt;br /&gt;
WHERE (Kunde.Plz = PLZ.Plz)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt je Datensatz die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aus der Tabelle &#039;&#039;Kunde&#039;&#039; sowie das jeweils entsprechende Feld &#039;&#039;Ort&#039;&#039; aus der Tabelle &#039;&#039;PLZ&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select9a&amp;quot; value=&amp;quot;SELECT Kunde.Vorname, Kunde.Nachname, Kunde.Plz, PLZ.Ort FROM Kunde, PLZ WHERE (Kunde.Plz = PLZ.Plz)&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select9b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Felder die von den beiden Tabellen übereinstimmen müssen, wurden die Plz-Felder der beiden Tabellen gewählt. Bis jetzt haben wir in SQL Abfragen immer nur den Feldnamen selbst angeschrieben. Bei der Bedingung in der Klammer, wo aber zwei gleichnamige Felder verglichen werden, müssen auch noch die zugehörigen Tabellen angegeben werden. Man schreibt dann einfach Tabellenname.Feldname .&lt;br /&gt;
(Achtung! Bei diesem Beispiel darf man sich nicht verwirren lassen, dass der Tabellenname PLZ genauso lautet wie das Feld Plz)&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=217</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=217"/>
		<updated>2009-02-22T13:44:27Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select8a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Nachname LIKE &#039;%Muster%&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select8b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusammenführen von Tabellen ==&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=216</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=216"/>
		<updated>2009-02-22T13:43:19Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; entsprechen und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; jeder Zeile der Tabelle &#039;&#039;Kunde&#039;&#039; aus, die eine &#039;&#039;Plz&#039;&#039; zwischen 1010 und 4030 besitzt)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select7a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Plz BETWEEN 1010 AND 4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select7b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist nur ein Teil des Suchbegriffs innerhalb eines Feldes bekannt, so kann nach diesen Schlüsselwörtern gesucht werden. Das &amp;quot;%&amp;quot;-Zeichen dient als Platzhalter, welcher beliebige (und beliebig viele) Zeichen davor bzw. danach zulässt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Nachname LIKE &#039;%Muster%&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; der Datensätze in der Tabelle &#039;&#039;Kunde&#039;&#039; aus,  die im Feld Nachname &amp;quot;Muster&amp;quot; an beliebiger Stelle enthalten)&lt;br /&gt;
&lt;br /&gt;
== Zusammenführen von Tabellen ==&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=215</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=215"/>
		<updated>2009-02-22T13:24:31Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach den sogenannten Joker (das Multiplikationszeichen &amp;quot;*&amp;quot;) einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Zeit/Zahlenwerten als Bedingung ist nicht nur das &amp;quot;=&amp;quot;-Zeichen erlaubt sondern auch &amp;lt;, &amp;gt;, &amp;lt;&amp;gt;, &amp;gt;= und &amp;lt;=. Im Gegensatz zu Textwerten müssen diese dann auch nicht in einfache Klammern gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Das Auswahlverfahren könnte nun mithilfe von Boolschen Operatoren (AND, OR, NOT, usw...) verfeinert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; der Datensätze aus, die im Feld &#039;&#039;Vorname&#039;&#039; &amp;quot;Michael&amp;quot; enthalten und eine &#039;&#039;Plz&#039;&#039; kleiner 4030 besitzen)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select6a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde WHERE Vorname=&#039;Michael&#039; AND Plz&amp;lt;4030&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select6b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Plz BETWEEN 1010 AND 4030&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=208</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=208"/>
		<updated>2009-02-21T22:19:49Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== Ausgeben von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach einen * einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ausschließen von Wiederholungen ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auswählen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um bestimmte Zeilen (Datensätze) einer Tabelle auszuwählen, muss angegeben werden, welche Bedingung für diese Zeilen gelten soll. Die Bedingungen werden in der &#039;&#039;&#039;WHERE&#039;&#039;&#039;-Komponente definiert. Sie enthalten Operatoren, für die nachfolgende Reihenfolge anzuwenden ist.&lt;br /&gt;
&lt;br /&gt;
# ( )&lt;br /&gt;
# * /&lt;br /&gt;
# + -&lt;br /&gt;
# = &amp;lt;&amp;gt; &amp;gt; &amp;lt;&lt;br /&gt;
# NOT AND OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname&lt;br /&gt;
FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039; und &#039;&#039;Nachname&#039;&#039; all jener Datensätze aus, die den Vornamen &amp;quot;Michael&amp;quot; enthalten)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select5a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname FROM Kunde WHERE Vorname=&#039;Michael&#039;&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select5b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=207</id>
		<title>SQL-Grundbefehle</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Grundbefehle&amp;diff=207"/>
		<updated>2009-02-21T21:24:31Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: /* Löschen von Datensätzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die nachfolgend dargestellten Beispiele orientieren sich an der SQL-Implementierung der Datenbank [http://www.mysql.com/ mySQL].&lt;br /&gt;
&lt;br /&gt;
== Erstellen, Ändern und Füllen von Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Eine Tabelle wird mit der Anweisung &#039;&#039;&#039;CREATE TABLE&#039;&#039;&#039; erstellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE TABLE Buch&lt;br /&gt;
(Nr SMALLINT (4) PRIMARY KEY,&lt;br /&gt;
Autor VARCHAR (20) NOT NULL,&lt;br /&gt;
Titel VARCHAR (30) NOT NULL,&lt;br /&gt;
Preis DECIMAL (3,2) NOT NULL,&lt;br /&gt;
Verlag CHAR (3) NOT NULL,&lt;br /&gt;
Auslaufend TINYINT,&lt;br /&gt;
Bestand SMALLINT (4) NOT NULL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(erstellt die Tabelle &#039;&#039;Buch&#039;&#039; mit den Spalten &#039;&#039;Nr&#039;&#039;, &#039;&#039;Autor&#039;&#039;, &#039;&#039;Titel&#039;&#039;, &#039;&#039;Preis&#039;&#039;, &#039;&#039;Verlag&#039;&#039;, &#039;&#039;Auslaufend&#039;&#039; und &#039;&#039;Bestand&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Moderne RDBMS und Desktop-Datenbanken bieten benutzerfreundliche Werkzeuge zur Erstellung der Tabellen an. Diese generieren die erforderliche CREATE TABLE-Anweisung aus dem Datenmodell automatisch.&lt;br /&gt;
&lt;br /&gt;
Häufige Datentypen sind:&lt;br /&gt;
&lt;br /&gt;
* Zahlen (z.B. SMALLINT, FLOAT, DECIMAL)&lt;br /&gt;
* Datum und Uhrzeit (z.B. DATE, DATETIME, TIME)&lt;br /&gt;
* Zeichenketten (z.B. CHAR, VARCHAR, BLOB)&lt;br /&gt;
&lt;br /&gt;
NOT NULL bedeutet, dass dem betreffenden Feld ein Wert zugewiesen werden muss (Muss-Feld). Fehlt diese Komponente, kann das Feld auch &amp;quot;leer&amp;quot; bleiben (Kann-Feld).&lt;br /&gt;
&lt;br /&gt;
Unter der &#039;&#039;&#039;Domäne&#039;&#039;&#039; (Domain) eines Feldes wird der gewählte Datentyp für sowie auch die erlaubten Inhalte verstanden. Die Domäne beschreibt den erlaubten Lösungsraum eines Feldes.&lt;br /&gt;
&lt;br /&gt;
Das nachträgliche Hinzufügen einer Spalte wird mit der Anweisung &#039;&#039;&#039;ALTER TABLE&#039;&#039;&#039; bewirkt.&lt;br /&gt;
&amp;lt;pre&amp;gt;ALTER TABLE Buch&lt;br /&gt;
ADD Rabatt INT (2) NOT NULL &amp;lt;/pre&amp;gt;&lt;br /&gt;
(fügt der Tabelle &#039;&#039;Buch&#039;&#039; die Spalte &#039;&#039;Rabatt&#039;&#039; hinzu)&lt;br /&gt;
&lt;br /&gt;
Die manuelle Eingabe eignet sich nicht für Massendaten, weshalb DBMS formularorientierte Anwendungen zur direkten Eingabe der Datensätze bieten. Software für betriebliche Anwendungen nutzt die eingebetteten Datenbankschnittstellen.&lt;br /&gt;
&lt;br /&gt;
== Einfügen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Das Eintragen von Daten funktioniert mit &#039;&#039;&#039;INSERT&#039;&#039;&#039;. Nach INTO wird wieder die Tabelle angegeben und diesesmal zusätzlich in Klammer auch die Felder, in die Daten eingefügt werden sollen. Die einzufügenden Werte stehen dann nach VALUES in der zweiten Klammer.&lt;br /&gt;
&amp;lt;pre&amp;gt;INSERT INTO Kunde (Vorname, Nachname, Strasse, Plz)&lt;br /&gt;
VALUES (&#039;Maria&#039;, &#039;Santa&#039;, &#039;Columbusstrasse 1492&#039;, 2034)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(erstellt in der Tabelle &#039;&#039;Kunde&#039;&#039; einen Datensatz und befüllt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039;, &#039;&#039;Strasse&#039;&#039; und &#039;&#039;Plz&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Werden alle Felder befüllt, so müssen diese nicht explizit angeführt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;INSERT INTO Buch&lt;br /&gt;
VALUES (5145, &#039;Hofer&#039;, &#039;Datenbankmodelle&#039;, 21,50, &#039;obv&#039;, &#039;n&#039;, 250)&amp;lt;/pre&amp;gt;&lt;br /&gt;
(erstellt in der Tabelle &#039;&#039;Buch&#039;&#039; einen Datensatz mit den angegebenen Werten)&lt;br /&gt;
&lt;br /&gt;
Die Syntax ist recht unkompliziert. Beachtet werden muss nur, dass die Anzahl der Spalten mit den Werten übereinstimmt. Die Spaltennamen in der ersten Klammer müssen auch nur dann angegeben werden, wenn nicht alle Spalten mit Werten gefüllt werden. Dies ist z.B. bei unserer Beispieltabelle “Kunde” der Fall wo in das ID-Feld nichts eingetragen werden kann, da es von der Datenbank automatisch ausgefüllt wird (ein sogenanntes Auto-Increment Feld).&lt;br /&gt;
&lt;br /&gt;
== Löschen von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Wie auch bei der SELECT-Anweisung (siehe [[SQL-Abfragen]]) wird bei &#039;&#039;&#039;DELETE&#039;&#039;&#039; die Bedingung WHERE zur Auswahl des zu löschenden Datensatzes bestimmt. Normalerweise erfolgt dies durch die gezielte Angabe der ID-Nummer des betreffenden Datensatzes.&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE ID=4&amp;lt;/pre&amp;gt;&lt;br /&gt;
(löscht den Datensatz mir der ID &amp;quot;4&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Ergibt die Bedingung eine Übereinstimmung in mehreren Datensätzen, so werden alle selektierten gelöscht.&lt;br /&gt;
&amp;lt;pre&amp;gt;DELETE FROM Kunde&lt;br /&gt;
WHERE Vorname=&#039;Michael&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(löscht alle Datensätze mit dem Vornamen &amp;quot;Michael&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Ändern von Datensätzen ==&lt;br /&gt;
&lt;br /&gt;
Um Daten in einem Datensatz zu erneuern ist es nicht zwangsweise notwendig, diesen zuerst zu löschen und dann neu anzulegen. Hierfür bietet SQL die Möglichkeit, dies mit &#039;&#039;&#039;UPDATE&#039;&#039;&#039; zu tun. Auch hier wird die Bedingung WHERE benötigt, um den passenden Datensatz zu finden. Mit SET wird dann die Änderung selbst vorgenommen.&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Mayer&#039;&lt;br /&gt;
WHERE ID=4&amp;lt;/pre&amp;gt;&lt;br /&gt;
(ändert im Datensatz mit der ID &amp;quot;4&amp;quot; den Nachnamen auf &amp;quot;Mayer&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Wiederum können natürlich auch mehrere Datensätze gleichzeitig mit der UPDATE Anweisung geändert werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Nachname=&#039;Neumayer&#039;&lt;br /&gt;
WHERE Nachname=&#039;Mayer&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
(ändert in jedem Datensatz, welcher den Nachnamen &amp;quot;Mayer&amp;quot; vorweist, selbigen auf &amp;quot;Neumayer&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Nicht nur eine Spalte lässt sich in mehreren Datensätzen auf einmal ändern, sondern auch mehrere Felder in einem Datensatz.&lt;br /&gt;
&amp;lt;pre&amp;gt;UPDATE Kunde&lt;br /&gt;
SET Plz=4055, Strasse=&#039;Pinselweg 12&#039;&lt;br /&gt;
WHERE ID=1&amp;lt;/pre&amp;gt;&lt;br /&gt;
(ändert im Datensatz mit der ID &amp;quot;1&amp;quot; die PLZ auf &amp;quot;4055&amp;quot; und die Straße auf &amp;quot;Pinselweg 12&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Sonstige Anweisungen ==&lt;br /&gt;
&lt;br /&gt;
Die Anweisungen INSERT, DELETE und UPDATE gehören zu den wichtigsten in SQL und gehören zur Gruppe der &#039;&#039;&#039;Data Manipulation Language&#039;&#039;&#039; (&#039;&#039;&#039;DML&#039;&#039;&#039;). Daneben gibt es noch eine Vielzahl anderer Möglichkeiten, Datenbanken mit SQL zu bearbeiten. Mit AVG(&#039;&#039;Zahl&#039;&#039;) kann z.B. sofort der Mittelwert aus einer Reihe von Datensätzen mit numerischen Inhalten ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Man sieht, die Möglichkeiten sind sehr groß. Diese alle hier zu behandeln wäre für eine Einführung zuviel des Guten. Nicht umsonst sind bereits ganze Bücher über SQL geschrieben worden, die sich ausführlich mit dem Thema auseinandersetzen.&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
	<entry>
		<id>https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=206</id>
		<title>SQL-Abfragen</title>
		<link rel="alternate" type="text/html" href="https://mussswiki.idb.edu/iv1wiki/index.php?title=SQL-Abfragen&amp;diff=206"/>
		<updated>2009-02-21T20:56:41Z</updated>

		<summary type="html">&lt;p&gt;ReinhardJoechtl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine SQL-Datenbank kann mit der &#039;&#039;&#039;SELECT&#039;&#039;&#039;-Anweisung abgefragt werden, wenn die entsprechenden Zugriffsrechte vorliegen. Nachfolgende Beispiele beziehen sich auf die Implementierung des bei den [[Normalformen]] dargestellten Modells in einem SQL-Trainingsserver, welche als interpretierende Maschine unter [http://sql.idv.edu/ http://sql.idv.edu] erreichbar ist. Die Zugriffsrechte auf die Lehr- und Übungsdatenbank erlauben lediglich die Anwendungen von Abfragen mit der SELECT-Anweisung. Um das Antwortzeitverhalten besonders in Prüfungszeiten zu verbessern, wurde die Ausgabe der Treffer auf 500 Datensätze begrenzt.&lt;br /&gt;
&lt;br /&gt;
== SELECT ==&lt;br /&gt;
&lt;br /&gt;
Mit dem SELECT-Schlüsselwort lassen sich bestimmte Datensätze aus einer Datenbank auslesen, die dann später anderwärtig (z.B. durch eine Script- oder Programiersprache) weiterverarbeitet werden. Als Beispieltabelle kommt hier die Tabelle &#039;&#039;Kunde&#039;&#039; (und später auch die Tabelle &#039;&#039;PLZ&#039;&#039;) aus der Buchhandlungs-Datenbank zum Einsatz.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt jeweils das Feld &#039;&#039;Vorname&#039;&#039; eines jeden Datensatzes der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select1a&amp;quot; value=&amp;quot;SELECT Vorname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select1b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um mehrere Spalten auflisten zu lassen, müssen diese (mit Komma getrennt) in der Abfrage angegeben werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT Vorname, Nachname, Plz&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt die Spalten &#039;&#039;Vorname&#039;&#039;, &#039;&#039;Nachname&#039;&#039; und &#039;&#039;Plz&#039;&#039; aller Datensätze der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select2a&amp;quot; value=&amp;quot;SELECT Vorname, Nachname, Plz FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select2b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oft ist aber unbekannt, wie alle Felder in einer Tabelle heißen. In so einem Fall, oder um einfach alle Felder in die Abfrage einzubeziehen, kann man anstatt der Spalten einfach einen * einsetzen.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT *&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt alle Spalten jedes Datensatzes in der Tabelle &#039;&#039;Kunde&#039;&#039; aus)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select3a&amp;quot; value=&amp;quot;SELECT * FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select3b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DISTINCT ==&lt;br /&gt;
&lt;br /&gt;
Öfters kommt es nun vor, dass Inhalte gewisser Spalten mehrfach in den Datensätzen vorkommen. Soll z.B. eine Liste aller Nachnamen erstellt werden, so könnte es durchaus passieren, dass mehrere Personen in der Tabelle den selben Nachnamen haben. Damit jeder Nachname aber wirklich nur einmal vorkommt wird der Term &#039;&#039;&#039;DISTINCT&#039;&#039;&#039; hinter SELECT gestellt.&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT DISTINCT Nachname&lt;br /&gt;
FROM Kunde&amp;lt;/pre&amp;gt;&lt;br /&gt;
(gibt das Feld &#039;&#039;Nachname&#039;&#039; aus, wobei aber keine Duplikate angezeigt werden)&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;http://sql.idv.edu/thema/work/sql.php&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;select4a&amp;quot; value=&amp;quot;SELECT DISTINCT Nachname FROM Kunde&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;select4b&amp;quot; value=&amp;quot;Ausführen&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/div&gt;</summary>
		<author><name>ReinhardJoechtl</name></author>
	</entry>
</feed>