HD: SELECT empno,ename,sal FROM emp WHERE sal NOT BETWEEN 1000 AND 1500; Câu 7: Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, lương, mã người quản lý của những nhân v
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC NGOẠI NGỮ - TIN HỌC
ĐỀ THI THỰC HÀNH Môn: Oracle Thời gian thi: 45 phút
(Được sử dụng tài liệu)
Cho một phần lược đồ CSDL gồm:
NHANVIEN(MANV, HOTEN, NGAYSINH, DIACHI, DIENTHOAI, EMAIL)
DUAN(MADA,TENDUAN,DIADIEM)
PHANCONG(MANV, MADA, SONGAYLAMVIEC)
1 Tạo bảng, ràng buộc khóa chính, khóa ngoại và thêm dữ liệu mẫu
2 Viết truy vấn tìm ra danh sách nhân viên tham gia dưới 2 dự án, sắp xếp
tăng dần theo họ tên nhân viên
3 Viết function truyền vào mã nhân viên, trả về tổng số ngày làm việc trong
các dự án của nhân viên đó
4 Viết procedure truyền vào mã nhân viên, in ra thông báo dạng: “Nhan vien
Nguyen Thanh An co tong sô ngay lam viec trong cac du an la 50 ngay”
Lưu ý: Sinh viên ghi chú thích họ tên và MSSV ở đầu bài làm, lưu bài thường
xuyên và để nguyên bài làm khi hết giờ làm bài
Câu 1 Dùng câu lệnh truy vấn hiển thị cột lương hàng tháng của các nhân viên dạng:
Tên nhân viên : 1 thang luong = luong
HD:
SELECT ename "EMPLOYEE",sal "MONTHLY SALARY"
FROM emp;
Câu 2: Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, lương, mã người
quản lý của những nhân viên có mã người quản lý là 7902, 7566,7788
HD:
SELECT empno,ename,sal,mgr
FROM emp
ĐỀ 1
Trang 2WHERE mgr IN (7902,7566,7788);
Câu 3:Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, mã người quản
lý, mã phòng ban của những nhân viên có tên: ford, allen
HD:
SELECT empno,ename,mgr,deptno
FROM emp
WHERE ename IN ('FORD','ALLEN');
Câu 4:Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, ngày vào làm của những nhân viên vào làm từ tháng giêng đến tháng 12 năm 1981
HD:
SELECT ename,hiredate
FROM emp
WHERE hiredate BETWEEN '1-JAN-81' AND '31-DEC-81';
Câu 5:Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, nghề nghiệp của những nhân viên
không phải là: clerk, manager, analyst
HD:
SELECT ename,job
FROM emp
WHERE job NOT IN('CLERK','MANAGER','ANALYST');
Câu 6: Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, lương của những
nhân viên có lương không nằm trong 1000 đến 1500
HD:
SELECT empno,ename,sal
FROM emp
WHERE sal NOT BETWEEN 1000 AND 1500;
Câu 7: Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, lương, mã người quản lý của những nhân viên có tên không chứa ký tự: A
HD:
SELECT empno,ename,sal,mgr
FROm emp
WHERE ename NOT LIKE '%A%';
Câu 8: Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, lương, thưởng
Trang 3những nhân viên có được tiền thưởng
HD:
SELECT empno,ename,sal,comm
FROM emp
WHERE comm IS NOT NULL;
Câu 9: Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, nghề nghiệp, lương của những nhân viên có nghề nghiệp là: salesman hoặc president và có lương > 1500
HD:
SELECT ename,job,sal
FROM emp
WHERE (job='SALESMAN' OR job='PRESIDENT')
AND sal>1500;
Câu 10: Dùng câu lệnh truy vấn hiển thị cột chi tiết nhân viên gồm: tên nhân viên, nghề nghiệp dạng: công việc của (nhân viên) là ( nghề nghiệp)
HD:
SELECT 'Cong viec cua '|| INITCAP(ename)|| ' la '||LOWER(job) AS "EMPLOYEE DETAIL"
FROM emp;
Câu 11: Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, tên và nghề nghiệp nhân viên, độ
dài tên nhân viên, vị trí của ký tự ‘A’ trong tên nhân viên, với điều kiện ký tự đầu
tiên bên phải của tên nhân viên là:’N’
HD:
SELECT ename,CONCAT(ename,job),LENGTH(ename),INSTR(ename,'A')
FROM emp
WHERE SUBSTR(ename,-1,1)='N';
Câu 12:Dùng câu lệnh truy vấn hiển thị cột: tên nhân viện, số tuần từ khi nhân viên vào làm
đến nay
HD:
SELECT ename,(SYSDATE-hiredate)/7 WEEKS
FROM emp
Câu 13:
Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, ngày vào làm, số tháng từ vào
làm đến nay, sáu tháng sau ngày vào làm, ngày thứ sáu đầu tiên sau ngày vào làm,
Trang 4ngày cuối tháng của ngày vào làm.
HD:
SELECT empno,hiredate,MONTHS_BETWEEN(SYSDATE,hiredate) TENURE,
ADD_MONTHS(hiredate,6) REVIEW,
NEXT_DAY(hiredate,'FRIDAY'),
LAST_DAY(hiredate)
FROM emp;
Câu 14: Dùng câu lệnh truy vấn hiển thị mã nhân viên, ngày vào làm, làm tròn đến tháng vào làm của các nhân viên vào làm năm 1981
HD:
SELECT empno,hiredate,ROUND(hiredate,'MONTH')
FROM emp
WHERE hiredate BETWEEN '1-JAN-1981'AND '31-DEC-1981';
Câu 15:
Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tháng vào làm dạng “ MM/YY “ của nhân viên BLAKE
HD:
SELECT empno,TO_CHAR(hiredate,'MM/YY') Month_Hired
FROM emp
WHERE ename = 'BLAKE';
Câu 16:Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, ngày vào làm có dạng “ First of
May 1981 12:00:00 AM”
HD:
SELECT ename,TO_CHAR(hiredate, 'ddspth "of" month YYYY HH24:MI:SS AM') HIREDATE
FROM emp;
Câu 17: Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, ngày vào làm có dạng “ 17 November 1981 ”
HD:
SELECT ename,TO_CHAR(hiredate, 'DD MONTH YYYY') HIREDATE
FROM emp;
Câu 18:Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, lương có dạng “ $ 3,500 “ của nhân viên Scott
HD:
SELECT ename,TO_CHAR(sal,'$99,999') SALARY
Trang 5FROM emp
WHERE ename = 'SCOTT';
Câu 19: Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, ngày vào làm của tất cả các nhân
viên vào làm ngày February 22, 1981
HD:
SELECT ename,hiredate
FROM emp
WHERE hiredate = TO_DATE('February 22, 1981','MONTH DD, YYYY')
Câu 20: Dùng câu lệnh truy vấn hiển thị cột: nghề nghiệp, lương, lương hệ số của các nhân
viên biết rằng nếu nghề nghiệp là manager hệ số là 1.20, clerk hệ số 1.15, analyst hệ
số 1.1, còn lại hệ số là 1
HD:
SELECT job,sal,
DECODE (job,'ANALYST',SAL*1.1,
'CLERK',SAL*1.15,
'MANAGER',SAL*1.20,
SAL)
AS "RECEIVED SALARY"
FROM emp;
Câu 21: Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, lương, tỷ số thuế của nhân viên
thuộc phòng ban 30, biết rằng nếu lương < $1,000 tỷ số thuế 0%, từ $1,000 đến
<$2,000 tỷ số 9%, từ $2,000 đến <$3,000 tỷ số 20%, từ $3,000 đến <$4,000 tỷ số 30%, từ $4,000 đến <$5,000 tỷ số 40%, từ $5,000 đến <$6,000 tỷ số 42%, từ $6,000 đến <$7,000 tỷ số 44%, từ $7,000 trở lên tỷ số 45%
HD:
SELECT ename,sal,
DECODE(TRUNC(sal/1000,0),
0,0.00,
1,0.09,
2,0.20,
3,0.30,
4,0.40,
5,0.42,
6,0.44,
Trang 6AS "TAX_RATE"
FROM emp
WHERE deptno=30;
Câu 22:Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, mã người quản lý của nhân viên
nếu nhân viên không có người quản lý cho xuất hiện câu không có người quản lý,điều kiện mã người quản lý là null
HD:
SELECT ename,NVL(TO_CHAR(mgr),'No Manager')
FROM emp
WHERE mgr IS NULL;
Câu 23: Dùng câu lệnh truy vấn hiển thị cột: ngày thứ sáu sau sáu tháng kể từ ngày vào làm
có dạng: Friday, March 12th, 1982, sắp xếp tăng dần theo ngày vào làm
HD:
SELECT
TO_CHAR(NEXT_DAY(ADD_MONTHS(hiredate,6),'FRIDAY'),'DAY,MONTH DDTH,YYYY') AS "NEXT 6 MONTH REVIEW"
FROM emp
ORDER BY hiredate;
Câu 24: BT3- 3-46
Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, lương, lương mới (tăng 0.15 cho toàn bộ nhân viên), số tiền tăng
HD:
SELECT empno,ename,sal,ROUND(sal+(sal*0.15)) "NEW SALARY"
FROM emp
Câu 25: BT3- 6-47
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, số tháng làm việc (kể từ khi vào làm đến nay), săp xếp tăng dần theo số tháng làm việc
HD:
SELECT ename,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate),0)
"MONTHS_WORKS"
FROM emp
ORDER BY "MONTHS_WORKS" ASC;
Trang 7Câu 26: BT3- 8-48
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, lương định dạng cột lương có độ dài 15 ký tự, những khoảng trống bên trái của lương điền vào dấu $
HD:
SELECT ename ,LPAD(sal,15,'$') "SALARY"
FROM emp;
Câu 27: BT3- 9-49
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, độ dài của tên, định dạng tên như sau: ký tự đầu chử hoa các chử còn lại chử thường Chỉ hiển thị tên nhân viên bắt đầu bằng những ký tự: J, A, M
HD:
SELECT INITCAP(ename),LENGTH(ename) "LENGTH"
FROM emp
WHERE ename LIKE 'A%' OR ename LIKE 'J%' OR ename LIKE 'M%';
Câu 28: BT 3-11-50
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, thưởng nếu thưởng không có thì điền vào câu không có tiền thưởng
HD:
SELECT ename,NVL(TO_CHAR(comm),'Khong co tien thuong') "COMM"
FROM emp;
Câu 29: BT3- 11-51
Dùng câu lệnh truy vấn hiển thị cột: nghề nghiệp, loại Biết rằng nếu nghề nghiệp là president loại A, manager loại B, analyst loại C, salesman loại D, clerk loại E, còn lại loại O
HD:
SELECT job,DECODE(job,'PRESEDENT','A',
'MANAGER','B',
'ANALYST','C',
'SALESMAN','D',
'CLERK','E',
'O')
"GRADE"
FROM emp;
Câu 30: BT 4-3-23
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, tên phòng ban, vị trí phòng ban
Trang 8của các nhân viên có tiền thưởng.
HD:
SELECT ename,dname,loc
FROM emp,dept
WHERE emp.deptno=dept.deptno
AND comm IS NOT NULL;
Câu 31: BT 4-6-24
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, mã nhân viên, tên người quản lý,
mã người quản lý của tất cả nhân viên
HD:
SELECT a.ename "NAME", a.empno "EMP#",b.ename "MANAGER",b.empno
"MGR#"
FROM emp a, emp b
WHERE a.mgr=b.empno;
Câu 32: BT 4-9-26
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, nghề nghiệp, tên phòng ban, lương, bậc lương (grade) của các nhân viên
HD:
SELECT ename,job,dname,sal,grade
FROM emp,dept,salgrade
WHERE emp.deptno=dept.deptno
AND sal BETWEEN losal AND hisal;
Câu 33: BT 4-10-26
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, ngày vào làm của các nhân viên vào làm sau Blake
HD:
SELECT a.ename,a.hiredate
FROM emp a, emp b
WHERE a.hiredate > DECODE(b.ename,'BLAKE',b.hiredate);
Câu 34: BT 4-11-26
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, ngày vào làm của nhân viên, tên người quản lý, ngày vào làm của người quản lý với điều kiện nhân viên vào làm trước người quản lý
HD:
SELECT a.ename "Employee",a.hiredate "Emp HireDate", b.ename "Manager", b.hiredate " Mgr Hiredate"
Trang 9FROM emp a ,emp b
WHERE a.mgr=b.empno
AND a.hiredate < b.hiredate
Câu 35:
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên có ký tự đầu tiên, tên nhân viên
có ký tự cuối cùng trong danh sách alphabetized
HD:
SELECT ename
FROM emp
WHERE ename LIKE'A%' OR ename LIKE'Z%';
Câu 36:
Dùng câu lệnh truy vấn tính trung bình tiền thưởng của các nhân viên
HD:
SELECT AVG(comm)
FROM emp;
Câu 37:
Dùng câu lệnh truy vấn hiển thị cột: mã phòng ban, trung bình lương theo phòng ban, sắp xếp tăng dần theo trung bình lương
HD:
SELECT deptno,AVG(sal)
FROM emp
GROUP BY deptno
ORDER BY AVG(sal);
Câu 38:
Dùng câu lệnh truy vấn hiển thị cột: mã phòng ban, nghề nghiệp, tổng lương theo nghề nghiệp ở các phòng ban
HD:
SELECT deptno,job,SUM(sal)
FROM emp
GROUP BY deptno,job;
Câu 39:
Dùng câu lệnh truy vấn hiển thị cột: mã phòng ban, trung bình lương của những phòng ban lớn hơn 2000
HD:
SELECT deptno,AVG(sal)
FROM emp
GROUP BY deptno
HAVING AVG(sal)>2000;
Trang 10Câu 40:
Dùng câu lệnh truy vấn hiển thị cột: mã phòng ban, trung bình lương của những phòng ban có lương tối đa lớn hơn 2900
HD:
SELECT deptno,MAX(sal)
FROM emp
GROUP BY deptno
HAVING MAX(sal)>2900
Câu 41:
Dùng câu lệnh truy vấn hiển thị cột: nghề nghiệp, tổng lương, của những nhân viên không bán hàng và tổng lương lớn hơn 5000, sắp xếp tăng dần theo tổng lương HD:
SELECT job,SUM(sal) "PAYROLL"
FROM emp
WHERE job NOT LIKE 'SALE%'
GROUP BY job
HAVING SUM(sal)>5000
ORDER BY SUM(sal)
Câu 42:
Dùng câu lệnh truy vấn hiển thị lương trung bình cao nhất của các phòng ban HD:
SELECT MAX(AVG(sal))
FROM emp
GROUP BY deptno
Câu 43: BT 5-4-27
Dùng câu lệnh truy vấn hiển thị lương cao nhất, lương thấp nhất, tổng lương, trung bình lương của mỗi nghề
HD:
SELECT MAX(sal) "Maximum" ,MIN(sal) "Minimum", SUM(sal) "Sum",
ROUND(AVG(sal),0) "Average"
FROM emp;
Câu 44: BT 5-6-27.sql
Dùng câu lệnh truy vấn hiển thị số người làm cùng nghề
HD:
SELECT job,COUNT(*)
FROM emp
GROUP BY job;
Câu 45: BT 5-9-28
Trang 11Dùng câu lệnh truy vấn hiển thị cột: mã người quản lý, lương thấp nhất trả cho người quản lý, không tính người không có mã quản lý và lương thấp nhất ít hơn
1000, sắp xếp giảm dần theo lương
HD:
SELECT mgr, MIN(sal)
FROM emp
WHERE mgr IS NOT NULL
GROUP BY mgr
HAVING MIN(sal)>1000
ORDER BY MIN(sal) DESC
Câu 46: BT 5-10-28
Dùng câu lệnh truy vấn hiển thị cột: tên phòng ban, vị trí, số người trong phòng ban, lương trung bình của nhân viên trong phòng ban, lương trung bình lấy hai số lẻ HD:
SELECT dname, loc ,COUNT(empno) "Number of People", ROUND(AVG(sal),2)
"Avergage"
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname,loc;
Câu 47: BT 5-11-29
Dùng câu lệnh truy vấn hiển thị cột: tổng số nhân viên, tổng số nhân viên theo năm vào làm (1980, 1981, 1982, 1983)
HD:
SELECT COUNT(empno)
"Total",SUM(DECODE(TO_CHAR(hiredate,'YYYY'),1980,1,0)) "1980",
SUM(DECODE(TO_CHAR(hiredate,'YYYY'),1981,1,0)) "1981",
SUM(DECODE(TO_CHAR(hiredate,'YYYY'),1982,1,0)) "1982",
SUM(DECODE(TO_CHAR(hiredate,'YYYY'),1983,1,0)) "1983"
FROM emp;
Câu 48:
Dùng câu lệnh truy vấn hiển thị tên nhân viên, những người có lương lớn hơn lương của nhân viên có mã 7566
HD:
SELECT ename
FROM emp
WHERE sal>
(SELECT sal
FROM emp
WHERE empno=7566);
Trang 12Câu 49:
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, nghề nghiệp, của những người làm cùng nghề với người có mã 7369
HD:
SELECT ename,job
FROM emp
WHERE job=(SELECT job
FROM emp
WHERE empno=7369);
Câu 50:
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, nghề nghiệp, của nhân viên làm cùng nghề với nhân viên có mã 7369 và có lương lớn hơn lương của nhân viên có
mã 7876
HD:
SELECT ename,job
FROM emp
WHERE job=(SELECT job
FROM emp
WHERE empno=7369)
AND sal>(SELECT sal
FROM emp
WHERE empno=7876);
Câu 51:
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, nghề nghiệp, lương, của nhân viên có lương bằng với lương thấp nhất của các nhân viên
HD:
SELECT ename,job,sal
FROM emp
WHERE sal=(SELECT MIN(sal)
FROM emp);
Câu 52:
Dùng câu lệnh truy vấn hiển thị cột: mã phòng ban, lương tối thiểu, của các phòng ban có lương tối thiểu lớn hơn lương tối thiểu của phòng ban 20
HD:
SELECT deptno,MIN(sal)
FROM emp
GROUP BY deptno
HAVING MIN(sal) > (SELECT MIN(sal)
FROM emp
Trang 13WHERE deptno=20);
Câu 53:
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, lương, mã phòng ban, của nhân viên có lương bằng với lương tối thiểu của các phòng ban
HD:
SELECT ename,sal,deptno
FROM emp
WHERE sal IN(SELECT MIN(sal)
FROM emp
GROUP BY deptno);
Câu 54:
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, lương, mã phòng ban, của nhân viên có lương bằng 800, 950, 1300
HD:
SELECT ename,sal,deptno
FROM emp
WHERE sal IN (800,950,1300);
Câu 55:
Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, nghề nghiệp, của nhân viên có lương lớn hơn lương trung bình của các phòng ban
HD:
SELECT empno,ename,job
FROM emp
WHERE sal> ALL
(SELECT AVG(sal)
FROM emp
GROUP BY deptno);
Câu 56: BT 6-1-19
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, ngày vào làm, của các nhân viên làm cùng phòng ban với Blake, trừ Blake
HD:
SELECT ename, hiredate
FROM emp
WHERE deptno=(SELECT deptno
FROM emp
WHERE ename like '%BLAKE%')
AND ename NOT LIKE '%BLAKE%';
Câu 57: BT 6-2-19
Trang 14Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, của nhân viên có lương lớn hơn lương trung bình, sắp xếp giảm dần theo lương
HD:
SELECT empno,ename
FROM emp
WHERE sal > (SELECT AVG(sal)
FROM emp)
ORDER BY sal DESC;
Câu 58: BT 6-3-19
Dùng câu lệnh truy vấn hiển thị cột: mã nhân viên, tên nhân viên, của nhân viên làm cùng phòng ban với nhân viên tên có chứa chử T
HD:
SELECT empno,ename
FROM emp
WHERE deptno IN (SELECT deptno
FROM emp
WHERE ename LIKE'%T%');
Câu 59: BT 6-4-19
Dùng câu lệnh truy vấn hiển thị cột: tên nhân viên, mã phòng ban, nghề nghiệp, của nhân viên làm ở Dallas
HD:
SELECT ename, deptno,job
FROM emp
WHERE deptno IN (SELECT deptno
FROM dept
WHERE loc LIKE '%DALLAS%');
Câu 60: BT 6-6-19
Dùng câu lệnh truy vấn hiển thị cột: mã phòng ban, tên nhân viên, nghề nghiệp, của nhân viên trong bộ phận (phòng ban) bán hàng (sales)
HD:
SELECT deptno, ename,job
FROM emp
WHERE deptno IN (SELECT deptno
FROM dept
WHERE dname LIKE '%SALES%');
Câu 61: