EmployeeIDLastNameFirstName1JohnsonJoe2LewisLarry3ThompsonThomas4PattersonPatriciaPhoneNumberIDNumber1555-23233555-9876以下示例 SQL查询对这两个表运行左外连接。SELECT e.ID, e.LastName, e.FirstName, pn.NumberFROM Employee eLEFT OUTER JOIN PhoneNumber pnON e.ID = pn.ID;此查询生成的结果集演示 SQL如何使用 Null作为右侧(PhoneNumber)表中缺少的值的占位符,如下所示。Query resultIDLastNameFirstNameNumber1JohnsonJoe555-23232LewisLarryNULL3ThompsonThomas555-98764PattersonPatriciaNULLSQL定义了聚合函数以简化服务器端的数据聚合计算。除 函数外,所有集合函数都会运行 Null-elimination 步骤,因此计算的最终结果中不包含 Null。请注意,消除 Null不等于用零替换 Null。例如下表中 (求 字段的平均值)将给出与 不同的结果:ij150150200200250250NULL0这里的 是 200(150, 200 和 250的平均),而 则是 150(150, 200, 250 和 0 的平均)。在 SQL 聚合函数中,不等于 ,这是一个众所周知的副作用。聚合函数的输出也可以是空值。这里是一个例子:SELECT COUNT(*), MIN(e.Wage), MAX(e.Wage)FROM Employee eWHERE e.LastName LIKE '%Jones%';此查询将始终输出一行,计算姓氏中包含“Jones”的员工人数,并给出这些员工的最低和最高工资。但是,如果没有员工匹配给定的标准会发生什么?计算空集的最小值或最大值是不可能的,所以这些结果必须为NULL,表示没有答案。这不是未知值,它是表示没有值的空值。结果是:COUNT(*)MIN(e.Wage)MAX(e.Wage)0NULLNULL由于 SQL:2003将所有 Null标记定义为彼此不相等,因此需要特殊定义才能在运行某些操作时将 Null分组在一起。SQL将“任何两个彼此相等的值或任何两个空值”定义为“不同”。的这个定义允许 SQL在使用 GROUP BY 子句(和运行分组的其他关键字)时对 SQL进行分组和排序。其他 SQL操作,子句和关键字在处理空值时使用“不明显”。这些包括以下内容:PARTITION BY 排序和开窗功能的 ROW_NUMBER子句UNION,INTERSECT和 EXCEPT操作符,它们将NULL视为用于行比较/消除目的相同DISTINCT SELECT查询中使用的关键字SQL规范中的 UNION操作符效果会违反空值不相等的原则(它们确实相互确定了空值)。因此某些 SQL操作(如联合或区别)可能产生不能表示确定信息的结果,这与涉及与 NULL进行显式比较的操作(例如 WHERE上面讨论的子句中的那些操作)不同。