Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SELEZIONA CONTEGGIO(*);

Normalmente tutte le selezioni sono della forma SELECT [columns, scalar computations on columns, grouped computations on columns, or scalar computations] FROM [table or joins of tables, etc]

Poiché ciò consente semplici calcoli scalari, possiamo fare qualcosa come SELECT 1 + 1 FROM SomeTable e restituirà un recordset con il valore 2 per ogni riga nella tabella SomeTable .

Ora, se non ci interessava nessuna tabella, ma volevamo solo fare il nostro calcolo scalare, potremmo voler fare qualcosa come SELECT 1 + 1 . Questo non è consentito dallo standard, ma è utile e la maggior parte dei database lo consente (Oracle non lo fa a meno che non sia stato modificato di recente, almeno una volta non lo era).

Quindi tali SELECT spogli vengono trattati come se avessero una clausola from che specificava una tabella con una riga e nessuna colonna (impossibile ovviamente, ma fa il trucco). Quindi SELECT 1 + 1 diventa SELECT 1 + 1 FROM ImaginaryTableWithOneRow che restituisce una singola riga con una singola colonna con il valore 2 .

Per lo più non ci pensiamo, ci abituiamo semplicemente al fatto che le SELECT nude danno risultati e non pensiamo nemmeno al fatto che deve esserci qualcosa di una riga selezionata per restituire una riga.

Nel fare SELECT COUNT(*) hai fatto l'equivalente di SELECT COUNT(*) FROM ImaginaryTableWithOneRow che ovviamente restituisce 1.