T-SQL语言基础 一、表运算符一、交叉联接二、内联接三、特殊的联接实例3.1 组合联接3.2 不等联接3.3 多表联接 四、外联接4.1 外联接基础4.2 外联接的高级主题4.2.1 包含缺少值的数据4.2.2 对外联接中非保留表的列值进行过滤4.2.3 在多表联接中使用外联接4.2.4 随外联接一起使用count聚合函数 一、表运算符 from子句内可以用表运算符对输入的表进行操作表运算符 ANSI join SQL Server applypivotunpivot 一、交叉联接 笛卡尔积 cross join获得 n × m 行的结果集 如果为表起了别名,则再使用表的全名作为列名前缀是无效的 二、内联接 逻辑处理步骤 先进行笛卡尔积运算再根据指定的谓词对结果行进行过滤物理运算会进行优化 [ inner ] join tablename on condition 三、特殊的联接实例 3.1 组合联接 联接条件涉及联接两边的多个列的查询 3.2 不等联接 联接条件包含除等号以外的其他运算符 3.3 多表联接 表运算符在逻辑上是按从左到右的顺序处理的 四、外联接 4.1 外联接基础 逻辑处理步骤 先进行笛卡尔积运算再根据指定的谓词对结果行进行过滤添加外部行 内部行 能够按照联接条件匹配的行 外部行 不能按照联接条件匹配的行 [ outer ] join left [ outer ] join 表示左边表的行是保留的 right [ outer ] joinfull [ outer ] join 4.2 外联接的高级主题 4.2.1 包含缺少值的数据 查询所有订单,并确保每个日期至少在结果中出现一行 先生成一个 1~100000 的数字表通过数字表生成每个日期每个日期再和订单表进行外联接 select dateadd(day, nums.n-1, '20060101') as orderdate o.orderid, o.custid, o.empid from dbo.nums left outer join sales.orders as o on dateadd(day, nums.n-1, '20060101') = o.orderdate where nums.n <= datediff(day, '20060101','20081231')+1 order by orderdate; 4.2.2 对外联接中非保留表的列值进行过滤 外联接得到的外部行中来自非保留表的列值均为null当采用 <列><运算符><值>的形式进行过滤时,null值会被过滤 相当于抵消了外联接的作用等价于内联接 4.2.3 在多表联接中使用外联接 异常情况 先进行一次外联接,再进行内联接且内联接时,非保留表中的列作为联接条件外联接作用会被抵消,相当于进行了多表内联接 解决方式 方式一:都使用外联接方式二:先进行内联接,再进行外联接方式三:使用括号改变联接顺序,先进行内联 4.2.4 随外联接一起使用count聚合函数 count(*) 会统计null,所以会将外部行纳入计算