Microsoft SQL Server 2008技术内幕:T-SQL语言基础(联接查询)

一、表运算符

  • from子句内可以用表运算符对输入的表进行操作
  • 表运算符
    • ANSI
      • join
    • SQL Server
      • apply
      • pivot
      • unpivot

一、交叉联接

  • 笛卡尔积
    • cross join
    • 获得 n × m 行的结果集
  • 如果为表起了别名,则再使用表的全名作为列名前缀是无效的

二、内联接

  • 逻辑处理步骤
    • 先进行笛卡尔积运算
    • 再根据指定的谓词对结果行进行过滤
    • 物理运算会进行优化
  • [ inner ] join tablename on condition

三、特殊的联接实例

3.1 组合联接

  • 联接条件涉及联接两边的多个列的查询

3.2 不等联接

  • 联接条件包含除等号以外的其他运算符

3.3 多表联接

  • 表运算符在逻辑上是按从左到右的顺序处理的

四、外联接

4.1 外联接基础

  • 逻辑处理步骤
    • 先进行笛卡尔积运算
    • 再根据指定的谓词对结果行进行过滤
    • 添加外部行
      • 内部行
        • 能够按照联接条件匹配的行
      • 外部行
        • 不能按照联接条件匹配的行
  • [ outer ] join
    • left [ outer ] join
      • 表示左边表的行是保留的
    • right [ outer ] join
    • full [ 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,所以会将外部行纳入计算
标准中文版的pdf和实例数据脚本,分享给大家 《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决方案。 作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL Server 2008技术内幕:T-SQL查询》内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性很强,可以把它们作为解决实际问题的标准模式。阅读《Microsoft SQL Server 2008技术内幕:T-SQL查询》,可以充分地理解T-SQL语言和良好的编程实践,学会如何编写更加有效而强大的查询语句。 目录 -------------------------------------------------------------------------------- 序言 I 致谢III 前言 V 第1章 逻辑查询处理1 1.1 逻辑查询处理的各个阶段2 1.1.1 逻辑查询处理阶段简介2 1.2 客户/订单场景下的查询示例4 1.3 逻辑查询处理阶段详解5 1.3.1 步骤1:FROM阶段5 1.3.2 步骤2:WHERE阶段9 1.3.3 步骤3:GROUP BY阶段10 1.3.4 步骤4:HAVING阶段11 1.3.5 步骤5:SELECT阶段12 1.3.6 步骤6:排序用的ORDER BY阶段13 1.4 逻辑查询处理的深入内容16 1.4.1 表运算符16 1.4.2 OVER子句23 1.4.3 集合运算符25 1.5 总结26 第2章 集合论和谓词逻辑27 2.1 自然语言表述到数学表示的转换27 2.1.1 严格定义(well-Definedness)28 2.1.2 相等、恒等和同一性30 2.1.3 数学命名约定30 2.1.4 数字31 2.1.5 上下文32 2.1.6 函数、参数和变量33 2.1.7 指令和算法34 2.2 集合论34 2.2.1 集合的标记方法35 2.2.2 集合的严格定义36 2.2.3 论域36 2.2.4 真实性38 2.2.5 罗素悖论(Russell s Paradox)40 2.2.6 有序对、元组和笛卡尔积41 2.2.7 空集42 2.2.8 集合的特征函数43 2.2.9 集合的基数(Cardinality)43 2.2.10 顺序44 2.2.11 集合运算符47 2.2.12 集合论的推广50 2.3 谓词逻辑50 2.3.1 编程语言中的逻辑功能50 2.3.2 命题和谓词51 2.3.3 排中律53 2.3.4 与、或、非运算53 2.3.5 逻辑等价55 2.3.6 逻辑蕴含55 2.3.7 量化(Quantification)56 2.3.8 替代和推广58 2.4 关系59 2.4.1 自反性、对称性和传递性59 2.5 一个实际的应用60 2.6 总结63 第3章 关系模型65 3.1 关系模型简介65 3.1.1 关系、元组和类型65 3.1.2 关系模型:快速摘要70 3.2 关系代数和关系计算70 3.2.1 基本运算符71 3.2.2 关系代数71 3.2.3 Codd提出的8个原始关系运算符72 3.2.4 关系演算79 T-SQL支持80 3.3 数据完整性81 3.3.1 声明式约束82 3.3.2 实施完整性的其他方法84 3.4 数据库正规化和其他设计主题86 3.4.1 解决函数依赖的范式87 3.4.2 更高级的范式92 3.4.3 反规范化(Denormalization)95 3.4.4 一般化和特殊化96 3.5 总结98 第4章 查询优化99 4.1 本章用到的样本数据99 4.2 优化方法论102 4.2.1 分析实例级别的等待104 4.2.2 关联等待和队列111 4.2.3 确定行动方案112 4.2.4 细化到数据库/文件级别113 4.2.5 细化到进程级别115 4.2.6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值