一、表連接
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
)