Durante la preparazione del materiale introduttivo SQL, ho finito di chiedermi la linea di pensiero seguita da uno sviluppatore durante la scrittura di una query. Credo che potrebbe essere troppo prezioso dal punto di vista di un principiante.
Lasciatemi illustrare l'argomento con un esempio. Per brevità, non includerò lo schema del database, sperando che la query sia abbastanza descrittiva da sola.
Supponiamo di voler scrivere una query per recuperare tutti i nuovi clienti dall'ultimo trimestre. Tipico. Io, la prima cosa a cui penso è l'insieme delle entità coinvolte, a cominciare da quelle corrispondenti ai dati richiesti. Quindi, poiché voglio ottenere clienti, prima di tutto scrivo la seguente query scheletro:
SELECT
FROM Customers AS NewCustomer
WHERE
Seguono immediatamente le restanti entità . In questo contesto fittizio, un nuovo cliente è un cliente che ha effettuato un ordine per la prima volta:
SELECT
FROM Customers AS NewCustomer
INNER JOIN Orders AS RecentOrder
LEFT JOIN Orders AS OlderOrder
WHERE
AND OlderOrder.Id IS NULL
Con tutte le entità identificate, procedo scrivendo le relazioni tra loro:
SELECT
FROM Customers AS NewCustomer
INNER JOIN Orders AS RecentOrder
ON RecentOrder.CustomerId = NewCustomer.Id
LEFT JOIN Orders AS OlderOrder
ON OlderOrder.CustomerId = RecentOrder.CustomerId
AND OlderOrder.PlacementDate < RecentOrder.PlacementDate
WHERE
AND OlderOrder.Id IS NULL
Una volta che ho finito con le entità, è tempo che io definisca le restrizioni da applicare sul set di dati risultante:
SELECT
FROM Customers AS NewCustomer
INNER JOIN Orders AS RecentOrder
ON RecentOrder.CustomerId = NewCustomer.Id
LEFT JOIN Orders AS OlderOrder
ON OlderOrder.CustomerId = RecentOrder.CustomerId
AND OlderOrder.PlacementDate < RecentOrder.PlacementDate
WHERE RecentOrder.PlacementDate BETWEEN @fromDate AND @toDate
AND OlderOrder.PlacementDate < @fromDate
AND OlderOrder.Id IS NULL
Infine, mi chiedo quali dati concreti campi voglio che la query restituisca, completando così la clausola SELECT
:
SELECT NewCustomer.FirstName, NewCustomer.LastName
FROM Customers AS NewCustomer
INNER JOIN Orders AS RecentOrder
ON RecentOrder.CustomerId = NewCustomer.Id
LEFT JOIN Orders AS OlderOrder
ON OlderOrder.CustomerId = RecentOrder.CustomerId
AND OlderOrder.PlacementDate < RecentOrder.PlacementDate
WHERE RecentOrder.PlacementDate BETWEEN @fromDate AND @toDate
AND OlderOrder.PlacementDate < @fromDate
AND OlderOrder.Id IS NULL
Naturalmente, questa è una query molto semplice, senza aggregazioni, query annidate e altre cose avanzate. Ma questa è la mia linea di pensiero generale, indipendentemente dalla complessità della query:
- Enti
- Relazioni
- Restrizioni
- Campi
La mia domanda è, è uno schema adatto per essere insegnato esplicitamente a un principiante? Come potrebbe essere migliorato, comunque, per appianare la sua curva di apprendimento?