10th Jan 2024 24 Leseminuten Grundlegende SQL-Abfragen online üben: 20 Übungen für Einsteiger Tihomir Babic SQL-Übungen Inhaltsverzeichnis SQL-Abfrage-Übung Datensatz Übung #1: Anzeigen der Enddaten aller Ereignisse und der Windpunkte Übung #2: Zeige alle Endrunden, bei denen der Wind über 0,5 Punkte lag Übung #3: Zeige alle Daten für alle Marathons Übung #4: Alle Endergebnisse für Nicht-Plazierungsläufer anzeigen Übung Nr. 5: Alle Ergebnisdaten für nicht gestartete Läufer anzeigen Übung Nr. 6: Namen für Männer-Disziplinenläufe unter 500 Meter anzeigen Übung #7: Sortieren von Ländernamen und Abkürzungen Übung Nr. 8: Sortieren der Vor- und Nachnamen der Athleten Übung #9: Sortieren der Endergebnisse über drei Stunden Übung #10: Zeige die Namen und Orte der Top 3 Athleten Übung #11: Alle Marathons mit dem Namen des Wettkampfs, dem Jahr des Wettkampfs und dem Namen der Disziplin anzeigen Übung #12: Zeige Mo Farahs Ergebnisse für alle Disziplinen Übung #13: Zeigen Sie die Namen der Wettbewerbe und die Anzahl der Wettkämpfe an Übung #14: Zeige die beliebtesten Sportlernamen Übung #15: Zeige jedes Land und die Anzahl der Athleten, die ohne Platzierung ins Ziel gekommen sind Übung Nr. 16: Berechnen Sie die durchschnittliche Geschwindigkeit für jeden Lauf Beispiel #17: Alle überdurchschnittlich schnellen Zeiten für 1.500-Meter-Läufe finden Übung #18: Finden Sie alle Athleten, die an mindestens zwei Wettkämpfen teilgenommen haben Übung Nr. 19: Läufer anzeigen, die nur als Erste ins Ziel gekommen sind Übung #20: Finde alle Athleten, die nicht gestartet sind und mindestens einmal gewonnen haben Von der grundlegenden SQL-Abfragepraxis zum SQL-Meister Diese 20 Übungen sind genau das, was Anfänger zum Üben von SQL-Abfragen brauchen. Versuchen Sie, jede einzelne Aufgabe zu lösen, und sehen Sie sich die Lösungen an. Wenn etwas zu klären ist, gibt es Erklärungen zu jeder Lösung. In diesem Artikel wird weniger geredet als sonst. Stattdessen werden Sie die Antworten auf die SQL-Übungsfragen schreiben. (Keine Sorge, wir haben die Lösungen beigefügt, falls Sie nicht weiterkommen.) Der Sinn des Ganzen ist, Ihnen als Anfänger reichlich Gelegenheit zu geben, SQL-Abfragen zu üben. Ich habe zwanzig Beispiele aus unserem Grundlegende SQL-Praxis: Führe Abfragen durch! ausgewählt. Wenn Sie am Ende des Artikels das Gefühl haben, dass Sie mehr üben müssen - und das empfehle ich Ihnen von ganzem Herzen -, finden Sie in diesem Kurs fast 100 weitere interaktive SQL-Übungen. Sie behandeln Themen wie die Abfrage einer Tabelle, die Verwendung von JOINs, das Sortieren von Daten mit ORDER BY, das Aggregieren von Daten und die Verwendung von GROUP BY, den Umgang mit NULLs, das Ausführen mathematischer Operationen und das Schreiben von Unterabfragen. Dies sind alles Themen, die jeder SQL-Anfänger gut kennen sollte, bevor er sich den komplexeren Themen zuwendet. Der beste Weg, etwas über SQL zu lernen, ist, ständig eigenen Code zu schreiben. Auf diese Weise beherrschen Sie die SQL-Syntax und ihre grundlegenden Funktionen, und Sie lernen, Probleme zu lösen. Schließlich geht es bei der Kenntnis von SQL darum, wie man Daten zur Lösung von Problemen nutzen kann. Und Sie können sogar noch weiter gehen! Wir haben den SQL-Praxis Track und den monatlichen SQL-Praxis Kurs für noch mehr SQL-Abfragepraxis. Lassen Sie uns also direkt in die SQL-Praxis eintauchen und mit dem Datensatz beginnen. Datensatz Übung #1: Zeige die Endtermine aller Ereignisse und die Windpunkte Übung Nr. 2: Alle Finaldaten anzeigen, bei denen der Wind über 0,5 Punkte lag Übung Nr. 3: Alle Daten für alle Marathons anzeigen Übung Nr. 4: Alle Endergebnisse für Nicht-Plazierungsläufer anzeigen Übung #5: Zeige alle Ergebnisdaten für nicht startende Läufer Übung #6: Namen für Männer-Disziplinenläufe unter 500 Meter anzeigen Übung #7: Sortieren von Ländernamen und Abkürzungen Übung #8: Vor- und Nachnamen der Athleten sortieren Übung Nr. 9: Sortieren der Endergebnisse über drei Stunden Übung #10: Zeige die Namen und Platzierungen der Top 3 Athleten Übung #11: Zeige alle Marathons mit Wettkampfname, Wettkampfjahr und Disziplinbezeichnung Übung #12: Zeige Mo Farahs Ergebnisse für alle Disziplinen Übung #13: Zeige die Namen der Wettkämpfe und die Anzahl der Veranstaltungen Übung #14: Zeigen Sie die beliebtesten Namen der Athleten Übung #15: Zeige jedes Land und die Anzahl der Athleten, die ohne Platzierung ins Ziel gekommen sind Übung #16: Berechnen Sie die Durchschnittsgeschwindigkeit für jeden Lauf Beispiel #17: Finde alle überdurchschnittlich schnellen Zeiten für 1.500-Meter-Läufe Übung Nr. 18: Finden Sie alle Athleten, die in mindestens zwei Disziplinen eines Wettkampfes gestartet sind. Übung Nr. 19: Zeige Läufer, die nur den ersten Platz belegt haben Übung Nr. 20: Alle Athleten finden, die nicht gestartet sind und mindestens einmal gewonnen haben SQL-Abfrage-Übung Datensatz Das Dataset enthält Daten über die Finals von Leichtathletik-Wettbewerben bei verschiedenen Meisterschaften: Olympische Spiele in Rio de Janeiro 2016, IAAF Leichtathletik-Weltmeisterschaften in London 2017 und IAAF Leichtathletik-Weltmeisterschaften in Doha 2019. Die Daten werden in sechs Tabellen gespeichert: competition, event, discipline, final_result, athlete, und nationality. Das Schema ist unten dargestellt: Die Wettbewerbsinformationen werden in der Tabelle competition. Sie hat die folgenden Spalten: id - Die ID des Wettbewerbs und der Primärschlüssel der Tabelle. name - Der Name des Wettkampfs. start_date - Der erste Tag des Wettbewerbs. end_date - Der letzte Tag des Wettbewerbs. year - Das Jahr, in dem der Wettbewerb stattfand. location - Der Ort des Wettkampfs. Hier sind die Daten aus der Tabelle. idnamestart_dateend_dateyearlocation 7093747Rio de Janeiro Olympic Games2016-08-122016-08-212016Estádio Olímpico, Rio de Janeiro (BRA) 7093740London IAAF World Championships in Athletics2017-08-042017-08-132017Olympic Stadium, London (GBR) 7125365IAAF World Championships in Athletics2019-09-272019-10-062019Khalifa International Stadium, Doha (QAT) Die Tabelle discipline enthält Informationen für alle Laufdisziplinen. Sie hat diese Spalten: id - Die ID der Disziplin und der Primärschlüssel der Tabelle. name - Der Name der Disziplin. is_men - TRUE, wenn es sich um eine Männerdisziplin handelt, FALSE, wenn es sich um eine Frauendisziplin handelt. distance - Die Distanz der Disziplin, in Metern. Dies ist ein Schnappschuss der ersten fünf Zeilen der Daten: idnameis_mendistance 1Men's 100mTRUE100 2Men's 200mTRUE200 3Men's 400mTRUE400 4Men's 800mTRUE800 5Men's 1500mTRUE1,500 Die nächste Tabelle ist " Ereignis", in der Informationen über jedes einzelne Ereignis gespeichert werden: id - Die ID des Ereignisses und der Primärschlüssel der Tabelle. competition_id - Verknüpft das Ereignis mit einem Wettkampf. discipline_id - Verknüpft das Ereignis mit einer Disziplin. final_date - Wann das Finale dieses Ereignisses stattgefunden hat. wind - Die Windpunkte während des Finales. Hier sind die ersten fünf Zeilen dieser Tabelle: idcompetition_iddiscipline_idfinal_datewind 1709374712016-08-140.2 2709374722016-08-18-0.5 3709374732016-08-140 4709374742016-08-150 5709374752016-08-200 Die Daten zu jedem Athleten befinden sich in der Tabelle athlete: id - Die ID des Athleten und der Primärschlüssel der Tabelle. first_name - Der Vorname des Athleten. last_name - Der Nachname des Athleten. nationality_id - Die Nationalität des Athleten. birth_date - Das Geburtsdatum des Athleten. Dies sind die ersten fünf Zeilen: idfirst_namelast_namenationality_idbirth_date 14201847UsainBOLT11986-08-21 14238562JustinGATLIN21982-02-10 14535607AndréDE GRASSE31994-11-10 14201842YohanBLAKE11989-12-26 Die Tabelle nationality Tabelle enthält Länderinformationen: id - Die ID des Landes und den Primärschlüssel der Tabelle. country_name - Der Name des Landes. country_abbr - Die aus drei Buchstaben bestehende Abkürzung des Landes. Hier ist ein fünfzeiliger Schnappschuss dieser Tabelle: idcountry_namecountry_abbr 1JamaicaJAM 2United StatesUSA 3CanadaCAN 4South AfricaRSA 5Côte d’IvoireCIV Die letzte Tabelle ist final_result. Sie enthält Informationen über die Teilnehmer und ihre Ergebnisse bei einer bestimmten Veranstaltung: event_id - Die Veranstaltungs-ID. athlete_id - Die des Athleten result - Die Zeit/Punktzahl des Athleten (kann NULL sein). place - Die vom Athleten erreichte Platzierung (kann NULL sein). is_dsq - TRUE wenn eineDisqualifikationerfolgte. is_dnf - TRUE, wenn der Athlet den Lauf nicht beendet hat. is_dns - TRUE, wenn der Athlet den Lauf nicht begonnen hat. Hier ist der Schnappschuss: event_idathlete_idresultplaceis_dsqis_dnsis_dnf 1142018470:00:101FALSEFALSEFALSE 1142385620:00:102FALSEFALSEFALSE 1145356070:00:103FALSEFALSEFALSE 1142018420:00:104FALSEFALSEFALSE 1144177630:00:105FALSEFALSEFALSE Nachdem Sie nun einen guten Blick auf den Datensatz geworfen haben, beginnen wir mit der Übung der grundlegenden SQL-Abfragen! Für alle Übungen werden Sie SQL-Kenntnisse benötigen. Stellen Sie also sicher, dass Sie alle grundlegenden Elemente einer SQL-Abfrage kennen. Übung #1: Anzeigen der Enddaten aller Ereignisse und der Windpunkte Übung: Finden Sie die Endtermine aller Ereignisse und die Windpunkte. Lösung: SELECT final_date, wind FROM event; Erläuterung: Die Daten, die Sie benötigen, befinden sich in der Tabelle Ereignis. Daraus müssen Sie zwei Spalten auswählen: final_date und wind. Dazu schreiben Sie die erste Spalte in die Anweisung SELECT. Danach schreiben Sie den Namen der zweiten Spalte und trennen die Spaltennamen durch ein Komma. Schließlich referenzieren Sie die Tabelle in der FROM -Klausel. Ausgabe: final_datewind 2016-08-140.2 2016-08-18-0.5 2016-08-140 2016-08-150 2016-08-200 Übung #2: Zeige alle Endrunden, bei denen der Wind über 0,5 Punkte lag Übung: Zeigen Sie alle Finaldaten an, bei denen der Wind stärker als 0,5 Punkte war. Lösung: SELECT final_date FROM event WHERE wind > 0.5; Erläuterung: Wählen Sie zunächst die Spalte final_date aus der Tabelle event. Damit erhalten Sie eine Liste aller Endrunden. Sie benötigen jedoch nicht die gesamte Liste, sondern nur die Endrunden, bei denen der Wind stärker als 0,5 war. Daher müssen Sie die Daten mit der Klausel WHERE filtern. Darin geben Sie den Namen der Spalte an, die Sie filtern möchten; in diesem Fall ist es die Spalte wind. Um den Wind über 0,5 zu erhalten, verwenden Sie den logischen Operator "größer als" (>). Ausgabe: final_date 2017-08-11 2019-09-28 2019-10-02 Übung #3: Zeige alle Daten für alle Marathons Übung: Zeigen Sie die Disziplindaten für alle Marathons an. Lösung: SELECT * FROM discipline WHERE name LIKE '%Marathon%'; Erläuterung: Um alle Spalten auszuwählen, müssen Sie deren Namen nicht explizit schreiben. Es gibt ein Kürzel für "alle Spalten", das Sternchen (*). Anstelle der Spaltennamen setzen Sie einfach ein Sternchen in SELECT ein. Wenn Sie dann Daten aus der Tabelle disciplinebenötigen, verweisen Sie auf diese in FROM. Schließlich müssen Sie die Daten filtern. Verwenden Sie WHERE und den LIKE-Operator. Dieser Operator durchsucht die Textdaten in der Spalte und gibt alle Zeilen zurück, die den Text in der Bedingung WHERE enthalten. Mit anderen Worten: Die Bedingung sucht nach dem Wort "Marathon". Sie müssen das Wort in einfache Anführungszeichen setzen. Sie kennen jedoch nicht den genauen Namen der Disziplin; Sie wissen nur, dass er dieses Wort enthalten muss. Es kann an beliebiger Stelle im Namen der Disziplin stehen: am Anfang, in der Mitte oder am Ende. Um eine beliebige Stelle in der Zeichenkette zu suchen, setzen Sie den Operator modulo (%) vor und hinter das gesuchte Wort. Ausgabe: idnameis_mendistance 8Men's MarathonTRUE42,195 16Women's MarathonFALSE42,195 Übung #4: Alle Endergebnisse für Nicht-Plazierungsläufer anzeigen Übung: Zeigen Sie alle Daten für die Endergebnisse der Läufer an, die sich nicht platziert haben. Lösung: SELECT * FROM final_result WHERE place IS NULL; Erläuterung: Sie benötigen alle Spalten, also verwenden Sie ein Sternchen in SELECT und verweisen auf die Tabelle final_result in FROM. Sie müssen nur die Ergebnisse anzeigen, bei denen die Läufer ohne Platzierung geblieben sind. Auch dieses Mal verwenden Sie WHERE und filtern nach der Spalte place. Wenn ein Läufer ohne Platzierung endet, dann ist die Spalte place leer (d.h. NULL). Sie benötigen den Operator IS NULL nach dem Spaltennamen, um alle diese Zeilen zurückzugeben. Bevor Sie den IS NULL Operator verwenden, sollten Sie wissen, was NULL in SQL bedeutet . Ausgabe: event_idathlete_idresultplaceis_dsqis_dnsis_dnf 614464221NULLNULLTRUEFALSEFALSE 714530623NULLNULLFALSEFALSETRUE 714573513NULLNULLFALSEFALSETRUE 814167397NULLNULLFALSEFALSETRUE 814177784NULLNULLFALSEFALSETRUE Übung Nr. 5: Alle Ergebnisdaten für nicht gestartete Läufer anzeigen Übung: Zeigen Sie alle Ergebnisdaten von Läufern an, die den Lauf gar nicht gestartet haben. Lösung: SELECT * FROM final_result WHERE is_dns IS TRUE; Erläuterung: Markieren Sie alle Spalten in der Tabelle final_result mit einem Sternchen aus und referenzieren Sie die Tabelle in FROM. Dann verwenden Sie WHERE und filtern die Spalte nach is_dns. Wenn der Läufer nicht am Rennen teilgenommen hat, wird diese Spalte den Wert TRUE haben. Sie müssen also den Operator IS TRUE nach dem Spaltennamen verwenden. Ausgabe: Hier ist die gesamte Ausgabe: event_idathlete_idresultplaceis_dsqis_dnsis_dnf 1414451797NULLNULLFALSETRUEFALSE 1614296979NULLNULLFALSETRUEFALSE 1914176330NULLNULLFALSETRUEFALSE 2214367867NULLNULLFALSETRUEFALSE 2414219653NULLNULLFALSETRUEFALSE 2414225279NULLNULLFALSETRUEFALSE 3214751813NULLNULLFALSETRUEFALSE 4114291986NULLNULLFALSETRUEFALSE Übung Nr. 6: Namen für Männer-Disziplinenläufe unter 500 Meter anzeigen Übung: Zeigen Sie nur die Namen der Männer-Disziplinen an, bei denen die zu laufende Distanz weniger als 500 Meter beträgt. Lösung: SELECT name FROM discipline WHERE is_men IS TRUE AND distance < 500; Erläuterung: Wählen Sie zunächst den Spaltennamen aus der Tabelle discipline. Sie müssen die Daten erneut filtern - diesmal durch zwei Bedingungen in WHERE. Die erste Bedingung ist, dass es sich um eine männliche Disziplin handelt. Sie müssen also die Spalte is_men mit dem Operator IS TRUE filtern. Dann fügen Sie die zweite Bedingung hinzu: Die Werte in der Spalte distance müssen unter 500 liegen. Für diese Bedingung wird der Operator kleiner als (<) verwendet. Da beide Bedingungen erfüllt sein müssen, trennen Sie die Bedingungen mit dem Operator AND. Ausgabe: name Men's 100m Men's 200m Men's 400m Übung #7: Sortieren von Ländernamen und Abkürzungen Übung: Zeigen Sie alle Ländernamen und Abkürzungen an. Sortieren Sie die Ausgabe alphabetisch nach Ländernamen. Lösung: SELECT country_name, country_abbr FROM nationality ORDER BY country_name ASC; Erklären Sie: Wählen Sie den Ländernamen und seine Abkürzung aus der Tabelle nationality. Um die Ausgabe zu sortieren, verwenden Sie die Klausel ORDER BY. Sie wollen nach Ländernamen sortieren, also schreiben Sie country_name in ORDER BY. Die Ausgabe soll alphabetisch sortiert werden, also verwenden Sie das Schlüsselwort ASC (aufsteigend) nach dem Spaltennamen. Ausgabe: Hier sind die ersten fünf Zeilen der Ausgabe: country_namecountry_abbr AfghanistanAFG AlgeriaALG American SamoaASA AndorraAND AngolaANG Übung Nr. 8: Sortieren der Vor- und Nachnamen der Athleten Übung: Zeigen Sie den Vor- und Nachnamen eines jeden Sportlers an. Sortieren Sie die Ausgabe absteigend nach dem Vornamen des Athleten. Wenn mehrere Athleten den gleichen Namen haben, zeigen Sie deren Nachnamen absteigend sortiert an. Lösung: SELECT first_name, last_name FROM athlete ORDER BY first_name DESC, last_name DESC; Erläuterung: Wählen Sie den Vor- und Nachnamen aus der Tabelle athlete. Fügen Sie dann die Klausel ORDER BY hinzu. Sortieren Sie zunächst absteigend nach dem Vornamen und fügen Sie DESC nach dem Spaltennamen hinzu. Die zweite Sortierbedingung sortiert nach dem Nachnamen, ebenfalls in absteigender Reihenfolge. Auch hier schreiben Sie den Spaltennamen und fügen DESC hinzu. Die Bedingungen müssen durch ein Komma getrennt werden. Ausgabe: Hier sind die ersten fünf Zeilen der Ausgabe: first_namelast_name ZsófiaERDÉLYI ZouhairAWAD ZoeyCLARK ZoeHOBBS ZoeBUCKMAN Übung #9: Sortieren der Endergebnisse über drei Stunden Übung: Zeigen Sie für alle Endergebnisse die Zeiten an, die mindestens drei Stunden betragen. Sortieren Sie die Zeilen nach dem Ergebnis in absteigender Reihenfolge. Lösung: SELECT result FROM final_result WHERE result >= INTERVAL '3 hours' ORDER BY result DESC; Erläuterung: Wählen Sie die Spalte result aus der Tabelle final_result. Verwenden Sie dann WHERE, um die Ergebnisse zu finden, die unter drei Stunden liegen. Sie können die Operatoren "größer als oder gleich" (>=) und INTERVAL verwenden. Die Daten in der Ergebnisspalte sind als Zeitangabe formatiert. Daher müssen Sie INTERVAL verwenden, um den spezifischen Teil (Intervall) dieser Daten zu ermitteln. In diesem Fall sind es drei Stunden. Schreiben Sie einfach "3 Stunden" nach INTERVAL. Schließlich sortieren Sie die Ausgabe absteigend nach dem Ergebnis. Ausgabe: Hier sind die ersten fünf Zeilen der Ausgabe: result 3:20:20 3:16:11 3:15:18 3:11:31 3:11:05 Übung #10: Zeige die Namen und Orte der Top 3 Athleten Übung: Zeigen Sie für jeden Athleten, der jemals auf dem Podium stand (d.h. unter den Top 3 war), seinen Vor- und Nachnamen sowie seinen Platz an. Lösung: SELECT a.last_name, a.first_name, fin.place FROM athlete a JOIN final_result fin ON a.id = fin.athlete_id WHERE fin.place <= 3; Erläuterung: In dieser Übung müssen Sie Daten aus zwei Tabellen verwenden: athlete und final_result. Beginnen wir also die Erklärung mit der FROM Klausel. Sie referenzieren die athlete und geben ihr den Alias 'a', damit Sie den vollen Namen der Tabelle nicht an anderer Stelle in der Abfrage schreiben müssen. Um auch Daten aus einer anderen Tabelle zu erhalten, müssen Sie die Tabellen verbinden. In diesem Fall verwenden Sie JOIN, das nur die übereinstimmenden Zeilen aus beiden Tabellen zurückgibt. Dazu verweisen Sie einfach auf die Tabelle final_result in JOIN referenzieren und den Alias 'fin' hinzufügen. Als nächstes müssen Sie die Verknüpfungsbedingung mit dem Schlüsselwort ON angeben. Die Tabellen werden über gemeinsame Spalten verbunden: id from athlete und athlete_id von final_result. Sie suchen nach Zeilen, in denen die Werte in diesen beiden Spalten gleich sind, also setzen Sie ein Gleichheitszeichen (=) zwischen die beiden Spalten. Stellen Sie vor jeden Spaltennamen den Tabellenalias, gefolgt von einem Punkt, damit die Datenbank weiß, in welcher Tabelle sich die Spalte befindet. Nachdem Sie nun die Tabellen verbunden haben, können Sie die Spalten auswählen. Setzen Sie vor jeden Spaltennamen den Tabellenalias aus demselben Grund wie oben beschrieben. Jetzt haben Sie die Vor- und Nachnamen der Athleten und deren Orte. Als letzten Schritt filtern Sie die Daten einfach mit WHERE und der Spalte place. Sie suchen nach Podiumsplatzierungen, also müssen die Werte gleich oder kleiner als drei sein. Verwenden Sie den Operator "kleiner als oder gleich" (<=). Für diese SQL-Abfragepraxis müssen Sie SQL-JOINs kennen. Wenn Sie immer noch unsicher sind, wie sie funktionieren, schauen Sie sich diese SQL-JOINs Übungsfragen an, bevor Sie zu anderen Übungen übergehen. Ausgabe: Hier sind die ersten fünf Zeilen der Ausgabe: last_namefirst_nameplace BOLTUsain3 BOLTUsain1 BOLTUsain1 GATLINJustin2 GATLINJustin1 Übung #11: Alle Marathons mit dem Namen des Wettkampfs, dem Jahr des Wettkampfs und dem Namen der Disziplin anzeigen Übung: Zeigen Sie alle Marathons, den Namen (benennen Sie diese Spalte wettkampf_name) und das Jahr des Wettkampfs sowie den Namen der Disziplin (benennen Sie diese Spalte disziplin_name). Lösung: SELECT c.name AS competition_name, c.year, d.name AS discipline_name FROM competition c JOIN event e ON e.competition_id = c.id JOIN discipline d ON e.discipline_id = d.id WHERE d.name LIKE '%Marathon%'; Erläuterung: Diese Übung zeigt, wie man mehrere Tabellen verknüpft. Das Prinzip ist dasselbe wie bei zwei Tabellen. Sie fügen einfach weitere JOINs und die Verknüpfungsbedingungen hinzu. In diesem Fall verknüpfen Sie die Tabellen competition und event Tabellen, wobei e.competition_id gleich c.id column ist. Dann müssen Sie die Tabelle discipline Tabelle zur Verknüpfungskette hinzufügen. Schreiben Sie erneut JOIN und verweisen Sie auf die Tabelle discipline. Fügen Sie die Verknüpfungsbedingung hinzu: Die Spalte discipline_id aus der Tabelle event muss gleich der Spalte id aus der Tabelle discipline Tabelle. Wählen Sie nun die gewünschten Spalten aus und vergessen Sie nicht, den Tabellenalias vor jede Spalte zu setzen. Geben Sie competition_name und discipline_name mit dem Schlüsselwort AS die in der Anleitung beschriebenen Spaltennamen. Filtern Sie schließlich die Ergebnisse so, dass nur die Marathondisziplinen angezeigt werden. Ausgabe: competition_nameyeardiscipline_name Rio de Janeiro Olympic Games2016Men's Marathon Rio de Janeiro Olympic Games2016Women's Marathon London IAAF World Championships in Athletics2017Men's Marathon London IAAF World Championships in Athletics2017Women's Marathon IAAF World Championships in Athletics2019Men's Marathon Übung #12: Zeige Mo Farahs Ergebnisse für alle Disziplinen Übung: Zeigen Sie die Ergebnisse von Mo Farah (Athleten-ID von 14189197) für alle Disziplinen an. Zeigen Sie NULL an, wenn er noch nie an einer bestimmten Disziplin teilgenommen hat. Zeigen Sie die Namen, Daten, Orte und Ergebnisse aller männlichen Disziplinen. Lösung: SELECT d.name AS discipline_name, e.final_date, fin.place, fin.result FROM discipline d LEFT JOIN event e ON e.discipline_id = d.id LEFT JOIN final_result fin ON fin.event_id = e.id AND athlete_id = 14189197 WHERE is_men IS TRUE; Erläuterung: Verbinden Sie die Tabellen discipline und event über die Spalten discipline_id und id. Sie müssen LEFT JOIN verwenden. Diese Art der Verknüpfung liefert alle Zeilen aus der ersten (linken) Tabelle und nur die passenden Zeilen aus der zweiten (rechten) Tabelle. Wenn es keine übereinstimmenden Zeilen gibt, lauten die Werte NULL. Dies ist ideal für diese Übung, da Sie alle Disziplinen anzeigen und NULLs verwenden müssen, wenn Mo Farah nie an der Disziplin teilgenommen hat. Die nächste Verknüpfung ist ebenfalls eine LEFT JOIN. Sie verbindet die Tabelle event mit der Tabelle final_result. Die erste Verknüpfungsbedingung hier verbindet die Tabellen über die Spalten event_id und id. Sie müssen auch die zweite Bedingung einschließen, indem Sie das Schlüsselwort AND hinzufügen. Diese zweite Bedingung sucht nur nach den Daten von Mo Farah, d. h. nach dem Athleten mit der ID 14189197. Als letzten Schritt verwenden Sie WHERE, um nur die Disziplinen der Männer zu finden. Ausgabe: discipline_namefinal_dateplaceresult Men's 5000m2016-08-2010:13:03 Men's 10,000m2016-08-1310:27:05 Men's 5000m2017-08-1220:13:33 Men's 10,000m2017-08-0410:26:50 Men's 800m2017-08-08NULLNULL Men's Marathon2019-10-05NULLNULL Men's 100m2017-08-05NULLNULL Übung #13: Zeigen Sie die Namen der Wettbewerbe und die Anzahl der Wettkämpfe an Aufgabe: Geben Sie die Namen aller Wettkämpfe und die Anzahl der Disziplinen für jeden Wettkampf an. Lösung: SELECT c.name AS competition_name, COUNT(*) AS events_held FROM competition c JOIN event e ON e.competition_id = c.id GROUP BY c.name; Erläuterung: Zeigen Sie zunächst den Spaltennamen aus der Tabelle competition und benennen Sie die Spalte in competition_name um. Verwenden Sie dann die Aggregatfunktion COUNT(*), um die Anzahl der durchgeführten Veranstaltungen zu zählen. Die Funktion COUNT() mit einem Sternchen zählt alle Zeilen der Ausgabe, einschließlich der NULL-Zeilen. Der besseren Lesbarkeit halber geben wir der resultierenden Spalte den Alias events_held. Die Tabellen, die wir verbinden, sind competition und event. Um schließlich die Anzahl der Ereignisse pro Wettbewerb zu erhalten, müssen Sie den Namen des Wettbewerbs unter GROUP BY eingeben. Ausgabe: competition_nameevents_held IAAF World Championships in Athletics15 Rio de Janeiro Olympic Games16 London IAAF World Championships in Athletics16 Übung #14: Zeige die beliebtesten Sportlernamen Übung: Zeigen Sie die beliebtesten Sportlernamen. Namen sind beliebt, wenn sie von mindestens fünf Athleten benutzt werden. Geben Sie neben dem Namen auch die Anzahl der Athleten mit diesem Namen an. Sortieren Sie die Ergebnisse so, dass die populärsten Namen an erster Stelle stehen. Lösung: SELECT first_name, COUNT(*) AS name_count FROM athlete GROUP BY first_name HAVING COUNT(*) >= 5 ORDER BY COUNT(*) DESC; Erläuterung: Wählen Sie zunächst die Vornamen aus und zählen Sie sie mit COUNT(*). Anschließend gruppieren Sie nach dem Vornamen des Sportlers. Jetzt haben Sie alle Namen und deren Anzahl. Es sollen aber nur die Namen angezeigt werden, deren Anzahl größer als fünf ist. Dies erreichen Sie mit der HAVING Klausel. Sie hat den gleichen Zweck wie WHERE, aber HAVING wird zum Filtern aggregierter Daten verwendet. Schließlich sortieren Sie die Ausgabe nach der Anzahl der Namen vom höchsten zum niedrigsten. Sie können nicht einfach den Spaltennamen name_count in ORDER BY schreiben, da die Sortierung vor der Aggregation erfolgt; SQL erkennt den Spaltennamen nicht. Kopieren Sie stattdessen COUNT(*) und sortieren Sie absteigend. Diese Übung zeigt ein typisches SQL-Problem, das das Filtern von Daten mit einer Aggregatfunktion erfordert. Ausgabe: first_namename_count David9 Daniel7 Michael7 Jessica6 Alex6 Sarah5 Diana5 Jonathan5 Emmanuel5 Isaac5 Julian5 Anna5 Übung #15: Zeige jedes Land und die Anzahl der Athleten, die ohne Platzierung ins Ziel gekommen sind Übung: Zeigen Sie alle Länder mit der Anzahl ihrer Athleten, die ohne Platzierung ins Ziel gekommen sind. Zeigen Sie 0 an, wenn es keine gab. Sortieren Sie die Ausgabe absteigend nach der Anzahl der Athleten und aufsteigend nach dem Ländernamen. Lösung: SELECT n.country_name, COUNT(fin.athlete_id) AS athletes_no FROM nationality n LEFT JOIN athlete a ON n.id = a.nationality_id LEFT JOIN final_result fin ON a.id = fin.athlete_id AND fin.place IS NULL GROUP BY n.country_name ORDER BY COUNT(fin.athlete_id) DESC, n.country_name ASC; Erläuterung: Sie müssen alle Zeilen der Tabelle nationality Tabelle behalten, also müssen Sie sie mit der LEFT JOIN athlete Tabelle. Das tun Sie, indem Sie id mit nationality_id gleichsetzen. Dann LEFT JOIN eine andere Tabelle, bei der id aus der athlete Tabelle gleich athlete_id aus der final_result Tabelle entspricht. Da Sie alle Nationalitätenzeilen benötigen, können Sie die Bedingung IS NULL nicht in WHERE verwenden. Es gibt eine Lösung: Verschieben Sie sie in die ON Klausel, und Sie erhalten alle Werte, deren Ort NULL ist. Jetzt können Sie die Spalte country_name auswählen. Verwenden Sie außerdem die Funktion COUNT() für die Spalte athlete_id, um die Anzahl der Sportler zu ermitteln, die ohne Platzierung ins Ziel gekommen sind. Die Funktion COUNT(*) kann hier nicht verwendet werden, da sie f gezählt hätte, und Sie brauchen die Anzahl der konkreten Athleten. Um den Zählwert nach Land zu erhalten, gruppieren Sie die Ausgabe nach Ländernamen. Schließlich sortieren Sie die Ausgabe nach der Anzahl der Athleten absteigend und nach dem Ländernamen aufsteigend. Ausgabe: Hier sind die ersten fünf Zeilen der Ausgabe: country_nameathletes_no Bahrain8 Ethiopia6 Turkey6 Kenya5 South Africa5 Übung Nr. 16: Berechnen Sie die durchschnittliche Geschwindigkeit für jeden Lauf Übung: Berechnen Sie das durchschnittliche Tempo für jeden Lauf und zeigen Sie es in der Spalte average_pace an. Lösung: SELECT fin.result / (d.distance * 1.0 / 1000) AS average_pace FROM event e JOIN discipline d ON e.discipline_id = d.id JOIN final_result fin ON fin.event_id = e.id; Erläuterung: Um die durchschnittliche Pace pro Lauf zu erhalten, müssen Sie das Ergebnis durch die Distanz dividieren. Dies geschieht mit der obigen Abfrage, allerdings mit zwei Änderungen. Zunächst müssen Sie die Entfernung mit 1,0 multiplizieren. Damit konvertieren Sie die Entfernung in eine Dezimalzahl. Andernfalls könnte die Division ein anderes Ergebnis liefern, da das Ergebnis durch eine ganze Zahl geteilt wird. Die zweite Änderung besteht darin, dass Sie die Entfernung durch 1.000 teilen. Auf diese Weise konvertieren Sie die Entfernung von Metern in Kilometer. Da Sie nun die Berechnung haben, geben Sie dieser Spalte den Alias average_pace. Der Rest der Abfrage entspricht dem, was Sie bereits in früheren Beispielen gesehen haben: Sie verknüpfen die Tabelle event mit der Tabelle discipline und dann mit der Tabelle final_result. Ausgabe: Hier sind die ersten fünf Zeilen der Ausgabe: average_pace 0:01:38 0:01:39 0:01:39 0:01:39 0:01:39 Beispiel #17: Alle überdurchschnittlich schnellen Zeiten für 1.500-Meter-Läufe finden Übung: Geben Sie die Zeiten für alle 1.500-Meter-Läufe aus. Zeigen Sie nur Zeiten an, die schneller sind als die Durchschnittszeit für diesen Lauf. Lösung: SELECT fin.result FROM final_result fin JOIN event e ON fin.event_id = e.id JOIN discipline d ON e.discipline_id = d.id WHERE distance = 1500 AND fin.result < ( SELECT AVG(fin.result) FROM final_result fin JOIN event e ON fin.event_id = e.id JOIN discipline d ON e.discipline_id = d.id WHERE distance = 1500 ); Erläuterung: Um diese Aufgabe zu lösen, müssen Sie SQL-Unterabfragen kennen. Ihre grundlegende Definition ist, dass es sich um Abfragen innerhalb einer Hauptabfrage handelt. Schauen wir uns an, wie das funktioniert! Wählen Sie die Ergebnisspalte aus der Tabelle final_result. Dann JOIN die Tabelle mit event und dann mit der discipline Tabelle. Danach müssen Sie in WHERE zwei Bedingungen festlegen. Die erste wählt nur Strecken aus, die gleich 1.500 sind. Die zweite sucht nach Daten, bei denen das Ergebnis unter dem Gesamtdurchschnitt für 1.500-Meter-Läufe liegt. Um den Durchschnitt zu berechnen, verwenden Sie eine Unterabfrage auf folgende Weise. Schreiben Sie in die Klammern nach dem Vergleichsoperator eine weitere SELECT -Anweisung (d. h. eine Unterabfrage). Verwenden Sie darin die Aggregatfunktion AVG(), um das durchschnittliche Ergebnis zu berechnen. Der Rest der Abfrage ist derselbe wie die Hauptabfrage; Sie verknüpfen dieselben Tabellen und verwenden dieselbe Filterungsbedingung in WHERE. Ausgabe: Hier sind die ersten paar Zeilen der Ausgabe: result 0:03:51 0:03:51 0:03:51 0:03:51 0:03:51 0:03:50 0:03:50 0:03:51 Übung #18: Finden Sie alle Athleten, die an mindestens zwei Wettkämpfen teilgenommen haben Übung: Geben Sie eine Liste der Athleten aus, die an zwei oder mehr Wettkämpfen eines beliebigen Wettbewerbs teilgenommen haben. Zeigen Sie nur die Vor- und Nachnamen an. Lösung: SELECT first_name, last_name FROM athlete WHERE id IN ( SELECT fin.athlete_id FROM event e JOIN final_result fin ON fin.event_id = e.id GROUP BY e.competition_id, fin.athlete_id HAVING COUNT(*) >= 2 ); Erläuterung: Wählen Sie zunächst den Vor- und den Nachnamen aus der Tabelle athlete. Dann verwenden Sie WHERE, um eine Bedingung aufzustellen. Wir verwenden wieder eine Unterabfrage, um die Daten zurückzugeben, die wir vergleichen wollen, diesmal mit der Spalte id. Im vorherigen Beispiel haben wir jedoch den Operator "kleiner als" (<) verwendet, weil die Unterabfrage nur einen Wert zurückgegeben hat. Diesmal verwenden wir den Operator IN, der alle von der Unterabfrage zurückgegebenen Werte durchgeht und diejenigen zurückgibt, die die Bedingung erfüllen. Die Bedingung ist, dass die Athleten an mindestens zwei Veranstaltungen innerhalb eines Wettkampfs teilnehmen. Um diese Sportler zu finden, wählen Sie die Spalte athlete_id aus und verknüpfen die Tabellen event und final_result. Gruppieren Sie dann die Ergebnisse nach den Wettkampf- und Athleten-IDs. Dieses Beispiel zeigt, dass Sie die Ausgabe nach der Spalte gruppieren können, die nicht in SELECT enthalten ist. Allerdings müssen alle Spalten, die in SELECT erscheinen, auch in GROUP BY enthalten sein. Verwenden Sie schließlich HAVING, um die Daten zu filtern. Zählen Sie die Anzahl der Zeilen mit COUNT(*). Auf diese Weise zählen Sie, wie oft jeder Sportler vorkommt. Legen Sie die Bedingung so fest, dass nur die Athleten zurückgegeben werden, deren Anzahl gleich oder größer als zwei ist. Ausgabe: Hier ist der Schnappschuss der Ausgabe. first_namelast_name UsainBOLT AndréDE GRASSE AaronBROWN LaShawnMERRITT WaydeVAN NIEKERK Übung Nr. 19: Läufer anzeigen, die nur als Erste ins Ziel gekommen sind Übung: Zeigen Sie alle Läufer an, die nie auf einem anderen Platz als dem ersten ins Ziel gekommen sind; für sie hat nie ein Platz gefehlt. Zeigen Sie drei Spalten an: id, first_name, und last_name. Lösung: SELECT a.id, a.first_name, a.last_name FROM athlete a JOIN final_result fin ON a.id = fin.athlete_id WHERE fin.place = 1 EXCEPT SELECT a.id, a.first_name, a.last_name FROM athlete a JOIN final_result fin ON a.id = fin.athlete_id WHERE fin.place != 1 OR fin.place IS NULL; Erläuterung: Für diese Lösung müssen Sie den EXCEPT set-Operator verwenden. Die Set-Operatoren werden verwendet, um die Werte aus zwei oder mehr Abfragen zurückzugeben. EXCEPT gibt alle eindeutigen Datensätze aus der ersten Abfrage zurück , mit Ausnahme der jenigen, die von der zweiten Abfrage zurückgegeben werden. Die erste Abfrage in der Lösung sucht nach den Sportlern, die den ersten Platz belegt haben. Um diese Werte zu erhalten, wählen Sie die erforderlichen Spalten aus der Tabelle athlete. Verknüpfen Sie dann die Tabelle mit der Tabelle final_result. Danach stellen Sie die Bedingung in WHERE so ein, dass nur die ersten Plätze gefunden werden. Geben Sie nun das Schlüsselwort EXCEPT ein und folgen Sie ihm mit der zweiten Abfrage. Die zweite Abfrage ist fast die gleiche wie die erste. Der einzige Unterschied sind zwei Bedingungen in WHERE. Die erste Bedingung gibt alle Plätze zurück, die nicht der erste sind, indem sie den Operator "nicht gleich" (!=) verwendet. Die zweite Bedingung sucht nach den Platzierungen, die nichtNULL sind, d. h., die Platzierung hat für diesen Athleten nie gefehlt. Die Bedingungen werden mit ODER verknüpft, da eine dieser Bedingungen wahr sein muss; der Athlet kann nicht unter dem ersten Platz landen und gleichzeitig gar nicht ins Ziel kommen. Beachten Sie, dass die Mengenoperatoren nur dann funktionieren, wenn beide Abfragen die gleiche Anzahl von Spalten desselben Datentyps enthalten. Ausgabe: idfirst_namelast_name 14590785Elijah MotoneiMANANGOI 14208194EliudKIPCHOGE 14603138DonavanBRAZIER 14289014Jemima JelagatSUMGONG 14536762NoahLYLES 14377814LelisaDESISA 14209691DavidRUDISHA 14431159HalimahNAKAAYI Übung #20: Finde alle Athleten, die nicht gestartet sind und mindestens einmal gewonnen haben Übung: Geben Sie die Athleten aus, die bei mindestens einem Rennen nicht gestartet sind und mindestens ein Rennen gewonnen haben. Zeigen Sie drei Spalten an: id, first_name, und last_name. Lösung: SELECT a.id, a.first_name, a.last_name FROM athlete a JOIN final_result fin ON a.id = fin.athlete_id WHERE fin.is_dns IS TRUE INTERSECT SELECT a.id, a.first_name, a.last_name FROM athlete a JOIN final_result fin ON a.id = fin.athlete_id WHERE fin.place = 1; Erläuterung: In dieser Übung wird ein weiterer Mengenoperator verwendet. Diesmal ist es INTERSECT, der alle Werte zurückgibt, die in beiden Abfragen gleich sind. Die erste Abfrage in der Lösung listet die IDs sowie die Vor- und Nachnamen der Athleten auf. Die Tabellen athlete und final_result werden über die Spalten id und athlete_id aus den Tabellen verbunden. Die Bedingung in WHERE sucht nach Zeilen mit dem Wert TRUE in der Spalte is_dns, d. h. in der Spalte, die anzeigt, ob der Athlet an dem Rennen teilgenommen hat. Wie im vorherigen Beispiel schreiben Sie den Set-Operator und dann die zweite Abfrage. Die zweite Abfrage ist die gleiche wie die erste, mit Ausnahme von WHERE. Die Filterungsbedingung findet die Athleten, die als erste ins Ziel gekommen sind. Zusammen geben diese beiden Abfragen die Athleten aus, die nicht mindestens einmal am Start waren, aber auch mindestens einmal als Erste ins Ziel kamen. Ausgabe: idfirst_namelast_name 14291986DafneSCHIPPERS Von der grundlegenden SQL-Abfragepraxis zum SQL-Meister Irgendwo muss man ja anfangen. Diese 20 grundlegenden SQL-Abfrageübungen sind ideal, um eine Grundlage zu schaffen, bevor Sie fortgeschrittenere Konzepte lernen. Sie haben viel gelernt, als Sie geübt haben, Abfragen zu schreiben, die WHERE, ORDER BY, JOINs, GROUP BY und HAVING verwenden. Ich habe Ihnen auch mehrere Beispiele für den Umgang mit NULLs, Berechnungen, das Schreiben von Unterabfragen und die Verwendung von Mengenoperatoren gezeigt. Die Abfragen in diesem Artikel stammen aus unserem Grundlegende SQL-Praxis: Führe Abfragen durch! Dort finden Sie weitere grundlegende SQL-Übungen. Und wenn Sie noch mehr üben wollen, schauen Sie sich unseren SQL-Praxis Track, der 9 SQL-Übungskurse für Anfänger enthält. Fügen Sie 20 Beispiele für grundlegende SQL-Abfragen und 10 SQL-Übungen für Anfänger hinzu, und Sie werden mit einem mittleren Niveau an SQL-Kenntnissen ausgestattet sein. Tags: SQL-Übungen