Dept表
名称 是否为空? 类型
----------------- -------- ------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
salgrade表
名称 是否为空? 类型
----------------- -------- ------------
GRADE NUMBER
LOSAL NUMBER
HISAL NUMBER
多表查询
多表链接 首先做到的是笛卡尔乘积
A表
a1 a2 a3
b1 b2 b3
c1 c2 c3
B
d1 d2
f1 f2
结果
a1 a2 a3 d1 d2
b1 b2 b3 d1 d2
c1 c2 c3 d1 d2
a1 a2 a3 f1 f2
b1 b2 b3 f1 f2
c1 c2 c3 f1 f2
结果分析:
获得的行数:A*B
获得的列数:A+B
--------------------------------------------------------------
两个表合成一个表 中间加个条件
emp,dept 相连
emp.sal>salgrade.losal and emp.sal<salgrade.hisal(between losal and hisal)
emp,dept,salgrade三表相连
select * from emp,dept,salgrade where emp.deptno=dept.deptno and (emp.sal>salgrade.losal and
emp.sal<salgrade.hisal)
其他函数
控制替换 nvl(comm.0);
例:sal 和 comm 的和 如果之间有空值 直接加的话 空值依然是空值
select nvl(sal,0)+nvl(comm,0) from emp;把空值替换成0 在进行计算
如果想找管理者的话 需要关联 另一张表 所以就创建一张表
select emp.empno,manager.mgr from emp,manager where emp.empno=manager.mgr
这里我们可以用别名 从而访问同一张表(别名的意思 也就是虚拟一张自己)
select e.empno,m.mgr from emp e.manager m where e.empno=m.mgr;
练习:查询 和 allen 在同一个工资级别的员工信息;
select * from emp,salgrade where sal between losal and hisal and grade=(select grade from emp,salgrade where sal between losal and hisal and ename='ALLEN')
---------------------------------------------------------------------------------------------------------------------
多表查询
多表连接首先做的是笛卡尔乘积
A
a1 a2 a3
b1 b2 b3
c1 c2 c3
B
d1 d2
f1 f2
C
g1 g1
h1 h2
结果
a1 a2 a3 d1 d2 g1 g1
b1 b2 b3 d1 d2 g1 g1
c1 c2 c3 d1 d2 g1 g1
a1 a2 a3 f1 f2 g1 g1
b1 b2 b3 f1 f2 g1 g1
c1 c2 c3 f1 f2 g1 g1
a1 a2 a3 d1 d2 h1 h2
b1 b2 b3 d1 d2 h1 h2
c1 c2 c3 d1 d2 h1 h2
a1 a2 a3 f1 f2 h1 h2
b1 b2 b3 f1 f2 h1 h2
c1 c2 c3 f1 f2 h1 h2
结果分析:
获得的行数:A*B*C
获得的列数:A+B+C
多表连接类型
等值连接
非等值连接
自连接 --自己连接自己 在使用自连接时必须使用表别名
nvl函数
表别名
子查询:查询的语句中还包含查询,内部的查询就是子查询
使用子查询:当要查询一个复杂内容 通过一个简单的查询无法实现,这时使用子查询
在使用子查询时
根据返回的值的不同使用的符号也不同
当返回一个值的时候使用 = > < >= <=
当返回一列值时使用 in any all any 和all在使用时必须和基本符号一起使用
>any <any =any >=any >=all