faecher:informatik:oberstufe:datenbanken:sql_gruppierungen:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Letzte ÜberarbeitungBeide Seiten der Revision
faecher:informatik:oberstufe:datenbanken:sql_gruppierungen:start [20.10.2020 16:02] – [SQL – Gruppierungen] sbelfaecher:informatik:oberstufe:datenbanken:sql_gruppierungen:start [18.01.2022 15:05] – [Tabelle] sbel
Zeile 1: Zeile 1:
 ====== SQL – Gruppierungen ====== ====== SQL – Gruppierungen ======
 +
 +===== Was sind Gruppierungen? =====
 +
  
 Datensätze, die in einer Spalte oder mehreren Spalten die gleichen Werte aufweisen, können mithilfe des GROUP BY-Zusatzes in Gruppen zusammengefasst werden. Gruppierungen machen vor allem dann Sinn, wenn innerhalb der Gruppen mit den Spaltenwerten gerechnet wird, z.B. wenn die Gesamtzahl aller Artikel einer bestimmten Preiskategorie ermittelt werden soll. Datensätze, die in einer Spalte oder mehreren Spalten die gleichen Werte aufweisen, können mithilfe des GROUP BY-Zusatzes in Gruppen zusammengefasst werden. Gruppierungen machen vor allem dann Sinn, wenn innerhalb der Gruppen mit den Spaltenwerten gerechnet wird, z.B. wenn die Gesamtzahl aller Artikel einer bestimmten Preiskategorie ermittelt werden soll.
Zeile 8: Zeile 11:
 |                                                                          | ''SELECT APreis,SUM(ABestand)''\\ ''FROM artikel''\\ ''GROUP BY APreis''\\ ''ORDER BY APreis ASC''  | |                                                                          | ''SELECT APreis,SUM(ABestand)''\\ ''FROM artikel''\\ ''GROUP BY APreis''\\ ''ORDER BY APreis ASC''  |
 |                                                                          | {{ .:auswahl_005.png }}                             | |                                                                          | {{ .:auswahl_005.png }}                             |
- 
- 
  
 Alle Artikel mit dem Preis von 1,00 Euro werden durch die Gruppierung auf einen Datensatz "projiziert" Alle Artikel mit dem Preis von 1,00 Euro werden durch die Gruppierung auf einen Datensatz "projiziert"
Zeile 18: Zeile 19:
 Genau genommen ist die Verwendung der Wildcard ''*'' zur Auswahl aller Spalten in Kombination mit GROUP BY nur bedingt sinnvoll, da diejenigen Spalten, nach denen nicht gruppiert wird, unterschiedliche Werte aufweisen können. Das Beispiel in Tabelle 1 zeigt, dass in einem solchen Fall die Werte eines (beliebigen) Datensatzes der Gruppe in diesen Spalten angezeigt wird. Genau genommen ist die Verwendung der Wildcard ''*'' zur Auswahl aller Spalten in Kombination mit GROUP BY nur bedingt sinnvoll, da diejenigen Spalten, nach denen nicht gruppiert wird, unterschiedliche Werte aufweisen können. Das Beispiel in Tabelle 1 zeigt, dass in einem solchen Fall die Werte eines (beliebigen) Datensatzes der Gruppe in diesen Spalten angezeigt wird.
 Bei restriktiverer Einstellung des Datenbanksystems müsste die Auswahl von Spalten, nach denen nicht gruppiert wird, eine Fehlermeldung liefern. Bei restriktiverer Einstellung des Datenbanksystems müsste die Auswahl von Spalten, nach denen nicht gruppiert wird, eine Fehlermeldung liefern.
 +
 +===== Mehrere Gruppen =====
 +
  
 Man kann auch gleichzeitig nach mehreren Merkmalen gruppieren, indem man einen Ausdruck der Form Man kann auch gleichzeitig nach mehreren Merkmalen gruppieren, indem man einen Ausdruck der Form
Zeile 25: Zeile 29:
 </code> </code>
  
-verwendet. Hier werden die Verkäufe nach Jahr, Land und Produkt gruppiert (vgl. Aufgabe (3)).+verwendet. Hier werden die Verkäufe nach Jahr, Land und Produkt gruppiert.
  
 +===== Aliase für Tabellenspalten =====
  
-===== Aufgaben =====+Manchmal ist es praktisch, Tabellenspalten, Tabellen oder Berechnungen von Gruppierungen über einen Alias für das weitere SQL Statement nutzbar zu machen. Dafür dient das Schlüsselwort ''AS''.
  
-Löse die folgenden Aufgaben im SQL-Abfragefenster von phpMyAdmin auf der Datenbank webshop und speichere deine Lösungen in einer Textdatei oder deinem Info-Heft.+<code sql> 
 +SELECT KundenID AS ID, KundenName AS Name 
 +FROM Kunden WHERE Name LIKE '%er'; 
 +</code> 
 + 
 +Damit entstehen die "temporären" Tabellenspaltenaliase ''ID'' und ''Name'', die im Statement verwendet werden können. Damit kann man die Länge von SQL Statements verkürzen oder den Abfragen mehr Bedeutung geben, indem man die Aliase geschickt benenntDie Tabellenstruktur wird dadurch nicht verändert. 
 + 
 +So kann man auch Berechnungen mit "sprechenden" Aliasen versehen, was die Lesbarkeit erhöht: 
 + 
 +<code sql> 
 +SELECT AngestelltenID AS ID, AVG(AngestelltenGehalt) AS Durchschnittsgehalt 
 +FROM Mitarbeiter WHERE Angestelltengehalt > 2000 GROUP BY Abteilung; 
 +</code> 
 + 
 + 
 + 
 + 
 +===== Aufgaben =====
  
 +Löse die folgenden Aufgaben im SQL-Abfragefenster von phpMyAdmin und speichere deine Lösungen in einer Textdatei oder deinem Info-Heft.
 ---- ----
 {{:aufgabe.png?nolink  |}} {{:aufgabe.png?nolink  |}}
 === (A1) === === (A1) ===
 +
 +Was erfragen die beiden SQL Abfragen im Abschnitt zum Thema Aliase? Welche Rückschlüsse lässt das auf die Struktur der Tabellen zu?
 +
 +---- 
 +
 +Importiere die Tabellen der Datenbank {{ :faecher:informatik:oberstufe:datenbanken:sql_abfrage:webshop.sql.zip |}} in deine Datenbank, um die folgenden Aufgaben zu lösen. Verwende, wo nötig Aliase.
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A2) ===
  
 Neben der Summenfunktion gibt es weitere Berechnungsfunktionen für zahlenwertige Spalten. Vervollständige die folgende Tabelle unter Verwendung folgender SQL-Abfrage: Neben der Summenfunktion gibt es weitere Berechnungsfunktionen für zahlenwertige Spalten. Vervollständige die folgende Tabelle unter Verwendung folgender SQL-Abfrage:
Zeile 46: Zeile 79:
  
  
-^Funktion ^ Bedeutung ^ Wert in Gruppe ''APreis=9.99''+^ Funktion  ^ Bedeutung  ^ Wert in Gruppe ''APreis=9.99''  
-| AVG       | AVG(ABestand)= | +| AVG                  | AVG(ABestand)=                  
-| COUNT     | COUNT(ABestand)= | +| COUNT                | COUNT(ABestand)=                
-| MAX       | MAX(ABestand)= | +| MAX                  | MAX(ABestand)=                  
-| MIN       | MIN(ABestand)= | +| MIN                  | MIN(ABestand)=                  
-| SUM       | SUM(ABestand)= |+| SUM                  | SUM(ABestand)=                  |
  
  
 ---- ----
 {{:aufgabe.png?nolink  |}} {{:aufgabe.png?nolink  |}}
-=== (A2) ===+=== (A3) === 
  
 (i) Gib den jeweiligen Gesamtbestand der Artikel in den verschiedenen Preiskategorien unter 10,00EUR an. (i) Gib den jeweiligen Gesamtbestand der Artikel in den verschiedenen Preiskategorien unter 10,00EUR an.
Zeile 70: Zeile 104:
 </code> </code>
      
-(iv) Informiere dich über die ''HAVING''-Bedingung und löse  damit Teilaufgabe (2) erneut. Erläutere den Unterschied zwischen ''WHERE'' und ''HAVING''.+(iv) Informiere dich über die ''HAVING''-Bedingung und löse damit Teilaufgabe (i) erneut. Erläutere den Unterschied zwischen ''WHERE'' und ''HAVING''
  
 (v) Gib alle Preiskategorien aus, in denen der maximal erzielbare Umsatz über 3.000,00 Euro liegt. Ist die Aufgabe auch mittels ''WHERE'' anstelle von ''HAVING'' lösbar? (v) Gib alle Preiskategorien aus, in denen der maximal erzielbare Umsatz über 3.000,00 Euro liegt. Ist die Aufgabe auch mittels ''WHERE'' anstelle von ''HAVING'' lösbar?
Zeile 76: Zeile 110:
  
 ([[.lsg:start|Lösungen]]) ([[.lsg:start|Lösungen]])
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A4) ===
 +
 +Arbeite nun wieder mit unserer Adressdatenbank, verwende, wo nötig Aliase.
 +
 +  - Gib die Zahl der Personen an, die in den verschiedenen Kundenkategorien sind. 
 +  - Welche durchschnittliche Bonuspunktzahl haben die Mitglieder der verschiedenen Kunden-Kategorien? 
 +  - Gruppiere die Adressliste nach Kunden-Kategorien und Bonuspunkte (In einer Gruppe sollen also alle Datensätze sein, die dieselbe Kundenkategorie und dieselbe Bonunspunktzahl haben). Gibt auf diese Weise die Zahl der Personen in der jeweiligen Gruoppe, die Kategorie und die Zahl der Bonuspunkte aus.
 +  - Gib bei der vorherigen Abfrage nur die Gruppen aus, die mehr als ein Mitglied haben. Geht das mit einem ''WHERE'' Statement?
 +  - Erzeuge eine Liste mit der Zahl der Gold-Kunden mit mehr als 1000 Bonuspunkten gruppiert nach Stadt, absteigend sortiert nach der Zahl der Bonuspunkte.
 +  - Erzeuge eine Liste mit der Zahl aller Kunden, die keine leere Kundenkategorie haben mit mehr als 1000 Bonuspunkten gruppiert nach Stadt und Kategorie, absteigend sortiert nach der Zahl der gesamten Bonuspunkte für die jeweilige Gruppe.
 +
 +==== Material ====
 +
 +
 +{{simplefilelist>:faecher:informatik:oberstufe:datenbanken:sql_gruppierungen:*}}