一 比较86和92语法中多表连接区别
1笛卡尔积
--oracle连接的基础 笛卡尔积
--92语法 更加清晰明了的区别了 每一种连接
--解决了多表关联时 条件不清晰的问题
select * from emp;
select * from dept;
--86语法
select * from emp e,dept d;
--92语法
select * from emp cross join dept
2内连接
select * from emp;
select * from dept;
--86语法
select * from emp e,dept d where e.deptno=d.deptno;
--92语法
select * from emp inner join dept on emp.deptno=dept.deptno
3左外连(左外连接和右外联的区别在于 谁为主 谁为从 意义相同)
--86语法
select * from emp e,dept d where e.deptno=d.deptno(+)
--92语法
select * from emp e left join dept d on e.deptno=d.deptno
-- oracle中子查询
表子查询 只要输出的结果是个表结构 就可以放在from后查询 也可以设置别名
select abc.ename,abc.loc from (
select * from emp e inner join dept d on e.deptno=d.deptno
) abc;
select * from emp;
select * from dept;
/**
列的子查询 子查询 永远只能返回一行一列数据
列子查询的原理
for(emp e: list<emp>){
syso(e.ename);
for(dept d: list<dept>){
if(e.deptno==d.deptno){
syso(d.dname)
break;
}
}
}
**/
select ename,(select dname from dept where deptno=e.deptno) from emp e;
--条件子查询
select * from tab;
select * from salgrade
--薪水等级是2的人
select losal,hisal from salgrade where grade=2
select * from emp where sal>=(select losal from salgrade where grade=2)
and sal<=(select hisal from salgrade where grade=2)
select * from emp e inner join salgrade s on e.sal>=s.losal and e.sal<=s.hisal
where s.grade=2
/**
/**
--多行子查询
for(emp e: list<emp>){
syso(e.ename);
for(dept d: list<dept>){
if(d.dname.indexOf('A')>=0){
if(e.deptno==d.deptno ){
syso(d.dname)
break;
}
}
}
}
**/
select * from emp where deptno =any(
select deptno from dept where dname like '%A%'
)
select * from emp where deptno in(
select deptno from dept where dname like '%A%'
)
--效率最高的子查询语句
select * from emp e where exists(
select deptno from dept d where d.deptno=e.deptno and dname like '%A%'
)
2 集合操作符
并集
union all 集合中的元素 全部叠加 不会去重复
union 集合中的元素 全部叠加 会去重复
intersect 交集
{1,2},{2,3} 结果为 {2}
minus 取差集
1笛卡尔积
--oracle连接的基础 笛卡尔积
--92语法 更加清晰明了的区别了 每一种连接
--解决了多表关联时 条件不清晰的问题
select * from emp;
select * from dept;
--86语法
select * from emp e,dept d;
--92语法
select * from emp cross join dept
2内连接
select * from emp;
select * from dept;
--86语法
select * from emp e,dept d where e.deptno=d.deptno;
--92语法
select * from emp inner join dept on emp.deptno=dept.deptno
3左外连(左外连接和右外联的区别在于 谁为主 谁为从 意义相同)
--86语法
select * from emp e,dept d where e.deptno=d.deptno(+)
--92语法
select * from emp e left join dept d on e.deptno=d.deptno
-- oracle中子查询
表子查询 只要输出的结果是个表结构 就可以放在from后查询 也可以设置别名
select abc.ename,abc.loc from (
select * from emp e inner join dept d on e.deptno=d.deptno
) abc;
select * from emp;
select * from dept;
/**
列的子查询 子查询 永远只能返回一行一列数据
列子查询的原理
for(emp e: list<emp>){
syso(e.ename);
for(dept d: list<dept>){
if(e.deptno==d.deptno){
syso(d.dname)
break;
}
}
}
**/
select ename,(select dname from dept where deptno=e.deptno) from emp e;
--条件子查询
select * from tab;
select * from salgrade
--薪水等级是2的人
select losal,hisal from salgrade where grade=2
select * from emp where sal>=(select losal from salgrade where grade=2)
and sal<=(select hisal from salgrade where grade=2)
select * from emp e inner join salgrade s on e.sal>=s.losal and e.sal<=s.hisal
where s.grade=2
/**
/**
--多行子查询
for(emp e: list<emp>){
syso(e.ename);
for(dept d: list<dept>){
if(d.dname.indexOf('A')>=0){
if(e.deptno==d.deptno ){
syso(d.dname)
break;
}
}
}
}
**/
select * from emp where deptno =any(
select deptno from dept where dname like '%A%'
)
select * from emp where deptno in(
select deptno from dept where dname like '%A%'
)
--效率最高的子查询语句
select * from emp e where exists(
select deptno from dept d where d.deptno=e.deptno and dname like '%A%'
)
2 集合操作符
并集
union all 集合中的元素 全部叠加 不会去重复
union 集合中的元素 全部叠加 会去重复
intersect 交集
{1,2},{2,3} 结果为 {2}
minus 取差集
{1,2},{2,3} 结果为{1}