Occasionally, the number of rows in a table* is not really the number of rows in the table. Sometimes this peculiarity only makes itself known when you export a table and only see a subset of the total rows in the original attribute table … where all the other rows go to?
One reason that this happens (perhaps the most common), is that when you use the “keep only matches” option when doing a join, the non-matched rows are kinda there, and kinda not. To fix this you would need to go back and use the “keep non-matched” option.
*as counted by the “Records (1 out of x)” at the bottom of an attribute table window