Oracle 多表鏈接查詢,分組查詢,組函數(shù)(聚合函數(shù)/多行函數(shù)),子查詢,建表、刪表
--安裝數(shù)據(jù)庫后不要改變計算機(jī)名稱? 安裝數(shù)據(jù)庫后不要改變計算機(jī)名稱? 安裝數(shù)據(jù)庫后不要改變計算機(jī)名稱
--贈品:
--問:怎么查看當(dāng)前登錄賬號下的所有表格?
--答:select TABLE_NAME from user_tableS;
day03目標(biāo):
1.多表鏈接查詢
2.分組查詢
3.組函數(shù)(聚合函數(shù)/多行函數(shù))
4.子查詢
5.建表、刪表
一、多表聯(lián)合查詢
笛卡爾積:A表x行,B表y行
select * from a,b; 結(jié)果共x*y行
1. 內(nèi)連接:等值查詢【必會】
查詢當(dāng)前每個員工所屬部門(員工編號、姓名、員工的部門編號、部門的部門編號、部門名稱)
select e.empNo,e.ename,e.deptNo,d.deptNo,d.dname from emp e,dept d
where e.deptNo=d.deptNo;
2. 內(nèi)連接:不等值查詢*
查每個員工的工資在哪個等級?
select e.empNo,e.ename,e.sal, g.grade from emp e,salgrade g
where e.sal between g.losal and g.hisal;
3. 內(nèi)連接:自鏈接*
查每個員工的領(lǐng)導(dǎo)是誰?
設(shè)員工表E:select e.empno,e.ename,e.mgr from emp e;
設(shè)領(lǐng)導(dǎo)表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(+);
不等值**:顯示所有員工信息及對應(yīng)的工資等級
select e.eName,e.sal,g.grade from emp e,salgrade g
where e.sal between g.losal(+) and g.hisal(+);
自鏈接**:顯示大BOSS,這位仁兄領(lǐng)導(dǎo)編號是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)的姓名的領(lǐng)導(dǎo)姓名補(bǔ)Boss顯示
select e.empNo,e.ename,nvl( m.ename,'BOSS' ) mgrName
from emp e ,emp m
where e.mgr = m.empNo(+);
5.推薦鏈接(99方式)寫法【明天默寫】
內(nèi)連接【必會】: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;
外鏈接:
練習(xí):顯示所有員工信息(沒有部門的員工部門補(bǔ)null)
左外鏈接:select 列... from 表1 別稱1 left outer join 表2 別稱2 on 別稱1.公共字段=別稱2.公共字段
? ? 特點(diǎn):顯示關(guān)鍵字左邊表的所有數(shù)據(jù)
? ? ? ? ? 答: 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.公共字段
? ? 特點(diǎn):顯示關(guān)鍵字右邊表的所有數(shù)據(jù)
? ? ? 答: 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個表的所有數(shù)據(jù),對應(yīng)無互相補(bǔ)null
練習(xí):顯示所有員工和所有部門
select e.eName,d.dName?
from emp e full outer join dept d? on e.deptNo = d.deptNo;
二、分組查詢
1. 組函數(shù) : 不統(tǒng)計null值
sum(列) -求和
avg(列) -平均值
max(列) --最大值
min(列) --最小值
count(列) --幾行(統(tǒng)計非空行數(shù))
練習(xí):顯示所有員工的最高工資、最低工資、平均薪資、薪資總和、總?cè)藬?shù)
select max(sal),min(sal),avg( nvl(sal,0) ),sum(sal),count(*) from emp;
2. 分組:
語法:select 分組依據(jù)列,...,組函數(shù)(其他列)
? ? ? from 表
? ? ? group by 分組依據(jù)列N...,....
? ? ? having 分組條件
練習(xí):統(tǒng)計當(dāng)前部門的平均薪資
select deptNo,avg( nvl(sal,0) )?
from emp
group by deptNo;
練習(xí):統(tǒng)計當(dāng)前部門不同崗位的薪資總額
select deptNo,job,sum( sal )
from emp
group by deptNo,job;
3.分組依據(jù) having
練習(xí):統(tǒng)計部門內(nèi)>3人的部門信息
select d.dName,count(*)?
from emp e inner join dept d
on e.deptNo = d.deptNo
group by d.dName
having count(*)>3
--【關(guān)鍵字優(yōu)先級如下】-----------------------------------------------------------------------------
select --查詢
from --從哪個表來
inner join / left/right outer join --多鏈接
on --多表聯(lián)合條件
where --查詢條件
group by --分組
having --分組條件
order by --顯示排序
三、子查詢:=等于、in包含、not in不包含、any .. all...、條件符號
查詢的里面還有查詢:select 列....,.... from 表... where 條件列=(select 條件列 from 表名...)
練習(xí):查屬于銷售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個編號對應(yīng)員工有哪些
第3步:合并起來一句話完成這個查詢:
select eName,sal from emp where deptNo in(
select deptNo from dept where dName='SALES' or dName='RESEARCH'
);
練習(xí):查在紐約“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';
當(dāng)顯示內(nèi)容包含多個表字段是我們只能用多表聯(lián)合查詢,
例如此題顯示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'
四、建表、刪除表、插入數(shù)據(jù)
? 4.1 建表
建立學(xué)生信息表StudentTB:stuNo學(xué)號、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 表名;
刪除學(xué)生表:drop table studentTB;
4.3 數(shù)據(jù)插入
語法: insert into 表名(列1,列2,...,列N)? values(值1,值2,....,值N);
commit;
插入1個學(xué)生:
insert into studentTB(stuNo,stuName,birthday,stuSex,stuAddress,stuTel)
? values(1000,'二師兄',to_date('1990-12-24','yyyy-mm-dd') ,'男','高老莊','12345678901');
commit; --提交事務(wù)