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);