Torna all'elenco degli articoli Articoli
Tempo di lettura: 11 minuti

Domande (e risposte) di un colloquio SQL avanzato

Volete passare a un lavoro che utilizza SQL? Non sapete cosa aspettarvi durante il colloquio di lavoro o come valutare le vostre conoscenze? Questo articolo vi darà una buona idea della vostra posizione.

Se vi sentite bloccati nel vostro lavoro, non siete gli unici. La moderna divisione del lavoro spinge le persone a svolgere compiti molto specifici, aspettandosi che non guardino a ciò che c'è dall'altra parte. I lavoratori devono concentrarsi solo sulle loro responsabilità (spesso ripetitive e noiose) e non devono chiedersi nulla di più. Spesso si ha la sensazione di lavorare in una catena di montaggio. Sì, una catena di montaggio, anche in un bell'ufficio con grandi finestre, caffè gratis e frutta fresca. Ma pur sempre una catena di montaggio. O forse volete semplicemente fare il vostro lavoro più velocemente, senza perdere tempo con una gestione inefficiente dei dati.

Cambiare il proprio lavoro o migliorare le proprie prestazioni può aumentare notevolmente la sensazione di fare qualcosa di utile. Questo articolo elenca alcune domande di SQL avanzato che potreste ricevere in un colloquio. E vi forniremo anche le risposte! In questo modo, potrete confrontare le vostre conoscenze attuali e magari imparare qualcosa di nuovo.

Sta a voi decidere se applicarlo al vostro nuovo lavoro o a quello attuale! Iniziamo il nostro "colloquio di lavoro"!

(Siete alla ricerca di domande di base su SQL? Questo articolo è quello che fa per voi).

10 Advanced SQL Domande e risposte per il colloquio di lavoro

Domanda 1: Che cos'è un indice? Quali sono i due tipi principali di indice?

Un indice è una struttura di un database che può aiutare a recuperare i dati più velocemente. Quando si cercano i dati di una tabella con una query SQL, questa cerca nell'intera tabella e restituisce il risultato. Una tabella non indicizzata è chiamata heap. I dati memorizzati in queste tabelle di solito non sono disposti in modo particolare. Vengono memorizzati nell'ordine in cui sono stati inseriti. Pertanto, la ricerca dei dati può essere molto lenta e frustrante.

Quando si interroga una tabella indicizzata, il database va prima all'indice e recupera direttamente i record corrispondenti. I due tipi principali di indice sono:

  • Ammassato
  • Non clusterizzato

Un indice clusterizzato definisce l'ordine esatto dei dati memorizzati nella tabella. Può esistere un solo indice clusterizzato per tabella, poiché la tabella può essere ordinata in un solo modo.

Un indice non clusterizzato punta semplicemente ai dati e l'ordine dei dati nell'indice non corrisponde all'ordine fisico dei dati reali. I dati sono memorizzati in una posizione, mentre l'indice è memorizzato in un'altra posizione.

Domanda 2: Qual è il codice per creare un indice?

Ora passiamo a un esempio pratico! Supponiamo di avere la tabella employeeche ha le seguenti colonne:

  • name - Il nome del dipendente.
  • surname - Il cognome del dipendente.
  • nin - Il numero di identificazione nazionale del dipendente (ad esempio, il numero di previdenza sociale).

Il compito è quello di creare un indice clusterizzato sulla colonna nin e un indice non clusterizzato sulla colonna surname. Come si fa?

Per creare l'indice clusterizzato, il codice sarà:

CREATE CLUSTERED INDEX CL_nin
ON employee(nin);

Questo creerà l'indice clustered con il nome CL_nin, sulla tabella employee e sulla colonna nin.

Per creare l'indice non clusterizzato, il codice sarà:

CREATE NONCLUSTERED INDEX NCL_surname
ON employee(surname);

Eseguendo questo codice, verrà creato un indice non clusterizzato di nome NCL_surname sulla colonna cognome nella tabella employee.

Importante: se non si specifica un tipo (clustered o non clustered), verrà creato un indice non clustered per impostazione predefinita.

Domanda 3: Come si aggiunge una classifica alle righe usando RANK()?

Il monitoraggio dei numeri di vendita è essenziale per ogni azienda. Prendiamo l'esempio di un concessionario di auto. Ci possono essere molti venditori che vendono auto ogni giorno. Immaginiamo che la direzione della concessionaria sia interessata a confrontare i propri venditori. Vogliono sapere chi sta ottenendo buoni risultati e chi invece si limita a rimanere nei paraggi. Si dispone di una tabella salespeople con le seguenti informazioni:

  • first_name - Il nome del dipendente.
  • last_name - Il cognome del dipendente.
  • cars_sold - Il numero di auto vendute da questo dipendente.

Come si fa a inserire un rango in questa tabella, mostrata di seguito?

first_namelast_namecars_sold
ClarabelleHanmer77
ChristianoOverstall51
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn57
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

Il codice per questo problema è:

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

Il codice utilizza la funzione finestra di RANK(). Poiché non è stata definita alcuna finestra, la funzione utilizzerà l'intera tabella. Classificherà i dati in base alla colonna cars_sold e il rango verrà aggiunto alla nuova colonna rank_sales. Eseguite il codice e otterrete una bella tabella, che vi farà guadagnare un punto al colloquio!

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

Ho scritto un articolo più dettagliato sulle funzioni delle finestre e sul loro utilizzo (con esempi) se volete approfondire. C'è anche il pratico ricettario LearnSQL.it da cui ho rubato questo codice. Potete farlo anche voi! La sezione del ricettario è fondamentalmente un elenco di problemi comuni risolti utilizzando SQL. Potete trovare una soluzione molto rapidamente, leggere la spiegazione e ottenere uno snippet di codice da utilizzare per risolvere i vostri compiti.

Domanda 4: Qual è la differenza tra RANK() e DENSE_RANK()?

La differenza principale è che RANK() assegna a tutte le righe con gli stessi valori (nei criteri di classificazione) lo stesso grado. Inoltre, salta i ranghi se più di una riga ha lo stesso rango; il numero di ranghi saltati dipende da quante righe condividono lo stesso valore. Questo crea ranghi non consecutivi.

Con DENSE_RANK(), anche le righe con gli stessi valori saranno classificate allo stesso modo. Tuttavia, questa funzione non salta alcun rango, quindi crea ranghi consecutivi.

Ecco un esempio per chiarire la differenza. Modifichiamo la tabella dell'esempio precedente. La tabella si presenta così:

first_namelast_namecars_sold
ClarabelleHanmer72
ChristianoOverstall84
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn72
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

Se si esegue il codice dell'esempio precedente, RANK() otterrà questo risultato:

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

Noterete che il rango 5 viene assegnato due volte, quindi la classifica salta il 6 e passa direttamente al 7. Il rango 7 viene assegnato tre volte, dopodiché la classifica passa direttamente a 10.

Per vedere come DENSE_RANK() classifica le righe, eseguire il codice seguente:

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;

Il risultato sarà simile a questo:

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

Conoscere le funzioni di window è essenziale per qualsiasi lavoro che richieda una conoscenza avanzata di SQL. Per fare più pratica con l'SQL e vedere come le funzioni finestra possono aiutarvi, provate il corso sulle funzioni finestra di LearnSQL.it.

Domanda 5: Che cos'è un autoincremento?

Qualsiasi tipo di lavoro su database richiede questa conoscenza. L'autoincremento è una funzione SQL che crea automaticamente e in sequenza un numero univoco ogni volta che un nuovo record viene aggiunto alla tabella.

La parola chiave che fornisce questa funzione è AUTO_INCREMENT.

Ecco l'esempio. Il codice seguente creerà la tabella names con i valori definiti da INSERT INTO:

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');

La tabella avrà questo aspetto:

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson

Per vedere come funziona la funzione di autoincremento, aggiungete un nuovo record alla tabella precedente:

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

In questo modo si aggiunge un nuovo record a una tabella. Selezionare tutti i dati per vedere come è cambiata la tabella:

SELECT *
FROM names;

Ora la tabella ha questo aspetto:

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson
3RosaliaO'Towey

Quando abbiamo aggiunto un nuovo record alla tabella, AUTO_INCREMENT ha aggiunto automaticamente un nuovo numero sequenziale. Poiché in precedenza nella tabella esistevano 1 e 2, con AUTO_INCREMENT il database sa che il prossimo valore sarà 3.

Domanda 6: Che cos'è una subquery?

Una sottoquery (chiamata anche query interna o query annidata) è una query inserita all'interno di una query. Restituisce dati che saranno utilizzati dalla query principale. Di solito si trova nella clausola WHERE.

Domanda 7: Cosa restituisce il codice seguente?

Il codice seguente è un esempio di subquery:

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

L'esecuzione del codice restituirà le colonne first_name, last_name e cars_sold dalla tabella, ma solo se è maggiore del numero medio di auto vendute. carsma solo se cars_sold è maggiore del numero medio di auto vendute.

Domanda 8: C'è differenza tra un valore NULL e zero?

Sì! Un valore NULL è l'assenza di dati/informazioni. Ha un carattere quantitativo, in quanto rappresenta l'assenza di una quantità. In parole povere, NULL in SQL significa che il valore è sconosciuto o mancante; non sappiamo quale sia il valore. D'altra parte, zero significa che esiste un valore che è uguale a, beh, zero. Pertanto, lo zero ha un carattere qualitativo.

Domanda 8: Come si filtrano i dati utilizzando JOIN?

Il significato di base di JOIN è che restituisce i dati di una tabella quando questi dati sono uguali a quelli di una seconda tabella. Combinandolo con la clausola WHERE, JOIN può essere utilizzato per filtrare i dati.

Ecco un esempio di un'altra concessionaria di auto. La prima tabella si chiama carsed è composta dai seguenti dati:

  • model_id - Il numero identificativo del modello di auto.
  • model_name - Il nome del modello.
  • brand_id - L'ID della marca dell'auto.
  • brand_name - Il nome della marca dell'auto.
  • year_id - L'anno di produzione del modello. (Utilizza i dati della tabella production_year.)

La seconda tabella è production_yearche contiene le seguenti colonne:

  • year_id - Un numero ID per ogni anno.
  • year - L'anno effettivo di produzione.

Cosa fareste se vi chiedessero di trovare tutti i modelli prodotti prima del 2016? Ecco il codice:

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

Vi spiego il codice. Seleziona la colonna model_name e brand_name dalla tabella cars. Questa tabella viene unita alla tabella production_year utilizzando la colonna year_id, che è un collegamento tra la tabella cars e la tabella production_year e la tabella . A causa della clausola WHERE, questo codice restituisce solo le auto prodotte prima del 2016, cioè WHERE year_id < 2016.

Se siete interessati a saperne di più sulle JOIN o se volete mettere in pratica ciò che avete imparato, la traccia pratica diLearnSQL.it SQL può aiutarvi.

Domanda 10: Come si possono estrarre gli ultimi quattro caratteri da una stringa?

Per farlo, è necessaria la funzione RIGHT().

Ad esempio, esiste la tabella products che contiene i seguenti dati:

  • product - Il nome del prodotto.
  • manufacturer - L'azienda che produce il prodotto.

La tabella si presenta così:

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

È necessario trovare l'anno di produzione di ogni prodotto. Ma chi ha creato il database ha fatto un pessimo lavoro. Non c'è una colonna con l'anno di produzione! Non c'è nessun dato disponibile, se non gli ultimi quattro caratteri del nome del prodotto. Per estrarre l'anno da quel campo, ecco il codice da utilizzare:

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

Ed ecco il risultato! Semplice, vero?

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

Lasciate che vi spieghi cosa abbiamo appena fatto. Il codice, ovviamente, seleziona le colonne product e manufacturer. Poi, utilizzando la funzione RIGHT(), abbiamo istruito la query a prendere le stringhe nella colonna prodotto e a restituire gli ultimi quattro caratteri partendo da destra. Metteremo questi risultati nella nuova colonna year_produced.

Domanda 11: Che cos'è una vista? Come si fa a crearne una?

Una vista è una tabella virtuale o un'istruzione SQL memorizzata che utilizza i dati di una o più tabelle esistenti. La vista è chiamata "tabella virtuale" perché i dati sono utilizzati come una tabella, ma vengono recuperati ogni volta che la vista viene eseguita. (Il risultato di una vista non viene memorizzato come tabella).

Supponiamo che esista una tabella chiamata salary che contiene le seguenti colonne:

  • first_name - Il nome del dipendente.
  • last_name - Il cognome del dipendente.
  • salary - Lo stipendio del dipendente.
first_namelast_namesalary
MikeHammer2780
JohnJohnson1600
KateWilliams3000

Le informazioni sullo stipendio dei dipendenti non sono disponibili per tutti i dipendenti dell'azienda. Tuttavia, in questa azienda tutti devono poter accedere all'elenco dei dipendenti. Come si può consentire loro di farlo e, allo stesso tempo, non infrangere le regole di riservatezza?

Non si può permettere loro di accedere all'intera tabella, ma si può creare una vista per loro. In questo modo, potranno sempre accedere ai dati più recenti senza vedere nulla di riservato. Ecco come fare:

CREATE VIEW		employee_list AS
SELECT		first_name,
			last_name
FROM salary;

L'esecuzione di questo codice creerà una vista denominata employee_list, che recupererà le informazioni di first_name e last_name dalla tabella. salary. È semplice, vero? La si crea con il comando CREATE VIEW, poi si scrive una normale query.

Ok, ma questo crea solo una vista. La creazione non ha recuperato alcun dato. Come si esegue la vista? Semplicemente facendo finta che sia una normale tabella. Il codice sottostante eseguirà la vista:

SELECT *
FROM employee_list;

E la tabella risultante è qui! Bellissima! Non vengono mostrati gli stipendi, quindi non si è sbagliato nulla!

first_namelast_name
MikeHammer
JohnJohnson
KateWilliams

Pensate di essere pronti per un lavoro su Advanced SQL?

La lunghezza dell'articolo non ci consente di trattare tutti gli argomenti di SQL avanzato che potreste incontrare in un colloquio di lavoro. Tuttavia, ho cercato di fornire una buona panoramica di ciò che ci si può aspettare quando si fa domanda per un lavoro che utilizza SQL. Questo dovrebbe essere solo un punto di partenza per iniziare a fare ricerche e vedere dove le vostre conoscenze devono essere migliorate. Se siete interessati a saperne di più, c'è un corso interattivo di SQL avanzato che potete utilizzare mentre vi preparate per il colloquio.

Sentitevi liberi di commentare nella sezione commenti! Condividete i vostri pensieri e le vostre esperienze di colloquio!