select ...
from table1, table2
where ....
order by ....
group by ....
having ...
笛卡尔积基本原理
两个表如果笛卡尔积运算
1 行数 两个表相乘
2 列数 两个表相加..
1 select count(e.EMPNO)
2 from emp e, dept d
3* where e.deptno = d.deptno
SQL> /
COUNT(E.EMPNO)
--------------
14
SQL> ed
已写入 file afiedt.buf
1 select count(e.EMPNO)
2* from emp e, dept d
3 /
COUNT(E.EMPNO)
--------------
56
等值连接
eg:查询员工信息,员工号,姓名,月薪,部门名称
select e.empno, e.ename, e.sal, d.dname
from emp e, dept d
where e.deptno = d.deptno
EMPNO ENAME SAL DNAME
---------- ---------- ---------- --------------
7369 SMITH 800 RESEARCH
7499 ALLEN 1600 SALES
7521 WARD 1250 SALES
7566 JONES 2975 RESEARCH
7654 MARTIN 1250 SALES
7698 BLAKE 2850 SALES
7782 CLARK 2450 ACCOUNTING
7788 SCOTT 3000 RESEARCH
7839 KING 5000 ACCOUNTING
7844 TURNER 1500 SALES
7876 ADAMS 1100 RESEARCH
7900 JAMES 950 SALES
7902 FORD 3000 RESEARCH
7934 MILLER 1300 ACCOUNTING
不等值连接
eg:查询员工信息,员工号,姓名,月薪, 薪水级别
select e.empno, e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal>=s.losal and e.sal<=s.hisal
1 select e.empno, e.ename, e.sal, s.grade
2 from emp e, salgrade s
3* where e.sal>=s.losal and e.sal<=s.hisal
SQL> /
EMPNO ENAME SAL GRADE
---------- ---------- ---------- ----------
7369 SMITH 800 1
7900 JAMES 950 1
7876 ADAMS 1100 1
7521 WARD 1250 2
7654 MARTIN 1250 2
7934 MILLER 1300 2
7844 TURNER 1500 3
7499 ALLEN 1600 3
7782 CLARK 2450 4
7698 BLAKE 2850 4
7566 JONES 2975 4
7788 SCOTT 3000 4
7902 FORD 3000 4
7839 KING 5000 5
外连接
eg:按部门统计员工人数: 部门号 部门名称 各部门人数
---思路1: 求各个部门的人数...要把各个部门数据划分开.....要分组.....
2:各部门人数 员工表
=====>因为 部门人数 是由员工表确定的...所以还要检索员工表...
所以需要多表查询
select d.deptno, d.dname, count(e.empno)
from dept d, emp e
where d.deptno = e.deptno (+)
group by d.deptno, d.dname
DEPTNO DNAME COUNT(E.EMPNO)
---------- -------------- --------------
10 ACCOUNTING 3
20 RESEARCH 5
30 SALES 6
---我们的期望 想把40号部门给统计出来...
----40号部门没有被统计出来的原因: 员工表中没有40号部门的员工...d.deptno = e.deptno (d.40 = e.40)
------本质:等值条件不满足...
========>外连接技术出现的原因
+左外连接: +号在..=号的右边,左外连接....
+右外连接: +号在..=号的左边,左外连接....
我想把部门表的所有列都显示出来, 就需要找到部门表..在对方写(+)
1 select d.deptno, d.dname, count(e.empno)
2 from dept d, emp e
3 where d.deptno = e.deptno(+)
4* group by d.deptno, d.dname
SQL> /
DEPTNO DNAME COUNT(E.EMPNO)
---------- -------------- --------------
10 ACCOUNTING 3
40 OPERATIONS 0
20 RESEARCH 5
30 SALES 6
自连接
-- 查询员工信息 ,老板信息
显示: ****的老板是****
---思路1: 员工信息 查员工表
查老板信息,还要查员工表...
---思路2 员工表的老板 是 老板表的员工
select e.ename, b.ename
from emp e, emp b
where e.mgr = b.empno
select e.ename || '的老板是' || b.ename
from emp e, emp b
where e.mgr = b.empno (+)
E.ENAME||'的老板是'||B.ENAME
----------------------------
SMITH的老板是FORD
ALLEN的老板是BLAKE
WARD的老板是BLAKE
JONES的老板是KING
MARTIN的老板是BLAKE
BLAKE的老板是KING
CLARK的老板是KING
SCOTT的老板是JONES
KING的老板是
TURNER的老板是BLAKE
ADAMS的老板是SCOTT
JAMES的老板是BLAKE
FORD的老板是JONES
MILLER的老板是CLARK
已选择14行。
select e.ename || '的老板是' || nvl (b.ename, '他自己')
from emp e, emp b
where e.mgr = b.empno (+)
E.ENAME||'的老板是'||NVL(B.E
----------------------------
SMITH的老板是FORD
ALLEN的老板是BLAKE
WARD的老板是BLAKE
JONES的老板是KING
MARTIN的老板是BLAKE
BLAKE的老板是KING
CLARK的老板是KING
SCOTT的老板是JONES
KING的老板是他自己
TURNER的老板是BLAKE
ADAMS的老板是SCOTT
JAMES的老板是BLAKE
FORD的老板是JONES
MILLER的老板是CLARK
已选择14行。