Oracle数据库入门之多表连接与子查询
2012-11-28 15:26:36 来源:WEB开发网 Oracle表连接
概述:SQL/Oracle使用表连接从多个表中查询数据
格式:select 字段列表 from table1,table2 where table1.column1=table2.column2;
说明:当被连接的多个表中存在同名字段时,必须在该字段前加上“table.”作为前缀
如果没有限定where连接条件,否则就会出现笛卡尔集的不现实或没有实用意义的结果
举例:select empno, ename, sal, emp.deptno, dname, loc from emp, dept;--这时得到的就是笛卡尔集。此时得到70条记录
select empno, ename, sal, emp.deptno, dname, loc from emp, dept where emp.deptno=dept.deptno;--得到14条记录
类型:Oracle8i之前的表连接(支持SQL92标准):等值连接(Equijoin)、非等值连接(Non—Equijoin)、自连接(Self join)
外连接(Outer join):左外连接、右外连接
Oracle9i新引入的连接形式(支持SQL99规范):交叉连接(Cross join)、自然连接(Natural join)、使用Using或On子句建立连接
内连接(Inner join)、外连接(Outer join):左外连接、右外连接、全外连接
补充:多表连接中可使用AND操作符增加查询条件,使用表别名可以简化查询,使用表名(表别名)前缀可提高查询效率
而连接n个表,则至少需要n-1个连接条件。如select a.ename, a.deptno, b.dname from emp a, dept b where a.deptno=b.deptno;
样本:hr帐户也是Oracle自带的样本帐户,里面有很多样本表,其数据量及复杂程度都要比scott强一些
hr帐户缺省是锁定的,可以在OEM中将其解锁并设密码。其中的employees表是scott中的emp表的增强版
另外还有departments和locations表的数据看起来都比较真实。这三个表通常用于复杂的多表连接查询
等值连接(Equijoin)
举例:select empno, ename, emp.deptno, dname from emp, dept where emp.deptno=dept.deptno;
非等值连接(Non—Equijoin)
问题:如何查得每个员工的工资等级
举例:select empno, ename, sal, grade 工资等级 from emp,salgrade where sal between losal and hisal;
外连接(Outer join)
概述:外连接运算符为(+)。使用外连接可以看到参与连接的某一方不满足连接条件的记录
传统的外连接分为左外连接和右外连接两种。实际开发中,外连接的使用频率要比等值连接少一些
语法:select 字段列表 from table1,table2 where table1.column1(+)=table2.column2;
select 字段列表 from table1,table2 where table1.column1=table2.column2(+);
说明:table1.column1(+)=table2.column2;--显示所有符合条件的记录,同时table2中不符合连接条件的记录也会显示出来
table1.column1=table2.column2(+);--显示所有符合条件的记录,同时table1中不符合连接条件的记录也会显示出来
补充:在SQL99规范中,内连接(Inner Join)只返回满足连接条件的数据,而外连接还返回不满足连接条件的行
分类:左外联接(Left Outer Join):即两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行
右外联接(Right Outer Join):即两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件的行
满外联接(Full Outer Join):即两个表在连接过程中除返回满足连接条件的行以外,还返回两个表中不满足条件的行
举例:select employee_id, last_name, salary, department_id, department_name
form employees left join departments using(department_id);--返回107行
自连接(Self join)
概述:自连接诶本质就是把一个表当作两个表来使用,只是定义不同的别名而已
- ››oracle 恢复误删除的表和误更新的表
- ››Oracle分页查询排序数据重复问题
- ››Oracle创建dblink报错:ORA-01017、ORA-02063解决
- ››Oracle 提高SQL执行效率的方法
- ››Oracle 动态查询,EXECUTE IMMEDIATE select into...
- ››Oracle 11g必须开启的服务及服务详细介绍
- ››oracle性能34条优化技巧
- ››oracle数据库生成随机数的函数
- ››Oracle 数据库表空间容量调整脚本
- ››oracle单库彻底删除干净的方法
- ››Oracle创建表空间、创建用户以及授权、查看权限
- ››oracle 中 UPDATE nowait 的使用方法
赞助商链接