问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ORACLE多表查询

发布网友 发布时间:2022-04-22 06:21

我来回答

4个回答

懂视网 时间:2022-04-08 00:20


SQL> ed
已写入 file afiedt.buf


  1  select empno,ename,sal,dname,deptno
  2  from emp,dept
  3* where emp.deptno=dept.deptno
SQL> /
select empno,ename,sal,dname,deptno
                             *
第 1 行出现错误: 
ORA-00918: 未明确定义列 




SQL> ed
已写入 file afiedt.buf


  1  select e.empno,e.ename,e.sal,d.dname,d.deptno
  2  from emp e,dept d
  3* where emp.deptno=dept.deptno
SQL> /
where emp.deptno=dept.deptno
                 *
第 3 行出现错误: 
ORA-00904: "DEPT"."DEPTNO": 标识符无效 



(解决办法:给每张表起一个别名,然后表明数据是哪一个别名的)
SQL> ed
已写入 file afiedt.buf


  1  select e.empno,e.ename,e.sal,d.dname,d.deptno
  2  from emp e,dept d
  3* where e.deptno=d.deptno
SQL> /


     EMPNO ENAME      SAL DNAME              DEPTNO                                                                                                   
---------- -------- ----- -------------- ----------                                                                                                   
      7369 SMITH      800 RESEARCH               20                                                                                                   
      7499 ALLEN     1600 SALES                  30                                                                                                   
      7521 WARD      1250 SALES                  30                                                                                                   
      7566 JONES     2975 RESEARCH               20                                                                                                   
      7654 MARTIN    1250 SALES                  30                                                                                                   
      7698 BLAKE     2850 SALES                  30                                                                                                   
      7782 CLARK     2450 ACCOUNTING             10                                                                                                   
      7788 SCOTT     3000 RESEARCH               20                                                                                                   
      7839 KING      5000 ACCOUNTING             10                                                                                                   
      7844 TURNER    1500 SALES                  30                                                                                                   
      7876 ADAMS     1100 RESEARCH               20                                                                                                   
      7900 JAMES      950 SALES                  30                                                                                                   
      7902 FORD      3000 RESEARCH               20                                                                                                   
      7934 MILLER    1300 ACCOUNTING             10                                                                                                   


已选择14行。

不等值连接

SQL> --不等值连接:查询员工的工资级别
SQL> select * from salgrade;


     GRADE      LOSAL      HISAL                                                                                                                      
---------- ---------- ----------                                                                                                                      
         1        700       1200                                                                                                                      
         2       1201       1400                                                                                                                      
         3       1401       2000                                                                                                                      
         4       2001       3000                                                                                                                      
         5       3001       9999                                                                                                                      


SQL> select e.ename,e.sal,s.grade
  2  from emp e,salgrade s
  3  where e.sal between s.losal and s.hisal;


ENAME      SAL      GRADE                                                                                                                             
-------- ----- ----------                                                                                                                             
SMITH      800          1                                                                                                                             
JAMES      950          1                                                                                                                             
ADAMS     1100          1                                                                                                                             
WARD      1250          2                                                                                                                             
MARTIN    1250          2                                                                                                                             
MILLER    1300          2                                                                                                                             
TURNER    1500          3                                                                                                                             
ALLEN     1600          3                                                                                                                             
CLARK     2450          4                                                                                                                             
BLAKE     2850          4                                                                                                                             
JONES     2975          4                                                                                                                             
SCOTT     3000          4                                                                                                                             
FORD      3000          4                                                                                                                             
KING      5000          5                                                                                                                             


已选择14行。


SQL> host cls

外链接

SQL> --按部门统计员工人数:部门号,部门名称,人数
SQL> 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;


    DEPTNO DNAME                人数                                                                                                                  
---------- -------------- ----------                                                                                                                  
        10 ACCOUNTING              3                                                                                                                  
        20 RESEARCH                5                                                                                                                  
        30 SALES                   6                                                                                                                  


(上述结果少一个人数为null的值)


SQL> select count(*) from emp where deptno=10;


  COUNT(*)                                                                                                                                            
----------                                                                                                                                            
         3                                                                                                                                            


SQL> select count(*) from emp where deptno=20;


  COUNT(*)                                                                                                                                            
----------                                                                                                                                            
         5                                                                                                                                            


SQL> select count(*) from emp where deptno=30;


  COUNT(*)                                                                                                                                            
----------                                                                                                                                            
         6                                                                                                                                            


SQL> select * from dept;


    DEPTNO DNAME          LOC                                                                                                                         
---------- -------------- -------------                                                                                                               
        10 ACCOUNTING     NEW YORK                                                                                                                    
        20 RESEARCH       DALLAS                                                                                                                      
        30 SALES          CHICAGO                                                                                                                     
        40 OPERATIONS     BOSTON                                                                                                                      


SQL> select count(*) from emp where deptno=40;


  COUNT(*)                                                                                                                                            
----------                                                                                                                                            
         0                                                                                                                                            


SQL> --希望:在结果中包含某些不成立时的记录
SQL> /*
SQL> 外连接:
SQL> 左外连接:where d.deptno=e.deptno,当条件不成立时,等号左边所代表的表的信息任然被显示
SQL>           写法: where d.deptno=e.deptno(+)
SQL> 右外连接:where d.deptno=e.deptno,当条件不成立时,等号右边所代表的表的信息任然被显示
SQL>            写法:where d.deptno(+)=e.deptno
SQL> 全外连接:where d.deptno=e.deptno,当条件不成立时,等号两边所代表的表的信息任然被显示
SQL>            写法:where d.deptno(+)=e.deptno(+)
SQL> */
SQL> 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
  5  order by 1;


    DEPTNO DNAME                人数                                                                                                                  
---------- -------------- ----------                                                                                                                  
        10 ACCOUNTING              3                                                                                                                  
        20 RESEARCH                5                                                                                                                  
        30 SALES                   6                                                                                                                  
        40 OPERATIONS              0                                                                                                                  


SQL> host cls

自连接

SQL> --自连接:
SQL> --查询员工信息:***的老板是****
SQL> select * from emp;


     EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                                                   
---------- -------- --------- ---------- -------------- ----- ---------- ----------                                                                   
      7369 SMITH    CLERK           7902 17-12月-80       800                    20                                                                   
      7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30                                                                   
      7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30                                                                   
      7566 JONES    MANAGER         7839 02-4月 -81      2975                    20                                                                   
      7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30                                                                   
      7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30                                                                   
      7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10                                                                   
      7788 SCOTT    ANALYST         7566 13-7月 -87      3000                    20                                                                   
      7839 KING     PRESIDENT            17-11月-81      5000                    10                                                                   
      7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30                                                                   
      7876 ADAMS    CLERK           7788 13-7月 -87      1100                    20                                                                   
      7900 JAMES    CLERK           7698 03-12月-81       950                    30                                                                   
      7902 FORD     ANALYST         7566 03-12月-81      3000                    20                                                                   
      7934 MILLER   CLERK           7782 23-1月 -82      1300                    10                                                                   


已选择14行。


SQL> select e.ename||‘的老板是‘||b.ename
  2  from emp e, emp b
  3  where e.mgr=b.empno;


E.ENAME||‘的老板是‘||B.ENAME                                                                                                                          
----------------------------                                                                                                                          
FORD的老板是JONES                                                                                                                                     
SCOTT的老板是JONES                                                                                                                                    
JAMES的老板是BLAKE                                                                                                                                    
TURNER的老板是BLAKE                                                                                                                                   
MARTIN的老板是BLAKE                                                                                                                                   
WARD的老板是BLAKE                                                                                                                                     
ALLEN的老板是BLAKE                                                                                                                                    
MILLER的老板是CLARK                                                                                                                                   
ADAMS的老板是SCOTT                                                                                                                                    
CLARK的老板是KING                                                                                                                                     
BLAKE的老板是KING                                                                                                                                     
JONES的老板是KING                                                                                                                                     
SMITH的老板是FORD                                                                                                                                     


已选择13行。


SQL> --自连接:通过表的别名,将同一张表视为不同的表,再利用别的连接操作
SQL> --自连接一般只适用于小表(因为产生的笛卡尔表数据量太过庞大)
SQL> host cls


层次查询

SQL> --层次查询:只有一张表
SQL> --          同一张表的前后两次操作进行连接
SQL> select level,empno,ename,mgr
  2  from emp
  3  connect by prior empno=mgr
  4  start with mgr is null;


     LEVEL      EMPNO ENAME           MGR                                                                                                             
---------- ---------- -------- ----------                                                                                                             
         1       7839 KING                                                                                                                            
         2       7566 JONES          7839                                                                                                             
         3       7788 SCOTT          7566                                                                                                             
         4       7876 ADAMS          7788                                                                                                             
         3       7902 FORD           7566                                                                                                             
         4       7369 SMITH          7902                                                                                                             
         2       7698 BLAKE          7839                                                                                                             
         3       7499 ALLEN          7698                                                                                                             
         3       7521 WARD           7698                                                                                                             
         3       7654 MARTIN         7698                                                                                                             
         3       7844 TURNER         7698                                                                                                             
         3       7900 JAMES          7698                                                                                                             
         2       7782 CLARK          7839                                                                                                             
         3       7934 MILLER         7782                                                                                                             


已选择14行。


SQL> ed
已写入 file afiedt.buf


  1  select level,empno,ename,mgr
  2  from emp
  3  connect by prior empno=mgr
  4  start with mgr is null
  5* order by 1
SQL> /


     LEVEL      EMPNO ENAME           MGR                                                                                                             
---------- ---------- -------- ----------                                                                                                             
         1       7839 KING                                                                                                                            
         2       7566 JONES          7839                                                                                                             
         2       7698 BLAKE          7839                                                                                                             
         2       7782 CLARK          7839                                                                                                             
         3       7902 FORD           7566                                                                                                             
         3       7521 WARD           7698                                                                                                             
         3       7900 JAMES          7698                                                                                                             
         3       7934 MILLER         7782                                                                                                             
         3       7499 ALLEN          7698                                         &

热心网友 时间:2022-04-07 21:28

我对你的表进行了整理下,没有使用中文,都是英文编写,严格按照企业的要求,这也是比较好的习惯。

以下是建表语句:

create table T_USER_INFO
(USERID number(5) primary key,
 USERNAME varchar2(10),
 CREDENTIALS varchar2(20));
 
create table T_CHARGING
(CHARGINGID number(5) primary key,
 USERID number(5),
 MONEY number(5),
 CHARGINGDATE date);
 
insert into T_USER_INFO values(1, '张三', '222222');
insert into T_USER_INFO values(2, '李四', '333333');

insert into T_CHARGING values(1, 1, 300, to_date('2008-9-1', 'yyyy-mm-dd'));
insert into T_CHARGING values(2, 1, 300, to_date('2009-9-1', 'yyyy-mm-dd'));
insert into T_CHARGING values(3, 1, 300, to_date('2010-9-1', 'yyyy-mm-dd'));
insert into T_CHARGING values(4, 2, 400, to_date('2014-9-1', 'yyyy-mm-dd'));

用户信息表:


计费表:


接下来是查询语句,分了几步,注意理解。

1、查询每个人的最后缴费时间

select USERID, max(CHARGINGDATE) LASTDATE 
from  T_CHARGING 
group by USERID

  执行 结果:


2、将第一步得到的结果与用户信息关联查询

select u.USERID, u.USERNAME, u.CREDENTIALS, t.LASTDATE 
from T_USER_INFO u, (select USERID, max(CHARGINGDATE) LASTDATE 
                     from  T_CHARGING group by USERID) t 
where t.USERID = u.USERID

  执行结果:


3、将第二步得到的结果与计费表进行关联查询。

select t0.USERID, t0.USERNAME, t0.CREDENTIALS, t0.LASTDATE, tc.MONEY
from (select u.USERID, u.USERNAME, u.CREDENTIALS, t.LASTDATE 
      from T_USER_INFO u, (select USERID, max(CHARGINGDATE) LASTDATE 
                           from  T_CHARGING 
                           group by USERID) t 
      where t.USERID = u.USERID) t0, T_CHARGING tc 
where tc.USERID = t0.USERID and t0.LASTDATE = tc.CHARGINGDATE;

执行结果:

热心网友 时间:2022-04-07 22:46

oracle中join on可以连接多个的,和连接2个一样的用法
比如 select * from A a left join B b on a.xxxx=b.xxx left join C c on a.xxxxxx=c.xxxxx left join D d on a.xxx=d.xx
当然了,根据连接的条件你要改变上面的x.xxx=xx.xx的条件。肯定是可行的,以前用过!
以上回答你满意么?

热心网友 时间:2022-04-08 00:21

select a.姓名
a.证件号码,
b.交费金额,
b.交费时间
from a,b where a.id=b.id and b.交费时间=(select max(交费时间) from b)

这样应该可以。追问这样只能查出来一条信息,可是我要查表A中的两个人分别对应的B表中的最后一条交费信息

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
开封跑滴滴需要什么手续 郑州的滴滴打车可以在开封好吗 集团管控有哪几种模式 集团管控五种模式 集团管控模式集团管控模式选择的主要影响因素 win10桌面图标间距变大了怎么调整 win10桌面图标间距变大了调整方法 南宁什么路有民生银行 南宁民生银行保安第一个月工资多少?? 如果电池在综合测试时,电压原本是3.7伏标准,但是一测试那个电压立马 保护板的线结对但是用检测板测试为什么检测灯不亮反插反而亮为什么? oracle怎么实现多表 连接查询 并分页。。。 oracle 多表关联查询 oracle数据库三张表字段一模一样,怎么多表查询啊 :oracle多表联查: oracle 多表循环查询 oracle多表连接查询问题 Oracle多张独立的表查询 oracle两张表关联查询 oracle数据库多表连接查询 oracle数据库 多表连接查询 Oracle 多表关联查询? Oracle如何进行多表查询求思路 oracle中如何查询多张表的数据! oracle中多表查询语句怎么写? 英语单词apple中文是什么 英语单词apple中文是什么 apple的中文意思是什么?快乐的英文又是什么? apple 中文意思 apple 中文意思 apple中文意思是苹果。 Oracle多表多条件联合查询 Oracle数据库查询问题,一对多多表统计查询 Oracle进行连表查询 ORACLE多表模糊查询问题 什么是三好学生,是指那三好? 五星级学生和三好学生有什么区别 什么是五好学生? 五好学生和三好学生有什么区别? 学生荣誉称号有哪些 三好学生和优秀学生什么区别? 三好学生和优秀学生什么区别 新三好学生和三好学生有什么区别,哪个比较好? 三好学生需要哪些条件? 2021年度三好学生指哪段时间 五好学生和三好学生哪个好 小学校评选的优秀学生有:三好学生、阳光少年。到... 三好学生和优秀学生有什么区别? 三向学生与三好学生有什么区别? 四好少年与三好学生的区别是什么 学生的奖状上写的三好学生和优秀学生,奖状有啥区...