Oracle 多表链接查询,分组查询,组函数(聚合函数/多行函数),子查询,建表、删表
--安装数据库后不要改变计算机名称 安装数据库后不要改变计算机名称 安装数据库后不要改变计算机名称
--赠品:
--问:怎么查看当前登录账号下的所有表格?
--答: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; --提交事务