1. 程式人生 > >Oracle初探(二)

Oracle初探(二)

基礎查詢

--1.查詢部門編號為30的職務種類(不重複)
select job from emp where deptno=30;--重複

select distinct job from emp where deptno=30;--不重複

--2.建立一個查詢,顯示員工編號為7788的員工的姓名和部門編號
select ename,deptno from emp where empno=7788;

--3.查詢工資高於3000的員工的姓名和薪資
select ename,sal from emp where sal>3000;

--4.查詢工資低於3000的員工
select * from emp where sal<3000;

--5.查詢在1981年2月20日和1985年5月1日之間入職的員工的姓名、職務和日期
select ename,job,hiredate from emp where hiredate between date'1981-2-20' and date'1985-5-1';

--6.顯示在1981年聘用的每位員工的姓名和聘用日期
select ename,hiredate from emp where hiredate between date'1981-1-1' and date'1985-12-31';

--7.查詢沒有佣金的員工
select * from emp where comm is null;

--8.查詢姓以B開頭的員工
select * from emp where ename like 'B%';

--9.查詢部門號為10或者20或者30的員工
select * from emp where deptno in(10,20,30);

--10.查詢沒有經理的所有員工的姓名和職稱
select ename,job from emp where mgr is null;

--11.顯示員工名字中的第三個字母為“A”的所有員工的姓名
select ename from emp where ename like '__A%';

--12.集合
--12.1 並集
--12.1.1 union
select ename,sal from emp where sal>1000
union
select ename,sal from emp where job='MANAGER';
--12.1.2 union all
select ename,sal from emp where sal>1000
union all
select ename,sal from emp where job='MANAGER';

--12.2 交集
select ename,sal from emp where sal>1000
intersect
select ename,sal from emp where job='MANAGER';

--12.3 剪集
select ename,sal from emp where sal>1000
minus
select ename,sal from emp where job='MANAGER';


--13.排序
--13.1 查詢員工資料,按薪資升序排列
select * from emp order by sal asc;

--13.2 查詢員工資料,在部門號從大到小的情況下按按薪資升序排列
select * from emp order by deptno desc, sal asc;

--13.3 按姓名的字母順序顯示部門20和部門50中的所有員工的姓名和部門編號
select ename,deptno from emp where deptno in(20,50)order by ename; 

--13.4 顯示可以賺取佣金的所有員工的姓名、薪金和佣金,按薪金和佣金的降序對資料進行排序
select ename,sal,comm from emp where comm is not null order by sal desc,comm desc;


--14 函式
--14.1、顯示當前日期
select sysdate from dual;

--14.2 顯示當前日期,格式為****年**月**日,別名為hday
select substr(to_char(sysdate,'dl'),1,11) as hday from dual;
select to_char(sysdate,'yyyy"年"mm"月"dd"日"') as hday from dual;

--14.3 編寫一個查詢,顯示姓名以J、A或M開始的所有員工的姓名(第一個字母大寫,其餘字母小寫)和姓名的長度,給每列一個合適的標籤;
select concat(upper(substr(ename,1,1)),lower(substr(ename,2,length(ename)))) as lname,length(ename)as len from emp where ename like 'J%' or ename like 'A%' or ename like'M%';

--14.4 計算每位員工截止到當前時間入職的星期數,別名為weeks_worked。按聘用的星期數對結果進行排序。該星期數舍入到最接近的整數。同時顯示員工的名字;
select ename,round((sysdate - to_date(hiredate))/7)as weeks_worked from emp order by weeks_worked ;

--14.5 計算每位員工截止到當前時間入職的月數,別名為months_worked。該星期數舍入到最接近的整數。同時顯示員工的名字。   
select ename,round(months_between(sysdate,to_date(hiredate)))as months_worked from emp order by months_worked ;

--14.6 查詢在1981年2月20日和1987年5月1日之間入職的員工的姓名、職務標識和起始日期
select ename,job,hiredate from emp where hiredate<=to_date('1987-5-1','yyyy-mm-dd') and hiredate>=to_date('1981-2-20','yyyy-mm-dd');

--14.7 建立一個查詢。顯示所有員工的姓名和薪金。將薪金格式規定為15個字元長,左邊填充$
select ename,lpad(sal,15,'$') from emp;                 

--14.8 顯示員工的姓名、聘用日期和該員工在星期幾開始工作的
select ename,hiredate,to_char(hiredate,'day')as start_worked from emp;

--14.9 使用decode函式編寫一個查詢,使其按照以下資料根據job列的值顯示所有員工的級別,同時顯示員工的姓名
select ename,job,decode(job,'PRESIDENT','A','MANAGER','B','ANALYST','C','SALESMAN','D','CLERK','E') as grade from emp;


--15.分組查詢
--15.1 求所有員工的平均工資、最高工資、最低工資和工資總和,給予適當的別名
select avg(sal),max(sal),min(sal),sum(sal)
from emp;

--15.2 求每種工作的平均工資
select job,avg(sal) 
from emp
group by job;

--15.3 求每個部門中同一種工作的平均工資,同時顯示部門號,按部門號升序顯示
select deptno,avg(sal) 
from emp 
group by job,deptno 
order by deptno asc;

--15.4 查詢出各部門的部門編號以及各部門的總工資和平均工資,按部門編號升序排列
select deptno,sum(sal),avg(sal) 
from emp 
group by deptno 
order by deptno;

--15.5 顯示每種工作的人數
select job,count(*)
from emp 
group by job;

--15.6 顯示員工最高工資超過3000的部門的id及其員工最高工資
select deptno,max(sal) 
from emp 
where sal>3000 
group by deptno;

--15.7 顯示每種工作的最低、最高、總計和平均工資
select job,min(sal),max(sal),sum(sal),avg(sal) 
from emp 
group by job;

--15.8 確定經理的人數
select count(distinct mgr)
from emp;

--15.9 顯示最高薪資和最低薪資的差別,標記為DIFFERENCE
select max(sal)-min(sal)as difference 
from emp;

--15.10 顯示非銷售人員(SALESMAN)工作名稱以及從事同一工作僱員的月工資的總和,並且要滿足從事同一工作的僱員的月工資合計大於5000,輸出結果按月工資和排序
select job,sum(sal)
from emp 
where job<>'SALESMAN' 
group by job 
having sum(sal)>5000 
order by sum(sal);

--15.11 顯示經理編號以及該經理所管理員工的最低薪資。不包括其經理未知的任何員工。排除最低薪資不超過2000的所有組。按最低薪資降序對輸出進行排序。
select mgr,min(sal)
from emp 
where mgr is not null 
group by mgr 
having min(sal)>2000 
order by min(sal) desc;

--15.12 顯示在1981、1982、1980和1987年份每年聘用的員工總數,並按年號排序
select to_char(hiredate,'yyyy'),count(*)
from emp
group by to_char(hiredate,'yyyy')
order by to_char(hiredate,'yyyy');