Loading... ###多表查询 语法: SELECT [DISTINCT]*| 字段 [别名][字段 [别名]] FROM 表名称 [别名],[表名称 [别名],表名称 [别名]…] [WHERE 条件(S)] [ORDER BY 排序字段 [ASC|DESC][排序字段 [ASC|DESC],…]] 注意:多表查询之前,首先必须查询各个表中的数据量,这个操作可以通过COUNT()函数来完成。切记!切记!切记! 注意:在遇到一个新的数据库,有两种做法: ####1、直接执行以下命令 select * from 表名称 导致的结果一是无法浏览数据,二是可能造成死机,如: 介绍: sh用户是oracle数据库示例方案的用户,该示例方案是大数据方案 做法: 1、给sh用户解锁和改密码 alter user sh identified by sh account unlock; 2、使用sh用户登录 conn sh/sh 3、查询有多少表 select * from tab; 4、查询sales表数据 select * from sales; 5、等待,然后没有然后了 ####2、先查询数据量 select count(*) from 表名称 ===== 1、select count(*) from sales; 结论:遇到新数据库首先查询的是数据量,而不是直接select * from 表名称。 查询emp表中的数据量 select count(*) from emp; 确认数据量后,执行多表查询语句: select * from emp,dept; 语句语法没有问题,但是因为数据库的机制导致产生了笛卡儿积,所以具体用法不这么用。 如何去掉笛卡儿积呢? 采用关联字段的形式,emp表和dept表之间存在了deptno的关联字段,从关联字段下手,如下: select * from emp,dept where deptno=deptno; #执行错误 select * from emp,dept where emp.deptno=dept.deptno; #显示上笛卡儿积已经消除,实际上笛卡儿积还在,并没有消除。 举例: 1、使用sh大用户账号连接 conn sh/sh 2、查询sales表的数据量 select count(*) from sales; 3、查询还有其他的哪些表? select * from tab; 4、查询costs表的数据量 select count(*) from costs; 5、查询sales表的表结构 desc sales; 6、查询costs表的表结构 desc costs; 7、根据查询结果发现PROD_ID可以作为关联字段进行查询 select count(*) from sales,costs where sales.prod_id=costs.prod_id; 结论:这两张表即便消除了笛卡儿积的显示,但是本身还存在笛卡儿积的问题,所以多表查询的性能是很差的,当然也主要看数据量。 如果表的名称比较长,那么这样的方式很不方便使用,解决办法就是使用表别名,如下: select * from emp e,dept d where e.deptno=d.deptno; 要求查询每一位雇员的编号,姓名,职位,部门名称,部门位置 思路: 1、首先确认需要的表; emp表可以查询雇员的编号,姓名,职位; dept表可以查询部门名称和位置; 2、确定表的关联字段; emp.deptno=dept.deptno 做法: 1、查询出每一位雇员的编号,姓名和职位; select e.empno,e.ename,e.job from emp e; 2、为查询中引入部门表,同时增加消除笛卡儿积的条件; select e.empno,e.ename,e.job,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno; 要求查询出每一位雇员的姓名,职位和领导姓名 思路: 1、确认需要的表; emp表可以查询雇员的姓名,职位和领导编号 emp表可以查询领导的姓名 2、确定关联字段; emp.mgr=emp.empno,雇员的领导编号=领导的雇员编号 做法: 1、查询每一位雇员的姓名和职位 select e.ename,e.job from emp e; 2、查询领导信息,加入自身关联 select e.ename,e.job,m.ename from emp e,emp m where e.mgr=m.empno; 注意:查询结果少了一行,缺少KING的领导姓名,因为他没有领导,后面左右链接解释。 要求查询出每个雇员的编号,姓名,基本工资,职位,领导的姓名,部门名称及位置 思路: 1、确认需要的表; emp表查询每个雇员的编号,姓名,基本工资,职位 emp表查询领导的姓名 dept表查询部门的名称及位置 2、确定已知的关联字段 雇员和部门: e.deptno=d.deptno 雇员和领导: e.mgr=m.empno 做法: 1、查询出每个雇员的编号,姓名,基本工资,职位 select empno,ename,sal,job from emp; 2、加入领导的信息,引入自身关联,同时增加消除笛卡儿积的条件 select e.empno,e.ename,e.sal,e.job,m.ename from emp e,emp m where e.mgr=m.empno; 3、加入部门的信息,引入dept表,有新表,则要继续加入消除笛卡儿积的条件 select e.empno,e.ename,e.sal,e.job,m.ename,d.dname,d.loc from emp e,emp m,dept d where e.mgr=m.empno and e.deptno=d.deptno; 思考练习题一: 要求查询出每一个雇员的编号,姓名,工资,领导的姓名,部门名称及位置,工资所在公司的工资等级 select e.empno,e.ename,e.sal,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal; ###左、右连接 左右连接可以改变查询判断条件的参考方向,例如,有以下查询 select * from emp e,dept d where e.deptno=d.deptno; 注意:一共有四个部门,但是这里只有三个,缺少40部门的部门信息,原因就是现在的查询以emp表为参考进行查询,要想显示40部门, 就必须改变参考的方向,这时就需要左右连接 用法: select * from emp e,dept d where e.deptno(+)=d.deptno; (+)用于左右连接的更改,这种符号有以下两种使用情况: (+)=:表示右连接 =(+):表示左连接 不用刻意区分左还是右,根据查询结果来定,如果发现有些需要的数据没有显示出来,就使用此符号来改变连接方向,该符号为oracle独有。 如之前的查询领导姓名的范例: select e.ename,e.job,m.ename from emp e,emp m where e.mgr=m.empno(+); 补充: 查询字段时,需要多表关联,需要用到表别名,内连接,外连接,自然连接,自连接 一些关键连接方法。 ####1.表别名 查询员工编号 员工姓名 部门名称 select e.empno,e.ename,d.dname from emp e,dept d where e.deptno=d.deptno; ####2.内连接 A(inner) join B on 连接条件 select e.empno,e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno; 内连接必须满足连接条件,不满足的信息无法显示 ####3.外连接 1》左外连接 关键字 A left join B on 连接条件 首先添加一条没有部门的员工信息 insert into myemp(empno,ename,job) values(1100,’rose’,’artist’); emp表里面rose没有员工编号,dept表不能找到rose的部门信息 select e.empno,e.ename,d.dname from myemp e left join dept d on e.deptno=d.deptno; 条件查询 = (+) 左连接 select e.empno,e.ename,d.dname from myemp e,dept d where e.deptno=d.deptno(+); 2》右外连接 关键字 A right join B on 连接条件 dept表的40号部门没有员工信息,使用内连接和条件查询都无法显示, 我们用右连接使40号部门显示出来。 select e.empno,e.ename,d.dname from emp e right join dept d on e.deptno=d.deptno; 条件查询左右连接 (+)= 右连接 = (+) 左连接 select e.empno,e.ename,d.dname from emp e,dept d where e.deptno=d.deptno(+); 3》完全外连接 full join select e.empno,e.ename,d.dname from myemp e full join dept d on e.deptno=d.deptno; 4》自然连接 natural join 不用区分关联条件,oracle自动为我们区分 查询工资大于2000的员工编号,员工姓名和部门名称。 select empno,ename,dname from emp natural join dept where sal>2000; 缺点 如果表名不确定,不能查询 5》自连接 查询员工姓名,员工职称以及员工所属领导。 select e.ename,e.job,m.ename from emp e left join emp m on e.mgr=m.empno; >转自:http://www.uml.org.cn/sjjm/201905173.asp Last modification:August 1, 2021 © Allow specification reprint Support Appreciate the author Like 0 欢迎留下您的脚印