Zurück zur Artikelliste Artikel
12 Leseminuten

Fortgeschrittene SQL-Interview-Fragen (und Antworten)

Möchten Sie eine Stelle antreten, bei der SQL zum Einsatz kommt? Sind Sie unsicher, was Sie bei einem Vorstellungsgespräch erwartet oder wie Sie Ihr Wissen bewerten können? Dieser Artikel gibt Ihnen eine gute Vorstellung davon, wo Sie stehen.

Wenn Sie sich in Ihrem Job festgefahren fühlen, sind Sie nicht der Einzige. Die moderne Arbeitsteilung zwingt die Menschen dazu, sehr spezifische Aufgaben auszuführen, und erwartet von ihnen, dass sie nicht auf das schauen, was auf der anderen Seite liegt. Die Arbeitnehmer müssen sich nur auf ihre (oft repetitiven und langweiligen) Aufgaben konzentrieren und dürfen nichts darüber hinaus in Frage stellen. Oft hat man das Gefühl, dass man am Fließband arbeitet. Ja, ein Fließband - sogar in einem schönen Büro mit großen Fenstern, kostenlosem Kaffee und frischem Obst. Aber trotzdem ist es ein Fließband. Vielleicht möchten Sie aber auch nur Ihre Arbeit schneller erledigen und keine Zeit durch ineffiziente Datenverarbeitung verlieren.

Eine Veränderung Ihrer Arbeit oder eine Verbesserung Ihrer Leistung kann das Gefühl, etwas Sinnvolles zu tun, erheblich steigern. In diesem Artikel werden wir einige fortgeschrittene SQL-Fragen auflisten, die Ihnen in einem Vorstellungsgespräch gestellt werden könnten. Und wir verraten Ihnen auch die Antworten! Auf diese Weise können Sie Ihr aktuelles Wissen vergleichen und vielleicht etwas Neues lernen.

Ob Sie dies auf Ihren neuen oder aktuellen Job anwenden, bleibt Ihnen überlassen! Beginnen wir mit unserem 'Vorstellungsgespräch'!

(Suchen Sie nach SQL-Einstiegsfragen? Dann ist dieser Artikel genau das Richtige für Sie.)

10 Fortgeschrittenes SQL Fragen und Antworten zum Vorstellungsgespräch

Frage 1: Was ist ein Index? Was sind die beiden wichtigsten Indexarten?

Ein Index ist eine Struktur in einer Datenbank, die dabei helfen kann, Daten schneller abzurufen. Wenn Sie mit einer SQL-Abfrage Tabellendaten suchen, wird die gesamte Tabelle durchsucht und das Ergebnis zurückgegeben. Eine nicht indizierte Tabelle wird als Heap bezeichnet. Die in solchen Tabellen gespeicherten Daten sind in der Regel nicht in einer bestimmten Weise angeordnet. Sie werden in der Reihenfolge gespeichert, in der sie eingegeben wurden. Daher kann die Suche nach Daten sehr langsam und frustrierend sein.

Wenn Sie eine indizierte Tabelle abfragen, greift die Datenbank zuerst auf den Index zu und ruft die entsprechenden Datensätze direkt ab. Die beiden wichtigsten Indextypen sind:

  • Geclustert
  • Nicht-geclustert

Ein geclusterter Index definiert die genaue Reihenfolge der in der Tabelle gespeicherten Daten. Es kann nur einen geclusterten Index pro Tabelle geben, da die Tabelle nur auf eine Weise geordnet werden kann.

Ein nicht geclusterter Index verweist einfach auf die Daten, wobei die Reihenfolge der Daten im Index nicht mit der physischen Reihenfolge der tatsächlichen Daten übereinstimmt. Die Daten sind an einem Ort gespeichert, während der Index an einem anderen Ort gespeichert ist.

Frage 2: Wie lautet der Code zum Erstellen eines Indexes?

Jetzt kommen wir zu einem praktischen Beispiel! Nehmen wir an, wir haben die Tabelle employee, die die folgenden Spalten hat:

  • name - Den Vornamen des Mitarbeiters.
  • surname - Der Nachname des Mitarbeiters.
  • nin - Die nationale Identifikationsnummer des Mitarbeiters (z.B. die Sozialversicherungsnummer).

Ihre Aufgabe ist es, einen geclusterten Index auf die Spalte nin und einen nicht geclusterten Index auf die Spalte surname zu erstellen. Wie machen Sie das?

Um den geclusterten Index zu erstellen, wird der Code wie folgt lauten:

CREATE CLUSTERED INDEX CL_nin
ON employee(nin);

Dies wird den geclusterten Index mit dem Namen CL_nin, auf der Tabelle employee und die Spalte nin.

Um den nicht-geclusterten Index zu erstellen, lautet der Code:

CREATE NONCLUSTERED INDEX NCL_surname
ON employee(surname);

Führen Sie diesen Code aus und Sie erstellen einen nicht-geclusterten Index mit dem Namen NCL_surname auf der Spalte "Nachname" in der Tabelle employee.

Wichtig: Wenn Sie keinen Typ angeben (geclustert oder nicht geclustert), erstellen Sie standardmäßig einen nicht geclusterten Index.

Frage 3: Wie fügen Sie mit RANK() eine Rangfolge zu den Zeilen hinzu?

Die Überwachung der Verkaufszahlen ist für jedes Unternehmen unerlässlich. Nehmen Sie das Beispiel eines Autohändlers. Es kann viele Verkäufer geben, die jeden Tag Autos verkaufen. Stellen Sie sich vor, die Geschäftsleitung des Autohauses ist daran interessiert, ihre Verkäufer zu vergleichen. Sie wollen wissen, wer gut arbeitet und wer nur herumhängt. Sie haben die Tabelle salespeople mit den folgenden Informationen:

  • first_name - Den Vornamen des Angestellten.
  • last_name - Den Nachnamen des Mitarbeiters.
  • cars_sold - Die Anzahl der von diesem Angestellten verkauften Autos.

Wie fügen Sie dieser Tabelle einen Rang zu, wie unten gezeigt?

first_namelast_namecars_sold
ClarabelleHanmer77
ChristianoOverstall51
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn57
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

Der Code für dieses Problem lautet:

SELECT	RANK() OVER(ORDER BY cars_sold DESC) AS rank_sales,
		first_name,
		last_name,
		cars_sold
FROM salespeople;

Der Code verwendet die Funktion RANK() window. Da kein Fenster definiert ist, wird die Funktion die gesamte Tabelle verwenden. Sie ordnet die Daten nach der Spalte cars_sold und fügt den Rang in die neue Spalte rank_sales ein. Führen Sie den Code aus, und Sie erhalten eine schöne Tabelle, die Ihnen einen Punkt im Vorstellungsgespräch einbringen wird!

rank_salesfirst_namelast_namecars_sold
1GlendonKnowlys116
2JolyTschierasche114
3CarlottaDytham106
4ArtemusWoolward100
5EmileeNanetti84
6ClarabelleHanmer77
7RubieDing72
8RainaBedinn57
9ChristianoOverstall51
10WilhelmKopec38

Ich habe einen detaillierteren Artikel über Fensterfunktionen und ihre Verwendung (mit Beispielen) geschrieben, falls Sie tiefer einsteigen wollen. Es gibt auch das praktische LearnSQL.de Kochbuch, aus dem ich diesen Code gestohlen habe. Das können Sie auch tun! Der Abschnitt über das Kochbuch ist im Grunde eine Liste häufiger Probleme, die mit Hilfe von SQL gelöst wurden. Sie können sehr schnell eine Lösung finden, die Erklärung lesen und einen Codeschnipsel erhalten, den Sie zur Lösung Ihrer Aufgaben verwenden können.

Frage 4: Was ist der Unterschied zwischen RANK() und DENSE_RANK()?

Der Hauptunterschied besteht darin, dass RANK() allen Zeilen mit denselben Werten (in den Rangfolgekriterien) denselben Rang zuweist. Es werden auch Ränge übersprungen, wenn mehr als eine Zeile den gleichen Rang hat; die Anzahl der übersprungenen Ränge hängt davon ab, wie viele Zeilen den gleichen Wert haben. Dadurch entstehen nicht aufeinander folgende Ränge.

Mit DENSE_RANK() werden Zeilen mit denselben Werten auch in denselben Rang gebracht. Diese Funktion überspringt jedoch keine Ränge, so dass sie zu aufeinanderfolgenden Rängen führt.

Hier ein Beispiel, um den Unterschied zu verdeutlichen. Ändern wir die Tabelle aus dem vorherigen Beispiel. Die Tabelle sieht wie folgt aus:

first_namelast_namecars_sold
ClarabelleHanmer72
ChristianoOverstall84
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn72
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

Wenn Sie den Code aus dem vorherigen Beispiel ausführen, erhalten Sie mit RANK() dieses Ergebnis:

rank_salesfirst_namelast_namecars_sold
1GlendonKnowlys116
2JolyTschierasche114
3CarlottaDytham106
4ArtemusWoolward100
5EmileeNanetti84
5ChristianoOverstall84
7ClarabelleHanmer72
7RubieDing72
7RainaBedinn72
10WilhelmKopec38

Sie werden feststellen, dass Rang 5 zweimal vergeben wird, dann wird Rang 6 übersprungen und direkt zu Rang 7 übergegangen. Rang 7 wird dreimal zugewiesen, danach geht die Rangliste direkt zu 10 über.

Wenn Sie sehen möchten, wie DENSE_RANK() die Zeilen ordnet, führen Sie den folgenden Code aus:

SELECT	RANK() OVER(ORDER BY cars_sold DESC) AS rank_sales,
		DENSE_RANK () OVER (ORDER BY cars_sold DESC) AS dense_rank_sales,
		first_name,
		last_name,
		cars_sold
FROM salespeople;

Sie erhalten ein Ergebnis, das wie folgt aussieht:

rank_salesdense_rank_salesfirst_namelast_namecars_sold
11GlendonKnowlys116
22JolyTschierasche114
33CarlottaDytham106
44ArtemusWoolward100
55EmileeNanetti84
55ChristianoOverstall84
76ClarabelleHanmer72
76RubieDing72
76RainaBedinn72
107WilhelmKopec38

Die Kenntnis der Window-Funktionen ist für jede Arbeit, die fortgeschrittene SQL-Kenntnisse erfordert, unerlässlich. Um mehr SQL zu üben und zu sehen, wie Fensterfunktionen Ihnen helfen können, probieren Sie den Kurs Fensterfunktionen von LearnSQL.de aus.

Frage 5: Was ist ein Auto-Inkrement?

Für jede Art von Datenbankarbeit ist dieses Wissen erforderlich. Auto-increment ist eine SQL-Funktion, die automatisch und fortlaufend eine eindeutige Nummer erzeugt, wenn ein neuer Datensatz zur Tabelle hinzugefügt wird.

Das Schlüsselwort, mit dem Sie diese Funktion erhalten, ist AUTO_INCREMENT.

Hier ist das Beispiel. Der folgende Code erstellt die Tabelle names mit den durch INSERT INTO definierten Werten:

create table names (
	id INT NOT NULL AUTO_INCREMENT,
	first_name VARCHAR(50),
	last_name VARCHAR(50)
);
INSERT INTO names(first_name, last_name) VALUES ('Kristen', 'Yukhnev');
INSERT INTO names(first_name, last_name) VALUES ('Angelica', 'Hulson');

Die Tabelle sieht dann wie folgt aus:

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson

Um zu sehen, wie die automatische Erhöhungsfunktion funktioniert, fügen Sie der obigen Tabelle einen neuen Datensatz hinzu:

INSERT INTO names (first_name, last_name)
VALUES ('Rosalia', 'O''Towey');

Dadurch wird ein neuer Datensatz zu einer Tabelle hinzugefügt. Wählen Sie alle Daten aus, um zu sehen, wie sich die Tabelle verändert hat:

SELECT *
FROM names;

Jetzt sieht die Tabelle wie folgt aus:

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson
3RosaliaO'Towey

Als wir der Tabelle einen neuen Datensatz hinzugefügt haben, hat AUTO_INCREMENT automatisch eine neue fortlaufende Nummer hinzugefügt. Da in der Tabelle bereits 1 und 2 vorhanden waren, weiß die Datenbank unter AUTO_INCREMENT, dass der nächste Wert 3 sein wird.

Frage 6: Was ist eine Unterabfrage?

Eine Unterabfrage (auch innere Abfrage oder verschachtelte Abfrage genannt) ist eine Abfrage, die innerhalb einer Abfrage steht. Sie gibt Daten zurück, die von der Hauptabfrage verwendet werden. Sie finden sie normalerweise in der WHERE Klausel.

Frage 7: Was wird der folgende Code zurückgeben?

Der folgende Code ist ein Beispiel für eine Unterabfrage:

SELECT	first_name,
		last_name,
		cars_sold
FROM cars
WHERE cars_sold >	(SELECT AVG (cars_sold)
					FROM cars);

Wenn Sie den Code ausführen, werden die Spalten first_name, last_name und cars_sold aus der Tabelle carszurück, aber nur, wenn cars_sold größer ist als die durchschnittliche Anzahl der verkauften Autos.

Frage 8: Gibt es einen Unterschied zwischen einem NULL-Wert und Null?

Ja! Ein NULL-Wert ist das Fehlen von Daten/Informationen. Er hat einen quantitativen Charakter, da er das Fehlen der Menge darstellt. Einfach ausgedrückt, bedeutet NULL in SQL, dass der Wert unbekannt ist oder fehlt; wir wissen nicht, was der Wert ist. Andererseits bedeutet Null, dass es einen Wert gibt, der gleich, nun ja, Null ist. Daher hat die Null einen qualitativen Charakter.

Frage 8: Wie würden Sie Daten mit JOIN filtern?

Die grundlegende Bedeutung von JOIN besteht darin, dass Daten aus einer Tabelle zurückgegeben werden, wenn diese Daten mit den Daten in einer zweiten Tabelle übereinstimmen. In Kombination mit der WHERE Klausel kann JOIN zum Filtern von Daten verwendet werden.

Hier ist ein Beispiel für ein anderes Autohaus. Die erste Tabelle heißt carsund besteht aus den folgenden Daten:

  • model_id - Die ID-Nummer des Fahrzeugmodells.
  • model_name - Der Name des Modells.
  • brand_id - Die ID der Automarke.
  • brand_name - Der Name der Automarke.
  • year_id - Das Jahr, in dem das Modell hergestellt wurde. (Verwendet Daten aus der Tabelle production_year.)

Die zweite Tabelle ist production_year, die die folgenden Spalten enthält:

  • year_id - Eine ID-Nummer für jedes Jahr.
  • year - Das tatsächliche Produktionsjahr.

Was würden Sie tun, wenn Sie alle Modelle finden sollen, die vor 2016 hergestellt wurden? Hier ist der Code:

SELECT	model_name,
		brand_name
FROM	cars JOIN production_year ON cars.year_id = production_year.year_id
WHERE	year_id < 2016;

Lassen Sie mich den Code erklären. Er wählt die Spalten model_name und brand_name aus der Tabelle cars. Diese Tabelle wird mit der Tabelle production_year über die Spalte year_id verbunden, die eine Verbindung zwischen der Tabelle cars und der production_year Tabellen darstellt. Aufgrund der Klausel WHERE gibt dieser Code nur die Autos zurück, die vor 2016 hergestellt wurden, d. h. WHERE year_id < 2016.

Wenn Sie mehr über JOINs erfahren möchten oder das Gelernte üben wollen, kann Ihnen der LearnSQL.de SQL Practice Track dabei helfen.

Frage 10: Wie würden Sie die letzten vier Zeichen aus einer Zeichenkette extrahieren?

Hierfür benötigen Sie die Funktion RIGHT().

Zum Beispiel gibt es die products Tabelle, die aus den folgenden Daten besteht:

  • product - Der Name des Produkts.
  • manufacturer - Die Firma, die das Produkt herstellt.

Die Tabelle sieht wie folgt aus:

productmanufacturer
X278 Hammer 2018Sledge Hammer
M+S Tyres Z348 2020Goodtyre
Paint red pearly 9R458PT12 2019PaintItBlack

Sie müssen das Jahr finden, in dem jedes Produkt hergestellt wurde. Aber derjenige, der die Datenbank erstellt hat, hat einen schlechten Job gemacht. Es gibt keine Spalte mit dem Produktionsjahr! Es sind keine solchen Daten verfügbar - außer den letzten vier Zeichen des Produktnamens. Um das Jahr aus diesem Feld zu extrahieren, würden Sie folgenden Code verwenden:

SELECT	product,
		manufacturer,
		RIGHT(product,4) AS year_produced
FROM products;

Und hier ist das Ergebnis! Einfach, nicht wahr?

productmanufactureryear_produced
X278 Hammer 2018Sledge Hammer2018
M+S Tyres Z348 2020Goodtyre2020
Paint red pearly 9R458PT12 2019PaintItBlack2019

Lassen Sie mich erklären, was wir gerade getan haben. Der Code wählt natürlich die Spalten product und manufacturer aus. Dann haben wir mit der Funktion RIGHT() die Abfrage angewiesen, die Zeichenfolgen in der Spalte product zu nehmen und die letzten vier Zeichen von rechts beginnend zurückzugeben. Diese Ergebnisse werden in der neuen Spalte year_produced angezeigt.

Frage 11: Was ist eine Ansicht? Wie erstellt man einen?

Ein View ist eine virtuelle Tabelle oder eine gespeicherte SQL-Anweisung, die Daten aus einer oder mehreren vorhandenen Tabellen verwendet. Der View wird als "virtuelle Tabelle" bezeichnet, weil die Daten wie eine Tabelle verwendet werden, aber immer dann abgerufen werden, wenn der View ausgeführt wird. (Das Ergebnis eines Views wird nicht als Tabelle gespeichert. )

Nehmen wir an, es gibt eine Tabelle namens salary die die folgenden Spalten enthält:

  • first_name - Der Vorname des Mitarbeiters.
  • last_name - Der Nachname des Mitarbeiters.
  • salary - Das Gehalt des Mitarbeiters.
first_namelast_namesalary
MikeHammer2780
JohnJohnson1600
KateWilliams3000

Die Gehaltsinformationen der Mitarbeiter sind nicht für alle Mitarbeiter des Unternehmens verfügbar. In diesem Unternehmen muss jedoch jeder auf die Liste der Mitarbeiter zugreifen können. Wie würden Sie ihnen das ermöglichen und gleichzeitig keine Vertraulichkeitsregeln verletzen?

Sie würden ihnen keinen Zugriff auf die gesamte Tabelle gewähren, aber Sie könnten eine Ansicht für sie erstellen. Auf diese Weise könnten sie immer auf die neuesten Daten zugreifen, ohne etwas Vertrauliches zu sehen. Und so geht's:

CREATE VIEW		employee_list AS
SELECT		first_name,
			last_name
FROM salary;

Wenn Sie diesen Code ausführen, wird eine Ansicht namens employee_list erstellt, die die Informationen first_name und last_name aus der Tabelle abruft salary. Das ist doch ganz einfach, oder? Sie erstellen ihn mit dem Befehl CREATE VIEW und schreiben dann einfach eine normale Abfrage.

OK, aber damit wurde nur eine Ansicht erstellt. Beim Erstellen der Ansicht wurden keine Daten abgerufen. Wie führen Sie also die Ansicht aus? Sie tun einfach so, als wäre es eine normale Tabelle. Der folgende Code führt die Ansicht aus:

SELECT *
FROM employee_list;

Und die resultierende Tabelle ist hier! Wunderbar! Es werden keine Gehälter angezeigt, Sie haben also nichts vermasselt!

first_namelast_name
MikeHammer
JohnJohnson
KateWilliams

Glauben Sie, dass Sie für eine Stelle bei Fortgeschrittenes SQL bereit sind?

Die Länge des Artikels erlaubt es uns nicht, alle fortgeschrittenen SQL-Themen zu behandeln, auf die Sie bei einem Vorstellungsgespräch stoßen könnten. Ich habe jedoch versucht, Ihnen einen guten Überblick darüber zu geben, was Sie bei einer Bewerbung um eine Stelle, bei der SQL zum Einsatz kommt, erwarten können. Dies soll Ihnen lediglich als Ausgangspunkt für Ihre Nachforschungen dienen, um zu sehen, wo Sie Ihr Wissen verbessern müssen. Wenn Sie noch mehr lernen möchten, können Sie einen interaktiven SQL-Kurs für Fortgeschrittene nutzen, während Sie sich auf das Vorstellungsgespräch vorbereiten.

Schreiben Sie einen Kommentar in den Kommentarbereich! Teilen Sie Ihre Gedanken und Erfahrungen mit!