Bedste svar
Der er allerede nogle gode svar her, men desværre er nogle forkerte.
1 i COUNT (1) er bare et bogstaveligt konstant udtryk, det har intet at gøre med kolonne 1 i tabellen. Det giver det samme svar som COUNT (*) og har den samme udførelsesplan. Forespørgslen tæller rækkerne i det mindste ikke-grupperede indeks for at minimere det krævede I / O.
TÆLLING (Col) (for en ugyldig kolonne) findes ved at tælle rækker i det mindste indeks, der inkluderer Col, hvis det ikke er i noget indeks, kræves der en tabel-scanning. Hvis Col er i den klyngede nøgle eller indeks, er det også en del af hvert andet indeks, så det mindste ikke-grupperede indeks scannes snarere end en klyngetabelscanning.
Hvis den målrettede kolonne IKKE er NULL, så TÆL (Col) er identisk med COUNT (*) og vil igen blive fundet ved at scanne det mindste ikke-grupperede indeks, selvom Col ikke er i noget indeks.
Disse udsagn er baseret på estimerede udførelsesplaner for forskellige forespørgsler om en SQL 2014-server, fungerer forespørgselsoptimeringsværktøjerne til ældre eller nyere versioner muligvis forskelligt. Du kan finde ud af, at lære at læse udførelsesplaner kan lære dig meget mere om, hvordan forespørgsler udføres, end at prøve at finde ud af, hvilket svar der er sendt her, er mere nøjagtigt.
Svar
Parameteren til COUNT-funktionen er et udtryk, der skal evalueres for hver række. COUNT-funktionen returnerer antallet af rækker, som udtrykket evalueres for, til en værdi, der ikke er nul. (* er et specielt udtryk, der ikke evalueres, det returnerer simpelthen antallet af rækker.)
Der er to yderligere modifikatorer til udtrykket: ALL og DISTINCT. Disse bestemmer, om dubletter kasseres. Da ALL er standard, er dit eksempel det samme som antal (ALL 1), hvilket betyder, at duplikater bevares.
Da udtrykket “1” evalueres til ikke-null for hver række, og da du fjerner ikke dubletter, skal COUNT (1) altid returnere det samme nummer som COUNT (*).