> This says to me a subquery (which always returns a single value) represents an empty rowset as `null` in that return value, but attempting to select a single column from an empty rowset does not return `null`. Rather, it kind of says "I have no value, so there is nothing to assign".

I think you are looking at both cases incorrectly.

1. A subquery does not return does not return a result set. It returns a scalar value. When no scalar value exists, it returns `NULL` for precisely the reason you thought: it means "unknown". Think of a subquery as being a replacement for a scalar UDF. It will always return a single something (T-SQL does not allow for a return type of `void`). So, what you have is effectively: `select @testB = dbo.Function(6);` assuming that "dbo.Function" is defined as:

        CREATE FUNCTION dbo.Function (@Input INT)
        RETURNS INT
        AS
        BEGIN
          DECLARE @Temp INT;
          SELECT @Temp = TestTable.[id]
          FROM   (VALUES (5)) TestTable([id])
          WHERE  TestTable.[id] = @Input;

          RETURN @Temp;
        END;
1. I wouldn't think of an empty result set in terms of "I have no value, so there is nothing to assign". Instead, think of it in terms of: an assignment will be performed for every row returned, and no rows returned means that there is no action to take. It might be a subtle difference, but the focus really needs to be on "rows = actions" more so than "returned value is something that can be assigned".