按照部门统计员工数,要求显示:部门号,部门名称,人数
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno,d.dname;
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno;
核心:通过外链接,把对于连接条件不成立的记录,仍然包含在最后的结果中
左外连接:当连接条件不成立的时候,等号左边的表仍然被包含
右外连接: 当连接条件不成立的时候,等号右边的表仍然被包含
---- 右外连接示例:叫法和写法左右是反着的
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
from emp e,dept d
where e.deptno(+)=d.deptno
group by d.deptno,d.dname;
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
from emp e,dept d
where e.deptno=d.deptno(+)
group by d.deptno,d.dname;
*******************************************************
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
2 from emp e,dept d
3 where e.deptno=d.deptno
4 group by d.deptno,d.dname;
部门号 部门名称 人数
---------- -------------- ----------
10 ACCOUNTING 3
20 RESEARCH 5
30 SALES 6
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
2 from emp e,dept d
3 where e.deptno=d.deptno
4 group by d.deptno;
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
*
第 1 行出现错误:
ORA-00979: 不是 GROUP BY 表达式
SQL> select count(*) from emp
2 ;
COUNT(*)
----------
14
SQL> select count(*) from dept;
COUNT(*)
----------
4
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
2 from emp e,dept d
3 where e.deptno(+)=d.deptno
4 group by d.deptno;
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
*
第 1 行出现错误:
ORA-00979: 不是 GROUP BY 表达式
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
2 from emp e,dept d
3 where e.deptno(+)=d.deptno
4 group by d.deptno,d.dname;
部门号 部门名称 人数
---------- -------------- ----------
10 ACCOUNTING 3
40 OPERATIONS 0
20 RESEARCH 5
30 SALES 6
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
2 from emp e,dept d
3 where e.deptno=d.deptno(+)
4 group by d.deptno,d.dname;
部门号 部门名称 人数
---------- -------------- ----------
10 ACCOUNTING 3
20 RESEARCH 5
30 SALES 6
外连接:把对于连接条条件不成立的记录,仍然包含在最后的结果中;
左外连接:当连接条件不成立的时候,等号左表的表仍然被包含; where e.deptno=d.deptno(+) [写法与叫法相反]
右外连接:当连接条件不成立的时候,等号右边的表仍然被包含; where e.deptno(+)=d.deptno 


等值链接统计不到在a表存在,在b不存在的,where条件不成立,所以要用外链接(比如平时用到的规则中心),
lift join。。。on。。。相当于A=B(+)
right join。。。on。。。相当于A(+)=B;
外连接: 核心:通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中,分为:
(1)左外连接:当连接条件不成立的时候,等号左边的表仍然被包含 , 主表在左侧,字段全显示,副表null补充对齐。+号在右侧(副表)
(2)右外连接:当连接条件不成立的时候,等号右边的表仍然被包含 , 主表在右侧,字段全显示,副表null补充对齐。+号在左侧(副表)
例如: 按部门统计员工人数,要求显示:部门号,部门名称,人数
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数 from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;
(右外连接在等号左边添加“(+)”,左外连接是在等号右边添加“(+)”)
where a.deptno(+)=b.deptno --右外连接 包含b.deptno 当连接条件不成立的时候,等号右边的表仍然被包含
where a.deptno=b.deptno(+) --左外连接
左外连接=表(+):当连接条件不成立的时候,等号左边的表仍然被包含
右外连接(+)=:当连接条件不成立的时候,等号右边的表仍然被包含
外连接
示例:按部门统计员工人数,要求显示:部门号、部门名称、人数
select d.deptno 部门号, d.dname 部门名称,count(e.empno) 人数
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno,d.dname;
通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中
左外连接:当连接条件不成立的时候,等号左边的表仍然被包含

右外连接:当连接条件不成立的时候,等号有边的表仍然被包含
左外连接在右边条件后 加 (+)
右外连接在左边条件后 加 (+) 反着
左外链接: e.eno = b.bno(+)
右外链接: e.eno(+) = b.bno
select d.deptno 部门号, d.dname 部门名称 ,count(e.empno) 人数
from emp e,dept d
where e.deptno(+)=d.deptno
group by d.deptno,d.dname;
右外连接。在左边加(+)
左外连接。在右边加(+)
select d.deptno 部门号 ,d.dname 部门名称 ,count(e.empno) 人数
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno,d.dname;
外连接
核心:通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中
左外连接:当连接条件不成立的时候,等号左边的表仍然被包含
右外连接:当连接条件不成立的时候,等号右边的表仍然被包含。
外连接:核心:通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中。
外连接
核心:通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中
左外连接:当连接条件不成立的时候,等号左边的表仍然被包含
右外连接:当连接条件不成立的时候,等号右边的表仍然被包含
注意:左右外连接的叫法和写法是相反的。如:若是右外连接,则在等号的左边加上(+)符合,左外连接则在等号的右边加上(+)符号。
select d.deptno,d.dname,count(e.empno) from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;
第三章:多表连接
1. 多表查询
多表查询:从多个表中获取数据
查询员工信息与部门信息,员工表与部门表
2. 笛卡尔集
多表查询的基础
表1*表2的笛卡尔集:列数=两张表相加,行数两张表相乘
连接条件N-1个,N代表多少张表连接

3. 等值连接
等值连接:连接条件中是等号
示例:查询员工信息,要求显示:员工号,姓名,月薪,部门名称
试验:select empno,ename,sal,dname from emp
left join DEPT on emp.deptno=dept.deptno;
标准:select e.empno,e.ename,e.sal,d.dname
from emp e,dept d where e.deptno=d.deptno;
(习惯上重命名表)
4. 不等值连接
不等值连接:连接条件不是等号
示例:查询员工信息,要求显示:员工号,姓名,月薪,薪水的级别
select * from emp;
select * from salgrade;
select e.empno,e.ename,e.sal,s.grade
from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal;--(具体问题,具体分析)注意大于等于下线,和小于上线
select e.empno,e.ename,e.sal,s.grade
from emp e,salgrade s where e.sal between s.losal and s.hisal;--(between and包含两边边界值)
5. 外连接
select * from emp;
select * from dept;
select d.deptno,d.dname,count(e.empno)
from dept d left join emp e on d.deptno=e.deptno
group by d.deptno,d.dname;
select d.deptno,d.dname,count(e.empno)
from emp e left join dept d on e.deptno=d.deptno
group by d.deptno,d.dname;
7. 自连接
查询员工姓名和对应老板姓名
select * from emp ;
select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;--普通表连接自动顾略空值(14*14=196条记录)--如果一亿条数据表,则是平方关系
select e1.ename,e2.ename from emp e1 left join emp e2 on e1.mgr=e2.empno;

8. 层次查询(解决自连接问题)
自连接存在的问题:不适合操作大表
解决办法:层次查询(单表查询)
原理:


条件:上层员工号是下层员工的老板号
上一层的员工号=老板号
select level,empno,ename,sal,mgr from emp
connect by prior empno=mgr
start with empno =7893;
select level,empno,ename,sal,mgr from emp
connect by prior empno=mgr
start with empno is null
order by 1;(根节点)
select d.deptno 部门号,d.dname部门名称,count(e.empno)人数
from emp e,dept d where e.deptno=d.deptno group by d.deptno,d.dname;
外连接
涵义:通过外连接,把对于连接条件不成立的记录,仍然包含在最后的结果中。
外连接写法与说法相反:
右外连接【在等号的左边写个(+)】
select d.deptno 部门号, d.dname 部门名称, count(e.empno) 人数 from emp e, dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;
左外连接
select d.deptno 部门号, d.dname 部门名称, count(e.empno) 人数 from emp e, dept d where e.deptno=d.deptno(+) group by d.deptno,d.dname;
外链接:
(1)左外连接:“(+)”放在等号的右边;
(2)右外连接:“(+)”放在等号的左边;
1外连接就是为了解决:通过外链接,把对于连接条件上不成立的记录,仍然包含在最后的结果中,
2 左外链接:当连接条件不成立的时候,等号左边的表仍然被包含 where e.deptno=d.deptno(+)
3右外链接:当连接条件不成立的时候,等号右边的表仍然被包含 where e.deptno(+)=d.deptno
外链接:把对于连接条件不成立的记录,仍然包含在结果中。
左外链接:当连接条件不成立的时候,等号左边的表仍然包含
右外连接:当连接条件不成立的时候,等号右边的表仍然包含
写法和叫法相反
外连接:把对于连接条件不成立的记录,仍然包含在最后的结果中。
左外连接;当连接条件不成立时,等号左边的表仍然被包含
右外连接相反。