欢迎光临散文网 会员登陆 & 注册

Oracle 多表链接查询,分组查询,组函数(聚合函数/多行函数),子查询,建表、删表

2023-03-10 14:02 作者:阿彦绝地反击  | 我要投稿

--安装数据库后不要改变计算机名称  安装数据库后不要改变计算机名称  安装数据库后不要改变计算机名称

--赠品:

--问:怎么查看当前登录账号下的所有表格?

--答:select TABLE_NAME from user_tableS;


day03目标:

1.多表链接查询

2.分组查询

3.组函数(聚合函数/多行函数)

4.子查询

5.建表、删表


一、多表联合查询

笛卡尔积:A表x行,B表y行

select * from a,b; 结果共x*y行

1. 内连接:等值查询【必会】

查询当前每个员工所属部门(员工编号、姓名、员工的部门编号、部门的部门编号、部门名称)

select e.empNo,e.ename,e.deptNo,d.deptNo,d.dname from emp e,dept d

where e.deptNo=d.deptNo;


2. 内连接:不等值查询*

查每个员工的工资在哪个等级?

select e.empNo,e.ename,e.sal, g.grade from emp e,salgrade g

where e.sal between g.losal and g.hisal;


3. 内连接:自链接*

查每个员工的领导是谁?

设员工表E:select e.empno,e.ename,e.mgr from emp e;

设领导表M:select m.empno,m.ename from emp m;

答: select e.empNo,e.eName,e.mgr,m.empNo,m.eName

from emp e,emp m 

where e.mgr = m.empNo;

4. 外链接:

等值【必会】:显示所有员工信息,没部门的员工也显示。

select e.empNO,e.eName,e.deptNo,d.deptNo,d.dName from emp e ,dept d

where e.deptNo = d.deptNo(+);

不等值**:显示所有员工信息及对应的工资等级

select e.eName,e.sal,g.grade from emp e,salgrade g

where e.sal between g.losal(+) and g.hisal(+);

自链接**:显示大BOSS,这位仁兄领导编号是null

select e.empNo,e.ename,e.mgr,m.empNo,m.eName

from emp e,emp m

where e.mgr = m.empNo(+)

      and e.mgr is null;


方法2:老板(最大的BOSS)的姓名的领导姓名补Boss显示

select e.empNo,e.ename,nvl( m.ename,'BOSS' ) mgrName

from emp e ,emp m

where e.mgr = m.empNo(+);


5.推荐链接(99方式)写法【明天默写】

内连接【必会】:select 列... from 表1 别称1 inner join 表2 别称2   on  别称1.公共字段=别称2.公共字段

查员工信息(显示部门名称)

select e.empNo,e.eName,e.deptNo,d.deptNo,d.dName

from emp e inner join dept d  on e.deptNo = d.deptNo;

外链接:

练习:显示所有员工信息(没有部门的员工部门补null)

左外链接:select 列... from 表1 别称1 left outer join 表2 别称2 on 别称1.公共字段=别称2.公共字段

    特点:显示关键字左边表的所有数据

          答: select e.empNo, e.eName, e.deptNo, d.deptNo, d.dName 

from emp e left outer join dept d  on e.deptNo = d.deptNo;

右外链接:select 列... from 表1 别称1 right outer join 表2 别称2 on 别称1.公共字段=别称2.公共字段

    特点:显示关键字右边表的所有数据

      答: select e.empNo,e.eName,e.deptNo,d.deptNo,d.dName

from dept d right outer join emp e on e.deptNo = d.deptNo;

完全外链接**: full outer join 显示2个表的所有数据,对应无互相补null

练习:显示所有员工和所有部门

select e.eName,d.dName 

from emp e full outer join dept d  on e.deptNo = d.deptNo;




二、分组查询

1. 组函数 : 不统计null值

sum(列) -求和

avg(列) -平均值

max(列) --最大值

min(列) --最小值

count(列) --几行(统计非空行数)

练习:显示所有员工的最高工资、最低工资、平均薪资、薪资总和、总人数

select max(sal),min(sal),avg( nvl(sal,0) ),sum(sal),count(*) from emp;

2. 分组:

语法:select 分组依据列,...,组函数(其他列)

      from 表

      group by 分组依据列N...,....

      having 分组条件

练习:统计当前部门的平均薪资

select deptNo,avg( nvl(sal,0) ) 

from emp

group by deptNo;

练习:统计当前部门不同岗位的薪资总额

select deptNo,job,sum( sal )

from emp

group by deptNo,job;

3.分组依据 having

练习:统计部门内>3人的部门信息

select d.dName,count(*) 

from emp e inner join dept d

on e.deptNo = d.deptNo

group by d.dName

having count(*)>3

--【关键字优先级如下】-----------------------------------------------------------------------------


select --查询

from --从哪个表来

inner join / left/right outer join --多链接

on --多表联合条件

where --查询条件

group by --分组

having --分组条件

order by --显示排序



三、子查询:=等于、in包含、not in不包含、any .. all...、条件符号

查询的里面还有查询:select 列....,.... from 表... where 条件列=(select 条件列 from 表名...)

练习:查属于销售sales部门的员工有哪些(显示员工姓名、工资)

第1步:select deptNo from dept where dname = 'SALES' or dName = 'RESEARCH';  

--显示SALES的部门和RESEARCH的部门编号

第2步:select eName,sal,deptNo from emp where deptNo in ( 30,20 ); 

--再查询这个2个编号对应员工有哪些

第3步:合并起来一句话完成这个查询:

select eName,sal from emp where deptNo in(

select deptNo from dept where dName='SALES' or dName='RESEARCH'

);

练习:查在纽约“NEW YORK”办公职员信息

方法1:select empNo,eName from emp where deptNo in (

select deptNo from dept where loc='NEW YORK'

);

方法2:select e.empNo,e.eName from emp e inner join dept d on e.deptNo=d.deptNo

where d.loc='NEW YORK';

当显示内容包含多个表字段是我们只能用多表联合查询,

例如此题显示New York的员工编号、姓名、所在部门名

select e.empNo,e.eName , d.dNAME from emp e inner join dept d on e.deptNo=d.deptNo

where d.loc='NEW YORK'

四、建表、删除表、插入数据

  4.1 建表

建立学生信息表StudentTB:stuNo学号、stuName姓名、birthday生日、stuSex性别、stuAddress地址、stuTel电话

create table StudentTB(

stuNo number(5) not null,

stuName varchar2(50) not null,

birthday date,

stuSex varchar2(4),

stuAddress varchar2(100),

stuTel varchar2(20)

);

语法:

create table 表名(

列名1 列类型 约束,

列名2 列类型 约束,

...

列名N 列类型 约束

);

建立课程表ClassTB:no课程编号、name课程名称。。。

create table ClassTB(

no number(4) not null,

name varchar2(50)

);


4.2 删除表

drop table 表名;

删除学生表:drop table studentTB;



4.3 数据插入

语法: insert into 表名(列1,列2,...,列N)  values(值1,值2,....,值N);

commit;

插入1个学生:

insert into studentTB(stuNo,stuName,birthday,stuSex,stuAddress,stuTel)

  values(1000,'二师兄',to_date('1990-12-24','yyyy-mm-dd') ,'男','高老庄','12345678901');

commit; --提交事务














Oracle 多表链接查询,分组查询,组函数(聚合函数/多行函数),子查询,建表、删表的评论 (共 条)

分享到微博请遵守国家法律