1)
Sql supporta la chiusura relazionale, il che significa che è possibile utilizzare le tabelle di base, i letterali di tabella, le viste, le sottoquery, le CTE, le variabili di tabella e le funzioni a valori di tabella in modo intercambiabile nelle query e annidarle arbitrariamente.
È anche possibile utilizzare il set di risultati da una stored procedure in una query, purché si esegua la query e carichi preventivamente il risultato in una tabella temporanea o in una variabile di tabella. Non puoi includere l' esecuzione di una stored procedure come parte di una query, per due motivi:
- Una stored procedure potrebbe non restituire nessuno o più set di risultati. Non è noto al momento della compilazione quali risultati verranno restituiti, quindi non è possibile generare un piano di query.
- Le procedure memorizzate possono avere effetti collaterali. Questo non può essere logicamente supportato come parte di una query. Voglio dire, la procedura potrebbe abbandonare la tabella a cui è unita, o potrebbe emettere un comando esterno per arrestare il database.
Una funzione con valori di tabelle multistato supporta alcune delle stesse logiche complesse delle stored procedure (variabili, condizionali ecc.) ma con i vincoli che non possono avere effetti collaterali e lo schema del set di risultati è definito staticamente. Per questo motivo le funzioni a valori di tabella possono essere utilizzate come sottoquery, al contrario delle stored procedure.
2)
Tu puoi utilizzare la proiezione, i filtri e il raggruppamento in ordine arbitrario, se nidifichi sottoquery. Having
è solo zucchero di sintassi per filtrare una sottoquery con un raggruppamento. Ma la sintassi con sottoquery nidificate è certamente più ingombrante. Ciò è probabilmente dovuto al fatto che SQL è stato progettato per i non programmatori, quindi una semplice sintassi "inglese come" è stata preferita per una sintassi più "programmabile".
Order by
può verificarsi solo come ultima clausola di una query, ma in realtà ciò è coerente con la chiusura relazionale. Poiché una relazione è per definizione non ordinata, non è possibile conservare l'ordine in un'operazione di relazioni. Quindi l'ordine deve essere l'ultima operazione sul set di risultati. (La clausola top
è concettualmente dopo order by
, anche se è la prima nella sintassi. Poiché prende in considerazione l'ordine, non è nemmeno un operatore relazionale)
Al contrario, Linq è più flessibile perché consente di ordinare operazioni arbitrariamente mescolate con la proiezione, il filtraggio e il raggruppamento. Ma questo perché Linq non è relazionale. Funziona su sequenze ordinate . L'ordine è chiuso su sequenze ordinate, ma non su relazioni.
In breve: SQL supporta l'algebra e la chiusura relazionale, la sintassi è piuttosto alquanto clunky per gli standard moderni.
3)
SQL ha una logica a tre valori , quindi un booleano è vero , falso o sconosciuto . Quindi non può essere mappato direttamente a un tipo di bit, sebbene possa teoricamente essere mappato su un bit nullable, con il valore sconosciuto che corrisponde a null .
Ma c'è un problema più profondo. Nelle espressioni scalari tsql e le espressioni booleane sono consentite in posizioni diverse nella sintassi e non sono intercambiabili. Quindi non c'è modo di ottenere comunque un risultato booleano come valore!
Lo standard SQL inizialmente non supportava i booleani come un tipo di prima classe e le espressioni booleane come intercambiabili con espressioni scalari, ma il supporto era stato introdotto in SQL: 1999. SQL Server ancora non supporta questo, ma non è più una limitazione fondamentale di SQL.