|
1. 除非有必要,否则不要用UNION代替UNION ALL
2. 查找两个表中相同的行
2.1. 当执行连接查询时,为了得到正确的结果,必须慎重考虑要把哪些列作为连接项
2.2. 当参与连接的行集里的某些列可能有共同值,而其他列有不同值的时候,这一点尤为重要
2.3. 集合运算INTERSECT会返回两个行集的相同部分
2.3.1. 必须保证两个表里参与比较的项目数目是相同的,并且数据类型也是相同的
2.3.2. 默认不会返回重复项
2.4. 示例
2.4.1. sql
- create view V
- as
- select ename,job,sal
- from emp
- where job = 'CLERK'
- select * from V
- ENAME JOB SAL
- ---------- --------- ----------
- SMITH CLERK 800
- ADAMS CLERK 1100
- JAMES CLERK 950
- MILLER CLERK 1300
复制代码 2.4.2. sql
- select e.empno,e.ename,e.job,e.sal,e.deptno
- from emp e join V
- on ( e.ename = v.ename
- and e.job = v.job
- and e.sal = v.sal )
复制代码 2.4.3. sql
- select empno,ename,job,sal,deptno
- from emp
- where (ename,job,sal) in (
- select ename,job,sal from emp
- intersect
- select ename,job,sal from V
- )
复制代码 3. 查找只存在于一个表中的数据
3.1. MySQL
3.1.1. sql
- select deptno
- from dept
- where deptno not in (select deptno from emp)
复制代码 3.1.2. sql
- select distinct deptno
- from dept
- where deptno not in (select deptno from emp)
复制代码 3.1.2.1. 排除重复项
3.1.3. 在使用NOT IN时,要注意Null值
3.2. PostgreSQL
3.2.1. sql
- select deptno from dept
- except
- select deptno from emp
复制代码 3.3. Oracle
3.3.1. sql
- select deptno from dept
- minus
- select deptno from emp
复制代码 3.4. 要点
3.4.1. 参与运算的两个SELECT列表要有相同的数据类型和值个数
3.4.2. 不返回重复项
3.4.3. Null值不会产生问题
3.5. sql
- select deptno
- from dept
- where deptno not in ( 10,50,null )
- ( no rows )
- select deptno
- from dept
- where not (deptno=10 or deptno=50 or deptno=null)
- ( no rows )
复制代码 3.5.1. 三值逻辑
3.6. 免受Null值影响的替代方案
3.6.1. sql
- select d.deptno
- from dept d
- where not exists ( select null
- from emp e
- where d.deptno = e.deptno )
复制代码 4. 从一个表检索与另一个表不相关的行
4.1. 使用外连接并过滤掉Null值
4.2. sql
- select d.*
- from dept d left outer join emp e
- on (d.deptno = e.deptno)
- where e.deptno is null
复制代码 4.2.1. 反连接(anti-join)
5. 新增连接查询而不影响其他连接查询
5.1. 外连接既能够获得额外信息,又不会丢失原有的信息
5.1.1. sql
- select e.ename, d.loc, eb.received
- from emp e join dept d
- on (e.deptno=d.deptno)
- left join emp_bonus eb
- on (e.empno=eb.empno)
- order by 2
复制代码 5.2. 使用标量子查询
5.2.1. 把子查询放置在SELECT列表里
5.2.2. 在不破坏当前结果集的情况下,标量子查询是为现有查询语句添加额外数据的好办法
5.2.3. sql
- select e.ename, d.loc,
- (select eb.received from emp_bonus eb
- where eb.empno=e.empno) as received
- from emp e, dept d
- where e.deptno=d.deptno
- order by 2
复制代码 6. 识别并消除笛卡儿积
6.1. n-1法则
6.1.1. n代表FROM子句里表的个数
6.1.2. n-1则代表消除笛卡儿积所必需的连接查询的最少次数
6.2. 笛卡儿积常用于变换或展开(以及合并)结果集,生成一系列的值,以及模拟loop循环
7. 组合使用连接查询与聚合函数
7.1. 如果连接查询产生了重复行,两种办法来使用聚合函数可以避免得出错误的计算结果
7.1.1. 调用聚合函数时直接使用关键字DISTINCT,这样每个值都会先去掉重复项再参与计算
7.1.2. 在进行连接查询之前先执行聚合运算(以内嵌视图的方式),这样可以避免错误的结果,因为聚合运算发生在连接查询之前
8. 从多个表中返回缺失值
8.1. 使用全外连接(full outer join),基于一个共同值从两个表中返回缺失值
8.1.1. sql
- select d.deptno,d.dname,e.ename
- from dept d full outer join emp e
- on (d.deptno=e.deptno)B
复制代码 8.2. 合并两个外连接的查询结果
8.2.1. sql
- select d.deptno,d.dname,e.ename
- from dept d right outer join emp e
- on (d.deptno=e.deptno)
- union
- select d.deptno,d.dname,e.ename
- from dept d left outer join emp e
- on (d.deptno=e.deptno)
复制代码 来源:https://www.cnblogs.com/lying7/p/17531945.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|