Oracle數據庫表的連接、組函數

一、表連接

2019/11/7 19:10:47

1、 內連接

方式一:,笛卡爾乘積,在此基礎上篩選

select 列名1,列名2
from 表1,表2
where 表1.外健列=表2.主鍵列;

select * from s_emp,s_dept
where s_emp.dept_id=s_dept.id and s_emp.LAST_NAME='Biri';

select 表別名1.列名1,表別名2.列名2
from 表1 表別名1,表2 表別名2
where 表別名1.外健列=表別名2.主鍵列

select e.LAST_NAME,d.NAME 
from s_emp e,s_dept d
where e.dept_id=d.id;

方式二:

select 表1.列名1,表2.列名2 
from 表1
inner join 表2
on 表1.外健列=表2.主鍵列

select * 
from s_emp
inner join s_dept
on s_emp.dept_id=s_dept.id
where s_emp.LAST_NAME='Biri'

**例:**查詢員工表中last_name爲’Biri’的員工的last_name與部門名稱和地區名稱

select *
from s_emp,s_dept, S_REGION
where s_emp.dept_id=s_dept.id 
and s_dept.REGION_ID=S_REGION.id
and s_emp.LAST_NAME='Biri';

select * 
from s_emp
inner join s_dept
on s_emp.dept_id=s_dept.id
inner join S_REGION
on s_dept.REGION_ID=S_REGION.id
where s_emp.LAST_NAME='Biri';

**例:**查詢員工表中last_name爲’Biri’的員工的last_name及其部門經理名稱

SELECT 	worker.last_name||' works for '||manager.last_name
FROM s_emp worker, s_emp manager
WHERE worker.manager_id = manager.id;


SELECT 	worker.last_name||' works for '||manager.last_name
FROM s_emp worker
inner join s_emp manager
on worker.manager_id = manager.id;

2、左外連

例子: 查詢出沒有分部門的員工,員工的last_name,部門名左外連,表示 左表中的數據一定在會結果中出現

方式一:的左外連,左表中的數據一定在會結果中出現

select last_name,name from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+) and dept_id  is null  //表示,沒有+方的那個表中的數據一定在會結果中出現

方式二:的左外連,左表中的數據一定在會結果中出現

select last_name,name from s_emp
left outer join s_dept
on  s_emp.dept_id=s_dept.id
and dept_id  is null  

3、右外連接

右外連,表示 右表中的數據一定在會結果中出現

**例子:**找出哪個部門沒有員工
方式一:

select last_name,name from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id   //表示,沒有+方的那個表中的數據一定在會結果中出現
and s_emp.id  is null  

方式二:

select last_name,name from s_emp
right outer join s_dept
on  s_emp.dept_id=s_dept.id
where s_emp.id  is null  

二、組函數

分組的語法格式

select 分組列名
分組列名,聚合函數(列名)
from 表明
group by 分組列
having 條件
order by 列名/分組函數 asc/desc

常用的分組函數

1.AVG (DISTINCT|ALL|n)平均值

1.查詢s_emp表中所有員工的平均工資:
select avg(salary)
from s_emp;

2.查詢s_emp表中各個部門員工的平均工資及部門名稱:
select s_dept.name,avg(salary)
from s_emp,s_dept
where s_emp.dept_id=s_dept.id
group by s_dept.name;

2.COUNT (DISTINCT|ALL|expr|*)計數

1.查詢s_emp表中31部門一共有多少員工
select count(*)
from s_emp
where s_emp.dept_id=31;

2.查詢s_emp表中銷售人員的數量(提成率不爲空的記錄個數):
select count(COMMISSION_PCT)
from s_emp;

3.MAX (DISTINCT|ALL|expr)最大
4.MIN (DISTINCT|ALL|expr)最小

1.求s_emp表中員工的最高和最低工資
select max(salary),min(salary)
from s_emp;

5.SUM (DISTINCT|ALL|n) 總和

1.求s_emp表中所有員工的工資總和
select sum(salary)
from s_emp;

2.查詢s_emp表中各個部門員工的平均工資,工資總和及部門名稱並按照工資總和排序
select avg(salary),sum(salary),s_dept.name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id
group by s_dept.name
order by sum(salary) asc;

3.查詢s_emp表中除41部門以外的部門員工的平均工資,工資總和及部門名稱並按照工資總和排序:
select avg(salary),sum(salary),s_dept.name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id and s_emp.dept_id!=41
group by s_dept.name
order by sum(salary) asc;


4.求不以“VP”開頭職位的,各個職位中工資總和大於5000的職位及工資總和,並按工資總和排序:
select TITLE ,sum(salary)
from s_emp
where title not like 'VP%'//此處要注意大小寫
group by title
having sum(salary)>5000
order by sum(salary) asc;

##三、子查詢 ##

1.查詢s_emp表中工資最低的員工的姓名
select * from s_emp where salary=(
  select min(salary) from s_emp
)


select * from s_emp where salary in(750,850);--in表示兩個值

2.查詢s_emp表中平均工資低於32部門的部門ID,名稱
select avg(salary),dept_id,name
from s_emp,s_dept 
group by dept_id,name
having avg(salary)<(
  select avg(salary) from s_emp where dept_id=32
)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章