第三章 操作多个表
- 记录集的叠加
- 使用集合操作union all把多个表中的行组合到一起
- select.... union all select...
- 注意事项:
- 所有select中的项目数和对应项目的数据类型必须要匹配
- union all将包括重复的项目,如果要去掉重复项,使用union
- 一般使用union all 极少使用union
- 组合相关的行
- 内连接(inner join):链接条件是相等的条件。
- 内连接的关键字inner可写可不写
- 在两个表中查找共同行
- MySQL和SQL server:
- 使用多个连接条件,将两个表连接起来
- BD2,Oracle和PostgreSQL
- 使用intersect以及in
- intersect:对两个结果集进行交集操作,不包括重复行,重复的会被过滤,同时进行默认规则的排序。
- MySQL和SQL server:
- 从一个表中查找另一个表没有的值
- BD2,PostgreSQL:
- 使用求差集函数except
- except、except all 都是取集合的差集; 它们的区别在于except取差集后会删除重复项,而except all 不删除重复项。
- select...except select....
- Oracle:
- 使用求差集函数minus
- select....minus select....
- MySQL和SQL server
- 使用子查询返回表a有的,用外层的not in查找没有的
- BD2,PostgreSQL:
- 在一个表中查找与其他表不匹配的记录
- BD2,MySQL,PostgreSQL,SQL server:
- 使用外连接及null筛选(left join)
- Oracle:
- Oracle9i及以后的版本可以使用1的方案
- 也可以使用Oracle特有的外连接语法(+)
- BD2,MySQL,PostgreSQL,SQL server:
- 向查询中增加联接而不影响其他联接
- 内连接+外连接
- DB2,MySQL,PostgreSQL和SQL server
- from A join B on 条件1 left join C on 条件2
- Oracle
- Oracle9i及以后的版本可以使用1的方案
- 也可以使用Oracle特有的外连接语法(+)
- 检测两个表中是否有相同的数据(基数和值)
- 使用差集函数(minus,except)
- 如果所使用的DBMS不支持此类函数,还可以使用相关子查询
- DB2和PostgreSQL:
- 使用except和union all 求A和B的差集,以及B和A的差集,并将两个差集合并
- Oracle:
- 使用minus和union all 求A和B的差集,以及B和A的差集,并将两个差集合并
- MySQL和SQL server
- 使用关联子查询和union all 来查找A中存在而B中不存在的行,B中存在A中不存在的行,并将两个行合并
- 识别和消除笛卡尔积
- 在from子句对表进行联接来返回正确的结果集
- 聚集与联接(联接产生重复行)
- 方法一:在调用聚合函数时,使用关键字distinct,这样每个值只参与计算一次(3,4)
- 方法二:在进行联接前先执行聚集操作(内联视图中)
- MySQL和PostgreSQL:
- 使用distinct关键字只对不同的工资求和
- DB2,Oracle和SQL server
- 也支持上面方法
- 窗口函数sum over
- 聚集与外连接
- DB2,MySQL,PostgreSQL和SQL server
- 外联接,然后处理
- 窗口函数sum over
- Oracle
- Oracle9i及以后的版本可以使用1的方案
- 独有的外连接语法
- DB2,MySQL,PostgreSQL和SQL server
- 从多个表中返回丢失的数据
- DB2,MySQL,PostgreSQL和SQL server
- 使用full outer join命令返回两个表中丢失的行以及所有匹配的行,
- 合并两个不同外连接的结果
- Oracle
- Oracle9i及以后的版本可以使用以上两种的方案
- 独有的外连接语法
- DB2,MySQL,PostgreSQL和SQL server
- 在运算和比较时使用null值
- NULL永远不会等于或不等于任何值,包括NULL自己,但是需要像计算真实值一样计算可为空列的返回值
- 使用coalesce函数将null转化为一个可以用来作为标准值进行比较的真实值