1. 程式人生 > >Oracle學習(五)--sql查詢(包含子查詢)

Oracle學習(五)--sql查詢(包含子查詢)

這裡用到了三個表,emp,dept,salgrade

注意閱讀“請先讀我”檔案

結構如下面幾個圖所示




表中的資料有以下圖所示:

emp表----員工資訊表


dept表-----部門資訊表


salgrade表----工資等級表


1.sql查詢
案例1:查詢員工的編號、姓名、及工資職位
SQL>select empno,ename,sal,job from emp;

案例2:將所有員工的工資+500(欄位四則運)

SQL>select ename,sal+500 from emp;
欄位起別名(as是可以省略)
SQL>select ename,sal+500 (as) newsal from emp;


案例3:查詢所有員工的年薪並+1000(yearsal)顯示
SQL>select ename,sal*12+1000 yearsal from emp;


案例4:查詢員工的姓名工資(字串拼接||)
如:員工姓名:smith員工工資:800
SQL>select '員工姓名'||ename||'員工工資'||sal from emp; 


案例5:查詢所有員工的編號、姓名、獎金+500顯示(null表示無窮大,null參與運算結果仍為null,nvl去除空值)
SQL>select empno,ename,nvl(comm,0)+500 from emp;


案例6:查詢員工職位(distinct去除重複值)
SQL>select distinct(job) from emp;


案例7:查詢員工為jack所有資訊(條件查詢)
SQL>select * from emp where ename='SMITH';


案例8:查詢員工的編號,姓名,工資,要求工資必須大於1500
SQL>select empno,ename,sal from emp where sal>1500;


案例9:查詢工資在1500~3000之間員工的編號、姓名、工資和職位
SQL>select empno,ename,sal,job from emp
where sal>=1500 and sal<=3000;
(between and)
SQL>select empno,ename,sal,job from emp
where sal between 1500 and 3000;


案例10:查詢所有職位是祕書或銷售人員的員工編號、姓名、職位(or運算)
SQL>select empno,ename,job,sal from emp where job='CLERK' or job='SALESMAN';


案例11:查詢姓名以"A"開頭的員工編號、姓名,職位(模糊查詢,like %表示0或者多個
_表示一個字元)
SQL>select empno,ename,job from emp where ename like 'A%';


案例12:查詢姓名中第二個字母是"A"的員工的編號、姓名、職位
SQL>select empno,ename,job from emp whereename like '_A%';


案例13:查詢員工編號、姓名、職位、工資
按工資降序排序(排序order by desc降序,asc升序預設值)
SQL>select empno,ename,job,sal from emp
order by sal desc;
(組函式 count(),avg(),min(),max(),sum())


案例14:查詢公司又少個員工
SQL>select count(empno) as pnumber from emp;


案例15:查詢公司的平均工資
SQL>select avg(sal) avgsal from emp;


案例16:查詢公司的最高工資
SQL>select ename, max(sal) avgsal from emp;//錯誤,欄位不能直接與組函式連

2.子查詢
sql語句中嵌套了其他sql語句
select 欄位1,欄位2,(sql子查詢) from
table_name(子查詢) where sal=(子查詢)
[分類]查詢結果分為單行單列和多行單列
關聯程度分為關聯子查詢與非關聯子查詢


單行單列---------------


案例17:查詢出工資最高員工資訊

步驟1:最高工資
SQL>select max(sal) from emp;--5000
步驟2:員工資訊
SQL>select empno,ename,sal from emp
where sal=5000;
SQL>select empno,ename,sal from emp
where sal=(select max(sal) from emp);


案例17:查詢工資最低的員工資訊,且工資增加500;

步驟1:最低工資
SQL>select min(sal) from emp;
步驟2:員工資訊(+500)
SQL>select empno,ename,sal+500 as newsal from emp where sal=800;
SQL>select empno,ename,sal+500 as 
newsal from emp where sal=(select min(sal) from emp);


案例18:查詢姓名為SMITH的工資與平均工資

步驟1:平均工資
SQL>select avg(sal) from emp;
步驟2:smith的工資資訊
SQL>select empno,ename,sal,job from 
emp where ename='SMITH';
SQL>select empno,ename,sal,(select avg(sal) from emp) as avgsal,job from emp where ename='SMITH';


案例19:查詢高於平均工資的所有員工的資訊

步驟1:查詢出平均工資
SQL>select avg(sal) from emp;
步驟2:員工資訊(>平均工資)
SQL>select empno,ename,sal,job from 
emp where sal>(select avg(sal) from emp);


案例20:查詢銷售部門所有職位

步驟1:dept表找到銷售部門部門編號
SQL>select detpno from dept where dname='SALES';--30
步驟2:emp表找到所有deptno=30的員工的職位
SQL>select job from emp where deptno=30;
SQL>select distinct(job) from emp where
deptno=(select deptno from dept where dname='SALES');


多行多列----------------


案例21:查詢工資比simth高員工資訊

SQL>select empno,ename,sal from emp wheresal>(select sal from emp where ename='SMITH');
插入資料,造成多個simth的情況:
SQL>insert into emp(empno,ename,job,sal,deptno) values(8999,'SMITH','salesman',2000,10);
(all,any,in)
SQL>select empno,ename,sal from emp wheresal>all(select sal from emp where ename='SMITH');--大於最大值(所有)


案例22:查詢工資比simth低員工資訊

SQL>select empno,ename,sal from emp wheresal<all(select sal from emp where ename='SMITH');
[總結]all大於最大值,小於最小值


案例23:查詢出工資比任意smith工資高的員工資訊(不等於:!= <>)

SQL>select empno,ename,sal from emp wheresal>any(select sal from emp where ename='SMITH') and ename<>'SMITH';
[總結]any表示任意,大於最小值,小於最大值

案例24:查詢與smith相同部門的其他所有員工資訊
步驟1:查詢出所有smith的部門編號
SQL>select deptno from emp where ename='SMITH';
步驟2:根據多個部門編號去查詢員工
SQL>select empno,ename,job,sal,deptno from emp where deptno in(select deptno from emp where ename='SMITH'); 
[總結]in表示滿足集合中任意資料即可


關聯子查詢與非關聯子查詢-------


(非關聯子查詢)

案例25:查詢所有比平均工資低員工資訊
SQL>select empno,ename,job,sal from emp 
where sal<(select avg(sal) from emp);


案例26:查詢出king的所有下屬的資訊

步驟1:查詢出king的empno
SQL>select empno from emp where ename='KING';--7839
步驟2:查詢所有員工mrg=empno
SQL>select empno,ename,mgr from emp where mgr=7839;
SQL>select empno,ename,mgr from emp wheremp where mgr=(select empno from emp where ename='KING');


(關聯子查詢)

案例27:查詢出哪些員工比本部門平均工資低
步驟1:查詢平均工資
SQL>select avg(sal) from emp
步驟2:查詢員工資訊(sal>平均工資)
SQL>select empno,ename,sal,job from emp e where sal<(select avg(sal) from emp where deptno=e.deptno);