Zurück zur Artikelliste Artikel
7 Leseminuten

Was ist der Unterschied zwischen SQL CTEs und Views?

SQL-Ansichten vs. CTEs: Was bewirken sie? Wie unterscheiden sie sich? Welche sollten Sie wann verwenden? Hier erhalten Sie Ihre Antworten!

In SQL helfen sowohl CTEs (Common Table Expressions) als auch Views bei der Organisation Ihrer Abfragen, was zu einem saubereren und leichter zu verstehenden Code führt. Es gibt jedoch einige wichtige Unterschiede zwischen ihnen. In diesem Artikel werden Sie mehrere Beispiele für CTEs und Views kennenlernen und erfahren, wann Sie welche verwenden sollten.

Was sind Common Table Expressions (CTEs) in SQL?

Wie Sie sich vielleicht erinnern, handelt es sich bei Common Table Expressions um temporäre Ergebnissätze, die mit einfachen SQL-Anweisungen erstellt werden und auf die dann in SELECT-, INSERT-, UPDATE- oder DELETE-Anweisungen verwiesen wird.

Nehmen wir zum Beispiel an, wir haben eine Tabelle namens top_apps mit Bewertungsinformationen für Top-Anwendungen in verschiedenen Kategorien:

top_apps
idnamecategoryratingreviews
1Messengercommunication4.275 645 262
2WhatsAppcommunication4.3126 283 877
3Zoomcommunication3.71 568 095
4Duolingoeducation4.610 261 344
5Udemyeducation4.4263 125
6Courseraeducation4.3119 751
7Spotifymusic4.521 001 626
8Shazammusic4.43 928 072
9Samsung Musicmusic4.4593 808

Wir haben auch die google_apps Tabelle, die dieselben Informationen für mehrere Google-Anwendungen enthält:

google_apps
idnamecategoryratingreviews
201Google Meetcommunication3.4999 265
202Google Classroomeducation1.9886 558
203YouTube Musicmusic3.41 953 141

Wir möchten die Leistung der Google-Anwendungen mit derjenigen der leistungsstärksten Anwendungen in den entsprechenden Kategorien vergleichen. Insbesondere möchten wir Informationen über die maximale Bewertung in jeder Kategorie neben der Bewertung der Google-App aus derselben Kategorie anzeigen lassen.

Hier ist eine Abfrage, die dieses Ziel mit einer CTE erreicht:

WITH top_apps_max AS (
	SELECT category, MAX(rating) AS max_rating
	FROM top_apps
	GROUP BY category)
SELECT ga.name, ga.category, ga.rating, tam.max_rating
FROM google_apps ga
JOIN top_apps_max tam
ON ga.category = tam.category;

Die Abfrage beginnt mit der Erstellung einer temporären Ergebnismenge namens top_apps_max. Diese Ergebnismenge wird aus der top_apps Tabelle abgeleitet und enthält die Liste der Kategorien zusammen mit den entsprechenden Höchstbewertungen. In der Hauptanweisung SELECT wird dann diese temporäre Ergebnismenge mit der Tabelle google_apps Tabelle unter Verwendung der gemeinsamen Spalte category. Hier ist das Ergebnis:

namecategoryratingmax_rating
Google Meetcommunication3.44.3
Google Classroomeducation1.94.6
YouTube Musicmusic3.44.5

Sie könnten die gleiche Ausgabe mit einer Unterabfrage anstelle einer CTE erhalten. Im Vergleich zu Unterabfragen führt die Verwendung einer SQL-CTE jedoch zu einem saubereren und einfacher zu verstehenden Code, den Sie von oben nach unten lesen können: Sie erstellen zunächst eine temporäre Ergebnismenge mit einem bestimmten Namen, der später in der Abfrage verwendet wird, um auf diese Ergebnismenge zu verweisen.

Beachten Sie, dass CTE nur im Speicher vorhanden ist, während die Abfrage ausgeführt wird. Nachdem die Abfrage ausgeführt wurde, wird das CTE verworfen; es kann nicht für die nächste SQL-Abfrage verwendet werden, es sei denn, wir definieren es erneut. Dennoch kann derselbe CTE mehrmals in der Hauptabfrage und in Unterabfragen referenziert werden.

Weitere Informationen über SQL-CTEs finden Sie in diesem umfassenden Einführungshandbuch zu gängigen Tabellenausdrücken. Und wenn Sie daran interessiert sind, CTEs anhand von Beispielen aus der Praxis zu üben, schauen Sie sich unseren interaktiven Kurs über allgemeine Tabellenausdrücke an.

In der Alltagssprache werden CTEs manchmal als Inline-Views bezeichnet. Erinnern wir uns also daran, was ein View ist und wie er sich von einem CTE unterscheidet.

Was ist ein View in SQL?

Ein View ist eine gespeicherte SQL-Abfrage, die jedes Mal ausgeführt wird, wenn Sie in einer anderen Abfrage auf sie verweisen. Beachten Sie, dass ein View nicht die Ausgabe einer bestimmten Abfrage speichert - er speichert die Abfrage selbst.

Lassen Sie uns sehen, wie das funktioniert. Wir verwenden ein ähnliches Beispiel, aber dieses Mal verwenden wir eine Ansicht anstelle einer CTE.

Wir beginnen mit der Erstellung der Ansicht top_apps_max mit dem Schlüsselwort CREATE VIEW, gefolgt von der Anweisung SELECT:

CREATE VIEW top_apps_max AS
SELECT category, MAX(rating) AS max_rating, MAX(reviews) AS max_num_reviews
FROM top_apps
GROUP BY category;

Wie Sie sehen, ist die SELECT-Anweisung derjenigen, die wir mit der CTE verwendet haben, sehr ähnlich. Sie könnte absolut dieselbe sein, aber wir haben den Bereich geändert: Jetzt wollen wir zusätzlich zur maximalen Bewertung für jede Kategorie auch die maximale Anzahl der Bewertungen sehen (einfach um mehr Daten zur Verfügung zu haben).

Jetzt haben wir also eine gespeicherte SQL-Abfrage namens top_apps_max. Es ist an der Zeit, sie zu verwenden!

Beginnen wir damit, unser erstes Beispiel zu wiederholen, indem wir einen View statt einer CTE verwenden. Diesmal jedoch:

  • Wir brauchen am Anfang der Abfrage keine CTE zu erstellen, da wir bereits über die gespeicherte Ansicht top_apps_max verfügen.
  • Wir verbinden einfach die google_apps mit der Ansicht top_apps_max über die Spalte Kategorie und listen die Spalten auf, die wir in der Ausgabe sehen wollen:
SELECT ga.name, ga.category, ga.rating, tam.max_rating
FROM google_apps ga
JOIN top_apps_max tam
ON ga.category = tam.category;

Das Ergebnis dieser Abfrage wird dasselbe sein wie in unserem ersten Beispiel:

namecategoryratingmax_rating
Google Meetcommunication3.44.3
Google Classroomeducation1.94.6
YouTube Musicmusic3.44.5

Was ist also der Unterschied?

Zunächst einmal können Sie dieselbe Ansicht in anderen Abfragen verwenden, ohne sie erneut zu definieren. Die folgende SQL-Abfrage bezieht sich zum Beispiel auf dieselbe Ansicht top_apps_max; dieses Mal wird sie verwendet, um die Anzahl der Bewertungen zu vergleichen und nicht die Bewertung verschiedener Anwendungen:

SELECT ga.name, ga.category, ga.reviews, tam.max_num_reviews
FROM google_apps ga
JOIN top_apps_max tam
ON ga.category = tam.category;
namecategoryreviewsmax_num_reviews
Google Meetcommunication999 265126 283 877
Google Classroomeducation886 55810 261 344
YouTube Musicmusic1 953 14121 001 626

Außerdem können Sie bei der Definition einer Ansicht ein CTE verwenden. Nehmen wir an, wir möchten auch den Namen der Top-App in jeder Kategorie sehen (d. h. die App mit der höchsten Anzahl von Bewertungen). Eine Möglichkeit, dies zu tun, besteht darin, eine Ansicht zu erstellen, die den Namen, die Kategorie und die Anzahl der Bewertungen für die beste Anwendung in jeder Kategorie ausgibt:

CREATE VIEW top_app_per_category AS
WITH top_app_max_reviews AS (
    SELECT category, MAX(reviews) AS max_num_reviews
    FROM top_apps
    GROUP BY category)
SELECT ta.name, ta.category, ta.reviews
FROM top_apps ta
JOIN top_app_max_reviews tamr
ON ta.reviews = tamr.max_num_reviews;

Wie Sie sehen, enthält die in dieser Ansicht gespeicherte Abfrage einen gemeinsamen Tabellenausdruck, der die maximale Anzahl der Bewertungen für jede Kategorie ausgibt. In der Hauptabfrage der Ansicht top_app_per_category verknüpfen wir dann diese CTE mit der Tabelle top_apps, um den Namen der Anwendung mit der höchsten Anzahl von Bewertungen in jeder Kategorie zu erhalten.

Jetzt können wir diese Ansicht in einer anderen Abfrage referenzieren, die Google-Anwendungen zusammen mit dem Namen der Top-Anwendung in der entsprechenden Kategorie und der Anzahl der Bewertungen zurückgibt:

SELECT ga.name, ga.category, ga.reviews, top.name AS top_app, top.reviews AS top_app_reviews
FROM google_apps ga
JOIN top_app_per_category top
ON ga.category = top.category;
namecategoryreviewstop_apptop_app_reviews
Google Meetcommunication999 265WhatsApp126 283 877
Google Classroomeducation886 558Duolingo10 261 344
YouTube Musicmusic1 953 141Spotify21 001 626

Das Wichtigste bei SQL-Views ist, dass ein View im Gegensatz zu einer CTE ein physisches Objekt in einer Datenbank ist und auf einer Festplatte gespeichert wird. Allerdings speichern Views nur die Abfrage, nicht aber die von der Abfrage zurückgegebenen Daten. Die Daten werden jedes Mal berechnet, wenn Sie in Ihrer Abfrage auf den View verweisen.

Möchten Sie mehr über SQL-Views erfahren? Hier finden Sie einen großartigen Artikel, der SQL-Views anhand mehrerer Beispiele und Illustrationen erklärt. Denken Sie auch daran, Views mit unserem interaktiven Kurs Arbeiten mit Views zu üben.

SQL CTE vs. View: Wann man welche verwendet

Obwohl es einige Unterschiede zwischen ihnen gibt, scheinen gemeinsame Tabellenausdrücke und Views sehr ähnlich zu funktionieren. Wann sollten Sie also beide verwenden?

  • Ad-hoc-Abfragen. Für Abfragen, auf die nur gelegentlich (oder nur einmal) verwiesen wird, ist es normalerweise besser, eine CTE zu verwenden. Wenn Sie die Abfrage erneut benötigen, können Sie einfach die CTE kopieren und sie bei Bedarf ändern.
  • Häufig verwendete Abfragen. Wenn Sie häufig auf dieselbe Abfrage verweisen, ist es eine gute Idee, einen entsprechenden View zu erstellen. Um einen View zu erstellen, benötigen Sie jedoch die Berechtigung zum Erstellen von Views in Ihrer Datenbank.
  • Zugriffsverwaltung. Eine Ansicht kann verwendet werden, um den Datenbankzugriff bestimmter Benutzer einzuschränken, ihnen aber dennoch den Zugriff auf die benötigten Informationen zu ermöglichen. Sie können Benutzern Zugriff auf bestimmte Ansichten geben, die die Daten abfragen, die sie sehen dürfen, ohne die gesamte Datenbank offenzulegen. In einem solchen Fall bietet ein View eine zusätzliche Zugriffsebene.

Lassen Sie uns SQL CTEs und Views üben!

Jetzt, da Sie ein grundlegendes Verständnis von SQL CTEs und Views haben, können Sie sie in Ihren Abfragen verwenden! Das Üben von SQL-Abfragen ist der beste Weg, um zu verstehen, wie CTEs funktionieren und wie Views Zeit bei der erneuten Eingabe und Ausführung von Abfragen sparen.

LearnSQL.de hat mehrere Kurse entwickelt, die diese Themen eingehend behandeln. Schauen Sie sich als erstes den Rekursive Abfragen der Sie von einfachen CTEs über verschachtelte CTEs bis hin zu den anspruchsvollsten rekursiven CTEs führt. 114 interaktive Übungen helfen Ihnen, gängige Tabellenausdrücke auf die effizienteste Weise zu beherrschen.

Für diejenigen, die mehr über SQL-Views lernen möchten, haben wir den Kurs Arbeiten mit Views vorbereitet. Dies ist ein Kurs für Fortgeschrittene, in dem Sie lernen, wie man Views in SQL Server, MySQL, Oracle und PostgreSQL erstellt, ändert und entfernt.

Vielen Dank fürs Lesen und viel Spaß beim Lernen!