僱員表:EMPLOYEE
(EMPNO CHARACTER(6) NOT NULL, --僱員編號,定義爲主鍵
FIRSTNAME VARCHAR(12) NOT NULL, --僱員第一個名字
MIDINIT CHARACTER(1), --僱員中間名字的首字母
LASTNAME VARCHAR(15) NOT NULL, --僱員最後一個名字
WORKDEPT SMALLINT, --部門編號,外鍵,對應部門表DEPTNO
PHONENO CHARACTER(4), --電話號碼
HIREDATE DATE, --僱用日期
JOB CHARACTER(8), --工作崗位
EDLEVEL SMALLINT NOT NULL, --學歷(1:中學及以下,2:大學,3:碩士及以上)
SEX CHARACTER(1), --性別(1:男,2:女)
BIRTHDATEDATE, --出生日期(60週歲以上爲退休)
SALARY DECIMAL(9,2), --薪水
BONUS DECIMAL(9,2) --獎金
);
部門表:DEPT
(DEPTNO SMALLINT NOT NULL, --部門編號,主鍵
DEPTNAME VARCHAR(14), --部門名稱
MANAGER SMALLINT --部門經理編號,每個經理也是僱員表中一個僱員 );
);
1、 找出收入(SALARY和BONUS之和)最低的10個EMPNO,按照收入從低到高排序Oracle:
selectnvl(bonus, 0) + nvl(salary, 0) as income
from EMPLOYEE t order by income
2、 從僱員表中刪除僱用日期在1940年1月1日以前的僱員。Oracle:
Delete fromEMPLOYEE wherehiredate<to_date('2012-01-01','yyyy-mm-dd');
3、算出所有僱員的平均收入(SALARY和BONUS之和)、最低收入、最高收入,取整數位,小數點後面四捨五入。 oracle:
select round(sum(nvl(salary, 0) + nvl(bonus, 0)), 0),
round(min(nvl(salary, 0) +nvl(bonus, 0)), 0),
round(max(nvl(salary, 0) +nvl(bonus, 0)), 0)
from employee
4.列出所有僱員的全名,全部轉換成大寫字母,名字每一部分中間用空格隔開。oracle:
selectupper(FIRSTNME||' '||MIDINIT||' '||LASTNAME) fromemployee
5、找出僱員數大於50的部門的編號。oracle:
select deptno, deptname from dept where deptno in (selectworkdept from employee group by workdept having count(*) > 50)
6、在僱員表JOB字段上新建一個索引,取名idx_emp_job。 oracle:
Createindex idx_emp_job onemployee(job)
7、找到FIRSTNME=’John’的員工所在部門的名稱和部門經理編號 oracle
select manager, deptname from dept where deptno in(selectworkdept fromemployee t where t.firstname = 'Jhon')
8、更新僱員表的薪水,如果爲空置爲0,如果不爲空,不變更字段值。oracle:
update employee set bonus=0 where bonus is null
9、往部門表新增一個部門,DEPTNO=123,DEPTNAME=’Market’,MANAGER=20。 oracle:
Insertinto dept values(123,'Market',20)
10、列出每個員工的字母縮寫,忽略中間的名字,例如,CHRISTINEI HAAS縮寫爲CH,BRUCE ADAMSON縮寫爲BA。oracle:
selectsubstr (upper(firstname),1,1)||substr(upper(lastname),1,1) fromemployee
第二部分
僱員表:EMPLOYEE
(EMPNO CHARACTER(6) NOT NULL, --僱員編號,定義爲主鍵
FIRSTNAME VARCHAR(12) NOT NULL, --僱員第一個名字
MIDINIT CHARACTER(1), --僱員中間名字的首字母
LASTNAME VARCHAR(15) NOT NULL, --僱員最後一個名字
WORKDEPT SMALLINT, --部門編號,外鍵,對應部門表DEPTNO
PHONENO CHARACTER(4), --電話號碼
HIREDATE DATE, --僱用日期
JOB CHARACTER(8), --工作崗位
EDLEVEL SMALLINT NOT NULL, --學歷(1:中學及以下,2:大學,3:碩士及以上)
SEX CHARACTER(1), --性別(1:男,2:女)
BIRTHDATE DATE, --出生日期(60週歲以上爲退休)
SALARY DECIMAL(9,2), --薪水
BONUS DECIMAL(9,2) --獎金
);
部門表:DEPT
(DEPTNO SMALLINT NOT NULL, --部門編號,主鍵
DEPTNAME VARCHAR(14), --部門名稱
MANAGER SMALLINT --部門經理編號,每個經理也是僱員表中一個僱員 );
);
1、如果僱員對應的經理編號小於100,更新僱員表的薪水和獎金字段,如果爲空置爲0,如果不爲空,在原有基礎上加10%,結果按四捨五入取整。oracle:
update employeea
set salary = nvl(salary,0)*1.1,bonus = nvl(bonus,0) * 1.1
whereexists (select1
fromdept b
whereb.manager < 2
anda.workdept = b.deptno)
2、在三個不同的地區,僱員表各有一張,分別是EMPLOYEE_CN、EMPLOYEE_US、EMPLOYEE_EU,三張表表結構一樣,存放的是本地區僱員的信息,三張表的僱員編號沒有重複。同樣在不同的地區,也各自有一張部門表,DEPT_CN、DEPT_US、DEPT_EU,這三張表有重複的記錄。需要算出全公司範圍內各個部門的薪酬(薪水加獎金)成本,已經撤銷的部門在部門表中也有記錄,需要在結果集中體現。寫出SQL。要求輸出格式如下:
部門名稱 薪酬 人數
Market 500000 5
Head Office 1200000 20
Plains 0 0
Selectb.deptname, sum(income),sum(cnt)
from (Selectworkdept, count(*) cnt, sum(salary+ bonus) income from EMPLOYEE_CN groupbyworkdept
Unionall
Selectworkdept, count(*) cnt, sum(salary+ bonus) income from EMPLOYEE_US groupbyworkdept
Unionall
Selectworkdept, count(*) cnt, sum(salary+ bonus) income from EMPLOYEE_EU groupbyworkdept) a
rightouterjoin (selectdeptno, deptname from dept
Union
Selectdeptno, deptname from dept
Union
Selectdeptno, deptname from dept) b
On a.workdept = b.deptno
groupby b.deptname
3、從部門表刪除人數爲0的部門。 oracle:
Deletefrom dept a where not exists (select a.deptno fromemployee b wherea.deptno=b.workdept)
4、 新建一張表EMPLOYEE_TMP,表結構與EMPLOYEE一樣,不需要數據。oracle:
Createtable employee_tmp asselect *fromemployee where1=2
5、列出平均收入大於50000的部門名稱。Oracle:
Selectdeptname,avg(salary+bonus)fromemployee a,dept b Where a.workdept=b.deptnogroupbydeptname having(avg(salary+bonus)>50000)
6、類似於論壇性質的應用,從表tab1中取記錄,每頁展示20條記錄,請取出按照字段uid排序的第21至第40條記錄。 Db2:
select * from (selectrownumrn, a.* from tab1 whererownum<= 40) wherern >= 21 orderbyuid
7、寫出得到當前時間加1年加2個月加3天是星期幾的SQL
select to_char(add_months(sysdate, 1 *12 +2)+3, 'yyyy-mm-ddHH24:MI:SS') from dual;
8、使用查詢語句實現如下統計報表:
學歷 |
人數 |
工資 |
平均工資 |
|||||
男 |
女 |
合計 |
男 |
女 |
合計 |
男 |
女 |
|
中學及以下 |
|
|
|
|
|
|
|
|
大學 |
|
|
|
|
|
|
|
|
碩士及以上 |
|
|
|
|
|
|
|
|
Select edlevel,
sum(casewhensex = 1then1else0end),
sum(casewhensex = 2then1else0end),
count(*),
sum(casewhensex = 1then salary else0end),
sum(casewhensex = 2then salary else0end),
sum(salary),
avg(casewhensex = 1then salary end),
avg(casewhensex = 2then salary end),
avg(salary)
from employee
groupby edlevel
orderby edlevel
9、表TAB1內容:
pdate result
2009-05-09 勝
2009-05-09 勝
2009-05-09 負
2009-05-09 負
2009-05-10 勝
2009-05-10 負
2009-05-10 負
……
如果要生成類似下列結果:
日期 勝 負
2009-05-09 2 2
2009-05-10 1 2
……
寫出SQL語句。 oracle
Select pdate, sum(casewhenresult ='勝'then1else0end), sum(casewhenresult ='負'then1else0end) fromtab1 groupby pdateorderbypdate
10、找出數據庫中所有以’TB’開頭的表。 oracle:
select * fromall_tables where TABLE_NAME like'TB%'
第三部分
僱員表:EMPLOYEE
(EMPNO CHARACTER(6) NOT NULL, --僱員編號,定義爲主鍵
FIRSTNAME VARCHAR(12) NOT NULL, --僱員第一個名字
MIDINIT CHARACTER(1), --僱員中間名字的首字母
LASTNAME VARCHAR(15) NOT NULL, --僱員最後一個名字
WORKDEPT SMALLINT, --部門編號,外鍵,對應部門表DEPTNO
PHONENO CHARACTER(4), --電話號碼
HIREDATE DATE, --僱用日期
JOB CHARACTER(8), --工作崗位
EDLEVEL SMALLINT NOT NULL, --學歷(1:中學及以下,2:大學,3:碩士及以上)
SEX CHARACTER(1), --性別(1:男,2:女)
BIRTHDATEDATE, --出生日期(60週歲以上爲退休)
SALARY DECIMAL(9,2), --薪水
BONUS DECIMAL(9,2) --獎金
);
部門表:DEPT
(DEPTNO SMALLINT NOT NULL, --部門編號,主鍵
DEPTNAME VARCHAR(14), --部門名稱
MANAGER SMALLINT --部門經理編號,每個經理也是僱員表中一個僱員 );
);
1、 有一個與僱員表結構一樣的臨時表EMPLOYEE_TMP,存放僱員的臨時信息,每天晚上12點需要將僱員的臨時信息同步到僱員表中,如果僱員表中沒有相應記錄,insert,如果有,update WORKDEPT、PHONENO、JOB、SALARY、BONUS。使用一條SQL實現。
Mergeinto employee a
Using (select *fromemployee_tmp) b
on(a.empno=b.empno)
Whenmatchedthen
updateset workdept=b.workdept,phoneno=b.phoneno,job=b.job,salary=b.salary,bonus=b.bonus
whennotmatchedthen
insert (EMPNO, FIRSTNAME,MIDINIT, LASTNAME, WORKDEPT,PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE,SALARY, BONUS)
values(b.EMPNO,b.FIRSTNAME,b.MIDINIT,b.LASTNAME,b.WORKDEPT,b.PHONENO,b.HIREDATE,b.JOB,b.EDLEVEL,b.SEX,b.BIRTHDATE,b.SALARY,b.BONUS)
2、 有一張表tab1,有類似下面的記錄:
No name
1 a
2 b
3 c
4 d
……
請寫一條SQL顯示以下結果:
ab
ac
ad
……
bc
bd
……
cd
……
Select a.name||b.name fromtab1 a,tab1 b where a.name<b.name orderbya.name,b.name
3、有兩張表:
Record(recNumber <主鍵>學號, recScore分數)
Student(stuNumber <主鍵>學號, stuName姓名,stuClass班級)
用SQL語句實現以下查詢:
查詢每一個班級中第二名的同學的姓名。
with tmp as
(selectstuName,recScore,dense_rank()over(orderbyb.recScore desc) ID
from student a, record bwhereb.recnumber = a.stuNumber)
select stuName fromtmp whereID =2
4、有這樣一張表tb:
PDate T1 T2 T3
2010-01-28 04:30:09 NULL NULL
2010-01-28 18:30:00 NULL NULL
2010-02-09 03:35:25 NULL NULL
2010-01-28 NULL 04:31:09 NULL
2010-01-28 NULL 05:31:09 NULL
2010-01-28 NULL 06:31:09 NULL
2010-01-28 NULL 07:31:09 NULL
2010-02-09 NULL 03:36:25 NULL
2010-01-28 NULL NULL 04:32:09
2010-02-09 NULL NULL 03:37:25
要求寫出單條SQL語句,通過處理可得到以下結果:
PDate T1 T2 T3
2010-01-28 04:30:09 04:31:09 04:32:09
2010-01-28 18:30:00 05:31:09 NULL
2010-01-28 NULL 06:31:09 NULL
2010-01-28 NULL 07:31:09 NULL
2010-02-09 03:35:25 03:36:25 03:37:25
selectcoalesce(a.pdate,b.pdate, c.pdate) pdate, a.t1,b.t2, c.t3
from (selectt.*,row_number()over(partitionbypdate orderby pdate,t1) rr fromtb t wheret1 isnotnull)a
fullouterjoin
(selectt.*,row_number()over(partitionbypdate orderby pdate,t2) rr fromtb t wheret2 isnotnull)b
on (a.pdate= b.pdate anda.rr = b.rr)
fullouterjoin
(selectt.*,row_number()over(partitionbypdate orderby pdate,t3) rr fromtb t wheret3 isnotnull)c
on (b.pdate= c.pdate andb.rr = c.rr)
orderby1, 2, 3, 4
5、表SALES(
YEAR INTEGER, QUARTER INTEGER,
MONTH INTEGER,
FEE DECIMAL(12,2)),記錄如下:
Year quarter month fee
2009 1 1 10000
2009 1 2 10000
2009 1 3 10000
2009 2 4 10000
2009 2 5 10000
2009 2 6 10000
2009 3 7 10000
2009 3 8 10000
2009 3 9 10000
2009 4 10 10000
2009 4 11 10000
2009 4 12 10000
使用最簡單的SQL,得到下面的結果:
year quarter month sum(fee)
2009 1 1 10000
2009 1 2 10000
2009 1 3 10000
2009 1 NULL 30000
2009 2 4 10000
2009 2 5 10000
2009 2 6 10000
2009 2 NULL 30000
2009 3 7 10000
2009 3 8 10000
2009 3 9 10000
2009 3 NULL 30000
2009 4 10 10000
2009 4 11 10000
2009 4 12 10000
2009 4 NULL 30000
2009 NULL NULL 120000
NULL NULL NULL 120000
請注意排序
Selectyear,quarter,month,sum(fee)fromsales groupbyrollup(year,quarter,month) orderbyyear,quarter,month
相當於
select* from (
Selectyear,quarter,month,sum(fee)from sales group by year,quarter,month
unionall
Selectyear,quarter,null,sum(fee)from sales group by year,quarter
unionall
Selectyear,null,null,sum(fee)from sales group by year
unionall
selectnull,null,null,sum(fee) from sales
)orderby year,quarter,month;
Rollup():分組函數可以理解爲group by的精簡模式,具體分組模式如下:
Rollup(a,b,c):(a,b,c),(a,b),(a),(全表)
Cube():分組函數也是以group by爲基礎,具體分組模式如下:
cube(a,b,c):(a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),(全表)